diff --git a/src/ParkingLot/Client.java b/src/ParkingLot/Client.java index 319b4e7..abd8457 100644 --- a/src/ParkingLot/Client.java +++ b/src/ParkingLot/Client.java @@ -1,40 +1,66 @@ package ParkingLot; +import ParkingLot.controllers.BillController; +import ParkingLot.controllers.PaymentController; import ParkingLot.controllers.TicketController; +import ParkingLot.dtos.BillRequestDTO; +import ParkingLot.dtos.BillResponseDTO; import ParkingLot.dtos.IssueTicketRequestDTO; -import ParkingLot.models.Gate; +import ParkingLot.dtos.IssueTicketResponseDTO; +import ParkingLot.dtos.PaymentDTO; +import ParkingLot.models.PaymentMode; +import ParkingLot.models.PaymentStatus; import ParkingLot.models.VehicleType; +import ParkingLot.repositories.BillRepository; import ParkingLot.repositories.GateRepository; import ParkingLot.repositories.ParkingLotRepository; +import ParkingLot.repositories.PaymentRepository; import ParkingLot.repositories.TicketRepository; import ParkingLot.repositories.VehicleRepository; +import ParkingLot.service.BillService; +import ParkingLot.service.PaymentService; import ParkingLot.service.TicketService; public class Client { - public static void main(String[] args) { - VehicleRepository vehicleRepository = new VehicleRepository(); - TicketRepository ticketRepository = new TicketRepository(); - ParkingLotRepository parkingLotRepository = new ParkingLotRepository(); - GateRepository gateRepository = new GateRepository(); - - TicketService ticketService = new TicketService( - gateRepository, - vehicleRepository, - parkingLotRepository, - ticketRepository - ); - - TicketController ticketController = new TicketController(ticketService); - - IssueTicketRequestDTO request = new IssueTicketRequestDTO(); - request.setGateId(1); - request.setOwnerName("Mohit"); - request.setVehicleType(VehicleType.AUTO); - request.setVehicleNumber("DL 1VC 0001"); - request.setParkingLotId(1); - - ticketController.issueTicket(request); - } + public static void main(String[] args) { + VehicleRepository vehicleRepository = new VehicleRepository(); + TicketRepository ticketRepository = new TicketRepository(); + ParkingLotRepository parkingLotRepository = new ParkingLotRepository(); + GateRepository gateRepository = new GateRepository(); + + TicketService ticketService = new TicketService(gateRepository, vehicleRepository, parkingLotRepository, + ticketRepository); + + TicketController ticketController = new TicketController(ticketService); + + IssueTicketRequestDTO request1 = new IssueTicketRequestDTO(1, "DL 1VC 0001", "Mohit", VehicleType.BIKE, 1); + IssueTicketRequestDTO request2 = new IssueTicketRequestDTO(1, "OD 33M 0243", "Surajit", VehicleType.BIKE, 1); + IssueTicketResponseDTO ticket1 = ticketController.issueTicket(request1); + IssueTicketResponseDTO ticket2 = ticketController.issueTicket(request2); + System.out.println(ticket1); + System.out.println(ticket2); + BillRepository billRepository = new BillRepository(); + BillService billService = new BillService(billRepository, ticketRepository, gateRepository, + parkingLotRepository); + BillController billController = new BillController(billRepository, ticketRepository, gateRepository, + parkingLotRepository); + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + BillResponseDTO bill = billController.generateBill(new BillRequestDTO(ticket1.getTicketId(), 2, 1)); + System.out.println(bill); + PaymentRepository paymentRepository = new PaymentRepository(); + PaymentService paymentService = new PaymentService(paymentRepository); + PaymentController paymentController = new PaymentController(paymentService); + PaymentStatus status = paymentController + .PaymentProcessing(new PaymentDTO(bill.getAmount() / 2, PaymentMode.CASH)); + System.out.println("Payment " + bill.getAmount() / 2 + " " + status + " via " + PaymentMode.CASH); + status = paymentController.PaymentProcessing(new PaymentDTO(bill.getAmount() / 2, PaymentMode.UPI)); + System.out.println("Payment " + bill.getAmount() / 2 + " " + status + " via " + PaymentMode.UPI); + + } } // Controllers @@ -50,7 +76,7 @@ public static void main(String[] args) { // schema design // code models // code controller - // DTO +// DTO // Issue ticket completion // HW : Generating the bill , check-out \ No newline at end of file diff --git a/src/ParkingLot/adapter/PaymentAdaptor.java b/src/ParkingLot/adapter/PaymentAdaptor.java new file mode 100644 index 0000000..84a5e37 --- /dev/null +++ b/src/ParkingLot/adapter/PaymentAdaptor.java @@ -0,0 +1,8 @@ +package ParkingLot.adapter; + +import ParkingLot.models.Bill; +import ParkingLot.models.PaymentStatus; + +public interface PaymentAdaptor { + PaymentStatus processPayment(Bill bill); +} diff --git a/src/ParkingLot/adapter/RazorPayPaymentAdapter.java b/src/ParkingLot/adapter/RazorPayPaymentAdapter.java new file mode 100644 index 0000000..572abe6 --- /dev/null +++ b/src/ParkingLot/adapter/RazorPayPaymentAdapter.java @@ -0,0 +1,13 @@ +package ParkingLot.adapter; + +import ParkingLot.models.Bill; +import ParkingLot.models.PaymentStatus; + +public class RazorPayPaymentAdapter implements PaymentAdaptor { + + @Override + public PaymentStatus processPayment(Bill bill) { + System.out.println("Payment SUCCESSFUL for bill ID : "+ bill.getId()); + return PaymentStatus.SUCCESS; + } +} diff --git a/src/ParkingLot/controllers/BillController.java b/src/ParkingLot/controllers/BillController.java new file mode 100644 index 0000000..a38dea4 --- /dev/null +++ b/src/ParkingLot/controllers/BillController.java @@ -0,0 +1,30 @@ +package ParkingLot.controllers; + +import java.util.List; + +import ParkingLot.dtos.BillRequestDTO; +import ParkingLot.dtos.BillResponseDTO; +import ParkingLot.dtos.ResponseStatus; +import ParkingLot.models.Bill; +import ParkingLot.repositories.BillRepository; +import ParkingLot.repositories.GateRepository; +import ParkingLot.repositories.ParkingLotRepository; +import ParkingLot.repositories.TicketRepository; +import ParkingLot.service.BillService; +import ParkingLot.service.PaymentService; + +public class BillController { + + BillService billService; + + public BillController(BillRepository billRepository, TicketRepository ticketRepository, + GateRepository gateRepository, ParkingLotRepository parkingLotRepository) { + billService = new BillService(billRepository, ticketRepository, gateRepository, parkingLotRepository); + } + + public BillResponseDTO generateBill(BillRequestDTO billRequest) { + Bill bill = billService.generateBill(billRequest); + return new BillResponseDTO(bill.getId(),billRequest.getTicketId(), ResponseStatus.SUCCESS, bill.getAmount(),bill.getTicket().getEntryTime(), bill.getExitTime()); + } + +} diff --git a/src/ParkingLot/controllers/PaymentController.java b/src/ParkingLot/controllers/PaymentController.java new file mode 100644 index 0000000..32832af --- /dev/null +++ b/src/ParkingLot/controllers/PaymentController.java @@ -0,0 +1,20 @@ +package ParkingLot.controllers; + +import ParkingLot.dtos.PaymentDTO; +import ParkingLot.models.Payment; +import ParkingLot.models.PaymentStatus; +import ParkingLot.service.PaymentService; + +public class PaymentController { + + PaymentService paymentService; + + public PaymentController(PaymentService paymentService) { + this.paymentService = paymentService; + } + + public PaymentStatus PaymentProcessing(PaymentDTO paymentDto) { + Payment p = paymentService.processPayment(paymentDto); + return p.getPaymentStatus(); + } +} diff --git a/src/ParkingLot/controllers/TicketController.java b/src/ParkingLot/controllers/TicketController.java index 4e5b8b2..56998b0 100644 --- a/src/ParkingLot/controllers/TicketController.java +++ b/src/ParkingLot/controllers/TicketController.java @@ -31,6 +31,7 @@ public IssueTicketResponseDTO issueTicket(IssueTicketRequestDTO request){ response.setParkingSlotNumber(ticket.getParkingSlot().getSlotNumber()); response.setResponseStatus(ResponseStatus.SUCCESS); } catch (Exception e){ + e.printStackTrace(); response.setResponseStatus(ResponseStatus.FAILURE); } return response; diff --git a/src/ParkingLot/dtos/BillRequestDTO.java b/src/ParkingLot/dtos/BillRequestDTO.java new file mode 100644 index 0000000..7031886 --- /dev/null +++ b/src/ParkingLot/dtos/BillRequestDTO.java @@ -0,0 +1,33 @@ +package ParkingLot.dtos; + +import java.util.List; + +public class BillRequestDTO { + int ticketId; + int gateId; + int parkingLotId; + public BillRequestDTO(int ticketId, int gateId, int parkingLotId) { + super(); + this.ticketId = ticketId; + this.gateId = gateId; + this.parkingLotId = parkingLotId; + } + public int getTicketId() { + return ticketId; + } + public void setTicketId(int ticketId) { + this.ticketId = ticketId; + } + public int getGateId() { + return gateId; + } + public void setGateId(int gateId) { + this.gateId = gateId; + } + public int getParkingLotId() { + return parkingLotId; + } + public void setParkingLotId(int parkingLotId) { + this.parkingLotId = parkingLotId; + } +} diff --git a/src/ParkingLot/dtos/BillResponseDTO.java b/src/ParkingLot/dtos/BillResponseDTO.java new file mode 100644 index 0000000..c47b5aa --- /dev/null +++ b/src/ParkingLot/dtos/BillResponseDTO.java @@ -0,0 +1,72 @@ +package ParkingLot.dtos; + +import java.util.Date; + +public class BillResponseDTO { + int billId; + int ticketId; + ResponseStatus billStatus; + int amount; + Date entryTime; + Date exitTime; + public BillResponseDTO() { + // TODO Auto-generated constructor stub + } + public BillResponseDTO(int billId,int ticketId, ResponseStatus billStatus, int amount, Date entryTime,Date exitTime) { + super(); + this.billId = billId; + this.ticketId=ticketId; + this.billStatus = billStatus; + this.amount = amount; + this.entryTime=entryTime; + this.exitTime = exitTime; + } + @Override + public String toString() { + return "Bill: [billId=" + billId + ", ticketId=" + ticketId + ", billStatus=" + billStatus + + ", amount=" + amount + ", entryTime=" + entryTime + ", exitTime=" + exitTime + "]"; + } + public int getBillId() { + return billId; + } + public void setBillId(int billId) { + this.billId = billId; + } + public int getTicketId() { + return ticketId; + } + public void setTicketId(int ticketId) { + this.ticketId = ticketId; + } + public ResponseStatus getBillStatus() { + return billStatus; + } + public void setBillStatus(ResponseStatus billStatus) { + this.billStatus = billStatus; + } + public int getAmount() { + return amount; + } + public void setAmount(int amount) { + this.amount = amount; + } + public Date getEntryTime() { + return entryTime; + } + public void setEntryTime(Date entryTime) { + this.entryTime = entryTime; + } + public Date getExitTime() { + return exitTime; + } + public void setExitTime(Date exitTime) { + this.exitTime = exitTime; + } + + + + + + + +} diff --git a/src/ParkingLot/dtos/IssueTicketRequestDTO.java b/src/ParkingLot/dtos/IssueTicketRequestDTO.java index 5812f3f..3975a62 100644 --- a/src/ParkingLot/dtos/IssueTicketRequestDTO.java +++ b/src/ParkingLot/dtos/IssueTicketRequestDTO.java @@ -8,8 +8,21 @@ public class IssueTicketRequestDTO { private String ownerName; private VehicleType vehicleType; private int parkingLotId; + + public IssueTicketRequestDTO() { + } - public int getParkingLotId() { + public IssueTicketRequestDTO(int gateId, String vehicleNumber, String ownerName, VehicleType vehicleType, + int parkingLotId) { + super(); + this.gateId = gateId; + this.vehicleNumber = vehicleNumber; + this.ownerName = ownerName; + this.vehicleType = vehicleType; + this.parkingLotId = parkingLotId; + } + + public int getParkingLotId() { return parkingLotId; } diff --git a/src/ParkingLot/dtos/IssueTicketResponseDTO.java b/src/ParkingLot/dtos/IssueTicketResponseDTO.java index 61cbd16..2992b69 100644 --- a/src/ParkingLot/dtos/IssueTicketResponseDTO.java +++ b/src/ParkingLot/dtos/IssueTicketResponseDTO.java @@ -2,14 +2,14 @@ public class IssueTicketResponseDTO { private int ticketId; - private String parkingSlotNumber; + private int parkingSlotNumber; private ResponseStatus responseStatus; - public String getParkingSlotNumber() { + public int getParkingSlotNumber() { return parkingSlotNumber; } - public void setParkingSlotNumber(String parkingSlotNumber) { + public void setParkingSlotNumber(int parkingSlotNumber) { this.parkingSlotNumber = parkingSlotNumber; } @@ -29,4 +29,12 @@ public void setTicketId(int ticketId) { this.ticketId = ticketId; } + @Override + public String toString() { + return "Ticket: [ticketId=" + ticketId + ", parkingSlotNumber=" + parkingSlotNumber + + ", responseStatus=" + responseStatus + "]"; + } + + + } diff --git a/src/ParkingLot/dtos/PaymentDTO.java b/src/ParkingLot/dtos/PaymentDTO.java new file mode 100644 index 0000000..b5c80f4 --- /dev/null +++ b/src/ParkingLot/dtos/PaymentDTO.java @@ -0,0 +1,32 @@ +package ParkingLot.dtos; + +import ParkingLot.models.PaymentMode; + +public class PaymentDTO { + private int amount; + private PaymentMode mode; + + public PaymentDTO() { + } + + public PaymentDTO(int amount, PaymentMode mode) { + super(); + this.amount = amount; + this.mode = mode; + } + + + public int getAmount() { + return amount; + } + public void setAmount(int amount) { + this.amount = amount; + } + public PaymentMode getMode() { + return mode; + } + public void setMode(PaymentMode mode) { + this.mode = mode; + } + +} diff --git a/src/ParkingLot/models/Bill.java b/src/ParkingLot/models/Bill.java index 95b3a89..3fd4402 100644 --- a/src/ParkingLot/models/Bill.java +++ b/src/ParkingLot/models/Bill.java @@ -1,5 +1,6 @@ package ParkingLot.models; +import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -14,12 +15,21 @@ public class Bill extends BaseModel{ // Cash : 20 , UPI : 30 // AmazonPay : 20 , CC : 50 - + public Date getExitTime() { return exitTime; } - public void setExitTime(Date exitTime) { + public Bill(Ticket ticket ,Gate gate, Operator operator,int amount) { + this.exitTime = new Date(); + this.ticket = ticket; + this.gate = gate; + this.operator = operator; + this.amount=amount; + this.payment = new ArrayList<>(); + } + + public void setExitTime(Date exitTime) { this.exitTime = exitTime; } diff --git a/src/ParkingLot/models/Gate.java b/src/ParkingLot/models/Gate.java index 7b05bd0..4b60024 100644 --- a/src/ParkingLot/models/Gate.java +++ b/src/ParkingLot/models/Gate.java @@ -1,40 +1,55 @@ package ParkingLot.models; -public class Gate extends BaseModel{ - private String gateNumber; - private GateType gateType; - private Operator currentOperator; - private GateStatus gateStatus; - - public String getGateNumber() { - return gateNumber; - } - - public void setGateNumber(String gateNumber) { - this.gateNumber = gateNumber; - } - - public GateType getGateType() { - return gateType; - } - - public void setGateType(GateType gateType) { - this.gateType = gateType; - } - - public Operator getCurrentOperator() { - return currentOperator; - } - - public void setCurrentOperator(Operator currentOperator) { - this.currentOperator = currentOperator; - } - - public GateStatus getGateStatus() { - return gateStatus; - } - - public void setGateStatus(GateStatus gateStatus) { - this.gateStatus = gateStatus; - } +import java.util.Date; + +public class Gate extends BaseModel { + private String gateNumber; + private GateType gateType; + private Operator currentOperator; + private GateStatus gateStatus; + + public Gate() { + } + + public Gate(int id, String gateNumber, GateType gateType, Operator currentOperator, GateStatus gateStatus) { + this.setId(id); + this.setCreatedAt(new Date()); + this.setUpdatedAt(new Date()); + this.gateNumber = gateNumber; + this.gateType = gateType; + this.currentOperator = currentOperator; + this.gateStatus = gateStatus; + } + + public String getGateNumber() { + return gateNumber; + } + + public void setGateNumber(String gateNumber) { + this.gateNumber = gateNumber; + } + + public GateType getGateType() { + return gateType; + } + + public void setGateType(GateType gateType) { + this.gateType = gateType; + } + + public Operator getCurrentOperator() { + return currentOperator; + } + + public void setCurrentOperator(Operator currentOperator) { + this.currentOperator = currentOperator; + } + + public GateStatus getGateStatus() { + return gateStatus; + } + + public void setGateStatus(GateStatus gateStatus) { + this.gateStatus = gateStatus; + } } diff --git a/src/ParkingLot/models/Operator.java b/src/ParkingLot/models/Operator.java index 382f67d..6f5d29b 100644 --- a/src/ParkingLot/models/Operator.java +++ b/src/ParkingLot/models/Operator.java @@ -1,6 +1,36 @@ package ParkingLot.models; -public class Operator extends BaseModel{ - private String Name; - private Gate gate; +import java.util.Date; + +public class Operator extends BaseModel { + private String name; + private Gate gate; + + public Operator() { + // TODO Auto-generated constructor stub + } + + public Operator(int id, String name) { + this.setId(id); + this.setCreatedAt(new Date()); + this.setUpdatedAt(new Date()); + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Gate getGate() { + return gate; + } + + public void setGate(Gate gate) { + this.gate = gate; + } + } diff --git a/src/ParkingLot/models/ParkingFloor.java b/src/ParkingLot/models/ParkingFloor.java index 697ccb9..be3cc18 100644 --- a/src/ParkingLot/models/ParkingFloor.java +++ b/src/ParkingLot/models/ParkingFloor.java @@ -1,7 +1,6 @@ package ParkingLot.models; import java.util.List; -import java.util.Map; public class ParkingFloor extends BaseModel { private String floorName; @@ -9,6 +8,10 @@ public class ParkingFloor extends BaseModel { private ParkingFloorStatus parkingFloorStatus; private List vehicleCapacities; + public ParkingFloor() { + parkingFloorStatus=ParkingFloorStatus.OPEN; + parkingSlots=List.of(new ParkingSlot(1,1,ParkingSlotStatus.EMPTY,VehicleType.BIKE),new ParkingSlot(2,2,ParkingSlotStatus.EMPTY,VehicleType.BIKE),new ParkingSlot(3,3,ParkingSlotStatus.EMPTY,VehicleType.BIKE)); + } public String getFloorName() { return floorName; } diff --git a/src/ParkingLot/models/ParkingLot.java b/src/ParkingLot/models/ParkingLot.java index 59412e6..eabe4d4 100644 --- a/src/ParkingLot/models/ParkingLot.java +++ b/src/ParkingLot/models/ParkingLot.java @@ -4,6 +4,9 @@ import java.util.List; import java.util.Map; +import ParkingLot.strategies.HourlyPriceCalculatorStrategy; +import ParkingLot.strategies.PriceCalculatorStrategy; + public class ParkingLot extends BaseModel{ private String name; private List parkingFloors; @@ -13,19 +16,19 @@ public class ParkingLot extends BaseModel{ private List vehicleCapacities; private ParkingLotStatus parkingLotStatus; private SlotAssignmentStrategyType slotAssignmentStrategyType; + private PriceCalculatorStrategy priceCalculatorStrategy; // you can create a separate class of address // private String address; public ParkingLot(){ - parkingFloors = new ArrayList(); - parkingFloors.add(new ParkingFloor()); + parkingFloors = List.of(new ParkingFloor()); name = "New Parking Lot"; - entryGates = new ArrayList<>(); - entryGates.add(new Gate()); - exitGates = new ArrayList<>(); + entryGates=new ArrayList<>(); + exitGates=new ArrayList<>(); vehicleCapacities = new ArrayList<>(); parkingLotStatus = ParkingLotStatus.OPEN; slotAssignmentStrategyType = SlotAssignmentStrategyType.RANDOM; + priceCalculatorStrategy=new HourlyPriceCalculatorStrategy(); } public SlotAssignmentStrategyType getSlotAssignmentStrategyType() { @@ -83,6 +86,15 @@ public ParkingLotStatus getParkingLotStatus() { public void setParkingLotStatus(ParkingLotStatus parkingLotStatus) { this.parkingLotStatus = parkingLotStatus; } + + public PriceCalculatorStrategy getPriceCalculatorStrategy() { + return priceCalculatorStrategy; + } + + public void setPriceCalculatorStrategy(PriceCalculatorStrategy priceCalculatorStrategy) { + this.priceCalculatorStrategy = priceCalculatorStrategy; + } + } // all the classes are going to have some common diff --git a/src/ParkingLot/models/ParkingSlot.java b/src/ParkingLot/models/ParkingSlot.java index 423e6b6..1f08152 100644 --- a/src/ParkingLot/models/ParkingSlot.java +++ b/src/ParkingLot/models/ParkingSlot.java @@ -1,40 +1,54 @@ package ParkingLot.models; +import java.util.Date; + public class ParkingSlot extends BaseModel { - private String slotNumber; - private ParkingSlotStatus parkingSlotStatus; - private VehicleType vehicleType; - private ParkingFloor parkingFloor; - - public ParkingFloor getParkingFloor() { - return parkingFloor; - } - - public void setParkingFloor(ParkingFloor parkingFloor) { - this.parkingFloor = parkingFloor; - } - - public String getSlotNumber() { - return slotNumber; - } - - public void setSlotNumber(String slotNumber) { - this.slotNumber = slotNumber; - } - - public ParkingSlotStatus getParkingSlotStatus() { - return parkingSlotStatus; - } - - public void setParkingSlotStatus(ParkingSlotStatus parkingSlotStatus) { - this.parkingSlotStatus = parkingSlotStatus; - } - - public VehicleType getVehicleType() { - return vehicleType; - } - - public void setVehicleType(VehicleType vehicleType) { - this.vehicleType = vehicleType; - } + private int slotNumber; + private ParkingSlotStatus parkingSlotStatus; + private VehicleType vehicleType; + private ParkingFloor parkingFloor; + + public ParkingSlot() { + } + + public ParkingSlot(int id, int slotNumber, ParkingSlotStatus parkingSlotStatus, VehicleType vehicleType) { + this.setId(id); + this.setCreatedAt(new Date()); + this.setUpdatedAt(new Date()); + this.slotNumber = slotNumber; + this.parkingSlotStatus = parkingSlotStatus; + this.vehicleType = vehicleType; + } + + public ParkingFloor getParkingFloor() { + return parkingFloor; + } + + public void setParkingFloor(ParkingFloor parkingFloor) { + this.parkingFloor = parkingFloor; + } + + public int getSlotNumber() { + return slotNumber; + } + + public void setSlotNumber(int slotNumber) { + this.slotNumber = slotNumber; + } + + public ParkingSlotStatus getParkingSlotStatus() { + return parkingSlotStatus; + } + + public void setParkingSlotStatus(ParkingSlotStatus parkingSlotStatus) { + this.parkingSlotStatus = parkingSlotStatus; + } + + public VehicleType getVehicleType() { + return vehicleType; + } + + public void setVehicleType(VehicleType vehicleType) { + this.vehicleType = vehicleType; + } } diff --git a/src/ParkingLot/models/Payment.java b/src/ParkingLot/models/Payment.java index a225e9c..273ab43 100644 --- a/src/ParkingLot/models/Payment.java +++ b/src/ParkingLot/models/Payment.java @@ -8,12 +8,25 @@ public class Payment extends BaseModel{ private String refNumber; private Date paymentDate; private PaymentStatus paymentStatus; + public int getAmount() { return amount; } + + - public void setAmount(int amount) { + public Payment(int amount, PaymentMode paymentMode, String refNumber, Date paymentDate) { + super(); + this.amount = amount; + this.paymentMode = paymentMode; + this.refNumber = refNumber; + this.paymentDate = paymentDate; + } + + + + public void setAmount(int amount) { this.amount = amount; } diff --git a/src/ParkingLot/models/Vehicle.java b/src/ParkingLot/models/Vehicle.java index 208eb0f..19f12d3 100644 --- a/src/ParkingLot/models/Vehicle.java +++ b/src/ParkingLot/models/Vehicle.java @@ -5,6 +5,9 @@ public class Vehicle extends BaseModel{ private String ownerName; private VehicleType vehicleType; + public Vehicle(){ + + } public String getLicensePlate() { return licensePlate; } diff --git a/src/ParkingLot/repositories/BillRepository.java b/src/ParkingLot/repositories/BillRepository.java new file mode 100644 index 0000000..06b566d --- /dev/null +++ b/src/ParkingLot/repositories/BillRepository.java @@ -0,0 +1,20 @@ +package ParkingLot.repositories; + +import java.util.Map; +import java.util.TreeMap; + +import ParkingLot.models.Bill; + +public class BillRepository { + + private Map bills = new TreeMap<>(); + private int previousId = 0; + + public Bill save(Bill bill) { + previousId += 1; + bill.setId(previousId); + bills.put(bill.getId(), bill); + return bill; + } + +} diff --git a/src/ParkingLot/repositories/GateRepository.java b/src/ParkingLot/repositories/GateRepository.java index 5a401cd..7d91d20 100644 --- a/src/ParkingLot/repositories/GateRepository.java +++ b/src/ParkingLot/repositories/GateRepository.java @@ -1,13 +1,27 @@ package ParkingLot.repositories; import ParkingLot.models.Gate; +import ParkingLot.models.GateStatus; +import ParkingLot.models.GateType; +import ParkingLot.models.Operator; +import java.util.Map; import java.util.Optional; +import java.util.TreeMap; public class GateRepository { - public Optional findGateById(int gateId){ - return Optional.empty(); - } + Map gates = new TreeMap<>(); + + public GateRepository() { + Gate g1 = new Gate(1, "EN1", GateType.ENTRY, new Operator(1, "Rahul"), GateStatus.OPEN); + Gate g2 = new Gate(2, "EX1", GateType.EXIT, new Operator(2, "Rohit"), GateStatus.OPEN); + gates.put(1, g1); + gates.put(2, g2); + } + + public Optional findGateById(int gateId) { + return Optional.of(gates.get(gateId)); + } } // ORM // 'select * from gate where id = 5'; diff --git a/src/ParkingLot/repositories/ParkingLotRepository.java b/src/ParkingLot/repositories/ParkingLotRepository.java index 8c3f378..8bdce18 100644 --- a/src/ParkingLot/repositories/ParkingLotRepository.java +++ b/src/ParkingLot/repositories/ParkingLotRepository.java @@ -1,13 +1,12 @@ package ParkingLot.repositories; -import ParkingLot.models.Gate; -import ParkingLot.models.ParkingLot; - -import java.util.ArrayList; import java.util.Map; import java.util.Optional; import java.util.TreeMap; +import ParkingLot.models.Gate; +import ParkingLot.models.ParkingLot; + public class ParkingLotRepository { private Map parkingLots = new TreeMap<>(); diff --git a/src/ParkingLot/repositories/PaymentRepository.java b/src/ParkingLot/repositories/PaymentRepository.java new file mode 100644 index 0000000..39ef598 --- /dev/null +++ b/src/ParkingLot/repositories/PaymentRepository.java @@ -0,0 +1,22 @@ +package ParkingLot.repositories; + +import java.util.Map; +import java.util.TreeMap; + +import ParkingLot.models.Payment; +import ParkingLot.models.PaymentStatus; + +public class PaymentRepository { + + private Map payments = new TreeMap<>(); + private int previousId = 0; + + public Payment save(Payment payment) { + previousId += 1; + payment.setId(previousId); + payments.put(payment.getId(), payment); + payment.setPaymentStatus(PaymentStatus.SUCCESS); + return payment; + } + +} diff --git a/src/ParkingLot/repositories/TicketRepository.java b/src/ParkingLot/repositories/TicketRepository.java index f4fdbf1..59d644f 100644 --- a/src/ParkingLot/repositories/TicketRepository.java +++ b/src/ParkingLot/repositories/TicketRepository.java @@ -1,20 +1,24 @@ package ParkingLot.repositories; -import ParkingLot.models.Ticket; - import java.util.Map; +import java.util.Optional; import java.util.TreeMap; +import ParkingLot.models.Ticket; + public class TicketRepository { - private static Map tickets = new TreeMap<>(); - private static int previousId = 0; - public Ticket save(Ticket ticket){ - // the diff both the objects are the id - previousId += 1; - ticket.setId(previousId); - tickets.put(ticket.getId(), ticket); - return ticket; - } + private static Map tickets = new TreeMap<>(); + private static int previousId = 0; + public Ticket save(Ticket ticket) { + // the diff both the objects are the id + previousId += 1; + ticket.setId(previousId); + tickets.put(ticket.getId(), ticket); + return ticket; + } + public Optional getTicketById(int id) { + return Optional.ofNullable(tickets.get(id)); + } } diff --git a/src/ParkingLot/repositories/VehicleRepository.java b/src/ParkingLot/repositories/VehicleRepository.java index 66090bc..3ec286e 100644 --- a/src/ParkingLot/repositories/VehicleRepository.java +++ b/src/ParkingLot/repositories/VehicleRepository.java @@ -1,17 +1,25 @@ package ParkingLot.repositories; -import ParkingLot.models.Vehicle; - +import java.util.Map; import java.util.Optional; +import java.util.TreeMap; + +import ParkingLot.models.Vehicle; public class VehicleRepository { - public Optional findVehicleByVehicleNumber(String vehicleNumber){ - return Optional.empty(); - } - public Vehicle save(Vehicle vehicle){ - // save this to db - vehicle.setId(1); - return vehicle; - } + private Map vehicles = new TreeMap<>(); + private int idIncrementor = 0; + + public Optional findVehicleByVehicleNumber(String vehicleNumber) { + return Optional.ofNullable(vehicles.get(vehicleNumber)); + } + + public Vehicle save(Vehicle vehicle) { + // save this to db + idIncrementor++; + vehicle.setId(idIncrementor); + vehicles.put(vehicle.getLicensePlate(), vehicle); + return vehicle; + } } diff --git a/src/ParkingLot/service/BillService.java b/src/ParkingLot/service/BillService.java new file mode 100644 index 0000000..7a4b0c2 --- /dev/null +++ b/src/ParkingLot/service/BillService.java @@ -0,0 +1,61 @@ +package ParkingLot.service; + +import java.util.Optional; + +import ParkingLot.dtos.BillRequestDTO; +import ParkingLot.models.Bill; +import ParkingLot.models.Gate; +import ParkingLot.models.GateType; +import ParkingLot.models.ParkingLot; +import ParkingLot.models.Ticket; +import ParkingLot.repositories.BillRepository; +import ParkingLot.repositories.GateRepository; +import ParkingLot.repositories.ParkingLotRepository; +import ParkingLot.repositories.TicketRepository; + +public class BillService { + + BillRepository billRepository; + TicketRepository ticketRepository; + GateRepository gateRepository; + ParkingLotRepository parkingLotRepository; + + public BillService(BillRepository billRepository, TicketRepository ticketRepository, GateRepository gateRepository, + ParkingLotRepository parkingLotRepository) { + super(); + this.billRepository = billRepository; + this.ticketRepository = ticketRepository; + this.gateRepository = gateRepository; + this.parkingLotRepository = parkingLotRepository; + } + + public Bill generateBill(BillRequestDTO billDto) { + Optional tOptional = ticketRepository.getTicketById(billDto.getTicketId()); + if (tOptional.isEmpty()) { + throw new RuntimeException("Ticket Not found in Repo.."); + } + Ticket ticket = tOptional.get(); + + Optional gOptional = gateRepository.findGateById(billDto.getGateId()); + if (gOptional.isEmpty()) { + throw new RuntimeException("Gate Not found in Repo.."); + } + Gate gate = gOptional.get(); + if (!gate.getGateType().equals(GateType.EXIT)) { + throw new RuntimeException("This is not exit Gate.."); + } + int amount = getBillAmount(ticket, billDto.getParkingLotId()); + Bill bill = new Bill(ticket, gate, gate.getCurrentOperator(), amount); + return billRepository.save(bill); + } + + private int getBillAmount(Ticket ticket, int parkingLotId) { + Optional parkingLotOptional = parkingLotRepository.findParkingLotById(parkingLotId); + if (parkingLotOptional.isEmpty()) { + throw new RuntimeException("Parking Lot not found"); + } + ParkingLot parkingLot = parkingLotOptional.get(); + return parkingLot.getPriceCalculatorStrategy().calculatePrice(ticket); + } + +} diff --git a/src/ParkingLot/service/PaymentService.java b/src/ParkingLot/service/PaymentService.java new file mode 100644 index 0000000..023a084 --- /dev/null +++ b/src/ParkingLot/service/PaymentService.java @@ -0,0 +1,20 @@ +package ParkingLot.service; + +import java.util.Date; +import java.util.UUID; + +import ParkingLot.dtos.PaymentDTO; +import ParkingLot.models.Payment; +import ParkingLot.repositories.PaymentRepository; + +public class PaymentService { + PaymentRepository paymentRepository; + public PaymentService(PaymentRepository paymentRepository) { + this.paymentRepository=paymentRepository; + } + + public Payment processPayment(PaymentDTO payment) { + return paymentRepository.save(new Payment(payment.getAmount(),payment.getMode(),UUID.randomUUID().toString(),new Date())); + } + +} diff --git a/src/ParkingLot/service/TicketService.java b/src/ParkingLot/service/TicketService.java index 54b5a22..e17da65 100644 --- a/src/ParkingLot/service/TicketService.java +++ b/src/ParkingLot/service/TicketService.java @@ -1,16 +1,22 @@ package ParkingLot.service; -import ExceptionHandling.D; -import ParkingLot.models.*; +import java.util.Date; +import java.util.Optional; + +import ParkingLot.models.Gate; +import ParkingLot.models.GateType; +import ParkingLot.models.ParkingLot; +import ParkingLot.models.ParkingSlot; +import ParkingLot.models.ParkingSlotStatus; +import ParkingLot.models.Ticket; +import ParkingLot.models.Vehicle; +import ParkingLot.models.VehicleType; import ParkingLot.repositories.GateRepository; import ParkingLot.repositories.ParkingLotRepository; import ParkingLot.repositories.TicketRepository; import ParkingLot.repositories.VehicleRepository; import ParkingLot.strategies.SlotAssignmentStrategyFactory; -import java.util.Date; -import java.util.Optional; - public class TicketService { private GateRepository gateRepository; private VehicleRepository vehicleRepository; @@ -44,6 +50,9 @@ public Ticket issueTicket( throw new RuntimeException("Gate not found"); } Gate gate = gateOptional.get(); + if(!gate.getGateType().equals(GateType.ENTRY)) { + throw new RuntimeException("Hello "+ownerName +"! You are at Exit Gate"); + } ticket.setGate(gate); ticket.setOperator(gate.getCurrentOperator()); diff --git a/src/ParkingLot/strategies/HourlyPriceCalculatorStrategy.java b/src/ParkingLot/strategies/HourlyPriceCalculatorStrategy.java new file mode 100644 index 0000000..c14df46 --- /dev/null +++ b/src/ParkingLot/strategies/HourlyPriceCalculatorStrategy.java @@ -0,0 +1,24 @@ +package ParkingLot.strategies; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import ParkingLot.models.Ticket; +import ParkingLot.models.VehicleType; + +public class HourlyPriceCalculatorStrategy implements PriceCalculatorStrategy { + Map priceChart; + + public HourlyPriceCalculatorStrategy() { + priceChart = new HashMap<>(); + priceChart.put(VehicleType.BIKE, 20); + } + + @Override + public int calculatePrice(Ticket ticket) { + long hrs = (new Date().getTime() - ticket.getEntryTime().getTime()) / 36000000; + int pricePerhr = priceChart.get(ticket.getVehicle().getVehicleType()); + return hrs <= 0 ? pricePerhr : (int) hrs * pricePerhr; + } +} diff --git a/src/ParkingLot/strategies/PriceCalculatorStrategy.java b/src/ParkingLot/strategies/PriceCalculatorStrategy.java new file mode 100644 index 0000000..7b75de2 --- /dev/null +++ b/src/ParkingLot/strategies/PriceCalculatorStrategy.java @@ -0,0 +1,8 @@ +package ParkingLot.strategies; + +import ParkingLot.models.Ticket; + +public interface PriceCalculatorStrategy { + + int calculatePrice(Ticket ticket); +}