<?php
namespace App\Controller;
use DateTime;
use App\Entity\Depense;
use App\Entity\Recette;
use App\Entity\Boutique;
use App\Form\DepenseType;
use App\Entity\SortieStock;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class RecetteController extends AbstractController
{
#[Route('/recettes', name: 'app_recettes', methods: ['GET'])]
public function index(EntityManagerInterface $entityManager): Response
{
// Récupérer toutes les boutiques
$boutiques = $entityManager->getRepository(Boutique::class)->findAll();
// Récupérer toutes les recettes
$recettes = $entityManager->getRepository(Recette::class)->findAll();
// Initialiser le tableau avec toutes les boutiques
$recettesParBoutique = [];
// D'abord, initialiser toutes les boutiques (même sans recettes)
foreach ($boutiques as $boutique) {
$recettesParBoutique[$boutique->getId()] = [
'boutique' => $boutique,
'boutiqueNom' => $boutique->getNom(),
'recettes' => []
];
}
// Ajouter une entrée pour les recettes sans boutique
$recettesParBoutique[0] = [
'boutique' => null,
'boutiqueNom' => 'Sans boutique',
'recettes' => []
];
// Ensuite, ajouter les recettes dans leurs boutiques respectives
foreach ($recettes as $recette) {
$boutique = $recette->getBoutique();
$boutiqueId = $boutique ? $boutique->getId() : 0;
// Calculer le montant net pour cette recette
$totalDepenses = 0;
foreach ($recette->getDepenses() as $depense) {
$totalDepenses += $depense->getMontant();
}
$montantNet = $recette->getMontant() - $totalDepenses;
// Ajouter la recette avec ses données calculées
$recettesParBoutique[$boutiqueId]['recettes'][] = [
'recette' => $recette,
'totalDepenses' => $totalDepenses,
'montantNet' => $montantNet
];
}
// Supprimer l'entrée "Sans boutique" si elle n'a pas de recettes
if (empty($recettesParBoutique[0]['recettes'])) {
unset($recettesParBoutique[0]);
}
// Cumuler les recettes par jour pour chaque boutique
foreach ($recettesParBoutique as $boutiqueId => &$boutique) {
$recettesCumulees = [];
// Grouper les recettes par jour
foreach ($boutique['recettes'] as $recetteData) {
$dateJour = $recetteData['recette']->getDateRecette()->format('Y-m-d');
if (!isset($recettesCumulees[$dateJour])) {
$recettesCumulees[$dateJour] = [
'date' => $recetteData['recette']->getDateRecette(),
'montantBrut' => 0,
'totalDepenses' => 0,
'montantNet' => 0,
'nombreRecettes' => 0,
'sources' => [],
'recettesDetails' => []
];
}
// Cumuler les montants
$recettesCumulees[$dateJour]['montantBrut'] += $recetteData['recette']->getMontant();
$recettesCumulees[$dateJour]['totalDepenses'] += $recetteData['totalDepenses'];
$recettesCumulees[$dateJour]['montantNet'] += $recetteData['montantNet'];
$recettesCumulees[$dateJour]['nombreRecettes']++;
// Ajouter la source si pas déjà présente
$source = $recetteData['recette']->getSource();
if (!in_array($source, $recettesCumulees[$dateJour]['sources'])) {
$recettesCumulees[$dateJour]['sources'][] = $source;
}
// Garder le détail des recettes pour les actions
$recettesCumulees[$dateJour]['recettesDetails'][] = $recetteData['recette'];
}
// Trier par date (plus récentes en premier)
uksort($recettesCumulees, function($a, $b) {
return $b <=> $a;
});
// Remplacer les recettes individuelles par les recettes cumulées
$boutique['recettesCumulees'] = $recettesCumulees;
unset($boutique['recettes']); // Supprimer l'ancien tableau
}
return $this->render('recette/index.html.twig', [
'recettesParBoutique' => $recettesParBoutique
]);
}
#[Route('/recette/generate', name: 'app_generate_recette', methods: ['POST'])]
public function generateRecette(EntityManagerInterface $entityManager): Response
{
$sortiesStock = $entityManager->getRepository(SortieStock::class)->findAll();
$recettesParJour = [];
foreach ($sortiesStock as $sortie) {
$date = $sortie->getDateSortie()->format('Y-m-d');
$prixVente = $sortie->getPrixVente();
if (!isset($recettesParJour[$date])) {
$recettesParJour[$date] = 0;
}
$recettesParJour[$date] += $prixVente;
}
foreach ($recettesParJour as $date => $montant) {
$recette = $entityManager->getRepository(Recette::class)->findOneBy(['dateRecette' => new DateTime($date)]);
if (!$recette) {
$recette = new Recette();
$recette->setDateRecette(new DateTime($date));
$recette->setMontant($montant);
} else {
$recette->setMontant($recette->getMontant() + $montant);
}
$entityManager->persist($recette);
}
$entityManager->flush();
return $this->redirectToRoute('app_recettes');
}
#[Route('/depense/new', name: 'app_depense_new', methods: ['GET', 'POST'])]
public function newDepense(Request $request, EntityManagerInterface $entityManager): Response
{
$depense = new Depense();
$form = $this->createForm(DepenseType::class, $depense);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$depense->setDateDepense(new DateTime('now'));
$date = $depense->getDateDepense()->format('Y-m-d');
$recette = $entityManager->getRepository(Recette::class)->findOneBy(['dateRecette' => new \DateTime($date)]);
if (!$recette) {
$recette = new Recette();
$recette->setDateRecette(new DateTime($date));
$recette->setMontant(0);
}
$recette->addDepense($depense);
$recette->setMontant($recette->getMontant() - $depense->getMontant());
$entityManager->persist($depense);
$entityManager->persist($recette);
$entityManager->flush();
return $this->redirectToRoute('app_recettes');
}
return $this->render('depense/new.html.twig', [
'form' => $form->createView(),
]);
}
#[Route('/recette/{id}', name: 'app_recette_show', methods: ['GET'])]
public function show(EntityManagerInterface $entityManager, int $id): Response
{
$recette = $entityManager->getRepository(Recette::class)->find($id);
if (!$recette) {
throw $this->createNotFoundException('La recette n\'existe pas.');
}
$depenses = $recette->getDepenses();
$totalDepenses = array_reduce($depenses->toArray(), function ($carry, $depense) {
return $carry + $depense->getMontant();
}, 0);
$montantNet = $recette->getMontant() - $totalDepenses;
return $this->render('recette/show.html.twig', [
'recette' => $recette,
'totalDepenses' => $totalDepenses,
'montantNet' => $montantNet,
]);
}
}