diff --git a/dao-api/src/main/java/com/epam/brest/dao_api/DriverDtoDao.java b/dao-api/src/main/java/com/epam/brest/dao_api/DriverDtoDao.java index e12f55b..82ed190 100644 --- a/dao-api/src/main/java/com/epam/brest/dao_api/DriverDtoDao.java +++ b/dao-api/src/main/java/com/epam/brest/dao_api/DriverDtoDao.java @@ -2,6 +2,8 @@ import com.epam.brest.model.dto.DriverDto; +import java.sql.Timestamp; +import java.time.Instant; import java.util.List; public interface DriverDtoDao { @@ -13,4 +15,12 @@ public interface DriverDtoDao { */ List findAllDriversWithCountCars(); + + /** + * Get list of driver from date to date Dto. + * + * @return list of driver from date to date Dto. + */ + + List chooseDriverOnDateRange(String fromDate, String toDate); } diff --git a/dao-jdbc/src/main/java/com/epam/brest/dao/DriverDaoJdbcImpl.java b/dao-jdbc/src/main/java/com/epam/brest/dao/DriverDaoJdbcImpl.java index 500ccb2..0272633 100644 --- a/dao-jdbc/src/main/java/com/epam/brest/dao/DriverDaoJdbcImpl.java +++ b/dao-jdbc/src/main/java/com/epam/brest/dao/DriverDaoJdbcImpl.java @@ -72,6 +72,7 @@ public void deleteDriverById(Integer id) { @Override public Integer count() { + log.info("Method count() of class {} started", getClass().getName()); return namedParameterJdbcTemplate.queryForObject(DRIVER_COUNT, new MapSqlParameterSource(), Integer.class); } diff --git a/dao-jdbc/src/main/java/com/epam/brest/dao/Queries.java b/dao-jdbc/src/main/java/com/epam/brest/dao/Queries.java index daab63f..bd62299 100644 --- a/dao-jdbc/src/main/java/com/epam/brest/dao/Queries.java +++ b/dao-jdbc/src/main/java/com/epam/brest/dao/Queries.java @@ -4,12 +4,18 @@ public class Queries { public static final String DRIVER_FIND_ALL = "SELECT * FROM driver"; public static final String DRIVER_FIND_BY_ID = "SELECT * FROM driver WHERE driver_id=:driverId"; - public static final String DRIVER_SAVE = "INSERT INTO driver (name, dateStartWork, salary) VALUES (:driverName, :driverDateStartWork, :driverSalary)"; - public static final String DRIVER_UPDATE_BY_ID = "UPDATE driver SET name=:driverName, dateStartWork=:driverDateStartWork, salary=:driverSalary WHERE driver_id=:driverId"; + public static final String DRIVER_SAVE = + "INSERT INTO driver (name, dateStartWork, salary) VALUES (:driverName, :driverDateStartWork, :driverSalary)"; + public static final String DRIVER_UPDATE_BY_ID = + "UPDATE driver SET name=:driverName, dateStartWork=:driverDateStartWork, salary=:driverSalary WHERE driver_id=:driverId"; public static final String DRIVER_DELETE_BY_ID = "DELETE FROM driver WHERE driver_id=:driverId"; public static final String DRIVER_FIND_ALL_NAME = "SELECT name FROM driver"; public static final String DRIVER_COUNT = "SELECT COUNT(*) FROM driver"; - public static final String DRIVER_COUNT_CAR = "SELECT d.driver_id as driverId, d.name as driverName, d.dateStartWork as driverDateStartWork, d.salary as driverSalary, COUNT(c.car_id) as countOfCarsAssignedToDriver FROM driver d LEFT JOIN car c ON d.driver_id=c.driver_id GROUP BY d.driver_id"; + + public static final String DRIVER_COUNT_CAR = + "SELECT d.driver_id as driverId, d.name as driverName, d.dateStartWork as driverDateStartWork, d.salary as driverSalary, COUNT(c.car_id) as countOfCarsAssignedToDriver FROM driver d LEFT JOIN car c ON d.driver_id=c.driver_id GROUP BY d.driver_id"; + public static final String DRIVER_FIND_DRIVERS_ON_RANGE_DATE = + "SELECT d.driver_id as driverId, d.name as driverName, d.dateStartWork as driverDateStartWork, d.salary as driverSalary FROM driver d WHERE dateStartWork BETWEEN :fromDateChoose AND :toDateChoose"; public static final String CAR_FIND_ALL = "SELECT * FROM car"; public static final String CAR_FIND_BY_ID = "SELECT * FROM car WHERE car_id=:carId"; @@ -17,4 +23,4 @@ public class Queries { public static final String CAR_UPDATE_BY_ID = "UPDATE car SET model=:carModel, driver_id=:driverId WHERE car_id=:carId"; public static final String CAR_DELETE_BY_ID = "DELETE FROM car WHERE car_id=:carId"; public static final String CAR_COUNT = "SELECT count(*) FROM car"; -} +} \ No newline at end of file diff --git a/dao-jdbc/src/main/java/com/epam/brest/dao/dto/DriverDtoDaoJdbcImpl.java b/dao-jdbc/src/main/java/com/epam/brest/dao/dto/DriverDtoDaoJdbcImpl.java index b815151..ecd8db5 100644 --- a/dao-jdbc/src/main/java/com/epam/brest/dao/dto/DriverDtoDaoJdbcImpl.java +++ b/dao-jdbc/src/main/java/com/epam/brest/dao/dto/DriverDtoDaoJdbcImpl.java @@ -1,13 +1,19 @@ package com.epam.brest.dao.dto; import com.epam.brest.dao_api.DriverDtoDao; +import com.epam.brest.model.Driver; import com.epam.brest.model.dto.DriverDto; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import java.sql.Timestamp; +import java.time.Instant; +import java.util.HashMap; import java.util.List; +import java.util.Map; import static com.epam.brest.dao.Queries.DRIVER_COUNT_CAR; +import static com.epam.brest.dao.Queries.DRIVER_FIND_DRIVERS_ON_RANGE_DATE; import static com.epam.brest.logger.ProjectLogger.log; public class DriverDtoDaoJdbcImpl implements DriverDtoDao { @@ -23,4 +29,13 @@ public List findAllDriversWithCountCars() { log.info("Method findAllDriversWithCountCars() of class {} started", getClass().getName()); return namedParameterJdbcTemplate.query(DRIVER_COUNT_CAR, BeanPropertyRowMapper.newInstance(DriverDto.class)); } + + @Override + public List chooseDriverOnDateRange(String fromDate, String toDate) { + log.info("Method chooseDriverOnDateRange() of class {} started", getClass().getName()); + Map params = new HashMap<>(); + params.put("fromDateChoose", fromDate); + params.put("toDateChoose", toDate); + return namedParameterJdbcTemplate.query(DRIVER_FIND_DRIVERS_ON_RANGE_DATE, params, BeanPropertyRowMapper.newInstance(DriverDto.class)); + } } diff --git a/dao-jdbc/src/test/java/com/epam/brest/dao/dto/DriverDtoDaoJdbcImplTestIT.java b/dao-jdbc/src/test/java/com/epam/brest/dao/dto/DriverDtoDaoJdbcImplTestIT.java index b9f70d7..7c584da 100644 --- a/dao-jdbc/src/test/java/com/epam/brest/dao/dto/DriverDtoDaoJdbcImplTestIT.java +++ b/dao-jdbc/src/test/java/com/epam/brest/dao/dto/DriverDtoDaoJdbcImplTestIT.java @@ -9,6 +9,8 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.transaction.annotation.Transactional; +import java.sql.Timestamp; +import java.time.Instant; import java.util.List; import static com.epam.brest.logger.ProjectLogger.log; @@ -34,4 +36,18 @@ void findWithCountCars() { log.info("List of driver Dto was created {}", drivers); assertTrue(drivers.get(0).getCountOfCarsAssignedToDriver() > 0); } + + @Test + void chooseDriverOnDateRange() { + log.info("Method started: chooseDriverOnDateRange() of {}", getClass().getName()); +// Instant fromDate = Instant.parse("1990-01-02T10:10:10.002Z"); +// Instant toDate = Instant.parse("2021-01-02T10:10:10.002Z"); + String fromDate = "1990-01-02T10:10:10.002Z"; + String toDate = "2021-01-02T10:10:10.002Z"; +// Timestamp fromDate = Timestamp.valueOf("1990-01-02 10:10:10.002"); +// Timestamp toDate = Timestamp.valueOf("2021-01-02 10:10:10.002"); + List drivers = driverDtoDaoJdbc.chooseDriverOnDateRange(fromDate, toDate); + assertNotNull(drivers); + log.info("List of driver Dto was created {}", drivers); + } } \ No newline at end of file diff --git a/model/src/main/java/com/epam/brest/model/dto/DriverDto.java b/model/src/main/java/com/epam/brest/model/dto/DriverDto.java index eab0c85..4e75c87 100644 --- a/model/src/main/java/com/epam/brest/model/dto/DriverDto.java +++ b/model/src/main/java/com/epam/brest/model/dto/DriverDto.java @@ -1,6 +1,7 @@ package com.epam.brest.model.dto; import java.math.BigDecimal; +import java.sql.Timestamp; import java.time.Instant; public class DriverDto { @@ -10,6 +11,8 @@ public class DriverDto { private Instant driverDateStartWork; private BigDecimal driverSalary; private Integer countOfCarsAssignedToDriver; + private String fromDateChoose; + private String toDateChoose; public DriverDto() { } @@ -69,6 +72,22 @@ public void setCountOfCarsAssignedToDriver(Integer countOfCarsAssignedToDriver) this.countOfCarsAssignedToDriver = countOfCarsAssignedToDriver; } + public String getFromDateChoose() { + return fromDateChoose; + } + + public void setFromDateChoose(String fromDateChoose) { + this.fromDateChoose = fromDateChoose; + } + + public String getToDateChoose() { + return toDateChoose; + } + + public void setToDateChoose(String toDateChoose) { + this.toDateChoose = toDateChoose; + } + @Override public String toString() { return "DriverDto{" + @@ -77,6 +96,8 @@ public String toString() { ", driverDateStartWork=" + driverDateStartWork + ", driverSalary=" + driverSalary + ", countOfCarsAssignedToDriver=" + countOfCarsAssignedToDriver + + ", fromDateChoose=" + fromDateChoose + + ", toDateChoose=" + toDateChoose + '}'; } } diff --git a/service-api/src/main/java/com/epam/brest/service_api/dto/DriverDtoService.java b/service-api/src/main/java/com/epam/brest/service_api/dto/DriverDtoService.java index 25fbe06..8c0c130 100644 --- a/service-api/src/main/java/com/epam/brest/service_api/dto/DriverDtoService.java +++ b/service-api/src/main/java/com/epam/brest/service_api/dto/DriverDtoService.java @@ -1,7 +1,10 @@ package com.epam.brest.service_api.dto; +import com.epam.brest.model.Driver; import com.epam.brest.model.dto.DriverDto; +import java.sql.Timestamp; +import java.time.Instant; import java.util.List; public interface DriverDtoService { @@ -13,4 +16,14 @@ public interface DriverDtoService { */ List findAllDriverWithCountCars(); + + /** + * Get list of driver from date to date Dto. + * + * @return list of driver from date to date Dto. + */ + + List chooseDriverOnDateRange(String fromDate, String toDate); + + } diff --git a/service/src/main/java/com/epam/brest/service/impl/dto/DriverDtoServiceImpl.java b/service/src/main/java/com/epam/brest/service/impl/dto/DriverDtoServiceImpl.java index 970f004..2271403 100644 --- a/service/src/main/java/com/epam/brest/service/impl/dto/DriverDtoServiceImpl.java +++ b/service/src/main/java/com/epam/brest/service/impl/dto/DriverDtoServiceImpl.java @@ -1,11 +1,14 @@ package com.epam.brest.service.impl.dto; import com.epam.brest.dao_api.DriverDtoDao; +import com.epam.brest.model.Driver; import com.epam.brest.model.dto.DriverDto; import com.epam.brest.service_api.dto.DriverDtoService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.sql.Timestamp; +import java.time.Instant; import java.util.List; @Service @@ -22,4 +25,11 @@ public DriverDtoServiceImpl(DriverDtoDao driverDtoDao) { public List findAllDriverWithCountCars() { return driverDtoDao.findAllDriversWithCountCars(); } + + @Override + public List chooseDriverOnDateRange(String fromDate, String toDate) { + return driverDtoDao.chooseDriverOnDateRange(fromDate, toDate); + } + + } diff --git a/service/src/test/java/com/epam/brest/service/impl/dto/DriverDtoServiceImplTestIT.java b/service/src/test/java/com/epam/brest/service/impl/dto/DriverDtoServiceImplTestIT.java index 1ed72a4..9133b06 100644 --- a/service/src/test/java/com/epam/brest/service/impl/dto/DriverDtoServiceImplTestIT.java +++ b/service/src/test/java/com/epam/brest/service/impl/dto/DriverDtoServiceImplTestIT.java @@ -32,4 +32,14 @@ void findAllDriverWithCountCars() { log.info("Test passed, list driver Dto equals {}", drivers); assertTrue(drivers.get(0).getCountOfCarsAssignedToDriver() > 0); } + + @Test + void chooseDriverOnDateRange() { + log.info("Method started: chooseDriverOnDateRange() of {}", getClass().getName()); + String fromDate = "1990-01-02T10:10:10.002Z"; + String toDate = "2021-01-02T10:10:10.002Z"; + List drivers = driverDtoService.chooseDriverOnDateRange(fromDate, toDate); + assertNotNull(drivers); + log.info("List of driver Dto was created {}", drivers); + } } \ No newline at end of file diff --git a/web-app/src/main/java/com/epam/brest/controller/DriverController.java b/web-app/src/main/java/com/epam/brest/controller/DriverController.java index 2717e1c..f0ae14c 100644 --- a/web-app/src/main/java/com/epam/brest/controller/DriverController.java +++ b/web-app/src/main/java/com/epam/brest/controller/DriverController.java @@ -2,6 +2,7 @@ import com.epam.brest.controller.validator.DriverValidator; import com.epam.brest.model.Driver; +import com.epam.brest.model.dto.DriverDto; import com.epam.brest.service_api.DriverService; import com.epam.brest.service_api.dto.DriverDtoService; import org.springframework.stereotype.Controller; @@ -9,6 +10,10 @@ import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletRequest; +import java.sql.Timestamp; +import java.time.Instant; + import static com.epam.brest.logger.ProjectLogger.log; @Controller @@ -78,4 +83,40 @@ public String deleteDriver(@PathVariable("id") Integer id) { driverService.deleteDriverById(id); return "redirect:/drivers"; } + + @GetMapping("/choose-date-range") + public String showFormForChoseDateRange(@ModelAttribute("driver") DriverDto driverDto) { + log.info("Method showFormForChoseDateRange() started of class {}", getClass().getName()); + return "drivers/choose-date-range"; + } + + @GetMapping("/drivers-range") + public String showDriversListOnRange(@ModelAttribute("driver") DriverDto driverDto, Model model) { + log.info("Method showDriversListOnRange() started of class {}", getClass().getName()); +// Timestamp fromDateTimestamp = Timestamp.valueOf(fromDate); +// Timestamp toDateTimestamp = Timestamp.valueOf(toDate); +// Instant fromDateTime = Instant.parse(fromDate); +// Instant toDateTime = Instant.parse(toDate); + model.addAttribute("driverList", driverDtoService.chooseDriverOnDateRange(driverDto.getFromDateChoose(), driverDto.getToDateChoose())); + return "drivers/drivers-range"; + } + +// @GetMapping("/choose-date-range") +// public String showFormForChoseDateRange() { +// log.info("Method showFormForChoseDateRange() started of class {}", getClass().getName()); +// return "drivers/choose-date-range1"; +// } +// +// @GetMapping("/drivers-range?fromDate={from}&toDate={to}") +// public String showDriversListOnRange(@ModelAttribute("driver") DriverDto driver, HttpServletRequest request, @RequestParam String from, @RequestParam String to, Model model) { +// log.info("Method showDriversListOnRange() started of class {}", getClass().getName()); +//// Timestamp fromDateTimestamp = Timestamp.valueOf(fromDate); +//// Timestamp toDateTimestamp = Timestamp.valueOf(toDate); +//// Instant fromDateTime = Instant.parse(fromDate); +//// Instant toDateTime = Instant.parse(toDate); +// String fromDate = request.getParameter(from); +// String toDate = request.getParameter(to); +// model.addAttribute("driverList", driverDtoService.chooseDriverOnDateRange("1991-01-01T00:00:00.00Z", "2021-10-01T00:00:00.001Z")); +// return "drivers/drivers-range"; +// } } diff --git a/web-app/src/main/webapp/WEB-INF/templates/drivers/choose-date-range.html b/web-app/src/main/webapp/WEB-INF/templates/drivers/choose-date-range.html new file mode 100644 index 0000000..3f8864a --- /dev/null +++ b/web-app/src/main/webapp/WEB-INF/templates/drivers/choose-date-range.html @@ -0,0 +1,24 @@ + + + + + Choose driver from date to date + + +

Form of choose driver from date to date

+
+
+ + + +
+ + +
+ +
+ +
+
+ + \ No newline at end of file diff --git a/web-app/src/main/webapp/WEB-INF/templates/drivers/choose-date-range1.html b/web-app/src/main/webapp/WEB-INF/templates/drivers/choose-date-range1.html new file mode 100644 index 0000000..710ae07 --- /dev/null +++ b/web-app/src/main/webapp/WEB-INF/templates/drivers/choose-date-range1.html @@ -0,0 +1,24 @@ + + + + + Choose driver from date to date + + +

Form of choose driver from date to date

+
+
+ + + +
+ + +
+ +
+ +
+
+ + \ No newline at end of file diff --git a/web-app/src/main/webapp/WEB-INF/templates/drivers/drivers-range.html b/web-app/src/main/webapp/WEB-INF/templates/drivers/drivers-range.html new file mode 100644 index 0000000..0578bbf --- /dev/null +++ b/web-app/src/main/webapp/WEB-INF/templates/drivers/drivers-range.html @@ -0,0 +1,37 @@ + + + + + Drivers from date to date + + +
+

Driver's list from date to date

+
+
+ + + + + + + + + + + + + + + + + + + +
Unique driver's numberDriver nameDate when got jobSalaryCount cars assigned to the driver
+
+
+ +
+Back to menu of drivers + \ No newline at end of file diff --git a/web-app/src/main/webapp/WEB-INF/templates/drivers/drivers.html b/web-app/src/main/webapp/WEB-INF/templates/drivers/drivers.html index 0fb1e3c..b227ff4 100644 --- a/web-app/src/main/webapp/WEB-INF/templates/drivers/drivers.html +++ b/web-app/src/main/webapp/WEB-INF/templates/drivers/drivers.html @@ -10,6 +10,9 @@

Drivers


Add driver
+
diff --git a/web-app/src/test/java/com/epam/brest/controller/DriverControllerTestIT.java b/web-app/src/test/java/com/epam/brest/controller/DriverControllerTestIT.java index 5af3c29..a7df0c0 100644 --- a/web-app/src/test/java/com/epam/brest/controller/DriverControllerTestIT.java +++ b/web-app/src/test/java/com/epam/brest/controller/DriverControllerTestIT.java @@ -1,7 +1,9 @@ package com.epam.brest.controller; import com.epam.brest.model.Driver; +import com.epam.brest.model.dto.DriverDto; import com.epam.brest.service_api.DriverService; +import com.epam.brest.service_api.dto.DriverDtoService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -192,7 +194,7 @@ void shouldShowPageUpdatingDriver() throws Exception { log.info("Method shouldShowPageUpdatingDriver() started of class {}", getClass().getName()); assertNotNull(driverService); List drivers = driverService.findAllDrivers(); - if(drivers.size() == 0) { + if (drivers.size() == 0) { driverService.saveDriver(new Driver("VLADIMIR", Instant.parse("1996-10-10T00:00:00.001Z"), new BigDecimal(840))); drivers = driverService.findAllDrivers(); } @@ -202,8 +204,8 @@ void shouldShowPageUpdatingDriver() throws Exception { assertNotNull(driverSrc); mockMvc.perform( - MockMvcRequestBuilders.get("/drivers/" + driverSrc.getDriverId() + "/update-driver") - .contentType(MediaType.APPLICATION_FORM_URLENCODED) + MockMvcRequestBuilders.get("/drivers/" + driverSrc.getDriverId() + "/update-driver") + .contentType(MediaType.APPLICATION_FORM_URLENCODED) ).andDo(MockMvcResultHandlers.print()) .andExpect(status().isOk()) .andExpect(view().name("drivers/update-driver")); @@ -347,8 +349,8 @@ void shouldDeleteDriver() throws Exception { Driver driver = drivers.get(drivers.size() - 1); mockMvc.perform( - MockMvcRequestBuilders.get("/drivers/" + driver.getDriverId() + "/delete-driver") - ).andDo(MockMvcResultHandlers.print()) + MockMvcRequestBuilders.get("/drivers/" + driver.getDriverId() + "/delete-driver") + ).andDo(MockMvcResultHandlers.print()) .andExpect(status().is3xxRedirection()) .andExpect(view().name("redirect:/drivers")) .andExpect(redirectedUrl("/drivers")); @@ -359,4 +361,36 @@ void shouldDeleteDriver() throws Exception { log.info("First driver's size list minus one: {} equals driver's size list after deleting {}", drivers.size() - 1, driverService.findAllDrivers().size()); } + @Test + void shouldReturnFormForChoosingDriversByDate() throws Exception { + log.info("Method shouldReturnFormForChoosingDriversByDate() started of class {}", getClass().getName()); + assertNotNull(driverService); + + mockMvc.perform( + MockMvcRequestBuilders.get("/drivers/choose-date-range") + .contentType(MediaType.APPLICATION_FORM_URLENCODED) + ).andDo(MockMvcResultHandlers.print()) + .andExpect(status().isOk()) + .andExpect(view().name("drivers/choose-date-range")); + } + + @Test + void shouldDoChooseDriverFromDateToDate() throws Exception { + log.info("Method shouldDoChooseDriverFromDateToDate() started of class {}", getClass().getName()); + assertNotNull(driverService); + List drivers = driverService.findAllDrivers(); + if (drivers.size() == 0) { + driverService.saveDriver(new Driver("PETIA", Instant.parse("2003-05-01T00:00:01.01Z"), new BigDecimal(790))); + drivers = driverService.findAllDrivers(); + } + assertNotNull(drivers); + String fromDate = drivers.get(0).getDriverDateStartWork().toString(); + String toDate = drivers.get(drivers.size() - 1).getDriverDateStartWork().toString(); + + mockMvc.perform( + MockMvcRequestBuilders.get("/drivers/drivers-range") + ).andDo(MockMvcResultHandlers.print()) + .andExpect(status().is2xxSuccessful()) + .andExpect(view().name("drivers/drivers-range")); + } } \ No newline at end of file