Pending: 0 Building: 0 Running: 0 Failed: 104
Created Date Type Name Commit Description State Age Up Time Life Time Action
merged [FIX] stock: soft correct unsynch between quant and stock.move.line Succeed
merged [FIX] stock: soft correct unsynch between quant and stock.move.line [FIX] stock: soft correct unsynch between quant and stock.move.line It happens due to many reasons that the `stock.quant` object and `stock.move.line` loose their synchronisation and it could have a difference between the sum of `stock.move.line` and the quantity/reserved quantity on the `stock.quant` It's important to keep tracking why the desycnh happens and to fix all the root causes of it. However, it's hard for the user to clean the data himself or even worst to lock him when it happens (as before 18.0). For quantity: It's not a big deal to have a huge difference between the quantity and all the long time history. As in real life, the inventory adjustement can help to clean the data. For reserved quantity: It's a bigger problem since the user can't edit it. A first step would be to never write it to a negative value (since it should never happen). That way when the user empty the stock, it will also probably clean the reserved quantity. But in case where there is more reservation than on `stock.move.line`. We should also clean it to be able to reserve them. Currently, we will try in the scheduler for that part A last step, could be to create a constraint during test that ensure the synch is never broken and it could raise directly if the developer made a mistake Killed Not finished
merged [FIX] stock: soft correct unsynch between quant and stock.move.line [FIX] stock: soft correct unsynch between quant and stock.move.line It happens due to many reasons that the `stock.quant` object and `stock.move.line` loose their synchronisation and it could have a difference between the sum of `stock.move.line` and the quantity/reserved quantity on the `stock.quant` It's important to keep tracking why the desycnh happens and to fix all the root causes of it. However, it's hard for the user to clean the data himself or even worst to lock him when it happens (as before 18.0). For quantity: It's not a big deal to have a huge difference between the quantity and all the long time history. As in real life, the inventory adjustement can help to clean the data. For reserved quantity: It's a bigger problem since the user can't edit it. A first step would be to never write it to a negative value (since it should never happen). That way when the user empty the stock, it will also probably clean the reserved quantity. But in case where there is more reservation than on `stock.move.line`. We should also clean it to be able to reserve them. Currently, we will try in the scheduler for that part A last step, could be to create a constraint during test that ensure the synch is never broken and it could raise directly if the developer made a mistake closes odoo/odoo#188201 Signed-off-by: William Henrotin (whe) <whe@odoo.com> Killed Not finished
merged [FIX] pos_loyalty: keep reward lines on a finalized order [FIX] pos_loyalty: keep reward lines on a finalized order Steps to reproduce: - Install pos_loyalty + pos_online_payment. - Configure an automatic discount program (e.g. 1% off the order) and an online payment method. - In the POS, add a customer eligible for the program and a product so the discount reward line is added automatically. - Pay the order with the online payment method and let the customer pay. Issue: The receipt printed right after the online payment is missing the loyalty discount line: the total is shown without the discount while the amount actually paid is the discounted amount, so the ticket looks underpaid. Re-printing the order later shows the correct total. With a loyalty program that also gives points, confirming the order additionally raises: ValueError: invalid literal for int() with base 10: 'false' Cause: After a successful online payment the order is rebuilt from the data saved on the server and selected again. Selecting an order triggers `_updateRewards`, which calls `_updateRewardLines` to refresh the applied rewards. On this rebuilt order the reward lines reference a coupon that is no longer in the local cache (its `coupon_id` comes back as `false` for "current" programs that don't persist a coupon), so `_updateRewardLines` removes them and cannot re-apply them. The order then displays a wrong total, and `_postPushOrderResolve` sends that `false` coupon id to `confirm_coupon_programs`, which fails when casting the key to an int. The order is already paid and saved: its reward lines are authoritative and must not be recomputed. Fix: - `_updateRewardLines`: do nothing on a finalized order (paid/done/invoiced) so the rewards saved on the server are kept as-is. - `_postPushOrderResolve`: skip reward lines that have no coupon, so no invalid coupon id is sent to `confirm_coupon_programs`. Failed
merged [FIX] pos_loyalty: keep reward lines on a finalized order [FIX] pos_loyalty: keep reward lines on a finalized order Steps to reproduce: - Install pos_loyalty + pos_online_payment. - Configure an automatic discount program (e.g. 1% off the order) and an online payment method. - In the POS, add a customer eligible for the program and a product so the discount reward line is added automatically. - Pay the order with the online payment method and let the customer pay. Issue: The receipt printed right after the online payment is missing the loyalty discount line: the total is shown without the discount while the amount actually paid is the discounted amount, so the ticket looks underpaid. Re-printing the order later shows the correct total. With a loyalty program that also gives points, confirming the order additionally raises: ValueError: invalid literal for int() with base 10: 'false' Cause: After a successful online payment the order is rebuilt from the data saved on the server and selected again. Selecting an order triggers `_updateRewards`, which calls `_updateRewardLines` to refresh the applied rewards. On this rebuilt order the reward lines reference a coupon that is no longer in the local cache (its `coupon_id` comes back as `false` for "current" programs that don't persist a coupon), so `_updateRewardLines` removes them and cannot re-apply them. The order then displays a wrong total, and `_postPushOrderResolve` sends that `false` coupon id to `confirm_coupon_programs`, which fails when casting the key to an int. The order is already paid and saved: its reward lines are authoritative and must not be recomputed. Fix: - `_updateRewardLines`: do nothing on a finalized order (paid/done/invoiced) so the rewards saved on the server are kept as-is. - `_postPushOrderResolve`: skip reward lines that have no coupon, so no invalid coupon id is sent to `confirm_coupon_programs`. Killed Not finished
merged Merge from upstream 17 20260615 01 Merge remote-tracking branch 'odoo/17.0' into 17.0 Succeed
merged [FIX] pos_online_payment: allow closing sessions with restricted payment provider access Succeed
merged [FIX] im_livechat: prevent crash and stale window when leaving session [FIX] im_livechat: prevent crash and stale window when leaving session Closing a livechat conversation fails when the visitor's guest context is no longer available (the `dgid` cookie expired, was cleared, is blocked as a third-party cookie on an embedded livechat, or the visitor is in private browsing). `/im_livechat/visitor_leave_session` resolves the visitor's `discuss.channel.member` through the `is_self` domain and calls `_rtc_leave_call()` on the result. Without a guest context the lookup returns an empty recordset, so `_rtc_leave_call()` hits `ensure_one()` and raises `Expected singleton: discuss.channel.member()`, returning a 500. The exception also prevents `_close_livechat_session()` from running, so the conversation stays open server-side. In addition, `LivechatService.leaveSession` removed the saved session from the storage in a `finally` block, after awaiting the `visitor_leave_session` RPC. When the visitor leaves the page right after closing the chat, the in-flight request is aborted and the page is torn down before the `finally` runs, so the stale session is restored on the next page load. Only call `_rtc_leave_call()` when a member is found, always close the livechat session afterwards, and clear the saved session synchronously before notifying the server. Failed
merged Merged from upstream 17 260605 01 Merge remote-tracking branch 'odoo/17.0' into 17.0 Killed
merged Merge from upstream 17 20260519 01 Merge remote-tracking branch 'odoo/17.0' into 17.0 Killed
merged Merge from upstream 17 20260512 01 Merge remote-tracking branch 'odoo/17.0' into 17.0 Killed
closed Merge from upstream 17.0 (2026-04-30) Merge remote-tracking branch 'odoo/17.0' into 17.0 # Conflicts: # addons/account/i18n/vi.po # addons/hr_expense/i18n/vi.po # addons/mail/i18n/mail.pot # addons/mrp_account/i18n/vi.po # addons/sale/i18n/vi.po # addons/web_unsplash/i18n/vi.po # addons/website/i18n/vi.po # odoo/addons/base/i18n/vi.po Failed
merged Merge from upstream 17 20260428 01 Merge remote-tracking branch 'odoo/17.0' into 17.0 Killed
merged Merge from upstream 17 20260403 01 Merge remote-tracking branch 'odoo/17.0' into 17.0 Failed
merged Merge from upstream 17 20260319 01 Killed
merged Merge from upstream 17 20260319 01 Merge remote-tracking branch 'odoo/17.0' into 17.0 Failed
open [MISC] odoo/service: scale up by one worker when all workers are busy, the total number of workers is limited to 1.5x [MISC] odoo/service: scale up by one worker when all workers are busy, the total number of workers is limited to 1.5x Killed
merged Merge from upstream 17 20260305 01 Merge remote-tracking branch 'odoo/17.0' into 17.0 Killed
merged Merge from upstream 17 20260228 01 Merge remote-tracking branch 'odoo/17.0' into 17.0 Killed
merged [I18N][17.0] account*: fix i18n [I18N] account*: fix i18n Killed
merged Merged from upstream 17 260218 01 Killed
merged Merged from upstream 17 260216 01 Merge remote-tracking branch 'upstream/17.0' into 17.0 Failed
merged Merged from upstream 17 260211 01 Merge remote-tracking branch 'upstream/17.0' into 17.0 Failed
merged [I18N] purchase: SyntaxError: invalid syntax [I18N] purchase: SyntaxError: invalid syntax Killed Not started Not finished
merged [I18N][17.0] point_of_sale: fix i18n [I18N] point_of_sale: fix i18n Killed
merged [FIX][17.0] hr_recruitment: Fix permissions error [FIX] hr_recruitment: Fix permissions error This comment is to fix the bug where the user only had HR privileges when viewing the hr.job model interface, resulting in an error message indicating no permission to read hr.applicant. Killed
merged Merge from upstream 17 20260110 01 Merge remote-tracking branch 'odoo/17.0' into 17.0 Killed
open [FWD][17.0][I18N] purchase_stock: correct Vietnamese translation [I18N] purchase_stock: correct Vietnamese translation Forward-Port-Of: #1170 Revoked
closed [FWD][17.0] mail: fix incorrect avatar display [FIX] mail: fix incorrect avatar display Before this commit, user avatars in the Chater UI were not displayed using the object-fit: cover style, causing distorted or improperly scaled images. closes odoo/odoo#242320 Signed-off-by: Alexandre Kühn (aku) <aku@odoo.com> Killed
merged Merged from upstream 17 260104 01 Merge remote-tracking branch 'upstream/17.0' into 17.0 Killed
merged [FWD][17.0][I18N] stock: fix i18n stock [I18N] *: fix i18n stock, purchase Forward-Port-Of: #1163 Failed
merged [FIX][17.0] hr_org_chart: Do not display employees [FIX] hr_org_chart: Do not display employees Killed
merged [FIX][17.0] hr_org_chart: Do not display employees [FIX] hr_org_chart: Do not display employees Killed Not started Not finished
merged Merge from upstream 17 20251220 01 Killed
merged Merge from upstream 17 20251220 01 Merge remote-tracking branch 'odoo/17.0' into merge_from_upstream_17_20251220_01 Killed
merged Merge from upstream 17 20251219 01 Merge remote-tracking branch 'odoo/17.0' into 17.0 Killed
merged [I18N] hr: correct Vietnamese department name Killed
merged Merge from upstream 17 20251211 01 Killed
merged [PERF] pos_sale: optimize Session Sale Amount compute by pre-fetching [PERF] pos_sale: optimize Session Sale Amount compute by pre-fetching opened sessions to avoid heavy subquery execution Problem The original implementation performs a _read_group on report.pos.order with a domain that includes a relational lookup: ('session_id.state', '=', 'opened') On large databases, this condition forces the ORM to generate a SQL query containing nested subqueries like: session_id IN (SELECT id FROM pos_session WHERE state='opened' AND ...) PostgreSQL cannot short-circuit this subquery, even if no sessions are opened, and still scans a large portion of report_pos_order, causing significant performance degradation. Solution Instead of letting _read_group build a heavy subquery, we explicitly search for the opened sessions first: opened_sessions = self.env['pos.session'].search([ ('config_id.crm_team_id', 'in', self.ids), ('state', '=', 'opened'), ]) data = self.env['report.pos.order']._read_group([ ('session_id', 'in', opened_sessions.ids), ], ['config_id'], ['price_total:sum']) This improves performance because: pos.session is a much smaller table and is fast to filter. If there are no opened sessions, _read_group immediately returns empty results without scanning report_pos_order. It eliminates nested SQL IN (SELECT ...), allowing PostgreSQL to use direct index-based filtering. This approach reduces query time dramatically on large datasets. Killed
closed 17.0 [FIX] stock: Allow to install demo data outside US company Currently in the `_merge_move_itemgetter` the system call `self.company_id.currency_id.decimal_places`. However the demo data of stock create a database with US currency and some `stock.move` in it. If we have an existing database with EUR for example. The upper call will return a `currency_id.decimal_places` since we have multiple currency. The best solution, would be to split `_action_confirm` to do a loop by company. But it would need a small refactoring and we will do a minimal diff to fix this issue. Using the smallest currency among all the company is not always correct but it's a super edge case and we should probably remove this code since it went to far. Close #230965, #234078 closes odoo/odoo#239273 Signed-off-by: William Henrotin (whe) <whe@odoo.com> Killed Not started Not finished