Skip to content
Extraits de code Groupes Projets
Valider 400bd1a9 rédigé par Mohamed Lemine BAILLAHI's avatar Mohamed Lemine BAILLAHI
Parcourir les fichiers

Merge branch 'feature/MLC-260' into 'develop'

MLC-260/add cancellationReason and creationdate and update contractController

Closes MLC-260

See merge request !5
parents 09b563c0 fe1ef8ce
Branches
Étiquettes
1 requête de fusion!5MLC-260/add cancellationReason and creationdate and update contractController
Affichage de avec 153 ajouts et 20 suppressions
......@@ -2,3 +2,6 @@
- feature/MLC-260 : implement full CRUD operations for contract management
- feature/MLC-256 : Implement CRUD operations for Reservation
- MLC-301/Implement getReservationVehicleAndContractDetails
- MLC-260/add cancellationReason and creationdate and update contractController
- MLC-260/resolve the comment and remove the unnecessary variable creation
- MLC-260/Removing the debug log and change the name from saved to savedContract
......@@ -40,6 +40,11 @@
<artifactId>modelmapper</artifactId>
<version>3.1.1</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.3</version>
</dependency>
</dependencies>
<build>
......
......@@ -5,11 +5,14 @@ import com.marketingconfort.mobiloca.constants.Paths;
import com.marketingconfort.mobiloca.dto.ContractDTO;
import com.marketingconfort.mobiloca.service.ContractService;
import com.marketingconfort.starter.core.exceptions.FunctionalException;
import com.marketingconfort.starter.core.exceptions.S3FunctionalException;
import com.marketingconfort.starter.core.services.S3FileService;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.time.LocalDate;
......@@ -19,6 +22,7 @@ import java.time.LocalDate;
public class ContractController {
private final ContractService contractService;
private final S3FileService s3FileService;
@GetMapping(Paths.CONTRACT_BY_ID)
public ResponseEntity<ContractDTO> getContractById(@PathVariable Long id) throws FunctionalException {
......@@ -37,27 +41,46 @@ public class ContractController {
@RequestParam(required = false) String reservationSearch,
@RequestParam(required = false) String registrationSearch,
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate startDate,
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate endDate
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate endDate,
@RequestParam(required = false) String contractNumber,
@RequestParam(required = false) String client,
@RequestParam(required = false) String vehicule
) throws FunctionalException {
Page<ContractDTO> contracts = contractService.getAllContracts(
page, size, sortBy, sortDirection,
search, statusSearch, reservationSearch,
registrationSearch, startDate, endDate
registrationSearch, startDate, endDate,
contractNumber, client, vehicule
);
return ResponseEntity.ok(contracts);
}
@PostMapping(Paths.UPDATE_CONTRACT_STATUS)
public ResponseEntity<Void> changeContractStatus(
public ResponseEntity<ContractDTO> changeContractStatus(
@PathVariable Long id,
@RequestParam ContractStatus newStatus) throws FunctionalException {
contractService.changeContractStatus(id, newStatus);
return ResponseEntity.ok().build();
@RequestParam ContractStatus status,
@RequestParam(required = false) String cancellationReason
) throws FunctionalException {
if (status == ContractStatus.CANCELED && (cancellationReason == null || cancellationReason.trim().isEmpty())) {
throw new FunctionalException("ERR_CONTRACT_CANCEL_REASON_REQUIRED");
}
ContractDTO updatedContract = contractService.changeContractStatus(id, status, cancellationReason);
return ResponseEntity.ok(updatedContract);
}
@PostMapping("/delete")
public ResponseEntity<Void> deleteContract(@RequestParam Long id) throws FunctionalException {
contractService.deleteContract(id);
return ResponseEntity.noContent().build();
}
@PostMapping
public ResponseEntity<ContractDTO> createContract(@RequestBody ContractDTO contractDTO) throws FunctionalException {
ContractDTO saved = contractService.createContract(contractDTO);
return ResponseEntity.ok(saved);
}
}
......@@ -9,9 +9,8 @@ import lombok.Setter;
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class ClientDTO {
private Long id;
private String firstname;
private String lastname;
private String firstName;
private String lastName;
}
package com.marketingconfort.mobiloca.dto;
import com.marketingconfort.mobiloca.common.Reservation.enums.ContractStatus;
import com.marketingconfort.mobiloca.common.Vehicle.models.Vehicle;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
......@@ -13,10 +14,15 @@ import lombok.Setter;
@NoArgsConstructor
public class ContractDTO {
private Long id;
private String contractNumber;
private SingleReservationDTO reservation;
private VehicleDTO vehicle;
private ClientDTO client;
private ContractStatus status;
private Double depositAmount;
private Double totalAmount;
private String cancellationReason;
private String signedContractUrl;
}
......@@ -15,5 +15,5 @@ public class VehicleDTO {
private String brand;
private String model;
private String registration;
private Double price;
}
......@@ -20,3 +20,4 @@ public class ContractMapper {
return modelMapper.map(dto, Contract.class);
}
}
......@@ -20,10 +20,19 @@ public interface ContractService {
String reservationSearch,
String registrationSearch,
LocalDate startDate,
LocalDate endDate
LocalDate endDate,
String contractNumber,
String client,
String vehicule
) throws FunctionalException;
public void changeContractStatus(Long id, ContractStatus newStatus) throws FunctionalException;
public ContractDTO changeContractStatus(Long id, ContractStatus newStatus, String cancellationReason) throws FunctionalException;
public void deleteContract(Long id) throws FunctionalException;
public ContractDTO createContract(ContractDTO contractDTO) throws FunctionalException;
ContractDTO updateDepositAndActivate(Long id, double depositAmount) throws FunctionalException;
}
package com.marketingconfort.mobiloca.service.impl;
import com.marketingconfort.mobiloca.common.Reservation.enums.ContractStatus;
import com.marketingconfort.mobiloca.common.Vehicle.models.Vehicle;
import com.marketingconfort.mobiloca.constants.Message;
import com.marketingconfort.mobiloca.dto.ClientDTO;
import com.marketingconfort.mobiloca.dto.ContractDTO;
......@@ -61,7 +62,10 @@ public class ContractServiceImpl implements ContractService {
String reservationSearch,
String registrationSearch,
LocalDate startDate,
LocalDate endDate
LocalDate endDate,
String contractNumber,
String client,
String vehicule
) {
Pageable pageable = PageRequest.of(
page,
......@@ -87,7 +91,7 @@ public class ContractServiceImpl implements ContractService {
if (reservationSearch != null && !reservationSearch.isBlank()) {
spec = spec.and((root, query, cb) ->
cb.like(cb.lower(root.get("singleReservation").get("globalReservation").get("reservationNumber")), "%" + reservationSearch.toLowerCase() + "%")
cb.like(cb.lower(root.get("singleReservation").get("reservationNumber")), "%" + reservationSearch.toLowerCase() + "%")
);
}
......@@ -105,10 +109,29 @@ public class ContractServiceImpl implements ContractService {
if (endDate != null) {
spec = spec.and((root, query, cb) ->
cb.lessThanOrEqualTo(root.get("singleReservation").get("pickupDate"), endDate)
cb.lessThanOrEqualTo(root.get("singleReservation").get("returnDate"), endDate)
);
}
if (contractNumber != null && !contractNumber.isBlank()) {
spec = spec.and((root, query, cb) ->
cb.like(cb.lower(root.get("contractNumber")), "%" + contractNumber.toLowerCase() + "%")
);
}
if (vehicule != null && !vehicule.isBlank()) {
spec = spec.and((root, query, cb) ->
cb.like(cb.lower(root.get("singleReservation").get("vehicle").get("model")), "%" + vehicule.toLowerCase() + "%")
);
}
if (client != null && !client.isBlank()) {
spec = spec.and((root, query, cb) -> cb.or(
cb.like(cb.lower(root.get("singleReservation").get("globalReservation").get("firstName")), "%" + client.toLowerCase() + "%"),
cb.like(cb.lower(root.get("singleReservation").get("globalReservation").get("lastName")), "%" + client.toLowerCase() + "%")
));
}
Page<Contract> contractPage = contractRepository.findAll(spec, pageable);
return contractPage.map(contract -> {
......@@ -120,13 +143,13 @@ public class ContractServiceImpl implements ContractService {
if (reservation.getGlobalReservation() != null) {
dto.setTotalAmount(reservation.getGlobalReservation().getTotalAmount());
Long clientId = reservation.getGlobalReservation().getClientId();
dto.setClient(clientService.getClientById(clientId));
}
if (reservation.getVehicleId() != null) {
dto.setVehicle(vehicleService.getVehicleById(reservation.getVehicleId()));
VehicleDTO vehicleDTO = vehicleService.getVehicleById(reservation.getVehicleId());
dto.setVehicle(vehicleDTO);
}
}
......@@ -136,12 +159,34 @@ public class ContractServiceImpl implements ContractService {
@Override
@Transactional
public void changeContractStatus(Long id, ContractStatus newStatus) throws FunctionalException {
public ContractDTO changeContractStatus(Long id, ContractStatus status, String cancellationReason) throws FunctionalException {
Contract contract = contractRepository.findById(id)
.orElseThrow(() -> new FunctionalException(Message.CONTRACT_NOT_FOUND + id));
contract.setStatus(newStatus);
contractRepository.save(contract);
contract.setStatus(status);
contract.setCancellationReason(status.equals(ContractStatus.CANCELED) ? cancellationReason : null);
Contract updatedContract = contractRepository.save(contract);
ContractDTO contractDTO = contractMapper.toDto(updatedContract);
contractDTO.setDepositAmount(updatedContract.getDepositAmount());
if (updatedContract.getSingleReservation() != null) {
var reservation = updatedContract.getSingleReservation();
if (reservation.getGlobalReservation() != null) {
contractDTO.setTotalAmount(reservation.getGlobalReservation().getTotalAmount());
Long clientId = reservation.getGlobalReservation().getClientId();
contractDTO.setClient(clientService.getClientById(clientId));
}
if (reservation.getVehicleId() != null) {
VehicleDTO vehicleDTO = vehicleService.getVehicleById(reservation.getVehicleId());
contractDTO.setVehicle(vehicleDTO);
}
}
return contractDTO;
}
@Override
......@@ -152,4 +197,45 @@ public class ContractServiceImpl implements ContractService {
contractRepository.deleteById(id);
}
@Override
@Transactional
public ContractDTO createContract(ContractDTO dto) {
Contract contract = contractMapper.toEntity(dto);
contract.setDepositAmount(dto.getDepositAmount());
Contract saved = contractRepository.save(contract);
return contractMapper.toDto(saved);
}
@Override
@Transactional
public ContractDTO updateDepositAndActivate(Long id, double depositAmount) throws FunctionalException {
Contract contract = contractRepository.findById(id)
.orElseThrow(() -> new FunctionalException("CONTRACT_NOT_FOUND"));
contract.setDepositAmount(depositAmount);
contract.setStatus(ContractStatus.ACTIVE);
Contract savedContract = contractRepository.save(contract);
ContractDTO dto = contractMapper.toDto(savedContract);
dto.setDepositAmount(savedContract.getDepositAmount());
if (savedContract.getSingleReservation() != null) {
var reservation = savedContract.getSingleReservation();
if (reservation.getGlobalReservation() != null) {
dto.setTotalAmount(reservation.getGlobalReservation().getTotalAmount());
Long clientId = reservation.getGlobalReservation().getClientId();
dto.setClient(clientService.getClientById(clientId));
}
if (reservation.getVehicleId() != null) {
dto.setVehicle(vehicleService.getVehicleById(reservation.getVehicleId()));
}
}
return dto;
}
}
package com.marketingconfort.mobiloca.service.impl;
import com.marketingconfort.mobiloca.common.Vehicle.models.Vehicle;
import com.marketingconfort.mobiloca.dto.VehicleDTO;
import com.marketingconfort.mobiloca.service.VehicleService;
import com.marketingconfort.starter.core.services.MCRestTemplateService;
......
0% ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter