<?php
namespace App\Controller\Afd;
use App\Entity\ContractStep;
use App\Entity\Document;
use App\Entity\User;
use App\Repository\AddressRepository;
use App\Repository\DocumentTypeRepository;
use App\Service\Afd\EncryptorService;
use App\Service\Afd\QuoteService;
use DateTime;
use App\Entity\Loan;
use App\Entity\Stage;
use App\Entity\Company;
use App\Entity\Garanty;
use App\Entity\Insurer;
use App\Entity\Contract;
use App\Entity\Criteria;
use App\Entity\QuoteApi;
use App\Entity\Addresses;
use App\Entity\CatSocPro;
use App\Entity\JsonSurvey;
use App\Entity\Differedtype;
use App\Service\Afd\MailService;
use App\Repository\BrokerRepository;
use App\Repository\LoanTypeRepository;
use App\Service\Afd\ContractNumberService;
use Doctrine\ORM\EntityManagerInterface;
use Error;
use Exception;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
class HandleDataController extends AbstractController
{
public function __construct(
BrokerRepository $brokerRepository,
MailService $mailService,
EncryptorService $encryptorService,
DocumentTypeRepository $documentTypeRepository,
LoanTypeRepository $loanTypeRepository,
ContractNumberService $contractNumberService,
QuoteService $quoteService,
AddressRepository $addressRepository,
EntityManagerInterface $em
)
{
$this->brokerRepository = $brokerRepository;
$this->mailService = $mailService;
$this->documentTypeRepository = $documentTypeRepository;
$this->loanTypeRepository = $loanTypeRepository;
$this->contractNumberService = $contractNumberService;
$this->quoteService = $quoteService;
$this->addressRepository = $addressRepository;
$this->encryptorService = $encryptorService;
$this->em = $em;
}
/**
* @Route("/handledata", name="handle_data")
*/
public function index(Request $request): Response
{
$params = $request->getContent();
//ob_start();
//var_dump($params);
//file_put_contents('json', ob_get_clean());
// if (strstr($params, "\"data=\'") != 0)
$params = substr($params, 6, strlen($params) - 7);
$params = json_decode($params);
$dataPhp = $params;
$jsonModified = $dataPhp->jsonModified;
$prets = $jsonModified->quest->PRETS;
$assures = $jsonModified->quest->ASSURES;
$garanties = $jsonModified->quest->GARANTIES;
$contrat = $jsonModified->quest;
$id_produit = $jsonModified->quest->id_produit;
$entityManager = $this->getDoctrine()->getManager();
$getDifferedType = $entityManager->getRepository(Differedtype::class);
$getCompany = $entityManager->getRepository(Company::class);
$getInsurer = $entityManager->getRepository(Insurer::class);
$getCSP = $entityManager->getRepository(CatSocPro::class);
$company = $getCompany->findByName($id_produit);
$contract = new Contract();
if ($jsonModified != null) {
$contract->setJsonModified((array)$jsonModified->quest);
}
//TODO more than 4 quotes send mail
if (count($jsonModified->quest->PRETS) > 4) {
$this->mailService->sendMoreThan4quotes($contract, $jsonModified, json_decode(json_encode($dataPhp), true));
return $this->json([
'message' => 'le contrat a bien été ajouté',
]);
}
$broker = $this->brokerRepository->findAll();
$folderId = ($params->resp->resp->simulation->id_dossier);
//set contract
$contract->setActivationDate(new DateTime($contrat->date_effet))
->setCompany($company[0])
->setBroker($broker[0])
->setFolderId($folderId)
->setJson(json_decode(json_encode($dataPhp), true));
//set quote for this contract (devis)
$quote = new QuoteApi();
$quote->setQuoteNumber((int)$dataPhp->resp->resp->simulation->id_dossier);
$quote->setQuote(json_encode($dataPhp->resp));
$quote->setContractId($contract);
$entityManager->persist($quote);
$countLoan = 0;
$pretIdIfStage = -1;
foreach ($prets as $pretsKeys => $pret) {
$loan = new Loan();
$loanType = $this->loanTypeRepository->find($pret->type);
$differedType = $getDifferedType->findByName($pret->type_differe);
// set each loan
$loan->setNumber($pret->numero)
->setRate($pret->taux ?? 0)
->setTotalDuration($pret->duree_totale)
->setRefundPeriod($pret->period_rembours)
->setDelay($pret->duree_differe ?? null)
->setCreationDate(new DateTime())
->setAmount($pret->capital_emprunte)
->setLoanType($loanType)
->setDifferedType($differedType[0])
->setContract($contract);
foreach ($assures as $assureKeys => $assure) {
// Criteria
$criteria = new Criteria();
$criteria->setSmoker($assure->fumeur)
->setIsmorethan25k($assure->critere1)
->setLiftjob($assure->critere3)
->setHeavyWeightTask($assure->critere2);
$contract->addCriteria($criteria);
//if insurer already exist retrieve object
if (isset($getInsurer->findByEmail($assure->email)[0])) {
$insurer = $getInsurer->findByEmail($assure->email)[0];
$actualAddress = $insurer->getActualAddress();
$futurAddress = $insurer->getActualAddress();
} else {
$insurer = new Insurer();
$actualAddress = new Addresses();
$futurAddress = new Addresses();
}
//retrieve CSP
$catSocPro = $getCSP->findByCode($assure->csp);
$actualAddress->setAddress1($assure->adresse_lgn1)
->setAddress2($assure->adresse_lgn2 ?? null)
->setCity($assure->city ?? null)
->setZipcode((int)$assure->code_postal);
$futurAddress->setAddress1($assure->adresse_futur_lgn1 ?? null)
->setAddress2($assure->adresse_futur_lgn2 ?? null)
->setCity($assure->futur_city ?? null)
->setZipcode(isset($assure->code_postal_futur) ? (int)$assure->code_postal_futur : null);
$assure->civilite == 1 ? $gender = 1 : $gender = 0;
$insurer->setFirstName($assure->prenom)
->setLastname($assure->nom)
->setBirthdate(new DateTime($assure->date_naissance))
->setEmail($assure->email)
->setPhone($assure->tel_domicile)
->setOccupation(isset($assure->profession) ? substr($assure->profession, 0, 44) : null)
// ->setOccupation("test")
->setCreationDate(new DateTime())
->setActualAddress($actualAddress)
->setFuturAddress($futurAddress)
->setReservedProfession((int)$assure->profession_reserve)
->setBirthName(isset($assure->Nom_de_naissance) ? $assures->Nom_de_naissance : null)
->setGender($gender)
->setCatSocPro($catSocPro[0]);
//create Survey(qestionnaire) if it is new insurer
//contract for both insurer
$assureKeys == 0 ? $contract->setAssure1($insurer) : $contract->setAssure2($insurer);
// stock survey(raw questionnaire) for assure1 (principal assure)
if ($assureKeys == 0) {
$survey = new JsonSurvey();
$survey->setContractId($contract);
$dataSurvey = json_encode($dataPhp->json);
$survey->setSurvey($dataSurvey);
$entityManager->persist($survey);
$entityManager->flush();
}
foreach ($garanties as $garantie) {
if (($garantie->numero_assure == ($assureKeys + 1)) && ($garantie->numero_pret == ($pretsKeys + 1))) {
$garanty = new Garanty();
$garanty->setFormule($garantie->formule)
->setDc($garantie->dc_ptia->quotite_dc_ptia)
->setPtia($garantie->dc_ptia->quotite_dc_ptia)
->setItt(isset($garantie->garantie1->quotite1) ? $garantie->garantie1->quotite1 : null)
->setIpt(isset($garantie->garantie1->quotite1) ? $garantie->garantie1->quotite1 : null)
->setIpp(isset($garantie->garantie2->quotite1) ? $garantie->garantie1->quotite1 : null)
->setItp(isset($garantie->garantie2->quotite1) ? $garantie->garantie1->quotite1 : null)
->setFranchiseItt(isset($garantie->garantie1->franchise1) ? $garantie->garantie1->franchise1 : null)
->setFranchiseIpt(isset($garantie->garantie1->franchise1) ? $garantie->garantie1->franchise1 : null)
->setFranchiseIpp(isset($garantie->garantie2->franchise1) ? $garantie->garantie1->franchise1 : null)
->setFranchiseItp(isset($garantie->garantie2->franchise1) ? $garantie->garantie1->franchise1 : null)
->setExtention($garantie->extension1)
//->setAssure($insurer)
->setLoan($loan);
$entityManager->persist($garanty);
$entityManager->flush();
}
}
$entityManager->persist($insurer);
$entityManager->flush();
}
//on loan type2 u got stages(palier)
if (isset($pret->palier[0])) {
$pretIdIfStage = $pretsKeys;
foreach ($pret->palier as $palier) {
$stage = new Stage();
$stage->setAmount((int)$palier->mt_echeance)
->setLength((int)$palier->duree)
->setLoan($loan)
->setRate((int)$palier->taux);
$entityManager->persist($stage);
//TODO check json syntax with stage
//try{
//$this->mailService->sendQuoteWithStages($contract);
//}
//catch(Error $e){
//return new JsonResponse(array("error"=>$e->getMessage()));
// }
}
}
$entityManager->persist($loan);
$entityManager->flush();
$countLoan += 1;
}
if ($countLoan > 4) {
// var_dump($countLoan);
// die;
$this->mailService->sendMoreThan4quotes($contract, $jsonModified, json_decode(json_encode($dataPhp), true));
}
// send quote
$jsonSurvey = json_decode($survey->getSurvey());
if ($jsonSurvey->devis == "false")
$contract->setIsBlock(true);
// set folderId
$entityManager->persist($contract);
$entityManager->flush();
// make quote
$this->quoteService->makeQuote($contract->getIdcontract());
$contractNumber = $this->contractNumberService->getContractNumber($contract);
if ($jsonSurvey->palier == "true") {
$this->mailService->sendQuoteToCustomer($contract, $contractNumber);
// try {
// $this->mailService->sendQuoteWithStages($contract);
// } catch (Exception|TransportExceptionInterface|Error $e) {
// return new JsonResponse(array("error" => $e->getMessage()));
// }
} else if (!isset($jsonSurvey->devis)) {
$this->mailService->sendQuoteToCustomer($contract, $contractNumber);
} else if (isset($jsonSurvey->devis) && $jsonSurvey->devis === "true") {
$this->mailService->sendQuoteToCustomer($contract, $contractNumber);
}
if ((isset($jsonSurvey->question10) && $jsonSurvey->question10 == "Oui") || (isset($jsonSurvey->question11) && $jsonSurvey->question11 == "Oui")) {
$this->mailService->advertiseRiskyInsurerJob($contract, $contractNumber,$jsonSurvey);
}
if ((isset($jsonSurvey->ppe) && $jsonSurvey->ppe == "true") || (isset($jsonSurvey->ppeco) && $jsonSurvey->ppeco == "true")) {
$this->mailService->sendPPE($contract, $contractNumber);
}
if ((isset($jsonSurvey->gel) && $jsonSurvey->gel == "true") || (isset($jsonSurvey->gelco) && $jsonSurvey->gelco == "true")) {
$this->mailService->sendCreditFreeze($contract, $contractNumber);
}
// delete quote encrypted
$quote = $contract->getQuotePdf();
unlink($quote);
$contract->setQuotePdf(null);
$this->em->persist($contract);
// $this->em->flush();
// Link notice doc to insurer and contract
$this->addNoticeTo($contract, $contract->getAssure1());
// Create Contract step for each insurer
$borrowerContractStep = new ContractStep();
$borrowerContractStep->setContract($contract);
$borrowerContractStep->setInsurer($contract->getAssure1());
$borrowerContractStep->setCount(0);
$this->em->persist($borrowerContractStep);
// Create second contract step if there is a co borrower
if ($contract->getAssure2() !== null) {
$this->addNoticeTo($contract, $contract->getAssure2());
$coBorrowerContractStep = new ContractStep();
$coBorrowerContractStep->setContract($contract);
$coBorrowerContractStep->setInsurer($contract->getAssure2());
$coBorrowerContractStep->setCount(0);
$this->em->persist($coBorrowerContractStep);
}
$this->em->flush();
return $this->json([
'message' => 'le contrat a bien été ajouté'
]);
}
// /**
// * @Route("/test/notice", name="test_notice")
// */
public function addNoticeTo(Contract $contract, Insurer $insurer): void
{
// Get document type from db
$documentType = $this->documentTypeRepository->find(23); // 23 === Notice
if ($documentType === null) {
throw new NotFoundHttpException('Document type not found');
}
// Read file from /public/attached_mail/Notice Information_Contrat FFD 1_2021-10-29[65].pdf
$filePath = $this->getParameter('kernel.project_dir') . '/public/attached_mail/Notice Information_Contrat FFD 1_2022-06-07.pdf';
$file = file_get_contents($filePath);
// Name of the file to be saved
$fileName = 'document' . '-' . rand(10, 99) . '-' . uniqid();
// Name of the file when downloaded by the user
$docName = 'Notice_' . $insurer->getFirstName() . '_' . $insurer->getLastName() . '_n°' . $contract->getFolderId();
// Encrypt file and save it in /public/document/
$encryptedFile = $this->encryptorService->encryptor('encrypt', $file);
$this->encryptorService->createFile($fileName, $encryptedFile);
// Create new Document
$document = new Document();
$document->setName($docName);
$document->setFileName($fileName);
$document->setType($documentType);
$document->setExtention('pdf');
$document->setContract($contract);
$document->setInsurer($insurer);
$this->em->persist($document);
}
}