<?php
namespace App\Controller;
use App\Repository\InsuranceRepository;
use Exception;
use Dompdf\Dompdf;
use App\Security\EmailVerifier;
use App\Email\DefaultTemplatedEmail;
use App\Service\YouSign\YousignService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Routing\Annotation\Route;
use Doctrine\Common\Collections\ArrayCollection;
use App\Repository\UserRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\HttpFoundation\{RedirectResponse, Request, Response, StreamedResponse};
use Symfony\Component\Mailer\{Exception\TransportExceptionInterface, MailerInterface};
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use App\Entity\{ComplaintX, Insurance, InsuranceCompany, Item, PaymentMethod, User};
use App\Form\{ComplaintXApprovalType, ComplaintXType, IdentityCardType, RegistrationFormType};
use App\Service\{ComplaintXService, PaymentService, StripePaymentService};
use App\Service\YouSign\Exception\{SignatureRequestCreationErrorException, SignatureRequestErrorException};
use Psr\Log\LoggerInterface;
use App\Entity\Address;
class ExpressComplaintController extends AbstractController
{
#[Route("/express/plainte-contre-x-presentation", name: "express_complaint_x_presentation")]
public function complaintXPresentationAction(Request $request): Response
{
$complaintXApprovalForm = $this->createForm(ComplaintXApprovalType::class);
$complaintXApprovalForm->handleRequest($request);
foreach ($request->getSession()->all() as $key => $value) {
if (str_starts_with($key, 'expressComplaint')) {
$request->getSession()->remove($key);
}
};
if ($complaintXApprovalForm->isSubmitted() && $complaintXApprovalForm->isValid()) {
$session = $request->getSession();
foreach ($request->getSession()->all() as $key => $value) {
if (str_starts_with($key, 'expressComplaint')) {
$request->getSession()->remove($key);
}
};
$formData = $complaintXApprovalForm->getData();
$session->set('removeIdentityFiles', false);
$session->set('expressComplaintYouHasVictim', $formData['youHasVictim']);
$session->set('expressComplaintYourChildrenHasVictim', $formData['yourChildrenHasVictim']);
$session->set('expressComplaintNoWeaponsUsage', true);
$session->set('expressComplaintNoDocumentStolen', true);
$session->set('expressComplaintNoTargetDescription', true);
$session->set('expressComplaintFrenchPhone', true);
$session->set('expressComplaintPresentation', true);
return $this->redirectToRoute('express_complaint_x_params');
}
return $this->render('Complaint/complaintXPresentation.html.twig', [
'complaintXApprovalForm' => $complaintXApprovalForm->createView()
]);
}
#[Route("/express/plainte-contre-x-insuranceCheck/{isInsured?}", name: "express_complaint_x_insurance_check")]
public function insuranceCheckAction(Request $request, $isInsured = null): Response
{
$session = $request->getSession();
$complaintType = $session->get('expressComplaintType');
$complaintCategory = $session->get('expressComplaintCategory');
if (!$complaintType) {
return $this->redirectToRoute('express_complaint_x_params');
}
if (!$complaintCategory) {
return $this->redirectToRoute('express_complaint_x_params', ["type" => $complaintType]);
}
$backUrl = "";
switch ($complaintType) {
case "address":
if ($complaintCategory == "itemDegradation") {
$backUrl = $this->generateUrl('express_complaint_x_resident_type');
} else {
$backUrl = $this->generateUrl('express_complaint_x_steal_breaking');
}
break;
case 'vehicle':
$backUrl = $this->generateUrl(
'express_complaint_x_params',
[
"type" => $complaintType
]
);
break;
default:
$backUrl = $this->generateUrl('express_complaint_x_params');
break;
}
if ($session->get('expressComplaintType') === 'address') {
if ($session->get('expressComplaintCategory') === 'itemDegradation') {
$category = "Dégradation d'un bien immobilier";
} elseif (
$session->get('expressComplaintIsBreakingsFound', false)
&& $session->get('expressComplaintStealVictim', false)
) {
$category = 'Vol avec effractions';
} elseif ($session->get('expressComplaintStealVictim', false)) {
$category = 'Vol sans effraction';
} else {
$category = 'Tentative de vol avec effraction';
}
} else {
$categories = ComplaintX::getCategoriesByFilter([
'breaking' => false,
'stealing' => false,
'type' => $session->get("expressComplaintCategory"),
]);
$category = array_search($session->get('expressComplaintCategory'), $categories);
}
$session->set('expressComplaintCategoryName', $category);
if (
$isInsured === null
&& !in_array($session->get('expressComplaintVehicleOwner'), ['loan', 'rent', 'work', 'service'])
) {
return $this->render(
'ExpressComplaint/insuranceCheck.html.twig',
[
"returnUrl" => $backUrl
]
);
}
$session->set('expressComplaintInsurance', true);
if (
$isInsured === 'yes'
&& !in_array($session->get('expressComplaintVehicleOwner'), ['loan', 'rent', 'work', 'service'])
) {
$session->set('expressComplaintIsInsured', true);
return $this->redirectToRoute('express_complaint_x_want_sinister_declaration');
} else {
$session->set('expressComplaintIsInsured', false);
$session->set('expressComplaintWantSinisterDeclaration', false);
return $this->redirectToRoute('express_complaint_x_prices');
}
}
#[Route(
"/express/plainte-contre-x-want-sinister-declaration/{wantSinisterDeclaration?}",
name: "express_complaint_x_want_sinister_declaration"
)]
public function wantSinisterDeclarationAction(Request $request, $wantSinisterDeclaration = null): Response
{
$session = $request->getSession();
if (is_null($session->get("expressComplaintIsInsured"))) {
return $this->redirectToRoute('express_complaint_x_insurance_check');
}
if ($wantSinisterDeclaration === null) {
return $this->render(
'ExpressComplaint/wantSinisterDeclaration.html.twig',
[
"returnUrl" => $this->generateUrl("express_complaint_x_insurance_check")
]
);
}
if ($wantSinisterDeclaration === 'yes') {
$session->set('expressComplaintWantSinisterDeclaration', true);
} else {
$session->set('expressComplaintWantSinisterDeclaration', false);
}
return $this->redirectToRoute('express_complaint_x_prices');
}
#[Route("/express/plainte-contre-x-prices/{price?}", name: "express_complaint_x_prices")]
public function complaintXPriceAction(
Request $request,
ComplaintXService $complaintXService,
$price = null
): Response {
$session = $request->getSession();
$isInsured = $session->get('expressComplaintIsInsured');
if (is_null($isInsured)) {
return $this->redirectToRoute('express_complaint_x_insurance_check');
}
$offersCatalog = $complaintXService->getOffersCatalog();
$offers = [];
if ($session->get('expressComplaintCategory') == 'vehicleTheftTotal') {
if (
$session->get('expressComplaintIsInsured')
&& $session->get('expressComplaintWantSinisterDeclaration')
) {
$pageTitle = "Sélectionnez la seule formule disponible pour garantir l'horodatage de votre plainte
pour vol de véhicule et de la déclaration de sinistre, avant transmission au procureur de la
république et à la compagnie d'assurance";
$offers["priceSerenityPlus"] = $offersCatalog["priceSerenityPlusVehicle"];
} else {
$pageTitle = "Sélectionnez la seule formule disponible pour garantir l'horodatage de votre plainte
pour vol de véhicule et sa transmission au procureur de la république";
$offers["priceTranquilityPlus"] = $offersCatalog["priceTranquilityPlusVehicle"];
}
} else {
if ($session->get('expressComplaintIsInsured')) {
if ($session->get('expressComplaintWantSinisterDeclaration')) {
$pageTitle = "Cliquez sur l'une de ces formules pour choisir le mode de signature et de
transmission de votre plainte et de la déclaration de sinistre";
$offers["priceSerenity"] = $offersCatalog["priceSerenity"];
$offers["priceSerenityPlus"] = $offersCatalog["priceSerenityPlus"];
} else {
$pageTitle = "Cliquez sur l'une de ces formules pour choisir le mode de signature et de
transmission de votre plainte";
$offers["priceTranquility"] = $offersCatalog["priceTranquility"];
$offers["priceTranquilityPlus"] = $offersCatalog["priceTranquilityPlus"];
}
} else {
$pageTitle = "Cliquez sur l'une de ces formules pour choisir le mode de signature et de transmission
de votre plainte";
$offers["priceTranquility"] = $offersCatalog["priceTranquility"];
$offers["priceTranquilityPlus"] = $offersCatalog["priceTranquilityPlus"];
}
}
if ($price === null) {
if (
$session->get('expressComplaintType') == 'vehicle'
&& in_array($session->get('expressComplaintVehicleOwner'), ['loan', 'rent', 'work', 'service'])
) {
$returnUrl = $this->generateUrl(
'express_complaint_x_params',
[
"type" => 'vehicle'
]
);
} else {
$returnUrl = $this->generateUrl("express_complaint_x_insurance_check");
}
return $this->render(
'ExpressComplaint/prices.html.twig',
[
"pageTitle" => $pageTitle,
"offers" => $offers,
"returnUrl" => $returnUrl
]
);
}
if (!array_key_exists($price, $offers)) {
return $this->redirectToRoute('express_complaint_x_prices');
}
$session->set('expressComplaintPriceAmount', $offers[$price]["price"]);
$session->set('expressComplaintPriceImg', $offers[$price]["price"]);
$session->set('expressComplaintPrice', $price);
if ($request->get('accept', 'yes') === 'no') {
return $this->render('ExpressComplaint/rightsAndObligations.html.twig', compact('price'));
}
return $this->render(
'ExpressComplaint/summary.html.twig',
[
"hasDigitalSignature" => !in_array($session->get('expressComplaintCategory'), ['priceSerenity', 'priceTranquility']),
"returnUrl" => $this->generateUrl("express_complaint_x_prices")
]
);
}
#[Route(
'/express/plainte-contre-x-prices-validation-avant-paiement/{id}',
name: 'express_complaint_x_final_summary'
)]
public function finalSummaryAction(
Request $request,
ComplaintXService $complaintXService,
EntityManagerInterface $em,
ComplaintX $complaintX,
): Response {
$offer = $complaintXService->getOfferCatalog($complaintX->getOfferName() ?? 'priceSerenity');
$returnUrl = $this->generateUrl('express_complaint_x_facts', ['id' => $complaintX->getId()]);
if (
$request->getSession()->get('expressComplaintWantSinisterDeclaration') === true &&
$request->getSession()->get('expressComplaintIsInsured') === true
) {
$returnUrl = $this->generateUrl('express_complaint_x_insurance', ['id' => $complaintX->getId()]);
} else {
$returnUrl = $this->generateUrl('express_complaint_x_prejudice', ['id' => $complaintX->getId()]);
}
/** @var User $user */
$user = $this->getUser();
$originalPhotos = new ArrayCollection();
if ($user->getIdentityCardPhotos()) {
foreach ($user->getIdentityCardPhotos() as $photo) {
$originalPhotos->add($photo);
}
}
$identityCardForm = $this->createForm(IdentityCardType::class, $user, [
'picture_url' => $this->generateUrl(
'asset_display',
['name' => 'identity-card-photo', 'property' => 'photo', 'id' => '_id_']
),
'remove_identity_card_photos' => $request->getSession()->get('removeIdentityFiles') === true,
]);
$identityCardForm->handleRequest($request);
if ($identityCardForm->isSubmitted() && $identityCardForm->isValid()) {
foreach ($identityCardForm['identityCardPhotos']->getData() as $identityCardPhoto) {
$identityCardPhoto->setUser($user);
}
foreach ($originalPhotos as $photo) {
if (false === $user->getIdentityCardPhotos()->contains($photo)) {
$user->getIdentityCardPhotos()->removeElement($photo);
$em->remove($photo);
}
}
$em->flush();
$request->getSession()->remove('removeIdentityFiles');
return $this->redirectToRoute(
'express_complaint_x_payment',
['id' => $complaintX->getId()]
);
}
return $this->render('ExpressComplaint/finalSummary.html.twig', [
'breadcrumbComplaintExpress' => 'paiement',
'progressValue' => 95,
'navbarTitle' => $request->getSession()->get('expressComplaintCategoryName'),
'offer' => $offer,
'returnUrl' => $returnUrl,
'identityCardForm' => $identityCardForm->createView(),
'complaintX' => $complaintX,
]);
}
#[Route("/express/plainte-contre-x-resident-type/{type?}", name: "express_complaint_x_resident_type")]
public function residentTypeAction(Request $request, $type = null): Response
{
$session = $request->getSession();
if (!$session->get("expressComplaintParams")) {
return $this->redirectToRoute('express_complaint_x_params');
}
if ($type === null) {
return $this->render(
'ExpressComplaint/residentType.html.twig',
[
'returnUrl' => $this->generateUrl("express_complaint_x_params", ['type' => 'address']),
]
);
}
$session->set('expressComplaintResidentType', $type);
return $this->redirectToRoute('express_complaint_x_insurance_check');
}
#[Route(
"/express/plainte-contre-x-steal-breaking/{isBreakingsFound?}/{stealVictim?}",
name: "express_complaint_x_steal_breaking"
)]
public function stealBreakingAction(Request $request, $isBreakingsFound = null, $stealVictim = null): Response
{
$session = $request->getSession();
if (!$session->get('expressComplaintParams')) {
return $this->redirectToRoute('express_complaint_x_params');
}
if ($isBreakingsFound === null || $stealVictim === null) {
return $this->render(
'ExpressComplaint/addressBreakingFound.html.twig',
[
'returnUrl' => $this->generateUrl("express_complaint_x_params", ['type' => 'address']),
]
);
}
$session->set('expressComplaintIsBreakingsFound', $isBreakingsFound === 'yes');
$session->set('expressComplaintStealVictim', $stealVictim === 'yes');
return $this->redirectToRoute('express_complaint_x_insurance_check');
}
#[Route("/express/plainte-contre-x-params/{type?}/{category?}", name: "express_complaint_x_params")]
public function paramsAction(Request $request, $type = null, $category = null): Response
{
$session = $request->getSession();
if (!$session->get("expressComplaintPresentation")) {
return $this->redirectToRoute("express_complaint_x_presentation");
}
if ($type === null) {
return $this->render(
'ExpressComplaint/params.html.twig',
[
'returnUrl' => $this->generateUrl("express_complaint_x_presentation"),
]
);
}
if ($category === null) {
$session->set('expressComplaintType', $type);
if ($type === 'simpleTheft' || $type === 'bikeTheft' || $type === 'phoneTheft') {
$session->set('expressComplaintCategory', $type);
$session->set('expressComplaintParams', true);
return $this->redirectToRoute('express_complaint_x_insurance_check');
}
if ($type === 'address') {
return $this->render(
'ExpressComplaint/addressCategory.html.twig',
[
'returnUrl' => $this->generateUrl("express_complaint_x_params"),
]
);
} elseif ($type === 'vehicle') {
return $this->render(
'ExpressComplaint/vehicleOwner.html.twig',
[
'returnUrl' => $this->generateUrl("express_complaint_x_params"),
]
);
}
return $this->render(
'ExpressComplaint/params.html.twig',
[
'returnUrl' => $this->generateUrl("express_complaint_x_presentation"),
]
);
}
if ($type === 'vehicle') {
if (
in_array($category, ['mine', 'partner', 'loan', 'rent', 'work', 'service', 'loancomp'])
&& $request->get('insurance', null) === null
) {
$session->set('expressComplaintVehicleOwner', $category);
return $this->render(
'ExpressComplaint/vehicleCategory.html.twig',
[
'returnUrl' => $this->generateUrl("express_complaint_x_params", ['type' => 'vehicle']),
]
);
} elseif ($request->get('insurance') !== null) {
return $this->render('ExpressComplaint/insuranceInfos.html.twig', compact('category', 'type'));
} else {
$session->set('expressComplaintCategory', $category);
$session->set('expressComplaintParams', true);
return $this->redirectToRoute('express_complaint_x_insurance_check');
}
}
if ($type === 'address') {
$session->set('expressComplaintCategory', $category);
$session->set('expressComplaintParams', true);
if ($category === 'itemDegradation') {
return $this->redirectToRoute('express_complaint_x_resident_type');
} else {
return $this->redirectToRoute('express_complaint_x_steal_breaking');
}
}
}
#[Route("/express/complaint/register", name: "express_complaint_register")]
public function register(
Request $request,
UserRepository $repoUser,
EmailVerifier $emailVerifier,
UserPasswordHasherInterface $passwordHasher,
EntityManagerInterface $entityManager,
): Response {
$session = $request->getSession();
if (!$session->get("expressComplaintPrice")) {
return $this->redirectToRoute("express_complaint_x_prices");
}
if ($this->getUser()) {
return $this->redirectToRoute('express_complaint_x_identity');
}
$email = $session->get("login_register_email");
if (!$email) {
return $this->redirectToRoute('login_register');
}
if ($repoUser->findByEmail($email)) {
return $this->redirectToRoute('login');
}
$breadcrumbExpress = 'express_complaint_login';
$progressValue = 10;
// Otherwise, get the form to create a new account
$user = new User();
$user->setEmail($email);
$form = $this->createForm(RegistrationFormType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// encode the plain password
$user->setPassword(
$passwordHasher->hashPassword(
$user,
$form->get('plainPassword')->getData()
)
);
$entityManager->persist($user);
$entityManager->flush();
// generate a signed url and email it to the user
$emailVerifier->sendEmailConfirmation(
'verify_email',
$user,
(new DefaultTemplatedEmail())
->to($user->getEmail())
->subject('Veuillez confirmer votre e-mail')
->htmlTemplate('Mail/welcome.html.twig')
);
$session->set('expressUser', $user->getId());
$session->set('self_validating_authentication_options', [
'redirect_to' => 'express_complaint_x_identity',
'user_id' => $user->getId()
]);
return $this->redirectToRoute('self_validating_authentication');
}
$session->set("userType", "insc");
return $this->render('ExpressComplaint/register.html.twig', [
'form' => $form->createView(),
'breadcrumbComplaintExpress' => $breadcrumbExpress,
'navbarTitle' => $session->get('expressComplaintCategoryName'),
'progressValue' => $progressValue,
'userType' => "insc",
]);
}
#[Route("/express/plainte-contre-x-prejudice/{id}", name: "express_complaint_x_prejudice")]
public function prejudiceAction(Request $request, EntityManagerInterface $em, ComplaintX $complaintX): Response
{
$user = $this->getUser();
if (is_null($user) || is_null($request->getSession()->get('expressComplaintNoTargetDescription'))) {
return $this->redirectToRoute('express_complaint_x_presentation');
}
$progressValue = 70;
$complaintX->expressStep = 'prejudice';
$breadcrumbExpress = 'prejudice';
$complaintXForm = $this->createForm(ComplaintXType::class, $complaintX);
$complaintXForm->handleRequest($request);
if ($complaintXForm->isSubmitted() && $complaintXForm->isValid()) {
$em->persist($complaintX);
$complaintX->setStep(10);
$em->flush();
if (
$request->getSession()->get('expressComplaintWantSinisterDeclaration') === true &&
$request->getSession()->get('expressComplaintIsInsured') === true
) {
return $this->redirectToRoute('express_complaint_x_insurance', [
'id' => $complaintX->getId()
]);
} elseif ($complaintX->getOfferName() === 'priceSerenityPlus') {
return $this->redirectToRoute('express_complaint_x_final_summary', [
'id' => $complaintX->getId()
]);
} else {
return $this->redirectToRoute('express_complaint_x_payment', [
'id' => $complaintX->getId()
]);
}
}
return $this->render('ExpressComplaint/prejudice.html.twig', [
'banqueNames' => PaymentMethod::getBanks(),
'itemCategories' => Item::getCategories(),
'breadcrumbComplaintExpress' => $breadcrumbExpress,
'progressValue' => $progressValue,
'navbarTitle' => $request->getSession()->get('expressComplaintCategoryName'),
'complaintXForm' => $complaintXForm->createView(),
"complaintX" => $complaintX,
'hasInsurance' => $request->getSession()->get('expressComplaintWantSinisterDeclaration') === true &&
$request->getSession()->get('expressComplaintIsInsured') === true,
]);
}
#[Route('/express/plainte-contre-x-assurance/{id}', name: 'express_complaint_x_insurance')]
public function insuranceAction(InsuranceRepository $repoInsurance, Request $request, EntityManagerInterface $em, ComplaintX $complaintX): Response
{
/** @var User $user */
$user = $this->getUser();
if (is_null($user) || is_null($request->getSession()->get('expressComplaintNoTargetDescription'))) {
return $this->redirectToRoute('express_complaint_x_presentation');
}
$data = [];
$breadcrumbExpress = 'assurance';
$progressValue = 85;
$insuranceId = $request->getSession()->get('expressComplaintInsuranceId');
$insurance = new Insurance();
if ($insuranceId) {
$repoInsurance = $em->getRepository('App\Entity\Insurance');
$insurance = $repoInsurance->findOneBy(['id' => $insuranceId]);
}
$insurance->setUser($user);
$em->persist($insurance);
$repoAddr = $em->getRepository('App\Entity\Address');
$insuranceType = 0;
if (!is_null($insurance->getId()) && is_null($insurance->getInsuranceCompany())) {
if ($insurance->getCategory() === "multiriskMainHouse") {
$insuranceType = -1;
} else {
$insuranceType = -2;
}
}
if ($request->getSession()->get('expressComplaintResidentType') === 'main') {
$insurance->setCategory('multiriskMainHouse');
$insurance->setAddressInsurance($user->getMainAddress());
} elseif ($request->getSession()->get('expressComplaintResidentType') === 'second') {
$insurance->setCategory('multiriskSecondHouse');
$address = $repoAddr->findOneBy(['id' => $request->getSession()->get('expressComplaintSecondAddressId')]);
$insurance->setAddressInsurance($address);
} elseif ($request->getSession()->get('expressComplaintResidentType') === 'room') {
$insurance->setCategory('multiriskOtherLocal');
$address = $repoAddr->findOneBy(['id' => $request->getSession()->get('expressComplaintRoomAddressId')]);
$insurance->setAddressInsurance($address);
} elseif ($request->getSession()->get('expressComplaintType') === 'vehicle') {
$insurance->setCategory('vehicle');
$repoVehicle = $em->getRepository('App\Entity\Vehicle');
$vehicle = $repoVehicle->findOneBy(['id' => $request->getSession()->get('expressComplaintVehicleId')]);
$insurance->setVehicle($vehicle);
} else {
$insurance->setCategory('otherContract');
}
$multiriskMainHouseInsurance = null;
if ($complaintX->getCategory() === "vacancyResidenceBurglary") {
$multiriskMainHouseInsurance = $repoInsurance->getMultiriskMainHouseInsurance($user);
}
$complaintX->expressStep = 'insurance';
$complaintX->setInsurance($insurance);
$complaintXForm = $this->createForm(ComplaintXType::class, $complaintX, [
'photos_picture_url' => $this->generateUrl(
'asset_display',
['name' => 'complaint-x-photo', 'property' => 'picture', 'id' => '_id_']
),
'documents_picture_url' => $this->generateUrl(
'asset_display',
['name' => 'complaint-x-document', 'property' => 'document', 'id' => '_id_']
)
]);
$complaintXForm->handleRequest($request);
if ($complaintXForm->isSubmitted()) {
if ((int)$request->get("cpId") === -1) {
if (is_null($multiriskMainHouseInsurance)) {
throw new \RuntimeException("Assurance domicile principal introuvable");
}
$insurance->setCompanyName($multiriskMainHouseInsurance->getCompanyName());
$insurance->setCompanyEmail($multiriskMainHouseInsurance->getCompanyEmail());
$insurance->setInsuranceCompany($multiriskMainHouseInsurance->getInsuranceCompany());
$insurance->setCategory('multiriskMainHouse');
}
if ($complaintXForm->isValid()) {
$em->persist($complaintX);
$complaintX->setStep(11);
$em->flush();
$request->getSession()->set('expressComplaintInsuranceId', $complaintX->getInsurance()->getId());
if ($complaintX->getOfferName() === 'priceSerenityPlus') {
return $this->redirectToRoute('express_complaint_x_final_summary', [
'id' => $complaintX->getId()
]);
} else {
return $this->redirectToRoute('express_complaint_x_payment', [
'id' => $complaintX->getId()
]);
}
}
}
$data['complaintXForm'] = $complaintXForm->createView();
return $this->render(
'ExpressComplaint/insurance.html.twig',
array_merge($data, [
'breadcrumbComplaintExpress' => $breadcrumbExpress,
'progressValue' => $progressValue,
'user' => $user,
'complaintX' => $complaintX,
'hasMultiriskMainHouseInsurance' => !is_null($multiriskMainHouseInsurance),
'companies' => $em->getRepository(InsuranceCompany::class)
->findBy(['isDeleted' => false]),
"insuranceType" => $insuranceType,
'navbarTitle' => $request->getSession()->get('expressComplaintCategoryName'),
])
);
}
#[Route('/express/plainte-contre-x-paiement/{id}', name: 'express_complaint_x_payment')]
public function paymentAction(
Request $request,
StripePaymentService $stripe,
EntityManagerInterface $entityManager,
PaymentService $srvPayment,
ComplaintX $complaintX,
ComplaintXService $complaintXService,
): Response {
/** @var User $user */
$user = $this->getUser();
if (is_null($user) || is_null($request->getSession()->get('expressComplaintNoTargetDescription'))) {
return $this->redirectToRoute('express_complaint_x_presentation');
}
$complaintX->setStep(12);
$entityManager->persist($complaintX);
$entityManager->flush();
if ($complaintX->hasStatus(ComplaintX::STATUS_PAID)) {
if ($complaintX->hasStatus(ComplaintX::STATUS_DOCUMENT_CHECKED)) {
if ($complaintX->hasStatus(ComplaintX::STATUS_SIGNED) || !$complaintX->isHasDigitalSignature()) {
return $this->redirectToRoute("user_complaint_x_detail", ["id" => $complaintX->getId()]);
}
//todo Redirect signature
}
//todo Redirect verif document
}
$offer = $complaintXService->getOfferCatalog($complaintX->getOfferName() ?? 'priceSerenity');
$amount = $offer['price'] * 100;
$paymentIntent = $srvPayment->createUpdatePaymentIntent($amount, $complaintX);
//Si paiement accepté, page confirmation paiement accepté
if ($complaintX->hasStatus(ComplaintX::STATUS_PAYMENT_ACCEPTED)) {
return $this->redirectToRoute('express_complaint_x_validation', ['id' => $complaintX->getId()]);
}
//Si paiement en cours, page en cours
if (
$complaintX->hasStatus(ComplaintX::STATUS_PAYMENT_PROCESSING)
&& $complaintX->getPaymentIntentStatus() !== "requires_action"
) {
$processing = true;
$methods = null;
} else {
$processing = false;
$methods = $stripe->getCards($user->getStripeCustomerId());
}
// Sinon affichage formulaire paiement
$breadcrumbExpress = 'paiement';
$progressValue = 95;
$returnUrl = $this->generateUrl('express_complaint_x_prejudice', ['id' => $complaintX->getId()]);
if ($complaintX->getOfferName() === 'priceSerenityPlus') {
$returnUrl = $this->generateUrl('express_complaint_x_final_summary', ['id' => $complaintX->getId()]);
}
if ($complaintX->getIsInsured()) {
$returnUrl = $this->generateUrl('express_complaint_x_insurance', ['id' => $complaintX->getId()]);
}
return $this->render('ExpressComplaint/payment.html.twig', [
"processing" => $processing,
"methods" => $methods,
'breadcrumbComplaintExpress' => $breadcrumbExpress,
'progressValue' => $progressValue,
'user' => $user,
'stripePublicKey' => $stripe->getPublicKey(),
'stripePaymentIntent' => $paymentIntent,
'navbarTitle' => $request->getSession()->get('expressComplaintCategoryName'),
'complaintX' => $complaintX,
'offer' => $offer,
'returnUrl' => $returnUrl,
]);
}
#[Route("/express/plainte-contre-x-validation/{id}", name: "express_complaint_x_validation")]
public function validationAction(
EntityManagerInterface $entityManager,
Request $request,
EntityManagerInterface $em,
MailerInterface $mailer,
ComplaintXService $complaintXService,
ComplaintX $complaintX,
string $generatedDir
): RedirectResponse {
/** @var User $user */
$user = $this->getUser();
if (is_null($user)) {
return $this->redirectToRoute('express_complaint_x_presentation');
}
$complaintX->setStep(13);
$entityManager->persist($complaintX);
$entityManager->flush();
if (!$complaintX->hasStatus(ComplaintX::STATUS_PAYMENT_ACCEPTED)) {
return $this->redirectToRoute("user_complaint_x_detail", ["id" => $complaintX->getId()]);
}
$ref = $group = '';
$data = [
"complaintX" => $complaintX,
];
if ($complaintX->getFactsAddress()) {
$repoAddress = $em->getRepository(Address::class);
$data['address'] = $repoAddress->find($complaintX->getFactsAddress());
}
switch ($complaintX->getCategory()) {
case 'principalResidenceBurglary':
$data['target'] = "dans mon domicile principal";
$data['refTarget'] = "de mon domicile principal";
$group = "residence";
break;
case 'secondResidenceBurglary':
$data['target'] = "dans mon domicile secondaire";
$data['refTarget'] = "de mon domicile secondaire";
$group = "residence";
break;
case 'otherPlaceBurglary':
$data['target'] = "dans le local mentionné ci-contre";
$data['refTarget'] = "de mon local";
$group = "residence";
break;
case 'vacancyResidenceBurglary':
$data['target'] = "ce lieux que j’occupe temporairement comme " . $data['address']->getResidentTypeLabel();
if ($data['address'] && $data['address']->getArrivalDate()) {
$data['target'] .= ' pour la période du ' . $data['address']->getArrivalDate()->format('d/m/Y');
}
if ($data['address'] && $data['address']->getDepartureDate()) {
$data['target'] .= ' au ' . $data['address']->getDepartureDate()->format('d/m/Y');
}
$data['refTarget'] = "de mon lieux de résidence de vacances de type";
$group = "residence";
break;
case 'hotelRoomBurglary':
$data['target'] = "de ma chambre d’hôtel";
$data['refTarget'] = "de ma chambre d’hôtel";
$group = "residence";
break;
case 'insideVehicleTheft':
$ref = "Vol dans un véhicule";
// if (
// $complaintX->getStealVictim()
// && (!empty($complaintX->getItems()) || !empty($complaintX->getNonSavedItem()))
// ) {
// $ref = "Vol dans un véhicule";
// } else {
// $ref = "Tentative de vol dans un véhicule";
// }
// if (
// $complaintX->getBreakingsDegradationsFound()
// && $complaintX->getCategory() != "vehicleDegradation"
// ) {
// $ref .= " - Dégradation de véhicule";
// }
break;
case 'insideVehicleAttempt':
$ref = "Tentative de vol dans un véhicule";
break;
case 'vehicleTheft':
case 'vehicleDegradation':
case 'accessoryVehicleTheft':
case 'vehicleTheftTotal':
$ref = array_flip($complaintX->getCategories())[$complaintX->getCategory()];
// if (
// $complaintX->getStealVictim()
// && (!empty($complaintX->getItems()) || !empty($complaintX->getNonSavedItem()))
// ) {
// $ref .= " - Vol dans un véhicule";
// }
// if (
// $complaintX->getBreakingsDegradationsFound()
// && $complaintX->getCategory() != "vehicleDegradation"
// ) {
// $ref .= " - Dégradation de véhicule";
// }
break;
case 'simpleTheft':
$ref = 'Vol simple';
break;
case 'bikeTheft':
case 'itemDegradation':
case 'additionalComplaint':
$ref = array_flip($complaintX->getCategories())[$complaintX->getCategory()];
break;
}
if ($group === "residence") {
if ($complaintX->getIsBreakingsFound() && $complaintX->getStealVictim()) {
$ref .= "Vol avec effraction";
} elseif ($complaintX->getStealVictim()) {
$ref .= "Vol sans effraction";
} else {
$ref .= "Tentative de vol avec effraction";
}
}
$data['ref'] = $ref;
$complaintXService->buildTgiData($complaintX);
$view = null;
switch ($complaintX->getCategory())
{
case "bikeTheft":
case "hotelRoomBurglary":
case "itemDegradation":
case "phoneTheft":
case "simpleTheft":
case "vacancyResidenceBurglary":
$view = "complaintXPdf_" . $complaintX->getCategory();
break;
case "accessoryVehicleTheft":
case "insideVehicleAttempt":
case "insideVehicleTheft":
case "vehicleDegradation":
case "vehicleTheft":
case "vehicleTheftTotal":
$view = "complaintXPdf_category_vehicle";
break;
case "otherPlaceBurglary":
case "principalResidenceBurglary":
case "secondResidenceBurglary":
$view = "complaintXPdf_residenceBurglaryContent";
}
/**
* Complaint doc
*/
$pdfHtmlComplaint = $this->render(
'Complaint/pdf/' . $view . '.html.twig',
$data
);
$dompdf = new Dompdf();
$dompdf->loadHtml($pdfHtmlComplaint->getContent());
$dompdf->setPaper('A4');
$dompdf->render();
$canvas = $dompdf->getCanvas();
$canvas->page_text(290, 820, "{PAGE_NUM} / {PAGE_COUNT}", null, 10, array(0, 0, 0));
$directory = $generatedDir . '/complaintX';
if (!file_exists($directory) && !mkdir($directory, 0777, true) && !is_dir($directory)) {
throw new \RuntimeException(sprintf('Directory "%s" was not created', $directory));
}
file_put_contents($directory . '/' . $complaintX->getId() . '.pdf', $dompdf->output());
if ($request->getSession()->get('expressComplaintWantSinisterDeclaration')) {
$pdfHtmlDisasterDeclaration = $this->render('Complaint/complaintXPdfDisasterDeclaration.html.twig', $data);
$dompdfDisaster = new Dompdf();
$dompdfDisaster->loadHtml($pdfHtmlDisasterDeclaration->getContent());
$dompdfDisaster->setPaper('A4');
$dompdfDisaster->render();
$canvas = $dompdfDisaster->getCanvas();
$canvas->page_text(290, 820, "{PAGE_NUM} / {PAGE_COUNT}", null, 10, array(0, 0, 0));
$directory = $generatedDir . '/complaintXDisasterDeclaration';
if (!file_exists($directory) && !mkdir($directory, 0777, true) && !is_dir($directory)) {
throw new \RuntimeException(sprintf('Directory "%s" was not created', $directory));
}
file_put_contents(
$directory . '/' . $complaintX->getId() . '.pdf',
$dompdfDisaster->output()
);
}
$messageMail = (new DefaultTemplatedEmail())
->to($user->getEmail())
->context([
'price' => $request->getSession()->get('expressComplaintPrice'),
])
->attach($dompdf->output(), 'lettre-de-plainte.pdf', 'application/pdf');
// Send a mail with a validation link generated w/ a token
if ($request->getSession()->get('expressComplaintWantSinisterDeclaration')) {
$messageMail
->subject("Dépôt de plainte et déclaration de sinistre #" . $complaintX->getId())
->htmlTemplate('Mail/complaintDisasterDeclaration.html.twig')
->attach($dompdfDisaster->output(), 'declaration-de-sinistre.pdf', 'application/pdf');
} else {
$messageMail
->subject("Dépôt de plainte #" . $complaintX->getId())
->htmlTemplate('Mail/complaint.html.twig');
}
try {
$mailer->send($messageMail);
} catch (TransportExceptionInterface $e) {
error_log('$mailer->send($messageMail) Error : ' . $e->getMessage());
$this->addFlash(
'danger',
'Un problème est survenu (PDF_MAIL_ERROR), merci de contacter le service client.'
);
return $this->redirectToRoute('express_complaint_x_presentation');
}
return $this->redirectToRoute('express_complaint_x_completed', ['id' => $complaintX->getId()]);
}
#[Route("/express/plainte-contre-x-completed/{id}", name: "express_complaint_x_completed")]
public function completedAction(
Request $request,
TokenStorageInterface $tokenStorage,
ComplaintX $complaintX
): Response {
$expressComplaintSinisterDeclaration = false;
$files = [
'complaint' => '/upload/complaintX/' . $complaintX->getId() . '.pdf',
];
$publicPath = $this->getParameter('kernel.project_dir') . '/public';
if (\file_exists($publicPath . '/upload/complaintDisasterDeclaration/' . $complaintX->getId() . '.pdf')) {
$files['disasterDeclaration'] = '/upload/complaintDisasterDeclaration/' . $complaintX->getId() . '.pdf';
$expressComplaintSinisterDeclaration = true;
}
dump($files);
return $this->render('ExpressComplaint/completed.html.twig', [
'expressComplaintWantSinisterDeclaration' => $expressComplaintSinisterDeclaration,
'complaintX' => $complaintX,
'files' => $files,
]);
}
#[Route('/express/plainte-contre-x-send/{id}', name: 'express_complaint_x_send')]
public function signSendAction(
ComplaintXService $complaintService,
EntityManagerInterface $entityManager,
LoggerInterface $logger,
ComplaintX $complaintX,
): RedirectResponse {
if (is_null($this->getUser()) || is_null($complaintX)) {
return $this->redirectToRoute('express_complaint_x_presentation');
}
$complaintX->addStatus(ComplaintX::STATUS_SIGN_PENDING);
try {
$signatureRequest = $complaintService->attachSignature($complaintX);
$complaintX->setSignatureRequestId($signatureRequest->id);
} catch (SignatureRequestErrorException $e) {
$logger->error('SignatureRequestErrorException: ' . $e->getMessage());
return $this->redirectToRoute(
'user_complaints',
['alert' => 'warning', 'complaint' => $complaintX->getId(), 'type' => 'signature_process']
);
} catch (SignatureRequestCreationErrorException | Exception $e) {
$logger->error('SignatureRequestCreationErrorException: ' . $e->getMessage());
return $this->redirectToRoute(
'user_complaints',
['alert' => 'warning', 'complaint' => $complaintX->getId(), 'type' => 'signature_creation']
);
}
$entityManager->persist($complaintX);
$entityManager->flush();
return $this->redirect($signatureRequest->signers[0]['signature_link']);
}
/**
* @throws Exception
*/
#[Route('/express/plainte-contre-x-signature/success/{id}', name: 'express_complaint_x_signature_success')]
public function signSuccess(
ComplaintX $complaintX,
ComplaintXService $complaintService,
YousignService $yousignService,
): RedirectResponse {
if (!$complaintX->hasStatus(ComplaintX::STATUS_SIGN_PENDING)) {
return $this->redirectToRoute('user_homepage');
}
$signatureRequest = $yousignService->getSignatureRequest($complaintX->getSignatureRequestId());
$complaintService->downloadSignatureDocuments($complaintX, $signatureRequest);
return $this->redirectToRoute('user_complaints', ['alert' => 'success']);
}
#[Route('/express/plainte-contre-x-signature/error/{id}', name: 'express_complaint_x_signature_error')]
public function signError(
ComplaintX $complaintX,
): RedirectResponse {
return $this->redirectToRoute('user_complaints', [
'alert' => 'warning',
'complaint' => $complaintX->getId(),
'type' => 'external_error'
]);
}
#[Route('/express/plainte-contre-x-signature/file/{id}/{type}', name: 'express_complaint_x_download_file')]
public function downloadFile(
ComplaintX $complaintX,
string $type,
): StreamedResponse {
$user = $this->getUser();
if(is_null($user) || $complaintX->getUser()->getId() !== $user->getId()) {
return new StreamedResponse(
function () {
echo 'File not found';
},
403,
[
'Content-Type' => 'text/plain',
]
);
}
$file = match ($type) {
'complaint' => '/upload/complaintX/' . $complaintX->getId() . '.pdf',
'disasterDeclaration' => '/upload/complaintDisasterDeclaration/' . $complaintX->getId() . '.pdf',
default => null,
};
$publicPath = $this->getParameter('kernel.project_dir') . '/public';
if (\file_exists($publicPath . $file)) {
$filePath = $publicPath . $file;
return new StreamedResponse(
function () use ($filePath) {
$fileStream = fopen($filePath, 'r');
while (!feof($fileStream)) {
echo fread($fileStream, 1024); // Adjust chunk size as needed
flush();
}
fclose($fileStream);
},
200,
[
'Content-Type' => 'application/pdf',
]
);
}
return new StreamedResponse(
function () {
echo 'File not found';
},
404,
[
'Content-Type' => 'text/plain',
]
);
}
}