<?php
namespace App\Controller\Mouvement;
use App\Entity\LContract;
use App\Entity\Prubrique;
use App\Controller\ApiController;
use App\Entity\PDossier;
use App\Entity\PPiece;
use App\Entity\PPrelevement;
use App\Entity\PPrelevementLg;
use PhpOffice\PhpSpreadsheet\Reader\Xlsx as Reader;
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\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
#[Route('/mouvement/prets')]
class PretsController 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_mouvement_prets')]
public function index(Request $request): Response
{
$dossier = $request->getSession()->get('dossier');
$operations = $this->api->check($this->getUser(), 'app_mouvement_prets', $this->em, $request);
if(!is_array($operations)) {
return $this->redirectToRoute('app_site');
}elseif(count($operations) == 0) {
return $this->render('includes/404.html.twig');
}
$contracts = $this->em->getRepository(LContract::class)->findContractAndRib($dossier);
$elements = $this->em->getRepository(Prubrique::class)->findBy(['prets' => true, 'active' => true]);
return $this->render('mouvement/prets/index.html.twig', [
'operations' => $operations,
'elements' => $elements,
'contracts' => $contracts,
]);
}
#[Route('/app_mouvement_prets_ajouter', name: 'app_mouvement_prets_ajouter', options: ['expose' => true])]
public function app_mouvement_prets_ajouter(Request $request): Response
{
// dd($request);
$dossier = $this->em->getRepository(PDossier::class)->find($request->getSession()->get('dossier'));
$prets = json_decode($request->get('prets'));
$prelevement = new PPrelevement();
$prelevement->setDossier($dossier);
$prelevement->setMotif($request->get('motif'));
$prelevement->setPiece(
$this->em->getRepository(PPiece::class)->find(7)
);
$prelevement->setRubrique(
$this->em->getRepository(Prubrique::class)->find($request->get('element'))
);
$prelevement->setContract(
$this->em->getRepository(LContract::class)->find($request->get('contract'))
);
$prelevement->setUserCreated($this->getUser());
$prelevement->setMontant($request->get('montantpret'));
$prelevement->setMontantEcheance($request->get('montantecheance'));
$prelevement->setDateDebut(new \DateTime($request->get('periode').'-01'));
$prelevement->setNombreMois(count($prets));
$this->em->persist($prelevement);
foreach ($prets as $key => $pret) {
$prelevementDet = new PPrelevementLg();
$prelevementDet->setPeriode(
$this->calculPaieService->getPeriode($pret->periode)
);
$prelevementDet->setMontant($pret->montant);
$prelevementDet->setPrelevement($prelevement);
$this->em->persist($prelevementDet);
}
$this->em->flush();
return new JsonResponse('Bien enregister!');
}
#[Route('/app_mouvement_prets_list', name: 'app_mouvement_prets_list', options: ['expose' => true])]
public function app_mouvement_prets_list(Request $request): Response
{
$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';
$dossier = $request->getSession()->get('dossier');
$queryBuilder = $this->em->createQueryBuilder()
->select('p.id, p.active, c.id as contract_id, p.code as code, p.created as created,emp.nom, emp.prenom, r.designation as rubrique, p.montant, p.nombreMois, p.motif')
->from(PPrelevement::class, 'p')
->innerJoin('p.contract', 'c')
->innerJoin('p.rubrique', 'r')
->innerJoin('c.employe', 'emp')
->innerJoin('p.dossier', 'd')
// ->andWhere('p.active = 1')
->andWhere('d = :dossier')
->setParameter('dossier', $dossier)
;
// $results = $queryBuilder->getQuery()->getResult();
// dd($results);
// Apply search query
// dd($queryBuilder);
if (!empty($search)) {
$queryBuilder->andWhere('(p.code LIKE :search OR emp.nom LIKE :search OR emp.prenom LIKE :search OR r.designation LIKE :search OR p.motif LIKE :search)')
->setParameter('search', "%$search%");
}
if (!empty($orderColumn)) {
$queryBuilder->orderBy("$orderColumn", $orderDir);
}
$filteredRecords = count($queryBuilder->getQuery()->getResult());
// Paginate results
$queryBuilder->setFirstResult($start)
->setMaxResults($length);
$results = $queryBuilder->getQuery()->getResult();
// dd($results);
// foreach ($results as $key => $prelevement) {
// $results[$key]['DT_RowId'] = $prelevement['id'];
// $results[$key]['validate'] = count($);
// $results[$key]['salaire'] = $this->em->getRepository(LContract::class)->getNetAPaye($periode, $contract['id']);
// $results[$key]['problemes'] = $this->em->getRepository(Probleme::class)->checkIfTheresProblemes($periode, $contract['id']);
// }
// dd($results);
$totalRecords = $this->em->createQueryBuilder()
->select('COUNT(b.id)')
->from(PPrelevement::class, 'b')
// ->andWhere('b.active = 1')
->andWhere('b.dossier = :dossier')
->setParameter('dossier', $dossier)
->getQuery()
->getSingleScalarResult();
return new JsonResponse([
'draw' => $draw,
'recordsTotal' => $totalRecords,
'recordsFiltered' => $filteredRecords,
'data' => $results,
]);
}
#[Route('/app_mouvement_prets_detail/{prelevement}', name: 'app_mouvement_prets_detail', options: ['expose' => true])]
public function app_mouvement_prets_detail(PPrelevement $prelevement): Response
{
$html = $this->renderView('mouvement/prets/includes/details.html.twig', [
'prelevement' => $prelevement
]);
return new JsonResponse($html);
}
#[Route('/app_mouvement_prets_ajouter_all', name: 'app_mouvement_prets_ajouter_all', options: ['expose' => true])]
public function app_mouvement_prets_ajouter_all(Request $request): Response
{
$reader = new Reader();
$spreadsheet = $reader->load($request->files->get('file'));
$worksheet = $spreadsheet->getActiveSheet();
$spreadSheetArys = $worksheet->toArray();
unset($spreadSheetArys[0]);
$count = 0;
// dd($spreadSheetArys);
$now = new \DateTime();
foreach ($spreadSheetArys as $key => $sheet) {
$contract = $this->em->getRepository(LContract::class)->findOneBy(['id' => $sheet[0], 'active' => true]);
$montantpret = $total = round($sheet[3], 2);
$montantecheance = round($sheet[4], 2);
$dateDebut = new \DateTime($sheet[1]);
if($dateDebut < $now->modify('first day of this month')) {
return new JsonResponse('Date debut erroné à la ligne '.($key).' !', 500);
}
$element = $this->em->getRepository(Prubrique::class)->findOneBy(['id' => $sheet[2], 'prets' => true]);
if(!$contract) {
return new JsonResponse('Contrat introuvable à la ligne '.($key).' !', 500);
}
if(!$element) {
return new JsonResponse('Element introuvable à la ligne '.($key).' !', 500);
}
$months = $montantpret / $montantecheance;
if ($months != floor(abs($months))) {
$months = floor(abs($months)) + 1;
}
$prelevement = new PPrelevement();
$prelevement->setDossier($contract->getDossier());
$prelevement->setMotif($sheet[5]);
$prelevement->setPiece(
$this->em->getRepository(PPiece::class)->find(7)
);
$prelevement->setRubrique($element);
$prelevement->setContract($contract);
$prelevement->setUserCreated($this->getUser());
$prelevement->setMontant($montantpret);
$prelevement->setMontantEcheance($montantecheance);
$prelevement->setDateDebut($dateDebut);
$prelevement->setNombreMois($months);
$this->em->persist($prelevement);
// dd($months);
for ($i=0; $i < $months; $i++) {
$newDate = clone $dateDebut;
$newDate = $newDate->add(new \DateInterval('P' . $i . 'M'));
// dump($newDate, $i);
if($total <= $montantecheance) {
$prelevementDet = new PPrelevementLg();
$prelevementDet->setPeriode(
$this->calculPaieService->getPeriode($newDate->format('mY'))
);
$prelevementDet->setMontant($total);
$prelevementDet->setPrelevement($prelevement);
$this->em->persist($prelevementDet);
// prets.push({'montant': total, 'periode' : (newDate.getMonth() + 1).toString().padStart(2, '0')+''+newDate.getFullYear()});
} else {
$total = $total - $montantecheance;
$prelevementDet = new PPrelevementLg();
$prelevementDet->setPeriode(
$this->calculPaieService->getPeriode($newDate->format('mY'))
);
$prelevementDet->setMontant($montantecheance);
$prelevementDet->setPrelevement($prelevement);
$this->em->persist($prelevementDet);
// prets.push({'montant': montantecheance, 'periode' : (newDate.getMonth() + 1).toString().padStart(2, '0') +''+newDate.getFullYear()});
}
}
// die;
}
$this->em->flush();
return new JsonResponse('Bien enregister!');
}
#[Route('/app_mouvement_prets_disable', name: 'app_mouvement_prets_disable', options: ['expose' => true])]
public function app_mouvement_prets_disable(Request $request)
{
// dd($request);
$motif = $request->get('motif');
$pretIds = json_decode($request->get('pretIds'));
foreach ($pretIds as $key => $pretId) {
$pret = $this->em->getRepository(PPrelevement::class)->find($pretId);
$pret->setMotif($motif);
$pret->setActive(false);
}
$this->em->flush();
return new JsonResponse("Bien Enregistrer");
}
}