mise en place des budgets

This commit is contained in:
2021-06-07 13:58:56 +02:00
parent 1954c00b39
commit 54dc485503
31 changed files with 1705 additions and 53 deletions

View File

@@ -0,0 +1,387 @@
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Form\FormError;
use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse;
use App\Entity\Yearproject as Yearproject;
use App\Entity\Yeardomaine as Yeardomaine;
use App\Form\YearprojectType as YearprojectType;
use App\Form\YeardomaineType as YeardomaineType;
class BudgetController extends AbstractController
{
private $knpSnappy;
public function __construct(\Knp\Snappy\Pdf $knpSnappy) { $this->knpSnappy = $knpSnappy; }
public function list($id=null,Request $request)
{
$em = $this->getDoctrine()->getManager();
// Rechercher l'exercice demandé sinon le dernier
if($id)
$n2=$em->getRepository("App:Year")->find($id);
else
$n2=$em->getRepository("App:Year")->findOneBy([],['start'=>'DESC']);
// Rechercher l'exercice précendent à celui selectionné
$n1 = $em
->createQueryBuilder('year')
->select('year')
->from('App:Year','year')
->Where('year.end<:start')
->setParameter('start',$n2->getStart())
->orderBy('year.start','DESC')
->setFirstResult(0)->setMaxResults(1)
->getQuery()->getResult();
if(empty($n1)) $n1=null;
else $n1=$n1[0];
if($n1) {
$startn1=clone $n1->getStart();
$startn1->setTime(0,0,0);
$endn1=clone $n1->getEnd();
$endn1->add(new \DateInterval('P1D'))->setTime(0,0,0);
}
if($n2) {
$startn2=clone $n2->getStart();
$startn2->setTime(0,0,0);
$endn2=clone $n2->getEnd();
$endn2->add(new \DateInterval('P1D'))->setTime(0,0,0);
}
// Pour chaque domaine
$tbdomaines=[];
$domaines = $em->getRepository("App:Domaine")->findBy([],['category'=>'ASC','name'=>'ASC']);
foreach($domaines as $domaine) {
// Filtre par Domaine
if($this->get('session')->get('iddomaine')!="all") {
if($domaine->getId()!=$this->get('session')->get('iddomaine'))
continue;
}
// On calcume le réel validé pour les deux périodes pour les domaines
$tbdomaines[$domaine->getId()]=[
"id" => $domaine->getId(),
"category" => $domaine->getCategory(),
"name" => $domaine->getCategory()." - ".$domaine->getName(),
"nbdayrealn1" => 0,
"nbetprealn1" => 0,
"nbcaarealn1" => 0,
"nbdaybudgn1" => 0,
"nbetpbudgn1" => 0,
"nbcaabudgn1" => 0,
"nbdayrealn2" => 0,
"nbetprealn2" => 0,
"nbcaarealn2" => 0,
"nbdaybudgn2" => 0,
"nbetpbudgn2" => 0,
"nbcaabudgn2" => 0,
"projects" => [],
];
// Période précédente n1
if($n1) {
// Events
$start=clone $n1->getStart();
$start->setTime(0,0,0);
$end=clone $n1->getEnd();
$end->add(new \DateInterval('P1D'))->setTime(0,0,0);
$events = $em
->createQueryBuilder('event')
->select('SUM(event.duration) as somme')
->from('App:Project','project')
->from('App:Task','task')
->from('App:Event','event')
->Where('project.domaine=:domaine')
->andWhere('task.project=project')
->andWhere('event.task=task')
->andWhere('event.start >=:start')
->andWhere('event.end <=:end')
->setParameter('domaine',$domaine)
->setParameter('start',$startn1)
->setParameter('end',$endn1)
->getQuery()->getResult();
$tbdomaines[$domaine->getId()]["nbdayrealn1"]=($events[0]["somme"]?$events[0]["somme"]:0);
$tbdomaines[$domaine->getId()]["nbetprealn1"]=$tbdomaines[$domaine->getId()]["nbdayrealn1"]/$n1->getNbday();
// Yeardomaine
$yeardomaine=$em->getRepository("App:Yeardomaine")->findOneBy(["domaine"=>$domaine,"year"=>$n1]);
if($yeardomaine) {
$tbdomaines[$domaine->getId()]["nbcaarealn1"]=$yeardomaine->getCareal();
$tbdomaines[$domaine->getId()]["nbdaybudgn1"]=$yeardomaine->getNbdaybudget();
$tbdomaines[$domaine->getId()]["nbetpbudgn1"]=$yeardomaine->getNbdaybudget()/$n1->getNbday();
$tbdomaines[$domaine->getId()]["nbcaabudgn1"]=$yeardomaine->getCabudget();
}
}
// Période encour n2
if($n2) {
$events = $em
->createQueryBuilder('event')
->select('SUM(event.duration) as somme')
->from('App:Project','project')
->from('App:Task','task')
->from('App:Event','event')
->Where('project.domaine=:domaine')
->andWhere('task.project=project')
->andWhere('event.task=task')
->andWhere('event.start >=:start')
->andWhere('event.end <=:end')
->setParameter('domaine',$domaine)
->setParameter('start',$startn2)
->setParameter('end',$endn2)
->getQuery()->getResult();
$tbdomaines[$domaine->getId()]["nbdayrealn2"]=($events[0]["somme"]?$events[0]["somme"]:0);
$tbdomaines[$domaine->getId()]["nbetprealn2"]=$tbdomaines[$domaine->getId()]["nbdayrealn2"]/$n2->getNbday();
// Yeardomaine
$yeardomaine=$em->getRepository("App:Yeardomaine")->findOneBy(["domaine"=>$domaine,"year"=>$n2]);
if($yeardomaine) {
$tbdomaines[$domaine->getId()]["nbcaarealn2"]=$yeardomaine->getCareal();
$tbdomaines[$domaine->getId()]["nbdaybudgn2"]=$yeardomaine->getNbdaybudget();
$tbdomaines[$domaine->getId()]["nbetpbudgn2"]=$yeardomaine->getNbdaybudget()/$n2->getNbday();
$tbdomaines[$domaine->getId()]["nbcaabudgn2"]=$yeardomaine->getCabudget();
}
}
// Pour chaque project du domaine
foreach($domaine->getProjects() as $project) {
// On calcume le réel validé pour les deux périodes pour les projects
$tbdomaines[$domaine->getId()]["projects"][$project->getId()]=[
"id" => $project->getId(),
"name" => $project->getCustomer()->getName()." - ".$project->getName(),
"nbdayrealn1" => 0,
"nbetprealn1" => 0,
"nbcaarealn1" => 0,
"nbdaybudgn1" => 0,
"nbetpbudgn1" => 0,
"nbcaabudgn1" => 0,
"nbdayrealn2" => 0,
"nbetprealn2" => 0,
"nbcaarealn2" => 0,
"nbdaybudgn2" => 0,
"nbetpbudgn2" => 0,
"nbcaabudgn2" => 0,
];
// Période précédente n1
if($n1) {
$events = $em
->createQueryBuilder('event')
->select('SUM(event.duration) as somme')
->from('App:Task','task')
->from('App:Event','event')
->Where('task.project=:project')
->andWhere('event.task=task')
->andWhere('event.start >=:start')
->andWhere('event.end <=:end')
->setParameter('project',$project)
->setParameter('start',$startn1)
->setParameter('end',$endn1)
->getQuery()->getResult();
$nbdayrealn1=($events[0]["somme"]?$events[0]["somme"]:0);
$tbdomaines[$domaine->getId()]["projects"][$project->getId()]["nbdayrealn1"]=$nbdayrealn1;
$tbdomaines[$domaine->getId()]["projects"][$project->getId()]["nbetprealn1"]=$nbdayrealn1/$n1->getNbday();
// Yearproject
$yearproject=$em->getRepository("App:Yearproject")->findOneBy(["project"=>$project,"year"=>$n1]);
if($yearproject) {
$tbdomaines[$domaine->getId()]["projects"][$project->getId()]["nbcaarealn1"]=$yearproject->getCareal();
$tbdomaines[$domaine->getId()]["projects"][$project->getId()]["nbdaybudgn1"]=$yearproject->getNbdaybudget();
$tbdomaines[$domaine->getId()]["projects"][$project->getId()]["nbetpbudgn1"]=$yearproject->getNbdaybudget()/$n1->getNbday();
$tbdomaines[$domaine->getId()]["projects"][$project->getId()]["nbcaabudgn1"]=$yearproject->getCabudget();
}
}
// Période encour n2
if($n2) {
$start=$n2->getStart()->setTime(0,0,0);;
$end=$n2->getEnd()->add(new \DateInterval('P1D'))->setTime(0,0,0);
$events = $em
->createQueryBuilder('event')
->select('SUM(event.duration) as somme')
->from('App:Task','task')
->from('App:Event','event')
->andWhere('task.project=:project')
->andWhere('event.task=task')
->andWhere('event.start >=:start')
->andWhere('event.end <=:end')
->setParameter('project',$project)
->setParameter('start',$startn2)
->setParameter('end',$endn2)
->getQuery()->getResult();
$nbdayrealn2=($events[0]["somme"]?$events[0]["somme"]:0);
$tbdomaines[$domaine->getId()]["projects"][$project->getId()]["nbdayrealn2"]=$nbdayrealn2;
$tbdomaines[$domaine->getId()]["projects"][$project->getId()]["nbetprealn2"]=$nbdayrealn2/$n2->getNbday();
// Yearproject
$yearproject=$em->getRepository("App:Yearproject")->findOneBy(["project"=>$project,"year"=>$n2]);
if($yearproject) {
$tbdomaines[$domaine->getId()]["projects"][$project->getId()]["nbcaarealn2"]=$yearproject->getCareal();
$tbdomaines[$domaine->getId()]["projects"][$project->getId()]["nbdaybudgn2"]=$yearproject->getNbdaybudget();
$tbdomaines[$domaine->getId()]["projects"][$project->getId()]["nbetpbudgn2"]=$yearproject->getNbdaybudget()/$n2->getNbday();
$tbdomaines[$domaine->getId()]["projects"][$project->getId()]["nbcaabudgn2"]=$yearproject->getCabudget();
}
}
if(!$project->getActive()&&$nbdayrealn1==0&&$nbdayrealn2==0)
unset($tbdomaines[$domaine->getId()]["projects"][$project->getId()]);
}
}
if($request->query->get('fgprint')) {
$render = $this->renderView('Budget/list.html.twig',[
"useheader" => true,
"usesidebar" => true,
"domaines" => $tbdomaines,
"n1" => $n1,
"n2" => $n2,
"fgprint" => true,
]);
return new PdfResponse(
$this->knpSnappy->getOutputFromHtml($render),
'domaines.pdf'
);
}
else {
return $this->render('Budget/list.html.twig',[
"useheader" => true,
"usesidebar" => true,
"domaines" => $tbdomaines,
"n1" => $n1,
"n2" => $n2,
]);
}
}
public function update($type,$id,$year,Request $request)
{
// Initialisation de l'enregistrement
$em = $this->getDoctrine()->getManager();
// Returnto
$returnto=$request->get("returnto");
// Recherche de l'exercice
$year=$em->getRepository("App:Year")->find($year);
// Recherche de la ligne projet/domaine associée à l'exercice
if($type=="project") {
$project=$em->getRepository("App:Project")->find($id);
$data=$em->getRepository("App:Yearproject")->findOneBy(["year"=>$year,"project"=>$project]);
if(!$data) {
$data=new Yearproject;
$data->setYear($year);
$data->setProject($project);
$em->persist($data);
$em->flush();
}
// Création du formulaire
$form = $this->createForm(YearprojectType::class,$data,array("mode"=>"update"));
}
else {
$domaine=$em->getRepository("App:Domaine")->find($id);
$data=$em->getRepository("App:Yeardomaine")->findOneBy(["year"=>$year,"domaine"=>$domaine]);
if(!$data) {
$data=new Yeardomaine;
$data->setYear($year);
$data->setProject($domaine);
$em->persist($data);
$em->flush();
}
// Création du formulaire
$form = $this->createForm(YeardomaineType::class,$data,array("mode"=>"update"));
}
// Récupération des data du formulaire
$form->handleRequest($request);
// Sur erreur
$this->getErrorForm(null,$form,$request,$data,"update");
// Sur validation
if ($form->get('submit')->isClicked() && $form->isValid()) {
$data = $form->getData();
$em->persist($data);
$em->flush();
// Retour à la liste
if($returnto)
return $this->redirectToRoute("app_budget",["id"=>$returnto]);
else
return $this->redirectToRoute("app_budget",["id"=>$year->getId()]);
}
// Affichage du formulaire
if($request->query->get('fgprint')) {
$render = $this->renderView('Budget/edit.html.twig', [
'useheader' => true,
'usesidebar' => true,
'budget' => $data,
'type' => $type,
'id' => $id,
'year' => $year,
'mode' => 'update',
'form' => $form->createView(),
"fgprint" => true,
"returnto" => $returnto,
]);
return new PdfResponse(
$this->knpSnappy->getOutputFromHtml($render),
'budget.pdf'
);
}
else {
return $this->render('Budget/edit.html.twig', [
'useheader' => true,
'usesidebar' => true,
'budget' => $data,
'type' => $type,
'id' => $id,
'year' => $year,
'mode' => 'update',
'form' => $form->createView(),
"returnto" => $returnto,
]);
}
}
protected function getErrorForm($id,$form,$request,$data,$mode) {
if ($form->get('submit')->isClicked()&&$mode=="delete") {
}
if ($form->get('submit')->isClicked() && $mode=="submit") {
}
if ($form->get('submit')->isClicked() && !$form->isValid()) {
$this->get('session')->getFlashBag()->clear();
$errors = $form->getErrors();
foreach( $errors as $error ) {
$request->getSession()->getFlashBag()->add("error", $error->getMessage());
}
}
}
}