src/Controller/Salarie/GestionSalarieController.php line 90

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Salarie;
  3. use Mpdf\Mpdf;
  4. use App\Entity\Lrib;
  5. use App\Entity\nuts;
  6. use App\Entity\PPiece;
  7. use App\Entity\Diplome;
  8. use App\Entity\Pbareme;
  9. use App\Entity\Periode;
  10. use App\Entity\VMatrix;
  11. use App\Entity\PDossier;
  12. use App\Entity\Pemploye;
  13. use App\Entity\LContract;
  14. use App\Entity\Pfonction;
  15. use App\Entity\Prubrique;
  16. use App\Entity\Tbulletin;
  17. use App\Entity\PBaremeCimr;
  18. use App\Entity\TbulletinLg;
  19. use App\Entity\LelementFixe;
  20. use App\Entity\PbaremeBrute;
  21. use App\Entity\PdureeContract;
  22. use App\Entity\PnatureContract;
  23. use App\Entity\LdossierContract;
  24. use App\Controller\ApiController;
  25. use App\Entity\PNaturesalarieCab;
  26. use App\Entity\LmatriculationCoti;
  27. use App\Service\CalculPaieService;
  28. use App\Entity\PsituationFamiliale;
  29. use Doctrine\Persistence\ManagerRegistry;
  30. use Symfony\Component\HttpFoundation\Request;
  31. use Symfony\Component\HttpFoundation\Response;
  32. use Symfony\Component\Routing\Annotation\Route;
  33. use Symfony\Component\HttpFoundation\JsonResponse;
  34. use PhpOffice\PhpSpreadsheet\Reader\Xlsx as Reader;
  35. use Symfony\Component\Finder\Exception\AccessDeniedException;
  36. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  37. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  38. #[Route('/salarie/salarie')]
  39. class GestionSalarieController extends AbstractController
  40. {
  41.     private $em;
  42.     private $api;
  43.     private $calculPaieService;
  44.     public function __construct(ManagerRegistry $doctrineApiController $apiCalculPaieService $calculPaieService)
  45.     {
  46.         $this->em $doctrine->getManager();
  47.         $this->api $api;
  48.         $this->calculPaieService $calculPaieService;
  49.     }
  50.     #[Route('/'name'app_salarie_salarie'options: ['expose' => true])]
  51.     public function index(Request $request): Response
  52.     {
  53.         $operations $this->api->check($this->getUser(), 'app_salarie_salarie'$this->em$request);
  54.         if (!is_array($operations)) {
  55.             return $this->redirectToRoute('app_site');
  56.         } elseif (count($operations) == 0) {
  57.             return $this->render('includes/404.html.twig');
  58.         }
  59.         $natureSalarieCabs $this->em->getRepository(PNaturesalarieCab::class)->findAll();
  60.         $situationFamiliales $this->em->getRepository(PsituationFamiliale::class)->findAll();
  61.         $fonctions $this->em->getRepository(Pfonction::class)->findAll();
  62.         $pemployes $this->em->getRepository(Pemploye::class)->findAll();
  63.         $naturecontract $this->em->getRepository(PnatureContract::class)->findBy(['active' => true]);
  64.         // dd($naturecontract);:
  65.         $pbaremes $this->em->getRepository(Pbareme::class)->findAll();
  66.         $contract $this->em->getRepository(LContract::class)->findBy(['active' => 1]);
  67.         $dossiers $this->em->getRepository(PDossier::class)->findBy(['active' => true]);
  68.         $dossiersReafectation $this->em->getRepository(PDossier::class)->findBy(['active' => true'groupement' => 'FCZ']);
  69.         return $this->render('salarie/gestion_salarie/index.html.twig', [
  70.             'operations' => $operations,
  71.             'natureSalarieCabs' => $natureSalarieCabs,
  72.             'situationFamiliales' => $situationFamiliales,
  73.             'fonctions' => $fonctions,
  74.             'pemployes' => $pemployes,
  75.             'contracts' => $contract,
  76.             'naturecontract' => $naturecontract,
  77.             'dossiers' => $dossiers,
  78.             'dossiersReafectation' => $dossiersReafectation,
  79.             'baremes' => $pbaremes
  80.         ]);
  81.     }
  82.     #[Route('/app_salarie_salarie_list'name'app_salarie_salarie_list'options: ['expose' => true])]
  83.     public function app_salarie_salarie_list(Request $request): Response
  84.     {
  85.         $draw $request->query->get('draw');
  86.         $start $request->query->get('start') ?? 0;
  87.         $length $request->query->get('length') ?? 10;
  88.         $search $request->query->all('search')["value"];
  89.         $orderColumnIndex $request->query->all('order')[0]['column'];
  90.         $orderColumn $request->query->all("columns")[$orderColumnIndex]['name'];
  91.         $orderDir $request->query->all('order')[0]['dir'] ?? 'asc';
  92.         $dossier $request->getSession()->get('dossier');
  93.         // dd($dossier);
  94.         $queryBuilder $this->em->createQueryBuilder()
  95.             ->select('p.id as employe_id, n.designation as nature, c.code as contract,p.cin, p.nom as nom, c.id as matricule , p.prenom')
  96.             ->from(Pemploye::class, 'p')
  97.             ->innerJoin('p.contracts''c')
  98.             ->innerJoin('c.ldossierContracts''ldossierContract')
  99.             ->innerJoin('c.pnatureContract''n')
  100.             ->Where('c.active = 1')
  101.             ->andWhere('ldossierContract.active = 1')
  102.             ->andWhere('ldossierContract.dossier_id = :dossier')
  103.             ->setParameter('dossier'$dossier);
  104.         if (!empty($search)) {
  105.             $queryBuilder->andWhere('(n.designation LIKE :search OR p.cin LIKE :search OR c.code LIKE :search OR c.id LIKE :search OR p.matricule LIKE :search OR  p.nom LIKE :search OR p.prenom LIKE :search)')
  106.                 ->setParameter('search'"%$search%");
  107.         }
  108.         if (!empty($orderColumn)) {
  109.             $queryBuilder->orderBy("$orderColumn"$orderDir);
  110.         }
  111.         $filteredRecords count($queryBuilder->getQuery()->getResult());
  112.         // Paginate results
  113.         $queryBuilder->setFirstResult($start)
  114.             ->setMaxResults($length);
  115.         $results $queryBuilder->getQuery()->getResult();
  116.         // dd($results);
  117.         $totalRecords $this->em->createQueryBuilder()
  118.             ->select('COUNT(p.id)')
  119.             ->from(Pemploye::class, 'p')
  120.             ->innerJoin('p.contracts''c')
  121.             ->innerJoin('c.ldossierContracts''ldossierContract')
  122.             ->innerJoin('c.pnatureContract''n')
  123.             ->Where('c.active = 1')
  124.             ->andWhere('ldossierContract.active = 1')
  125.             ->andWhere('ldossierContract.dossier_id = :dossier')
  126.             ->setParameter('dossier'$dossier)
  127.             ->getQuery()
  128.             ->getSingleScalarResult();
  129.         return new JsonResponse([
  130.             'draw' => $draw,
  131.             'recordsTotal' => $totalRecords,
  132.             'recordsFiltered' => $filteredRecords,
  133.             'data' => $results,
  134.         ]);
  135.     }
  136.     #[Route('/salarienoactive'name'app_salarie_salarie_noactive'options: ['expose' => true])]
  137.     public function salarienoactive(Request $request): Response
  138.     {
  139.         $operations $this->api->check($this->getUser(), 'app_salarie_salarie'$this->em$request);
  140.         if (!$operations) {
  141.             return new AccessDeniedException();
  142.         }
  143.         $natureSalarieCabs $this->em->getRepository(PNaturesalarieCab::class)->findAll();
  144.         $situationFamiliales $this->em->getRepository(PsituationFamiliale::class)->findAll();
  145.         $fonctions $this->em->getRepository(Pfonction::class)->findAll();
  146.         $pemployes $this->em->getRepository(Pemploye::class)->findBy(['active' => 0]);
  147.         $naturecontract $this->em->getRepository(PnatureContract::class)->findAll();
  148.         $pbaremes $this->em->getRepository(Pbareme::class)->findAll();
  149.         $contract $this->em->getRepository(LContract::class)->findBy(['active' => 1]);
  150.         return $this->render('salarie/gestion_salarie/index.html.twig', [
  151.             'operations' => $operations,
  152.             'natureSalarieCabs' => $natureSalarieCabs,
  153.             'situationFamiliales' => $situationFamiliales,
  154.             'fonctions' => $fonctions,
  155.             'pemployes' => $pemployes,
  156.             'contracts' => $contract,
  157.             'naturecontract' => $naturecontract,
  158.             'baremes' => $pbaremes,
  159.         ]);
  160.     }
  161.     #[Route('/new'name'app_salarie_salarie_new'options: ['expose' => true])]
  162.     public function new(Request $requestUserPasswordHasherInterface $userPasswordHasher): Response
  163.     {
  164.         // dd($request);
  165.         $employe $this->em->getRepository(Pemploye::class)->findOneBy(['cin' => trim($request->get('cin')), 'active' => true]);
  166.         if ($employe) {
  167.             return new JsonResponse('Employe déja exist !'500);
  168.         }
  169.         if ($request->get('sexe') == 0) {
  170.             return new JsonResponse('Veuillez choisir le sexe de l\'employé !'500);
  171.         }
  172.         $employe = new Pemploye();
  173.         $employe->setNom($request->get('nom'));
  174.         $employe->setPrenom($request->get('prenom'));
  175.         $employe->setDateNaissance(new \DateTime($request->get('date_naissance')));
  176.         $employe->setLieuNaissance($request->get('lieu_naissance'));
  177.         $employe->setCin(trim($request->get('cin')));
  178.         $employe->setSexe($request->get('sexe'));
  179.         $employe->setNombreJourConge((float)$request->get('nbr_jour_conge'));
  180.         $employe->setRoles([]);
  181.         $employe->setSituationFamilialeId(
  182.             $this->em->getRepository(PsituationFamiliale::class)->find($request->get('situation_familiale'))
  183.         );
  184.         $employe->setPassword($userPasswordHasher->hashPassword(
  185.             $employe,
  186.             '0123456789'
  187.         ));
  188.         $employe->setIsFirstLogin(true);
  189.         if($request->get('nombre_enfant')) {
  190.             $employe->setNombreEnfants($request->get('nombre_enfant'));
  191.         }
  192.         $employe->setAdresse1($request->get('adresse_1'));
  193.         if ($request->get('adresse_2')) {
  194.             $employe->setAdresse2($request->get('adresse_2'));
  195.         }
  196.         $employe->setNationalite($request->get('nationalite'));
  197.         $employe->setSexe($request->get('sexe'));
  198.         $employe->setCodePostal($request->get('code_postal'));
  199.         if ($request->get('code_postal')) {
  200.             $employe->setCodePostal($request->get('code_postal'));
  201.         }
  202.         $employe->setVille($request->get('ville'));
  203.         $employe->setPays($request->get('pays'));
  204.         $employe->setTel1($request->get('telephone_1'));
  205.         if ($request->get('telephone_2')) {
  206.             $employe->setTel2($request->get('telephone_2'));
  207.         }
  208.         if ($request->get('email')) {
  209.             $employe->setEmail($request->get('email'));
  210.         }
  211.         $employe->setActive(0);
  212.         $this->em->persist($employe);
  213.         $this->em->flush();
  214.         $employe_id $employe->getId();
  215.         $Diplomes json_decode($request->get('diplomes'));
  216.         $diplome $this->em->getRepository(Diplome::class)->add_diplome(
  217.             $Diplomes,
  218.             $employe_id
  219.         );
  220.         return new JsonResponse($employe_id);
  221.     }
  222.     #[Route('/update_emp'name'app_salarie_salarie_update'options: ['expose' => true])]
  223.     public function update_emp(Request $request): Response
  224.     {
  225.         // dd($request->get('diplomes'));
  226.         $employe $this->em->getRepository(Pemploye::class)->update_employe($request);
  227.         $employe_id $employe->getId();
  228.         $Diplomes json_decode($request->get('diplomes'));
  229.         $diplome $this->em->getRepository(Diplome::class)->add_diplome(
  230.             $Diplomes,
  231.             $employe_id
  232.         );
  233.         return new JsonResponse($employe_id);
  234.     }
  235.     #[Route('/contract'name'app_salarie_contract'options: ['expose' => true])]
  236.     public function contract(Request $request): Response
  237.     {
  238.         if (
  239.             $request->get('nature_contrat') == "" or $request->get('duree_contrat') == "" or $request->get('bareme') == "" or $request->get('fonction') == "0"
  240.             or $request->get('affectation') == "" or $request->get('date_contrat') == "" or $request->get('date_fin') == "" or $request->get('affectation') == "" or
  241.             ($request->get('nature_contrat') == 13 && $request->get('Stagiaire_AutoEntrepreneur') == null && ($request->get('carte_AutoEntrepreneur') == '' or $request->get('debut_AutoEntrepreneur') == '' or $request->get('fin_AutoEntrepreneur') == '' ))
  242.         ) {
  243.             return new JsonResponse('Veuillez remplir tous les champs!'500);
  244.         }
  245.         $employe $this->em->getRepository(Pemploye::class)->find($request->get('employe_id'));
  246.         $natureContrat $this->em->getRepository(PnatureContract::class)->find($request->get('nature_contrat'));
  247.         $dossier $this->em->getRepository(PDossier::class)->find($request->get('affectation'));
  248.         $contract $this->em->getRepository(LContract::class)->findOneBy(['employe' => $employe'dossier' => $dossier'pnatureContract' => $natureContrat'active' => true]);
  249.         // dd($contract);
  250.         if ($contract) {
  251.             return new JsonResponse('Vous avez une contrat active!'500);
  252.         }
  253.         $piece $this->em->getRepository(PPiece::class)->find(8);
  254.         $contract = new LContract();
  255.         $contract->setUserCreated($this->getUser());
  256.         $contract->setEmploye($employe);
  257.         $contract->setPnatureContract($natureContrat);
  258.         if($natureContrat->getId() == 13) {
  259.             $contract->setCarteAutoEntrepreneur($request->get('carte_AutoEntrepreneur'));
  260.             $contract->setDateDebutCarteEntrepreneur(new \DateTime($request->get('debut_AutoEntrepreneur')));
  261.             $contract->setDateFinCarteEntrepreneur(new \DateTime($request->get('fin_AutoEntrepreneur')));
  262.             if($request->get('Stagiaire_AutoEntrepreneur')) {
  263.                 $contract->setStagiaire(true);
  264.             } else {
  265.                 $contract->setStagiaire(false);
  266.             }
  267.         }
  268.         $contract->setBareme(
  269.             $this->em->getRepository(Pbareme::class)->find($request->get('bareme'))
  270.         );
  271.         $contract->setDateDebut(new \DateTime($request->get('date_contrat')));
  272.         $contract->setDateAnciennte(new \DateTime($request->get('date_contrat')));
  273.         $contract->setDossier($dossier);
  274.         $contract->setDureeContract(
  275.             $this->em->getRepository(PdureeContract::class)->find($request->get('duree_contrat'))
  276.         );
  277.         $contract->setPiece($piece);
  278.         $contract->setfonction(
  279.             $this->em->getRepository(Pfonction::class)->find($request->get('fonction'))
  280.         );
  281.         $contract->setActive(1);
  282.         $contract->setPriseEnCharge($employe->getNombreEnfants());
  283.         $contract->setSalaireaffecte($request->get('salaire_affecte'));
  284.         $contract->setCreated(new \DateTime());
  285.         if ($request->get('salaire_grille')) {
  286.             $contract->setSalairegrille($request->get('salaire_grille'));
  287.         }
  288.         if ($request->get('date_fin')) {
  289.             $contract->setDateFin(new \DateTime($request->get('date_fin')));
  290.         }
  291.         $employe->setActive(1);
  292.         $this->em->persist($contract);
  293.         // $this->em->flush();
  294.         $rubrique_ppc $this->em->getRepository(Prubrique::class)->find(16);
  295.         $rubrique_rpc $this->em->getRepository(Prubrique::class)->find(37);
  296.         $dossierContract $this->em->getRepository(LdossierContract::class)->findOneBy(['contract_id' => $contract'active' => true]);
  297.         // dd($Lcontract);
  298.         if ($dossierContract) {
  299.             $dossierContract->setDossierId($contract->getDossier());
  300.         } else {
  301.             $dossierContract = new LdossierContract();
  302.             $dossierContract->setDossierId($contract->getDossier());
  303.             $dossierContract->setContractId($contract);
  304.             $dossierContract->setUserCreated($this->getUser());
  305.             $dossierContract->setCreated(new \DateTime());
  306.             $this->em->persist($dossierContract);
  307.             // $this->em->flush();
  308.         }
  309.         if ($request->get('ppc')) {
  310.             $ppc = (int)$request->get('ppc');
  311.             if ($ppc != 0) {
  312.                 $elementFixe = new LelementFixe();
  313.                 $elementFixe->setContract($contract);
  314.                 $elementFixe->setRubrique($rubrique_ppc);
  315.                 $elementFixe->setSens(1);
  316.                 $elementFixe->setMontant($request->get('ppc'));
  317.                 $this->em->persist($elementFixe);
  318.             }
  319.         }
  320.         if ($request->get('rpc')) {
  321.             $rpc = (int)$request->get('rpc');
  322.             if ($rpc != 0) {
  323.                 $elementFixe = new LelementFixe();
  324.                 $elementFixe->setContract($contract);
  325.                 $elementFixe->setRubrique($rubrique_rpc);
  326.                 $elementFixe->setSens(-1);
  327.                 $elementFixe->setMontant($request->get('rpc'));
  328.                 $this->em->persist($elementFixe);
  329.             }
  330.         }
  331.         $this->em->flush();
  332.         return new JsonResponse($contract->getId());
  333.     }
  334.     #[Route('/update_contract'name'app_salarie_contract_update'options: ['expose' => true])]
  335.     public function update_contract(Request $request): Response
  336.     {
  337.         // dd($request->get('contract_id'));
  338.         $contract $this->em->getRepository(LContract::class)->update_contract_full($request);
  339.         return new JsonResponse($contract);
  340.     }
  341.     #[Route('/cnss'name'app_salarie_cnss'options: ['expose' => true])]
  342.     public function cnss(Request $request): Response
  343.     {
  344.         // dd($request);
  345.         $contract $this->em->getRepository(LContract::class)->find($request->get('contract_id'));
  346.         if ($request->get('rib') != "") {
  347.             if (preg_match('/^[0-9\s]+$/'$request->get('rib')) && strlen(trim($request->get('rib'))) < 24) {
  348.                 return new JsonResponse('RIB incorrect'500);
  349.             }
  350.             $Lrib $this->em->getRepository(Lrib::class)->findOneBy(['contact_id' => $contract'active' => true'code' => $request->get('rib')]);
  351.             if (!$Lrib) {
  352.                 $checkRibAlreadyExist $this->em->getRepository(Lrib::class)->findOneBy(['active' => true'code' => $request->get('rib')]);
  353.                 if($checkRibAlreadyExist && $checkRibAlreadyExist->getContactId()->getEmploye()->getCin() != $contract->getEmploye()->getCin()) {
  354.                     return new JsonResponse('Rib déja lié à une autre personne! ('.$checkRibAlreadyExist->getContactId()->getEmploye()->getCin().')'500);
  355.                 }
  356.                 $Lrib = new Lrib();
  357.                 $Lrib->setContactId($contract );
  358.                 $Lrib->setCode($request->get('rib'));
  359.                 $Lrib->setDesignation('-');
  360.                 $Lrib->setSwift($request->get('swift'));
  361.                 $Lrib->setBanque($request->get('banque'));
  362.                 $this->em->persist($Lrib);
  363.             }
  364.         }
  365.         // cnss
  366.         if ($request->get('cnss') && trim($request->get('cnss')) != "") {
  367.             $contract->setCnss($request->get('cnss'));
  368.             $contract->setDateCnss(new \DateTime($request->get('date_declaration_cnss')));
  369.         } else {
  370.             $contract->setCnss('CNSS00000');
  371.             $contract->setDateCnss(new \DateTime());
  372.         }
  373.         // cimr
  374.         if ($request->get('cimr') && trim($request->get('cimr')) != "") {
  375.             $contract->setCimr($request->get('cimr'));
  376.             $contract->setDateCimr(new \DateTime($request->get('date_declaration_cimr')));
  377.         } else {
  378.             $contract->setCimr('CIMR0000');
  379.             $contract->setDateCimr(new \DateTime());
  380.         }
  381.         $this->em->flush();
  382.         return new JsonResponse('ok');
  383.     }
  384.     #[Route('/update_cnss'name'app_salarie_cnss_update'options: ['expose' => true])]
  385.     public function update_cnss(Request $request): Response
  386.     {
  387.         $contract $this->em->getRepository(LContract::class)->find($request->get('contract_id'));
  388.         if ($request->get('rib') && trim($request->get('rib')) != "") {
  389.             if (preg_match('/^[0-9\s]+$/'$request->get('rib')) && strlen(trim($request->get('rib'))) < 24) {
  390.                 return new JsonResponse('RIB incorrect'500);
  391.             }
  392.             $oldRib $this->em->getRepository(Lrib::class)->findOneBy(['contact_id' => $contract'active' => true]);
  393.             $checkRibAlreadyExist $this->em->getRepository(Lrib::class)->findOneBy(['active' => true'code' => $request->get('rib')]);
  394.             if($checkRibAlreadyExist && $checkRibAlreadyExist->getContactId()->getEmploye()->getCin() != $contract->getEmploye()->getCin()) {
  395.                 return new JsonResponse('Rib déja lié à une autre personne! ('.$checkRibAlreadyExist->getContactId()->getId().')'500,[] , JSON_UNESCAPED_UNICODE);
  396.             }
  397.             if (!$oldRib) {
  398.                 $Lrib = new Lrib();
  399.                 $Lrib->setContactId($contract);
  400.                 $Lrib->setCode($request->get('rib'));
  401.                 $Lrib->setDesignation('-');
  402.                 $Lrib->setSwift($request->get('swift'));
  403.                 $Lrib->setBanque($request->get('banque'));
  404.                 $this->em->persist($Lrib);
  405.             } elseif ($oldRib && $oldRib->getCode() != $request->get('rib')) {
  406.                 $oldRib->setActive(false);
  407.                 $Lrib = new Lrib();
  408.                 $Lrib->setContactId(
  409.                     $this->em->getRepository(LContract::class)->find($request->get('contract_id'))
  410.                 );
  411.                 $Lrib->setCode($request->get('rib'));
  412.                 $Lrib->setDesignation('-');
  413.                 $Lrib->setSwift($request->get('swift'));
  414.                 $Lrib->setBanque($request->get('banque'));
  415.                 $this->em->persist($Lrib);
  416.             } elseif ($oldRib) {
  417.                 $oldRib->setSwift($request->get('swift'));
  418.                 $oldRib->setBanque($request->get('banque'));
  419.             }
  420.         }
  421.         if ($request->get('cnss') && trim($request->get('cnss')) != ""  && trim($request->get('cnss')) != $contract->getCnss()) {
  422.             $contract->setCnss($request->get('cnss'));
  423.             $contract->setDateCnss(new \DateTime($request->get('date_declaration_cnss')));
  424.         }
  425.         // cimr
  426.         if ($request->get('cimr') && trim($request->get('cimr')) != "" && trim($request->get('cimr')) != $contract->getCimr()) {
  427.             $contract->setCimr($request->get('cimr'));
  428.             $contract->setDateCimr(new \DateTime($request->get('date_declaration_cimr')));
  429.         }
  430.         $this->em->flush();
  431.         return new JsonResponse('ok');
  432.     }
  433.     #[Route('/plusinfo'name'app_salarie_plusinfo'options: ['expose' => true])]
  434.     public function plusinfo(Request $request): Response
  435.     {
  436.         $LmatriculationCoti $this->em->getRepository(Pemploye::class)->add_plusinfo($request);
  437.         return new JsonResponse('ok');
  438.     }
  439.     #[Route('/contractaff'name'app_salarie_contractaff'options: ['expose' => true])]
  440.     public function contractaff(Request $request): Response
  441.     {
  442.         $operations $this->api->check($this->getUser(), 'app_salarie_salarie'$this->em$request);
  443.         $employe $request->get('employe_id');
  444.         $queryBuilder $this->em->createQueryBuilder()
  445.             // n.designation')
  446.             ->select('contract.id as id, p.id as employe, contract.code, p.nom as nom, p.matricule as matricule ,
  447.          p.prenom,n.Abreviation,t.designation as type,n.designation')
  448.             // ->select('contract.id as id, contract.code, p.nom as nom, p.matricule as matricule , p.prenom, n.type')
  449.             ->from(LContract::class, 'contract')
  450.             ->innerJoin('contract.employe''p')
  451.             ->innerJoin('contract.pnatureContract''n')
  452.             ->innerJoin('n.type''t')
  453.             ->Where('contract.active = 1')
  454.             ->andWhere('contract.employe = :employe')
  455.             ->setParameter('employe'$employe);
  456.         $results $queryBuilder->getQuery()->getResult();
  457.         // dd($results);
  458.         $data =  $this->render('salarie/gestion_salarie/modals/contract_detail.html.twig', [
  459.             'contracts' => $results'operations' => $operations'employe' => $employe
  460.         ])->getContent();
  461.         return new JsonResponse($data);
  462.     }
  463.     #[Route('/contractinfo'name'app_salarie_contractinfo'options: ['expose' => true])]
  464.     public function contractinfo(Request $request): Response
  465.     {
  466.         $contract_id $request->get('contract_id');
  467.         $queryBuilder $this->em->createQueryBuilder()
  468.             ->select("contract.id as id,p.id as employeid,n.id as pnatureid,
  469.                 p.nom, p.adresse2, p.tel2,p.nationalite, p.ville,p.pays, p.email, p.prenom, p.adresse1, p.tel1, p.date_naissance, p.nombre_enfants,p.lieu_naissance, p.nbr_pris_en_charge,p.cin, p.sexe,situation_familiale.id as situation_familiale_id,
  470.                   n.Abreviation,n.designation,contract.date_fin,contract.date_debut,f.id as fonctionid,f.Designation as fonction,
  471.                   contract.Salaireaffecte,d.Designation as dure,d.id as iddure,b.id as bareme,ds.id as dossier, ds.abreviation as dossierAbrev
  472.                   ,contract.Salairegrille,contract.PPC,contract.RPC,b.Profil, contract.dateFinCarteEntrepreneur, contract.stagiaire, contract.dateDebutCarteEntrepreneur, contract.carteAutoEntrepreneur")
  473.             ->from(LContract::class, 'contract')
  474.             ->innerJoin('contract.employe''p')
  475.             ->innerJoin('contract.pnatureContract''n')
  476.             ->LEFTJoin('contract.fonction''f')
  477.             ->LEFTJoin('p.situation_familiale_id''situation_familiale')
  478.             ->LEFTJoin('contract.dureeContract''d')
  479.             ->LEFTJoin('contract.bareme''b')
  480.             ->LEFTJoin('contract.dossier''ds')
  481.             ->Where('contract.active = 1')
  482.             ->andWhere('contract.id = :contractid')
  483.             ->setParameter('contractid'$contract_id);
  484.         $results $queryBuilder->getQuery()->getResult();
  485.         // dd($results);
  486.         return new JsonResponse($results);
  487.     }
  488.     #[Route('/app_salarie_update_save'name'app_salarie_update_save'options: ['expose' => true])]
  489.     public function app_salarie_update_save(Request $request): Response
  490.     {
  491.         // dd($request);
  492.         $contract $this->em->getRepository(LContract::class)->find($request->get('contract_id'));
  493.         if($contract) {
  494.             $employe $contract->getEmploye();
  495.             $employe->setNom($request->get('nom'));
  496.             $employe->setPrenom($request->get('prenom'));
  497.             $employe->setDateNaissance(new \DateTime($request->get('date_naissance')));
  498.             $employe->setLieuNaissance($request->get('lieu_naissance'));
  499.             $employe->setSexe($request->get('sexe'));
  500.             if($request->get('situation_familiale')) {
  501.                 $employe->setSituationFamilialeId(
  502.                     $this->em->getRepository(PsituationFamiliale::class)->find($request->get('situation_familiale'))
  503.                 );
  504.             }
  505.             $employe->setAdresse1($request->get('adresse_1'));
  506.             if ($request->get('adresse_2')) {
  507.                 $employe->setAdresse2($request->get('adresse_2'));
  508.             }
  509.             if($request->get('nombre_enfant')) {
  510.                 $employe->setNombreEnfants($request->get('nombre_enfant'));
  511.             }
  512.             $employe->setNationalite($request->get('nationalite'));
  513.             $employe->setSexe($request->get('sexe'));
  514.     
  515.             $employe->setVille($request->get('ville'));
  516.             $employe->setPays($request->get('pays'));
  517.     
  518.             if ($request->get('telephone_2')) {
  519.                 $employe->setTel2($request->get('telephone_2'));
  520.             }
  521.             if ($request->get('telephone_1')) {
  522.                 $employe->setTel1($request->get('telephone_1'));
  523.             }
  524.             if ($request->get('email')) {
  525.                 $employe->setEmail($request->get('email'));
  526.             }
  527.             $employe->setUpdated(new \DateTime());
  528.             $employe->setUserUpdated($this->getUser());
  529.     
  530.             $this->em->flush();
  531.         }
  532.         return new JsonResponse(1);
  533.     }
  534.     #[Route('/updatecontract'name'app_salarie_updatecontract'options: ['expose' => true])]
  535.     public function updatecontract(Request $request): Response
  536.     {
  537.         // dd($request);
  538.         $updatecontract $this->em->getRepository(LContract::class)->update_contract($request);
  539.         return new JsonResponse($updatecontract);
  540.     }
  541.     #[Route('/getmatricule'name'app_salarie_get_cnss_cimr'options: ['expose' => true])]
  542.     public function getmatricule(Request $request): Response
  543.     {
  544.         // dd($request);
  545.         $contract $this->em->getRepository(LContract::class)->find($request->get('contract_id'));
  546.         if($request->get('newfonction')){
  547.             $contract->setFonction(
  548.                 $this->em->getRepository(Pfonction::class)->find($request->get('newfonction'))
  549.             );
  550.             $contract->setUpdated(new \DateTime());
  551.             $contract->setUserUpdated($this->getUser());
  552.             $this->em->flush();
  553.         }
  554.         $rib $this->em->getRepository(Lrib::class)->findOneBy(['contact_id' => $contract'active' => true]);
  555.         return new JsonResponse([
  556.             'rib' => $rib $rib->getCode() : '',
  557.             'swift' => $rib $rib->getSwift() : '',
  558.             'banque' => $rib $rib->getBanque() : '',
  559.             'cimr' => $contract->getCimr(),
  560.             'datecimr' => $contract->getDateCimr() ? $contract->getDateCimr()->format("Y-m-d") : null,
  561.             'datecnss' => $contract->getDateCnss() ? $contract->getDateCnss()->format("Y-m-d") : null,
  562.             'cnss' => $contract->getCnss(),
  563.         ]);
  564.     }
  565.     #[Route('/updatecotis'name'app_salarie_updatecotis'options: ['expose' => true])]
  566.     public function updatecotis(Request $request): Response
  567.     {
  568.         // dd($request->get('date_cnssup'));
  569.         $updatecontract $this->em->getRepository(LmatriculationCoti::class)->update_cnss_cimr($request);
  570.         return new JsonResponse($updatecontract);
  571.     }
  572.     #[Route('/desactiver_cnt'name'app_salarie_desactiver'options: ['expose' => true])]
  573.     public function desactiver_cnt(Request $request): Response
  574.     {
  575.         $Lcontract $this->em->getRepository(LContract::class)->find($request->get('contract'));
  576.        
  577.         $this->disableContract($Lcontract$request->get('date'), $request->get('motif'));
  578.         // $contract_id = $request->get('contract_id');
  579.         // $contract = $this->em->getRepository(LContract::class)->find($contract_id);
  580.         return new JsonResponse('Bien enregistrer');
  581.     }
  582.     public function disableContract($Lcontract$date$motif) :void {
  583.         $employe $Lcontract->getEmploye();
  584.         $Lcontract->setActive(0);
  585.         $Lcontract->setDateSortie(new \DateTime($date));
  586.         $Lcontract->setMotifSortie($motif);
  587.         $Lcontract->setUserDesactiver($this->getUser());
  588.         $Lcontract->setDateDesactiver(new \DateTime());
  589.         $dossierContract $this->em->getRepository(LdossierContract::class)->findBy(['contract_id' => $Lcontract'active' => true]);
  590.         foreach ($dossierContract as $key => $dc) {
  591.             $dc->setActive(false);
  592.         }
  593.         // $LmatriculationCoti = $this->em->getRepository(Lrib::class)->desactivate_rib($request);
  594.         // $rib = $this->em->getRepository(Lrib::class)->findBy(['contact_id' => $Lcontract]);
  595.         // foreach ($rib as $key => $r) {
  596.         //     $r->setActive(false);
  597.         // }
  598.         $LmatriculationCoti $this->em->getRepository(LmatriculationCoti::class)->findBy(['contract_id' => $Lcontract]);
  599.         foreach ($LmatriculationCoti as $key => $r) {
  600.             $r->setActive(false);
  601.         }
  602.         $this->em->flush();
  603.         
  604.         if(count($employe->getActiveContracts()) == 0) {
  605.             $employe->setActive(false);
  606.         }
  607.         
  608.         $this->em->flush();
  609.     }
  610.     #[Route('/reaffectation'name'app_salarie_reaffectation'options: ['expose' => true])]
  611.     public function app_salarie_reaffectation(Request $request): Response
  612.     {
  613.         $dossierReaffectation $request->get('nouvelle_affectation');
  614.         $dossierReaffectation $this->em->getRepository(PDossier::class)->find($dossierReaffectation);
  615.         $contract $this->em->getRepository(LContract::class)->find($request->get('contract'));
  616.         if ($contract->getDossier()->getId() == $dossierReaffectation->getId()) {
  617.             return new JsonResponse('Contrat déja exist dans cette affecation !'500);
  618.         } else if (in_array($contract->getDossier()->getId(), [1739,40])) {
  619.             return new JsonResponse('Vous ne pouvez pas changer l\'affectation!'500);
  620.         }
  621.         $ldossierContrat $this->em->getRepository(LdossierContract::class)->findOneBy(['contract_id' => $contract'active' => true]);
  622.         if ($ldossierContrat) {
  623.             $ldossierContrat->setActive(false);
  624.             $ldossierContrat->setDateReaffectation(new \DateTime());
  625.             $ldossierContrat->setUserReaffectation($this->getUser());
  626.         }
  627.         $ldossierContrat = new LdossierContract();
  628.         $ldossierContrat->setContractId($contract);
  629.         $ldossierContrat->setDossierId($dossierReaffectation);
  630.         $ldossierContrat->setCreated(new \DateTime());
  631.         $ldossierContrat->setDateReaffectation(new \DateTime());
  632.         $ldossierContrat->setUserCreated($this->getUser());
  633.         $ldossierContrat->setUserReaffectation($this->getUser());
  634.         $this->em->persist($ldossierContrat);
  635.         $contract->setDossier($dossierReaffectation);
  636.         $this->em->flush();
  637.         // $contract_id = $request->get('contract_id');
  638.         // $contract = $this->em->getRepository(LContract::class)->find($contract_id);
  639.         return new JsonResponse('Bien enregistrer');
  640.     }
  641.     #[Route('/app_salarie_import_sortant'name'app_salarie_import_sortant'options: ['expose' => true])]
  642.     public function app_salarie_import_sortant(Request $request): Response
  643.     {
  644.         // $dossier = $this->em->getRepository(PDossier::class)->find($request->get('dossier'));
  645.         $reader = new Reader();
  646.         $spreadsheet $reader->load($request->files->get('file'));
  647.         $worksheet $spreadsheet->getActiveSheet();
  648.         $spreadSheetArys $worksheet->toArray();
  649.         unset($spreadSheetArys[0]);
  650.         $array = [];
  651.         // dd($spreadSheetArys);
  652.         $count 0;
  653.         foreach ($spreadSheetArys as $key => $sheet) {
  654.             $count++;
  655.             $contract $this->em->getRepository(LContract::class)->findOneBy(['id' => $sheet[0]]);
  656.             // $contract = $this->em->getRepository(LContract::class)->findOneBy(['id' => $sheet[0],'active' => true]);
  657.             if(!$contract) {
  658.                 return new JsonResponse('Contrat introuvable à la ligne '.($key 1).' !'500);                
  659.             } 
  660.             if(strtolower($contract->getEmploye()->getCin()) != strtolower($sheet[3])) {
  661.                 return new JsonResponse('le contrat n\'appartient pas à ce cin '.($key 1).' !'500);
  662.             }
  663.             
  664.             array_push($array, [
  665.                 'id' => $count,
  666.                 'nom' => $contract->getEmploye()->getNom(),
  667.                 'prenom' => $contract->getEmploye()->getPrenom(),
  668.                 'cin' => $contract->getEmploye()->getCin(),
  669.                 'contract_id' => $contract->getId(),
  670.                 'dossier' => $contract->getDossier()->getAbreviation(),
  671.                 'motif' => $sheet[5],
  672.                 'dateSortie' => $sheet[4],
  673.             ]);
  674.         }
  675.         return new JsonResponse($array);
  676.     }
  677.     #[Route('/app_salarie_import_sortant_save'name'app_salarie_import_sortant_save'options: ['expose' => true])]
  678.     public function app_salarie_import_sortant_save(Request $request): Response
  679.     {
  680.         $sortants json_decode($request->get('sortants'));
  681.         foreach ($sortants as $key => $sortant) {
  682.             $Lcontract $this->em->getRepository(LContract::class)->find($sortant->contract_id);
  683.             $this->disableContract($Lcontract$sortant->dateSortie$sortant->motif);
  684.         }
  685.         return new JsonResponse('Bien enregistrer');
  686.        
  687.     }
  688.     #[Route('/app_salarie_imprimer_attestation_salaire/{contract}/{credit}'name'app_salarie_imprimer_attestation_salaire'options: ['expose' => true])]
  689.     public function app_salarie_imprimer_attestation_salaire(Request $requestLContract $contract$credit): Response
  690.     {
  691.         $html="<div  style='text-align:justify; line-height:2.8; margin-left: 10px; margin-right: 10px;'>
  692.             <p>".$this->getParagraphAttestationSalaire($contract)[0]."
  693.                 <br/>
  694.                 <br/>
  695.                 ".$this->getCredit($credit)."
  696.             </p>
  697.             <br/>"
  698.         ;
  699.         if(in_array($contract->getDossier()->getAbreviation(), ['ISAA''IMIN']) ) {
  700.             $html .= "<p style='text-align: left;margin-top:30px; margin-right: 60px; font-weight: bold' >".$this->getParagraphAttestationSalaire($contract)[1]."</p>
  701.             </div>";
  702.         } else {
  703.             $html .= "<p style='text-align: left;margin-top:80px; margin-right: 60px; font-weight: bold' >".$this->getParagraphAttestationSalaire($contract)[1]."</p>
  704.             </div>";
  705.         }
  706.         $html $this->render("salarie/gestion_salarie/pdfs/attestation.html.twig", [
  707.             "titre" => "ATTESTATION DE SALAIRE",
  708.             "contract" => $contract,
  709.             "html" => $html,
  710.             'ref' => 'DRH-ATS-' $contract->getId() . '_' $this->calculPaieService->getPeriode()->getCode()
  711.         ])->getContent();
  712.         $mpdf = new Mpdf([
  713.             'mode' => 'utf-8',
  714.             'margin_left' => 25,
  715.             'margin_right' => 25
  716.         ]);
  717.         $mpdf->SetTitle('Attestation Salaire');
  718.         $mpdf->WriteHTML($html);
  719.         $mpdf->Output("Attestation Salaire " $contract->getEmploye()->getPrenom() . " " $contract->getEmploye()->getNom() . ".pdf""I");
  720.         die;
  721.     }
  722.     #[Route('/app_salarie_imprimer_attestation_travail/{contract}/{credit}'name'app_salarie_imprimer_attestation_travail'options: ['expose' => true])]
  723.     public function app_salarie_imprimer_attestation_travail(Request $requestLContract $contract$credit): Response
  724.     {
  725.         $html "<div  style='text-align:justify; line-height:2.8; margin-left: 10px; margin-right: 10px;'>
  726.             <p>" $this->getParagraphAttestationTravail($contract)[0] . "
  727.                 <br/>
  728.                 <br/>
  729.                 " $this->getCredit($credit) . "
  730.             </p>
  731.             <br/>
  732.             <p style='text-align: left;margin-top:80px; margin-right: 60px; font-weight: bold' >" $this->getParagraphAttestationTravail($contract)[1] . "</p>
  733.         </div>";
  734.         $html $this->render("salarie/gestion_salarie/pdfs/attestation.html.twig", [
  735.             "titre" => "ATTESTATION DE TRAVAIL",
  736.             "contract" => $contract,
  737.             "html" => $html,
  738.             'ref' => 'DRH-ATT-' $contract->getId() . '_' $this->calculPaieService->getPeriode()->getCode()
  739.         ])->getContent();
  740.         $mpdf = new Mpdf([
  741.             'mode' => 'utf-8',
  742.             'margin_left' => 25,
  743.             'margin_right' => 25
  744.         ]);
  745.         $mpdf->SetTitle('Attestation Travail');
  746.         // $mpdf->SetHTMLFooter(
  747.         //     $this->render("planification/pdfs/footer.html.twig")->getContent()
  748.         // );
  749.         $mpdf->WriteHTML($html);
  750.         $mpdf->Output("Attestation Travail " $contract->getEmploye()->getPrenom() . " " $contract->getEmploye()->getNom() . ".pdf""I");
  751.         die;
  752.     }
  753.     public function getCredit($credit)
  754.     {
  755.         switch ($credit) {
  756.             case 1:
  757.                 $result "Cette attestation est délivrée à l’intéressé(e) pour des raisons administratives et <b style='font-weight: bold'>ne peut nullement servir à la contractualisation d'un emprunt</b>.";
  758.                 break;
  759.             case 2:
  760.                 $result "Ce document est délivré à la demande de l’interesse(e) uniquement pour contracter un crédit de logement.";
  761.                 break;
  762.             case 3:
  763.                 $result "Cette attestation est délivré(e) à l’interesse(e) pour servir et valoir ce que de droit.";
  764.                 break;
  765.         }
  766.         return $result;
  767.     }
  768.     public function getParagraphAttestationTravail($contract)
  769.     {
  770.         if ($contract->getEmploye()->getSexe() == 'M') {
  771.             $nomPrenom 'M. ' $contract->getEmploye()->getPrenom() . ' ' $contract->getEmploye()->getNom();
  772.         } elseif ($contract->getEmploye()->getSexe() == 'F') {
  773.             $nomPrenom 'Mme ' $contract->getEmploye()->getPrenom() . ' ' $contract->getEmploye()->getNom();
  774.         } else {
  775.             $nomPrenom $contract->getEmploye()->getPrenom() . ' ' $contract->getEmploye()->getNom();
  776.         }
  777.         switch ($contract->getDossier()->getAbreviation()) {
  778.             case 'SLMG':
  779.                 $paragraph "Nous soussignés,<b style='font-weight: bold'> " $contract->getDossier()->getDesignation() . ",</b> csis au : 5 Rue Hussein 1er, Rabat, attestons par la présente que <b style='font-weight: bold'> " $nomPrenom " </b> titulaire de la CNI n° <b style='font-weight: bold'> " $contract->getEmploye()->getCin() . " </b>, est employée au sein de notre établissement en qualité de(d') <b style='font-weight: bold'> " $contract->getFonction()->getDesignation() . " </b> auprès de (du) <b style='font-weight: bold'>" $contract->getDossier()->getDesignation() . "</b>, et ce depuis le <b style='font-weight: bold'> " date_format($contract->getDateAnciennete(), 'd/m/Y') . ".</b>";
  780.                 $dossier=$this->em->getRepository(PDossier::class)->findOneBy(['abreviation'=>'SFCZ'])->getDesignation();
  781.                 break;
  782.             case 'PGRO':
  783.                 $paragraph "<p >Nous soussignés,<b style='font-weight: bold'> " $contract->getDossier()->getDesignation() . ",</b> , société à responsabilité limitée, au capital social 1.000.000 dirhams, immatriculée au registre de commerce de rabat sous n°136363, sise à : Avenue Allal El Fassi, Madinat Al Irfane, Hay Riad, Rabat, attestons par la présente que  <b style='font-weight: bold'> " $nomPrenom " </b> titulaire de la CNI n° <b style='font-weight: bold'> " $contract->getEmploye()->getCin() . " </b>, est employé(e) au sein de notre établissement depuis le <b style='font-weight: bold'> " date_format($contract->getDateAnciennete(), 'd/m/Y') . ".</b>
  784.             <br/>
  785.             <b style='font-weight: bold'> " $nomPrenom " occupe actuellement le poste de « " $contract->getFonction()->getDesignation() . " ». </b> ";
  786.                 $dossier $contract->getDossier()->getDesignation();
  787.                 break;
  788.             case 'PSMS':
  789.                 $paragraph "<p >Nous soussignés,<b style='font-weight: bold'> " $contract->getDossier()->getDesignation() . ",</b> , société à responsabilité limitée, au capital social 1.000.000 dirhams, immatriculée au registre de commerce de rabat sous n°136363, sise à : Avenue Allal El Fassi, Madinat Al Irfane, Hay Riad, Rabat, attestons par la présente que  <b style='font-weight: bold'> " $nomPrenom " </b> titulaire de la CNI n° <b style='font-weight: bold'> " $contract->getEmploye()->getCin() . " </b>, est employé(e) au sein de notre établissement depuis le <b style='font-weight: bold'> " date_format($contract->getDateAnciennete(), 'd/m/Y') . ".</b>
  790.             <br/>
  791.             <b style='font-weight: bold'> " $nomPrenom " occupe actuellement le poste de « " $contract->getFonction()->getDesignation() . " ». </b> ";
  792.                 $dossier $contract->getDossier()->getDesignation();
  793.                 break;
  794.             case 'ISAA':
  795.                 $paragraph "<p >Nous soussignés,<b style='font-weight: bold'> " $contract->getDossier()->getDesignation() . ",</b>société à responsabilité limitée, au capital social 1.000.000 dirhams, immatriculée au registre de commerce de rabat sous n°148587, sise à : 23,Rue Amrou Bennaceur Zemmouri Agdal-Riad 10000 Rabat, attestons par la présente que  <b style='font-weight: bold'> " $nomPrenom " </b>
  796.             titulaire de la CNI n° <b style='font-weight: bold'> " $contract->getEmploye()->getCin() . " </b>, est employé(e) au sein de notre établissement depuis le <b style='font-weight: bold'> " date_format($contract->getDateAnciennete(), 'd/m/Y') . " .</b>
  797.             <br/>
  798.             <b style='font-weight: bold'> " $nomPrenom " occupe actuellement le poste de « " $contract->getFonction()->getDesignation() . " ». </b> ";
  799.                 $dossier $contract->getDossier()->getDesignation();
  800.                 break;
  801.             default:
  802.                 $paragraph "Nous soussignés,<b style='font-weight: bold'> la Fondation Cheikh Zaid Ibn Soltan,</b> créée par Dahir portant loi <b style='font-weight: bold'> n°1-93-228 du 22 rabii I 1414 </b>(10 septembre 1993), sise au: Avenue Allal El Fassi, Madinat Al Irfane, Hay Riad Rabat, attestons par la présente que <b style='font-weight: bold'> " $nomPrenom " </b> titulaire de la CNI n° <b style='font-weight: bold'> " $contract->getEmploye()->getCin() . ($contract->getCnss() ? "</b>, immatriculé(e) à la CNSS sous le N° <b style='font-weight: bold'> " $contract->getCnss() : "") ."</b>
  803.                  , est employé(e) au sein de notre établissement auprès de <b style='font-weight: bold'>«" $contract->getDossier()->getDesignation() . "»</b>, et ce depuis le <b style='font-weight: bold'> " date_format($contract->getDateAnciennete(), 'd/m/Y') . ".</b>
  804.                 
  805.             <br/>
  806.             <b style='font-weight: bold'> " $nomPrenom "</b> occupe actuellement le poste de <b style='font-weight: bold'>« " $contract->getFonction()->getDesignation() . " ». </b>";
  807.                 $dossier $this->em->getRepository(PDossier::class)->findOneBy(['abreviation' => 'SFCZ'])->getDesignation();
  808.                 break;
  809.         }
  810.         $result '';
  811.         return [$paragraph$dossier];
  812.     }
  813.     public function getParagraphAttestationSalaire($contract)
  814.     {
  815.         if ($contract->getEmploye()->getSexe() == 'M') {
  816.             $nomPrenom 'M. ' $contract->getEmploye()->getPrenom() . ' ' $contract->getEmploye()->getNom();
  817.         } elseif ($contract->getEmploye()->getSexe() == 'F') {
  818.             $nomPrenom 'Mme ' $contract->getEmploye()->getPrenom() . ' ' $contract->getEmploye()->getNom();
  819.         } else {
  820.             $nomPrenom $contract->getEmploye()->getPrenom() . ' ' $contract->getEmploye()->getNom();
  821.         }
  822.         $date = new \DateTime('now');
  823.         $previousMonth=$date->modify('-1 month')->format('mY');
  824.         $previousPeriode $this->em->getRepository(Periode::class)->findOneBy(['code' => $previousMonth]);
  825.         // dd($previousPeriode);
  826.         $salairetheo $this->em->createQueryBuilder()
  827.             ->select('contractTheorique.montant')
  828.             ->from(Tbulletin::class, 'b')
  829.             ->innerJoin('b.contract''contract')
  830.             ->innerJoin('b.contractNetTheoriques''contractTheorique')
  831.             ->where('contract = :contractId')
  832.             ->andWhere('b.periode = :periode')
  833.             ->andWhere('b.active = 1')
  834.             ->setParameter('contractId'$contract)
  835.             ->setParameter('periode'$previousPeriode)
  836.             ->getQuery()
  837.             ->getOneOrNullResult();
  838.         $salaire $salairetheo['montant'];
  839.         // dd($salaire);
  840.         $obj = new nuts($salaire"MAD");
  841.         $text $obj->convert("fr-FR");
  842.         $salaire number_format($salaire2','' ');
  843.         switch ($contract->getDossier()->getAbreviation()) {
  844.             case 'SLMG':
  845.                 $paragraph "Nous soussignés,<b style='font-weight: bold'>  " $contract->getDossier()->getDesignation() . ",</b> sis au : 5 Rue Hussein 1er, Rabat attestons par la présente que <b style='font-weight: bold'> " $nomPrenom " </b> titulaire de la CNI n° <b style='font-weight: bold'> " $contract->getEmploye()->getCin() . " </b>, perçoit un salaire mensuel de <b style='font-weight: bold'>" $salaire "  dhs</b> (" $text ").";
  846.                 $dossier=$this->em->getRepository(PDossier::class)->findOneBy(['abreviation'=>'SFCZ'])->getDesignation();
  847.                 break;
  848.             case 'PGRO':
  849.                 $paragraph "Nous soussignés,<b style='font-weight: bold'>  " $contract->getDossier()->getDesignation() . ",</b> société à responsabilité limitée, au capital social 1.000.000 dirhams, immatriculée au registre de commerce de rabat sous n°136363, sise à : Avenue Allal El Fassi, Madinat Al Irfane, Hay Riad, Rabat, attestons par la présente que  <b style='font-weight: bold'> " $nomPrenom " </b> titulaire de la CNI n° <b style='font-weight: bold'> " $contract->getEmploye()->getCin() . " </b>, perçoit un salaire mensuel net de <b style='font-weight: bold'>" $salaire "  dhs</b> (" $text ").";
  850.                 $dossier $contract->getDossier()->getDesignation();
  851.                 break;
  852.             case 'PSMS':
  853.                 $paragraph "Nous soussignés,<b style='font-weight: bold'>  " $contract->getDossier()->getDesignation() . ",</b> société à responsabilité limitée, au capital social 1.000.000 dirhams, immatriculée au registre de commerce de rabat sous n°148835, sise à : 04 Rue Nopalea,lot 4 secteur 17,bloc I, Hay Riad, Rabat, attestons par la présente que <b style='font-weight: bold'> " $nomPrenom " </b> titulaire de la CNI n° <b style='font-weight: bold'> " $contract->getEmploye()->getCin() . " </b>, perçoit un salaire mensuel de <b style='font-weight: bold'>" $salaire "  dhs</b> (" $text ").";
  854.                 $dossier $contract->getDossier()->getDesignation();
  855.                 break;
  856.             case 'ISAA':
  857.                 $paragraph "Nous soussignés,<b style='font-weight: bold'>  " $contract->getDossier()->getDesignation() . ",</b> société à responsabilité limitée, au capital social 1.000.000 dirhams, immatriculée au registre de commerce de rabat sous n°148587, sise à : 23,Rue Amrou Bennaceur Zemmouri Agdal-Riad 10000 Rabat, attestons par la présente que  <b style='font-weight: bold'> " $nomPrenom " </b> titulaire de la CNI n° <b style='font-weight: bold'> " $contract->getEmploye()->getCin() . " </b>, perçoit un salaire mensuel de <b style='font-weight: bold'>" $salaire "  dhs</b> (" $text "). ";
  858.                 $dossier $contract->getDossier()->getDesignation();
  859.                 break;
  860.             default:
  861.                 $paragraph "Nous soussignés,<b style='font-weight: bold'> la Fondation Cheikh Zaid Ibn Soltan,</b> créée par Dahir portant loi <b style='font-weight: bold'> n°1-93-228  du 22 rabii I 1414 </b>(10 septembre 1993), sise à : Avenue Allal El Fassi, Madinat Al Irfane, Hay Riad Rabat, attestons par la présente que <b style='font-weight: bold'> " $nomPrenom " </b> titulaire de la CNI n° <b style='font-weight: bold'> " $contract->getEmploye()->getCin() . " </b>, perçoit un salaire mensuel net de <b style='font-weight: bold'> " $salaire "  dhs</b> (" $text "). ";
  862.                 $dossier $this->em->getRepository(PDossier::class)->findOneBy(['abreviation' => 'SFCZ'])->getDesignation();
  863.                 break;
  864.         }
  865.         return [$paragraph$dossier];
  866.     }
  867.     public function CalculNetTheorique($contract)
  868.     {
  869.         $rubriqueSalaireBase $this->em->getRepository(Prubrique::class)->find(1);
  870.         $baremeBruteSalaireDeBase $this->em->getRepository(PbaremeBrute::class)->findOneBy(['bareme' => $contract->getBareme(), 'rubrique' => $rubriqueSalaireBase'active' => true]);
  871.         $salaireBaseTheorique round(26 $baremeBruteSalaireDeBase->getTauxPs(), 2);
  872.         $salaire $salaireBaseTheorique;
  873.         $sommeCotisation 0;
  874.         $sommeCotisationTheorique 0;
  875.         $irNet 0;
  876.         $irNetTheorique 0;
  877.         $salaireBrute 0;
  878.         $sommePrelevement 0;
  879.         // $salaireBruteImposable = $salaireBrute = $salaireBase;
  880.         $salaireImposableTheorique 0;
  881.         $salaireNetImposable 0;
  882.         $salaireNetImposableTheorique 0;
  883.         // calculPrime
  884.         $primes $this->em->getRepository(PbaremeBrute::class)->findBy(['type' => 'prime''bareme' => $contract->getBareme(), 'active' => true]);
  885.         $countPrime 0;
  886.         foreach ($primes as $prime) {
  887.             $countPrime++;
  888.             $salaire += round($prime->getMontant(), 2);
  889.         }
  890.         // dd($primes);
  891.         if ($contract->getPnatureContract()->getType()->getId() == 1) {
  892.             // calculAnciennete();
  893.             $vmatirxAnciennte $this->em->getRepository(VMatrix::class)->getNombreAnneeAnciennte($contract->getDateAnciennete());
  894.             if ($vmatirxAnciennte) {
  895.                 $salaire += round($salaireBaseTheorique * ($vmatirxAnciennte->getTaux() / 100), 2);
  896.                 $salaireImposableTheorique round($salaireBaseTheorique + ($salaireBaseTheorique * ($vmatirxAnciennte->getTaux() / 100)), 2);
  897.             }
  898.             // calculCotisationCnss();
  899.             $cotisationscnss $this->em->getRepository(VMatrix::class)->findBy(['type' => ['cnss']]);
  900.             $count 0;
  901.             foreach ($cotisationscnss as $cotisation) {
  902.                 $count++;
  903.                 if ($cotisation->getPlafond() > && $salaireImposableTheorique $cotisation->getPlafond()) {
  904.                     $sommeCotisationTheorique += round(($cotisation->getPlafond() * ($cotisation->getTaux() / 100)), 2);
  905.                 } else {
  906.                     $sommeCotisationTheorique += round(($salaireImposableTheorique * ($cotisation->getTaux() / 100)), 2);
  907.                 }
  908.             }
  909.             // calculCotisationCimr();
  910.             $cotisationscimr $this->em->getRepository(PBaremeCimr::class)->findBy(['type' => ['cimr'], 'bareme' => $contract->getBareme()]);
  911.             foreach ($cotisationscimr as $cotisation) {
  912.                 $sommeCotisationTheorique += round($salaireImposableTheorique * ($cotisation->getTaux() / 100), 2);
  913.             }
  914.         }
  915.         // dd($sommeCotisationTheorique,$salaireImposableTheorique);
  916.         //calculPrelevementIr();
  917.         $pourcentage $contract->getPnatureContract()->getTauxIr() / 100;
  918.         if (!$pourcentage) {
  919.             $salaireNetImposableTheorique $salaireImposableTheorique - ($sommeCotisationTheorique + ($salaireImposableTheorique 0.2));
  920.             $cotisationTheorique $this->em->getRepository(VMatrix::class)->getTauxIr($salaireNetImposableTheorique);
  921.             if ($cotisationTheorique) {
  922.                 $irBruteTheorique round(($salaireNetImposableTheorique * ($cotisationTheorique->getTaux() / 100)) - $cotisationTheorique->getPlafond(), 2);
  923.                 $irNetTheorique round($irBruteTheorique - ($contract->getPriseEnCharge() * $cotisationTheorique->getTauxACharge()), 2);
  924.                 if ($irNetTheorique 0) {
  925.                     $irNetTheorique 0;
  926.                 }
  927.             }
  928.         } else {
  929.             $irNetTheorique round($salaire $pourcentage2);
  930.             if ($irNetTheorique 0) {
  931.                 $irNetTheorique 0;
  932.             }
  933.         }
  934.         // calculElementFixe();
  935.         foreach ($contract->getActiveElementFixes() as $key => $elementFixe) {
  936.             if ($elementFixe->getSens() == 1) {
  937.                 $salaire += round($elementFixe->getMontant(), 2);
  938.             } else {
  939.                 $salaire -= round($elementFixe->getMontant(), 2);
  940.             }
  941.         }
  942.         // dd($contract->getActiveElementFixes());
  943.         // calculElementEcheance();
  944.         // !!! $elementEcheances = $this->em->getRepository(LElementEcheance::class)->findBy(['contract' => $this->contract, 'periode' => $this->periode, 'active' => true]);
  945.         $salaire -= ($sommeCotisationTheorique $irNetTheorique);
  946.         $salaire round($salaire2);
  947.         return $salaire;
  948.     }
  949.     #[Route('/check_bulletin'name'app_salarie_check_bulletin'options: ['expose' => true])]
  950.     public function checkBulletin(Request $request): Response
  951.     {
  952.         $periode=$this->calculPaieService->getPeriode();
  953.         $contract $this->em->getRepository(LContract::class)->find($request->get('contract'));
  954.         $bulletin $this->em->getRepository(Tbulletin::class)->findOneBy(['contract' => $contract,'periode' => $periode 'active' => true]);
  955.         // dd($bulletin,$contract,$periode);
  956.         
  957.         if ($bulletin) {
  958.             $messageError sprintf(
  959.                 "Le bulletin associé à ce contrat (ID: %d) a été calculé. Vous ne pouvez pas ".$request->get('button')." ce contrat.",
  960.                 $contract->getId()
  961.             );
  962.             return new JsonResponse(['error' => $messageError] );
  963.         }
  964.     
  965.         return new JsonResponse(['success' => true]);
  966.     }
  967. }