Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bugfix #80

Open
wants to merge 27 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
c6f3112
Ajout du timezone dans l'URL
Caromarmachi Feb 15, 2023
78bc2c5
Correction du bug dans le prix :
Caromarmachi Feb 15, 2023
f56ca01
Meme correction que pour l'application : ajout du timeZone dans l'UrL
Caromarmachi Feb 15, 2023
fce0846
Gestion de la remise de 5% à partir de la deuxième entrée.
Caromarmachi Mar 7, 2023
bd32e32
Ajout d'une requete pour calculer le nombre de vehicule garé (et non
Caromarmachi Mar 14, 2023
36935b9
Ajout de la methode getCountParkedVehicle (qui appelle la requete qui
Caromarmachi Mar 14, 2023
815252a
(juste suppression d'un espace inutile)
Caromarmachi Mar 14, 2023
69b5fa8
- Amélioration du service processIncomingVehicle
Caromarmachi Mar 14, 2023
e5a7ffc
- Ajout de la gestion des 30mn gratuites
Caromarmachi Mar 14, 2023
0aa0920
- Application de la règle des 30mn et des 5% aux BIKE (avait uniquement
Caromarmachi Mar 14, 2023
fe9cde2
- Modification de presque tous les tests existants pour prise en compte
Caromarmachi Mar 14, 2023
8d835a7
- ajout du test calculateFareBikeWithLessThan30MinutesParkingTime
Caromarmachi Mar 14, 2023
c1b81d1
- ajout du test calculateFareCarWithLessThan30MinutesParkingTime idem
Caromarmachi Mar 14, 2023
f0b452d
Correction calcul des 30mn en moins dans le prix
Caromarmachi Mar 14, 2023
835d191
- Ajout des tests ParkingDatabaseIT (vérification de création en base)
Caromarmachi Mar 14, 2023
3a8b275
Ajout du test : calculateFareWithBadType
Caromarmachi Mar 21, 2023
69fa667
- Ajout du test testEqualityParking, qui teste la methode equals de
Caromarmachi Mar 21, 2023
f26390e
- ajout du test testParkingACarTwice (qui test le cas d'une arrivee en
Caromarmachi Mar 21, 2023
009eb1c
- Ajout de la categorie OTHER pour faire un test de type illegal
Caromarmachi Mar 24, 2023
fd11d3f
- Ajout d'une nouvelle méthode calculateFare, prenant en parametre un
Caromarmachi Mar 24, 2023
c08b406
- Petite modification pour l'affichage du message de remise des 5%
Caromarmachi Mar 24, 2023
e55defa
- Ajout du test de remise des 5% (voiture) testParking5PercentCAR
Caromarmachi Mar 24, 2023
5f50363
- juste amélioration des commentaire dans le code et suppression de
Caromarmachi Mar 24, 2023
fdb411a
- amélioration des commentaires
Caromarmachi Mar 24, 2023
1b49628
- Juste amélioration des commentaires dans le code.
Caromarmachi Mar 24, 2023
4f350d4
- Ajout des commentaires JavaDoc
Caromarmachi Mar 24, 2023
ff93c6e
Envoie des corrections sur GitHub
Caromarmachi Mar 27, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 45 additions & 14 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,20 +10,18 @@

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>

<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.12.1</version>
<version>2.19.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.12.1</version>
<version>2.19.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
Expand All @@ -33,36 +31,44 @@
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.3.2</version>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.3.2</version>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>2.23.4</version>
<version>4.1.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.5</version>
<version>0.8.7</version>
<type>maven-plugin</type>
</dependency>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
<version>3.3.0</version>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
Expand All @@ -81,7 +87,7 @@
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>executable-jar-with-dependencies</descriptorRef>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</execution>
Expand All @@ -90,7 +96,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.21.0</version>
<version>2.22.2</version>
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
Expand All @@ -102,7 +108,7 @@
<excludes>
<exclude>**/*IT.java</exclude>
</excludes>
</configuration>
</configuration>
<executions>
<execution>
<id>integration-test</id>
Expand All @@ -116,6 +122,7 @@
</excludes>
<includes>
<include>**/*IT.java</include>
<include>**/*Test.java</include>
</includes>
</configuration>
</execution>
Expand All @@ -124,7 +131,12 @@
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.5</version>
<version>0.8.7</version>
<configuration>
<excludes>
<exclude>**/InteractiveShell.class</exclude>
</excludes>
</configuration>
<executions>
<execution>
<goals>
Expand All @@ -133,14 +145,33 @@
</execution>
<execution>
<id>jacoco-report</id>
<phase>test</phase>
<phase>verify</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId>
<version>3.9.1</version>
</plugin>
</plugins>
</build>
<reporting>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-report-plugin</artifactId>
<version>2.22.2</version>
</plugin>
<plugin>
<groupId>com.github.spotbugs</groupId>
<artifactId>spotbugs-maven-plugin</artifactId>
<version>4.7.3.0</version>
</plugin>
</plugins>
</reporting>

</project>
4 changes: 4 additions & 0 deletions src/main/java/com/parkit/parkingsystem/App.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

/**
* Classe App point d'entree de l'application
* systeme de paiement de parking automatise *
*/
public class App {
private static final Logger logger = LogManager.getLogger("App");
public static void main(String args[]){
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public Connection getConnection() throws ClassNotFoundException, SQLException {
logger.info("Create DB connection");
Class.forName("com.mysql.cj.jdbc.Driver");
return DriverManager.getConnection(
"jdbc:mysql://localhost:3306/prod","root","rootroot");
"jdbc:mysql://localhost:3306/prod?serverTimezone=UTC","root","rootroot");
}

public void closeConnection(Connection con){
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,15 @@ public class DBConstants {

public static final String GET_NEXT_PARKING_SPOT = "select min(PARKING_NUMBER) from parking where AVAILABLE = true and TYPE = ?";
public static final String UPDATE_PARKING_SPOT = "update parking set available = ? where PARKING_NUMBER = ?";

public static final String SAVE_TICKET = "insert into ticket(PARKING_NUMBER, VEHICLE_REG_NUMBER, PRICE, IN_TIME, OUT_TIME) values(?,?,?,?,?)";
public static final String UPDATE_TICKET = "update ticket set PRICE=?, OUT_TIME=? where ID=?";
public static final String GET_TICKET = "select t.PARKING_NUMBER, t.ID, t.PRICE, t.IN_TIME, t.OUT_TIME, p.TYPE from ticket t,parking p where p.parking_number = t.parking_number and t.VEHICLE_REG_NUMBER=? order by t.IN_TIME limit 1";
public static final String GET_TICKET = "select t.PARKING_NUMBER, t.ID, t.PRICE, t.IN_TIME, t.OUT_TIME, p.TYPE from ticket t,parking p where p.parking_number = t.parking_number and t.VEHICLE_REG_NUMBER=? AND t.OUT_TIME is NULL order by t.IN_TIME limit 1";
public static final String GET_TICKET_WITH_OUT_TIME = "select t.PARKING_NUMBER, t.ID, t.PRICE, t.IN_TIME, t.OUT_TIME, p.TYPE from ticket t,parking p where p.parking_number = t.parking_number and t.VEHICLE_REG_NUMBER=? order by t.IN_TIME limit 1";


// nouvelle requete pour compter le nombre de ligne de meme VEHICLE_REG_NUMBER
public static final String COUNT_PREVIOUS_OCCURENCE = "select count(VEHICLE_REG_NUMBER) from ticket where VEHICLE_REG_NUMBER = ?";
public static final String COUNT_PARKED_VEHICLE = "select count(VEHICLE_REG_NUMBER) from ticket where VEHICLE_REG_NUMBER = ? AND OUT_TIME is null";


}
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,6 @@

public enum ParkingType {
CAR,
BIKE
BIKE,
OTHER
}
72 changes: 72 additions & 0 deletions src/main/java/com/parkit/parkingsystem/dao/TicketDAO.java
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,35 @@ public Ticket getTicket(String vehicleRegNumber) {
return ticket;
}
}

public Ticket getTicketWithOutTime(String vehicleRegNumber) {
Connection con = null;
Ticket ticket = null;
try {
con = dataBaseConfig.getConnection();
PreparedStatement ps = con.prepareStatement(DBConstants.GET_TICKET_WITH_OUT_TIME);
//ID, PARKING_NUMBER, VEHICLE_REG_NUMBER, PRICE, IN_TIME, OUT_TIME)
ps.setString(1,vehicleRegNumber);
ResultSet rs = ps.executeQuery();
if(rs.next()){
ticket = new Ticket();
ParkingSpot parkingSpot = new ParkingSpot(rs.getInt(1), ParkingType.valueOf(rs.getString(6)),false);
ticket.setParkingSpot(parkingSpot);
ticket.setId(rs.getInt(2));
ticket.setVehicleRegNumber(vehicleRegNumber);
ticket.setPrice(rs.getDouble(3));
ticket.setInTime(rs.getTimestamp(4));
ticket.setOutTime(rs.getTimestamp(5));
}
dataBaseConfig.closeResultSet(rs);
dataBaseConfig.closePreparedStatement(ps);
}catch (Exception ex){
logger.error("Error fetching next available slot",ex);
}finally {
dataBaseConfig.closeConnection(con);
return ticket;
}
}

public boolean updateTicket(Ticket ticket) {
Connection con = null;
Expand All @@ -86,4 +115,47 @@ public boolean updateTicket(Ticket ticket) {
}
return false;
}

public int getCountPreviousOccurence(String vehicleRegNumber){
Connection con = null;
int result=-1;
try {
con = dataBaseConfig.getConnection();
PreparedStatement ps = con.prepareStatement(DBConstants.COUNT_PREVIOUS_OCCURENCE);
ps.setString(1, vehicleRegNumber);
ResultSet rs = ps.executeQuery();
if(rs.next()){
result = rs.getInt(1);;
}
dataBaseConfig.closeResultSet(rs);
dataBaseConfig.closePreparedStatement(ps);
}catch (Exception ex){
logger.error("Error fetching next available slot",ex);
}finally {
dataBaseConfig.closeConnection(con);
}
return result;
}


public int getCountParkedVehicle(String vehicleRegNumber){
Connection con = null;
int result=-1;
try {
con = dataBaseConfig.getConnection();
PreparedStatement ps = con.prepareStatement(DBConstants.COUNT_PARKED_VEHICLE);
ps.setString(1, vehicleRegNumber);
ResultSet rs = ps.executeQuery();
if(rs.next()){
result = rs.getInt(1);;
}
dataBaseConfig.closeResultSet(rs);
dataBaseConfig.closePreparedStatement(ps);
}catch (Exception ex){
logger.error("Error fetching next available slot",ex);
}finally {
dataBaseConfig.closeConnection(con);
}
return result;
}
}
Original file line number Diff line number Diff line change
@@ -1,28 +1,62 @@
package com.parkit.parkingsystem.service;

import java.text.DecimalFormat;

import com.parkit.parkingsystem.constants.Fare;
import com.parkit.parkingsystem.dao.TicketDAO;
import com.parkit.parkingsystem.model.Ticket;

/**
* Classe FareCalculatorService, classe de calcul du prix du ticket.
*/
public class FareCalculatorService {

public void calculateFare(Ticket ticket){
TicketDAO ticketDAO = new TicketDAO();
calculateFare(ticket, ticketDAO);
}

public void calculateFare(Ticket ticket, TicketDAO ticketDAO){
if( (ticket.getOutTime() == null) || (ticket.getOutTime().before(ticket.getInTime())) ){
throw new IllegalArgumentException("Out time provided is incorrect:"+ticket.getOutTime().toString());
}

int inHour = ticket.getInTime().getHours();
int outHour = ticket.getOutTime().getHours();
double inHour = ticket.getInTime().getTime(); // temps ecoulé en millisecondes
double outHour = ticket.getOutTime().getTime();// temps ecoulé en millisecondes

double duration = outHour - inHour; // difference en millisecondes
DecimalFormat df = new DecimalFormat("###.##");

//TODO: Some tests are failing here. Need to check if this logic is correct
int duration = outHour - inHour;
duration = duration / 1000.0 / 60.0 / 60.0; // difference en fraction d 'heure
System.out.println("Durée de stationnement réelle : " + df.format(duration) + "h");

duration = duration - 0.50; // On enlève les premières 30 minutes
if (duration <0 ) {
duration = 0;
}
System.out.println("Le stationnement est gratuit pour les 30 premières minutes.");
System.out.println("Durée de stationnement prise encompte : " + df.format(duration) + "h ");

switch (ticket.getParkingSpot().getParkingType()){
case CAR: {
ticket.setPrice(duration * Fare.CAR_RATE_PER_HOUR);
int nbPreviousOccurence = ticketDAO.getCountPreviousOccurence(ticket.getVehicleRegNumber());
if (nbPreviousOccurence>1) {
ticket.setPrice(duration * Fare.CAR_RATE_PER_HOUR * 0.95);
System.out.println("Nous avons également appliqué les 5% de remise!");
} else {
ticket.setPrice(duration * Fare.CAR_RATE_PER_HOUR);
System.out.println("Tarif normal.");
}
break;
}
}
case BIKE: {
ticket.setPrice(duration * Fare.BIKE_RATE_PER_HOUR);
int nbPreviousOccurence = ticketDAO.getCountPreviousOccurence(ticket.getVehicleRegNumber());
if (nbPreviousOccurence>1) {
ticket.setPrice(duration * Fare.BIKE_RATE_PER_HOUR * 0.95);
System.out.println("Nous avons également appliqué les 5% de remise!");
} else {
ticket.setPrice(duration * Fare.BIKE_RATE_PER_HOUR);
System.out.println("Tarif normal.");
}
break;
}
default: throw new IllegalArgumentException("Unkown Parking Type");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

/**
* Classe InteractiveShell, Interface homme-machine. En lançant l’application, l’utilisateur doit sélectionner une action : entrer dans le parking ou en
* sortir ou quitter l’application.
*/
public class InteractiveShell {

private static final Logger logger = LogManager.getLogger("InteractiveShell");
Expand Down Expand Up @@ -47,6 +51,7 @@ private static void loadMenu(){
System.out.println("1 New Vehicle Entering - Allocate Parking Space");
System.out.println("2 Vehicle Exiting - Generate Ticket Price");
System.out.println("3 Shutdown System");

}

}
Loading