Skip to content
Extraits de code Groupes Projets
Valider d2989ba8 rédigé par mohammed echahbouni's avatar mohammed echahbouni
Parcourir les fichiers

add cancellationReason and creationdate and update contractController

parent 09b563c0
Branches
Étiquettes
1 requête de fusion!5MLC-260/add cancellationReason and creationdate and update contractController
Affichage de avec 168 ajouts et 22 suppressions
......@@ -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,62 @@ 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(
@PathVariable Long id,
@RequestParam ContractStatus newStatus) throws FunctionalException {
contractService.changeContractStatus(id, newStatus);
return ResponseEntity.ok().build();
@PostMapping(Paths.UPDATE_CONTRACT_STATUS)
public ResponseEntity<ContractDTO> changeContractStatus(
@PathVariable Long id,
@RequestParam ContractStatus status,
@RequestParam(required = false) String cancellationReason) throws FunctionalException {
if (status.equals(ContractStatus.CANCELED) && (cancellationReason == null || cancellationReason.trim().isEmpty())) {
throw new FunctionalException("Le motif de résiliation est requis pour le statut 'Résilié'.");
}
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 {
System.out.println("Reçu: " + contractDTO);
ContractDTO saved = contractService.createContract(contractDTO);
return ResponseEntity.ok(saved);
}
@PostMapping("/update-deposit/{id}")
public ResponseEntity<ContractDTO> updateDepositAndActivate(
@PathVariable Long id,
@RequestParam double depositAmount
) throws FunctionalException {
ContractDTO updatedContract = contractService.updateDepositAndActivate(id, depositAmount);
return ResponseEntity.ok(updatedContract);
}
@PostMapping("/upload-temp-signed")
public ResponseEntity<String> uploadTempSignedContract(@RequestParam("file") MultipartFile file)
throws S3FunctionalException {
String fileUrl = s3FileService.uploadSingleFile(file);
return ResponseEntity.ok(fileUrl);
}
}
......@@ -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("Contrat non trouvé avec l'ID: " + id));
contract.setDepositAmount(depositAmount);
contract.setStatus(ContractStatus.ACTIVE);
Contract saved = contractRepository.save(contract);
ContractDTO dto = contractMapper.toDto(saved);
dto.setDepositAmount(saved.getDepositAmount());
if (saved.getSingleReservation() != null) {
var reservation = saved.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