mise en place des budgets
This commit is contained in:
387
src/schedule-2.0/src/Controller/BudgetController.php
Executable file
387
src/schedule-2.0/src/Controller/BudgetController.php
Executable 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());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user