From 21af49ff2dd2803c0805304ea204416486bca25c Mon Sep 17 00:00:00 2001 From: dilusha-ola Date: Wed, 5 Nov 2025 21:24:56 +0530 Subject: [PATCH] create dashboard,appointment and project backend files. --- .../controller/AppointmentController.java | 26 +++ .../controller/DashboardController.java | 45 ++++ .../controller/ProjectController.java | 32 +++ .../controller/VehicleController.java | 4 +- .../ead_backend/dto/AppointmentDTO.java | 28 ++- .../example/ead_backend/dto/CustomerDTO.java | 18 +- .../ead_backend/dto/DashboardStatsDTO.java | 16 ++ .../example/ead_backend/dto/ProjectDTO.java | 36 ++- .../ead_backend/mapper/AppointmentMapper.java | 12 +- .../ead_backend/mapper/ProjectMapper.java | 12 +- .../ead_backend/mapper/VehicleMapper.java | 4 +- .../ead_backend/model/entity/Vehicle.java | 6 +- .../repository/AppointmentRepository.java | 8 +- .../repository/CustomerRepository.java | 8 +- .../repository/EmployeeRepository.java | 7 +- .../repository/ProjectRepository.java | 4 +- .../repository/VehicleRepository.java | 4 +- .../ead_backend/service/DashboardService.java | 18 ++ .../appointment/AppointmentService.java | 18 +- .../service/impl/DashboardServiceImpl.java | 215 ++++++++++++++++++ .../service/impl/VehicleServiceImpl.java | 16 +- .../service/project/ProjectService.java | 12 +- src/main/resources/application.properties | 4 +- 23 files changed, 487 insertions(+), 66 deletions(-) create mode 100644 src/main/java/com/example/ead_backend/controller/DashboardController.java create mode 100644 src/main/java/com/example/ead_backend/dto/DashboardStatsDTO.java create mode 100644 src/main/java/com/example/ead_backend/service/DashboardService.java create mode 100644 src/main/java/com/example/ead_backend/service/impl/DashboardServiceImpl.java diff --git a/src/main/java/com/example/ead_backend/controller/AppointmentController.java b/src/main/java/com/example/ead_backend/controller/AppointmentController.java index 3c14d3c..21b6669 100644 --- a/src/main/java/com/example/ead_backend/controller/AppointmentController.java +++ b/src/main/java/com/example/ead_backend/controller/AppointmentController.java @@ -1,5 +1,31 @@ package com.example.ead_backend.controller; +import com.example.ead_backend.dto.AppointmentDTO; +import com.example.ead_backend.service.DashboardService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/api/appointments") +@CrossOrigin(origins = "*") +@RequiredArgsConstructor public class AppointmentController { + private final DashboardService dashboardService; + + @GetMapping("/customer/{customerId}") + public ResponseEntity> getCustomerAppointments(@PathVariable Long customerId) { + // This returns all appointments for the customer + List appointments = dashboardService.getAllAppointments(customerId); + return ResponseEntity.ok(appointments); + } + + @DeleteMapping("/{appointmentId}") + public ResponseEntity deleteAppointment(@PathVariable String appointmentId) { + // TODO: Implement delete appointment logic + return ResponseEntity.ok("Appointment deleted successfully"); + } } diff --git a/src/main/java/com/example/ead_backend/controller/DashboardController.java b/src/main/java/com/example/ead_backend/controller/DashboardController.java new file mode 100644 index 0000000..75881cf --- /dev/null +++ b/src/main/java/com/example/ead_backend/controller/DashboardController.java @@ -0,0 +1,45 @@ +package com.example.ead_backend.controller; + +import com.example.ead_backend.dto.AppointmentDTO; +import com.example.ead_backend.dto.CustomerDTO; +import com.example.ead_backend.dto.DashboardStatsDTO; +import com.example.ead_backend.dto.ProjectDTO; +import com.example.ead_backend.service.DashboardService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/api/dashboard") +@CrossOrigin(origins = "*") +@RequiredArgsConstructor +public class DashboardController { + + private final DashboardService dashboardService; + + @GetMapping("/stats/{customerId}") + public ResponseEntity getDashboardStats(@PathVariable Long customerId) { + DashboardStatsDTO stats = dashboardService.getDashboardStats(customerId); + return ResponseEntity.ok(stats); + } + + @GetMapping("/profile/{customerId}") + public ResponseEntity getCustomerProfile(@PathVariable Long customerId) { + CustomerDTO customer = dashboardService.getCustomerProfile(customerId); + return ResponseEntity.ok(customer); + } + + @GetMapping("/appointments/upcoming/{customerId}") + public ResponseEntity> getUpcomingAppointments(@PathVariable Long customerId) { + List appointments = dashboardService.getUpcomingAppointments(customerId); + return ResponseEntity.ok(appointments); + } + + @GetMapping("/projects/ongoing/{customerId}") + public ResponseEntity> getOngoingProjects(@PathVariable Long customerId) { + List projects = dashboardService.getOngoingProjects(customerId); + return ResponseEntity.ok(projects); + } +} diff --git a/src/main/java/com/example/ead_backend/controller/ProjectController.java b/src/main/java/com/example/ead_backend/controller/ProjectController.java index 6a2c4a1..72cdd2d 100644 --- a/src/main/java/com/example/ead_backend/controller/ProjectController.java +++ b/src/main/java/com/example/ead_backend/controller/ProjectController.java @@ -1,5 +1,37 @@ package com.example.ead_backend.controller; +import com.example.ead_backend.dto.ProjectDTO; +import com.example.ead_backend.service.DashboardService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/api/projects") +@CrossOrigin(origins = "*") +@RequiredArgsConstructor public class ProjectController { + private final DashboardService dashboardService; + + @GetMapping("/customer/{customerId}") + public ResponseEntity> getCustomerProjects(@PathVariable Long customerId) { + // This returns all projects for the customer + List projects = dashboardService.getAllProjects(customerId); + return ResponseEntity.ok(projects); + } + + @GetMapping("/customer/{customerId}/completed") + public ResponseEntity> getCompletedProjects(@PathVariable Long customerId) { + List projects = dashboardService.getCompletedProjects(customerId); + return ResponseEntity.ok(projects); + } + + @DeleteMapping("/{projectId}") + public ResponseEntity deleteProject(@PathVariable String projectId) { + // TODO: Implement delete project logic + return ResponseEntity.ok("Project deleted successfully"); + } } diff --git a/src/main/java/com/example/ead_backend/controller/VehicleController.java b/src/main/java/com/example/ead_backend/controller/VehicleController.java index fd0ac72..9b3d264 100644 --- a/src/main/java/com/example/ead_backend/controller/VehicleController.java +++ b/src/main/java/com/example/ead_backend/controller/VehicleController.java @@ -49,7 +49,7 @@ public ResponseEntity createVehicleWithImage( } @GetMapping("/{id}") - public VehicleDTO getVehicleById(@PathVariable String id) { + public VehicleDTO getVehicleById(@PathVariable Long id) { return vehicleService.getVehicleById(id); } @@ -64,7 +64,7 @@ public List getVehiclesByCustomerId(@PathVariable Long customerId) { } @PutMapping("/{id}") - public VehicleDTO updateVehicle(@PathVariable String id, @RequestBody VehicleDTO vehicleDTO) { + public VehicleDTO updateVehicle(@PathVariable Long id, @RequestBody VehicleDTO vehicleDTO) { return vehicleService.updateVehicle(id, vehicleDTO); } diff --git a/src/main/java/com/example/ead_backend/dto/AppointmentDTO.java b/src/main/java/com/example/ead_backend/dto/AppointmentDTO.java index f30e215..b33a9ad 100644 --- a/src/main/java/com/example/ead_backend/dto/AppointmentDTO.java +++ b/src/main/java/com/example/ead_backend/dto/AppointmentDTO.java @@ -1,5 +1,31 @@ package com.example.ead_backend.dto; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder public class AppointmentDTO { - + private String id; + private Long customerId; + private String customerName; + private Long vehicleId; + private String vehicleNumber; + private String vehicleModel; + private Long employeeId; + private String employeeName; + private LocalDateTime appointmentTime; + private String status; + private List tasks; + private String serviceName; + private String customerNotes; + private Integer estimatedDurationMinutes; + private LocalDateTime createdAt; } diff --git a/src/main/java/com/example/ead_backend/dto/CustomerDTO.java b/src/main/java/com/example/ead_backend/dto/CustomerDTO.java index 8637136..ce100cb 100644 --- a/src/main/java/com/example/ead_backend/dto/CustomerDTO.java +++ b/src/main/java/com/example/ead_backend/dto/CustomerDTO.java @@ -1,5 +1,21 @@ package com.example.ead_backend.dto; -public class CustomerDTO { +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class CustomerDTO { + private Long id; + private String name; + private String email; + private String phoneNumber; + private String address; + private LocalDateTime createdAt; } diff --git a/src/main/java/com/example/ead_backend/dto/DashboardStatsDTO.java b/src/main/java/com/example/ead_backend/dto/DashboardStatsDTO.java new file mode 100644 index 0000000..60037e0 --- /dev/null +++ b/src/main/java/com/example/ead_backend/dto/DashboardStatsDTO.java @@ -0,0 +1,16 @@ +package com.example.ead_backend.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class DashboardStatsDTO { + private Integer totalVehicles; + private Integer upcomingAppointments; + private Integer ongoingProjects; +} diff --git a/src/main/java/com/example/ead_backend/dto/ProjectDTO.java b/src/main/java/com/example/ead_backend/dto/ProjectDTO.java index 7df8817..30d68bb 100644 --- a/src/main/java/com/example/ead_backend/dto/ProjectDTO.java +++ b/src/main/java/com/example/ead_backend/dto/ProjectDTO.java @@ -1,5 +1,39 @@ package com.example.ead_backend.dto; -public class ProjectDTO { +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class ProjectDTO { + private String id; + private Long customerId; + private String customerName; + private Long vehicleId; + private String vehicleNumber; + private String vehicleModel; + private String vehicleType; + private Long employeeId; + private String employeeName; + private String assignedEmployee; + private String serviceDescription; + private String taskName; + private String description; + private String status; + private String adminNotes; + private String employeeNotes; + private Double estimatedCost; + private Integer estimatedDurationDays; + private LocalDateTime startDate; + private String time; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; + private LocalDateTime assignedAt; + private LocalDateTime completedAt; } diff --git a/src/main/java/com/example/ead_backend/mapper/AppointmentMapper.java b/src/main/java/com/example/ead_backend/mapper/AppointmentMapper.java index cb5b310..ccc24d8 100644 --- a/src/main/java/com/example/ead_backend/mapper/AppointmentMapper.java +++ b/src/main/java/com/example/ead_backend/mapper/AppointmentMapper.java @@ -10,9 +10,9 @@ public class AppointmentMapper { public AppointmentResponse toResponse(Appointment appointment) { AppointmentResponse response = new AppointmentResponse(); response.setAppointmentId(appointment.getAppointmentId()); - response.setCustomerName(appointment.getCustomer().getFirstName() + " " + - appointment.getCustomer().getLastName()); - response.setCustomerId(appointment.getCustomer().getCustomerId()); + response.setCustomerName(appointment.getCustomer().getUser().getFirstName() + " " + + appointment.getCustomer().getUser().getLastName()); + response.setCustomerId(String.valueOf(appointment.getCustomer().getId())); if (appointment.getVehicle() != null) { response.setVehicleMake(appointment.getVehicle().getMake()); @@ -21,9 +21,9 @@ public AppointmentResponse toResponse(Appointment appointment) { } if (appointment.getEmployee() != null) { - response.setEmployeeName(appointment.getEmployee().getFirstName() + " " + - appointment.getEmployee().getLastName()); - response.setEmployeeId(appointment.getEmployee().getEmployeeId()); + response.setEmployeeName(appointment.getEmployee().getUser().getFirstName() + " " + + appointment.getEmployee().getUser().getLastName()); + response.setEmployeeId(String.valueOf(appointment.getEmployee().getId())); } response.setAppointmentTime(appointment.getAppointmentTime()); diff --git a/src/main/java/com/example/ead_backend/mapper/ProjectMapper.java b/src/main/java/com/example/ead_backend/mapper/ProjectMapper.java index 1eae36c..95bb7c8 100644 --- a/src/main/java/com/example/ead_backend/mapper/ProjectMapper.java +++ b/src/main/java/com/example/ead_backend/mapper/ProjectMapper.java @@ -10,9 +10,9 @@ public class ProjectMapper { public ProjectResponse toResponse(Project project) { ProjectResponse response = new ProjectResponse(); response.setProjectId(project.getProjectId()); - response.setCustomerName(project.getCustomer().getFirstName() + " " + - project.getCustomer().getLastName()); - response.setCustomerId(project.getCustomer().getCustomerId()); + response.setCustomerName(project.getCustomer().getUser().getFirstName() + " " + + project.getCustomer().getUser().getLastName()); + response.setCustomerId(String.valueOf(project.getCustomer().getId())); if (project.getVehicle() != null) { response.setVehicleMake(project.getVehicle().getMake()); @@ -23,9 +23,9 @@ public ProjectResponse toResponse(Project project) { response.setServiceDescription(project.getServiceDescription()); if (project.getEmployee() != null) { - response.setEmployeeName(project.getEmployee().getFirstName() + " " + - project.getEmployee().getLastName()); - response.setEmployeeId(project.getEmployee().getEmployeeId()); + response.setEmployeeName(project.getEmployee().getUser().getFirstName() + " " + + project.getEmployee().getUser().getLastName()); + response.setEmployeeId(String.valueOf(project.getEmployee().getId())); } response.setStatus(project.getStatus()); diff --git a/src/main/java/com/example/ead_backend/mapper/VehicleMapper.java b/src/main/java/com/example/ead_backend/mapper/VehicleMapper.java index b395466..09e18dc 100644 --- a/src/main/java/com/example/ead_backend/mapper/VehicleMapper.java +++ b/src/main/java/com/example/ead_backend/mapper/VehicleMapper.java @@ -11,10 +11,10 @@ public interface VehicleMapper { VehicleMapper INSTANCE = Mappers.getMapper(VehicleMapper.class); - @Mapping(source = "customer.id", target = "customerId") + @Mapping(source = "owner.id", target = "customerId") VehicleDTO toDTO(Vehicle vehicle); - @Mapping(target = "customer", ignore = true) + @Mapping(target = "owner", ignore = true) @Mapping(target = "imagePublicId", ignore = true) Vehicle toEntity(VehicleDTO dto); } diff --git a/src/main/java/com/example/ead_backend/model/entity/Vehicle.java b/src/main/java/com/example/ead_backend/model/entity/Vehicle.java index 9963797..e817ba8 100644 --- a/src/main/java/com/example/ead_backend/model/entity/Vehicle.java +++ b/src/main/java/com/example/ead_backend/model/entity/Vehicle.java @@ -19,7 +19,7 @@ public class Vehicle { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "customer_id", nullable = false) - private Customer customer; + private Customer owner; @Column(nullable = false) private String model; @@ -37,10 +37,6 @@ public class Vehicle { @Column(nullable = false) private int year; - - @ManyToOne - @JoinColumn(name = "customer_id", nullable = false) - private Customer owner; @Column(length = 500) private String imageUrl; diff --git a/src/main/java/com/example/ead_backend/repository/AppointmentRepository.java b/src/main/java/com/example/ead_backend/repository/AppointmentRepository.java index fcaf9f0..2d9038f 100644 --- a/src/main/java/com/example/ead_backend/repository/AppointmentRepository.java +++ b/src/main/java/com/example/ead_backend/repository/AppointmentRepository.java @@ -14,10 +14,10 @@ public interface AppointmentRepository extends JpaRepository { // Find appointments by customer - List findByCustomer_CustomerId(String customerId); + List findByCustomer_Id(Long customerId); // Find appointments by employee - List findByEmployee_EmployeeId(String employeeId); + List findByEmployee_Id(Long employeeId); // Find appointments by status List findByStatus(AppointmentStatus status); @@ -33,9 +33,9 @@ List findByDateRange(@Param("startDate") LocalDateTime startDate, List findConflictingAppointments(@Param("appointmentTime") LocalDateTime appointmentTime); // Find employee appointments at specific time - @Query("SELECT a FROM Appointment a WHERE a.employee.employeeId = :employeeId " + + @Query("SELECT a FROM Appointment a WHERE a.employee.id = :employeeId " + "AND a.appointmentTime = :appointmentTime " + "AND a.status IN ('CONFIRMED', 'IN_PROGRESS')") - List findEmployeeAppointmentsAtTime(@Param("employeeId") String employeeId, + List findEmployeeAppointmentsAtTime(@Param("employeeId") Long employeeId, @Param("appointmentTime") LocalDateTime appointmentTime); } diff --git a/src/main/java/com/example/ead_backend/repository/CustomerRepository.java b/src/main/java/com/example/ead_backend/repository/CustomerRepository.java index 4d47be4..4ef8bbf 100644 --- a/src/main/java/com/example/ead_backend/repository/CustomerRepository.java +++ b/src/main/java/com/example/ead_backend/repository/CustomerRepository.java @@ -8,13 +8,9 @@ import java.util.Optional; @Repository -public interface CustomerRepository extends JpaRepository { - Optional findByEmail(String email); - boolean existsByEmail(String email); - public interface CustomerRepository extends JpaRepository { Optional findByUser(User user); Optional findByUserId(Long userId); - Optional findByEmail(String email); - boolean existsByEmail(String email); + Optional findByUserEmail(String email); + boolean existsByUserEmail(String email); } diff --git a/src/main/java/com/example/ead_backend/repository/EmployeeRepository.java b/src/main/java/com/example/ead_backend/repository/EmployeeRepository.java index 7b7cff7..ef8da53 100644 --- a/src/main/java/com/example/ead_backend/repository/EmployeeRepository.java +++ b/src/main/java/com/example/ead_backend/repository/EmployeeRepository.java @@ -5,12 +5,13 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; - import java.util.List; +import java.util.Optional; + @Repository public interface EmployeeRepository extends JpaRepository { Optional findByUser(User user); Optional findByUserId(Long userId); - Optional findByEmail(String email); + Optional findByUserEmail(String email); List findByIsAvailable(boolean isAvailable); - +} diff --git a/src/main/java/com/example/ead_backend/repository/ProjectRepository.java b/src/main/java/com/example/ead_backend/repository/ProjectRepository.java index 021b831..5038474 100644 --- a/src/main/java/com/example/ead_backend/repository/ProjectRepository.java +++ b/src/main/java/com/example/ead_backend/repository/ProjectRepository.java @@ -11,10 +11,10 @@ public interface ProjectRepository extends JpaRepository { // Find projects by customer - List findByCustomer_CustomerId(String customerId); + List findByCustomer_Id(Long customerId); // Find projects by employee - List findByEmployee_EmployeeId(String employeeId); + List findByEmployee_Id(Long employeeId); // Find projects by status List findByStatus(ProjectStatus status); diff --git a/src/main/java/com/example/ead_backend/repository/VehicleRepository.java b/src/main/java/com/example/ead_backend/repository/VehicleRepository.java index aea564b..c3dfb92 100644 --- a/src/main/java/com/example/ead_backend/repository/VehicleRepository.java +++ b/src/main/java/com/example/ead_backend/repository/VehicleRepository.java @@ -5,11 +5,11 @@ import com.example.ead_backend.model.entity.Vehicle; - +import java.util.List; import java.util.Optional; @Repository public interface VehicleRepository extends JpaRepository { - List findByCustomerId(Long customerId); + List findByOwner_Id(Long customerId); Optional findByLicensePlate(String licensePlate); } diff --git a/src/main/java/com/example/ead_backend/service/DashboardService.java b/src/main/java/com/example/ead_backend/service/DashboardService.java new file mode 100644 index 0000000..f339e8f --- /dev/null +++ b/src/main/java/com/example/ead_backend/service/DashboardService.java @@ -0,0 +1,18 @@ +package com.example.ead_backend.service; + +import com.example.ead_backend.dto.AppointmentDTO; +import com.example.ead_backend.dto.CustomerDTO; +import com.example.ead_backend.dto.DashboardStatsDTO; +import com.example.ead_backend.dto.ProjectDTO; + +import java.util.List; + +public interface DashboardService { + DashboardStatsDTO getDashboardStats(Long customerId); + CustomerDTO getCustomerProfile(Long customerId); + List getUpcomingAppointments(Long customerId); + List getAllAppointments(Long customerId); + List getOngoingProjects(Long customerId); + List getAllProjects(Long customerId); + List getCompletedProjects(Long customerId); +} diff --git a/src/main/java/com/example/ead_backend/service/appointment/AppointmentService.java b/src/main/java/com/example/ead_backend/service/appointment/AppointmentService.java index 5f279cb..99a5396 100644 --- a/src/main/java/com/example/ead_backend/service/appointment/AppointmentService.java +++ b/src/main/java/com/example/ead_backend/service/appointment/AppointmentService.java @@ -43,13 +43,13 @@ public class AppointmentService { @Transactional public AppointmentResponse createAppointment(CreateAppointmentRequest request) { // Validate vehicle belongs to customer - Vehicle vehicle = vehicleRepository.findById(request.getVehicleId()) + Vehicle vehicle = vehicleRepository.findById(Long.parseLong(request.getVehicleId())) .orElseThrow(() -> new RuntimeException("Vehicle not found")); - Customer customer = customerRepository.findById(request.getCustomerId()) + Customer customer = customerRepository.findById(Long.parseLong(request.getCustomerId())) .orElseThrow(() -> new RuntimeException("Customer not found")); - if (!vehicle.getOwner().getCustomerId().equals(customer.getCustomerId())) { + if (!vehicle.getOwner().getId().equals(customer.getId())) { throw new RuntimeException("Vehicle does not belong to customer"); } @@ -117,12 +117,12 @@ public AppointmentResponse assignEmployee(String appointmentId, AssignEmployeeRe Appointment appointment = appointmentRepository.findById(appointmentId) .orElseThrow(() -> new RuntimeException("Appointment not found")); - Employee employee = employeeRepository.findById(request.getEmployeeId()) + Employee employee = employeeRepository.findById(Long.parseLong(request.getEmployeeId())) .orElseThrow(() -> new RuntimeException("Employee not found")); // Check if employee is available at that time List employeeConflicts = appointmentRepository - .findEmployeeAppointmentsAtTime(employee.getEmployeeId(), appointment.getAppointmentTime()); + .findEmployeeAppointmentsAtTime(employee.getId(), appointment.getAppointmentTime()); if (!employeeConflicts.isEmpty()) { throw new RuntimeException("Employee is not available at this time"); @@ -160,7 +160,7 @@ public List getAllAppointments() { * Get customer's appointments */ public List getCustomerAppointments(String customerId) { - return appointmentRepository.findByCustomer_CustomerId(customerId) + return appointmentRepository.findByCustomer_Id(Long.parseLong(customerId)) .stream() .map(appointmentMapper::toResponse) .collect(Collectors.toList()); @@ -170,7 +170,7 @@ public List getCustomerAppointments(String customerId) { * Get employee's appointments */ public List getEmployeeAppointments(String employeeId) { - return appointmentRepository.findByEmployee_EmployeeId(employeeId) + return appointmentRepository.findByEmployee_Id(Long.parseLong(employeeId)) .stream() .map(appointmentMapper::toResponse) .collect(Collectors.toList()); @@ -199,10 +199,10 @@ private int calculateDuration(List tasks) { */ public boolean validateBookingConstraints(CreateAppointmentRequest request) { // Check if vehicle exists and belongs to customer - Vehicle vehicle = vehicleRepository.findById(request.getVehicleId()) + Vehicle vehicle = vehicleRepository.findById(Long.parseLong(request.getVehicleId())) .orElseThrow(() -> new RuntimeException("Vehicle not found")); - if (!vehicle.getOwner().getCustomerId().equals(request.getCustomerId())) { + if (!vehicle.getOwner().getId().equals(Long.parseLong(request.getCustomerId()))) { return false; } diff --git a/src/main/java/com/example/ead_backend/service/impl/DashboardServiceImpl.java b/src/main/java/com/example/ead_backend/service/impl/DashboardServiceImpl.java new file mode 100644 index 0000000..79713a0 --- /dev/null +++ b/src/main/java/com/example/ead_backend/service/impl/DashboardServiceImpl.java @@ -0,0 +1,215 @@ +package com.example.ead_backend.service.impl; + +import com.example.ead_backend.dto.AppointmentDTO; +import com.example.ead_backend.dto.CustomerDTO; +import com.example.ead_backend.dto.DashboardStatsDTO; +import com.example.ead_backend.dto.ProjectDTO; +import com.example.ead_backend.model.entity.Appointment; +import com.example.ead_backend.model.entity.Customer; +import com.example.ead_backend.model.entity.Project; +import com.example.ead_backend.model.enums.AppointmentStatus; +import com.example.ead_backend.model.enums.ProjectStatus; +import com.example.ead_backend.repository.AppointmentRepository; +import com.example.ead_backend.repository.CustomerRepository; +import com.example.ead_backend.repository.ProjectRepository; +import com.example.ead_backend.repository.VehicleRepository; +import com.example.ead_backend.service.DashboardService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class DashboardServiceImpl implements DashboardService { + + private final CustomerRepository customerRepository; + private final VehicleRepository vehicleRepository; + private final AppointmentRepository appointmentRepository; + private final ProjectRepository projectRepository; + + @Override + public DashboardStatsDTO getDashboardStats(Long customerId) { + Customer customer = customerRepository.findById(customerId) + .orElseThrow(() -> new RuntimeException("Customer not found with id: " + customerId)); + + // Count vehicles for this customer + int totalVehicles = vehicleRepository.findByOwner_Id(customerId).size(); + + // Count upcoming appointments (PENDING, CONFIRMED, IN_PROGRESS) + List allAppointments = customer.getAppointments(); + int upcomingAppointments = (int) allAppointments.stream() + .filter(apt -> apt.getStatus() == AppointmentStatus.PENDING || + apt.getStatus() == AppointmentStatus.CONFIRMED || + apt.getStatus() == AppointmentStatus.IN_PROGRESS) + .filter(apt -> apt.getAppointmentTime().isAfter(LocalDateTime.now()) || + apt.getStatus() == AppointmentStatus.IN_PROGRESS) + .count(); + + // Count ongoing projects (IN_PROGRESS, ASSIGNED) + List allProjects = customer.getProjects(); + int ongoingProjects = (int) allProjects.stream() + .filter(proj -> proj.getStatus() == ProjectStatus.IN_PROGRESS || + proj.getStatus() == ProjectStatus.ASSIGNED || + proj.getStatus() == ProjectStatus.UNDER_REVIEW) + .count(); + + return DashboardStatsDTO.builder() + .totalVehicles(totalVehicles) + .upcomingAppointments(upcomingAppointments) + .ongoingProjects(ongoingProjects) + .build(); + } + + @Override + public CustomerDTO getCustomerProfile(Long customerId) { + Customer customer = customerRepository.findById(customerId) + .orElseThrow(() -> new RuntimeException("Customer not found with id: " + customerId)); + + return CustomerDTO.builder() + .id(customer.getId()) + .name(customer.getUser().getFirstName() + " " + customer.getUser().getLastName()) + .email(customer.getUser().getEmail()) + .phoneNumber(customer.getPhoneNumber()) + .address(customer.getAddress()) + .createdAt(customer.getCreatedAt()) + .build(); + } + + @Override + public List getUpcomingAppointments(Long customerId) { + Customer customer = customerRepository.findById(customerId) + .orElseThrow(() -> new RuntimeException("Customer not found with id: " + customerId)); + + List appointments = customer.getAppointments(); + + return appointments.stream() + .filter(apt -> (apt.getStatus() == AppointmentStatus.PENDING || + apt.getStatus() == AppointmentStatus.CONFIRMED || + apt.getStatus() == AppointmentStatus.IN_PROGRESS) && + (apt.getAppointmentTime().isAfter(LocalDateTime.now()) || + apt.getStatus() == AppointmentStatus.IN_PROGRESS)) + .sorted((a1, a2) -> a1.getAppointmentTime().compareTo(a2.getAppointmentTime())) + .limit(10) + .map(this::convertToAppointmentDTO) + .collect(Collectors.toList()); + } + + @Override + public List getAllAppointments(Long customerId) { + Customer customer = customerRepository.findById(customerId) + .orElseThrow(() -> new RuntimeException("Customer not found with id: " + customerId)); + + List appointments = customer.getAppointments(); + + return appointments.stream() + .sorted((a1, a2) -> a2.getAppointmentTime().compareTo(a1.getAppointmentTime())) + .map(this::convertToAppointmentDTO) + .collect(Collectors.toList()); + } + + @Override + public List getOngoingProjects(Long customerId) { + Customer customer = customerRepository.findById(customerId) + .orElseThrow(() -> new RuntimeException("Customer not found with id: " + customerId)); + + List projects = customer.getProjects(); + + return projects.stream() + .filter(proj -> proj.getStatus() == ProjectStatus.IN_PROGRESS || + proj.getStatus() == ProjectStatus.ASSIGNED || + proj.getStatus() == ProjectStatus.UNDER_REVIEW) + .sorted((p1, p2) -> p2.getCreatedAt().compareTo(p1.getCreatedAt())) + .limit(10) + .map(this::convertToProjectDTO) + .collect(Collectors.toList()); + } + + @Override + public List getAllProjects(Long customerId) { + Customer customer = customerRepository.findById(customerId) + .orElseThrow(() -> new RuntimeException("Customer not found with id: " + customerId)); + + List projects = customer.getProjects(); + + return projects.stream() + .sorted((p1, p2) -> p2.getCreatedAt().compareTo(p1.getCreatedAt())) + .map(this::convertToProjectDTO) + .collect(Collectors.toList()); + } + + @Override + public List getCompletedProjects(Long customerId) { + Customer customer = customerRepository.findById(customerId) + .orElseThrow(() -> new RuntimeException("Customer not found with id: " + customerId)); + + List projects = customer.getProjects(); + + return projects.stream() + .filter(proj -> proj.getStatus() == ProjectStatus.COMPLETED) + .sorted((p1, p2) -> p2.getCreatedAt().compareTo(p1.getCreatedAt())) + .map(this::convertToProjectDTO) + .collect(Collectors.toList()); + } + + private AppointmentDTO convertToAppointmentDTO(Appointment appointment) { + String serviceName = appointment.getTasks() != null && !appointment.getTasks().isEmpty() + ? String.join(", ", appointment.getTasks()) + : "Service"; + + return AppointmentDTO.builder() + .id(appointment.getAppointmentId()) + .customerId(appointment.getCustomer().getId()) + .customerName(appointment.getCustomer().getUser().getFirstName() + " " + appointment.getCustomer().getUser().getLastName()) + .vehicleId(Long.parseLong(appointment.getVehicle().getId())) + .vehicleNumber(appointment.getVehicle().getLicensePlate()) + .vehicleModel(appointment.getVehicle().getModel()) + .employeeId(appointment.getEmployee() != null ? appointment.getEmployee().getId() : null) + .employeeName(appointment.getEmployee() != null ? (appointment.getEmployee().getUser().getFirstName() + " " + appointment.getEmployee().getUser().getLastName()) : null) + .appointmentTime(appointment.getAppointmentTime()) + .status(appointment.getStatus().toString()) + .tasks(appointment.getTasks()) + .serviceName(serviceName) + .customerNotes(appointment.getCustomerNotes()) + .estimatedDurationMinutes(appointment.getEstimatedDurationMinutes()) + .createdAt(appointment.getCreatedAt()) + .build(); + } + + private ProjectDTO convertToProjectDTO(Project project) { + DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm"); + String time = project.getCreatedAt().format(timeFormatter); + + return ProjectDTO.builder() + .id(project.getProjectId()) + .customerId(project.getCustomer().getId()) + .customerName(project.getCustomer().getUser().getFirstName() + " " + project.getCustomer().getUser().getLastName()) + .vehicleId(Long.parseLong(project.getVehicle().getId())) + .vehicleNumber(project.getVehicle().getLicensePlate()) + .vehicleModel(project.getVehicle().getModel()) + .vehicleType(project.getVehicle().getMake() + " " + project.getVehicle().getModel()) + .employeeId(project.getEmployee() != null ? project.getEmployee().getId() : null) + .employeeName(project.getEmployee() != null ? (project.getEmployee().getUser().getFirstName() + " " + project.getEmployee().getUser().getLastName()) : null) + .assignedEmployee(project.getEmployee() != null ? (project.getEmployee().getUser().getFirstName() + " " + project.getEmployee().getUser().getLastName()) : "Unassigned") + .serviceDescription(project.getServiceDescription()) + .taskName(project.getServiceDescription().length() > 50 + ? project.getServiceDescription().substring(0, 50) + "..." + : project.getServiceDescription()) + .description(project.getServiceDescription()) + .status(project.getStatus().toString()) + .adminNotes(project.getAdminNotes()) + .employeeNotes(project.getEmployeeNotes()) + .estimatedCost(project.getEstimatedCost()) + .estimatedDurationDays(project.getEstimatedDurationDays()) + .startDate(project.getCreatedAt()) + .time(time) + .createdAt(project.getCreatedAt()) + .updatedAt(project.getUpdatedAt()) + .assignedAt(project.getAssignedAt()) + .completedAt(project.getCompletedAt()) + .build(); + } +} diff --git a/src/main/java/com/example/ead_backend/service/impl/VehicleServiceImpl.java b/src/main/java/com/example/ead_backend/service/impl/VehicleServiceImpl.java index dcc3829..980dd9a 100644 --- a/src/main/java/com/example/ead_backend/service/impl/VehicleServiceImpl.java +++ b/src/main/java/com/example/ead_backend/service/impl/VehicleServiceImpl.java @@ -35,7 +35,7 @@ public VehicleDTO createVehicle(VehicleDTO vehicleDTO) { // Create vehicle entity Vehicle vehicle = vehicleMapper.toEntity(vehicleDTO); - vehicle.setCustomer(customer); + vehicle.setOwner(customer); // Save and return Vehicle saved = vehicleRepository.save(vehicle); @@ -55,7 +55,7 @@ public VehicleDTO createVehicleWithImage(VehicleDTO vehicleDTO, MultipartFile im // Create vehicle entity Vehicle vehicle = vehicleMapper.toEntity(vehicleDTO); - vehicle.setCustomer(customer); + vehicle.setOwner(customer); vehicle.setImageUrl(imageUrl); vehicle.setImagePublicId(publicId); @@ -65,7 +65,7 @@ public VehicleDTO createVehicleWithImage(VehicleDTO vehicleDTO, MultipartFile im } @Override - public VehicleDTO getVehicleById(String id) { + public VehicleDTO getVehicleById(Long id) { Vehicle vehicle = vehicleRepository.findById(id) .orElseThrow(() -> new RuntimeException("Vehicle not found with id " + id)); return vehicleMapper.toDTO(vehicle); @@ -85,7 +85,7 @@ public List getVehiclesByCustomerId(Long customerId) { customerRepository.findById(customerId) .orElseThrow(() -> new RuntimeException("Customer not found with id " + customerId)); - return vehicleRepository.findByCustomerId(customerId) + return vehicleRepository.findByOwner_Id(customerId) .stream() .map(vehicleMapper::toDTO) .collect(Collectors.toList()); @@ -105,10 +105,10 @@ public VehicleDTO updateVehicle(Long id, VehicleDTO vehicleDTO) { existing.setRegistrationDate(vehicleDTO.getRegistrationDate()); // If customer is being changed - if (vehicleDTO.getCustomerId() != null && !vehicleDTO.getCustomerId().equals(existing.getCustomer().getId())) { + if (vehicleDTO.getCustomerId() != null && !vehicleDTO.getCustomerId().equals(existing.getOwner().getId())) { Customer newCustomer = customerRepository.findById(vehicleDTO.getCustomerId()) .orElseThrow(() -> new RuntimeException("Customer not found with id " + vehicleDTO.getCustomerId())); - existing.setCustomer(newCustomer); + existing.setOwner(newCustomer); } Vehicle updated = vehicleRepository.save(existing); @@ -140,10 +140,10 @@ public VehicleDTO updateVehicleWithImage(Long id, VehicleDTO vehicleDTO, Multipa existing.setRegistrationDate(vehicleDTO.getRegistrationDate()); // If customer is being changed - if (vehicleDTO.getCustomerId() != null && !vehicleDTO.getCustomerId().equals(existing.getCustomer().getId())) { + if (vehicleDTO.getCustomerId() != null && !vehicleDTO.getCustomerId().equals(existing.getOwner().getId())) { Customer newCustomer = customerRepository.findById(vehicleDTO.getCustomerId()) .orElseThrow(() -> new RuntimeException("Customer not found with id " + vehicleDTO.getCustomerId())); - existing.setCustomer(newCustomer); + existing.setOwner(newCustomer); } Vehicle updated = vehicleRepository.save(existing); diff --git a/src/main/java/com/example/ead_backend/service/project/ProjectService.java b/src/main/java/com/example/ead_backend/service/project/ProjectService.java index 4e7218a..18a9e22 100644 --- a/src/main/java/com/example/ead_backend/service/project/ProjectService.java +++ b/src/main/java/com/example/ead_backend/service/project/ProjectService.java @@ -35,14 +35,14 @@ public class ProjectService { @Transactional public ProjectResponse createProject(CreateProjectRequest request) { // Validate customer - Customer customer = customerRepository.findById(request.getCustomerId()) + Customer customer = customerRepository.findById(Long.parseLong(request.getCustomerId())) .orElseThrow(() -> new RuntimeException("Customer not found")); // Validate vehicle - Vehicle vehicle = vehicleRepository.findById(request.getVehicleId()) + Vehicle vehicle = vehicleRepository.findById(Long.parseLong(request.getVehicleId())) .orElseThrow(() -> new RuntimeException("Vehicle not found")); - if (!vehicle.getOwner().getCustomerId().equals(customer.getCustomerId())) { + if (!vehicle.getOwner().getId().equals(customer.getId())) { throw new RuntimeException("Vehicle does not belong to customer"); } @@ -66,7 +66,7 @@ public ProjectResponse assignEmployeeToProject(String projectId, AssignEmployeeT Project project = projectRepository.findById(projectId) .orElseThrow(() -> new RuntimeException("Project not found")); - Employee employee = employeeRepository.findById(request.getEmployeeId()) + Employee employee = employeeRepository.findById(Long.parseLong(request.getEmployeeId())) .orElseThrow(() -> new RuntimeException("Employee not found")); project.setEmployee(employee); @@ -105,7 +105,7 @@ public List getAllProjects() { * Get customer's projects */ public List getCustomerProjects(String customerId) { - return projectRepository.findByCustomer_CustomerId(customerId) + return projectRepository.findByCustomer_Id(Long.parseLong(customerId)) .stream() .map(projectMapper::toResponse) .collect(Collectors.toList()); @@ -115,7 +115,7 @@ public List getCustomerProjects(String customerId) { * Get employee's assigned projects */ public List getEmployeeProjects(String employeeId) { - return projectRepository.findByEmployee_EmployeeId(employeeId) + return projectRepository.findByEmployee_Id(Long.parseLong(employeeId)) .stream() .map(projectMapper::toResponse) .collect(Collectors.toList()); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 2e7a7ad..6e0783d 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,9 +1,9 @@ spring.application.name=auto-mobile # PostgreSQL Configuration -spring.datasource.url=jdbc:postgresql://localhost:5432/automobiledb +spring.datasource.url=jdbc:postgresql://localhost:5432/auto-mobile-3 spring.datasource.username=postgres -spring.datasource.password=cdpostgres +spring.datasource.password=dila123 spring.datasource.driver-class-name=org.postgresql.Driver spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect