/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package controller.terminal.controller; import controller.terminal.controller.data.ReturnSummary; import controller.terminal.controller.data.RentSummary; import controller.terminal.controller.data.BikeReturnSummary; import java.sql.Timestamp; import java.util.ArrayList; import java.util.HashSet; import java.util.Set; import model.database.BikeMapper; import model.database.BikeUsageMapper; import model.database.NemoUserMapper; import tools.Helper; import model.database.PriceMapper; import model.database.ReturnAmountMapper; import model.database.StorageMapper; import model.database.SubscriptionMapper; import model.object.Bike; import model.object.BikeUsage; import model.object.NemoUser; import model.object.Payment; import model.object.Price; import model.object.ReturnAmount; import model.object.Subscription; /** * * @author Valentin SEITZ */ public class TerminalReturnController { private static TerminalReturnController terminalReturnController; public static TerminalReturnController getTerminalReturnController() { if (terminalReturnController == null) { terminalReturnController = new TerminalReturnController(); } return terminalReturnController; } /** * Know the maximal quantity of bikes which can be returned to the current * terminal * * @return Qunetity of available storages */ public int getMaxAvailableStorages() { int result; StorageMapper sm = new StorageMapper(); result = sm.getAvailableStoragesForTerminal(ProcessedData.getTerminal().getId()); if (result == 0) { doAutoCancel("Aucun emplacement disponible sur ce terminal."); } return result; } /** * Know the serial numbers of all currently rented bikes * * @return The serial numbers of currently rented bikes */ public Set<Integer> getRentedBikeSerialNumbers() { Set<Integer> result = new HashSet<>(); BikeMapper bm = new BikeMapper(); ArrayList<Bike> resultBikes = bm.getRentedBikes(); if (resultBikes.size() > 0) { for (int i = 0; i < resultBikes.size(); ++i) { result.add(resultBikes.get(i).getId()); } } else { doAutoCancel("Aucun vélo n'est en état de location."); } return result; } /** * Return some bike(s) to the terminal * * @param bikeSerialNumbers Set of Serial numbers of the returned bikes */ public void doReturn(Set<Integer> bikeSerialNumbers) { if (VueStateMachine.possibleAction(VueStateMachine.ACTION_DO_RETURN)) { Timestamp today = Helper.getSqlDateNow(); BikeUsageMapper bum = new BikeUsageMapper(); SubscriptionMapper sm = new SubscriptionMapper(); PriceMapper pm = new PriceMapper(); ReturnAmountMapper ram = new ReturnAmountMapper(); NemoUserMapper num = new NemoUserMapper(); ArrayList<NemoUser> nemoUsers = num.getNemoUsersFromBikes(bikeSerialNumbers); if (nemoUsers.size() == 1) { int idNemoUser = nemoUsers.get(0).getId(); ArrayList<Subscription> subscriptions = sm.getSubscriptionsFromNemoUser(idNemoUser); ReturnAmount ra; ArrayList<BikeUsage> bikes; RentSummary rs = new RentSummary(); Price p; ReturnSummary summary = new ReturnSummary(); for (int i = 0; i < subscriptions.size(); i++) { p = pm.GetPriceFromId(subscriptions.get(i).getIdPrice()); bikes = bum.getBikesFromNemoUserAndDateForBikes(subscriptions.get(i).getIdNemoUser(), subscriptions.get(i).getStartDate(), bikeSerialNumbers); rs.setBikeQuantity(1); rs.setDurationUnit(p.getPriceDurationUnit()); rs.setDurationPricePerUnit(p.getAmount()); rs.setDuration(p.getPriceDuration()); ra = new ReturnAmount(); ra.setIdSubscription(subscriptions.get(i).getId()); boolean first = true; int finalDuration = -1; for (int j = 0; j < bikes.size(); j++) { if (first) { Timestamp start = (Timestamp) bikes.get(j).getStartDate(); finalDuration = Helper.getDifference(start, today, p.getPriceDurationUnit()); if (finalDuration < p.getPriceDuration()) { finalDuration = p.getPriceDuration(); } rs.setMultiplier(Helper.divide(finalDuration, p.getPriceDuration())); ra.setReturnDate(today); } BikeReturnSummary brs = new BikeReturnSummary(); brs.setDurationUnit(p.getPriceDurationUnit()); brs.setInitialDuration(p.getPriceDuration()); brs.setInitialAmount(p.getAmount()); brs.setFinalAmount(rs.getRentAmount()); brs.setFinalDuration(finalDuration); brs.setSerialNumber(bikes.get(j).getIdBike()); summary.add(brs); Payment pay = new Payment(); pay.setIdSubscription(subscriptions.get(i).getId()); pay.setPaymentDate(today); pay.setValidated(false); pay.setAmount(rs.getRentAmount() - p.getAmount()); ProcessedData.getPaymentToProcess().add(pay); } rs.setBikeQuantity(bikes.size()); ra.setAmount(rs.getRentAmount()); int newId = ram.save(ra); ProcessedData.getIdReturnAmountToDelete().add(newId); } summary.setGuaranteePerBike(pm.getFirstGuarantee().getAmount()); ProcessedData.setReturnSummary(summary); VueStateMachine.doAction(VueStateMachine.ACTION_DO_RETURN); } else { doAutoCancel("Ces vélos ne sont pas attribué au meme NemoUser."); } } } private void doAutoCancel(String msg) { if (TerminalController.isDoAutoCancel()) { if (TerminalController.isDoAlertBeforeAutoCancel()) { TerminalController.getMainVue().showWarning(msg); } TerminalController.doCancel(); } } }