diff --git a/src/main/java/com/pentagon/Quicky_Backend/controller/DriverProfilesController.java b/src/main/java/com/pentagon/Quicky_Backend/controller/DriverProfilesController.java index 42430ee..d650300 100644 --- a/src/main/java/com/pentagon/Quicky_Backend/controller/DriverProfilesController.java +++ b/src/main/java/com/pentagon/Quicky_Backend/controller/DriverProfilesController.java @@ -3,6 +3,7 @@ import com.pentagon.Quicky_Backend.dto.DriverEarningsProfilesDto; import com.pentagon.Quicky_Backend.dto.DriverProfilesDto; import com.pentagon.Quicky_Backend.dto.DriversCountDto; +import com.pentagon.Quicky_Backend.dto.InactiveDriversCountDto; import com.pentagon.Quicky_Backend.service.DriverProfilesService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -44,4 +45,16 @@ public ResponseEntity> getTodayEarnings() { return new ResponseEntity<>(drivers, HttpStatus.OK); } + @GetMapping("/driver-profiles/inactive-drivers") + public ResponseEntity> getInactiveDrivers() { + List drivers = driverProfilesService.getInactiveDrivers(); + return new ResponseEntity<>(drivers, HttpStatus.OK); + } + + @GetMapping("/driver-profiles/inactive-drivers/count-by-availability") + public ResponseEntity> getInactiveDriversCount() { + List drivers = driverProfilesService.getInactiveDriversCount(); + return new ResponseEntity<>(drivers, HttpStatus.OK); + } + } diff --git a/src/main/java/com/pentagon/Quicky_Backend/dto/InactiveDriversCountDto.java b/src/main/java/com/pentagon/Quicky_Backend/dto/InactiveDriversCountDto.java new file mode 100644 index 0000000..b9848cb --- /dev/null +++ b/src/main/java/com/pentagon/Quicky_Backend/dto/InactiveDriversCountDto.java @@ -0,0 +1,6 @@ +package com.pentagon.Quicky_Backend.dto; + +public interface InactiveDriversCountDto { + Long getInactiveDriversCount(); + Long getActiveDriversCount(); +} diff --git a/src/main/java/com/pentagon/Quicky_Backend/entity/DriverDetails.java b/src/main/java/com/pentagon/Quicky_Backend/entity/DriverDetails.java index da8e384..7898132 100644 --- a/src/main/java/com/pentagon/Quicky_Backend/entity/DriverDetails.java +++ b/src/main/java/com/pentagon/Quicky_Backend/entity/DriverDetails.java @@ -66,8 +66,16 @@ public class DriverDetails { @Column(name = "wallet_balance", nullable = false, columnDefinition = "double precision default 0") private Double walletBalance = 0.0; - @Column(name = "approved", nullable = false, columnDefinition = "BOOLEAN DEFAULT FALSE") - private Boolean approved = false; + + public enum ApprovalStatus { + PENDING, + APPROVED, + REJECTED + } + + @Enumerated(EnumType.STRING) + @Column(name = "approved", nullable = false, columnDefinition = "VARCHAR(20) DEFAULT 'PENDING'") + private ApprovalStatus approved; @Column(name = "profile_image_url") private String profileImageUrl; diff --git a/src/main/java/com/pentagon/Quicky_Backend/repository/DriverDetailsRepo.java b/src/main/java/com/pentagon/Quicky_Backend/repository/DriverDetailsRepo.java index ca29f34..310711c 100644 --- a/src/main/java/com/pentagon/Quicky_Backend/repository/DriverDetailsRepo.java +++ b/src/main/java/com/pentagon/Quicky_Backend/repository/DriverDetailsRepo.java @@ -1,10 +1,6 @@ package com.pentagon.Quicky_Backend.repository; -import com.pentagon.Quicky_Backend.dto.ChurnPredictFeatureDto; -import com.pentagon.Quicky_Backend.dto.DriverEarningsProfilesDto; -import com.pentagon.Quicky_Backend.dto.DriverProfilesDto; -import com.pentagon.Quicky_Backend.dto.DriversCountDto; -import com.pentagon.Quicky_Backend.dto.NewRegistrationsDto; +import com.pentagon.Quicky_Backend.dto.*; import com.pentagon.Quicky_Backend.entity.DriverDetails; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; @@ -40,7 +36,7 @@ public interface DriverDetailsRepo extends JpaRepository d.mobile_number AS mobileNumber FROM driver_details dd LEFT JOIN drivers d ON dd.user_id = d.user_id - WHERE dd.approved = false + WHERE dd.approved = 'PENDING' ORDER BY dd.user_details_id """, nativeQuery = true) List findAllPendingRegistrations(); @@ -69,7 +65,7 @@ public interface DriverDetailsRepo extends JpaRepository FROM driver_details dd JOIN drivers d ON d.user_id = dd.user_id LEFT JOIN rating r ON r.user_details_id = dd.user_details_id - WHERE dd.approved = true + WHERE dd.approved = 'APPROVED' GROUP BY dd.user_details_id, dd.first_name, dd.last_name, dd.date_of_birth, dd.gender, dd.home_no, dd.street_name, dd.city, dd.district, dd.license_number, dd.license_front_url, dd.license_back_url, dd.registration_date, dd.availability, @@ -102,7 +98,7 @@ public interface DriverDetailsRepo extends JpaRepository FROM driver_details dd JOIN drivers d ON d.user_id = dd.user_id LEFT JOIN rating r ON r.user_details_id = dd.user_details_id - WHERE dd.approve_status = 'ACCEPTED' + WHERE dd.approved = 'APPROVED' AND dd.registration_date = CURRENT_DATE GROUP BY dd.user_details_id, dd.first_name, dd.last_name, dd.date_of_birth, dd.gender, dd.home_no, dd.street_name, dd.city, dd.district, dd.license_number, @@ -114,53 +110,54 @@ public interface DriverDetailsRepo extends JpaRepository @Query(value = "SELECT registration_date, COUNT(*) AS driversCount " + "FROM driver_details " + - "WHERE approved = true " + + "WHERE approved = 'APPROVED' " + "GROUP BY registration_date " + "ORDER BY registration_date", nativeQuery = true) List countApprovedDriversByRegistrationDate(); @Query(value = """ - SELECT - dd.user_details_id AS userDetailsId, - dd.first_name AS firstName, - dd.last_name AS lastName, - dd.date_of_birth AS dateOfBirth, - dd.gender AS gender, - dd.home_no AS homeNo, - dd.street_name AS streetName, - dd.city AS city, - dd.district AS district, - dd.license_number AS licenseNumber, - dd.license_front_url AS licenseFrontURL, - dd.license_back_url AS licenseBackURL, - dd.registration_date AS registrationDate, - dd.availability AS availability, - dd.stripe_id AS stripeId, - dd.wallet_balance AS walletBalance, - d.email AS email, - d.mobile_number AS mobileNumber, - COALESCE(SUM(r.rating_count) / NULLIF(COUNT(r.rating_id), 0), 0) AS rating, - COALESCE(SUM(e.delivery_charge), 0) AS earnings - FROM - driver_details dd - JOIN - drivers d ON dd.user_id = d.user_id - LEFT JOIN - earning e ON dd.user_details_id = e.driver_id - LEFT JOIN - delivery_order o ON e.delivery_id = o.delivery_id AND DATE(o.time_stamp) = CURRENT_DATE - LEFT JOIN - rating r ON o.delivery_id = r.delivery_id - WHERE - dd.approve_status = 'ACCEPTED' - GROUP BY - dd.user_details_id, dd.first_name, dd.last_name, dd.date_of_birth, dd.gender, - dd.home_no, dd.street_name, dd.city, dd.district, dd.license_number, - dd.license_front_url, dd.license_back_url, dd.registration_date, dd.availability, - dd.stripe_id, dd.wallet_balance, d.email, d.mobile_number - ORDER BY - earnings DESC - """, nativeQuery = true) + SELECT + dd.user_details_id AS userDetailsId, + dd.first_name AS firstName, + dd.last_name AS lastName, + dd.date_of_birth AS dateOfBirth, + dd.gender AS gender, + dd.home_no AS homeNo, + dd.street_name AS streetName, + dd.city AS city, + dd.district AS district, + dd.license_number AS licenseNumber, + dd.license_front_url AS licenseFrontURL, + dd.license_back_url AS licenseBackURL, + dd.registration_date AS registrationDate, + dd.availability AS availability, + dd.stripe_id AS stripeId, + dd.wallet_balance AS walletBalance, + d.email AS email, + d.mobile_number AS mobileNumber, + COALESCE(SUM(r.rating_count) / NULLIF(COUNT(r.rating_id), 0), 0) AS rating, + COALESCE(SUM(e.delivery_charge), 0) AS earnings + FROM + driver_details dd + JOIN + drivers d ON dd.user_id = d.user_id + LEFT JOIN + earning e ON dd.user_details_id = e.driver_id + LEFT JOIN + delivery_order o ON e.delivery_id = o.delivery_id + LEFT JOIN + rating r ON o.delivery_id = r.delivery_id + WHERE + dd.approved = 'APPROVED' + AND DATE(e.created_at) = CURRENT_DATE + GROUP BY + dd.user_details_id, dd.first_name, dd.last_name, dd.date_of_birth, dd.gender, + dd.home_no, dd.street_name, dd.city, dd.district, dd.license_number, + dd.license_front_url, dd.license_back_url, dd.registration_date, dd.availability, + dd.stripe_id, dd.wallet_balance, d.email, d.mobile_number + ORDER BY + earnings DESC + """, nativeQuery = true) List findApprovedDriversWithEarningsToday(); // Churn feature query @@ -212,4 +209,68 @@ driver_ratings AS ( """, nativeQuery = true) List getDriverFeaturesForChurnPrediction(); -} + @Query(value = """ + SELECT + dd.user_details_id AS userDetailsId, + dd.first_name AS firstName, + dd.last_name AS lastName, + dd.date_of_birth AS dateOfBirth, + dd.gender AS gender, + dd.home_no AS homeNo, + dd.street_name AS streetName, + dd.city AS city, + dd.district AS district, + dd.license_number AS licenseNumber, + dd.license_front_url AS licenseFrontURL, + dd.license_back_url AS licenseBackURL, + dd.registration_date AS registrationDate, + dd.availability AS availability, + dd.stripe_id AS stripeId, + dd.wallet_balance AS walletBalance, + d.email AS email, + d.mobile_number AS mobileNumber, + COALESCE(SUM(r.rating_count) / NULLIF(COUNT(r.rating_id), 0), 0) AS rating + FROM driver_details dd + JOIN drivers d ON d.user_id = dd.user_id + LEFT JOIN rating r ON r.user_details_id = dd.user_details_id + WHERE dd.approved = 'APPROVED' + AND d.user_id IN ( + SELECT da.user_id + FROM driver_availability da + GROUP BY da.user_id + HAVING MAX(da.end_time) < now() - interval '7 days' + ) + GROUP BY dd.user_details_id, dd.first_name, dd.last_name, dd.date_of_birth, dd.gender, + dd.home_no, dd.street_name, dd.city, dd.district, dd.license_number, + dd.license_front_url, dd.license_back_url, dd.registration_date, dd.availability, + dd.stripe_id, dd.wallet_balance, d.email, d.mobile_number + ORDER BY dd.user_details_id +""", nativeQuery = true) + List findApprovedInactiveDrivers(); + + @Query(value = """ + SELECT + COUNT(*) FILTER ( + WHERE d.user_id IN ( + SELECT da.user_id + FROM driver_availability da + GROUP BY da.user_id + HAVING MAX(da.end_time) < now() - interval '7 days' + ) + ) AS inactiveDriversCount, + + COUNT(*) FILTER ( + WHERE d.user_id NOT IN ( + SELECT da.user_id + FROM driver_availability da + GROUP BY da.user_id + HAVING MAX(da.end_time) < now() - interval '7 days' + ) + ) AS activeDriversCount + FROM driver_details dd + JOIN drivers d ON d.user_id = dd.user_id + WHERE dd.approved = 'APPROVED' +""", nativeQuery = true) + List countApprovedInactiveDrivers(); + +} \ No newline at end of file diff --git a/src/main/java/com/pentagon/Quicky_Backend/repository/DriverEarningsRepo.java b/src/main/java/com/pentagon/Quicky_Backend/repository/DriverEarningsRepo.java index 225253e..0e0113f 100644 --- a/src/main/java/com/pentagon/Quicky_Backend/repository/DriverEarningsRepo.java +++ b/src/main/java/com/pentagon/Quicky_Backend/repository/DriverEarningsRepo.java @@ -13,14 +13,14 @@ public interface DriverEarningsRepo extends JpaRepository { @Query(value = """ SELECT - DATE(o.time_stamp) AS earningDate, + DATE(e.created_at) AS earningDate, COALESCE(SUM(e.delivery_charge), 0) AS amount FROM earning e JOIN delivery_order o ON e.delivery_id = o.delivery_id GROUP BY - DATE(o.time_stamp) + DATE(e.created_at) ORDER BY earningDate """, nativeQuery = true) diff --git a/src/main/java/com/pentagon/Quicky_Backend/service/DriverProfilesService.java b/src/main/java/com/pentagon/Quicky_Backend/service/DriverProfilesService.java index 6808fae..a375846 100644 --- a/src/main/java/com/pentagon/Quicky_Backend/service/DriverProfilesService.java +++ b/src/main/java/com/pentagon/Quicky_Backend/service/DriverProfilesService.java @@ -3,6 +3,7 @@ import com.pentagon.Quicky_Backend.dto.DriverEarningsProfilesDto; import com.pentagon.Quicky_Backend.dto.DriverProfilesDto; import com.pentagon.Quicky_Backend.dto.DriversCountDto; +import com.pentagon.Quicky_Backend.dto.InactiveDriversCountDto; import com.pentagon.Quicky_Backend.repository.DriverDetailsRepo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -31,4 +32,11 @@ public List getTodayEarnings() { return driverDetailsRepo.findApprovedDriversWithEarningsToday(); } + public List getInactiveDrivers() { + return driverDetailsRepo.findApprovedInactiveDrivers(); + } + + public List getInactiveDriversCount() { + return driverDetailsRepo.countApprovedInactiveDrivers(); + } } diff --git a/src/main/java/com/pentagon/Quicky_Backend/service/NewRegistrationsService.java b/src/main/java/com/pentagon/Quicky_Backend/service/NewRegistrationsService.java index 050a558..9f573d4 100644 --- a/src/main/java/com/pentagon/Quicky_Backend/service/NewRegistrationsService.java +++ b/src/main/java/com/pentagon/Quicky_Backend/service/NewRegistrationsService.java @@ -26,7 +26,7 @@ public boolean addDriver(Integer userDetailsId) { if (optionalNewDriver.isPresent()) { DriverDetails newDriver = optionalNewDriver.get(); - newDriver.setApproved(true); + newDriver.setApproved(DriverDetails.ApprovalStatus.APPROVED); newDriver.setRegistrationDate(LocalDate.now()); driverDetailsRepo.save(newDriver); @@ -41,7 +41,7 @@ public boolean rejectDriver(Integer userDetailsId) { if (optionalNewDriver.isPresent()) { DriverDetails newDriver = optionalNewDriver.get(); - newDriver.setApproved(false); + newDriver.setApproved(DriverDetails.ApprovalStatus.REJECTED); driverDetailsRepo.save(newDriver); return true;