package parkup.services; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import parkup.data.Plate; import parkup.data.enumarations.SessionStatus; import parkup.entities.ParkingSession; import parkup.entities.ParkingSpace; import parkup.entities.ParkingZone; import parkup.entities.RegisteredUser; import parkup.repositories.*; import javax.transaction.Transactional; import java.time.Duration; import java.time.LocalDateTime; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @Service public class ParkingSessionService { private final ParkingSessionRepository parkingSessionRepository; private final ParkingZoneRepository parkingZoneRepository; private final ParkingSpaceRepository parkingSpaceRepository; private final RegisteredUserRepository registeredUserRepository; private final PlateRepository plateRepository; @Autowired public ParkingSessionService(ParkingSessionRepository parkingSessionRepository, ParkingZoneRepository parkingZoneRepository, ParkingSpaceRepository parkingSpaceRepository, RegisteredUserRepository registeredUserRepository, PlateRepository plateRepository) { this.parkingSessionRepository = parkingSessionRepository; this.parkingZoneRepository = parkingZoneRepository; this.parkingSpaceRepository = parkingSpaceRepository; this.registeredUserRepository = registeredUserRepository; this.plateRepository = plateRepository; } //TODO add getMethod for paid sessions or all sessions public List getAllParkingSessions() { //Get all sessions that arent paid return parkingSessionRepository.findAll().stream() .filter(s->!s.getStatus().equals(SessionStatus.ENDED_PAID)) .collect(Collectors.toList()); } public List getAllParkingSessionsFromZone(Integer pzId) { //Get all sessions that arent paid return parkingSessionRepository.findAll().stream() .filter(s->!s.getStatus().equals(SessionStatus.ENDED_PAID) && s.getParkingZone().getId()==pzId) .collect(Collectors.toList()); } public ParkingSession findById(int parkingSessionId) { Optional parkingSessionOpt = Optional.ofNullable(parkingSessionRepository.findByPssId(parkingSessionId)); return parkingSessionOpt.orElse(null); } @Transactional public Optional deleteParkingSession(int parkingSessionId) { Optional parkingSessionOpt = Optional.ofNullable(parkingSessionRepository.findByPssId(parkingSessionId)); if (parkingSessionOpt.isPresent()) { if(parkingSessionOpt.get().getStatus()!=SessionStatus.STARTED_UNVERIFIED) parkingSessionOpt.get().getParkingSpace().setTaken(false); parkingSessionOpt.get().setPlate(null); parkingSessionRepository.deleteByPssId(parkingSessionId); return parkingSessionOpt; } else { throw new IllegalStateException("ParkingSpace doesn't exist, therefore can't be deleted"); } } @Transactional public Optional startParkingSession(String tablica, String parkingZoneName) { ParkingZone parkingZone = parkingZoneRepository.findByPzName(parkingZoneName); Plate plate = plateRepository.findByPlate(tablica); if(plate ==null) { plateRepository.save(new Plate(tablica)); } plate = plateRepository.findByPlate(tablica); ParkingSession sessionToAdd = new ParkingSession(plate); sessionToAdd.setParkingZone(parkingZone); parkingSessionRepository.save(sessionToAdd); return Optional.of(sessionToAdd); } // public void executePayment(int id){ // ParkingSession session = parkingSessionRepository.findByPssId(id); // if(session==null){ // throw new IllegalStateException("No such session exists"); // } // else if(session.getStatus()== SessionStatus.ENDED_UNPAID){ // throw new IllegalStateException("Cannot execute payment on an ended session"); // } // session.setStatus(SessionStatus.ENDED_PAID); // } public int calculatePayment(int id){ ParkingSession session = parkingSessionRepository.findByPssId(id); if(session==null){ throw new IllegalStateException("No such session exists"); } // else if(session.getStatus()!= SessionStatus.ENDED_PAID){ // throw new IllegalStateException("Cannot calculate payment on a paid session"); // } int price = session.getParkingZone().getPrice(); return (int) (Math.ceil(Duration.between(session.getTimeStart(),session.getTimeEnd()).toMinutes()/60.0)*price); } @Transactional public ParkingSession verifyParkingSession(int id,String parkingSpaceName){ ParkingSession parkingSession = parkingSessionRepository.findByPssId(id); if(parkingSession==null){ throw new IllegalStateException("No such session exists"); } else if(parkingSession.getStatus()==SessionStatus.STARTED_VERIFIED){ throw new IllegalStateException("The session you are trying to verify has already been verified"); } ParkingZone parkingZone = parkingSession.getParkingZone(); // else if(parkingSession.getStatus()!=SessionStatus.STARTED_) if(!parkingZone.getParkingSpaces().contains(parkingSpaceRepository.findByPsName(parkingSpaceName))){ throw new IllegalStateException("Ivalid parking space inserted. Type in a new parking space or let the admin know that they should add the parking space to this zone"); } if(parkingSpaceRepository.findByPsName(parkingSpaceName).isTaken()){ throw new IllegalStateException("Ivalid parking space inserted. Type in a new parking space, this space is already in a session"); } parkingSession.setStatus(SessionStatus.STARTED_VERIFIED); ParkingSpace parkingSpace = parkingZoneRepository.findByPzId(parkingZone.getId()).getParkingSpaces().stream().filter(ps->ps.getPsName().equals(parkingSpaceName)).findFirst().get(); parkingSpace.setTaken(true); parkingSession.setParkingSpace(parkingSpace); return parkingSession; } @Transactional public ParkingSession endParkingSession(int id){ ParkingSession parkingSession = parkingSessionRepository.findByPssId(id); if(parkingSession==null){ throw new IllegalStateException("No such session exists"); } else if(parkingSession.getStatus()==SessionStatus.ENDED_UNPAID){ throw new IllegalStateException("The session you are trying to end has already been ended"); } parkingSession.setStatus(SessionStatus.ENDED_UNPAID); parkingSession.setTimeEnd(LocalDateTime.now()); return parkingSession; } @Transactional public boolean payParkingSession(int id,String date){ ParkingSession parkingSession = parkingSessionRepository.findByPssId(id); String expMonthString=date.split("/")[0]; String expYearString=date.split("/")[1]; if(expMonthString.startsWith("0")) expMonthString=expMonthString.substring(1); if(expYearString.startsWith("0")) expYearString=expYearString.substring(1); int expMonth=Integer.parseInt(expMonthString); int expYear=Integer.parseInt(expYearString); int month = LocalDateTime.now().getMonth().getValue(); int year = LocalDateTime.now().getYear()%100; if(year>expYear){ throw new IllegalStateException("Your card has expired or the date that you have entered is incorrect"); } else if(year==expYear){ if(month>=expMonth) throw new IllegalStateException("Your card has expired or the date that you have entered is incorrect"); } if(parkingSession==null){ throw new IllegalStateException("No such session exists"); } else if(parkingSession.getStatus()==SessionStatus.ENDED_PAID){ throw new IllegalStateException("The session has already been paid for"); } parkingSession.setStatus(SessionStatus.ENDED_PAID); parkingSession.getParkingSpace().setTaken(false); return true; } public SessionStatus getStatusOfParkirac(int regParkId){ RegisteredUser registeredUser = registeredUserRepository.findByRegParkId(regParkId); List plates =parkingSessionRepository.findAll().stream().filter(ps->registeredUser.getPlates().contains(ps.getPlate())).map(ps->ps.getPlate().getPlate()).collect(Collectors.toList()); if(plates.size()>0) return parkingSessionRepository.findAll().stream().filter(ps->ps.getPlate().getPlate().equals(plates.get(0))).collect(Collectors.toList()).get(0).getStatus(); return null; } }