<?php
namespace App\Controller;
use App\Entity\Archivearticle;
use App\Entity\Articleimportdirect;
use App\Entity\Devis;
use App\Entity\Historiquedemandedevis;
use App\Entity\Historiqueproduit;
use App\Entity\Importdirect;
use App\Entity\Intervention;
use App\Entity\Produit;
use App\Form\DevisfffType;
use App\Form\DevisTechType;
use App\Form\DevisType;
use App\Repository\AiguillesRepository;
use App\Repository\ArchivearticleRepository;
use App\Repository\ArticleimportdirectRepository;
use App\Repository\ClientRepository;
use App\Repository\CourroieRepository;
use App\Repository\DevisRepository;
use App\Repository\FamillesdarticlesRepository;
use App\Repository\FamillesRepository;
use App\Repository\FournisseurRepository;
use App\Repository\GestionmachinesRepository;
use App\Repository\HistoriquedemandedevisRepository;
use App\Repository\HistoriqueinterventionRepository;
use App\Repository\HistoriqueproduitRepository;
use App\Repository\ImportdirectRepository;
use App\Repository\InterventionRepository;
use App\Repository\MachineInterventionRepository;
use App\Repository\MessageerreurRepository;
use App\Repository\PaymentdeviRepository;
use App\Repository\PlatinesRepository;
use App\Repository\ProduitRepository;
use App\Repository\UserRepository;
use App\Service\BlStockMovementFusionService;
use App\Service\DevisStockArchiveSynchronizer;
use DateTimeZone;
use Doctrine\ORM\EntityManagerInterface;
use Dompdf\Dompdf;
use Dompdf\Options;
use NumberFormatter;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\Routing\Annotation\Route;
use DateTime;
use Symfony\Component\Security\Core\Security;
use NumberToWords\NumberToWords;
#[Route('/devis')]
class DevisController extends AbstractController
{
private function formatMontant(float $montant): string
{
return number_format(max(0, round($montant, 3)), 3, '.', '');
}
private function recalculerMontantNetFacture(
Devis $facture,
DevisRepository $devisRepository,
PaymentdeviRepository $paymentdeviRepository
): void {
$documentsLies = $devisRepository->createQueryBuilder('document')
->where('(document.statut = :statutRetour AND document.frtour = :factureId)')
->orWhere('(document.statut = :statutAvoir AND document.fav = :factureId)')
->setParameter('statutRetour', 'Facture-R')
->setParameter('statutAvoir', 'Facture-A')
->setParameter('factureId', (string) $facture->getId())
->getQuery()
->getResult();
$totalDocuments = 0.0;
foreach ($documentsLies as $document) {
$totalDocuments += (float) ($document->getTotalttc() ?? 0);
}
$totalFacture = (float) ($facture->getTotalttc() ?? 0);
$montantNet = max(0, $totalFacture - $totalDocuments);
$facture->setMontantNet(
count($documentsLies) > 0 ? $this->formatMontant($montantNet) : null
);
$paymentdevi = $paymentdeviRepository->findOneBy(['devis' => $facture]);
if ($paymentdevi) {
$totalRegle = 0.0;
foreach ($paymentdevi->getHistoriquepaiementsdevis() as $historique) {
$totalRegle += (float) ($historique->getAcompte() ?? 0);
$totalRegle += (float) ($historique->getRemise() ?? 0);
}
$montantReference = count($documentsLies) > 0 ? $montantNet : $totalFacture;
$nouveauReste = $this->formatMontant($montantReference - $totalRegle);
$paymentdevi->setMontant($nouveauReste);
$paymentdevi->setReste($nouveauReste);
$paymentdeviRepository->save($paymentdevi);
}
$devisRepository->save($facture, true);
}
#[Route('/Filter_BLP', name: 'app_devis_filter_blp', methods: ['POST'])]
public function filterdevisblp(PaymentdeviRepository $paymentdeviRepository, ClientRepository $clientRepository, Request $request, DevisRepository $devisRepository): Response
{
$fr = $devisRepository->findBy(['statut'=>"Facture-R"]);
$fra = $devisRepository->findBy(['statut'=>"Facture-A"]);
// 1) Récupération des filtres
$client = $request->request->get('client');
$dateRangeRaw = trim($request->request->get('dateRangePicker', ''));
$action = $request->request->get('action');
$listeclient = $clientRepository->findAll();
$clientselected = null;
if ($client){
$clientselected = $clientRepository->find($client);
}
// dd($client,$clientselected);
// 2) Préparation du mapping FR → ENG pour créer avec DateTime::createFromFormat
$months = [
'janv' => 'Jan', 'févr' => 'Feb', 'mars' => 'Mar',
'avr' => 'Apr', 'mai' => 'May', 'juin' => 'Jun',
'juil' => 'Jul', 'août' => 'Aug', 'sept' => 'Sep',
'oct' => 'Oct', 'nov' => 'Nov', 'déc' => 'Dec',
'janvier' => 'Jan', 'février' => 'Feb', 'mars' => 'Mar',
'avril' => 'Apr', 'mai' => 'May', 'juin' => 'Jun',
'juillet' => 'Jul', 'août' => 'Aug', 'septembre'=> 'Sep',
'octobre' => 'Oct', 'novembre' => 'Nov', 'décembre' => 'Dec',
];
// 3) Split sur " to " (flatpickr) ou " au " (votre ancien plugin)
if (strpos($dateRangeRaw, ' to ') !== false) {
$parts = explode(' to ', $dateRangeRaw);
}
elseif (strpos($dateRangeRaw, ' au ') !== false) {
$parts = explode(' au ', $dateRangeRaw);
}
elseif ($dateRangeRaw !== '') {
$parts = [ $dateRangeRaw ];
}
else {
$parts = [];
}
$startDate = $endDate = null;
if (count($parts) > 0) {
$clean = function(string $str) use ($months): \DateTime {
$s = trim(mb_strtolower($str));
// si ISO "YYYY-MM-DD"
if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $s)) {
$dt = \DateTime::createFromFormat('Y-m-d', $s);
} else {
// on remplace les mois FR par des abbrv ENG
$mapped = strtr($s, $months);
// ex. "22 Jul, 2025"
$dt = \DateTime::createFromFormat('d M, Y', $mapped);
}
if (! $dt) {
throw new \Exception("Format de date invalide : « {$str} »");
}
return $dt;
};
// parsing
if (count($parts) === 2) {
$startDate = $clean($parts[0])->setTime(0, 0, 0);
$endDate = $clean($parts[1])->setTime(23, 59, 59);
} else {
// date unique
$dt = $clean($parts[0]);
$startDate = (clone $dt)->setTime(0, 0, 0);
$endDate = (clone $dt)->setTime(23, 59, 59);
}
}
// 4) Construction du QueryBuilder
$qb = $devisRepository
->createQueryBuilder('f')
->where('f.statut = :statut') // Filtrer par fiches archivées
->setParameter('statut', 'BLP')
->orderBy('f.id', 'DESC');
if ($client) {
$qb->andWhere('f.client = :client')
->setParameter('client', $client);
}
if ($startDate && $endDate) {
$qb->andWhere('f.date BETWEEN :start AND :end')
->setParameter('start', $startDate)
->setParameter('end', $endDate);
}
$devis = $qb->getQuery()->getResult();
// 5) Calcul des totaux
$totalsByFournisseur = [];
foreach ($devis as $f) {
$four = $f->getClient();
$key = $four->getId();
if (!isset($totalsByFournisseur[$key])) {
$totalsByFournisseur[$key] = [
'client' => $four,
'totalTTC' => 0,
'totalPaye' => 0,
'resteAPayer' => 0,
];
}
// $totalsByFournisseur[$key]['totalTTC'] += $f->getTotalttc();
$totalsByFournisseur[$key]['totalTTC'] += (float) $f->getTotalttc();
$paiements = $paymentdeviRepository->findBy(['devis' => $f]);
foreach ($paiements as $p) {
foreach ($p->getHistoriquepaiementsdevis() as $h) {
$totalsByFournisseur[$key]['totalPaye'] += (float) $h->getAcompte();
}
}
$totalsByFournisseur[$key]['resteAPayer'] =
$totalsByFournisseur[$key]['totalTTC']
- $totalsByFournisseur[$key]['totalPaye'];
}
if (count($devis) === 0) {
$this->addFlash('info', 'Aucun résultat trouvé pour les critères sélectionnés.');
}
// 6) Export Excel (sans $typefiche)
if ($action === 'excel') {
$totalsImpayes = array_filter(
$totalsByFournisseur,
static fn (array $data): bool => round((float) $data['resteAPayer'], 3) > 0.001
);
if (count($totalsImpayes) === 0) {
$this->addFlash('warningfilter', 'Aucun impayé trouvé — fichier Excel non généré.');
return $this->redirectToRoute('app_devis_particulier_index');
}
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// Construire le titre
$titre = 'Rapport des fiches de vente';
$datePlage = ($startDate && $endDate)
? $startDate->format('d/m/Y') . ' au ' . $endDate->format('d/m/Y')
: 'Toutes les dates';
$sheet->mergeCells('A1:D1');
$sheet->setCellValue('A1', $titre . ' | Plage de dates : ' . $datePlage);
$sheet->getStyle('A1')->getFont()->setBold(true)->getColor()->setRGB('FF0000');
$sheet->getStyle('A1')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
// En-têtes
$sheet->setCellValue('A3', 'Raison sociale');
$sheet->setCellValue('B3', 'Total TTC');
$sheet->setCellValue('C3', 'Total réglé');
$sheet->setCellValue('D3', 'Reste à payer');
foreach (range('A', 'D') as $col) {
$sheet->getColumnDimension($col)->setWidth(20);
}
$sheet->getColumnDimension('A')->setWidth(35);
$headerStyle = $sheet->getStyle('A3:D3');
$headerStyle->getFont()->setBold(true)->getColor()->setRGB('0000FF');
$headerStyle->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
->getStartColor()->setRGB('D0E3FA');
$row = 4;
$totalGlobalTTC = 0;
$totalGlobalPaye = 0;
$totalGlobalReste = 0;
foreach ($totalsImpayes as $data) {
$raisonSociale = $data['client']->getRaisonsocial();
$ttc = $data['totalTTC'];
$paye = $data['totalPaye'];
$reste = $data['resteAPayer'];
$sheet->setCellValue("A$row", $raisonSociale);
$sheet->setCellValue("B$row", $ttc);
$sheet->setCellValue("C$row", $paye);
$sheet->setCellValue("D$row", $reste);
$sheet->getStyle("A$row:D$row")->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
->getStartColor()->setRGB('D0E3FA');
$totalGlobalTTC += (float) $ttc;
$totalGlobalPaye += (float) $paye;
$totalGlobalReste += (float) $reste;
$row++;
}
$sheet->setCellValue("A$row", 'Total');
$sheet->setCellValue("B$row", $totalGlobalTTC);
$sheet->setCellValue("C$row", $totalGlobalPaye);
$sheet->setCellValue("D$row", $totalGlobalReste);
$sheet->getStyle("A$row:D$row")->getFont()->setBold(true)->getColor()->setRGB('FF0000');
$sheet->getStyle("A$row:D$row")->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
$sheet->getStyle("A$row:D$row")->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
->getStartColor()->setRGB('FFD9D9');
// Générer le fichier Excel
$filename = ($startDate && $endDate)
? 'rapport_vente_blp' . $startDate->format('Ymd') . '_au_' . $endDate->format('Ymd') . '.xlsx'
: 'rapport_vente_blp_toutes_les_dates.xlsx';
$writer = new Xlsx($spreadsheet);
$response = new StreamedResponse(function () use ($writer) {
$writer->save('php://output');
});
$dispositionHeader = $response->headers->makeDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT,
$filename
);
$response->headers->set('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
$response->headers->set('Content-Disposition', $dispositionHeader);
return $response;
}
// 7) Retour à la vue
return $this->render('devis_particulier/filterblp.html.twig', [
'devis' => $devis,
'clients' => $client,
'totalsByFournisseur'=> $totalsByFournisseur,
'totalereste' => array_sum(array_column($totalsByFournisseur, 'resteAPayer')),
'totalTTC' => array_sum(array_column($totalsByFournisseur, 'totalTTC')),
'totalPaye' => array_sum(array_column($totalsByFournisseur, 'totalPaye')),
'frtour' => $fr,
'frtouaa' => $fra,
'listeclient'=>$listeclient,
'clientselected'=>$clientselected,
'selectedRangeRaw' => $dateRangeRaw,
]);
}
#[Route('/Filter', name: 'app_devis_filter_facture', methods: ['GET', 'POST'])]
public function filterdevis(PaymentdeviRepository $paymentdeviRepository, ClientRepository $clientRepository, Request $request, DevisRepository $devisRepository): Response
{
$fr = $devisRepository->findBy(['statut'=>"Facture-R"]);
$fra = $devisRepository->findBy(['statut'=>"Facture-A"]);
// 1) Récupération des filtres
$filtres = $request->isMethod('GET') ? $request->query : $request->request;
$client = $filtres->get('client');
$dateRangeRaw = trim($filtres->get('dateRangePicker', ''));
$action = $filtres->get('action');
$listeclient = $clientRepository->findAll();
$clientselected = null;
if ($client){
$clientselected = $clientRepository->find($client);
}
// dd($client,$clientselected);
// 2) Préparation du mapping FR → ENG pour créer avec DateTime::createFromFormat
$months = [
'janv' => 'Jan', 'févr' => 'Feb', 'mars' => 'Mar',
'avr' => 'Apr', 'mai' => 'May', 'juin' => 'Jun',
'juil' => 'Jul', 'août' => 'Aug', 'sept' => 'Sep',
'oct' => 'Oct', 'nov' => 'Nov', 'déc' => 'Dec',
'janvier' => 'Jan', 'février' => 'Feb', 'mars' => 'Mar',
'avril' => 'Apr', 'mai' => 'May', 'juin' => 'Jun',
'juillet' => 'Jul', 'août' => 'Aug', 'septembre'=> 'Sep',
'octobre' => 'Oct', 'novembre' => 'Nov', 'décembre' => 'Dec',
];
// 3) Split sur " to " (flatpickr) ou " au " (votre ancien plugin)
if (strpos($dateRangeRaw, ' to ') !== false) {
$parts = explode(' to ', $dateRangeRaw);
}
elseif (strpos($dateRangeRaw, ' au ') !== false) {
$parts = explode(' au ', $dateRangeRaw);
}
elseif ($dateRangeRaw !== '') {
$parts = [ $dateRangeRaw ];
}
else {
$parts = [];
}
$startDate = $endDate = null;
if (count($parts) > 0) {
$clean = function(string $str) use ($months): \DateTime {
$s = trim(mb_strtolower($str));
// si ISO "YYYY-MM-DD"
if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $s)) {
$dt = \DateTime::createFromFormat('Y-m-d', $s);
} else {
// on remplace les mois FR par des abbrv ENG
$mapped = strtr($s, $months);
// ex. "22 Jul, 2025"
$dt = \DateTime::createFromFormat('d M, Y', $mapped);
}
if (! $dt) {
throw new \Exception("Format de date invalide : « {$str} »");
}
return $dt;
};
// parsing
if (count($parts) === 2) {
$startDate = $clean($parts[0])->setTime(0, 0, 0);
$endDate = $clean($parts[1])->setTime(23, 59, 59);
} else {
// date unique
$dt = $clean($parts[0]);
$startDate = (clone $dt)->setTime(0, 0, 0);
$endDate = (clone $dt)->setTime(23, 59, 59);
}
}
// 4) Construction du QueryBuilder
$qb = $devisRepository
->createQueryBuilder('f')
->where('f.statut IN (:statuts)')
->setParameter('statuts', ['Facture', 'Facture-R', 'Facture-A'])
->orderBy('f.id', 'DESC');
if ($client) {
$qb->andWhere('f.client = :client')
->setParameter('client', $client);
}
if ($startDate && $endDate) {
$qb->andWhere('f.date BETWEEN :start AND :end')
->setParameter('start', $startDate)
->setParameter('end', $endDate);
}
$devis = $qb->getQuery()->getResult();
// 5) Calcul des totaux
// Les factures de retour et d'avoir restent dans la liste, mais ne sont
// pas comptées comme des ventes séparées dans les statistiques.
$facturesOriginalesParId = [];
$facturesOriginalesParNumero = [];
foreach ($devis as $document) {
if ($document->getStatut() === 'Facture') {
$facturesOriginalesParId[(string) $document->getId()] = $document;
$facturesOriginalesParNumero[trim((string) $document->getNum())] = $document;
}
}
$resoudreFactureOriginale = static function (Devis $ajustement, ?string $idLien) use (
$facturesOriginalesParId,
$facturesOriginalesParNumero
): ?Devis {
if ($idLien && isset($facturesOriginalesParId[(string) $idLien])) {
return $facturesOriginalesParId[(string) $idLien];
}
$reference = trim((string) $ajustement->getReference());
if ($reference !== '' && isset($facturesOriginalesParNumero[$reference])) {
return $facturesOriginalesParNumero[$reference];
}
// Anciennes données : le lien peut viser une facture supprimée puis recréée.
// Pour un retour total, le client et le montant permettent un rapprochement unique.
$candidats = [];
$totalAjustement = (float) ($ajustement->getTotalttc() ?? 0);
foreach ($facturesOriginalesParId as $factureOriginale) {
if ($factureOriginale->getClient()?->getId() !== $ajustement->getClient()?->getId()) {
continue;
}
$ecart = (float) ($factureOriginale->getTotalttc() ?? 0) - $totalAjustement;
$timbre = (float) ($factureOriginale->getTimbre() ?? 0);
if ($ecart >= -0.001 && $ecart <= $timbre + 0.001) {
$candidats[] = $factureOriginale;
}
}
return count($candidats) === 1 ? $candidats[0] : null;
};
$ajustementsParFacture = [];
foreach ($fr as $factureRetour) {
$factureOriginale = $resoudreFactureOriginale($factureRetour, $factureRetour->getFrtour());
if ($factureOriginale) {
$factureId = (string) $factureOriginale->getId();
$ajustementsParFacture[$factureId] = ($ajustementsParFacture[$factureId] ?? 0.0)
+ (float) ($factureRetour->getTotalttc() ?? 0);
}
}
foreach ($fra as $factureAvoir) {
$factureOriginale = $resoudreFactureOriginale($factureAvoir, $factureAvoir->getFav());
if ($factureOriginale) {
$factureId = (string) $factureOriginale->getId();
$ajustementsParFacture[$factureId] = ($ajustementsParFacture[$factureId] ?? 0.0)
+ (float) ($factureAvoir->getTotalttc() ?? 0);
}
}
$totalsByFournisseur = [];
foreach ($devis as $f) {
if ($f->getStatut() !== 'Facture') {
continue;
}
$four = $f->getClient();
$key = $four->getId();
if (!isset($totalsByFournisseur[$key])) {
$totalsByFournisseur[$key] = [
'client' => $four,
'totalTTC' => 0,
'totalPaye' => 0,
'resteAPayer' => 0,
];
}
$totalFacture = (float) $f->getTotalttc();
$factureId = (string) $f->getId();
$aUnAjustement = array_key_exists($factureId, $ajustementsParFacture);
if ($aUnAjustement && $f->getMontantNet() !== null && $f->getMontantNet() !== '') {
$totalFacture = max(0.0, (float) $f->getMontantNet());
} elseif ($aUnAjustement) {
$totalFacture = max(0.0, $totalFacture - $ajustementsParFacture[$factureId]);
$timbre = (float) ($f->getTimbre() ?? 0);
if ($totalFacture <= $timbre + 0.001) {
$totalFacture = 0.0;
}
}
$resteFacture = $totalFacture;
$paiements = $paymentdeviRepository->findBy(['devis' => $f], ['id' => 'ASC']);
foreach ($paiements as $p) {
$resteFacture = (float) ($p->getReste() ?? $resteFacture);
}
$totalFacture = round($totalFacture, 3);
$resteFacture = round(max(0.0, min($resteFacture, $totalFacture)), 3);
if (abs($resteFacture) < 0.001) {
$resteFacture = 0.0;
}
$totalsByFournisseur[$key]['totalTTC'] += $totalFacture;
$totalsByFournisseur[$key]['resteAPayer'] += $resteFacture;
$totalsByFournisseur[$key]['totalPaye'] += $totalFacture - $resteFacture;
}
if (count($devis) === 0) {
$this->addFlash('info', 'Aucun résultat trouvé pour les critères sélectionnés.');
}
// 6) Export Excel (sans $typefiche)
if ($action === 'excel') {
if (count($totalsByFournisseur) === 0) {
$this->addFlash('warningfilter', 'Aucune facture trouvée — fichier Excel non généré.');
return $this->redirectToRoute('app_devis_liste_facture');
}
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// Construire le titre
$titre = 'Rapport des fiches de vente';
$datePlage = ($startDate && $endDate)
? $startDate->format('d/m/Y') . ' au ' . $endDate->format('d/m/Y')
: 'Toutes les dates';
$sheet->mergeCells('A1:D1');
$sheet->setCellValue('A1', $titre . ' | Plage de dates : ' . $datePlage);
$sheet->getStyle('A1')->getFont()->setBold(true)->getColor()->setRGB('FF0000');
$sheet->getStyle('A1')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
// En-têtes
$sheet->setCellValue('A3', 'Raison sociale');
$sheet->setCellValue('B3', 'Total TTC');
$sheet->setCellValue('C3', 'Total réglé');
$sheet->setCellValue('D3', 'Reste à payer');
foreach (range('A', 'D') as $col) {
$sheet->getColumnDimension($col)->setWidth(20);
}
$sheet->getColumnDimension('A')->setWidth(35);
$headerStyle = $sheet->getStyle('A3:D3');
$headerStyle->getFont()->setBold(true)->getColor()->setRGB('0000FF');
$headerStyle->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
->getStartColor()->setRGB('D0E3FA');
$row = 4;
$totalGlobalTTC = 0;
$totalGlobalPaye = 0;
$totalGlobalReste = 0;
foreach ($totalsByFournisseur as $data) {
$raisonSociale = $data['client']->getRaisonsocial();
$ttc = $data['totalTTC'];
$paye = $data['totalPaye'];
$reste = $data['resteAPayer'];
$sheet->setCellValue("A$row", $raisonSociale);
$sheet->setCellValue("B$row", $ttc);
$sheet->setCellValue("C$row", $paye);
$sheet->setCellValue("D$row", $reste);
$sheet->getStyle("A$row:D$row")->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
->getStartColor()->setRGB('D0E3FA');
$totalGlobalTTC += (float) $ttc;
$totalGlobalPaye += (float) $paye;
$totalGlobalReste += (float) $reste;
$row++;
}
$sheet->setCellValue("A$row", 'Total');
$sheet->setCellValue("B$row", $totalGlobalTTC);
$sheet->setCellValue("C$row", $totalGlobalPaye);
$sheet->setCellValue("D$row", $totalGlobalReste);
$sheet->getStyle("A$row:D$row")->getFont()->setBold(true)->getColor()->setRGB('FF0000');
$sheet->getStyle("A$row:D$row")->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
$sheet->getStyle("A$row:D$row")->getFill()->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
->getStartColor()->setRGB('FFD9D9');
// Générer le fichier Excel
$filename = ($startDate && $endDate)
? 'rapport_vente_' . $startDate->format('Ymd') . '_au_' . $endDate->format('Ymd') . '.xlsx'
: 'rapport_vente_toutes_les_dates.xlsx';
$writer = new Xlsx($spreadsheet);
$response = new StreamedResponse(function () use ($writer) {
$writer->save('php://output');
});
$dispositionHeader = $response->headers->makeDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT,
$filename
);
$response->headers->set('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
$response->headers->set('Content-Disposition', $dispositionHeader);
return $response;
}
// 7) Retour à la vue
return $this->render('devis/filterfacture.html.twig', [
'devis' => $devis,
'clients' => $client,
'totalsByFournisseur'=> $totalsByFournisseur,
'totalereste' => array_sum(array_column($totalsByFournisseur, 'resteAPayer')),
'totalTTC' => array_sum(array_column($totalsByFournisseur, 'totalTTC')),
'totalPaye' => array_sum(array_column($totalsByFournisseur, 'totalPaye')),
'frtour' => $fr,
'frtouaa' => $fra,
'listeclient'=>$listeclient,
'clientselected'=>$clientselected,
'selectedRangeRaw' => $dateRangeRaw,
'blRefsByFacture' => $this->buildBlRefsByFacture($devis, $devisRepository),
]);
}
#[Route('/get-prix-par-reference', name: 'get-prix-par-reference', methods: ['GET', 'POST'])]
public function getPriceByReference(ClientRepository $clientRepository, Request $request, FamillesdarticlesRepository $famillesdarticlesRepository): Response
{
$reference = $request->get('reference');
$client = $request->get('client');
$clientexo = $clientRepository->findOneBy(['id' => $client]);
// Vérifiez si le client existe
if (!$clientexo) {
return new JsonResponse(['error' => 'Client introuvable'], 404);
}
// Récupérez la valeur de exoneres du client
$exo = $clientexo->getExoneres();
// Recherchez la FamilleArticle en fonction de la référence
$familleArticle = $famillesdarticlesRepository->findOneBy(['reference' => $reference]);
// Vérifiez si la FamilleArticle existe
if (!$familleArticle) {
return new JsonResponse(['error' => 'Référence introuvable'], 404);
}
$designation = $familleArticle->getDesignation();
$price = $familleArticle->getPrixvente();
$quantity = $familleArticle->getQunatity();
$tva = $familleArticle->getTva();
$deviss = $familleArticle->getFournisseur()->getDevise();
// Si le client n'est pas exonéré
if (!$exo) {
// Modifier la valeur de la TVA à 0
$familleArticle->setTva(0);
// Récupérer la valeur de la TVA mise à jour
$tva = $familleArticle->getTva();
}
return new JsonResponse(['devis' => $deviss, 'price' => $price, 'tva' => $tva, 'quantity' => $quantity, 'designation' => $designation]);
}
#[Route('/get-qte', name: 'get-qte', methods: ['GET', 'POST'])]
public function getPriceByReferenceqte(ClientRepository $clientRepository, Request $request, FamillesdarticlesRepository $famillesdarticlesRepository): Response
{
$reference = $request->get('reference');
$client = $request->get('client');
$clientexo = $clientRepository->findOneBy(['id' => $client]);
// Recherchez la FamilleArticle en fonction de la référence
$familleArticle = $famillesdarticlesRepository->findOneBy(['reference' => $reference]);
// dump($reference,$familleArticle);
// Vérifiez si la FamilleArticle existe
if (!$familleArticle) {
return new JsonResponse(['error' => 'Référence introuvable'], 404);
}
$designation = $familleArticle->getDesignation();
$price = $familleArticle->getPrixvente();
$quantity = $familleArticle->getQunatity();
$tva = $familleArticle->getTva();
$deviss = $familleArticle->getFournisseur()->getDevise();
// dump($quantity,$familleArticle);
return new JsonResponse(['devis' => $deviss, 'price' => $price, 'tva' => $tva, 'quantity' => $quantity, 'designation' => $designation]);
}
#[Route('/status_check', name: 'status_check', methods: ['GET', 'POST'])]
public function status_check(ClientRepository $clientRepository, DevisRepository $devisRepository, Request $request, FamillesdarticlesRepository $famillesdarticlesRepository): Response
{
$status = $request->get('status');
// dump($status);
$test = $devisRepository->findOneBy(['num' => $status]);
$testexiste = $test ? 1 : 0;
return new JsonResponse(['test' => $testexiste]);
}
#[Route('/intervention_fusion_pdf_impress', name: 'app_intervention_fusion_pdf_impress', methods: ['POST'])]
public function pdfInterventionFusion(Request $request, EntityManagerInterface $em, DevisRepository $devisRepository, InterventionRepository $interventionRepository, MessageerreurRepository $messageerreurRepository, MachineInterventionRepository $machineInterventionRepository, GestionmachinesRepository $gestionmachinesRepository, FournisseurRepository $fournisseurRepository): Response
{
// sécurité : uniquement AJAX + POST
if (!$request->isXmlHttpRequest()) {
return $this->redirectToRoute('app_intershow');
}
// 1) Récupérer les IDs cochés
$selectedIds = json_decode($request->request->get('selectedIntervention', '[]'), true) ?: [];
if (count($selectedIds) < 2) {
return new Response('Sélection insuffisante (min 2 interventions).', 400);
}
// 2) Charger les interventions correspondantes
$interventions = $interventionRepository->findBy(['id' => $selectedIds]);
if (count($interventions) !== count($selectedIds)) {
return new Response('Certaines interventions n\'existent plus.', 404);
}
// 3) Vérifier que :
// - même client
// - statut pas déjà archivé/facturé
// - type = "Intervention"
$clientIds = [];
foreach ($interventions as $itv) {
// ici on autorise statut NULL ou "Intervention"
if ($itv->getStatut() !== null && $itv->getStatut() !== 'Intervention') {
return new Response("Une intervention est déjà archivée / facturée.", 400);
}
if ($itv->getType() !== 'Intervention') {
return new Response("Toutes les interventions doivent être de type 'Intervention'.", 400);
}
$clientIds[$itv->getClient()->getId()] = true;
}
if (count($clientIds) > 1) {
return new Response("Les interventions doivent appartenir au même client.", 400);
}
// 4) Totaux globaux
$totalHT = 0;
$totalTransport = 0;
$totalTTC = 0;
$tvaUsed = null;
foreach ($interventions as $itv) {
$totalHT += (float) ($itv->getMontantht() ?? 0);
$totalTransport += (float) ($itv->getPrixtransport() ?? 0);
$totalTTC += (float) ($itv->getTotalttc() ?? 0);
if ($tvaUsed === null && $itv->getTva() !== null) {
$tvaUsed = $itv->getTva();
}
}
// *** timbre = 1 DT fixe
$timbre = 1;
// *** Net à payer = total TTC global + timbre
$netAPayer = $totalTTC + $timbre;
// 5) Génération du numéro de facture
//
// On copie la logique de ton status_devis :
// - On prend toutes les devis avec statut 'Facture'
// - On cherche le plus grand suffixe numérique derrière le préfixe "F"
// - On fabrique F<max+1> en s'assurant qu'il n'existe pas déjà
//
$prefix = 'F';
$existingFactures = $devisRepository->findBy(['statut' => 'Facture']);
$maxNumber = 0;
foreach ($existingFactures as $dv) {
$num = $dv->getNum(); // ex "F83"
if (strpos($num, $prefix) === 0) {
$suffix = substr($num, strlen($prefix));
if (ctype_digit($suffix)) {
$suffixInt = (int)$suffix;
if ($suffixInt > $maxNumber) {
$maxNumber = $suffixInt;
}
}
}
}
// incrémente jusqu'à un numéro libre
do {
$maxNumber++;
$generatedNum = $prefix . $maxNumber; // ex F84
$exists = $devisRepository->findOneBy(['num' => $generatedNum]);
} while ($exists);
// 6) Créer le Devis qui sert de facture intervention
$client = $interventions[0]->getClient();
$devis = new Devis();
$devis->setClient($client);
// *** très important :
// statut = 'Facture' => cohérent avec le reste du système
$devis->setStatut('Facture');
// numéro trouvé ci-dessus
$devis->setNum($generatedNum);
// date facture = maintenant
$devis->setDate(new DateTime('now', new DateTimeZone('Africa/Tunis')));
// champs financiers sur la facture globale, si l'entité Devis les a
if (method_exists($devis, 'setMontantht')) { $devis->setMontantht($totalHT); }
if (method_exists($devis, 'setPrixtransport')) { $devis->setPrixtransport($totalTransport); }
if (method_exists($devis, 'setTva')) { $devis->setTva($tvaUsed ?? 0); }
if (method_exists($devis, 'setTotalttc')) { $devis->setTotalttc($totalTTC); }
if (method_exists($devis, 'setTimbre')) { $devis->setTimbre($timbre); } // si tu as un champ timbre
if (method_exists($devis, 'setNetapayer')) { $devis->setNetapayer($netAPayer); } // si tu as un champ netapayer
// garder trace des IDs fusionnées
$idsString = json_encode(array_map(fn($i) => $i->getId(), $interventions));
if (method_exists($devis, 'setIdintervold')) {
$devis->setIdintervold($idsString);
}
$em->persist($devis);
// 7) Marquer chaque intervention comme archivée ET la lier à la facture
foreach ($interventions as $itv) {
$itv->setStatut('Archive'); // elle sort de la liste active
$itv->setDevis($devis); // lien vers la facture créée
if (method_exists($devis, 'addIntervention')) {
$devis->addIntervention($itv);
}
$em->persist($itv);
}
// Sauvegarde en BDD
$em->flush();
// 8) Préparer les données "blocks" pour le PDF
$fournisseur = $fournisseurRepository->find(7);
$blocks = [];
foreach ($interventions as $interv) {
// Machines liées
$machineIds = $interv->getMachineIds() ?: [];
$machines = $gestionmachinesRepository->findBy(['id' => $machineIds]);
// machine_intervention liées
$machineIntervs = $machineInterventionRepository->findBy([
'intervention' => $interv,
]);
// rowsForTwig = lignes "message erreur / solution / remarque" lisibles
$rowsForTwig = [];
foreach ($machineIntervs as $mi) {
$rawIds = $mi->getMessageErreurs(); // "1,5"
$ids = [];
if (!empty($rawIds)) {
$ids = array_map('trim', explode(',', $rawIds));
}
$messagesText = [];
$solutionsText = [];
foreach ($ids as $mid) {
if ($mid === '') continue;
$err = $messageerreurRepository->find($mid);
if ($err) {
if ($err->getMeesage()) {
$messagesText[] = $err->getMeesage();
}
if ($err->getSolution()) {
$solutionsText[] = $err->getSolution();
}
}
}
// solution manuelle éventuellement saisie sur MachineIntervention
if ($mi->getSolutions()) {
$solutionsText[] = $mi->getSolutions();
}
$rowsForTwig[] = [
'machine' => $mi->getMachine(),
'messages' => implode(', ', $messagesText),
'solutions' => implode(', ', $solutionsText),
'remarque' => $mi->getRemarque(),
];
}
$blocks[] = [
'intervention' => $interv,
'machines' => $machines,
'rowsForTwig' => $rowsForTwig,
'machineInterventions' => $machineIntervs,
];
}
// 9) Génération PDF avec Dompdf
$pdfOptions = new Options();
$pdfOptions->set('isHtml5ParserEnabled', true);
$pdfOptions->set('isRemoteEnabled', true);
$dompdf = new Dompdf($pdfOptions);
$html = $this->renderView('intervention/pdfintervnetion.html.twig', [
'devis' => $devis,
'client' => $client,
'fournisseur' => $fournisseur,
'blocks' => $blocks,
'totalHT' => $totalHT,
'totalTransport' => $totalTransport,
'tva' => $tvaUsed ?? 0,
'totalTTC' => $totalTTC,
'timbre' => $timbre,
'netAPayer' => $netAPayer,
]);
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', 'portrait');
$dompdf->setHttpContext(stream_context_create([
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
]
]));
$dompdf->render();
$pdfOutput = $dompdf->output();
$response = new Response($pdfOutput);
$response->headers->set('Content-Type', 'application/pdf');
$response->headers->set(
'Content-Disposition',
sprintf('attachment; filename="Facture-%s.pdf"', $devis->getNum())
);
return $response;
}
#[Route('/status_devis', name: 'status_devis', methods: ['GET', 'POST'])]
public function status_devis(ClientRepository $clientRepository, DevisRepository $devisRepository, Request $request, FamillesdarticlesRepository $famillesdarticlesRepository): Response {
$status = $request->get('status');
$client = $request->get('client');
$clientexo = $clientRepository->findOneBy(['id' => $client]);
$prefixMap = [
'Demande devis' => 'Dd',
'Devis' => 'D',
'Commande' => 'C',
'BL' => 'BL',
'BLP' => 'BLP',
'Facture' => 'F'
];
if (!isset($prefixMap[$status])) {
return new JsonResponse(['error' => 'Statut inconnu'], 400);
}
$prefix = $prefixMap[$status];
$maxNumber = 0;
// Récupérer tous les numéros de devis correspondant au préfixe quel que soit le statut actuel
// (prend en compte les BL archivés 'Blf', les BL fusionnés 'BL_FUSIONNE', 'BLFUS', etc.)
$rows = $devisRepository->createQueryBuilder('d')
->select('d.num')
->where('d.num LIKE :prefixPattern')
->setParameter('prefixPattern', $prefix . '%')
->getQuery()
->getScalarResult();
foreach ($rows as $row) {
$num = trim((string)($row['num'] ?? ''));
if ($num !== '' && preg_match('/^' . preg_quote($prefix, '/') . '(\d+)$/', $num, $matches)) {
$suffixInt = (int)$matches[1];
if ($suffixInt > $maxNumber) {
$maxNumber = $suffixInt;
}
}
}
$testexiste = 0;
do {
$maxNumber++;
$generatedNum = $prefix . $maxNumber;
$exists = $devisRepository->findOneBy(['num' => $generatedNum]);
if ($exists) {
$testexiste = 1;
}
} while ($exists);
return new JsonResponse(['num' => $generatedNum, 'test' => $testexiste]);
}
// #[Route('/status_devis', name: 'status_devis', methods: ['GET', 'POST'])]
// public function status_devis(
// ClientRepository $clientRepository,
// DevisRepository $devisRepository,
// Request $request,
// FamillesdarticlesRepository $famillesdarticlesRepository
// ): Response {
// $status = $request->get('status');
// $client = $request->get('client');
//
// $clientexo = $clientRepository->findOneBy(['id' => $client]);
//
// $devisList = $devisRepository->findBy(['statut' => $status]);
//
// $prefixMap = [
// 'Demande devis' => 'Dd',
// 'Devis' => 'D',
// 'Commande' => 'C',
// 'BL' => 'BL',
// 'BLP' => 'BLP',
// 'Facture' => 'F'
// ];
//
// if (!isset($prefixMap[$status])) {
// return new JsonResponse(['error' => 'Statut inconnu'], 400);
// }
//
// $prefix = $prefixMap[$status];
// $maxNumber = 0;
//
// foreach ($devisList as $devis) {
// $num = $devis->getNum();
// if (strpos($num, $prefix) === 0) {
// $suffix = substr($num, strlen($prefix));
// if (ctype_digit($suffix)) {
// $suffixInt = (int)$suffix;
// if ($suffixInt > $maxNumber) {
// $maxNumber = $suffixInt;
// }
// }
// }
// }
//
// $testexiste = 0;
// do {
// $maxNumber++;
// $generatedNum = $prefix . $maxNumber;
// $exists = $devisRepository->findOneBy(['num' => $generatedNum]);
// if ($exists) {
// $testexiste = 1;
// }
// } while ($exists);
//
// return new JsonResponse(['num' => $generatedNum, 'test' => $testexiste]);
// }
// avant modification le 07/05/2025
// #[Route('/status_devis', name: 'status_devis', methods: ['GET', 'POST'])]
// public function status_devis(ClientRepository $clientRepository, DevisRepository $devisRepository, Request $request, FamillesdarticlesRepository $famillesdarticlesRepository): Response
// {
// $status = $request->get('status');
// $client = $request->get('client');
//
//
// $clientexo = $clientRepository->findOneBy(['id' => $client]);
//
// // Recherchez la FamilleArticle en fonction de la référence
// $totstatu = $devisRepository->findBy(['statut' => $status]);
//
// $count = count($totstatu);
//
//
// if ($count == 0) {
// $count = 1;
// }
// else {
// $count++;
// }
//
// // Génération du numéro de base
// $tt = "";
// switch ($status) {
// case "Demande devis":
// $tt = "Dd" . $count;
// break;
// case "Devis":
// $tt = "D" . $count;
// break;
// case "Commande":
// $tt = "C" . $count;
// break;
// case "BL":
// $tt = "BL" . $count;
// break;
// case "BLP":
// $tt = "BLP" . $count;
// break;
// case "Facture":
// $tt = "F" . $count;
// break;
// default:
// return new JsonResponse(['error' => 'Statut inconnu'], 400);
// }
//
// // Vérification de l'existence du numéro et génération d'un nouveau si nécessaire
// $testexiste = 0;
// while ($devisRepository->findOneBy(['num' => $tt])) {
// $count++;
// switch ($status) {
// case "Demande devis":
// $tt = "Dd" . $count;
// break;
// case "Devis":
// $tt = "D" . $count;
// break;
// case "Commande":
// $tt = "C" . $count;
// break;
// case "BL":
// $tt = "BL" . $count;
// break;
// case "BLP":
// $tt = "BLP" . $count;
// break;
// case "Facture":
// $tt = "F" . $count;
// break;
// }
// $testexiste = 1; // Numéro existant, donc on a dû générer un nouveau
// }
//
//
// return new JsonResponse(['num' => $tt, 'test' => $testexiste]);
// }
//fin avant modification le 07/05/2025
// #[Route('/status_devis', name: 'status_devis', methods: ['GET', 'POST'])]
// public function status_devis(ClientRepository $clientRepository, DevisRepository $devisRepository, Request $request, FamillesdarticlesRepository $famillesdarticlesRepository): Response
// {
// $status = $request->get('status');
// $client = $request->get('client');
//
// $clientexo = $clientRepository->findOneBy(['id' => $client]);
// // Recherchez la FamilleArticle en fonction de la référence
// $totstatu = $devisRepository->findBy(['statut' => $status]);
//
//
// $count = count($totstatu);
//
//
// if ($count == 0) {
// $count = 1;
// }
// else {
// $count = $count + 1;
// }
//
// // Vérifiez si la FamilleArticle existe
// if ($status == "Demande devis") {
// $tt = "Dd" . $count;
// } elseif ($status == "Devis") {
// $tt = "D" . $count;
// } elseif ($status == "Commande") {
// $tt = "C" . $count;
// } elseif ($status == "BL") {
// $tt = "BL" . $count;
// } elseif ($status == "Facture") {
// $tt = "F" . $count;
// }
//
// $test = $devisRepository->findOneBy(['num' => $tt]);
//
// if ($test) {
// $testexiste = 1;
// } else {
// $testexiste = 0;
// }
//
//
//
// return new JsonResponse(['num' => $tt, 'test' => $testexiste]);
// }
//
//
//
// #[Route('/status_check', name: 'status_check', methods: ['GET', 'POST'])]
// public function status_check(ClientRepository $clientRepository, DevisRepository $devisRepository, Request $request, FamillesdarticlesRepository $famillesdarticlesRepository): Response
// {
// $status = $request->get('status');
//
// $test = $devisRepository->findOneBy(['num' => $status]);
//
// if ($test) {
// $testexiste = 1;
// } else {
// $testexiste = 0;
// }
//
// return new JsonResponse([ 'test' => $testexiste]);
// }
#[Route('/get-tva-client', name: 'get-tva-client', methods: ['GET', 'POST'])]
public function getPriceByclient(ClientRepository $clientRepository, Request $request, FamillesdarticlesRepository $famillesdarticlesRepository): Response
{
$tableauRf = $request->get('tableauRf');
$tvas = [];
$client = $request->get('client');
$clientexo = $clientRepository->findOneBy(['id' => $client]);
// Vérifiez si le client existe
if (!$clientexo) {
return new JsonResponse(['error' => 'Client introuvable'], 404);
}
// Récupérez la valeur de exoneres du client
$exo = $clientexo->getExoneres();
if ($exo == false) {
$tva = false;
} else {
$tva = true;
for ($i = 0; $i < count($tableauRf); $i++) {
$reference = $tableauRf[$i];
$familleArticle = $famillesdarticlesRepository->findOneBy(['reference' => $reference]);
if ($familleArticle) {
$tva = $familleArticle->getTva();
$tvas[] = $tva;
} else {
$tva = 0;
}
}
$responseData = [
'tva' => $tvas,
];
return new JsonResponse($responseData);
}
return new JsonResponse(['tva' => $tva]);
}
#[Route('/facture', name: 'app_devis_liste_facture', methods: ['GET'])]
public function listefacture(DevisRepository $devisRepository, ClientRepository $clientRepository): Response
{
$clients = $clientRepository->findAll();
// 1️⃣ Récupérer les devis ayant le statut "Facture" ou "Intervention"
$devisTousSaufBl = $devisRepository->createQueryBuilder('d')
->where('d.statut IN (:statuts)')
->andWhere('d.statut NOT IN (:exclus)')
->setParameter('statuts', ['Facture', 'Facture-R', 'Intervention' , 'Facture-A'])
->setParameter('exclus', ['Blf', 'BLP'])
->orderBy('d.num', 'DESC')
->getQuery()
->getResult();
// 2️⃣ Autres factures spécifiques
$fr = $devisRepository->findBy(['statut' => "Facture-R"]);
$fra = $devisRepository->findBy(['statut' => "Facture-A"]);
// 3️⃣ BL d'origine des factures issues d'une fusion (complète ou partielle)
$blRefsByFacture = $this->buildBlRefsByFacture($devisTousSaufBl, $devisRepository);
// 4️⃣ Rendu
return $this->render('devis/listefacture.html.twig', [
'devis' => $devisTousSaufBl,
'frtour' => $fr,
'frtouaa' => $fra,
'clients' => $clients,
'blRefsByFacture' => $blRefsByFacture,
]);
}
/**
* Map factureId => [{id, num}] des BL d'origine, pour les factures
* issues d'une fusion de BL (oldtype FactureBLFusion / FactureBLFusionPartielle,
* ou anciennes factures partielles identifiables par fav = ID du BLFUS).
*/
private function buildBlRefsByFacture(array $factures, DevisRepository $devisRepository): array
{
$blRefsByFacture = [];
foreach ($factures as $facture) {
if (!$this->isFactureFusionBl($facture)) {
continue;
}
$ids = $this->decodeBlIds($facture->getIddevisold());
if ($ids === []) {
continue;
}
$refs = [];
foreach ($devisRepository->findBy(['id' => $ids]) as $bl) {
$refs[] = ['id' => $bl->getId(), 'num' => $bl->getNum()];
}
if ($refs !== []) {
$blRefsByFacture[$facture->getId()] = $refs;
}
}
return $blRefsByFacture;
}
/**
* Numéros des BL d'origine d'une facture de fusion (ex. "BL1, BL2"), ou null.
*/
private function getBlOriginauxNums(Devis $devi, DevisRepository $devisRepository): ?string
{
if (!$this->isFactureFusionBl($devi)) {
return null;
}
$ids = $this->decodeBlIds($devi->getIddevisold());
if ($ids === []) {
return null;
}
$nums = [];
foreach ($devisRepository->findBy(['id' => $ids]) as $bl) {
$nums[] = $bl->getNum();
}
return $nums !== [] ? implode(', ', $nums) : null;
}
private function decodeBlIds(?string $iddevisold): array
{
$decoded = json_decode((string) $iddevisold, true);
$ids = is_array($decoded) ? $decoded : array_filter(explode(',', (string) $iddevisold));
return array_values(array_unique(array_filter(array_map('intval', $ids))));
}
private function isFactureFusionBl(Devis $devi): bool
{
if (in_array($devi->getOldtype(), ['FactureBLFusion', 'FactureBLFusionPartielle'], true)) {
return true;
}
return $devi->getFav() !== null && $devi->getFav() !== ''
&& $devi->getIddevisold() !== null && $devi->getIddevisold() !== '';
}
// #[Route('/facture', name: 'app_devis_liste_facture', methods: ['GET'])]
// public function listefacture(DevisRepository $devisRepository,ClientRepository $clientRepository): Response
// {
// $devisTousSaufBl = $devisRepository->findBy(['statut'=>'Facture'], ['num' => 'DESC'] );
// $clients = $clientRepository->findAll();
//// dd($devisTousSaufBl);
//// Filtrer les devis avec le type "bl"
//// $devisTousSaufBl = array_filter($devisTousSaufBl, function ($devis) {
//// return $devis->getStatut() !== 'Blf';
//// });
// $devisTousSaufBl = array_filter($devisTousSaufBl, function ($devis) {
// return $devis->getStatut() !== 'Blf' && $devis->getStatut() !== 'BLP' && $devis->getOldtype() !== 'BLP';
// });
//
//
// $fr = $devisRepository->findBy(['statut'=>"Facture-R"]);
// $fra = $devisRepository->findBy(['statut'=>"Facture-A"]);
//
// return $this->render('devis/listefacture.html.twig', [
// 'devis' => $devisTousSaufBl,
// 'frtour' => $fr,
// 'frtouaa' => $fra,
// 'clients'=>$clients
// ]);
// }
#[Route('/liste_demande_devis', name: 'app_devis_iste_demande_devis', methods: ['GET'])]
public function listedemandedevis(DevisRepository $devisRepository): Response
{
$devisTousSaufBl = $devisRepository->findBy(['statut'=>'Demande devis'], ['num' => 'DESC'] );
// Filtrer les devis avec le type "bl"
// $devisTousSaufBl = array_filter($devisTousSaufBl, function ($devis) {
// return $devis->getStatut() !== 'Blf';
// });
$devisTousSaufBl = array_filter($devisTousSaufBl, function ($devis) {
return $devis->getStatut() !== 'Blf' && $devis->getStatut() !== 'BLP' && $devis->getOldtype() !== 'BLP';
});
$fr = $devisRepository->findBy(['statut'=>"Facture-R"]);
$fra = $devisRepository->findBy(['statut'=>"Facture-A"]);
return $this->render('devis/listedemandedevis.html.twig', [
'devis' => $devisTousSaufBl,
'frtour' => $fr,
'frtouaa' => $fra,
]);
}
#[Route('/liste_devis', name: 'app_devis_liste_devis', methods: ['GET'])]
public function listedevis(DevisRepository $devisRepository): Response
{
// 1) Récupérer tous les devis avec statut "Devis" (sans order BY num ici)
$devisTousSaufBl = $devisRepository->findBy([
'statut' => 'Devis',
]);
// 2) Filtrer ceux qu'on ne veut pas (Blf, BLP, oldtype = BLP)
$devisTousSaufBl = array_filter($devisTousSaufBl, function (Devis $devis) {
return $devis->getStatut() !== 'Blf'
&& $devis->getStatut() !== 'BLP'
&& $devis->getOldtype() !== 'BLP';
});
// 3) Trier par numéro numérique : D12, D11, D10, D9, ..., D1
usort($devisTousSaufBl, function (Devis $a, Devis $b) {
// On enlève les lettres et on garde que les chiffres
$numA = (int) preg_replace('/\D/', '', $a->getNum()); // "D12" -> 12
$numB = (int) preg_replace('/\D/', '', $b->getNum()); // "D9" -> 9
// Tri DESC : le plus grand en premier
return $numB <=> $numA;
});
// dd($devisTousSaufBl);
// 4) Récupérer les factures-R et factures-A
$fr = $devisRepository->findBy(['statut' => 'Facture-R']);
$fra = $devisRepository->findBy(['statut' => 'Facture-A']);
// 5) Envoyer à Twig
return $this->render('devis/listedevis.html.twig', [
'devis' => $devisTousSaufBl,
'frtour' => $fr,
'frtouaa' => $fra,
]);
}
// #[Route('/liste_devis', name: 'app_devis_liste_devis', methods: ['GET'])]
// public function listedevis(DevisRepository $devisRepository): Response
// {
// $devisTousSaufBl = $devisRepository->findBy(['statut'=>'Devis'], ['num' => 'DESC'] );
// dd($devisTousSaufBl);
//// Filtrer les devis avec le type "bl"
//// $devisTousSaufBl = array_filter($devisTousSaufBl, function ($devis) {
//// return $devis->getStatut() !== 'Blf';
//// });
// $devisTousSaufBl = array_filter($devisTousSaufBl, function ($devis) {
// return $devis->getStatut() !== 'Blf' && $devis->getStatut() !== 'BLP' && $devis->getOldtype() !== 'BLP';
// });
//
//
// $fr = $devisRepository->findBy(['statut'=>"Facture-R"]);
// $fra = $devisRepository->findBy(['statut'=>"Facture-A"]);
//
// return $this->render('devis/listedevis.html.twig', [
// 'devis' => $devisTousSaufBl,
// 'frtour' => $fr,
// 'frtouaa' => $fra,
// ]);
// }
#[Route('/liste_BL', name: 'app_devis_liste_bl', methods: ['GET'])]
public function listebl(DevisRepository $devisRepository): Response
{
$devisTousSaufBl = $devisRepository->findBy(['statut'=>'BL'], ['num' => 'DESC'] );
// Filtrer les devis avec le type "bl"
// $devisTousSaufBl = array_filter($devisTousSaufBl, function ($devis) {
// return $devis->getStatut() !== 'Blf';
// });
$devisTousSaufBl = array_filter($devisTousSaufBl, function ($devis) {
return $devis->getStatut() !== 'Blf' && $devis->getStatut() !== 'BLP' && $devis->getOldtype() !== 'BLP';
});
$fr = $devisRepository->findBy(['statut'=>"Facture-R"]);
$fra = $devisRepository->findBy(['statut'=>"Facture-A"]);
return $this->render('devis/listebl.html.twig', [
'devis' => $devisTousSaufBl,
'frtour' => $fr,
'frtouaa' => $fra,
]);
}
#[Route('/liste_commandes', name: 'app_devis_liste_commandes', methods: ['GET'])]
public function listecommandes(DevisRepository $devisRepository): Response
{
$devisTousSaufBl = $devisRepository->findBy(['statut'=>'Commande'], ['num' => 'DESC'] );
// Filtrer les devis avec le type "bl"
// $devisTousSaufBl = array_filter($devisTousSaufBl, function ($devis) {
// return $devis->getStatut() !== 'Blf';
// });
$devisTousSaufBl = array_filter($devisTousSaufBl, function ($devis) {
return $devis->getStatut() !== 'Blf' && $devis->getStatut() !== 'BLP' && $devis->getOldtype() !== 'BLP';
});
$fr = $devisRepository->findBy(['statut'=>"Facture-R"]);
$fra = $devisRepository->findBy(['statut'=>"Facture-A"]);
return $this->render('devis/listecommandes.html.twig', [
'devis' => $devisTousSaufBl,
'frtour' => $fr,
'frtouaa' => $fra,
]);
}
#[Route('/', name: 'app_devis_index', methods: ['GET'])]
public function index(DevisRepository $devisRepository): Response
{
$devisTousSaufBl = $devisRepository->findAll();
// Filtrer les devis avec le type "bl"
// $devisTousSaufBl = array_filter($devisTousSaufBl, function ($devis) {
// return $devis->getStatut() !== 'Blf';
// });
$devisTousSaufBl = array_filter($devisTousSaufBl, function ($devis) {
return $devis->getStatut() !== 'Blf' && $devis->getStatut() !== 'BLP' && $devis->getOldtype() !== 'BLP';
});
$fr = $devisRepository->findBy(['statut'=>"Facture-R"]);
$fra = $devisRepository->findBy(['statut'=>"Facture-A"]);
return $this->render('devis/index.html.twig', [
'devis' => $devisTousSaufBl,
'frtour' => $fr,
'frtouaa' => $fra,
]);
}
#[Route('/Demande_Devis', name: 'app_devis_demande', methods: ['GET'])]
public function demandedevislistes(DevisRepository $devisRepository): Response
{
// $devisTousSaufBl = $devisRepository->findAll();
//
//// Filtrer les devis avec le type "bl"
// $demandedevis = array_filter($devisTousSaufBl, function ($devis) {
// return $devis->getStatut() == 'Demande devis';
// });
$demandedevis = $devisRepository->findDevisByTechnicianRoleAndStatut('Demande devis');
// dd($devisTousSaufBl);
$fr = $devisRepository->findBy(['statut'=>"Facture-R"]);
$fra = $devisRepository->findBy(['statut'=>"Facture-A"]);
return $this->render('devis/demande_devis.html.twig', [
'devis' => $demandedevis,
'frtour' => $fr,
'frtouaa' => $fra,
]);
}
#[Route('/liste_Demande_Devis', name: 'liste_Demande_Devis', methods: ['GET'])]
public function listedemandedevislistes(DevisRepository $devisRepository): Response
{
$devisTousSaufBl = $devisRepository->findBy(['user'=>$this->getUser()]);
// Filtrer les devis avec le type "bl"
$demandedevis = array_filter($devisTousSaufBl, function ($devis) {
return $devis->getStatut() == 'Demande devis';
});
// dd($demandedevis,$this->getUser());
$fr = $devisRepository->findBy(['statut'=>"Facture-R"]);
$fra = $devisRepository->findBy(['statut'=>"Facture-A"]);
return $this->render('devis/demande_devis.html.twig', [
'devis' => $demandedevis,
'frtour' => $fr,
'frtouaa' => $fra,
]);
}
#[Route('/archives', name: 'app_devis_archives', methods: ['GET'])]
public function indexarchives(DevisRepository $devisRepository): Response
{
$archives = $devisRepository->findBy([
'statut' => 'Blf',
'oldtype' => 'BL',
]);
// BL archivés après fusion : leur idfacture contient le numéro du BLFUS lié
$fusionnes = $devisRepository->findBy(['statut' => 'BL_FUSIONNE']);
// Archives classiques : leur idfacture contient le numéro de la facture liée
$blfusNums = [];
foreach ($fusionnes as $bl) {
if ($bl->getIdfacture()) {
$blfusNums[] = $bl->getIdfacture();
}
}
$factureNums = [];
foreach ($archives as $bl) {
if ($bl->getIdfacture()) {
$factureNums[] = $bl->getIdfacture();
}
}
$blfusIdsByNum = [];
if (!empty($blfusNums)) {
foreach ($devisRepository->findBy(['statut' => 'BLFUS', 'num' => array_unique($blfusNums)]) as $blfus) {
$blfusIdsByNum[$blfus->getNum()] = $blfus->getId();
}
}
$factureIdsByNum = [];
if (!empty($factureNums)) {
foreach ($devisRepository->findBy(['statut' => 'Facture', 'num' => array_unique($factureNums)]) as $facture) {
$factureIdsByNum[$facture->getNum()] = $facture->getId();
}
}
return $this->render('devis/archive.html.twig', [
'devis' => array_merge($archives, $fusionnes),
'blfusIdsByNum' => $blfusIdsByNum,
'factureIdsByNum' => $factureIdsByNum,
]);
}
#[Route('/retour/{id}', name: 'app_devis_retour', methods: ['GET'])]
public function indexretour(DevisRepository $devisRepository, Devis $devis): Response
{
$idd = $devis->getIdfacture();
$totlebl = $devisRepository->findBy(["idfacture" => $idd]);
$facture = $devisRepository->findOneBy(["id" => $idd]);
$devisRepository->remove($facture);
foreach ($totlebl as $item) {
$item->setStatut("BL");
$item->setIdfacture("");
$devisRepository->save($item, true);
}
return $this->redirectToRoute('app_devis_archives', [], Response::HTTP_SEE_OTHER);
}
#[Route('/facture', name: 'app_facturer', methods: ['POST'])]
public function facturer(Request $request, ProduitRepository $produitRepository, DevisRepository $devisRepository): Response
{
// Récupérer les produits sélectionnés
$checkedProducts = $request->request->get('checked'); // Articles sélectionnés
$quantitesFacturees = $request->request->get('qtef'); // Quantités à facturer
$quantitesRestantes = $request->request->get('qterest'); // Quantités restantes
$facture = new Devis(); // Créez une nouvelle facture (ou trouvez-en une existante)
$facture->setStatut('Facture'); // Définir le statut comme "Facture" ou autre en fonction du besoin
// Boucle sur les produits sélectionnés
foreach ($checkedProducts as $idProduit => $isChecked) {
if ($isChecked) {
// Récupérer le produit correspondant
$produit = $produitRepository->find($idProduit);
if ($produit) {
$qteFacturee = (int) $quantitesFacturees[$idProduit]; // Quantité facturée
$qteRestante = (int) $quantitesRestantes[$idProduit]; // Quantité restante
// Vérifier si la quantité facturée est valide
if ($qteFacturee > $produit->getQte()) {
// La quantité facturée ne peut pas être supérieure à la quantité disponible
throw new \Exception("La quantité facturée ne peut pas être supérieure à la quantité disponible.");
}
// Mettre à jour la quantité restante dans le produit
$produit->setQte($produit->getQte() - $qteFacturee);
$produitRepository->save($produit, true);
// Ajouter une ligne de facture
$factureProduit = new Produit();
$factureProduit->setProduit($produit);
$factureProduit->setQte($qteFacturee);
$factureProduit->setPrix($produit->getPrix());
$factureProduit->setRemise($produit->getRemise());
$factureProduit->setMontantht($qteFacturee * $produit->getPrix()); // Calcul du montant H.T
$factureProduit->setTva($produit->getTva());
// Ajouter ce produit à la facture
$facture->addProduit($factureProduit);
}
}
}
// Sauvegarder la facture
$devisRepository->save($facture, true);
// Rediriger vers la page des factures ou afficher un message de succès
return $this->redirectToRoute('app_devis_liste_facture', [], Response::HTTP_SEE_OTHER);
}
//************ ancien 16-02-2026**************
// #[Route('/check', name: 'app_devis_select', methods: ['GET', 'POST'])]
// public function index3(FournisseurRepository $fournisseurRepository, ClientRepository $clientRepository, FamillesRepository $famillesRepository, FamillesdarticlesRepository $famillesdarticlesRepository, ProduitRepository $produitRepository, CourroieRepository $courroieRepository, PlatinesRepository $platinesRepository, AiguillesRepository $aiguillesRepository, Request $request, DevisRepository $devisRepository): Response
// {
//
// $res = $request->request->all('chk_child');
//
// $devifus = $devisRepository->findBy(['id' => $res]);
//// dd($res,$devifus);
// $fournisseurs = $fournisseurRepository->findAll();
//
// $tabfournisseurs[] = [
// 'nom' => "Cosa",
// 'prenom' => "Tunisie",
// 'numeroTelephone' => "",
// ];
// foreach ($fournisseurs as $fournisseur) {
// $tabfournisseurs[] = [
// "Cosa Tunisie",
// 'nom' => $fournisseur->getNom(),
// 'prenom' => $fournisseur->getPrenom(),
// 'numeroTelephone' => $fournisseur->getTel(),
// ];
// }
//// dd($tabfournisseurs);
//
// $familleall = $famillesRepository->findAll();
// $familles = $famillesdarticlesRepository->findAll();
// $nbr = $request->request->get('nbrc_a');
//
// $courroi = $courroieRepository->findAll();
// $platines = $platinesRepository->findAll();
// $aiguilles = $aiguillesRepository->findAll();
// $devi = new Devis();
// $form = $this->createForm(DevisfffType::class, $devi);
// $form->handleRequest($request);
//
//
//
// $status = 'Facture';
//
// // Récupérer le dernier numéro de facture existant
// $lastDevis = $devisRepository->findOneBy(['statut' => $status], ['id' => 'DESC']);
//
// if ($lastDevis && $lastDevis->getNum()) {
// // Extraire le numéro du dernier document
// $lastNum = $lastDevis->getNum();
//
// // Vérifier le format et extraire le nombre
// if (preg_match('/^F(\d+)$/', $lastNum, $matches)) {
// $count = (int)$matches[1] + 1;
// }
// else {
// // Si le format n'est pas reconnu, chercher le plus grand numéro numérique
// $allDevis = $devisRepository->findBy(['statut' => $status]);
// $maxNum = 0;
//
// foreach ($allDevis as $devisItem) {
// $currentNum = $devisItem->getNum();
// if (preg_match('/^F(\d+)$/', $currentNum, $matches)) {
// $numValue = (int)$matches[1];
// if ($numValue > $maxNum) {
// $maxNum = $numValue;
// }
// }
// }
//
// $count = $maxNum > 0 ? $maxNum + 1 : 1;
// }
// }
// else {
// // Aucune facture existante
// $count = 1;
// }
//
// // Génération du numéro
// $tt = "F" . $count;
//
// // Vérification de l'existence du numéro et incrémentation si nécessaire
// while ($devisRepository->findOneBy(['num' => $tt])) {
// $count++;
// $tt = "F" . $count;
// }
//
// if ($form->isSubmitted() && $form->isValid()) {
// $blold = $request->request->all('devisfu');
//
// $fournisseur = $request->request->get('fournisseurs');
// $fournisseurrepo = $fournisseurRepository->find($fournisseur);
// $clienttt = $request->request->get('clienttt');
// $clientf = $clientRepository->findOneBy(['id' => $clienttt]);
//
// if ($request->request->get('codenew') !=0 or $request->request->get('base') !=0 or $request->request->get('total'))
// {
// //Calcule partiel
// $codenew = $request->request->get('codenew');
// $basenew = $request->request->get('base');
// $tauxnew = $request->request->get('taux');
// $totalnew = $request->request->get('total');
// $montantnew = $request->request->get('montant');
// $totalhtnew = $request->request->get('totalht');
// $totalttcnew = $request->request->get('totalttc');
//// $acompte= $request->request->get('acompte');
// $qtetotalnew = $request->request->get('qttotal');
// $netapayernew = $request->request->get('netapayer');
//
// $devi->setVendeur($fournisseur);
// $devi->setCode($codenew);
// $devi->setQttotal($qtetotalnew);
// $devi->setBase($basenew);
// $devi->setTaux($tauxnew);
// $devi->setTotal($totalnew);
// $devi->setMontant($montantnew);
// $devi->setTotalht($totalhtnew);
// $devi->setTotalttc($totalttcnew);
// $devi->setClient($clientf);
// $devi->setStatut("Facture");
// $devi->setFournisseur($fournisseurrepo);
// // Convertir le tableau d'IDs en chaîne JSON
// $devi->setIddevisold(json_encode($blold));
//// $devi->setAcompte($acompte);
//// $devi->setNetapayer($netapayer);
// $devisRepository->save($devi, true);
// }
// else{
// //calcule total
// $code = $request->request->get('code');
// $base = $request->request->get('base');
// $taux = $request->request->get('taux');
// $total = $request->request->get('total');
// $montant = $request->request->get('montant');
// $totalht = $request->request->get('totalht');
// $totalttc = $request->request->get('totalttc');
//// $acompte= $request->request->get('acompte');
// $qtetotal = $request->request->get('qttotal');
// $netapayer = $request->request->get('netapayer');
//
// $devi->setVendeur($fournisseur);
// $devi->setCode($code);
// $devi->setQttotal($qtetotal);
// $devi->setBase($base);
// $devi->setTaux($taux);
// $devi->setTotal($total);
// $devi->setMontant($montant);
// $devi->setTotalht($totalht);
// $devi->setTotalttc($totalttc);
// $devi->setClient($clientf);
// $devi->setStatut("Facture");
// $devi->setFournisseur($fournisseurrepo);
// // Convertir le tableau d'IDs en chaîne JSON
// $devi->setIddevisold(json_encode($blold));
//// $devi->setAcompte($acompte);
//// $devi->setNetapayer($netapayer);
// $devisRepository->save($devi, true);
// }
//
//
//
//
// // Logique pour la mise à jour du statut de la BL et gestion des produits facturés
// // Logique pour la mise à jour du statut de la BL et gestion des produits facturés
// $factureIds = []; // Tableau pour stocker les IDs des produits facturés
//
// foreach ($blold as $blss) {
// $a = $devisRepository->findOneBy(['id' => $blss]);
//
// // Initialiser $existingIds à un tableau vide si `Idsfacts` est vide
// $existingIds = [];
// if ($a->getIdsfacts()) {
// // Si `Idsfacts` contient des données, on le décode en tableau
// $existingIds = json_decode($a->getIdsfacts(), true);
// }
//
// if ($a->getIdsfacts()) {
// // Si `IsFact` est coché, vérifier `qterest == 0` pour chaque produit
// foreach ($a->getProduit() as $produit) {
// if ($produit->getQterest() == 0) {
// // Si `qterest == 0`, on ne permet pas de refacturer ce produit
// $factureIds[] = $produit->getId(); // On ajoute l'ID du produit facturé
//
// // On met à jour les quantités
// $produit->setQte($produit->getQte() + $produit->getQtef());
// $produit->setQterest($produit->getQterest() - $produit->getQtef());
// }
// }
// // Mise à jour du statut de la BL à "Facture"
// $a->setStatut("Facture");
// } else {
// // Si `IsFact` n'est pas coché, on change directement le statut à "BLF"
// $a->setStatut("BLF");
// }
//
// // Fusionner les `IDs` existants avec ceux des nouveaux produits facturés
// $factureIds = array_merge($existingIds, $factureIds);
//
// // Convertir le tableau des `IDs` en JSON avant de le stocker dans `Idsfacts`
// $a->setIdsfacts(json_encode($factureIds));
//
// // Sauvegarder les modifications dans la base de données
// $devisRepository->save($a, true);
// }
//
//
// foreach ($blold as $blss) {
// $a = $devisRepository->findOneBy(['id' => $blss]);
// $a->setStatut("Blf");
// $a->setIdfacture($devi->getNum());
// $devisRepository->save($a, true);
// }
//
//
// if ($nbr == 1) {
// $pr = new Produit();
// $type = $request->request->get('type_1');
// $quantity = $request->request->get('qte_1');
// $tva = $request->request->get('tva_1');
//
// $qte = $famillesdarticlesRepository->findBy(['reference' => $type]);
// /* if ($devi->getStatut() == "Facture") {
// if (!empty($qte)) {
// $famillesdarticles = $qte[0];
// $quantitee = $famillesdarticles->getQunatity() - $quantity;
// $famillesdarticles->setQunatity($quantitee);
// $famillesdarticlesRepository->save($famillesdarticles, true);
//
// }
// }*/
//
//
// $prix = $request->request->get('prix_1');
// $remise = $request->request->get('remise_1');
// $montant = $request->request->get('montantht_1');
// $desinagtion = $request->request->get('designation_1');
// $deviss = $request->request->get('devis_1');
// $coursdejours = $request->request->get('coursdejours_1');
// $prixdt = $request->request->get('prixdt_1');
//
//// if( $typeValue === "Aiguilles"){
//// $pr->setType($a->getNom());}
//// else{
//// $pr->setType($a->getReference());
//// }
// $pr->setDeviss($deviss);
// $pr->setCoursdejours($coursdejours);
// $pr->setPrixunitdt($prixdt);
//
// $pr->setType($type);
// $pr->setQte($quantity);
// $pr->setTva($tva);
// $pr->setPrix($prix);
// $pr->setRemise($remise);
// $pr->setMontantht($montant);
// $pr->setDesignation($desinagtion);
// $pr->setDevis($devi);
// $produitRepository->save($pr, true);
// }
// elseif ($nbr > 1) {
// for ($i = 1; $i <= $nbr; $i++) {
//
// if ($request->request->get('type_' . $i)) {
//
//// dd($request->request->get('type'.$i));
// $pr = new Produit();
// $type = $request->request->get('type_' . $i);
// $quantity = $request->request->get('qte_' . $i);
// $tva = $request->request->get('tva_' . $i);
// $qte = $famillesdarticlesRepository->findBy(['reference' => $type]);
// /*if ($devi->getStatut() == "Facture") {
// if (!empty($qte)) {
// $famillesdarticles = $qte[0];
// $quantitee = $famillesdarticles->getQunatity() - $quantity;
// $famillesdarticles->setQunatity($quantitee);
// $famillesdarticlesRepository->save($famillesdarticles, true);
//
// }
// }*/
//
//// $typePosition = strpos($type, "-type:");
//// if ($typePosition !== false) {
//// // Extraire la valeur après "-type:"
//// $typeValue = substr($type, $typePosition + strlen("-type:"));
////
//// // Supprimer les espaces avant et après la valeur
//// $typeValue = trim($typeValue);
////
////
//// }
//// if ($typePosition !== false) {
//// // Extraire la valeur avant "-type:"
//// $valueBeforeType = substr($type, 0, $typePosition);
////
//// // Supprimer les espaces avant et après la valeur
//// $valueBeforeType = trim($valueBeforeType);
////
//// // Affiche "VO 65 41 S007"
//// }
//// //dd($typeValue);
//// if( $typeValue === "Aiguilles"){
//// $a=$aiguillesRepository->find(['id'=>$valueBeforeType]);
//// if ($devi->getStatut() === "Facture") {
//// $a->setQuantty($a->getQuantty() - $quantity);
//// }
//// $aiguillesRepository->save($a,true);
//// }
//// elseif ( $typeValue === "Platines"){
//// $a=$platinesRepository->find(['id'=>$valueBeforeType]);
//// if ($devi->getStatut() === "Facture") {
//// $a->setQuantity($a->getQuantity() - $quantity);
//// }
//// $platinesRepository->save($a,true);
////
//// }
//// else{
//// $a=$courroieRepository->find(['id'=>$valueBeforeType]);
//// if ($devi->getStatut() === "Facture") {
//// $a->setQuantity($a->getQuantity() - $quantity);
//// }
//// $courroieRepository->save($a,true);
//// }
// $prix = $request->request->get('prix_' . $i);
// $montant = $request->request->get('montantht_' . $i);
// $desinagtion = $request->request->get('designation_' . $i);
// $remise = $request->request->get('remise_' . $i);
// $deviss = $request->request->get('devis_' . $i);
// $coursdejours = $request->request->get('coursdejours_' . $i);
// $prixdt = $request->request->get('prixdt_' . $i);
//
//
//// if( $typeValue === "Aiguilles"){
//// $pr->setType($a->getNom());}
//// else{
//// $pr->setType($a->getReference());}
// $pr->setDeviss($deviss);
// $pr->setCoursdejours($coursdejours);
// $pr->setPrixunitdt($prixdt);
// $pr->setType($type);
// $pr->setQte($quantity);
// $pr->setTva($tva);
// $pr->setPrix($prix);
// $pr->setRemise($remise);
// $pr->setDesignation($desinagtion);
// $pr->setMontantht($montant);
// $pr->setDevis($devi);
// $produitRepository->save($pr, true);
// }
//
// }
// }
//
//
//
// return $this->redirectToRoute('app_devis_liste_facture', [], Response::HTTP_SEE_OTHER);
// }
//
// return $this->renderForm('devis/fusionner.html.twig', [
// 'devi' => $devi,
// 'tt'=>$tt,
// 'devifus' => $devifus,
// 'form' => $form,
// 'aiguilles' => $aiguilles,
// 'platines' => $platines,
// 'courroi' => $courroi,
// 'familles' => $familles,
// 'familleall' => $familleall,
// 'tabfournisseurs' => $tabfournisseurs
// ]);
// }
//************ fin ancien 16-02-2026**************
//
// $totstatinter = $devisRepository->findBy(['statut' => "Intervention"]);
// $totstatu = $devisRepository->findBy(['statut' => "Facture"]);
// $totstatur= $devisRepository->findBy(['statut' => "Facture-R"]);
// $totstatua= $devisRepository->findBy(['statut' => "Facture-A"]);
// if ($totstatu)
// {
// $fac= count($totstatu);
// }
// else
// {
// $fac=0;
//
// }
//
// if ($totstatur)
// {
// $facr= count($totstatur);
// }
// else
// {
// $facr=0;
//
// }
//
// if ($totstatinter)
// {
// $facinter= count($totstatinter);
// }
// else
// {
// $facinter=0;
//
// }
//
// if ($totstatua)
// {
// $faca= count($totstatua);
// }
// else
// {
// $faca=0;
//
// }
//
// $count = $fac +$faca+ $facr +$facinter;
// if ($count == 0) {
// $count = 1;
// } else {
// $count = $count + 1;
// }
//
//
//
// $tt = "F" . $count;
//
//
//
//
//
//
// $test = $devisRepository->findOneBy(['num' => $tt]);
//
//
//
#[Route('/Bl', name: 'app_devis_fbl', methods: ['GET'])]
public function indexj(DevisRepository $devisRepository, ClientRepository $clientRepository): Response
{
return $this->render('devis/blf.html.twig', [
'devis' => $devisRepository->findBy(['statut' => "Bl"]),
'clients' => $clientRepository->findAll()
]);
}
#[Route('/Bl/bl', name: 'app_devis_getbl', methods: ['GET', 'POST'])]
public function indexjb(Request $request, DevisRepository $devisRepository, ClientRepository $clientRepository): Response
{
$cl = $request->request->get('client');
$clien = $clientRepository->findOneBy(['id' => $cl]);
return $this->render('devis/blajax.html.twig', [
'devis' => $devisRepository->findBy(['statut' => "Bl", 'client' => $clien]),
]);
}
#[Route('/pdfclient/{id}', name: 'app_devis_pdf_client', methods: ['GET'])]
public function pdfclient(HistoriquedemandedevisRepository $historiquedemandedevisRepository,$id, DevisRepository $devisRepository): Response
{
$devi = $devisRepository->find($id);
// Vérifiez si l'objet $devi a été trouvé
if (!$devi) {
$devi = $historiquedemandedevisRepository->find($id);
if (!$devi) {
throw $this->createNotFoundException('No devis found for id ' . $id);
}
}
// Créer une instance de Dompdf
$pdfOptions = new Options();
$pdfOptions->set('isHtml5ParserEnabled', true);
$pdfOptions->set('isRemoteEnabled', true);
$dompdf = new Dompdf($pdfOptions);
$fmt = new NumberFormatter('fr', NumberFormatter::SPELLOUT);
// $tot = $fmt->format($devi->getTotalttc());
$totalTtc = $devi->getTotalttc();
// Assurez-vous que $totalTtc est un nombre
$totalTtc = floatval($totalTtc);
$tot = $fmt->format($totalTtc);
// Générer le HTML à partir de la twig
// dd($devi, $devi->getClient());
// dd($devi->getFournisseur(),$devi);
// Convertir le total TTC en nombre à virgule
$totalTtc = $devi->getTotalttc();
$totalTtc = floatval($totalTtc);
// Séparer les dinars des millimes
$dinars = floor($totalTtc);
$millimes = round(($totalTtc - $dinars) * 1000);
// Formatage des dinars et millimes
$fmt = new NumberFormatter('fr', NumberFormatter::SPELLOUT);
$dinarsInWords = $fmt->format($dinars);
$millimesInWords = $fmt->format($millimes);
// Combine the result in the format: "mille trois cent six dinars, quatre cent millimes"
$totalInWords = $dinarsInWords . ' dinars, ' . $millimesInWords . ' millimes';
$html = $this->renderView('devis/pdfclient.html.twig', [
'devi' => $devi,
'tott' => $tot,
'totalInWords'=>$totalInWords
]);
// Charger le contenu HTML dans Dompdf
$dompdf->loadHtml($html);
// // Optionnel : définir les options de configuration de Dompdf si nécessaire
// $dompdf->setPaper('A4', 'portrait');
$dompdf->setPaper('A4', 'portrait');
$customPaper = array(0, 0, 750, 900);
$dompdf->setPaper($customPaper);
$contxt = stream_context_create([
'ssl' => [
'verify_peer' => FALSE,
'verify_peer_name' => FALSE,
'allow_self_signed'=> TRUE
]
]);
$dompdf->setHttpContext($contxt);
// Rendre le HTML en PDF
$dompdf->render();
// Générer la réponse HTTP avec le PDF en tant que contenu
$response = new Response($dompdf->output());
$response->headers->set('Content-Type', 'application/pdf');
// Optionnel : définir le nom du fichier de téléchargement
$response->headers->set('Content-Disposition', 'attachment; filename="Facture' . $devi->getId() . '.pdf"');
return $response;
}
#[Route('/pdf-devise/{id}', name: 'app_devis_pdf_devise', methods: ['GET'])]
public function pdfdevise(HistoriquedemandedevisRepository $historiquedemandedevisRepository,$id, DevisRepository $devisRepository): Response
{
$devi = $devisRepository->find($id);
// Vérifiez si l'objet $devi a été trouvé
if (!$devi) {
$devi = $historiquedemandedevisRepository->find($id);
if (!$devi) {
throw $this->createNotFoundException('No devis found for id ' . $id);
}
}
// Créer une instance de Dompdf
$pdfOptions = new Options();
$pdfOptions->set('isHtml5ParserEnabled', true);
$pdfOptions->set('isRemoteEnabled', true);
$dompdf = new Dompdf($pdfOptions);
$fmt = new NumberFormatter('fr', NumberFormatter::SPELLOUT);
// $tot = $fmt->format($devi->getTotalttc());
$totalTtc = $devi->getTotalttc();
// Assurez-vous que $totalTtc est un nombre
$totalTtc = floatval($totalTtc);
$tot = $fmt->format($totalTtc);
// Générer le HTML à partir de la twig
// dd($devi, $devi->getClient());
// dd($devi->getFournisseur(),$devi);
// Convertir le total TTC en nombre à virgule
$totalTtc = $devi->getTotalttc();
$totalTtc = floatval($totalTtc);
// Séparer les dinars des millimes
$dinars = floor($totalTtc);
$millimes = round(($totalTtc - $dinars) * 1000);
// Formatage des dinars et millimes
$fmt = new NumberFormatter('fr', NumberFormatter::SPELLOUT);
$dinarsInWords = $fmt->format($dinars);
$millimesInWords = $fmt->format($millimes);
// Combine the result in the format: "mille trois cent six dinars, quatre cent millimes"
// $totalInWords = $dinarsInWords . ' dinars, ' . $millimesInWords . ' millimes';
$totalInWords = $dinarsInWords . ' , ' . $millimesInWords . ' (Devise)';
$html = $this->renderView('devis/pdfdevise.html.twig', [
'devi' => $devi,
'tott' => $tot,
'totalInWords'=>$totalInWords
]);
// Charger le contenu HTML dans Dompdf
$dompdf->loadHtml($html);
// // Optionnel : définir les options de configuration de Dompdf si nécessaire
// $dompdf->setPaper('A4', 'portrait');
$dompdf->setPaper('A4', 'portrait');
$customPaper = array(0, 0, 750, 900);
$dompdf->setPaper($customPaper);
$contxt = stream_context_create([
'ssl' => [
'verify_peer' => FALSE,
'verify_peer_name' => FALSE,
'allow_self_signed'=> TRUE
]
]);
$dompdf->setHttpContext($contxt);
// Rendre le HTML en PDF
$dompdf->render();
// Générer la réponse HTTP avec le PDF en tant que contenu
$response = new Response($dompdf->output());
$response->headers->set('Content-Type', 'application/pdf');
// Optionnel : définir le nom du fichier de téléchargement
$response->headers->set('Content-Disposition', 'attachment; filename="Facture' . $devi->getId() . '.pdf"');
return $response;
}
#[Route('/pdf/{id}', name: 'app_devis_pdf', methods: ['GET'])]
public function pdf(HistoriquedemandedevisRepository $historiquedemandedevisRepository,$id, DevisRepository $devisRepository): Response
{
$devi = $devisRepository->find($id);
// Vérifiez si l'objet $devi a été trouvé
if (!$devi) {
$devi = $historiquedemandedevisRepository->find($id);
if (!$devi) {
throw $this->createNotFoundException('No devis found for id ' . $id);
}
}
// Créer une instance de Dompdf
$pdfOptions = new Options();
$pdfOptions->set('isHtml5ParserEnabled', true);
$pdfOptions->set('isRemoteEnabled', true);
$dompdf = new Dompdf($pdfOptions);
$fmt = new NumberFormatter('fr', NumberFormatter::SPELLOUT);
// $tot = $fmt->format($devi->getTotalttc());
$totalTtc = $devi->getTotalttc();
// Assurez-vous que $totalTtc est un nombre
$totalTtc = floatval($totalTtc);
$tot = $fmt->format($totalTtc);
// Générer le HTML à partir de la twig
// dd($devi, $devi->getClient());
// dd($devi->getFournisseur(),$devi);
// Convertir le total TTC en nombre à virgule
$totalTtc = $devi->getTotalttc();
$totalTtc = floatval($totalTtc);
// Séparer les dinars des millimes
$dinars = floor($totalTtc);
$millimes = round(($totalTtc - $dinars) * 1000);
// Formatage des dinars et millimes
$fmt = new NumberFormatter('fr', NumberFormatter::SPELLOUT);
$dinarsInWords = $fmt->format($dinars);
$millimesInWords = $fmt->format($millimes);
// Combine the result in the format: "mille trois cent six dinars, quatre cent millimes"
$totalInWords = $dinarsInWords . ' dinars, ' . $millimesInWords . ' millimes';
$html = $this->renderView('devis/pdf.html.twig', [
'devi' => $devi,
'tott' => $tot,
'totalInWords'=>$totalInWords,
'blOriginaux' => $devi instanceof Devis ? $this->getBlOriginauxNums($devi, $devisRepository) : null,
]);
// Charger le contenu HTML dans Dompdf
$dompdf->loadHtml($html);
// // Optionnel : définir les options de configuration de Dompdf si nécessaire
// $dompdf->setPaper('A4', 'portrait');
$dompdf->setPaper('A4', 'portrait');
$customPaper = array(0, 0, 750, 900);
$dompdf->setPaper($customPaper);
$contxt = stream_context_create([
'ssl' => [
'verify_peer' => FALSE,
'verify_peer_name' => FALSE,
'allow_self_signed'=> TRUE
]
]);
$dompdf->setHttpContext($contxt);
// Rendre le HTML en PDF
$dompdf->render();
// Générer la réponse HTTP avec le PDF en tant que contenu
$response = new Response($dompdf->output());
$response->headers->set('Content-Type', 'application/pdf');
// Optionnel : définir le nom du fichier de téléchargement
$response->headers->set('Content-Disposition', 'attachment; filename="Facture' . $devi->getId() . '.pdf"');
return $response;
}
#[Route('/histo_pdf/{id}', name: 'app_histo_demandedevis_pdf', methods: ['GET'])]
public function histopdf(HistoriquedemandedevisRepository $historiquedemandedevisRepository,$id, DevisRepository $devisRepository): Response
{
$devi = $historiquedemandedevisRepository->find($id);
// Vérifiez si l'objet $devi a été trouvé
if (!$devi) {
throw $this->createNotFoundException('No devis found for id ' . $id);
}
// Créer une instance de Dompdf
$pdfOptions = new Options();
$pdfOptions->set('isHtml5ParserEnabled', true);
$pdfOptions->set('isRemoteEnabled', true);
$dompdf = new Dompdf($pdfOptions);
$fmt = new NumberFormatter('fr', NumberFormatter::SPELLOUT);
$tot = $fmt->format($devi->getTotalttc());
// Générer le HTML à partir de la twig
$html = $this->renderView('devis/histopdf.html.twig', [
'devi' => $devi,
'tott' => $tot,
]);
// Charger le contenu HTML dans Dompdf
$dompdf->loadHtml($html);
// // Optionnel : définir les options de configuration de Dompdf si nécessaire
// $dompdf->setPaper('A4', 'portrait');
$dompdf->setPaper('A4', 'portrait');
$customPaper = array(0, 0, 750, 900);
$dompdf->setPaper($customPaper);
$contxt = stream_context_create([
'ssl' => [
'verify_peer' => FALSE,
'verify_peer_name' => FALSE,
'allow_self_signed'=> TRUE
]
]);
$dompdf->setHttpContext($contxt);
// Rendre le HTML en PDF
$dompdf->render();
// Générer la réponse HTTP avec le PDF en tant que contenu
$response = new Response($dompdf->output());
$response->headers->set('Content-Type', 'application/pdf');
// Optionnel : définir le nom du fichier de téléchargement
$response->headers->set('Content-Disposition', 'attachment; filename="Facture' . $devi->getId() . '.pdf"');
return $response;
}
function nombre_en_toutes_lettres(int $nombre): string
{
if ($nombre === 0) {
return 'zéro';
}
// Découpage en millions, milliers, unités
$millions = (int) ($nombre / 1000000);
$reste = $nombre % 1000000;
$milliers = (int) ($reste / 1000);
$unites = $reste % 1000;
$chunks = [];
if ($millions > 0) {
$chunks[] = $this->_convertir_trois_chiffres($millions) . ' million' . ($millions > 1 ? 's' : '');
}
if ($milliers > 0) {
$chunks[] = $this->_convertir_trois_chiffres($milliers) . ' mille';
}
if ($unites > 0) {
$chunks[] = $this->_convertir_trois_chiffres($unites);
}
return implode(' ', $chunks);
}
/**
* Convertit un nombre de 0 à 999 en lettres.
*/
function _convertir_trois_chiffres(int $nombre): string
{
static $unités = [
1 => 'un', 2 => 'deux', 3 => 'trois', 4 => 'quatre', 5 => 'cinq',
6 => 'six', 7 => 'sept', 8 => 'huit', 9 => 'neuf', 10 => 'dix',
11 => 'onze', 12 => 'douze', 13 => 'treize', 14 => 'quatorze',
15 => 'quinze', 16 => 'seize', 17 => 'dix-sept',
18 => 'dix-huit', 19 => 'dix-neuf'
];
static $dizaines = [
1 => 'dix', 2 => 'vingt', 3 => 'trente', 4 => 'quarante',
5 => 'cinquante', 6 => 'soixante', 7 => 'soixante-dix',
8 => 'quatre-vingt', 9 => 'quatre-vingt-dix'
];
if ($nombre === 0) {
return '';
}
$centaines = (int) ($nombre / 100);
$reste = $nombre % 100;
$chunks = [];
// Gestion des centaines
if ($centaines > 0) {
if ($centaines === 1) {
$chunks[] = 'cent';
} else {
$chunks[] = $unités[$centaines] . ' cent';
}
}
// Gestion des dizaines/unités
if ($reste === 0) {
// rien de plus
} elseif ($reste < 17) {
$chunks[] = $unités[$reste];
} else {
$dizaine = (int) ($reste / 10);
$unite = $reste % 10;
// Cas particuliers
if ($dizaine === 7) { // soixante-dix
if ($unite === 1) {
$chunks[] = 'soixante et onze';
} else {
$chunks[] = 'soixante-' . $unités[10 + $unite];
}
} elseif ($dizaine === 8) { // quatre-vingt(s)
$mot = 'quatre-vingt' . ($unite === 0 ? 's' : '');
if ($unite > 0) {
$mot .= '-' . ($unite === 1 ? 'un' : $unités[$unite]);
}
$chunks[] = $mot;
} elseif ($dizaine === 9) { // quatre-vingt-dix
if ($unite === 1) {
$chunks[] = 'quatre-vingt-onze';
} else {
$chunks[] = 'quatre-vingt-' . $unités[10 + $unite];
}
} else {
// dizaines normales (20,30,40,50,60)
$mot = $dizaines[$dizaine];
if ($unite === 1) {
$mot .= ' et un';
} elseif ($unite > 1) {
$mot .= '-' . $unités[$unite];
}
$chunks[] = $mot;
}
}
// Gestion de l'accord de "cent" au pluriel sauf si suivi de dizaines/unités
// On va simplifier en ne mettant pas de 's' si le nombre n'est pas exactement une centaine ronde.
// Déjà fait implicitement car on a ajouté "cent" ou "X cent" sans 's' ici, on ajustera après coup.
// Pour les centaines pures (ex: 200) on veut "deux cents".
if ($centaines > 1 && $reste === 0) {
// On remplace "X cent" par "X cents"
$last = array_pop($chunks);
$chunks[] = $last . 's';
} elseif ($centaines === 1 && $reste === 0) {
// "cent" reste "cent" (pas de 's')
// déjà correct
}
return implode(' ', $chunks);
}
#[Route('/pdfimp/{id}', name: 'app_devis_pdfimp', methods: ['GET'])]
public function pdfimp($id, DevisRepository $devisRepository): Response
{
$devi = $devisRepository->find($id);
if (!$devi) {
throw $this->createNotFoundException('Devis non trouvé.');
}
$montant = (string) $devi->getTotalttc(); // ex: "2.177"
// Conversion de la partie entière et décimale en lettres
if (strpos($montant, '.') !== false) {
[$partieEntiere, $partieDecimale] = explode('.', $montant);
$entierTexte = $this->nombre_en_toutes_lettres((int)$partieEntiere);
$decimaleTexte = $this->nombre_en_toutes_lettres((int)$partieDecimale);
$texte = ucfirst($entierTexte) . ' virgule ' . $decimaleTexte;
} else {
$texte = ucfirst($this->nombre_en_toutes_lettres((int)$montant));
}
// --- Configuration Dompdf (inchangée) ---
$pdfOptions = new Options();
$pdfOptions->set('isHtml5ParserEnabled', true);
$pdfOptions->set('isRemoteEnabled', true);
$dompdf = new Dompdf($pdfOptions);
// Conversion du total TTC pour les dinars / millimes
$totalTtc = (float) $devi->getTotalttc();
$dinars = (int) floor($totalTtc);
$millimes = (int) round(($totalTtc - $dinars) * 1000);
// Passage en lettres
$dinarsInWords = $this->nombre_en_toutes_lettres($dinars);
$millimesInWords = $this->nombre_en_toutes_lettres($millimes);
$totalInWords = $dinarsInWords . ' dinars, ' . $millimesInWords . ' millimes';
// Rendu HTML
$html = $this->renderView('devis/pdfimp.html.twig', [
'devi' => $devi,
'tott' => $texte,
'totalInWords' => $totalInWords,
'blOriginaux' => $this->getBlOriginauxNums($devi, $devisRepository),
]);
// ... suite identique (Dompdf, en-têtes, etc.)
$dompdf->loadHtml($html);
$dompdf->setPaper([0, 0, 750, 900]);
$contxt = stream_context_create(['ssl' => ['verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true]]);
$dompdf->setHttpContext($contxt);
$dompdf->render();
return new Response($dompdf->output(), 200, [
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'attachment; filename="Facture_' . $devi->getId() . '.pdf"',
]);
}
// #[Route('/pdfimp/{id}', name: 'app_devis_pdfimp', methods: ['GET'])]
// public function pdfimp($id, DevisRepository $devisRepository): Response
// {
// $devi = $devisRepository->find($id);
//
// if (!$devi) {
// throw $this->createNotFoundException('Devis non trouvé.');
// }
//
// $montant = (string) $devi->getTotalttc(); // ex: "2.177"
//// $montant = (string) 1833.500;
// $fmt = new NumberFormatter('fr', NumberFormatter::SPELLOUT);
//
// if (strpos($montant, '.') !== false) {
// [$partieEntiere, $partieDecimale] = explode('.', $montant);
// $entierTexte = $fmt->format((int)$partieEntiere);
// $decimaleTexte = $fmt->format((int)$partieDecimale);
// $texte = ucfirst($entierTexte) . ' virgule ' . $decimaleTexte;
// } else {
// $texte = ucfirst($fmt->format((int)$montant));
// }
//
//// dd($montant, $texte); // pour vérifier
//
// // --- Configuration Dompdf ---
// $pdfOptions = new Options();
// $pdfOptions->set('isHtml5ParserEnabled', true);
// $pdfOptions->set('isRemoteEnabled', true);
//
// $dompdf = new Dompdf($pdfOptions);
//
// // Convertir le total TTC en nombre à virgule
// $totalTtc = $devi->getTotalttc();
// $totalTtc = floatval($totalTtc);
//
// // Séparer les dinars des millimes
// $dinars = (int) floor($totalTtc);
// $millimes = (int) round(($totalTtc - $dinars) * 1000);
//
//
// // Formatage des dinars et millimes
// $fmt = new NumberFormatter('fr', NumberFormatter::SPELLOUT);
// $dinarsInWords = $fmt->format($dinars);
// $millimesInWords = $fmt->format($millimes);
//
// // Combine the result in the format: "mille trois cent six dinars, quatre cent millimes"
// $totalInWords = $dinarsInWords . ' dinars, ' . $millimesInWords . ' millimes';
//// dd($dinarsInWords,$millimesInWords,$totalInWords);
// // --- HTML pour le PDF ---
// $html = $this->renderView('devis/pdfimp.html.twig', [
// 'devi' => $devi,
// 'tott' => $texte,
// 'totalInWords'=>$totalInWords
// ]);
//
// $dompdf->loadHtml($html);
// $dompdf->setPaper('A4', 'portrait');
//
// // Taille personnalisée (optionnelle)
// $customPaper = [0, 0, 750, 900];
// $dompdf->setPaper($customPaper);
//
// // Pour les images ou liens externes non sécurisés
// $contxt = stream_context_create([
// 'ssl' => [
// 'verify_peer' => false,
// 'verify_peer_name' => false,
// 'allow_self_signed' => true,
// ]
// ]);
// $dompdf->setHttpContext($contxt);
//
// $dompdf->render();
//
// return new Response($dompdf->output(), 200, [
// 'Content-Type' => 'application/pdf',
// 'Content-Disposition' => 'attachment; filename="Facture_' . $devi->getId() . '.pdf"',
// ]);
// }
// #[Route('/pdfimp/{id}', name: 'app_devis_pdfimp', methods: ['GET'])]
// public function pdfimp($id, DevisRepository $devisRepository): Response
// {
// $devi = $devisRepository->find($id);
//
// $montant = $devi->getTotalttc();
// $dinars = floor($montant);
// $centimes = round(($montant - $dinars) * 100);
//
// $fmt = new NumberFormatter('fr', NumberFormatter::SPELLOUT);
// $dinarsEnLettres = $fmt->format($dinars);
// $centimesEnLettres = $fmt->format($centimes);
//
// $montantEnLettres = ucfirst("$dinarsEnLettres dinars");
// if ($centimes > 0) {
// $montantEnLettres .= " et $centimesEnLettres centimes";
// }
//
// // Créer une instance de Dompdf
// $pdfOptions = new Options();
// $pdfOptions->set('isHtml5ParserEnabled', true);
// $pdfOptions->set('isRemoteEnabled', true);
// $dompdf = new Dompdf($pdfOptions);
// $fmt = new NumberFormatter('fr', NumberFormatter::SPELLOUT);
// $tot = $fmt->format($devi->getTotalttc());
// dd($tot,$devi->getTotalttc(),$montantEnLettres);
// // Générer le HTML à partir de la twig
//
// $html = $this->renderView('devis/pdfimp.html.twig', [
// 'devi' => $devi,
// 'tott' => $montantEnLettres,
// ]);
//
// // Charger le contenu HTML dans Dompdf
// $dompdf->loadHtml($html);
//
//// // Optionnel : définir les options de configuration de Dompdf si nécessaire
//// $dompdf->setPaper('A4', 'portrait');
// $dompdf->setPaper('A4', 'portrait');
// $customPaper = array(0, 0, 750, 900);
// $dompdf->setPaper($customPaper);
//
// $contxt = stream_context_create([
// 'ssl' => [
// 'verify_peer' => FALSE,
// 'verify_peer_name' => FALSE,
// 'allow_self_signed'=> TRUE
// ]
// ]);
// $dompdf->setHttpContext($contxt);
// // Rendre le HTML en PDF
// $dompdf->render();
//
// // Générer la réponse HTTP avec le PDF en tant que contenu
// $response = new Response($dompdf->output());
// $response->headers->set('Content-Type', 'application/pdf');
//
// // Optionnel : définir le nom du fichier de téléchargement
// $response->headers->set('Content-Disposition', 'attachment; filename="Facture' . $devi->getId() . '.pdf"');
//
//
// return $response;
// }
#[Route('/new', name: 'app_devis_new', methods: ['GET', 'POST'])]
public function new(DevisStockArchiveSynchronizer $stockArchiveSynchronizer, ArchivearticleRepository $archivearticleRepository,FournisseurRepository $fournisseurRepository, FamillesRepository $famillesRepository, FamillesdarticlesRepository $famillesdarticlesRepository, ProduitRepository $produitRepository, CourroieRepository $courroieRepository, PlatinesRepository $platinesRepository, AiguillesRepository $aiguillesRepository, Request $request, DevisRepository $devisRepository): Response
{
// $fournisseurs = $fournisseurRepository->findAll();
//
// $tabfournisseurs[] = [
// 'nom' => "Cosa",
// 'prenom' => "Tunisie",
// 'numeroTelephone' => "",
// ];
// foreach ($fournisseurs as $fournisseur) {
// $tabfournisseurs[] = [
// "Cosa Tunisie",
// 'nom' => $fournisseur->getNom(),
// 'prenom' => $fournisseur->getPrenom(),
// 'numeroTelephone' => $fournisseur->getTel(),
// ];
// }
$fournisseurs = $fournisseurRepository->findAll();
// $tabfournisseurs[] = [
// 'nom' => "Cosa",
// 'prenom' => "Tunisie",
// 'numeroTelephone' => "",
// ];
$tabfournisseurs = []; // Initialiser vide
foreach ($fournisseurs as $fournisseur) {
$tabfournisseurs[] = [
// "Cosa Tunisie",
'id' => $fournisseur->getId(),
'nom' => $fournisseur->getNom(),
'prenom' => $fournisseur->getPrenom(),
'numeroTelephone' => $fournisseur->getTel(),
];
}
$familleall = $famillesRepository->findAll();
$familles = $famillesdarticlesRepository->findAll();
$nbr = $request->request->get('nbrc_a');
$courroi = $courroieRepository->findAll();
$platines = $platinesRepository->findAll();
$aiguilles = $aiguillesRepository->findAll();
$devi = new Devis();
$form = $this->createForm(DevisType::class, $devi);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$devi->setDatecreation(new DateTime('now', new DateTimeZone('Africa/Tunis')));
$fournisseur = $request->request->get('fournisseur');
// dd($request->request->all());
$code = $request->request->get('code');
$base = $request->request->get('base');
$taux = $request->request->get('taux');
$total = $request->request->get('total');
$montant = $request->request->get('montant');
$totalht = $request->request->get('totalht');
$totalttc = $request->request->get('totalttc');
// $acompte= $request->request->get('acompte');
$qtetotal = $request->request->get('qttotal');
$netapayer = $request->request->get('netapayer');
$fournisseur = $request->request->get('fournisseur');
$four = $fournisseurRepository->findOneBy(['id'=>$fournisseur]);
$devi->setFournisseur($four);
$devi->setVendeur($fournisseur);
$devi->setCode($code);
$devi->setQttotal($qtetotal);
$devi->setBase($base);
$devi->setTaux($taux);
$devi->setTotal($total);
$devi->setMontant($montant);
$devi->setTotalht($totalht);
$devi->setTotalttc($totalttc);
$devi->setOldtype($devi->getStatut());
// $devi->setAcompte($acompte);
// $devi->setNetapayer($netapayer);
$devisRepository->save($devi, true);
if ($nbr == 1) {
// dd($nbr,$request->request->all());
$pr = new Produit();
$type = $request->request->get('type_1');
$quantity = $request->request->get('qte_1');
$tva = $request->request->get('tva_1');
$prix = $request->request->get('prix_1');
$remise = $request->request->get('remise_1');
$montant = $request->request->get('montantht_1');
$desinagtion = $request->request->get('designation_1');
$deviss = $request->request->get('devis_1');
$coursdejours = $request->request->get('coursdejours_1');
$prixdt = $request->request->get('prixdt_1');
$qte = $famillesdarticlesRepository->findBy(['reference' => $type]);
$article = $famillesdarticlesRepository->findOneBy(['reference' => $type]);
if ($devi->getStatut() == "Facture" or $devi->getStatut() == "BL") {
if (!empty($qte)) {
$famillesdarticles = $qte[0];
$quantitee = (float)$famillesdarticles->getQunatity() - (float)$quantity;
$famillesdarticles->setQunatity((string)max(0, $quantitee));
// Soustraction dans qtetotal (comme bon de sortie)
$qtetotalActuel = $famillesdarticles->getQtetotal();
$newqtetotal = $qtetotalActuel !== null ? (float)$qtetotalActuel : 0;
$newqtetotal -= (float)$quantity;
$famillesdarticles->setQtetotal((string)max(0, $newqtetotal));
$famillesdarticlesRepository->save($famillesdarticles, true);
// 🔥 Archivage
$archiveArticle = new Archivearticle();
$lastArchive = $archivearticleRepository->findOneBy(
['reference' => $type],
['datearchive' => 'DESC', 'id' => 'DESC']
);
// Calcul du stock actuel
$currentStock = 0;
if ($lastArchive && $lastArchive->getStock() !== null) {
$currentStock = (float)$lastArchive->getStock();
}
// Nouvelle logique : Si le stock archivé est 0, on prend le stock direct de l'article
if ($currentStock == 0) {
$articleStock = (float)$article->getQunatity() + $quantity; // Supposons que getQte() donne le stock actuel
$newStock = $articleStock - $quantity;
} else {
$newStock = $currentStock - $quantity;
}
$archiveArticle->setStock((string)($famillesdarticles->getQtetotal() ?? 0));
if ($devi->getStatut() == "Facture") {
$archiveArticle->setTypearchive('Facture');
} elseif ($devi->getStatut() == "BL") {
$archiveArticle->setTypearchive('BL');
}
$archiveArticle->setDesignation($desinagtion);
$archiveArticle->setTva($tva);
$archiveArticle->setReference($type);
$archiveArticle->setPrixvente($prix ?? $article->getPrixvente());
$archiveArticle->setQuantity($quantity);
$archiveArticle->setQtemvt("-".$quantity);
$archiveArticle->setFournisseur($article->getFournisseur());
$archiveArticle->setCoefficient($article->getCoefficient());
$archiveArticle->setOperateur($article->getOperateur());
$archiveArticle->setFamilles($article->getFamilles());
$archiveArticle->setPrixachat($article->getPrixachat());
$archiveArticle->setUnite($article->getUnite());
$archiveArticle->setFamillesdarticles($article);
$archiveArticle->setFichevente($devi);
$archiveArticle->setFourclient($devi->getClient()->getRaisonsocial());
$archiveArticle->setNumfiche($devi->getNum());
$archiveArticle->setDatearchive(new \DateTime('now', new \DateTimeZone('Africa/Tunis')));
$archivearticleRepository->save($archiveArticle, true);
}
}
// $typePosition = strpos($type, "-type:");
// if ($typePosition !== false) {
// // Extraire la valeur après "-type:"
// $typeValue = substr($type, $typePosition + strlen("-type:"));
//
// // Supprimer les espaces avant et après la valeur
// $typeValue = trim($typeValue);
//
//
// }
// if ($typePosition !== false) {
// // Extraire la valeur avant "-type:"
// $valueBeforeType = substr($type, 0, $typePosition);
//
// // Supprimer les espaces avant et après la valeur
// $valueBeforeType = trim($valueBeforeType);
//
// // Affiche "VO 65 41 S007"
// }
// //dd($typeValue);
// if( $typeValue === "Aiguilles"){
// $a=$aiguillesRepository->find(['id'=>$valueBeforeType]);
// if ($devi->getStatut() === "Facture") {
// $a->setQuantty($a->getQuantty() - $quantity);
// }
//
// $aiguillesRepository->save($a,true);
//
// }
// elseif ( $typeValue === "Platines"){
// $a=$platinesRepository->find(['id'=>$valueBeforeType]);
// if ($devi->getStatut() === "Facture") {
// $a->setQuantity($a->getQuantity() - $quantity);
// }
// $platinesRepository->save($a,true);
// }
// else{
// $a=$courroieRepository->find(['id'=>$valueBeforeType]);
// if ($devi->getStatut() === "Facture") {
// $a->setQuantity($a->getQuantity() - $quantity);
// }
// $courroieRepository->save($a,true);
//
// }
// if( $typeValue === "Aiguilles"){
// $pr->setType($a->getNom());}
// else{
// $pr->setType($a->getReference());
// }
$pr->setDeviss($deviss);
$pr->setCoursdejours($coursdejours);
$pr->setPrixunitdt($prixdt);
$pr->setType($type);
$pr->setQte($quantity);
$pr->setTva($tva);
$pr->setPrix($prix);
$pr->setRemise($remise);
$pr->setMontantht($montant);
$pr->setDesignation($desinagtion);
$pr->setDevis($devi);
$produitRepository->save($pr, true);
}
elseif ($nbr > 1) {
// dd($nbr,$request->request->all());
for ($i = 1; $i <= $nbr; $i++) {
if ($request->request->get('type_' . $i)) {
// dd($request->request->get('type'.$i));
$pr = new Produit();
$type = $request->request->get('type_' . $i);
$quantity = $request->request->get('qte_' . $i);
$tva = $request->request->get('tva_' . $i);
$prix = $request->request->get('prix_' . $i);
$montant = $request->request->get('montantht_' . $i);
$desinagtion = $request->request->get('designation_' . $i);
$remise = $request->request->get('remise_' . $i);
$deviss = $request->request->get('devis_' . $i);
$coursdejours = $request->request->get('coursdejours_' . $i);
$prixdt = $request->request->get('prixdt_' . $i);
$qte = $famillesdarticlesRepository->findBy(['reference' => $type]);
$article = $famillesdarticlesRepository->findOneBy(['reference' => $type]);
if ($devi->getStatut() == "Facture" or $devi->getStatut() == "BL") {
if (!empty($qte)) {
$famillesdarticles = $qte[0];
$quantitee = (float)$famillesdarticles->getQunatity() - (float)$quantity;
$famillesdarticles->setQunatity((string)max(0, $quantitee));
// Soustraction dans qtetotal (comme bon de sortie)
$qtetotalActuel = $famillesdarticles->getQtetotal();
$newqtetotal = $qtetotalActuel !== null ? (float)$qtetotalActuel : 0;
$newqtetotal -= (float)$quantity;
$famillesdarticles->setQtetotal((string)max(0, $newqtetotal));
$famillesdarticlesRepository->save($famillesdarticles, true);
// 🔥 Archivage
$archiveArticle = new Archivearticle();
$lastArchive = $archivearticleRepository->findOneBy(
['reference' => $type],
['datearchive' => 'DESC', 'id' => 'DESC']
);
// Calcul du stock actuel
$currentStock = 0;
if ($lastArchive && $lastArchive->getStock() !== null) {
$currentStock = (float)$lastArchive->getStock();
}
// Nouvelle logique : Si le stock archivé est 0, on prend le stock direct de l'article
if ($currentStock == 0) {
$articleStock = (float)$article->getQunatity() + $quantity; // Supposons que getQte() donne le stock actuel
$newStock = $articleStock - $quantity;
} else {
$newStock = $currentStock - $quantity;
}
$archiveArticle->setStock((string)($famillesdarticles->getQtetotal() ?? 0));
if ($devi->getStatut() == "Facture") {
$archiveArticle->setTypearchive('Facture');
} elseif ($devi->getStatut() == "BL") {
$archiveArticle->setTypearchive('BL');
}
$archiveArticle->setDesignation($desinagtion);
$archiveArticle->setTva($tva);
$archiveArticle->setReference($type);
$archiveArticle->setPrixvente($prix ?? $article->getPrixvente());
$archiveArticle->setQuantity($quantity);
$archiveArticle->setQtemvt("-".$quantity);
$archiveArticle->setFournisseur($article->getFournisseur());
$archiveArticle->setCoefficient($article->getCoefficient());
$archiveArticle->setOperateur($article->getOperateur());
$archiveArticle->setFamilles($article->getFamilles());
$archiveArticle->setPrixachat($article->getPrixachat());
$archiveArticle->setUnite($article->getUnite());
$archiveArticle->setFamillesdarticles($article);
$archiveArticle->setFichevente($devi);
$archiveArticle->setFourclient($devi->getClient()->getRaisonsocial());
$archiveArticle->setNumfiche($devi->getNum());
$archiveArticle->setDatearchive(new \DateTime('now', new \DateTimeZone('Africa/Tunis')));
$archivearticleRepository->save($archiveArticle, true);
}
}
// $typePosition = strpos($type, "-type:");
// if ($typePosition !== false) {
// // Extraire la valeur après "-type:"
// $typeValue = substr($type, $typePosition + strlen("-type:"));
//
// // Supprimer les espaces avant et après la valeur
// $typeValue = trim($typeValue);
//
//
// }
// if ($typePosition !== false) {
// // Extraire la valeur avant "-type:"
// $valueBeforeType = substr($type, 0, $typePosition);
//
// // Supprimer les espaces avant et après la valeur
// $valueBeforeType = trim($valueBeforeType);
//
// // Affiche "VO 65 41 S007"
// }
// //dd($typeValue);
// if( $typeValue === "Aiguilles"){
// $a=$aiguillesRepository->find(['id'=>$valueBeforeType]);
// if ($devi->getStatut() === "Facture") {
// $a->setQuantty($a->getQuantty() - $quantity);
// }
// $aiguillesRepository->save($a,true);
// }
// elseif ( $typeValue === "Platines"){
// $a=$platinesRepository->find(['id'=>$valueBeforeType]);
// if ($devi->getStatut() === "Facture") {
// $a->setQuantity($a->getQuantity() - $quantity);
// }
// $platinesRepository->save($a,true);
//
// }
// else{
// $a=$courroieRepository->find(['id'=>$valueBeforeType]);
// if ($devi->getStatut() === "Facture") {
// $a->setQuantity($a->getQuantity() - $quantity);
// }
// $courroieRepository->save($a,true);
// }
$pr->setDeviss($deviss);
$pr->setCoursdejours($coursdejours);
$pr->setPrixunitdt($prixdt);
$pr->setType($type);
$pr->setQte($quantity);
$pr->setTva($tva);
$pr->setPrix($prix);
$pr->setRemise($remise);
$pr->setDesignation($desinagtion);
$pr->setMontantht($montant);
$pr->setDevis($devi);
$produitRepository->save($pr, true);
}
}
}
$stockArchiveSynchronizer->synchronize($devi);
// Redirection en fonction du statut
switch ($devi->getStatut()) {
case 'Facture':
return $this->redirectToRoute('app_devis_liste_facture', [], Response::HTTP_SEE_OTHER);
case 'Devis':
return $this->redirectToRoute('app_devis_liste_devis', [], Response::HTTP_SEE_OTHER);
case 'Demande devis':
return $this->redirectToRoute('app_devis_iste_demande_devis', [], Response::HTTP_SEE_OTHER);
case 'BLP':
return $this->redirectToRoute('app_devis_particulier_index', [], Response::HTTP_SEE_OTHER);
case 'BL':
return $this->redirectToRoute('app_devis_liste_bl', [], Response::HTTP_SEE_OTHER);
case 'Commande':
return $this->redirectToRoute('app_devis_liste_commandes', [], Response::HTTP_SEE_OTHER);
default:
// Fallback si le statut est inconnu
return $this->redirectToRoute('app_devis_index', [], Response::HTTP_SEE_OTHER);
}
// return $this->redirectToRoute('app_devis_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('devis/new.html.twig', [
'devi' => $devi,
'form' => $form,
'aiguilles' => $aiguilles,
'platines' => $platines,
'courroi' => $courroi,
'familles' => $familles,
'familleall' => $familleall,
'tabfournisseurs' => $tabfournisseurs
]);
}
#[Route('/new_demande_devis', name: 'new_demande_devis', methods: ['GET', 'POST'])]
public function newdemandedevis(EntityManagerInterface $entityManager,HistoriquedemandedevisRepository $historiquedemandedevisRepository,FournisseurRepository $fournisseurRepository, FamillesRepository $famillesRepository, FamillesdarticlesRepository $famillesdarticlesRepository, ProduitRepository $produitRepository, CourroieRepository $courroieRepository, PlatinesRepository $platinesRepository, AiguillesRepository $aiguillesRepository, Request $request, DevisRepository $devisRepository): Response
{
$user = $this->getUser();
if (!$user) {
// Gérer le cas où l'utilisateur n'est pas connecté
throw $this->createAccessDeniedException('Vous devez être connecté pour accéder à cette page.');
}
// Obtenir l'ID de l'utilisateur connecté
$userId = $user->getId();
// dd($userId);
$fournisseurs = $fournisseurRepository->findAll();
$tabfournisseurs[] = [
'nom' => "Cosa",
'prenom' => "Tunisie",
'numeroTelephone' => "",
];
foreach ($fournisseurs as $fournisseur) {
$tabfournisseurs[] = [
"Cosa Tunisie",
'nom' => $fournisseur->getNom(),
'prenom' => $fournisseur->getPrenom(),
'numeroTelephone' => $fournisseur->getTel(),
];
}
$familleall = $famillesRepository->findAll();
$familles = $famillesdarticlesRepository->findAll();
$nbr = $request->request->get('nbrc_a');
$courroi = $courroieRepository->findAll();
$platines = $platinesRepository->findAll();
$aiguilles = $aiguillesRepository->findAll();
$devi = new Devis();
$form = $this->createForm(DevisTechType::class, $devi);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$devi->setDatecreation(new DateTime('now', new DateTimeZone('Africa/Tunis')));
$fournisseur = $request->request->get('fournisseur');
$code = $request->request->get('code');
$base = $request->request->get('base');
$taux = $request->request->get('taux');
$total = $request->request->get('total');
$montant = $request->request->get('montant');
$totalht = $request->request->get('totalht');
$totalttc = $request->request->get('totalttc');
// $acompte= $request->request->get('acompte');
$qtetotal = $request->request->get('qttotal');
$netapayer = $request->request->get('netapayer');
//get les information de formulaire demande devis
$client = $form->get('client')->getData();
$num = $form->get('num')->getData();
$date = $form->get('date')->getData();
$reference= $form->get('reference')->getData();
$devi->setLu(false);
$devi->setStatut('Demande devis');
$devi->setUser($this->getUser());
$devi->setVendeur($fournisseur);
$devi->setCode(0);
$devi->setQttotal(0);
$devi->setBase($base);
$devi->setTaux($taux);
$devi->setTotal($total);
$devi->setMontant($montant);
$devi->setTotalht($totalht);
$devi->setTotalttc($totalttc);
$devi->setOldtype($devi->getStatut());
$devi->setIduerold($userId);
// $devi->setAcompte($acompte);
// $devi->setNetapayer($netapayer);
$devisRepository->save($devi, true);
$historiquedemandedevis = new Historiquedemandedevis();
$historiquedemandedevis->setDatecreation(new DateTime('now', new DateTimeZone('Africa/Tunis')));
$historiquedemandedevis->setStatut('Demande devis');
$historiquedemandedevis->setUser($this->getUser());
$historiquedemandedevis->setVendeur($fournisseur);
$historiquedemandedevis->setCode($code);
$historiquedemandedevis->setQttotal($qtetotal);
$historiquedemandedevis->setBase($base);
$historiquedemandedevis->setTaux($taux);
$historiquedemandedevis->setTotal($total);
$historiquedemandedevis->setMontant($montant);
$historiquedemandedevis->setTotalht($totalht);
$historiquedemandedevis->setTotalttc($totalttc);
$historiquedemandedevis->setOldtype($devi->getStatut());
$historiquedemandedevis->setClient($client);
$historiquedemandedevis->setNum($num);
$historiquedemandedevis->setDate($date);
$historiquedemandedevis->setReference($reference);
$historiquedemandedevis->setIddevisold($devi->getId());
$historiquedemandedevis->setTypearchive('Archive demande');
$entityManager->persist($historiquedemandedevis);
$entityManager->flush();
if ($nbr == 1) {
// dd($nbr,$request->request->all());
$pr = new Produit();
$hpr = new Historiqueproduit();
$type = $request->request->get('type_1');
$quantity = $request->request->get('qte_1');
$tva = $request->request->get('tva_1');
$cosa = $request->request->get('cosa_1');
$qtestock = $request->request->get('qtestock_1');
$qte = $famillesdarticlesRepository->findBy(['reference' => $type]);
if ($devi->getStatut() == "Facture" or $devi->getStatut() == "BL") {
if (!empty($qte)) {
$famillesdarticles = $qte[0];
$quantitee = $famillesdarticles->getQunatity() - $quantity;
$famillesdarticles->setQunatity($quantitee);
$famillesdarticlesRepository->save($famillesdarticles, true);
}
}
$prix = $request->request->get('prix_1');
$remise = $request->request->get('remise_1');
$montant = $request->request->get('montantht_1');
$desinagtion = $request->request->get('designation_1');
$deviss = $request->request->get('devis_1');
$coursdejours = $request->request->get('coursdejours_1');
$prixdt = $request->request->get('prixdt_1');
// dd($nbr, $request->request->all());
$pr->setQtestock($qtestock);
$pr->setConfermation(false);
$pr->setDemande($cosa);
$pr->setDeviss($deviss);
$pr->setCoursdejours($coursdejours);
$pr->setPrixunitdt($prixdt);
$pr->setType($type);
$pr->setQte($quantity);
$pr->setTva($tva);
$pr->setPrix($prix);
$pr->setRemise($remise);
$pr->setMontantht($montant);
$pr->setDesignation($desinagtion);
$pr->setDevis($devi);
$produitRepository->save($pr, true);
$hpr->setQtestock($qtestock);
$hpr->setConfermation(false);
$hpr->setDemande($cosa);
$hpr->setDeviss($deviss);
$hpr->setCoursdejours($coursdejours);
$hpr->setPrixunitdt($prixdt);
$hpr->setType($type);
$hpr->setQte($quantity);
$hpr->setTva($tva);
$hpr->setPrix($prix);
$hpr->setRemise($remise);
$hpr->setMontantht($montant);
$hpr->setDesignation($desinagtion);
$hpr->setHistoriquedemandedevis($historiquedemandedevis);
$entityManager->persist($hpr);
$entityManager->flush();
}
elseif ($nbr > 1) {
// dd($nbr,$request->request->all());
for ($i = 1; $i <= $nbr; $i++) {
if ($request->request->get('type_' . $i)) {
// dd($request->request->get('type'.$i));
$pr = new Produit();
$hpr = new Historiqueproduit();
$type = $request->request->get('type_' . $i);
$quantity = $request->request->get('qte_' . $i);
$tva = $request->request->get('tva_' . $i);
$qte = $famillesdarticlesRepository->findBy(['reference' => $type]);
if ($devi->getStatut() == "Facture" or $devi->getStatut() == "BL" ) {
if (!empty($qte)) {
$famillesdarticles = $qte[0];
$quantitee = $famillesdarticles->getQunatity() - $quantity;
$famillesdarticles->setQunatity($quantitee);
$famillesdarticlesRepository->save($famillesdarticles, true);
}
}
$prix = $request->request->get('prix_' . $i);
$montant = $request->request->get('montantht_' . $i);
$desinagtion = $request->request->get('designation_' . $i);
$remise = $request->request->get('remise_' . $i);
$deviss = $request->request->get('devis_' . $i);
$coursdejours = $request->request->get('coursdejours_' . $i);
$prixdt = $request->request->get('prixdt_' . $i);
$cosa = $request->request->get('cosa_' . $i);
$qtestock = $request->request->get('qtestock_' . $i);
// dd($nbr, $request->request->all());
$pr->setQtestock($qtestock);
$pr->setConfermation(false);
$pr->setDemande($cosa);
$pr->setDeviss($deviss);
$pr->setCoursdejours($coursdejours);
$pr->setPrixunitdt($prixdt);
$pr->setType($type);
$pr->setQte($quantity);
$pr->setTva($tva);
$pr->setPrix($prix);
$pr->setRemise($remise);
$pr->setDesignation($desinagtion);
$pr->setMontantht($montant);
$pr->setDevis($devi);
$produitRepository->save($pr, true);
$hpr->setQtestock($qtestock);
$hpr->setConfermation(false);
$hpr->setDemande($cosa);
$hpr->setDeviss($deviss);
$hpr->setCoursdejours($coursdejours);
$hpr->setPrixunitdt($prixdt);
$hpr->setType($type);
$hpr->setQte($quantity);
$hpr->setTva($tva);
$hpr->setPrix($prix);
$hpr->setRemise($remise);
$hpr->setMontantht($montant);
$hpr->setDesignation($desinagtion);
$hpr->setHistoriquedemandedevis($historiquedemandedevis);
$entityManager->persist($hpr);
$entityManager->flush();
}
}
}
return $this->redirectToRoute('liste_Demande_Devis', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('devis/new_demande_devis.html.twig', [
'devi' => $devi,
'form' => $form,
'aiguilles' => $aiguilles,
'platines' => $platines,
'courroi' => $courroi,
'familles' => $familles,
'familleall' => $familleall,
'tabfournisseurs' => $tabfournisseurs
]);
}
#[Route('/{id}/Voir', name: 'app_devis_show', methods: ['GET'])]
public function show(Devis $devi, DevisRepository $devisRepository): Response
{
$devisOriginal = null;
$devisRetour = null;
$blfusLie = null;
if ($devi->getFrtour()) {
$devisOriginal = $devisRepository->find((int) $devi->getFrtour());
}
if ($devi->getStatut() === 'Facture') {
$devisRetour = $devisRepository->findOneBy(['frtour' => (string) $devi->getId(), 'statut' => 'Facture-R']);
}
if ($devi->getStatut() === 'BL_FUSIONNE' && $devi->getIdfacture()) {
$blfusLie = $devisRepository->findOneBy(['num' => $devi->getIdfacture(), 'statut' => 'BLFUS']);
}
return $this->render('devis/show.html.twig', [
'devi' => $devi,
'devisOriginal' => $devisOriginal,
'devisRetour' => $devisRetour,
'blfusLie' => $blfusLie,
]);
}
#[Route('/demande_devis/{id}', name: 'app_demande_devis_show', methods: ['GET'])]
public function demandedevisshow(Devis $devi): Response
{
return $this->render('devis/demandedevisshow.html.twig', [
'devi' => $devi,
]);
}
#[Route('/{id}/edit', name: 'app_devis_edit', methods: ['GET', 'POST'])]
public function edit(DevisStockArchiveSynchronizer $stockArchiveSynchronizer,FournisseurRepository $fournisseurRepository, FamillesRepository $famillesRepository, FamillesdarticlesRepository $famillesdarticlesRepository, EntityManagerInterface $entityManager, ProduitRepository $produitRepository, CourroieRepository $courroieRepository, PlatinesRepository $platinesRepository, AiguillesRepository $aiguillesRepository, Request $request, Devis $devi, DevisRepository $devisRepository): Response
{
// $fournisseurs = $fournisseurRepository->findAll();
//
// $tabfournisseurs[] = [
// 'nom' => "Cosa",
// 'prenom' => "Tunisie",
// 'numeroTelephone' => "",
// ];
// foreach ($fournisseurs as $fournisseur) {
// $tabfournisseurs[] = [
// "Cosa Tunisie",
// 'nom' => $fournisseur->getNom(),
// 'prenom' => $fournisseur->getPrenom(),
// 'numeroTelephone' => $fournisseur->getTel(),
// ];
// }
$fournisseurs = $fournisseurRepository->findAll();
// $tabfournisseurs[] = [
// 'nom' => "Cosa",
// 'prenom' => "Tunisie",
// 'numeroTelephone' => "",
// ];
$tabfournisseurs = []; // Initialiser vide
foreach ($fournisseurs as $fournisseur) {
$tabfournisseurs[] = [
// "Cosa Tunisie",
'id' => $fournisseur->getId(),
'nom' => $fournisseur->getNom(),
'prenom' => $fournisseur->getPrenom(),
'numeroTelephone' => $fournisseur->getTel(),
];
}
// dd($devi);
$familleall = $famillesRepository->findAll();
$familles = $famillesdarticlesRepository->findAll();
$courroi = $courroieRepository->findAll();
$platines = $platinesRepository->findAll();
$aiguilles = $aiguillesRepository->findAll();
$nbr = $request->request->get('nbrc_a');
$fournisseurselect = $devi->getFournisseur();
// dd($fournisseurselect ,$devi);
$form = $this->createForm(DevisType::class, $devi);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$code = $request->request->get('code');
$base = $request->request->get('base');
$taux = $request->request->get('taux');
$total = $request->request->get('total');
$montant = $request->request->get('montant');
$totalht = $request->request->get('totalht');
$totalttc = $request->request->get('totalttc');
// $acompte= $request->request->get('acompte');
$qtetotal = $request->request->get('qttotal');
$netapayer = $request->request->get('netapayer');
$fournisseur = $request->request->get('fournisseur');
$four = $fournisseurRepository->findOneBy(['id'=>$fournisseur]);
// dd($form->get('statut')->getData(),$fournisseur);
// dd($form->getData()); // équivalent à dd($devi)
// dd($fournisseur,$four);
$devi->setFournisseur($four);
$devi->setCode($code);
$devi->setQttotal($qtetotal);
$devi->setBase($base);
$devi->setTaux($taux);
$devi->setTotal($total);
$devi->setMontant($montant);
$devi->setTotalht($totalht);
$devi->setTotalttc($totalttc);
$devi->setTotalttc($totalttc);
// $devi->setAcompte($acompte);
// $devi->setNetapayer($netapayer);
$devisRepository->save($devi, true);
if ($devi->getProduit()) {
foreach ($devi->getProduit() as $item) {
$produitRepository->remove($item, true);
}
}
if ($nbr == 1) {
$pr = new Produit();
$type = $request->request->get('type_1');
$quantity = $request->request->get('qte_1');
$tva = $request->request->get('tva_1');
$qte = $famillesdarticlesRepository->findOneBy(['reference' => $type]);
$qteold = $request->request->get('qteold_1');
if (($devi->getStatut() == "Facture" or $devi->getStatut() == "BL") and ($devi->getOldtype() == "Facture" or $devi->getOldtype() == "BL"))
{
if (!empty($qte)) {
$qqtoldnew = (float)$qte->getQunatity() + (float)$qteold;
$quantitee = $qqtoldnew - (float)$quantity;
$qte->setQunatity((string)max(0, $quantitee));
// Mise à jour qtetotal: restore ancienne qté, soustraire nouvelle
$newQtetotal = (float)$qte->getQtetotal() + (float)$qteold - (float)$quantity;
$qte->setQtetotal((string)max(0, $newQtetotal));
$famillesdarticlesRepository->save($qte, true);
}
}
elseif (($devi->getStatut() == "Facture" or $devi->getStatut() == "BL") and ($devi->getOldtype() !== "Facture" or $devi->getOldtype() !== "BL"))
{
$qqtoldnew = (float)$qte->getQunatity();
$quantitee = $qqtoldnew - (float)$quantity;
$qte->setQunatity((string)max(0, $quantitee));
// Mise à jour qtetotal: juste soustraire la nouvelle qté
$newQtetotal = (float)$qte->getQtetotal() - (float)$quantity;
$qte->setQtetotal((string)max(0, $newQtetotal));
$famillesdarticlesRepository->save($qte, true);
}
// $typePosition = strpos($type, "-type:");
//
// if ($typePosition !== false) {
// // Extraire la valeur après "-type:"
// $typeValue = substr($type, $typePosition + strlen("-type:"));
//
// // Supprimer les espaces avant et après la valeur
// $typeValue = trim($typeValue);
//
//
// }
// if ($typePosition !== false) {
// // Extraire la valeur avant "-type:"
// $valueBeforeType = substr($type, 0, $typePosition);
//
// // Supprimer les espaces avant et après la valeur
// $valueBeforeType = trim($valueBeforeType);
//
// // Affiche "VO 65 41 S007"
// }
// //dd($typeValue);
// if ($typeValue === "Aiguilles") {
// $a = $aiguillesRepository->find(['id' => $valueBeforeType]);
//
// if ($devi->getStatut() === "Facture") {
// $a->setQuantty($a->getQuantty() - $quantity);
// }
// $aiguillesRepository->save($a, true);
// }
// elseif ($typeValue === "Platines") {
// $a = $platinesRepository->find(['id' => $valueBeforeType]);
// if ($devi->getStatut() === "Facture") {
// $a->setQuantity($a->getQuantity() - $quantity);
// }
// $platinesRepository->save($a, true);
// }
// else {
// $a = $courroieRepository->find(['id' => $valueBeforeType]);
// if ($devi->getStatut() === "Facture") {
// $a->setQuantity($a->getQuantity() - $quantity);
// }
// $courroieRepository->save($a, true);
//
// }
$prix = $request->request->get('prix_1');
$remise = $request->request->get('remise_1');
$montant = $request->request->get('montantht_1');
$desinagtion = $request->request->get('designation_1');
$deviss = $request->request->get('devis_1');
$coursdejours = $request->request->get('coursdejours_1');
$prixdt = $request->request->get('prixdt_1');
// if ($typeValue === "Aiguilles") {
// $pr->setType($a->getNom());
// } else {
// $pr->setType($a->getReference());
// }
$pr->setDeviss($deviss);
$pr->setCoursdejours($coursdejours);
$pr->setPrixunitdt($prixdt);
$pr->setType($type);
$pr->setQte($quantity);
$pr->setTva($tva);
$pr->setPrix($prix);
$pr->setRemise($remise);
$pr->setDesignation($desinagtion);
$pr->setMontantht($montant);
$pr->setDevis($devi);
$produitRepository->save($pr, true);
} //plus
elseif ($nbr > 1) {
for ($i = 1; $i <= $nbr; $i++) {
if ($request->request->get('type_' . $i)) {
// dd($request->request->get('type'.$i));
$pr = new Produit();
$type = $request->request->get('type_' . $i);
$quantity = $request->request->get('qte_' . $i);
$tva = $request->request->get('tva_' . $i);
$qte = $famillesdarticlesRepository->findOneBy(['reference' => $type]);
$qteold = $request->request->get('qteold_' . $i);
if (($devi->getStatut() == "Facture" or $devi->getStatut() == "BL") and ($devi->getOldtype() == "Facture" or $devi->getOldtype() == "BL")) {
if (!empty($qte)) {
$qqtoldnew = (float)$qte->getQunatity() + (float)$qteold;
$quantitee = $qqtoldnew - (float)$quantity;
$qte->setQunatity((string)max(0, $quantitee));
// qtetotal: restore ancienne qte, soustraire nouvelle
$newQtetotal = (float)$qte->getQtetotal() + (float)$qteold - (float)$quantity;
$qte->setQtetotal((string)max(0, $newQtetotal));
$famillesdarticlesRepository->save($qte, true);
}
}
elseif (($devi->getStatut() == "Facture" or $devi->getStatut() == "BL") and ($devi->getOldtype() !== "Facture" or $devi->getOldtype() !== "BL"))
{
if (!empty($qte)) {
$qqtoldnew = (float)$qte->getQunatity();
$quantitee = $qqtoldnew - (float)$quantity;
$qte->setQunatity((string)max(0, $quantitee));
// qtetotal: juste soustraire la nouvelle qte
$newQtetotal2 = (float)$qte->getQtetotal() - (float)$quantity;
$qte->setQtetotal((string)max(0, $newQtetotal2));
$famillesdarticlesRepository->save($qte, true);
}
}
// $typePosition = strpos($type, "-type:");
// if ($typePosition !== false) {
// // Extraire la valeur après "-type:"
// $typeValue = substr($type, $typePosition + strlen("-type:"));
//
// // Supprimer les espaces avant et après la valeur
// $typeValue = trim($typeValue);
//
//
// }
// if ($typePosition !== false) {
// // Extraire la valeur avant "-type:"
// $valueBeforeType = substr($type, 0, $typePosition);
//
// // Supprimer les espaces avant et après la valeur
// $valueBeforeType = trim($valueBeforeType);
//
// // Affiche "VO 65 41 S007"
// }
// //dd($typeValue);
// if ($typeValue === "Aiguilles") {
// $a = $aiguillesRepository->find(['id' => $valueBeforeType]);
// $a->setQuantty($a->getQuantty() + $quantity);
// $aiguillesRepository->save($a, true);
// }
// elseif ($typeValue === "Platines") {
// $a = $platinesRepository->find(['id' => $valueBeforeType]);
// $a->setQuantity($a->getQuantity() + $quantity);
// $platinesRepository->save($a, true);
//
// }
// else {
// $a = $courroieRepository->find(['id' => $valueBeforeType]);
// $a->setQuantity($a->getQuantity() + $quantity);
// $courroieRepository->save($a, true);
// }
$prix = $request->request->get('prix_' . $i);
$montant = $request->request->get('montantht_' . $i);
$desinagtion = $request->request->get('designation_' . $i);
$remise = $request->request->get('remise_' . $i);
$deviss = $request->request->get('devis_' . $i);
$coursdejours = $request->request->get('coursdejours_' . $i);
$prixdt = $request->request->get('prixdt_' . $i);
// if ($typeValue === "Aiguilles") {
// $pr->setType($a->getNom());
// } else {
// $pr->setType($a->getReference());
// }
$pr->setDeviss($deviss);
$pr->setCoursdejours($coursdejours);
$pr->setPrixunitdt($prixdt);
$pr->setType($type);
$pr->setQte($quantity);
$pr->setTva($tva);
$pr->setPrix($prix);
$pr->setRemise($remise);
$pr->setDesignation($desinagtion);
$pr->setMontantht($montant);
$pr->setDevis($devi);
$produitRepository->save($pr, true);
}
}
$entityManager->persist($devi);
$entityManager->flush();
}
$devi->setOldtype($devi->getStatut());
$devisRepository->save($devi,true);
$stockArchiveSynchronizer->synchronize($devi);
// Redirection en fonction du statut
switch ($devi->getStatut()) {
case 'Facture':
return $this->redirectToRoute('app_devis_liste_facture', [], Response::HTTP_SEE_OTHER);
case 'Devis':
return $this->redirectToRoute('app_devis_liste_devis', [], Response::HTTP_SEE_OTHER);
case 'Demande devis':
return $this->redirectToRoute('app_devis_iste_demande_devis', [], Response::HTTP_SEE_OTHER);
case 'BLP':
return $this->redirectToRoute('app_devis_particulier_index', [], Response::HTTP_SEE_OTHER);
case 'BL':
return $this->redirectToRoute('app_devis_liste_bl', [], Response::HTTP_SEE_OTHER);
case 'Commande':
return $this->redirectToRoute('app_devis_liste_commandes', [], Response::HTTP_SEE_OTHER);
default:
// Fallback si le statut est inconnu
return $this->redirectToRoute('app_devis_index', [], Response::HTTP_SEE_OTHER);
}
// return $this->redirectToRoute('app_devis_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('devis/edit.html.twig', [
'devi' => $devi,
'form' => $form,
'aiguilles' => $aiguilles,
'platines' => $platines,
'courroi' => $courroi,
'familles' => $familles,
'familleall' => $familleall,
'tabfournisseurs' => $tabfournisseurs,
'fournisseurselect'=>$fournisseurselect
]);
}
#[Route('/{id}/edit_demande_devis', name: 'app_demande_devis_edit', methods: ['GET', 'POST'])]
public function editdemandedevis(HistoriqueproduitRepository $historiqueproduitRepository,HistoriquedemandedevisRepository $historiquedemandedevisRepository,FournisseurRepository $fournisseurRepository, FamillesRepository $famillesRepository, FamillesdarticlesRepository $famillesdarticlesRepository, EntityManagerInterface $entityManager, ProduitRepository $produitRepository, CourroieRepository $courroieRepository, PlatinesRepository $platinesRepository, AiguillesRepository $aiguillesRepository, Request $request, Devis $devi, DevisRepository $devisRepository): Response
{
$historiquedemandedevis = $historiquedemandedevisRepository->findOneBy(['iddevisold'=>$devi->getId()]);
$fournisseurs = $fournisseurRepository->findAll();
$tabfournisseurs[] = [
'nom' => "Cosa",
'prenom' => "Tunisie",
'numeroTelephone' => "",
];
foreach ($fournisseurs as $fournisseur) {
$tabfournisseurs[] = [
"Cosa Tunisie",
'nom' => $fournisseur->getNom(),
'prenom' => $fournisseur->getPrenom(),
'numeroTelephone' => $fournisseur->getTel(),
];
}
// dd($devi);
$familleall = $famillesRepository->findAll();
$familles = $famillesdarticlesRepository->findAll();
$courroi = $courroieRepository->findAll();
$platines = $platinesRepository->findAll();
$aiguilles = $aiguillesRepository->findAll();
$nbr = $request->request->get('nbrc_a');
$form = $this->createForm(DevisTechType::class, $devi);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$devisRepository->save($devi, true);
$code = $request->request->get('code');
$base = $request->request->get('base');
$taux = $request->request->get('taux');
$total = $request->request->get('total');
$montant = $request->request->get('montant');
$totalht = $request->request->get('totalht');
$totalttc = $request->request->get('totalttc');
// $acompte= $request->request->get('acompte');
$qtetotal = $request->request->get('qttotal');
$netapayer = $request->request->get('netapayer');
$devi->setLu(false);
$devi->setStatut('Demande devis');
$devi->setUser($this->getUser());
$devi->setCode($code);
$devi->setQttotal($qtetotal);
$devi->setBase($base);
$devi->setTaux($taux);
$devi->setTotal($total);
$devi->setMontant($montant);
$devi->setTotalht($totalht);
$devi->setTotalttc($totalttc);
$devi->setTotalttc($totalttc);
// $devi->setAcompte($acompte);
// $devi->setNetapayer($netapayer);
$devisRepository->save($devi, true);
$client = $form->get('client')->getData();
$num = $form->get('num')->getData();
$date = $form->get('date')->getData();
$reference= $form->get('reference')->getData();
$historiquedemandedevis->setStatut('Demande devis');
$historiquedemandedevis->setUser($this->getUser());
$historiquedemandedevis->setCode($code);
$historiquedemandedevis->setQttotal($qtetotal);
$historiquedemandedevis->setBase($base);
$historiquedemandedevis->setTaux($taux);
$historiquedemandedevis->setTotal($total);
$historiquedemandedevis->setMontant($montant);
$historiquedemandedevis->setTotalht($totalht);
$historiquedemandedevis->setTotalttc($totalttc);
$historiquedemandedevis->setClient($client);
$historiquedemandedevis->setNum($num);
$historiquedemandedevis->setDate($date);
$historiquedemandedevis->setReference($reference);
$historiquedemandedevis->setIddevisold($devi->getId());
$entityManager->persist($historiquedemandedevis);
$entityManager->flush();
if ($devi->getProduit()) {
foreach ($devi->getProduit() as $item) {
$produitRepository->remove($item, true);
}
}
if ($historiquedemandedevis->getHistoriqueproduits()) {
foreach ($historiquedemandedevis->getHistoriqueproduits() as $item) {
// $historiqueproduitRepository->remove($item, true);
$entityManager->remove($item);
$entityManager->flush();
}
}
if ($nbr == 1) {
$pr = new Produit();
$hpr = new Historiqueproduit();
$type = $request->request->get('type_1');
$quantity = $request->request->get('qte_1');
$tva = $request->request->get('tva_1');
$qte = $famillesdarticlesRepository->findOneBy(['reference' => $type]);
$qteold = $request->request->get('qteold_1');
$cosa = $request->request->get('cosa_1');
if (($devi->getStatut() == "Facture" or $devi->getStatut() == "BL") and ($devi->getOldtype() == "Facture" or $devi->getOldtype() == "BL"))
{
if (!empty($qte)) {
$qqtoldnew = (float)$qte->getQunatity() + (float)$qteold;
$quantitee = $qqtoldnew - (float)$quantity;
$qte->setQunatity((string)max(0, $quantitee));
// Mise à jour qtetotal: restore ancienne qté, soustraire nouvelle
$newQtetotal = (float)$qte->getQtetotal() + (float)$qteold - (float)$quantity;
$qte->setQtetotal((string)max(0, $newQtetotal));
$famillesdarticlesRepository->save($qte, true);
}
}
elseif (($devi->getStatut() == "Facture" or $devi->getStatut() == "BL") and ($devi->getOldtype() !== "Facture" or $devi->getOldtype() !== "BL"))
{
$qqtoldnew = (float)$qte->getQunatity();
$quantitee = $qqtoldnew - (float)$quantity;
$qte->setQunatity((string)max(0, $quantitee));
// Mise à jour qtetotal: juste soustraire la nouvelle qté
$newQtetotal = (float)$qte->getQtetotal() - (float)$quantity;
$qte->setQtetotal((string)max(0, $newQtetotal));
$famillesdarticlesRepository->save($qte, true);
}
$prix = $request->request->get('prix_1');
$remise = $request->request->get('remise_1');
$montant = $request->request->get('montantht_1');
$desinagtion = $request->request->get('designation_1');
$deviss = $request->request->get('devis_1');
$coursdejours = $request->request->get('coursdejours_1');
$prixdt = $request->request->get('prixdt_1');
$qtestock = $request->request->get('qtestock_1');
$pr->setQtestock($qtestock);
$pr->setDemande($cosa);
$pr->setDeviss($deviss);
$pr->setCoursdejours($coursdejours);
$pr->setPrixunitdt($prixdt);
$pr->setType($type);
$pr->setQte($quantity);
$pr->setTva($tva);
$pr->setPrix($prix);
$pr->setRemise($remise);
$pr->setDesignation($desinagtion);
$pr->setMontantht($montant);
$pr->setDevis($devi);
$produitRepository->save($pr, true);
$hpr->setQtestock($qtestock);
$hpr->setConfermation(false);
$hpr->setDemande($cosa);
$hpr->setDeviss($deviss);
$hpr->setCoursdejours($coursdejours);
$hpr->setPrixunitdt($prixdt);
$hpr->setType($type);
$hpr->setQte($quantity);
$hpr->setTva($tva);
$hpr->setPrix($prix);
$hpr->setRemise($remise);
$hpr->setMontantht($montant);
$hpr->setDesignation($desinagtion);
$hpr->setHistoriquedemandedevis($historiquedemandedevis);
$entityManager->persist($hpr);
$entityManager->flush();
} //plus
elseif ($nbr > 1) {
for ($i = 1; $i <= $nbr; $i++) {
if ($request->request->get('type_' . $i)) {
// dd($request->request->get('type'.$i));
$pr = new Produit();
$hpr = new Historiqueproduit();
$type = $request->request->get('type_' . $i);
$quantity = $request->request->get('qte_' . $i);
$tva = $request->request->get('tva_' . $i);
$qte = $famillesdarticlesRepository->findOneBy(['reference' => $type]);
$qteold = $request->request->get('qteold_' . $i);
if (($devi->getStatut() == "Facture" or $devi->getStatut() == "BL") and ($devi->getOldtype() == "Facture" or $devi->getOldtype() == "BL")) {
if (!empty($qte)) {
$qqtoldnew = (float)$qte->getQunatity() + (float)$qteold;
$quantitee = $qqtoldnew - (float)$quantity;
$qte->setQunatity((string)max(0, $quantitee));
// qtetotal: restore ancienne qte, soustraire nouvelle
$newQtetotal = (float)$qte->getQtetotal() + (float)$qteold - (float)$quantity;
$qte->setQtetotal((string)max(0, $newQtetotal));
$famillesdarticlesRepository->save($qte, true);
}
}
elseif (($devi->getStatut() == "Facture" or $devi->getStatut() == "BL") and ($devi->getOldtype() !== "Facture" or $devi->getOldtype() !== "BL"))
{
if (!empty($qte)) {
$qqtoldnew = (float)$qte->getQunatity();
$quantitee = $qqtoldnew - (float)$quantity;
$qte->setQunatity((string)max(0, $quantitee));
// qtetotal: juste soustraire la nouvelle qte
$newQtetotal2 = (float)$qte->getQtetotal() - (float)$quantity;
$qte->setQtetotal((string)max(0, $newQtetotal2));
$famillesdarticlesRepository->save($qte, true);
}
}
$prix = $request->request->get('prix_' . $i);
$montant = $request->request->get('montantht_' . $i);
$desinagtion = $request->request->get('designation_' . $i);
$remise = $request->request->get('remise_' . $i);
$deviss = $request->request->get('devis_' . $i);
$coursdejours = $request->request->get('coursdejours_' . $i);
$prixdt = $request->request->get('prixdt_' . $i);
$cosa = $request->request->get('cosa_' . $i);
$qtestock = $request->request->get('qtestock_' . $i);
$pr->setQtestock($qtestock);
$pr->setDemande($cosa);
$pr->setDeviss($deviss);
$pr->setCoursdejours($coursdejours);
$pr->setPrixunitdt($prixdt);
$pr->setType($type);
$pr->setQte($quantity);
$pr->setTva($tva);
$pr->setPrix($prix);
$pr->setRemise($remise);
$pr->setDesignation($desinagtion);
$pr->setMontantht($montant);
$pr->setDevis($devi);
$produitRepository->save($pr, true);
$hpr->setQtestock($qtestock);
$hpr->setConfermation(false);
$hpr->setDemande($cosa);
$hpr->setDeviss($deviss);
$hpr->setCoursdejours($coursdejours);
$hpr->setPrixunitdt($prixdt);
$hpr->setType($type);
$hpr->setQte($quantity);
$hpr->setTva($tva);
$hpr->setPrix($prix);
$hpr->setRemise($remise);
$hpr->setMontantht($montant);
$hpr->setDesignation($desinagtion);
$hpr->setHistoriquedemandedevis($historiquedemandedevis);
$entityManager->persist($hpr);
$entityManager->flush();
}
}
$entityManager->persist($devi);
$entityManager->flush();
}
$devi->setOldtype($devi->getStatut());
$devisRepository->save($devi,true);
return $this->redirectToRoute('liste_Demande_Devis', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('devis/editdemandedevis.html.twig', [
'devi' => $devi,
'form' => $form,
'aiguilles' => $aiguilles,
'platines' => $platines,
'courroi' => $courroi,
'familles' => $familles,
'familleall' => $familleall,
'tabfournisseurs' => $tabfournisseurs
]);
}
#[Route('/{id}/confirmation_demande_devis', name: 'app_confirmation_demande_devis', methods: ['GET', 'POST'])]
public function confirmationdemandedevis(UserRepository $userRepository,ArticleimportdirectRepository $articleimportdirectRepository, ImportdirectRepository $importdirectRepository, FournisseurRepository $fournisseurRepository, FamillesRepository $famillesRepository, FamillesdarticlesRepository $famillesdarticlesRepository, EntityManagerInterface $entityManager, ProduitRepository $produitRepository, CourroieRepository $courroieRepository, PlatinesRepository $platinesRepository, AiguillesRepository $aiguillesRepository, Request $request, Devis $devi, DevisRepository $devisRepository): Response {
$fournisseurs = $fournisseurRepository->findAll();
$tabfournisseurs[] = [
'nom' => "Cosa",
'prenom' => "Tunisie",
'numeroTelephone' => "",
];
foreach ($fournisseurs as $fournisseur) {
$tabfournisseurs[] = [
"Cosa Tunisie",
'nom' => $fournisseur->getNom(),
'prenom' => $fournisseur->getPrenom(),
'numeroTelephone' => $fournisseur->getTel(),
];
}
$familleall = $famillesRepository->findAll();
$familles = $famillesdarticlesRepository->findAll();
$courroi = $courroieRepository->findAll();
$platines = $platinesRepository->findAll();
$aiguilles = $aiguillesRepository->findAll();
$nbr = $request->request->get('nbrc_a');
$form = $this->createForm(DevisTechType::class, $devi);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$devis = null;
$code = $request->request->get('code');
$base = $request->request->get('base');
$taux = $request->request->get('taux');
$total = $request->request->get('total');
$montant = $request->request->get('montant');
$totalht = $request->request->get('totalht');
$totalttc = $request->request->get('totalttc');
$qtetotal = $request->request->get('qttotal');
$netapayer = $request->request->get('netapayer');
$res = $request->request->all('chk_child');
$vendeurFullName = $request->request->get('fournisseur');
$parts = explode(' ', $vendeurFullName);
$vendeurNom = trim($parts[0]);
$deviexiste = $devisRepository->findOneBy(['iddevisold' => $devi->getId()]);
$importexiste = $importdirectRepository->findOneBy(['idimportdirectold' => $devi->getId()]);
// dd($importexiste);
$product_info = array_map(function($item) {
$parts = explode('-', $item);
return ['id' => $parts[0], 'index' => $parts[1]];
}, $res);
$needsNewDevis = false;
$needsNewImportDirect = false;
foreach ($product_info as $info) {
$cosa = $request->request->get('cosa_' . $info['index']);
if ($cosa == 'Locale') {
$needsNewDevis = true;
} elseif ($cosa == 'Direct') {
$needsNewImportDirect = true;
}
}
// Afficher les résultats après la boucle
// dd($needsNewDevis, $needsNewImportDirect, $product_info);
// Create new Devis if needed
if ($needsNewDevis && empty($deviexiste))
{
$devis = new Devis();
$devis->setStatut('Devis');
$devis->setDate(new DateTime());
// dd($devi->getUser()->getId());.
$devi->setIduerold($devi->getIduerold());
$user = $userRepository->findOneBy(['id'=>$devi->getIduerold()]);
if (!$user)
{
$user = $userRepository->findOneBy(['id'=>$devi->getUser()]);
}
$devis->setUser($user);
$devis->setIduerold($devi->getIduerold());
$clientDetails = $form->get('client')->getData();
foreach ($product_info as $info) {
$product_id = $info['id'];
$idrub = $info['index'];
$produit = $produitRepository->find($product_id);
if ($produit) {
$type = $request->request->get('type_' . $idrub);
$designation = $request->request->get('designation_' . $idrub);
$quantity = $request->request->get('qte_' . $idrub);
$devisProduit = $request->request->get('devis_' . $idrub);
$prix = $request->request->get('prix_' . $idrub);
$coursdejours = $request->request->get('coursdejours_' . $idrub);
$prixdt = $request->request->get('prixdt_' . $idrub);
$remise = $request->request->get('remise_' . $idrub);
$montantht = $request->request->get('montantht_' . $idrub);
$tva = $request->request->get('tva_' . $idrub);
$cosa = $request->request->get('cosa_' . $idrub);
if($cosa == 'Locale'){
$produit->setType($type);
$produit->setDesignation($designation);
$produit->setQte($quantity);
$produit->setDeviss($devisProduit);
$produit->setPrix($prix);
$produit->setCoursdejours($coursdejours);
$produit->setPrixunitdt($prixdt);
$produit->setRemise($remise);
$produit->setMontantht($montantht);
$produit->setTva($tva);
$produit->setDemande($cosa);
$produit->setDevis($devis);
$devis->addProduit($produit);
// $produitRepository->save($produit);
$entityManager->persist($devis);
$entityManager->flush();
}
$devi->removeProduit($produit);
}
}
// dd($product_info, $devis ,$produit);
$status = 'Demande devis';
// Recherchez la FamilleArticle en fonction de la référence
$totstatu = $devisRepository->findBy(['statut' => $status]);
$count = count($totstatu);
if ($count == 0) {
$count = 1;
}
else {
$count = $count + 1;
}
// Génération du numéro de base
if ($status == "Demande devis") {
$tt = "Dd" . $count;
}
// Vérification de l'existence du numéro et génération d'un nouveau si nécessaire
while ($devisRepository->findOneBy(['num' => $tt])) {
$count++;
$tt = "Dd" . $count;
}
// dd($testexiste,$tt);
$devis->setNum($tt);
$devis->setClient($clientDetails);
$devis->setIddevisold($devi->getId());
$devis->setLu(true);
$devis->setStatut('Devis');
$devis->setCode($code);
$devis->setQttotal($qtetotal);
$devis->setBase($base);
$devis->setTaux($taux);
$devis->setTotal($total);
$devis->setMontant($montant);
$devis->setTotalht($totalht);
$devis->setTotalttc($totalttc);
$devis->setVendeur($vendeurFullName);
$devis->setOldtype($devi->getStatut());
// dd($devis, $devis->getProduit(), $produit);
$entityManager->persist($devis);
$entityManager->flush();
// $devisRepository->save($devis, true);
}
if($deviexiste) {
// dd('honi devis existe',$needsNewDevis,$deviexiste);
foreach ($product_info as $info) {
$product_id = $info['id'];
$idrub = $info['index'];
$produit = $produitRepository->find($product_id);
if ($produit) {
$type = $request->request->get('type_' . $idrub);
$designation = $request->request->get('designation_' . $idrub);
$quantity = $request->request->get('qte_' . $idrub);
$prix = $request->request->get('prix_' . $idrub);
$coursdejours = $request->request->get('coursdejours_' . $idrub);
$prixdt = $request->request->get('prixdt_' . $idrub);
$remise = $request->request->get('remise_' . $idrub);
$montantht = $request->request->get('montantht_' . $idrub);
$tva = $request->request->get('tva_' . $idrub);
$cosa = $request->request->get('cosa_' . $idrub);
if($cosa == 'Locale'){
$produit->setType($type);
$produit->setDesignation($designation);
$produit->setQte($quantity);
$produit->setPrix($prix);
$produit->setCoursdejours($coursdejours);
$produit->setPrixunitdt($prixdt);
$produit->setRemise($remise);
$produit->setMontantht($montantht);
$produit->setTva($tva);
$produit->setDemande($cosa);
$produit->setDevis($deviexiste);
$deviexiste->addProduit($produit);
// $produitRepository->save($produit);
$entityManager->persist($produit);
$entityManager->flush();
}
$devi->removeProduit($produit);
}
}
$clientDetails = $form->get('client')->getData();
$deviexiste->setClient($clientDetails);
// $user = $userRepository->find(['id'=>$devi->getUser()->getId()]);
// dd($devi->getUser()->getId(),$user);
// $devis->setUser($user);
$newcode = floatval($deviexiste->getCode()) + floatval($code);
$newbase = floatval($deviexiste->getBase()) + floatval($base);
$newtaux = floatval($deviexiste->getTaux()) + floatval($taux);
$newtotale = floatval($deviexiste->getTotal()) + floatval($total);
$newmontant = floatval($deviexiste->getMontant()) + floatval($montant);
$newtotalht = floatval($deviexiste->getTotalht()) + floatval($totalht);
$newtotalttc = floatval($deviexiste->getTotalttc()) + floatval($totalttc);
$newqtetotal = floatval($deviexiste->getQttotal()) + floatval($qtetotal);
$deviexiste->setIddevisold($devi->getId());
$deviexiste->setLu(true);
$deviexiste->setStatut('Devis');
$deviexiste->setCode($newcode);
$deviexiste->setQttotal($newqtetotal);
$deviexiste->setBase($newbase);
$deviexiste->setTaux($newtaux);
$deviexiste->setTotal($newtotale);
$deviexiste->setMontant($newmontant);
$deviexiste->setTotalht($newtotalht);
$deviexiste->setTotalttc($newtotalttc);
$deviexiste->setVendeur($vendeurFullName);
$deviexiste->setOldtype($devi->getStatut());
$entityManager->flush();
$devisRepository->save($deviexiste, true);
}
// Create new ImportDirect if needed
if ($needsNewImportDirect && empty($importexiste)) {
$importdirect = new Importdirect();
$importdirect->setType('Non confirmée');
$importdirect->setDate(new DateTime());
$importdirect->setReference($devi->getReference());
$importdirect->setVendeur($devi->getVendeur());
$importdirect->setIdclient($devi->getClient()->getId());
$importdirect->setIduserold($devi->getUser()->getId());
$clientDetails = $form->get('client')->getData();
foreach ($product_info as $info) {
$product_id = $info['id'];
$idrub = $info['index'];
$produit = $produitRepository->find($product_id);
if ($produit) {
$type = $request->request->get('type_' . $idrub);
$designation = $request->request->get('designation_' . $idrub);
$quantity = $request->request->get('qte_' . $idrub);
$prix = $request->request->get('prix_' . $idrub);
$prixdt = $request->request->get('prixdt_' . $idrub);
$deviss = $request->request->get('devis_' . $idrub);
$pr = new Articleimportdirect();
// dump($cosa,$produit);
// if ($cosa == 'Direct'){
if ($request->request->get('cosa_' . $idrub) == 'Direct') {
$pr->setArticle($type);
$pr->setDevise($deviss);
$pr->setDesignation($designation);
$pr->setQte($quantity);
$pr->setPrixachat($prix);
$pr->setPrixvente($prixdt);
$pr->setTotal($total);
$pr->setImportdirect($importdirect);
// dd($cosa,$produit,$pr);
$articleimportdirectRepository->save($pr, true);
}
$devi->removeProduit($produit);
}
}
$importdirect->setClient($clientDetails);
$importdirect->setIdimportdirectold($devi->getId());
$entityManager->flush();
$importdirectRepository->save($importdirect, true);
}
if ($importexiste) {
// dd('honi ImportDirect existe',$needsNewImportDirect,$importexiste);
foreach ($product_info as $info) {
$product_id = $info['id'];
$idrub = $info['index'];
$produit = $produitRepository->find($product_id);
if ($produit) {
$type = $request->request->get('type_' . $idrub);
$designation = $request->request->get('designation_' . $idrub);
$quantity = $request->request->get('qte_' . $idrub);
$prix = $request->request->get('prix_' . $idrub);
$prixdt = $request->request->get('prixdt_' . $idrub);
$deviss = $request->request->get('devis_' . $idrub);
$pr = new Articleimportdirect();
// if($cosa == 'Direct'){
if ($request->request->get('cosa_' . $idrub) == 'Direct') {
$pr->setArticle($type);
$pr->setDevise($deviss);
$pr->setDesignation($designation);
$pr->setQte($quantity);
$pr->setPrixachat($prix);
$pr->setPrixvente($prixdt);
$pr->setTotal($total);
$pr->setImportdirect($importexiste);
$articleimportdirectRepository->save($pr, true);
}
$devi->removeProduit($produit);
}
}
$clientDetails = $form->get('client')->getData();
$importexiste->setClient($clientDetails);
$importexiste->setIdimportdirectold($devi->getId());
$importexiste->setReference($devi->getReference());
$importexiste->setVendeur($devi->getVendeur());
$importexiste->setIdclient($devi->getClient()->getId());
$importexiste->setIduserold($devi->getUser()->getId());
$entityManager->flush();
$importdirectRepository->save($importexiste, true);
}
// dd($needsNewImportDirect, $importexiste,$needsNewDevis,$deviexiste);
$entityManager->flush();
$devi->setLu(false);
$devi->setStatut('Demande devis');
$devi->setCode(0);
$devi->setQttotal(0);
$devi->setBase($base);
$devi->setTaux($taux);
$devi->setTotal($total);
$devi->setMontant($montant);
$devi->setTotalht($totalht);
$devi->setTotalttc($totalttc);
$devi->setTotalttc($totalttc);
$devi->setVendeur($vendeurFullName);
if ($devi->getProduit()->isEmpty()) {
$entityManager->remove($devi);
$entityManager->flush();
return $this->redirectToRoute('app_devis_demande');
}
else {
$devi->setOldtype($devi->getStatut());
$devisRepository->save($devi, true);
return $this->redirectToRoute('app_devis_demande', [], Response::HTTP_SEE_OTHER);
}
}
return $this->renderForm('devis/confirmationdemandedevis.html.twig', [
'devi' => $devi,
'form' => $form,
'aiguilles' => $aiguilles,
'platines' => $platines,
'courroi' => $courroi,
'familles' => $familles,
'familleall' => $familleall,
'tabfournisseurs' => $tabfournisseurs
]);
}
#[Route('/{id}/retour', name: 'app_devis_retoura', methods: ['GET', 'POST'])]
public function retour(FournisseurRepository $fournisseurRepository, FamillesRepository $famillesRepository, FamillesdarticlesRepository $famillesdarticlesRepository, EntityManagerInterface $entityManager, ProduitRepository $produitRepository, CourroieRepository $courroieRepository, PlatinesRepository $platinesRepository, AiguillesRepository $aiguillesRepository, Request $request, Devis $devi, DevisRepository $devisRepository, PaymentdeviRepository $paymentdeviRepository): Response
{
$fournisseurs = $fournisseurRepository->findAll();
$tabfournisseurs[] = [
'nom' => "Cosa",
'prenom' => "Tunisie",
'numeroTelephone' => "",
];
foreach ($fournisseurs as $fournisseur) {
$tabfournisseurs[] = [
"Cosa Tunisie",
'nom' => $fournisseur->getNom(),
'prenom' => $fournisseur->getPrenom(),
'numeroTelephone' => $fournisseur->getTel(),
];
}
$vendeur = $devi->getVendeur();
$vendeurs = $fournisseurRepository->find($vendeur);
// dd($vendeur, $vendeurs);
$familleall = $famillesRepository->findAll();
$familles = $famillesdarticlesRepository->findAll();
$courroi = $courroieRepository->findAll();
$platines = $platinesRepository->findAll();
$aiguilles = $aiguillesRepository->findAll();
$nbr = $request->request->get('nbrc_a');
$sourceDate = $devi->getDate() ? clone $devi->getDate() : null;
$form = $this->createForm(DevisType::class, $devi);
$form->handleRequest($request);
$factures = $devisRepository->findBy(['statut' => ["Facture", "Facture-R", "Facture-A"]]);
$maxNum = 0;
foreach ($factures as $facture) {
$num = (string) $facture->getNum();
if (preg_match('/^F(\d+)$/', $num, $matches)) {
$val = (int) $matches[1];
if ($val > $maxNum) {
$maxNum = $val;
}
}
}
$tt = "F" . ($maxNum + 1);
$test = $devisRepository->findOneBy(['num' => $tt]);
if ($form->isSubmitted() && $form->isValid()) {
$res = $request->request->all('chk_child');
$numrr = $request->request->get('numr');
$dateRetour = $form->get('date')->getData() ?: new DateTime('now', new DateTimeZone('Africa/Tunis'));
$devi->setDate($sourceDate);
$devisr=new Devis();
$devisr->setVendeur($devi->getVendeur());
$devisr->setClient($devi->getClient());
$devisr->setDate($dateRetour);
$devisr->setFrtour($devi->getId());
$devisr->setStatut("Facture-R");
$devisr->setReference($devi->getNum());
// $devi->setAcompte($acompte);
// $devi->setNetapayer($netapayer);
$devisRepository->save($devisr, true);
$qtetotal=0;
$base=0;
$taux=0;
$total=0;
$montant=0;
$totalht=0;
$totalttc=0;
$code =0;
$rett=[];
$hasSelectedRows = false;
$isTotalReturn = true;
$selectedRows = [];
foreach ($res as $re)
{
$parts = explode("-", $re);
if (isset($parts[1])) {
$selectedRows[] = (int) $parts[1];
}
$prr= $produitRepository->findOneBy(['id'=>$parts[0]]);
$rett[]=$parts[0];
$quatsource= $request->request->get('qte_source_' . $parts[1]);
$quattttt= $request->request->get('qte_' . $parts[1]);
$qterestttt = $request->request->get('qterest_' . $parts[1]);
$montanhtttt= $request->request->get('montantht_' . $parts[1]);
$farticele = $famillesdarticlesRepository->findOneBy(['reference' => $prr->getType()]);
$prod = new Produit();
$prod->setDeviss($prr->getDeviss());
$prod->setCoursdejours($prr->getCoursdejours());
$prod->setPrixunitdt($prr->getPrixunitdt());
$prod->setType($prr->getType());
$prod->setQte($quatsource);
$prod->setQtef($quattttt);
$prod->setQterest($qterestttt);
$prod->setTva($prr->getTva());
$prod->setPrix($prr->getPrix());
$prod->setRemise($prr->getRemise());
$prod->setDesignation($prr->getDesignation());
$prod->setMontantht($montanhtttt);
$prod->setDevis($devisr);
$produitRepository->save($prod, true);
$code = $code + (($prr->getTva() * intval($montanhtttt))/100);
$qtetotal=$qtetotal+ intval($quattttt) ;
$base=$base+ intval($montanhtttt);
$hasSelectedRows = true;
$qteSourceInt = (int) $quatsource;
$qteRetourInt = (int) $quattttt;
$qteRestInt = (int) $qterestttt;
if ($qteRetourInt < $qteSourceInt || $qteRestInt > 0) {
$isTotalReturn = false;
}
$qteRetour = (int) $quattttt;
$qteStockActuel = (int) ($farticele->getQunatity() ?? 0);
$qteTotalActuel = (int) ($farticele->getQtetotal() ?? 0);
$farticele->setQunatity((string) ($qteStockActuel + $qteRetour));
$farticele->setQtetotal((string) ($qteTotalActuel + $qteRetour));
$famillesdarticlesRepository->save($farticele,true);
}
for ($i = 1; $i <= (int) $nbr; $i++) {
$qteRest = (float) ($request->request->get('qterest_' . $i) ?? 0);
if ($qteRest > 0 || !in_array($i, $selectedRows, true)) {
$isTotalReturn = false;
break;
}
}
$timbre = ($hasSelectedRows && $isTotalReturn) ? 1 : 0;
$totalttc =$base+$code+$timbre;
$devisr->setFournisseur($vendeurs);
$devisr->setCode($code);
$devisr->setQttotal($qtetotal);
$devisr->setnum($numrr);
$devi->setReference($numrr);
$devisr->setBase($base);
$devisr->setTaux(null);
$devisr->setRc($devi->getId());
$devisr->setRetour($rett);
$devisr->setTotal($base);
$devisr->setMontant(null);
$devisr->setTotalht($base);
$devisr->setTotalttc($totalttc);
$devisr->setTimbre($timbre);
$devisRepository->save($devisr, true);
$this->recalculerMontantNetFacture($devi, $devisRepository, $paymentdeviRepository);
return $this->redirectToRoute('app_devis_liste_facture', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('devis/retour.html.twig', [
'devi' => $devi,
'form' => $form,
'aiguilles' => $aiguilles,
'platines' => $platines,
'courroi' => $courroi,
'familles' => $familles,
'familleall' => $familleall,
'tabfournisseurs' => $tabfournisseurs,
'tt' => $tt,
'vendeurs'=>$vendeurs
]);
}
#[Route('/{id}/avoir', name: 'app_devis_avoir', methods: ['GET', 'POST'])]
public function avoir(FournisseurRepository $fournisseurRepository, FamillesRepository $famillesRepository, FamillesdarticlesRepository $famillesdarticlesRepository, EntityManagerInterface $entityManager, ProduitRepository $produitRepository, CourroieRepository $courroieRepository, PlatinesRepository $platinesRepository, AiguillesRepository $aiguillesRepository, Request $request, Devis $devi, DevisRepository $devisRepository, PaymentdeviRepository $paymentdeviRepository): Response
{
$fournisseurs = $fournisseurRepository->findAll();
$tabfournisseurs[] = [
'nom' => "Cosa",
'prenom' => "Tunisie",
'numeroTelephone' => "",
];
foreach ($fournisseurs as $fournisseur) {
$tabfournisseurs[] = [
"Cosa Tunisie",
'nom' => $fournisseur->getNom(),
'prenom' => $fournisseur->getPrenom(),
'numeroTelephone' => $fournisseur->getTel(),
];
}
$vendeur = $devi->getVendeur();
$vendeurs = $fournisseurRepository->find($vendeur);
$familleall = $famillesRepository->findAll();
$familles = $famillesdarticlesRepository->findAll();
$courroi = $courroieRepository->findAll();
$platines = $platinesRepository->findAll();
$aiguilles = $aiguillesRepository->findAll();
$nbr = $request->request->get('nbrc_a');
$sourceDate = $devi->getDate() ? clone $devi->getDate() : null;
$form = $this->createForm(DevisType::class, $devi);
$form->handleRequest($request);
$factures = $devisRepository->findBy(['statut' => ["Facture", "Facture-R", "Facture-A"]]);
$maxNum = 0;
foreach ($factures as $facture) {
$num = (string) $facture->getNum();
if (preg_match('/^F(\d+)$/', $num, $matches)) {
$val = (int) $matches[1];
if ($val > $maxNum) {
$maxNum = $val;
}
}
}
$tt = "F" . ($maxNum + 1);
$test = $devisRepository->findOneBy(['num' => $tt]);
$code = $request->request->get('code');
$base = $request->request->get('base');
$taux = $request->request->get('taux');
$total = $request->request->get('total');
$montant = $request->request->get('montant');
$totalht = $request->request->get('totalht');
$totalttc = $request->request->get('totalttc');
// $acompte= $request->request->get('acompte');
$qtetotal = $request->request->get('qttotal');
$netapayer = $request->request->get('netapayer');
if ($form->isSubmitted() && $form->isValid()) {
$res = $request->request->all('chk_child');
$numrr = $request->request->get('numr');
$selectedRows = [];
$hasSelectedRows = false;
$isTotalReturn = true;
foreach ($res as $selectedValue) {
$parts = explode('-', (string) $selectedValue);
if (isset($parts[1])) {
$selectedRows[] = (int) $parts[1];
}
}
$dateAvoir = $form->get('date')->getData() ?: new DateTime('now', new DateTimeZone('Africa/Tunis'));
$devi->setDate($sourceDate);
$devisr=new Devis();
$devisr->setVendeur($devi->getVendeur());
$devisr->setClient($devi->getClient());
$devisr->setDate($dateAvoir);
$devisr->setFrtour($devi->getId());
$devisr->setStatut("Facture-A");
$devisr->setReference($devi->getNum());
$devisRepository->save($devisr, true);
if ($nbr > 1) {
for ($i = 1; $i <= $nbr; $i++) {
$restePrixUaFloat = (float) ($request->request->get('resteprixua_' . $i) ?? 0);
if ($restePrixUaFloat > 0 || !in_array($i, $selectedRows, true)) {
$isTotalReturn = false;
}
if (!in_array($i, $selectedRows, true)) {
continue;
}
if ($request->request->get('type_' . $i)) {
// dd($request->request->get('type'.$i));
$pr = new Produit();
$type = $request->request->get('type_' . $i);
$quantity = $request->request->get('qte_' . $i);
$tva = $request->request->get('tva_' . $i);
$qte = $famillesdarticlesRepository->findOneBy(['reference' => $type]);
$qteold = $request->request->get('qteold_' . $i);
$prix = $request->request->get('prix_' . $i);
$montant = $request->request->get('montantht_' . $i);
$desinagtion = $request->request->get('designation_' . $i);
$remise = $request->request->get('remise_' . $i);
$deviss = $request->request->get('devis_' . $i);
$coursdejours = $request->request->get('coursdejours_' . $i);
$prixdt = $request->request->get('prixdt_' . $i);
$prixua = $request->request->get('prixua_' . $i);
$restePrixUa = $request->request->get('resteprixua_' . $i);
$pr->setDeviss($deviss);
$pr->setCoursdejours($coursdejours);
$pr->setPrixunitdt($prixua ?: $prixdt);
$pr->setQtestock($restePrixUa);
$pr->setType($type);
$pr->setQte($quantity);
$pr->setTva($tva);
$pr->setPrix($prix);
$pr->setRemise($remise);
$pr->setDesignation($desinagtion);
$pr->setMontantht($montant);
$pr->setDevis($devisr);
$produitRepository->save($pr, true);
$hasSelectedRows = true;
$qteInt = (int) $quantity;
$qteOldInt = (int) $qteold;
if ($qteInt < $qteOldInt || $restePrixUaFloat > 0) {
$isTotalReturn = false;
}
}
}
$entityManager->persist($devisr);
$entityManager->flush();
}
$devisr->setFournisseur($vendeurs);
$devisr->setCode($code);
$devisr->setQttotal($qtetotal);
$devisr->setnum($numrr);
$devi->setReference($numrr);
$devisr->setBase($base);
$devisr->setTaux(null);
$devisr->setfav($devi->getId());
$devisr->setRetour($res);
$devisr->setTotal($base);
$devisr->setMontant(null);
$devisr->setTotalht($base);
$timbre = ($hasSelectedRows && $isTotalReturn) ? 1 : 0;
$totalttcValue = (float) $base + (float) $code + $timbre;
$devisr->setTotalttc((string) $totalttcValue);
$devisr->setTimbre((string) $timbre);
$devisRepository->save($devisr, true);
$this->recalculerMontantNetFacture($devi, $devisRepository, $paymentdeviRepository);
return $this->redirectToRoute('app_devis_liste_facture', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('devis/avoir.html.twig', [
'devi' => $devi,
'form' => $form,
'aiguilles' => $aiguilles,
'platines' => $platines,
'courroi' => $courroi,
'familles' => $familles,
'familleall' => $familleall,
'tabfournisseurs' => $tabfournisseurs,
'tt' => $tt,
'vendeurs'=>$vendeurs
]);
}
#[Route('/delete/{id}', name: 'app_devis_delete')]
public function delete(EntityManagerInterface $entityManager,ArchivearticleRepository $archivearticleRepository,UserRepository $userRepository,EntityManagerInterface $em,Security $security,Request $request, Devis $devi,FamillesdarticlesRepository $famillesdarticlesRepository ,ProduitRepository $produitRepository, DevisRepository $devisRepository,PaymentdeviRepository $paymentdeviRepository, BlStockMovementFusionService $stockMovementFusionService): Response
{
if ($devi->getStatut() === 'Facture' && $devi->getOldtype() === 'FactureBLFusion') {
$originalBls = $stockMovementFusionService->findOriginalBls($devi);
$stockMovementFusionService->restoreCompleteFusion($originalBls, $devi);
foreach ($originalBls as $originalBl) {
$originalBl->setStatut('BL');
$originalBl->setIdfacture(null);
$entityManager->persist($originalBl);
}
foreach ($devi->getPaymentdevis() as $payment) {
$entityManager->remove($payment);
}
foreach ($produitRepository->findBy(['devis' => $devi]) as $invoiceProduct) {
$entityManager->remove($invoiceProduct);
}
$entityManager->remove($devi);
$entityManager->flush();
return $this->redirectToRoute('app_devis_liste_facture', [], Response::HTTP_SEE_OTHER);
}
if ($devi->getStatut() === 'Facture' && $devi->getFav()) {
$blfus = $devisRepository->find((int) $devi->getFav());
if ($blfus && $blfus->getStatut() === 'BLFUS') {
foreach ($devi->getProduit() as $factureProduit) {
foreach ($blfus->getProduit() as $blfusProduit) {
if (
$blfusProduit->getType() === $factureProduit->getType()
&& $blfusProduit->getDesignation() === $factureProduit->getDesignation()
) {
$ancienneQteFacturee = (float) ($blfusProduit->getQtef() ?? 0);
$qteFactureASupprimer = (float) ($factureProduit->getQte() ?? 0);
$nouvelleQteFacturee = max(0, $ancienneQteFacturee - $qteFactureASupprimer);
$qteOriginale = (float) ($blfusProduit->getQte() ?? 0);
$blfusProduit->setQtef((string) $nouvelleQteFacturee);
$blfusProduit->setQterest((string) ($qteOriginale - $nouvelleQteFacturee));
$produitRepository->save($blfusProduit, true);
break;
}
}
}
$idsFactures = $blfus->getIdsfacts() ? json_decode($blfus->getIdsfacts(), true) : [];
if (!is_array($idsFactures)) {
$idsFactures = [];
}
$idsFactures = array_values(array_filter($idsFactures, static fn ($id) => (int) $id !== $devi->getId()));
$blfus->setIdsfacts($idsFactures !== [] ? json_encode($idsFactures) : null);
if ($idsFactures !== []) {
$lastFactureId = (int) end($idsFactures);
$lastFacture = $devisRepository->find($lastFactureId);
$blfus->setIdfacture($lastFacture?->getNum());
} else {
$blfus->setIdfacture(null);
}
$devisRepository->save($blfus, true);
$toutRevientAZero = true;
foreach ($blfus->getProduit() as $blfusProduit) {
if ((float) ($blfusProduit->getQtef() ?? 0) > 0) {
$toutRevientAZero = false;
break;
}
}
if ($toutRevientAZero) {
$stockMovementFusionService->restorePartialFusion($blfus);
$entityManager->flush();
$idsBlOrigine = $blfus->getIddevisold() ? json_decode($blfus->getIddevisold(), true) : [];
if (!is_array($idsBlOrigine) || $idsBlOrigine === []) {
$idsBlOrigine = array_map(
static fn (Devis $originalBl): int => $originalBl->getId(),
$stockMovementFusionService->findOriginalBls($blfus)
);
}
if (is_array($idsBlOrigine)) {
foreach ($idsBlOrigine as $idBlOrigine) {
$blOriginal = $devisRepository->find((int) $idBlOrigine);
if ($blOriginal) {
$blOriginal->setStatut('BL');
$blOriginal->setIdfacture(null);
$devisRepository->save($blOriginal, true);
}
}
}
$devisRepository->remove($blfus, true);
} else {
$stockMovementFusionService->synchronizePartialFusion($blfus);
}
}
foreach ($devi->getPaymentdevis() as $payment) {
$paymentdeviRepository->remove($payment, true);
}
foreach ($devi->getProduit() as $produitFacture) {
$produitRepository->remove($produitFacture, true);
}
$archiveArticles = $archivearticleRepository->findBy(['fichevente' => $devi]);
foreach ($archiveArticles as $archiveArticle) {
$entityManager->remove($archiveArticle);
}
$devisRepository->remove($devi, true);
return $this->redirectToRoute('app_devis_liste_facture', [], Response::HTTP_SEE_OTHER);
}
// Vérification de l'existence du champ iddevisold et de son contenu pour sup facture et retourner les bl a leur liste et supprimer de l'archive bl
// Vérifier si le champ iddevisold n'est pas null et est une chaîne JSON
if ($devi->getIddevisold() != null) {
// Décoder la chaîne JSON pour obtenir les IDs des devis associés
$idsDevisOld = json_decode($devi->getIddevisold(), true);
if (is_array($idsDevisOld)) {
// Récupérer les devis associés par leurs IDs
foreach ($idsDevisOld as $idDevis) {
$associatedDevi = $devisRepository->findOneBy(['id' => $idDevis]);
// Vérifier si le devis associé existe et changer son statut en "BL"
if ($associatedDevi) {
$associatedDevi->setStatut("BL");
$associatedDevi->setIdfacture($devi->getId()); // Associer la facture
$devisRepository->save($associatedDevi, true); // Sauvegarder la modification
}
}
}
}
// Vérification et transfert des produits si un devis existant est trouvé
if ($devi->getStatut() == 'Devis' && $devi->getOldtype() == 'Demande devis' && $devi->getIddevisold() != null) {
$deviexiste = $devisRepository->findOneBy(['id' => $devi->getIddevisold(), 'statut' => 'Demande devis']);
// dd('devis existe',$deviexiste, $devi->getProduit());
if (!$deviexiste) {
$deviexiste = $devisRepository->findOneBy(['iddevisold' => $devi->getIddevisold(), 'statut' => 'Demande devis']);
}
if ($deviexiste) {
$produitsToTransfer = $devi->getProduit();
// dd('honi chfama',$produitsToTransfer);
foreach ($produitsToTransfer as $produit) {
if ($produit !== null) {
$produitExistant = new Produit();
$produitExistant->setPrix($produit->getPrix());
$produitExistant->setTva($produit->getTva());
$produitExistant->setType($produit->getType());
$produitExistant->setCode($produit->getCode());
$produitExistant->setDesignation($produit->getDesignation());
$produitExistant->setMontantht($produit->getMontantht());
$produitExistant->setQte($produit->getQte());
$produitExistant->setPrixunitdt($produit->getPrixunitdt());
$produitExistant->setCoursdejours($produit->getCoursdejours());
$produitExistant->setRemise($produit->getRemise());
$produitExistant->setQtestock($produit->getQtestock());
$produitExistant->setDeviss($produit->getDeviss());
$produitExistant->setDemande('Locale');
$produitExistant->setDevis($deviexiste);
$deviexiste->addProduit($produitExistant);
// Utilisez EntityManager pour persister les nouvelles entités
$em->persist($produitExistant);
$em->flush();
// dump($produitExistant,$deviexiste, $produit);
}
}
// dd($produitsToTransfer,$deviexiste);
// Flush une seule fois après toutes les insertions
$em->flush();
// Sauvegarde finale du devis existant après toutes les modifications
$em->persist($deviexiste);
$em->flush();
}
else{
$newdevis = new Devis();
$newdevis->setIddevisold($devi->getIddevisold());
$newdevis->setClient($devi->getClient());
$newdevis->setVendeur($devi->getVendeur());
//numéro de devis
$newdevis->setDate(new DateTime('now', new DateTimeZone('Africa/Tunis')));
$newdevis->setReference($devi->getReference());
$newdevis->setBase($devi->getBase());
$newdevis->setTotal($devi->getTotal());
$newdevis->setTotalht($devi->getTotalht());
$newdevis->setCode($devi->getCode());
$newdevis->setQttotal($devi->getQttotal());
$newdevis->setTimbre($devi->getTimbre());
$newdevis->setTotalttc($devi->getTotalttc());
$newdevis->setStatut('Demande devis');
// $newdevis->setUser('Demande devis');
// dd($devi->getIduerold(),$userRepository->find(['id'=>$devi->getIduerold()]));
$userold = $userRepository->findOneBy(['id'=>$devi->getIduerold()]);
if (!$userold){
$userold = $userRepository->findOneBy(['id'=>$devi->getUser()]);
}
$newdevis->setUser($userold);
//Partie géner num pour devis
$status = 'Demande devis';
// Recherchez la FamilleArticle en fonction de la référence
$totstatu = $devisRepository->findBy(['statut' => $status]);
$count = count($totstatu);
if ($count == 0) {
$count = 1;
}
else {
$count = $count + 1;
}
// Génération du numéro de base
if ($status == "Demande devis") {
$tt = "Dd" . $count;
}
// Vérification de l'existence du numéro et génération d'un nouveau si nécessaire
while ($devisRepository->findOneBy(['num' => $tt])) {
$count++;
$tt = "Dd" . $count;
}
$newdevis->setNum($tt);
$produitsToTransfer = $devi->getProduit();
foreach ($produitsToTransfer as $produit) {
if ($produit !== null) {
$produitExistant = new Produit();
$produitExistant->setPrix($produit->getPrix());
$produitExistant->setTva($produit->getTva());
$produitExistant->setType($produit->getType());
$produitExistant->setCode($produit->getCode());
$produitExistant->setDesignation($produit->getDesignation());
$produitExistant->setMontantht($produit->getMontantht());
$produitExistant->setQte($produit->getQte());
$produitExistant->setPrixunitdt($produit->getPrixunitdt());
$produitExistant->setCoursdejours($produit->getCoursdejours());
$produitExistant->setRemise($produit->getRemise());
$produitExistant->setQtestock($produit->getQtestock());
$produitExistant->setDeviss($produit->getDeviss());
$produitExistant->setDemande('Locale');
// Répétez pour chaque propriété...
$produitExistant->setDevis($newdevis);
$newdevis->addProduit($produitExistant);
// Utilisez EntityManager pour persister les nouvelles entités
$em->persist($produitExistant);
$em->flush();
}
}
// Flush une seule fois après toutes les insertions
$em->flush();
// Sauvegarde finale du devis existant après toutes les modifications
$em->persist($newdevis);
$em->flush();
}
}
$test = $devisRepository->findBy(['idfacture'=>$devi->getId()]);
$test2 = $devisRepository->findBy(['fav'=>$devi->getId(),'frtour'=>$devi->getId()]);
if ($test)
{
foreach ($test as $blss) {
$a = $devisRepository->findOneBy(['id' => $blss]);
$a->setStatut("BL");
$a->setIdfacture($devi->getId());
$devisRepository->save($a, true);
}
$pay= $devi->getPaymentdevis();
foreach ($pay as $blss) {
$paymentdeviRepository->remove($blss, true);
}
}
elseif ($test2)
{
foreach ($test2 as $pro2) {
$pro3= $pro2->getProduit();
foreach ($pro3 as $pro) {
$produitRepository->remove($pro, true);
}
$devisRepository->remove($pro2,true);
}
}
else {
$statut = $devi->getStatut();
// On fait le retour de Qte seulement pour ces statuts :
// - Demande devis (statut actuel)
// - oldtype = Demande devis
// - BL
// - Facture
// - BLP
if (
// $statut === 'Demande devis'
// || $devi->getOldtype() === 'Demande devis'
$statut === 'BL'
|| $statut === 'Facture'
|| $statut === 'BLP'
) {
$produit = $devi->getProduit();
foreach ($produit as $pro) {
$famille = $famillesdarticlesRepository->findOneBy(['reference' => $pro->getType()]);
if ($famille) {
$qteRetour = (float) ($pro->getQte() ?? 0);
$currentQunatity = (float) ($famille->getQunatity() ?? 0);
$famille->setQunatity((string) ($currentQunatity + $qteRetour));
$qtetotalActuel = $famille->getQtetotal();
$newqtetotal = $qtetotalActuel !== null ? (float) $qtetotalActuel : 0;
$newqtetotal = $newqtetotal + $qteRetour;
$famille->setQtetotal((string) $newqtetotal);
$famillesdarticlesRepository->save($famille, true);
}
$produitRepository->remove($pro, true);
}
}
else {
// Si tu veux, pour les autres statuts on supprime seulement les produits sans toucher au stock
$produit = $devi->getProduit();
foreach ($produit as $pro) {
$produitRepository->remove($pro, true);
}
}
}
// else{
// $produit= $devi->getProduit();
//
// foreach ($produit as $pro) {
//
// $famille= $famillesdarticlesRepository->findOneBy(['reference'=>$pro->getType()]);
// $famille->setQunatity($famille->getQunatity() + intval($pro->getQte()) );
// $famillesdarticlesRepository->save($famille,true);
//
// $produitRepository->remove($pro, true);
// }
// }
//code jdid
$archiveArticles = $archivearticleRepository->findBy(['fichevente' => $devi]);
foreach ($archiveArticles as $a) {
$entityManager->remove($a);
}
$devisRepository->remove($devi, true);
if ($security->isGranted('ROLE_TECHNICIEN')) {
return $this->redirectToRoute('liste_Demande_Devis', [], Response::HTTP_SEE_OTHER);
}
else{
// Redirection en fonction du statut
switch ($devi->getStatut()) {
case 'Facture':
return $this->redirectToRoute('app_devis_liste_facture', [], Response::HTTP_SEE_OTHER);
case 'Devis':
return $this->redirectToRoute('app_devis_liste_devis', [], Response::HTTP_SEE_OTHER);
case 'Demande devis':
return $this->redirectToRoute('app_devis_iste_demande_devis', [], Response::HTTP_SEE_OTHER);
case 'BLP':
return $this->redirectToRoute('app_devis_particulier_index', [], Response::HTTP_SEE_OTHER);
case 'BL':
return $this->redirectToRoute('app_devis_liste_bl', [], Response::HTTP_SEE_OTHER);
case 'Commande':
return $this->redirectToRoute('app_devis_liste_commandes', [], Response::HTTP_SEE_OTHER);
default:
// Fallback si le statut est inconnu
return $this->redirectToRoute('app_devis_index', [], Response::HTTP_SEE_OTHER);
}
// return $this->redirectToRoute('app_devis_index', [], Response::HTTP_SEE_OTHER);
}
}
#[Route('/delete/retour/{id}', name: 'app_devis_dretour')]
public function deleteretour(Request $request, Devis $devi,ProduitRepository $produitRepository,FamillesdarticlesRepository $famillesdarticlesRepository, DevisRepository $devisRepository,PaymentdeviRepository $paymentdeviRepository): Response
{
$factureOriginale = $devi->getFrtour()
? $devisRepository->find((int) $devi->getFrtour())
: null;
$produit= $devi->getProduit();
if ( $devi->getStatut() == "Facture-R")
{
foreach ($produit as $pro) {
$famille= $famillesdarticlesRepository->findOneBy(['reference'=>$pro->getType()]);
$famille->setQunatity($famille->getQunatity() - intval($pro->getQtef()) );
$famille->setQtetotal($famille->getQtetotal() - intval($pro->getQtef()) );
$famillesdarticlesRepository->save($famille,true);
$produitRepository->remove($pro, true);
}
}
else
{
foreach ($produit as $pro) {
$produitRepository->remove($pro, true);
}
}
$devisRepository->remove($devi, true);
if ($factureOriginale) {
$this->recalculerMontantNetFacture($factureOriginale, $devisRepository, $paymentdeviRepository);
}
// Redirection en fonction du statut
switch ($devi->getStatut()) {
case 'Facture':
return $this->redirectToRoute('app_devis_liste_facture', [], Response::HTTP_SEE_OTHER);
case 'Devis':
return $this->redirectToRoute('app_devis_liste_devis', [], Response::HTTP_SEE_OTHER);
case 'Demande devis':
return $this->redirectToRoute('app_devis_iste_demande_devis', [], Response::HTTP_SEE_OTHER);
case 'BLP':
return $this->redirectToRoute('app_devis_particulier_index', [], Response::HTTP_SEE_OTHER);
case 'BL':
return $this->redirectToRoute('app_devis_liste_bl', [], Response::HTTP_SEE_OTHER);
case 'Commande':
return $this->redirectToRoute('app_devis_liste_commandes', [], Response::HTTP_SEE_OTHER);
case 'Facture-R':
return $this->redirectToRoute('app_devis_liste_facture', [], Response::HTTP_SEE_OTHER);
case 'Facture-A':
return $this->redirectToRoute('app_devis_liste_facture', [], Response::HTTP_SEE_OTHER);
default:
// Fallback si le statut est inconnu
return $this->redirectToRoute('app_devis_index', [], Response::HTTP_SEE_OTHER);
}
// return $this->redirectToRoute('app_devis_index', [], Response::HTTP_SEE_OTHER);
}
#[Route('/delete/avoir/{id}', name: 'app_devis_davoir')]
public function deleteavoir(Request $request, Devis $devi,ProduitRepository $produitRepository, DevisRepository $devisRepository,PaymentdeviRepository $paymentdeviRepository): Response
{
$factureOriginale = $devi->getFav()
? $devisRepository->find((int) $devi->getFav())
: null;
$produit= $devi->getProduit();
foreach ($produit as $pro) {
$produitRepository->remove($pro, true);
}
$devisRepository->remove($devi, true);
if ($factureOriginale) {
$this->recalculerMontantNetFacture($factureOriginale, $devisRepository, $paymentdeviRepository);
}
// Redirection en fonction du statut
switch ($devi->getStatut()) {
case 'Facture':
return $this->redirectToRoute('app_devis_liste_facture', [], Response::HTTP_SEE_OTHER);
case 'Devis':
return $this->redirectToRoute('app_devis_liste_devis', [], Response::HTTP_SEE_OTHER);
case 'Demande devis':
return $this->redirectToRoute('app_devis_iste_demande_devis', [], Response::HTTP_SEE_OTHER);
case 'BLP':
return $this->redirectToRoute('app_devis_particulier_index', [], Response::HTTP_SEE_OTHER);
case 'BL':
return $this->redirectToRoute('app_devis_liste_bl', [], Response::HTTP_SEE_OTHER);
case 'Commande':
return $this->redirectToRoute('app_devis_liste_commandes', [], Response::HTTP_SEE_OTHER);
default:
// Fallback si le statut est inconnu
return $this->redirectToRoute('app_devis_index', [], Response::HTTP_SEE_OTHER);
}
// return $this->redirectToRoute('app_devis_index', [], Response::HTTP_SEE_OTHER);
}
#[Route('/delete_devis_intervention/{id}', name: 'delete_devis_intervention')]
public function deletedevisintervention(DevisRepository $devisRepository, EntityManagerInterface $entityManager, InterventionRepository $interventionRepository, Request $request, Devis $devi): Response {
// 1. Récupérer la liste des IDs d'interventions liés au devis
$idsIntervention = $devi->getIdintervold();
// 2. Convertir la chaîne d'IDs en tableau d'entiers
$idsIntervention = array_map('intval', explode(',', trim($idsIntervention, '[]')));
// 3. Si des IDs d'interventions existent
if ($idsIntervention) {
// 4. Récupérer toutes les interventions correspondantes
$interventions = $interventionRepository->findBy(['id' => $idsIntervention]);
// 5. Mettre leur statut à NULL (ou à "archivé" si vous préférez)
foreach ($interventions as $intervention) {
$intervention->setStatut(null); // Ou utilisez une autre valeur comme 'archivé'
$entityManager->persist($intervention);
}
}
// 6. Dissocier les interventions du devis (si besoin)
foreach ($devi->getIntervention() as $intervention) {
$intervention->setDevis(null); // Dissocier l'intervention du devis
$entityManager->persist($intervention);
}
// 7. Supprimer le devis
$entityManager->remove($devi);
$entityManager->flush(); // Appliquer les changements dans la base de données
// 8. Rediriger vers la liste des factures (ou autre page)
return $this->redirectToRoute('app_devis_liste_facture', [], Response::HTTP_SEE_OTHER);
}
// #[Route('/delete/{id}', name: 'app_devis_delete')]
// public function delete(EntityManagerInterface $entityManager,ArchivearticleRepository $archivearticleRepository,UserRepository $userRepository,EntityManagerInterface $em,Security $security,Request $request, Devis $devi,FamillesdarticlesRepository $famillesdarticlesRepository ,ProduitRepository $produitRepository, DevisRepository $devisRepository,PaymentdeviRepository $paymentdeviRepository): Response
// {
// if ($devi->getStatut() === 'Facture' && $devi->getFav()) {
// $blfus = $devisRepository->find((int) $devi->getFav());
//
// if ($blfus && $blfus->getStatut() === 'BLFUS') {
// foreach ($devi->getProduit() as $factureProduit) {
// foreach ($blfus->getProduit() as $blfusProduit) {
// if (
// $blfusProduit->getType() === $factureProduit->getType()
// && $blfusProduit->getDesignation() === $factureProduit->getDesignation()
// ) {
// $ancienneQteFacturee = (float) ($blfusProduit->getQtef() ?? 0);
// $qteFactureASupprimer = (float) ($factureProduit->getQte() ?? 0);
// $nouvelleQteFacturee = max(0, $ancienneQteFacturee - $qteFactureASupprimer);
// $qteOriginale = (float) ($blfusProduit->getQte() ?? 0);
//
// $blfusProduit->setQtef((string) $nouvelleQteFacturee);
// $blfusProduit->setQterest((string) ($qteOriginale - $nouvelleQteFacturee));
// $produitRepository->save($blfusProduit, true);
// break;
// }
// }
// }
//
// $idsFactures = $blfus->getIdsfacts() ? json_decode($blfus->getIdsfacts(), true) : [];
// if (!is_array($idsFactures)) {
// $idsFactures = [];
// }
//
// $idsFactures = array_values(array_filter($idsFactures, static fn ($id) => (int) $id !== $devi->getId()));
// $blfus->setIdsfacts($idsFactures !== [] ? json_encode($idsFactures) : null);
//
// if ($idsFactures !== []) {
// $lastFactureId = (int) end($idsFactures);
// $lastFacture = $devisRepository->find($lastFactureId);
// $blfus->setIdfacture($lastFacture?->getNum());
// } else {
// $blfus->setIdfacture(null);
// }
//
// $devisRepository->save($blfus, true);
//
// $toutRevientAZero = true;
// foreach ($blfus->getProduit() as $blfusProduit) {
// if ((float) ($blfusProduit->getQtef() ?? 0) > 0) {
// $toutRevientAZero = false;
// break;
// }
// }
//
// if ($toutRevientAZero) {
// $idsBlOrigine = $blfus->getIddevisold() ? json_decode($blfus->getIddevisold(), true) : [];
// if (is_array($idsBlOrigine)) {
// foreach ($idsBlOrigine as $idBlOrigine) {
// $blOriginal = $devisRepository->find((int) $idBlOrigine);
// if ($blOriginal) {
// $blOriginal->setStatut('BL');
// $blOriginal->setIdfacture(null);
// $devisRepository->save($blOriginal, true);
// }
// }
// }
//
// $devisRepository->remove($blfus, true);
// }
// }
//
// foreach ($devi->getPaymentdevis() as $payment) {
// $paymentdeviRepository->remove($payment, true);
// }
//
// foreach ($devi->getProduit() as $produitFacture) {
// $produitRepository->remove($produitFacture, true);
// }
//
// $archiveArticles = $archivearticleRepository->findBy(['fichevente' => $devi]);
// foreach ($archiveArticles as $archiveArticle) {
// $entityManager->remove($archiveArticle);
// }
//
// $devisRepository->remove($devi, true);
//
// return $this->redirectToRoute('app_devis_liste_facture', [], Response::HTTP_SEE_OTHER);
// }
//
//
// // Vérification de l'existence du champ iddevisold et de son contenu pour sup facture et retourner les bl a leur liste et supprimer de l'archive bl
//
// // Vérifier si le champ iddevisold n'est pas null et est une chaîne JSON
// if ($devi->getIddevisold() != null) {
// // Décoder la chaîne JSON pour obtenir les IDs des devis associés
// $idsDevisOld = json_decode($devi->getIddevisold(), true);
//
// if (is_array($idsDevisOld)) {
// // Récupérer les devis associés par leurs IDs
// foreach ($idsDevisOld as $idDevis) {
// $associatedDevi = $devisRepository->findOneBy(['id' => $idDevis]);
//
// // Vérifier si le devis associé existe et changer son statut en "BL"
// if ($associatedDevi) {
// $associatedDevi->setStatut("BL");
// $associatedDevi->setIdfacture($devi->getId()); // Associer la facture
// $devisRepository->save($associatedDevi, true); // Sauvegarder la modification
// }
// }
// }
// }
// // Vérification et transfert des produits si un devis existant est trouvé
// if ($devi->getStatut() == 'Devis' && $devi->getOldtype() == 'Demande devis' && $devi->getIddevisold() != null) {
// $deviexiste = $devisRepository->findOneBy(['id' => $devi->getIddevisold(), 'statut' => 'Demande devis']);
//// dd('devis existe',$deviexiste, $devi->getProduit());
// if (!$deviexiste) {
// $deviexiste = $devisRepository->findOneBy(['iddevisold' => $devi->getIddevisold(), 'statut' => 'Demande devis']);
// }
//
// if ($deviexiste) {
// $produitsToTransfer = $devi->getProduit();
//
//// dd('honi chfama',$produitsToTransfer);
// foreach ($produitsToTransfer as $produit) {
// if ($produit !== null) {
// $produitExistant = new Produit();
//
// $produitExistant->setPrix($produit->getPrix());
// $produitExistant->setTva($produit->getTva());
// $produitExistant->setType($produit->getType());
// $produitExistant->setCode($produit->getCode());
// $produitExistant->setDesignation($produit->getDesignation());
// $produitExistant->setMontantht($produit->getMontantht());
// $produitExistant->setQte($produit->getQte());
// $produitExistant->setPrixunitdt($produit->getPrixunitdt());
// $produitExistant->setCoursdejours($produit->getCoursdejours());
// $produitExistant->setRemise($produit->getRemise());
// $produitExistant->setQtestock($produit->getQtestock());
// $produitExistant->setDeviss($produit->getDeviss());
// $produitExistant->setDemande('Locale');
// $produitExistant->setDevis($deviexiste);
// $deviexiste->addProduit($produitExistant);
//
// // Utilisez EntityManager pour persister les nouvelles entités
// $em->persist($produitExistant);
// $em->flush();
//// dump($produitExistant,$deviexiste, $produit);
// }
// }
//// dd($produitsToTransfer,$deviexiste);
// // Flush une seule fois après toutes les insertions
// $em->flush();
//
// // Sauvegarde finale du devis existant après toutes les modifications
// $em->persist($deviexiste);
// $em->flush();
// }
// else{
// $newdevis = new Devis();
//
// $newdevis->setIddevisold($devi->getIddevisold());
// $newdevis->setClient($devi->getClient());
// $newdevis->setVendeur($devi->getVendeur());
// //numéro de devis
// $newdevis->setDate(new DateTime('now', new DateTimeZone('Africa/Tunis')));
// $newdevis->setReference($devi->getReference());
// $newdevis->setBase($devi->getBase());
// $newdevis->setTotal($devi->getTotal());
// $newdevis->setTotalht($devi->getTotalht());
// $newdevis->setCode($devi->getCode());
// $newdevis->setQttotal($devi->getQttotal());
// $newdevis->setTimbre($devi->getTimbre());
// $newdevis->setTotalttc($devi->getTotalttc());
// $newdevis->setStatut('Demande devis');
//// $newdevis->setUser('Demande devis');
//// dd($devi->getIduerold(),$userRepository->find(['id'=>$devi->getIduerold()]));
// $userold = $userRepository->findOneBy(['id'=>$devi->getIduerold()]);
// if (!$userold){
// $userold = $userRepository->findOneBy(['id'=>$devi->getUser()]);
//
// }
// $newdevis->setUser($userold);
//
// //Partie géner num pour devis
// $status = 'Demande devis';
// // Recherchez la FamilleArticle en fonction de la référence
// $totstatu = $devisRepository->findBy(['statut' => $status]);
//
// $count = count($totstatu);
// if ($count == 0) {
// $count = 1;
// }
// else {
// $count = $count + 1;
// }
//
//
// // Génération du numéro de base
// if ($status == "Demande devis") {
// $tt = "Dd" . $count;
// }
//
// // Vérification de l'existence du numéro et génération d'un nouveau si nécessaire
// while ($devisRepository->findOneBy(['num' => $tt])) {
// $count++;
// $tt = "Dd" . $count;
// }
// $newdevis->setNum($tt);
// $produitsToTransfer = $devi->getProduit();
// foreach ($produitsToTransfer as $produit) {
// if ($produit !== null) {
// $produitExistant = new Produit();
//
// $produitExistant->setPrix($produit->getPrix());
// $produitExistant->setTva($produit->getTva());
// $produitExistant->setType($produit->getType());
// $produitExistant->setCode($produit->getCode());
// $produitExistant->setDesignation($produit->getDesignation());
// $produitExistant->setMontantht($produit->getMontantht());
// $produitExistant->setQte($produit->getQte());
// $produitExistant->setPrixunitdt($produit->getPrixunitdt());
// $produitExistant->setCoursdejours($produit->getCoursdejours());
// $produitExistant->setRemise($produit->getRemise());
// $produitExistant->setQtestock($produit->getQtestock());
// $produitExistant->setDeviss($produit->getDeviss());
// $produitExistant->setDemande('Locale');
// // Répétez pour chaque propriété...
// $produitExistant->setDevis($newdevis);
// $newdevis->addProduit($produitExistant);
// // Utilisez EntityManager pour persister les nouvelles entités
// $em->persist($produitExistant);
// $em->flush();
// }
// }
//
// // Flush une seule fois après toutes les insertions
// $em->flush();
//
// // Sauvegarde finale du devis existant après toutes les modifications
// $em->persist($newdevis);
// $em->flush();
//
//
// }
// }
//
// $test = $devisRepository->findBy(['idfacture'=>$devi->getId()]);
// $test2 = $devisRepository->findBy(['fav'=>$devi->getId(),'frtour'=>$devi->getId()]);
// if ($test)
// {
// foreach ($test as $blss) {
// $a = $devisRepository->findOneBy(['id' => $blss]);
// $a->setStatut("BL");
// $a->setIdfacture($devi->getId());
// $devisRepository->save($a, true);
// }
// $pay= $devi->getPaymentdevis();
// foreach ($pay as $blss) {
//
// $paymentdeviRepository->remove($blss, true);
// }
// }
// elseif ($test2)
// {
// foreach ($test2 as $pro2) {
// $pro3= $pro2->getProduit();
// foreach ($pro3 as $pro) {
//
// $produitRepository->remove($pro, true);
// }
//
// $devisRepository->remove($pro2,true);
//
// }
// }
// else {
//
// $statut = $devi->getStatut();
//
// // On fait le retour de Qte seulement pour ces statuts :
// // - Demande devis (statut actuel)
// // - oldtype = Demande devis
// // - BL
// // - Facture
// // - BLP
// if (
//// $statut === 'Demande devis'
//// || $devi->getOldtype() === 'Demande devis'
// $statut === 'BL'
// || $statut === 'Facture'
// || $statut === 'BLP'
// ) {
//
// $produit = $devi->getProduit();
//
// foreach ($produit as $pro) {
//
// $famille = $famillesdarticlesRepository->findOneBy(['reference' => $pro->getType()]);
//
// if ($famille) {
// $famille->setQunatity($famille->getQunatity() + (int) $pro->getQte());
// $famillesdarticlesRepository->save($famille, true);
// }
//
// $produitRepository->remove($pro, true);
// }
// }
// else {
// // Si tu veux, pour les autres statuts on supprime seulement les produits sans toucher au stock
// $produit = $devi->getProduit();
// foreach ($produit as $pro) {
// $produitRepository->remove($pro, true);
// }
// }
// }
//
//// else{
//// $produit= $devi->getProduit();
////
//// foreach ($produit as $pro) {
////
//// $famille= $famillesdarticlesRepository->findOneBy(['reference'=>$pro->getType()]);
//// $famille->setQunatity($famille->getQunatity() + intval($pro->getQte()) );
//// $famillesdarticlesRepository->save($famille,true);
////
//// $produitRepository->remove($pro, true);
//// }
//// }
//
// //code jdid
// $archiveArticles = $archivearticleRepository->findBy(['fichevente' => $devi]);
// foreach ($archiveArticles as $a) {
// $entityManager->remove($a);
// }
//
// $devisRepository->remove($devi, true);
//
//
// if ($security->isGranted('ROLE_TECHNICIEN')) {
// return $this->redirectToRoute('liste_Demande_Devis', [], Response::HTTP_SEE_OTHER);
//
// }
// else{
// // Redirection en fonction du statut
// switch ($devi->getStatut()) {
// case 'Facture':
// return $this->redirectToRoute('app_devis_liste_facture', [], Response::HTTP_SEE_OTHER);
//
// case 'Devis':
// return $this->redirectToRoute('app_devis_liste_devis', [], Response::HTTP_SEE_OTHER);
//
// case 'Demande devis':
// return $this->redirectToRoute('app_devis_iste_demande_devis', [], Response::HTTP_SEE_OTHER);
//
// case 'BLP':
// return $this->redirectToRoute('app_devis_particulier_index', [], Response::HTTP_SEE_OTHER);
// case 'BL':
// return $this->redirectToRoute('app_devis_liste_bl', [], Response::HTTP_SEE_OTHER);
// case 'Commande':
// return $this->redirectToRoute('app_devis_liste_commandes', [], Response::HTTP_SEE_OTHER);
//
// default:
// // Fallback si le statut est inconnu
// return $this->redirectToRoute('app_devis_index', [], Response::HTTP_SEE_OTHER);
// }
//// return $this->redirectToRoute('app_devis_index', [], Response::HTTP_SEE_OTHER);
//
// }
// }
}