<?php
namespace App\Controller;
use App\Entity\Affectation;
use App\Entity\Payment;
use App\Entity\Piece;
use App\Form\PaymentSearchType;
use App\Form\PaymentType;
use App\Repository\PaymentRepository;
use App\Repository\PieceRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Knp\Component\Pager\PaginatorInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
/**
* @Route("/payment")
*/
class PaymentController extends AbstractController
{
/**
* @Route("/", name="payment_index", methods={"GET|POST"})
* @Security("is_granted('ROLE_USER')")
*/
public function index(PaymentRepository $paymentRepository, Request $request, PaginatorInterface $paginator): Response
{
$form = $this->createForm(PaymentSearchType::class,null,['responsable'=>$this->getUser()]);
$form->handleRequest($request);
if ($form->isSubmitted()) {
$url = $this->buildSearchUrl($request->request->all());
if (!empty($url)) {
return $this->redirectToRoute('payment_index', $url);
}
}
$payments = $paginator->paginate(
$paymentRepository->MyFindAll($request->query->all(),$this->getUser()), /* query NOT result */
$request->query->getInt('page', 1)/* page number */, 20/* limit per page */
);
$totals = $paymentRepository->getSumOperations($request->query->all(),$this->getUser());
return $this->render('payment/index.html.twig', [
'payments' => $payments,
'totals' => $totals,
'form' => $form->createView(),
]);
}
/**
* @Route("/new", name="payment_new", methods={"GET","POST"})
* @Security("is_granted('ROLE_USER')")
*/
public function new(Request $request): Response
{
$payment = new Payment();
$form = $this->createForm(PaymentType::class, $payment, ['responsable'=>$this->getUser()]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $this->getDoctrine()->getManager();
$payment->setUser($this->getUser());
$entityManager->persist($payment);
$entityManager->flush();
$this->addFlash("success", "Paiement Ajouté avec succès");
return $this->redirectToRoute('payment_index');
}
return $this->render('payment/new.html.twig', [
'payment' => $payment,
'form' => $form->createView(),
]);
}
/**
* @Route("/{id}/delete-confirmation", name="payment_delete_confirmation", methods={"GET"})
* @Security("is_granted('ROLE_SUPER_ADMIN')")
*/
public function deleteConfirmation(Payment $payment): Response
{
return $this->render('payment/_delete_confirmation.html.twig', [
'payment' => $payment,
]);
}
/**
* @Route("/{id}", name="payment_show", methods={"GET"})
* @Security("is_granted('ROLE_USER')")
*/
public function show(Payment $payment): Response
{
if (
($this->getUser()->isResponsable() && $payment->getClient()->getUser() != $this->getUser()) or
($this->getUser()->isResponsable() && !$this->getUser()->canViewPayment($payment))
) {
$this->addFlash("danger", "Accès interdit");
return $this->redirectToRoute('accueil_back');
}
return $this->render('payment/show.html.twig', [
'payment' => $payment,
]);
}
/**
* @Route("/{id}/edit", name="payment_edit", methods={"GET","POST"})
* @Security("is_granted('ROLE_USER')")
*/
public function edit(Request $request, Payment $payment): Response
{
if (
($this->getUser()->isResponsable() && $this->getParameter('param_title') == 'IRON-APP') or
($this->getUser()->isResponsable() && $payment->getClient()->getUser() != $this->getUser()) or
($this->getUser()->isResponsable() && !$this->getUser()->canViewPayment($payment))
) {
$this->addFlash("danger", "Accès interdit");
return $this->redirectToRoute('accueil_back');
}
$form = $this->createForm(PaymentType::class, $payment, ['responsable'=>$this->getUser()]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->flush();
$this->addFlash("success", "Paiement Modifié avec succès");
if($request->query->get('piece')){
return $this->redirectToRoute('piece_show',['id'=>$request->query->get('piece')]);
}
}
return $this->render('payment/edit.html.twig', [
'payment' => $payment,
'form' => $form->createView(),
]);
}
/**
* @Route("/{id}/affecter-payent", name="affect_payment_piece", methods={"POST"})
* @Security("is_granted('ROLE_USER')")
*/
public function affectPayment(Piece $piece, Request $request): Response
{
if (
($this->getUser()->isResponsable() && $this->getParameter('param_title') == 'IRON-APP') or
($this->getUser()->isResponsable() && $piece->getClient()->getUser() != $this->getUser()) or
($this->getUser()->isResponsable() && !$this->getUser()->canViewInvoice($piece))
) {
$this->addFlash("danger", "Accès interdit");
return $this->redirectToRoute('accueil_back');
}
$data = $request->request->all();
$type = $data['type'];
$message = '';
$em = $this->getDoctrine()->getManager();
if($type == 'gift' or $type == 'affect'){
$amount = (float)$data['affectation'];
if($amount > $piece->getSolde()){
$message = "Le montant d'affectation ne peut pas être supérieur au solde de la facture.";
}else{
if($type == 'gift' and $amount - 0.0001 > $piece->getClient()->getAvailablePoints()){
$message = "Le montant d'affectation ne peut pas être supérieur aux points disponibles.";
}elseif($type == 'affect' and !is_null($piece->getClient()->getNotAffectedPayement()) and $amount - 0.0001 > $piece->getClient()->getNotAffectedPayement()->getRest()){
$message = "Le montant d'affectation ne peut pas être supérieur au montant non affecté.";
}
}
if($message != ''){
$this->addFlash("danger", $message);
return $this->redirectToRoute('piece_show',['id'=>$piece->getId(),'col'=>$type,'affectation'=>$amount]);
}
$affectation = new Affectation();
$affectation->setPiece($piece);
$affectation->setAmount($amount);
if($type == 'affect'){
$affectation->setPayment($piece->getClient()->getNotAffectedPayement());
$em->persist($affectation);
$em->flush();
}else{
$payment = new Payment();
$payment->setClient($piece->getClient());
$payment->setDate(new \DateTime('now'));
$payment->setAmount($piece->getClient()->getAvailablePoints());
$payment->setType(Payment::TYPE_GIFT);
$affectation->setPayment($payment);
$payment->addAffectation($affectation);
$em->persist($payment);
$em->flush();
}
$piece->setUpdatedAt(new \DateTime('now'));
$em->flush();
$this->addFlash("success", "Nouvelle affecation ajoutée avec succès");
return $this->redirectToRoute('piece_show',['id'=>$piece->getId()]);
}elseif($type == 'new'){
if(empty($data['typePayment']) or empty($data['amountPayment']) or empty($data['datePayment'])){
$message = "Veuillez remplir toutes les données";
}elseif($piece->getSolde() < $data['amountPayment']){
$message = "Le montant du paiement ne peut pas être supérieur au solde de la facture";
}
if($message != ''){
$this->addFlash("danger", $message);
return $this->redirectToRoute('piece_show',['id'=>$piece->getId(),'col'=>$type,'typePayment'=>$data['typePayment'],"amountPayment"=>$data['amountPayment'],"datePayment"=>$data['datePayment']]);
}
$payment = new Payment();
$payment->setClient($piece->getClient());
$payment->setDate(new \DateTime($data['datePayment']));
$payment->setAmount($data['amountPayment']);
$payment->setType($data['typePayment']);
$affectation = new Affectation();
$affectation->setPiece($piece);
$affectation->setAmount($data['amountPayment']);
$affectation->setPayment($payment);
$payment->addAffectation($affectation);
$em->persist($payment);
$em->flush();
$piece->setUpdatedAt(new \DateTime('now'));
$em->flush();
$this->addFlash("success", "Nouveau paiement ajouté avec succès");
return $this->redirectToRoute('piece_show',['id'=>$piece->getId()]);
}
}
/**
* @Route("/{id}/delete-affectation", name="payment_delete_affectation", methods={"GET"})
* @Security("is_granted('ROLE_USER')")
*/
public function deleteAffectation(Request $request, Affectation $affectation, PieceRepository $pieceRepository): Response
{
if (
($this->getUser()->isResponsable() && $this->getParameter('param_title') == 'IRON-APP') or
($this->getUser()->isResponsable() && $affectation->getPayment()->getClient()->getUser() != $this->getUser()) or
($this->getUser()->isResponsable() && !$this->getUser()->canViewPayment($affectation->getPayment()))
) {
$this->addFlash("danger", "Accès interdit");
return $this->redirectToRoute('accueil_back');
}
$pieceId = $affectation->getPiece()->getId();
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($affectation);
$entityManager->flush();
$piece = $pieceRepository->findOneById($pieceId);
$piece->setUpdatedAt(new \DateTime('now'));
$entityManager->flush();
$this->addFlash("success", "Affectation supprimée avec succès");
return $this->redirectToRoute('piece_show',['id'=>$pieceId]);
}
/**
* @Route("/{id}/delete", name="payment_delete", methods={"DELETE"})
* @Security("is_granted('ROLE_SUPER_ADMIN')")
*/
public function delete(Request $request, Payment $payment): Response
{
if ($this->isCsrfTokenValid('delete' . $payment->getId(), $request->request->get('_token'))) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($payment);
$entityManager->flush();
}
$this->addFlash("success", "Paiement supprimé avec succès");
return $this->redirectToRoute('payment_index');
}
private function buildSearchUrlPaymentLine($data)
{$url = [];
foreach ($data as $k => $v) {
if (isset($data['payment_line_search']['code']) && !empty($data['payment_line_search']['code'])) {
$url['code'] = $data['payment_line_search']['code'];
}
if (isset($data['payment_line_search']['product']) && !empty($data['payment_line_search']['product'])) {
$url['product'] = $data['payment_line_search']['product'];
}
if (isset($data['payment_line_search']['dateDu']) && !empty($data['payment_line_search']['dateDu'])) {
$url['dateDu'] = $data['payment_line_search']['dateDu'];
}
if (isset($data['payment_line_search']['dateAu']) && !empty($data['payment_line_search']['dateAu'])) {
$url['dateAu'] = $data['payment_line_search']['dateAu'];
}
if (isset($data['payment_line_search']['priceHTMin']) && !empty($data['payment_line_search']['priceHTMin'])) {
$url['priceHTMin'] = $data['payment_line_search']['priceHTMin'];
}
if (isset($data['payment_line_search']['priceHTMax']) && !empty($data['payment_line_search']['priceHTMax'])) {
$url['priceHTMax'] = $data['payment_line_search']['priceHTMax'];
}
if (isset($data['payment_line_search']['totalHTMin']) && !empty($data['payment_line_search']['totalHTMin'])) {
$url['totalHTMin'] = $data['payment_line_search']['totalHTMin'];
}
if (isset($data['payment_line_search']['totalHTMax']) && !empty($data['payment_line_search']['totalHTMax'])) {
$url['totalHTMax'] = $data['payment_line_search']['totalHTMax'];
}
if (isset($data['payment_line_search']['rabaisMin']) && !empty($data['payment_line_search']['rabaisMin'])) {
$url['rabaisMin'] = $data['payment_line_search']['rabaisMin'];
}
if (isset($data['payment_line_search']['rabaisMax']) && !empty($data['payment_line_search']['rabaisMax'])) {
$url['rabaisMax'] = $data['payment_line_search']['rabaisMax'];
}
if (isset($data['payment_line_search']['amountRabaisMin']) && !empty($data['payment_line_search']['amountRabaisMin'])) {
$url['amountRabaisMin'] = $data['payment_line_search']['amountRabaisMin'];
}
if (isset($data['payment_line_search']['amountRabaisMax']) && !empty($data['payment_line_search']['amountRabaisMax'])) {
$url['amountRabaisMax'] = $data['payment_line_search']['amountRabaisMax'];
}
if (isset($data['payment_line_search']['priceBuyHTMin']) && !empty($data['payment_line_search']['priceBuyHTMin'])) {
$url['priceBuyHTMin'] = $data['payment_line_search']['priceBuyHTMin'];
}
if (isset($data['payment_line_search']['priceBuyHTMax']) && !empty($data['payment_line_search']['priceBuyHTMax'])) {
$url['priceBuyHTMax'] = $data['payment_line_search']['priceBuyHTMax'];
}
if (isset($data['payment_line_search']['margeMin']) && !empty($data['payment_line_search']['margeMin'])) {
$url['margeMin'] = $data['payment_line_search']['margeMin'];
}
if (isset($data['payment_line_search']['margeMax']) && !empty($data['payment_line_search']['margeMax'])) {
$url['margeMax'] = $data['payment_line_search']['margeMax'];
}
}
return $url;
}
private function buildSearchUrl($data)
{
$url = [];
foreach ($data as $k => $v) {
if (isset($data['payment_search']['user']) && !empty($data['payment_search']['user'])) {
$url['user'] = $data['payment_search']['user'];
}
if (isset($data['payment_search']['client']) && !empty($data['payment_search']['client'])) {
$url['client'] = $data['payment_search']['client'];
}
if (isset($data['payment_search']['code']) && !empty($data['payment_search']['code'])) {
$url['code'] = $data['payment_search']['code'];
}
if (isset($data['payment_search']['amountHTMin']) && !empty($data['payment_search']['amountHTMin'])) {
$url['amountHTMin'] = $data['payment_search']['amountHTMin'];
}
if (isset($data['payment_search']['amountHTMax']) && !empty($data['payment_search']['amountHTMax'])) {
$url['amountHTMax'] = $data['payment_search']['amountHTMax'];
}
if (isset($data['payment_search']['amountTVAMin']) && !empty($data['payment_search']['amountTVAMin'])) {
$url['amountTVAMin'] = $data['payment_search']['amountTVAMin'];
}
if (isset($data['payment_search']['amountTVAMax']) && !empty($data['payment_search']['amountTVAMax'])) {
$url['amountTVAMax'] = $data['payment_search']['amountTVAMax'];
}
if (isset($data['payment_search']['amountDiscountMin']) && !empty($data['payment_search']['amountDiscountMin'])) {
$url['amountDiscountMin'] = $data['payment_search']['amountDiscountMin'];
}
if (isset($data['payment_search']['amountDiscountMax']) && !empty($data['payment_search']['amountDiscountMax'])) {
$url['amountDiscountMax'] = $data['payment_search']['amountDiscountMax'];
}
if (isset($data['payment_search']['discountMin']) && !empty($data['payment_search']['discountMin'])) {
$url['discountMin'] = $data['payment_search']['discountMin'];
}
if (isset($data['payment_search']['discountMax']) && !empty($data['payment_search']['discountMax'])) {
$url['discountMax'] = $data['payment_search']['discountMax'];
}
if (isset($data['payment_search']['amountTTCMin']) && !empty($data['payment_search']['amountTTCMin'])) {
$url['amountTTCMin'] = $data['payment_search']['amountTTCMin'];
}
if (isset($data['payment_search']['amountTTCMax']) && !empty($data['payment_search']['amountTTCMax'])) {
$url['amountTTCMax'] = $data['payment_search']['amountTTCMax'];
}
if (isset($data['payment_search']['dateDu']) && !empty($data['payment_search']['dateDu'])) {
$url['dateDu'] = $data['payment_search']['dateDu'];
}
if (isset($data['payment_search']['dateAu']) && !empty($data['payment_search']['dateAu'])) {
$url['dateAu'] = $data['payment_search']['dateAu'];
}
if (isset($data['payment_search']['payer']) && !empty($data['payment_search']['payer'])) {
$url['payer'] = $data['payment_search']['payer'];
}
if (isset($data['payment_search']['modePaiement']) && !empty($data['payment_search']['modePaiement'])) {
$url['modePaiement'] = $data['payment_search']['modePaiement'];
}
}
return $url;
}
}