src/Controller/Paie/IndeminiteController.php line 347

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