<?php
namespace App\Controller\Backend;
use App\Entity\CotisationNotification;
use App\Entity\EntityStatus;
use App\Entity\Order;
use App\Entity\PaymentType;
use App\Service\IsMemberService;
use App\Service\SaleService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Response;
use App\Entity\Cotisation;
use App\Form\Backend\CotisationFormType;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
#[IsGranted('ROLE_COMPTABLE', message: "Cher utilisateur FFCB, Vous n'avez pas l'autorisation pour cette action !")]
#[Route('/admin')]
class CotisationController extends AbstractController
{
private IsMemberService $isMemberService;
public function __construct(IsMemberService $isMemberService)
{
$this->isMemberService = $isMemberService;
}
#[Route(path: '/cotisations/{id}/show', name: 'show_cotisation')]
#[IsGranted('ROLE_USER', message: 'Vous n\'avez pas les droits nécessaire pour accéder à cette fonctionnalité')]
public function show(Cotisation $cotisation): Response
{
return $this->render('backend/cotisation/show.html.twig', [
'controller_name' => 'CotisationController',
'menu' => 'cotisation',
'cotisation' => $cotisation,
]);
}
#[Route(path: '/cotisations/add', name: 'add_cotisation')]
#[IsGranted('ROLE_ADD_ENTITY', message: 'Vous n\'avez pas les droits nécessaire pour accéder à cette fonctionnalité')]
public function add(
Request $request,
EntityManagerInterface $em,
SaleService $saleService
): RedirectResponse|Response
{
$cotisation = new Cotisation();
$form = $this->createForm(CotisationFormType::class, $cotisation);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$cotisation = $this->save(
$cotisation,
$form->get('paymentType')->getData(),
$saleService,
$em
);
/*$notification = $em->getRepository(CotisationNotification::class)->findOneBy([
'firm' => $cotisation->getEntreprise(),
'status' => CotisationNotification::STATUS_ACTIVE
]);
if (!is_null($notification)) {
$notification->setStatus(CotisationNotification::STATUS_PERFORMED);
$em->persist($notification);
}
$order = $saleService->buildOrderFromCotisation(
$this->getUser()->getContact()->getFirm(),
$cotisation,
$form->get('paymentType')->getData()
);
$cotisation->setAssocietedOrder($order);
if ($cotisation->isOptionMapa() === false) {
$cotisation->setPriceOptionMapa(null);
}
if ($cotisation->isOptionImportExport() === false) {
$cotisation->setPriceOptionImportExport(null);
}*/
$em->persist($cotisation);
$em->flush();
$this->addFlash(
'success',
'Enregistrement effectué avec succès'
);
return $this->redirectToRoute('show_cotisation', [
'id' => $cotisation->getId()
]);
}
return $this->renderForm('backend/cotisation/edit.html.twig', [
'controller_name' => 'CotisationController',
'menu' => 'cotisation',
'cotisationForm' => $form,
'action' => 'creation'
]);
}
#[Route(path: '/cotisations/{id}/edit', name: 'edit_cotisation')]
#[IsGranted('ROLE_UPDATE_ENTITY', message: 'Vous n\'avez pas les droits nécessaire pour accéder à cette fonctionnalité')]
public function edit(
Request $request,
Cotisation $cotisation,
EntityManagerInterface $em,
SaleService $saleService
): RedirectResponse|Response
{
$form = $this->createForm(CotisationFormType::class, $cotisation);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$cotisation = $this->save(
$cotisation,
$form->get('paymentType')->getData(),
$saleService,
$em
);
$em->persist($cotisation);
$em->flush();
$this->addFlash(
'success',
'Enregistrement effectué avec succès'
);
return $this->redirectToRoute('show_cotisation', [
'id' => $cotisation->getId()
]);
}
return $this->renderForm('backend/cotisation/edit.html.twig', [
'controller_name' => 'CotisationController',
'menu' => 'cotisation',
'cotisationForm' => $form,
'action' => 'editer',
'cotisation' => $cotisation
]);
}
private function save(
Cotisation $cotisation,
PaymentType $paymentType,
SaleService $saleService,
EntityManagerInterface $em
): Cotisation
{
$notification = $em->getRepository(CotisationNotification::class)->findOneBy([
'firm' => $cotisation->getEntreprise(),
'status' => CotisationNotification::STATUS_ACTIVE
]);
if (!is_null($notification)) {
$notification->setStatus(CotisationNotification::STATUS_PERFORMED);
$em->persist($notification);
}
if ($cotisation->isOptionMapa() === false) {
$cotisation->setPriceOptionMapa(null);
}
if ($cotisation->isOptionImportExport() === false) {
$cotisation->setPriceOptionImportExport(null);
}
$totalHt = 0;
$totalHt += $cotisation->getPriceDepartmentPart() ?? 0;
$totalHt += $cotisation->getPriceNationalPart() ?? 0;
$totalHt += $cotisation->getPriceOptionImportExport() ?? 0;
$cotisation->setPriceHt($totalHt);
$totalVAT = $cotisation->getPriceHt() / 100 * 20;
$cotisation->setPriceVat($totalVAT);
$totalTtc = $cotisation->getPriceHt() + $cotisation->getPriceVat() + ($cotisation->getPriceOptionMapa() ?? 0);
$cotisation->setPriceTtc($totalTtc);
$this->isMemberService->checkIsMember($cotisation->getEntreprise());
if ($cotisation->getAssocietedOrder() === null) {
$order = $saleService->buildOrderFromCotisation(
$cotisation->getEntreprise(),
$cotisation,
$paymentType
);
$cotisation->setAssocietedOrder($order);
} else {
$cotisation
->getAssocietedOrder()
->setPaymentType($paymentType)
;
}
$orderStatus = match ($cotisation->getCotisationStatut()->getId()) {
1 => Order::STATUS_PAID,
default => Order::STATUS_WAITING_PAYMENT
};
$cotisation
->getAssocietedOrder()
->setStatus($orderStatus)
;
return $cotisation;
}
#[Route(path: '/cotisations/{id}/archive', name: 'archive_cotisation', methods: ['DELETE', 'POST'])]
#[IsGranted('ROLE_DELETE_ENTITY', message: 'Vous n\'avez pas les droits nécessaire pour accéder à cette fonctionnalité')]
public function archive(Cotisation $cotisation, Request $request, EntityManagerInterface $em): JsonResponse
{
$data = json_decode($request->getContent(), true);
if ($this->isCsrfTokenValid('cotisation_'.$cotisation->getId(), $data['_token'])) {
$cotisation->setStatus(EntityStatus::STATUS_ARCHIVED);
$order = $cotisation->getAssocietedOrder();
if($order){
$order->setStatus(EntityStatus::STATUS_ARCHIVED);
$em->persist($order);
}
$em->persist($cotisation);
$em->flush();
return new JsonResponse([
'status' => 'ok',
'message' => 'Archivage effectuée avec succès'
]);
}
return new JsonResponse([
'status' => 'nok',
'message' => 'Erreur lors de l\'archivage. Merci de contacter un administrateur.'
]);
}
#[Route(path: '/cotisations/{id}/enable', name: 'enable_cotisation', methods: ['DELETE', 'POST'])]
#[IsGranted('ROLE_DELETE_ENTITY', message: 'Vous n\'avez pas les droits nécessaire pour accéder à cette fonctionnalité')]
public function enable(Cotisation $cotisation, Request $request, EntityManagerInterface $em): JsonResponse
{
$data = json_decode($request->getContent(), true);
if (
$cotisation->getStatus() === EntityStatus::STATUS_ARCHIVED &&
$this->isCsrfTokenValid('cotisation_'.$cotisation->getId(), $data['_token'])
) {
$cotisation->setStatus(EntityStatus::STATUS_ENABLED);
$em->persist($cotisation);
$em->flush();
return new JsonResponse([
'status' => 'ok',
'message' => 'Activation effectuée avec succès'
]);
}
return new JsonResponse([
'status' => 'nok',
'message' => 'Erreur lors de l\'activation. Merci de contacter un administrateur.'
]);
}
}