400 lines
17 KiB
PHP
Executable File
400 lines
17 KiB
PHP
Executable File
<?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 de l'ensemble des exercices sauf du premier
|
|
$years = $em
|
|
->createQueryBuilder('year')
|
|
->select('year')
|
|
->from('App:Year','year')
|
|
->orderBy('year.start')
|
|
->setFirstResult(1)
|
|
->getQuery()->getResult();
|
|
|
|
// 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,
|
|
"years" => $years,
|
|
"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,
|
|
"years" => $years,
|
|
]);
|
|
}
|
|
}
|
|
|
|
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->setDomaine($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());
|
|
}
|
|
}
|
|
}
|
|
}
|