src/Controller/Paie/HonoraireController.php line 301

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Paie;
  3. use Mpdf\Mpdf;
  4. use App\Entity\Lrib;
  5. use App\Entity\PPiece;
  6. use App\Entity\PDevise;
  7. use App\Entity\PStatut;
  8. use App\Entity\PDossier;
  9. use App\Entity\Pemploye;
  10. use App\Entity\Probleme;
  11. use App\Entity\LContract;
  12. use App\Entity\PPaiement;
  13. use App\Entity\Prubrique;
  14. use App\Entity\Tbulletin;
  15. use App\Entity\PBordereau;
  16. use App\Entity\TbulletinLg;
  17. use App\Entity\TypRemuneration;
  18. use App\Entity\PnatureContract;
  19. use App\Controller\ApiController;
  20. use App\Service\CalculPaieService;
  21. use Doctrine\Persistence\ManagerRegistry;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\HttpFoundation\Response;
  24. use Symfony\Component\Routing\Annotation\Route;
  25. use Symfony\Component\HttpFoundation\JsonResponse;
  26. use PhpOffice\PhpSpreadsheet\Reader\Xlsx as Reader;
  27. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  28. use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException;
  29. #[Route('/paie/honoraire')]
  30. class HonoraireController extends AbstractController
  31. {
  32.     private $em;
  33.     private $calculPaieService;
  34.     private $api;
  35.     public function __construct(ManagerRegistry $doctrineCalculPaieService $calculPaieServiceApiController $api)
  36.     {
  37.         $this->em $doctrine->getManager();
  38.         $this->calculPaieService $calculPaieService;
  39.         $this->api $api;
  40.         
  41.     }
  42.     #[Route('/'name'app_paie_honoraire')]
  43.     public function index(Request $request): Response
  44.     {
  45.         $operations $this->api->check($this->getUser(), 'app_paie_honoraire'$this->em$request);
  46.         if(!is_array($operations)) {
  47.             return $this->redirectToRoute('app_site');  
  48.         }elseif(count($operations) == 0) {
  49.             return $this->render('includes/404.html.twig');
  50.         }
  51.         if(!is_array($operations)) {
  52.             return $this->redirectToRoute('app_site');  
  53.         }elseif(count($operations) == 0) {
  54.             return $this->render('includes/404.html.twig');
  55.         }
  56.         $dossiers $this->em->getRepository(PDossier::class)->findBy(['active' => true]);
  57.         $paiements $this->em->getRepository(PPaiement::class)->findBy(['active' => true]);
  58.         $devises $this->em->getRepository(PDevise::class)->findBy(['active' => true]);
  59.         $elementHonoraires $this->em->getRepository(Prubrique::class)->findBy(['honoraire' => true'active' => true]);
  60.         $natures $this->em->getRepository(PnatureContract::class)->findBy(['type' => $this->em->getRepository(TypRemuneration::class)->findBy(['id' => [35]])]);
  61.         return $this->render('paie/honoraire/index.html.twig', [
  62.            'operations' => $operations,
  63.            'natures' => $natures,
  64.            'paiements' => $paiements,
  65.            'dossiers' => $dossiers,
  66.            'devises' => $devises,
  67.            'elementHonoraires' => $elementHonoraires,
  68.         ]);
  69.     }
  70.     #[Route('/app_paie_honoraire_import/{paiement}'name'app_paie_honoraire_import'options: ['expose' => true])]
  71.     public function app_paie_honoraire_import(Request $requestPPaiement $paiement): Response
  72.     {
  73.         // $dossier = $this->em->getRepository(PDossier::class)->find($request->get('dossier'));
  74.         $reader = new Reader();
  75.         $spreadsheet $reader->load($request->files->get('file'));
  76.         $worksheet $spreadsheet->getActiveSheet();
  77.         $spreadSheetArys $worksheet->toArray();
  78.         unset($spreadSheetArys[0]);
  79.         $array = [];
  80.         // dd($spreadSheetArys);
  81.         $count 0;
  82.         foreach ($spreadSheetArys as $key => $sheet) {
  83.             $element $this->em->getRepository(Prubrique::class)->findOneBy(['id' => $sheet[11], 'honoraire' => true'active' => true]);
  84.             if(!$element) {
  85.                 return new JsonResponse('Element introuvable à la ligne '.($key 1).' !'500);                
  86.             } 
  87.             $contract $this->em->getRepository(LContract::class)->findOneBy(['id' => $sheet[0],'active' => true]);
  88.             if(!$contract) {
  89.                 return new JsonResponse('Contrat introuvable à la ligne '.($key 1).' !'500);                
  90.             } 
  91.             if(strtolower($contract->getEmploye()->getCin()) != strtolower($sheet[3])) {
  92.                 return new JsonResponse('le contrat n\'appartient pas à ce cin '.($key 1).' !'500);
  93.             }
  94.             $rib $this->em->getRepository(Lrib::class)->findOneBy(['contact_id' => $contract'active' => true]);
  95.             // dd($rib->getCode(), $sheet[4]);
  96.             // if($paiement->getDesignation() == "virement" && !preg_match('/^[0-9]{24}$/', $sheet[4])) {
  97.             if($paiement->getDesignation() == "virement" && strlen($sheet[4]) < 24 && preg_match('/^[0-9\s]+$/'$sheet[4])) {
  98.                 return new JsonResponse('RIB incorrect à la ligne '.($key 1).' !'500);
  99.             } elseif ($paiement->getDesignation() == "virement" && !$rib) {
  100.                 return new JsonResponse('vous n\'avez aucun RIB lié a cette contrat à la ligne '.($key 1).' !'500);
  101.             }
  102.             elseif($paiement->getDesignation() == "virement" && $rib->getCode() != $sheet[4]) {
  103.                 return new JsonResponse('Veuillez insérer un RIB lié au même contrat à la ligne '.($key 1).' !'500);
  104.             }
  105.            
  106.             $count++;
  107.             for ($i=5$i 11 $i++) { 
  108.                 if($this->hasMoreThanTwoDecimals($sheet[$i])) {
  109.                     return new JsonResponse('Vous disposez d\'un montant contenant plus de 2 décimales à la ligne '.($key 1).' !'500);
  110.                 }
  111.             }
  112.             $montant preg_replace('/[\p{Z}\s]+/u'''$sheet[5]);
  113.             $montant_mad preg_replace('/[\p{Z}\s]+/u'''$sheet[6]);
  114.             $brute preg_replace('/[\p{Z}\s]+/u'''$sheet[7]);
  115.             $brute_mad preg_replace('/[\p{Z}\s]+/u'''$sheet[8]);
  116.             $ir preg_replace('/[\p{Z}\s]+/u'''$sheet[9]);
  117.             $ir_mad preg_replace('/[\p{Z}\s]+/u'''$sheet[10]);
  118.             $montant str_replace(',''.'$montant);
  119.             $montant_mad str_replace(',''.'$montant_mad);
  120.             $brute str_replace(',''.'$brute);
  121.             $brute_mad str_replace(',''.'$brute_mad);
  122.             $ir str_replace(',''.'$ir);
  123.             $ir_mad str_replace(',''.'$ir_mad);
  124.             
  125.             if($ir or $brute or $montant 0) {
  126.                 return new JsonResponse('Vous un montant négatif à la ligne '.($key 1).' !'500);
  127.             }
  128.             
  129.             
  130.             if(number_format(($brute $ir) - $montant2) != or number_format(($brute_mad $ir_mad) - $montant_mad2) != 0) {
  131.                 return new JsonResponse('Vous un écart à la ligne '.($key 1).' !'500);
  132.             }
  133.             $searchedKey $this->searchKeyByKeys($array'contract_id'$contract->getId(), 'element_id'$element->getId());
  134.             // dump($searchedKey);
  135.             if(!is_null($searchedKey)) {
  136.                 $array[$searchedKey]['montant'] += $montant;
  137.                 $array[$searchedKey]['montant_mad'] += $montant_mad;
  138.                 $array[$searchedKey]['brute'] += $brute;
  139.                 $array[$searchedKey]['brute_mad'] += $brute_mad;
  140.                 $array[$searchedKey]['ir'] += $ir;
  141.                 $array[$searchedKey]['ir_mad'] += $ir_mad;
  142.             } else {
  143.                 array_push($array, [
  144.                     'id' => $count,
  145.                     'nom' => $contract->getEmploye()->getNom(),
  146.                     'nature_contract' => $contract->getPnatureContract()->getId(),
  147.                     'prenom' => $contract->getEmploye()->getPrenom(),
  148.                     'contract_id' => $contract->getId(),
  149.                     'dossier_id' => $contract->getDossier()->getId(),
  150.                     'dossier' => $contract->getDossier()->getAbreviation(),
  151.                     'montant' => $montant,
  152.                     'montant_mad' => $montant_mad,
  153.                     'brute' => $brute,
  154.                     'brute_mad' => $brute_mad,
  155.                     'ir' => $ir,
  156.                     'ir_mad' => $ir_mad,
  157.                     'element_id' => $element->getId(),
  158.                     'element' => $element->getDesignation(),
  159.                     'rib' => $rib $rib->getCode() : '',
  160.                 ]);
  161.             }
  162.         }
  163.         return new JsonResponse($array);
  164.     }
  165.     #[Route('/app_paie_honoraire_insert'name'app_paie_honoraire_insert'options: ['expose' => true])]
  166.     public function app_paie_honoraire_insert(Request $request): Response
  167.     {
  168.         $devise $this->em->getRepository(PDevise::class)->find($request->get('devise'));
  169.         $paiement $this->em->getRepository(PPaiement::class)->find($request->get('paiement'));
  170.         $observation $request->get('observation');
  171.         $periode $this->calculPaieService->getPeriode();
  172.         if($periode->IsValider()) {
  173.             return new JsonResponse('Periode est valider !'500, [], JSON_UNESCAPED_UNICODE);
  174.         }
  175.         
  176.         $honoraires json_decode($request->get('honoraires'));
  177.         $returnueIR $this->em->getRepository(Prubrique::class)->find(43);
  178.         $divers $this->em->getRepository(Prubrique::class)->find(68);
  179.         $bordoreauIds = [];
  180.         // dd($honoraires);
  181.         foreach($honoraires as $key => $dossierKey) {
  182.             $dossier $this->em->getRepository(PDossier::class)->find($key);
  183.             // dd($dossier);
  184.             foreach ($dossierKey as $key => $natureKey) {
  185.                 $bordoreau = new PBordereau;
  186.                 $bordoreau->setPiece($this->em->getRepository(PPiece::class)->find(5));
  187.                 $bordoreau->setDevise($devise);
  188.                 $bordoreau->setStatut(
  189.                     $this->em->getRepository(PStatut::class)->find(1)
  190.                 );
  191.                 $bordoreau->setPeriode($periode);
  192.                 $bordoreau->setType('honoraire');
  193.                 $bordoreau->setPaiement($paiement);
  194.                 $bordoreau->setNatureContract($this->em->getRepository(PnatureContract::class)->find($key));
  195.                 $bordoreau->setUserCreated($this->getUser());
  196.                 $bordoreau->setObservation($observation);
  197.                 $bordoreau->setDossier($dossier);
  198.         
  199.                 $this->em->persist($bordoreau);
  200.                 foreach ($natureKey as $key => $honoraire) {
  201.                     // dd($honoraire);
  202.                     $bulletin = new Tbulletin();
  203.                     $bulletin->setDossier($dossier);
  204.                     $bulletin->setDevise($devise);
  205.                     $bulletin->setPPiece(
  206.                         $this->em->getRepository(PPiece::class)->find(2)
  207.                     );
  208.                     $bulletin->setPaiement($paiement);
  209.                     $bulletin->setObservation($observation);
  210.                     $bulletin->setBordereau($bordoreau);
  211.                     $bulletin->setContract(
  212.                         $this->em->getRepository(LContract::class)->find($honoraire->contract_id)
  213.                     );
  214.                     $bulletin->setPeriode($periode);
  215.         
  216.                     $this->em->persist($bulletin);
  217.         
  218.                     if($honoraire->ir 0) {
  219.                         $bulletinDetRetunueIr = new TbulletinLg();
  220.                         $bulletinDetRetunueIr->setBulletin($bulletin);
  221.                         $bulletinDetRetunueIr->setRubrique($returnueIR);
  222.                         $bulletinDetRetunueIr->setSens(-1);
  223.                         $bulletinDetRetunueIr->setMontant($honoraire->ir_mad);
  224.                         $bulletinDetRetunueIr->setMontantDevise($honoraire->ir);
  225.             
  226.                         $this->em->persist($bulletinDetRetunueIr);
  227.                     }
  228.                     
  229.                     $bulletinDetDivers = new TbulletinLg();
  230.                     $bulletinDetDivers->setBulletin($bulletin);
  231.                     $bulletinDetDivers->setRubrique($divers);
  232.                     $bulletinDetDivers->setSens(1);
  233.                     $bulletinDetDivers->setMontant($honoraire->montant_mad);
  234.                     $bulletinDetDivers->setMontantDevise($honoraire->montant);
  235.                     
  236.                     $this->em->persist($bulletinDetDivers);
  237.                     
  238.                     $bulletinDet = new TbulletinLg();
  239.                     $bulletinDet->setBulletin($bulletin);
  240.                     $bulletinDet->setRubrique($this->em->getRepository(Prubrique::class)->find($honoraire->element_id));
  241.                     $bulletinDet->setSens(1);
  242.                     $bulletinDet->setMontant($honoraire->brute_mad);
  243.                     $bulletinDet->setMontantDevise($honoraire->brute);
  244.                     
  245.                     $this->em->persist($bulletinDet);
  246.                 }
  247.                 $this->em->flush();
  248.                 array_push($bordoreauIds$bordoreau->getId());
  249.                 
  250.             }          
  251.         }
  252.       
  253.         $this->em->flush();
  254.         $bordoreauIds array_unique($bordoreauIds);
  255.         if(count($bordoreauIds) > 0) {
  256.             $request->request->add(['bordoreauIds' => json_encode($bordoreauIds)]);
  257.         }
  258.         return new JsonResponse('Bien Enregistrer!');
  259.     }
  260.     #[Route('/app_paie_honoraire_list/{periode}'name'app_paie_honoraire_list'options: ['expose' => true])]
  261.     public function app_paie_honoraire_list(Request $request$periode): Response
  262.     {
  263.        
  264.         $date = new \DateTime($periode);
  265.         $periode $this->calculPaieService->getPeriode($date->format('mY'));
  266.         
  267.         $draw $request->query->get('draw');
  268.         $start $request->query->get('start') ?? 0;
  269.         $length $request->query->get('length') ?? 10;
  270.         $search $request->query->all('search')["value"];
  271.         $orderColumnIndex $request->query->all('order')[0]['column'];
  272.         $orderColumn $request->query->all("columns")[$orderColumnIndex]['name'];
  273.         $orderDir $request->query->all('order')[0]['dir'] ?? 'asc';
  274.         $dossier $request->getSession()->get('dossier');
  275.         $queryBuilder $this->em->createQueryBuilder()
  276.         ->select('b.code as bulletin, b.id as bulletin_id, contract.id as id, contract.code as contract_code, p.nom as nom, p.matricule as matricule , p.prenom')
  277.         ->from(LContract::class, 'contract')
  278.         ->innerJoin('contract.employe''p')
  279.         ->innerJoin('contract.bulletins''b')
  280.         ->innerJoin('b.piece''piece')
  281.         ->Where('contract.dossier = :dossier')
  282.         ->andWhere('b.dossier = :dossier')
  283.         ->andWhere('b.periode = :periode')
  284.         ->andWhere('piece.id = 2')
  285.         ->andWhere('b.active = 1')
  286.         ->setParameter('dossier'$dossier)
  287.         ->setParameter('periode'$periode);
  288.         if (!empty($search)) {
  289.             $queryBuilder->andWhere('(contract.code LIKE :search OR b.code LIKE :search OR p.matricule LIKE :search OR  p.nom LIKE :search OR p.prenom LIKE :search)')
  290.                 ->setParameter('search'"%$search%");
  291.         }
  292.         if (!empty($orderColumn)) {
  293.             $queryBuilder->orderBy("$orderColumn"$orderDir);
  294.         }
  295.         $filteredRecords count($queryBuilder->getQuery()->getResult());
  296.         
  297.         // Paginate results
  298.         $queryBuilder->setFirstResult($start)
  299.             ->setMaxResults($length)
  300.             ->orderBy('b.id''DESC');
  301.         $results $queryBuilder->getQuery()->getResult();
  302.         // dd($results);
  303.         foreach ($results as $key => $contract) {
  304.             // dd('amine');
  305.             // if($contract['id'] == 1301) {
  306.             //     dd($this->em->getRepository(PArretTravailLg::class)->getNombreJoursArret($contract['id'], $periode));
  307.             // }
  308.             $results[$key]['DT_RowId'] = $contract['id'];
  309.             $results[$key]['nombreJourTravails'] = "-";
  310.             $results[$key]['salaire'] = '<p style="text-align: right !important; margin:0 !important">'.number_format($this->em->getRepository(Tbulletin::class)->getNetAPayeByDevise($contract['bulletin_id']), 2',' ' ').'</p>';
  311.             $results[$key]['problemes'] = $this->em->getRepository(Probleme::class)->checkIfTheresProblemes($periode$contract['id']);
  312.         }
  313.         
  314.         // dd($results);
  315.         $totalRecords $this->em->createQueryBuilder()
  316.         ->select('COUNT(d.id)')
  317.         ->from(LContract::class, 'd')
  318.         ->innerJoin('d.bulletins''bulletins')
  319.         ->innerJoin('bulletins.piece''piece')
  320.         ->Where('d.active = 1')
  321.         ->andWhere('bulletins.dossier = :dossier')
  322.         ->andWhere('piece.id = 2')
  323.         ->andWhere('bulletins.periode = :periode')
  324.         ->setParameter('dossier'$dossier)
  325.         ->setParameter('periode'$periode)
  326.         ->getQuery()
  327.         ->getSingleScalarResult();
  328.         return new JsonResponse([
  329.             'draw' => $draw,
  330.             'recordsTotal' => $totalRecords,
  331.             'recordsFiltered' => $filteredRecords,
  332.             'data' => $results,
  333.         ]);
  334.     }
  335.     function hasMoreThanTwoDecimals($number) {
  336.         // Convert the number to a string to handle both integers and floats
  337.         $numberStr strval($number);
  338.     
  339.         // Use a regular expression to check if the number has more than two decimals
  340.         // The pattern matches a dot (decimal point), followed by at most two digits
  341.         return preg_match('/\.\d{3,}/'$numberStr) === 1;
  342.     }
  343.     function searchKeyByKeys($array$key1$value1$key2$value2) {
  344.         foreach ($array as $key => $item) {
  345.             if ($item[$key1] == $value1 && $item[$key2] == $value2) {
  346.                 return $key;
  347.             }
  348.         }
  349.         return null// Return null if not found
  350.     }
  351. }