package com.pollex.pam.service; import java.time.Instant; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; import com.pollex.pam.enums.AppointmentStatusEnum; import com.pollex.pam.service.dto.AppointmentDTO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.pollex.pam.domain.Appointment; import com.pollex.pam.domain.AppointmentCustomerView; import com.pollex.pam.enums.ContactStatusEnum; import com.pollex.pam.repository.AppointmentCustomerViewRepository; import com.pollex.pam.repository.AppointmentRepository; import com.pollex.pam.security.SecurityUtils; import com.pollex.pam.service.dto.AppointmentCreateDTO; import com.pollex.pam.service.dto.AppointmentCustomerViewDTO; import com.pollex.pam.service.mapper.AppointmentCustomerViewMapper; import com.pollex.pam.service.mapper.AppointmentDTOMapper; import com.pollex.pam.web.rest.errors.AppointmentNotFoundException; import static com.pollex.pam.enums.AppointmentStatusEnum.AVAILABLE; import static com.pollex.pam.enums.AppointmentStatusEnum.DELETED; @Service @Transactional public class AppointmentService { private static final Logger log = LoggerFactory.getLogger(AppointmentService.class); @Autowired AppointmentRepository appointmentRepository; @Autowired AppointmentDTOMapper appointmentDTOMapper; @Autowired ConsultantService consultantService; @Autowired AppointmentCustomerViewMapper appointmentCustomerViewMapper; @Autowired AppointmentCustomerViewRepository appointmentCustomerViewRepository; @Autowired SatisfactionService satisfactionService; public void customerCreateAppointment(AppointmentCreateDTO appointmentCreateDTO) { Appointment appointment = appointmentDTOMapper.toAppointment(appointmentCreateDTO); appointment.setCustomerId(SecurityUtils.getCustomerDBId()); appointment.setCommunicateStatus(ContactStatusEnum.RESERVED); appointmentRepository.save(appointment); } public List findByAgentNo(String agentNo) { return appointmentRepository.findByAgentNo(agentNo); } public Appointment markAsContacted(Long appointmentId) { Appointment appointment = appointmentRepository.findById(appointmentId).get(); appointment.setCommunicateStatus(ContactStatusEnum.CONTACTED); return appointmentRepository.save(appointment); } public AppointmentCustomerViewDTO getAppointmentDetail(Long appointmentId) { AppointmentCustomerView appointment = appointmentCustomerViewRepository.findById(appointmentId) .orElseThrow(AppointmentNotFoundException::new); return appointmentCustomerViewMapper.toAppointmentCustomerViewDTO(appointment); } public List findAvailableByAgentNoAndCustomerId(String agentNo, Long customerId) { return appointmentCustomerViewRepository.findByAgentNoAndCustomerId(agentNo, customerId) .stream() .filter(appointmentCustomerView -> appointmentCustomerView.getStatus() == AVAILABLE) .collect(Collectors.toList()); } public void recordConsultantReadTime(Long appointmentId) { Appointment appointment = appointmentRepository.findById(appointmentId).get(); if(appointment.getConsultantReadTime() == null) { appointment.setConsultantReadTime(Instant.now()); appointmentRepository.save(appointment); } else { log.debug("this appointment was read, read time = {}", appointment.getConsultantReadTime()); } } public void updateAppointment(AppointmentDTO appointmentDTO) { Appointment appointment = appointmentDTOMapper.toAppointment(appointmentDTO); appointmentRepository.save(appointment); } public void markAppointmentDeleted(Long appointmentId) { Appointment appointment = appointmentRepository.findById(appointmentId).get(); appointment.setStatus(DELETED); appointmentRepository.save(appointment); } public void recordAllAppointmentsView(String agentNo) { List consultantNotViewAppointments = findByAgentNo(agentNo) .stream() .filter(appointment -> Objects.isNull(appointment.getConsultantViewTime())) .collect(Collectors.toList()); consultantNotViewAppointments.forEach(appointment -> appointment.setConsultantViewTime(Instant.now())); appointmentRepository.saveAll(consultantNotViewAppointments); } public List getConsultantAppointments(String agentNo) { return appointmentCustomerViewRepository.findByAgentNo(agentNo).stream() .filter(appointment -> appointment.getStatus() != DELETED) .map(appointmentCustomerViewMapper::toAppointmentCustomerViewDTO) .collect(Collectors.toList()); } }