<?php
namespace App\Controller\Paie;
use App\Entity\PPiece;
use App\Entity\PDevise;
use App\Entity\PStatut;
use App\Entity\PDossier;
use App\Entity\Pemploye;
use App\Entity\LContract;
use App\Entity\PPaiement;
use App\Entity\Prubrique;
use App\Entity\Tbulletin;
use App\Entity\PBordereau;
use App\Entity\TbulletinLg;
use App\Entity\PnatureContract;
use App\Controller\ApiController;
use App\Service\CalculPaieService;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
#[Route('/paie/stc')]
class StcController extends AbstractController
{
private $em;
private $calculPaieService;
private $api;
public function __construct(ManagerRegistry $doctrine, CalculPaieService $calculPaieService, ApiController $api)
{
$this->em = $doctrine->getManager();
$this->calculPaieService = $calculPaieService;
$this->api = $api;
}
#[Route('/', name: 'app_paie_stc')]
public function index(Request $request): Response
{
$operations = $this->api->check($this->getUser(), 'app_paie_stc', $this->em, $request);
if(!is_array($operations)) {
return $this->redirectToRoute('app_site');
}elseif(count($operations) == 0) {
return $this->render('includes/404.html.twig');
}
$paiements = $this->em->getRepository(PPaiement::class)->findBy(['active' => true]);
// dd($employes);
return $this->render('paie/stc/index.html.twig', [
'operations' => $operations,
'paiements' => $paiements,
]);
}
#[Route('/app_paie_stc_insert', name: 'app_paie_stc_insert', options: ['expose' => true])]
public function app_paie_stc_insert(Request $request): Response
{
$devise = $this->em->getRepository(PDevise::class)->find(1);
// $paiement = $this->em->getRepository(PPaiement::class)->find(2);
$paiement = $this->em->getRepository(PPaiement::class)->find($request->get('paiement'));
$periode = $this->calculPaieService->getPeriode();
$observation = $request->get('observation');
// dd($paiement,$request->get('paiement'));
if($periode->IsValider()) {
return new JsonResponse('Periode est valider !', 500, [], JSON_UNESCAPED_UNICODE);
}
$stcs = json_decode($request->get('stcs'));
// dd($stcs);
$netAPayer = $this->em->getRepository(Prubrique::class)->find(5);
$bordoreauIds = [];
foreach($stcs as $key => $dossierKey) {
$dossier = $this->em->getRepository(PDossier::class)->find($key);
foreach ($dossierKey as $key => $natureKey) {
$bordoreau = new PBordereau;
$bordoreau->setPiece($this->em->getRepository(PPiece::class)->find(14));
$bordoreau->setNatureContract($this->em->getRepository(PnatureContract::class)->find($key));
$bordoreau->setStatut(
$this->em->getRepository(PStatut::class)->find(1)
);
$bordoreau->setPeriode($periode);
$bordoreau->setType('stc');
$bordoreau->setPaiement($paiement);
$bordoreau->setDevise($devise);
$bordoreau->setUserCreated($this->getUser());
$bordoreau->setObservation($observation);
$bordoreau->setDossier($dossier);
$this->em->persist($bordoreau);
foreach($natureKey as $key => $stc) {
$contract = $this->em->getRepository(LContract::class)->find($stc->contract);
$bulletin = new Tbulletin();
$bulletin->setDossier($dossier);
$bulletin->setDevise($devise);
$bulletin->setPaiement($paiement);
$bulletin->setObservation($observation);
$bulletin->setBordereau($bordoreau);
$bulletin->setContract($contract);
$bulletin->setPeriode($periode);
$bulletin->setPPiece(
$this->em->getRepository(PPiece::class)->find(13)
);
$this->em->persist($bulletin);
$bulletinDet = new TbulletinLg();
$bulletinDet->setBulletin($bulletin);
$bulletinDet->setRubrique($netAPayer);
$bulletinDet->setSens(1);
$bulletinDet->setMontant($stc->montant);
$this->em->persist($bulletinDet);
$bulletinDet = new TbulletinLg();
$bulletinDet->setBulletin($bulletin);
$bulletinDet->setRubrique($this->em->getRepository(Prubrique::class)->find(64));
$bulletinDet->setSens(1);
$bulletinDet->setMontant($stc->montant);
$this->em->persist($bulletinDet);
$contract->getEmploye()->setStc(true);
}
$this->em->flush();
array_push($bordoreauIds, $bordoreau->getId());
}
}
$bordoreauIds = array_unique($bordoreauIds);
if(count($bordoreauIds) > 0) {
$request->request->add(['bordoreauIds' => json_encode($bordoreauIds)]);
}
return new JsonResponse('Bien Enregistrer!');
}
#[Route('/app_paie_stc_list', name: 'app_paie_stc_list', options: ['expose' => true])]
public function app_paie_stc_list(Request $request,): Response
{
// $date = new \DateTime($periode);
$draw = $request->query->get('draw');
$start = $request->query->get('start') ?? 0;
$length = $request->query->get('length') ?? 10;
$search = $request->query->all('search')["value"];
$orderColumnIndex = $request->query->all('order')[0]['column'];
$orderColumn = $request->query->all("columns")[$orderColumnIndex]['name'];
$orderDir = $request->query->all('order')[0]['dir'] ?? 'asc';
$queryBuilder = $this->em->createQueryBuilder()
->select('b.code as bulletin, b.id as bulletin_id, periode.code as periode_code,dossier.abreviation as dossier_abreviation, contract.id as id, contract.code as contract_code, p.nom as nom, contract.id as matricule , p.prenom')
->from(LContract::class, 'contract')
->innerJoin('contract.employe', 'p')
->innerJoin('contract.bulletins', 'b')
->innerJoin('b.piece', 'piece')
->innerJoin('contract.dossier', 'dossier')
->innerJoin('b.periode', 'periode')
->andWhere('piece.id = 13')
->andWhere('b.active = 1')
;
if (!empty($search)) {
$queryBuilder->andWhere('(dossier.abreviation LIKE :search OR periode.code LIKE :search OR contract.code LIKE :search OR b.code LIKE :search OR p.matricule LIKE :search OR p.nom LIKE :search OR p.prenom LIKE :search)')
->setParameter('search', "%$search%");
}
if (!empty($orderColumn)) {
$queryBuilder->orderBy("$orderColumn", $orderDir);
}
$filteredRecords = count($queryBuilder->getQuery()->getResult());
// Paginate results
$queryBuilder->setFirstResult($start)
->setMaxResults($length)
->orderBy('b.id', 'DESC');
$results = $queryBuilder->getQuery()->getResult();
// dd($results);
foreach ($results as $key => $contract) {
$results[$key]['DT_RowId'] = $contract['id'];
$results[$key]['nombreJourTravails'] = "-";
$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>';
$results[$key]['problemes'] = '<i class="fa-solid fa-circle-check text-success"></i>';
}
// dd($results);
$totalRecords = $this->em->createQueryBuilder()
->select('COUNT(d.id)')
->from(LContract::class, 'd')
->innerJoin('d.bulletins', 'bulletins')
->innerJoin('bulletins.piece', 'piece')
->Where('d.active = 1')
->andWhere('piece.id = 13')
->getQuery()
->getSingleScalarResult();
return new JsonResponse([
'draw' => $draw,
'recordsTotal' => $totalRecords,
'recordsFiltered' => $filteredRecords,
'data' => $results,
]);
}
#[Route('/app_stc_employe', name: 'app_stc_employe', options: ['expose' => true])]
public function app_stc_employe(Request $request,): Response
{
$employes = $this->em->getRepository(Pemploye::class)->findEmployeesWithLastContract($request->query->get("search"));
// dd($employes);
return new JsonResponse($employes);
}
}