<?php
namespace App\Controller;
use App\Entity\Aspect;
use App\Entity\Combinaison;
use App\Entity\Epaisseur;
use App\Entity\Forme;
use App\Entity\Piece;
use App\Entity\Vente;
use App\Form\DevisCommandeType;
use App\Form\PiecePublicType;
use App\Repository\AspectRepository;
use App\Repository\CategorieDeFormeRepository;
use App\Repository\CombinaisonRepository;
use App\Repository\EpaisseurRepository;
use App\Repository\FormeRepository;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Doctrine\Persistence\ManagerRegistry;
class DevisCommandeController extends AbstractController
{
#[Route('/devis-commande', name: 'app_devis_commande')]
public function index(Request $request, ManagerRegistry $doctrine): Response
{
$devisCommande = new Vente();
$form = $this->createForm(DevisCommandeType::class, $devisCommande);
//on gère le retour du formulaire
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $doctrine->getManager();
//on récupère les pièces
$pieces = $request->get('pieces');
//on boucle et on décompose le json pour chaque pièce
$nbFichier = 0;
foreach ($pieces as $piece) {
$piece = json_decode($piece);
//on crée une nouvelle pièce
$newPiece = new Piece();
$newPiece->setVente($devisCommande);
$newPiece->setQuantite($piece->Quantite);
$newPiece->setRAL($piece->Ral);
$newPiece->setCoteFinition($piece->CoteFinition);
$combinaison = $doctrine->getRepository(Combinaison::class)->find($piece->Matiere->Id);
$epaisseur = $doctrine->getRepository(Epaisseur::class)->find($piece->Epaisseur->Id);
$aspect = $doctrine->getRepository(Aspect::class)->find($piece->Aspect->Id);
$newPiece->setCombinaison($combinaison);
$newPiece->setEpaisseur($epaisseur);
$newPiece->setAspect($aspect);
$newPiece->setStatut("Nouveau");
//si on a un fichier
if (isset($piece->Fichier)) {
//on récupère le fichier associé dans le file input
$fichier = $request->files->get('fichier')[$nbFichier];
//on crée un nom unique pour le dossier
$nomDossier = "uploads/pieces/" . md5(uniqid());
//on crée le dossier dans public/uploads/pieces/
mkdir($nomDossier);
//on enregistre le fichier dans le dossier
$fichier->move($nomDossier, $fichier->getClientOriginalName());
//on enregistre le nom du fichier dans la base
$newPiece->setPlan($nomDossier . "/" . $fichier->getClientOriginalName());
$nbFichier++;
} else {
//on récupère la forme
$forme = $doctrine->getRepository(Forme::class)->find($piece->Forme->Id);
$newPiece->setForme($forme);
$newPiece->setCotes($piece->Cotes);
$newPiece->setAngles($piece->Angles);
$newPiece->setLongueurTotale($piece->Longueur);
}
$devisCommande->addPiece($newPiece);
$entityManager->persist($newPiece);
}
$devisCommande->setStatut("Nouveau");
$entityManager->persist($devisCommande);
$entityManager->flush();
}
return $this->render('devis_commande/index.html.twig', [
"form" => $form->createView(),
]);
}
//retourne les catégories de forme pour le formulaire
#[Route('/devis-commande/_categoriesDeForme', name: 'app_devis_commande__categoriesDeForme')]
public function formPiece(CategorieDeFormeRepository $categorieDeFormeRepository, CombinaisonRepository $combinaisonRepository, EpaisseurRepository $epaisseurRepository, AspectRepository $aspectRepository): Response
{
//on récupère la liste des catégories de forme
$categories = $categorieDeFormeRepository->findBy(["Actif" => true], ["Titre" => "ASC"]);
//on récupère la liste des combinaisons actives pour les pièces
$combinaisons = $combinaisonRepository->findBy(["Actif" => true], ["Titre" => "ASC"]);
//on récupère les épaisseurs
$epaisseurs = $epaisseurRepository->findBy(["Actif" => true], ["Titre" => "ASC"]);
//on récupère les aspects
$aspects = $aspectRepository->findBy(["Actif" => true], ["Titre" => "ASC"]);
//première étape du formulaire pour ajouter les pièces
//on va chercher toutes les catégories de forme
return $this->render('devis_commande/_categoriesDeForme.html.twig', [
'categories' => $categories,
"combinaisons" => $combinaisons,
"epaisseurs" => $epaisseurs,
"aspects" => $aspects,
]);
}
//les formes pour la catégorie de forme sélectionnée
#[Route('/devis-commande/_formes/{id}', name: 'app_devis_commande__formes')]
public function formForme($id, CategorieDeFormeRepository $categorieDeFormeRepository): Response
{
$categorie = $categorieDeFormeRepository->find($id);
//deuxième étape du formulaire pour ajouter les pièces
//on va chercher les formes pour la catégorie de forme sélectionnée
if (!$categorie)
return $this->render('devis_commande/_formes.html.twig', [
"fichier" => true,//si on veut afficher le champ "fichier
]);
else {
//on prend les formes actives de la catégorie
$formes = $categorie->getFormes()->filter(function ($forme) {
return $forme->isActif();
});
return $this->render('devis_commande/_formes.html.twig', [
"fichier" => false,
"categorie" => $categorie,
"formes" => $formes,
]);
}
}
//les infos de la forme
#[Route('/devis-commande/_forme_infos/{id}', name: 'app_devis_commande__forme_infos', methods: ['GET'])]
public function infosForme($id, FormeRepository $formeRepository): Response
{
//on appelle le controller FormeController pour récupérer les infos de la forme
//l'action existe déjà mais non accessible anonymement
$controller = new FormeController();
return $controller->infos($id, $formeRepository);
}
#[Route('/devis-commande/_combinaison/{id}', name: 'app_devis_commande__combinaison', methods: ['GET'])]
public function infos($id, CombinaisonRepository $combinaisonRepository): Response
{
//on appelle le controller CombinaisonController pour récupérer les infos de la combinaison
//l'action existe déjà mais non accessible anonymement
$controller = new CombinaisonController();
return $controller->infos($id, $combinaisonRepository);
}
}