From 2b3cc5964bba3a4fcb4bd8b8c90a85fe9ac55293 Mon Sep 17 00:00:00 2001
From: "Thomas Lefebvre (thle)" <thle@odoo.com>
Date: Mon, 18 Sep 2023 10:36:47 +0200
Subject: [PATCH] [FIX] hr_holidays: manage refused leave in the report

Steps to reproduce:
-------------------
- add an allocation for an employee;
- add a leave with this allocation;
- validate the leave;
- refuse the leave;
- in action menu, click on "Time off Analysis by Employee and Time Off Type".

Issue:
------
The report does not take into account refused allocations and leaves.

Solution:
---------
Add a condition to take a number of days equal to zero
if the allocation or leave is in a refused state.

Handled the case where no record is found for leave
(with `COALESCE` because `value - NULL = NULL`).

opw-3503617

closes odoo/odoo#135748

Signed-off-by: Sofie Gvaladze (sgv) <sgv@odoo.com>
---
 .../report/hr_leave_employee_type_report.py   | 23 ++++++++++++-------
 1 file changed, 15 insertions(+), 8 deletions(-)

diff --git a/addons/hr_holidays/report/hr_leave_employee_type_report.py b/addons/hr_holidays/report/hr_leave_employee_type_report.py
index 085532b20d04..027e8800a077 100644
--- a/addons/hr_holidays/report/hr_leave_employee_type_report.py
+++ b/addons/hr_holidays/report/hr_leave_employee_type_report.py
@@ -51,7 +51,7 @@ class LeaveReport(models.Model):
                     allocation.employee_id as employee_id,
                     CASE
                         WHEN allocation.id = min_allocation_id.min_id
-                            THEN aggregate_allocation.number_of_days - aggregate_leave.number_of_days
+                            THEN aggregate_allocation.number_of_days - COALESCE(aggregate_leave.number_of_days, 0)
                             ELSE 0
                     END as number_of_days,
                     allocation.department_id as department_id,
@@ -69,16 +69,21 @@ class LeaveReport(models.Model):
                     FROM hr_leave_allocation GROUP BY employee_id, holiday_status_id) min_allocation_id
                 on (allocation.employee_id=min_allocation_id.employee_id and allocation.holiday_status_id=min_allocation_id.holiday_status_id)
 
-                /* Obtain the sum of allocations */
+                /* Obtain the sum of allocations (validated) */
                 LEFT JOIN
-                    (SELECT employee_id, holiday_status_id, sum(number_of_days) as number_of_days
-                    FROM hr_leave_allocation GROUP BY employee_id, holiday_status_id) aggregate_allocation
+                    (SELECT employee_id, holiday_status_id,
+                        sum(CASE WHEN state = 'validate' and active = True THEN number_of_days ELSE 0 END) as number_of_days
+                    FROM hr_leave_allocation
+                    GROUP BY employee_id, holiday_status_id) aggregate_allocation
                 on (allocation.employee_id=aggregate_allocation.employee_id and allocation.holiday_status_id=aggregate_allocation.holiday_status_id)
 
-                /* Obtain the sum of requested leaves (validated and confirmed) */
+                /* Obtain the sum of requested leaves (validated) */
                 LEFT JOIN
-                    (SELECT employee_id, holiday_status_id, sum(number_of_days) as number_of_days 
-                    FROM hr_leave GROUP BY employee_id, holiday_status_id) aggregate_leave
+                    (SELECT employee_id, holiday_status_id,
+                        sum(CASE WHEN state IN ('validate', 'validate1') THEN number_of_days ELSE 0 END) as number_of_days
+                    FROM hr_leave
+
+                    GROUP BY employee_id, holiday_status_id) aggregate_leave
                 on (allocation.employee_id=aggregate_leave.employee_id and allocation.holiday_status_id = aggregate_leave.holiday_status_id)
 
                 UNION ALL SELECT
@@ -94,7 +99,9 @@ class LeaveReport(models.Model):
                         WHEN request.state = 'confirm' THEN 'planned'
                     END as holiday_status,
                     request.employee_company_id as company_id
-                FROM hr_leave as request) leaves
+                    FROM hr_leave as request
+                    WHERE request.state IN ('confirm', 'validate', 'validate1')
+                ) leaves
             );
         """)
 
-- 
GitLab