<?php
namespace App\Repository;
use App\Entity\Action;
use App\Entity\ActionPlan;
use App\Entity\Configuration\CompanyEntity;
use App\Entity\User;
use App\Enum\PriorityEnum;
use App\Enum\StatusEnum;
use App\Service\SelectedEntityService;
use DateTime;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
use DoctrineExtensions\Query\Mysql\Month;
use App\Utils\Utility;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Security\Core\Security;
/**
* @method Company|null find($id, $lockMode = null, $lockVersion = null)
* @method Company|null findOneBy(array $criteria, array $orderBy = null)
* @method Company[] findAll()
* @method Company[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class ActionRepository extends ServiceEntityRepository
{
private $requestStack;
private $security;
private $selectedEntityService;
public function __construct(
ManagerRegistry $registry,
Security $security,
RequestStack $requestStack,
SelectedEntityService $selectedEntityService
)
{
parent::__construct($registry, Action::class);
$this->security = $security;
$this->requestStack = $requestStack;
$this->selectedEntityService = $selectedEntityService;
}
/*public function findLastActionEE(): ?Action
{
return $this->createQueryBuilder('a')
->where('a.action IS NOT NULL')
->orderBy('a.id', 'desc')
->getQuery()
->getOneOrNullResult();
}*/
public function getActionsPeridoques()
{
return $this->createQueryBuilder('a')
->where('a.periodicity IS NOT NULL')
->andWhere('a.action IS NOT 1')
->getQuery()
->getOneOrNullResult();
}
public function findLastRef($prefix)
{
$qb= $this->createQueryBuilder('a');
$qb->select('MAX(a.ref)')
->where(
$qb->expr()->like('a.ref', ':prefix')
)
->setParameter('prefix', $prefix.'-%');
$ref=$qb->getQuery()->getOneOrNullResult();
return $ref[1];
}
public function transform(Action $action,User $user, $remove_link='')
{
$respectBudget ="OK";
if($action->getBudgetEstimated()<$action->getBudgetReal()) $respectBudget ="NOK";
$respectDuree = "OK";
if($action->getDurationEstimated()<$action->getDurationReal()) $respectDuree ="NOK";
$respectDelais = "OK";
$joursRetard="0";
$now = new DateTime("now");
if($action->getDateEndEstimated()<$action->getDateEndReal())
{
$respectDelais ="NOK";
$joursRetard = $action->getDateEndEstimated()->diff($action->getDateEndReal())->format("%a");
}
elseif($action->getDateEndEstimated() < $now)
{
$respectDelais ="NOK";
$joursRetard = $action->getDateEndEstimated()->diff($now)->format("%a");
}
if(in_array($action->getStatus(),[StatusEnum::STATUS_PLANNED,StatusEnum::STATUS_DRAFT,StatusEnum::STATUS_IN_PROGRESS]))
{
$respectBudget="";
$respectDuree="";
$respectDelais="";
}
if(is_null($action->getBudgetEstimated()) || is_null($action->getBudgetReal()))
{
$respectBudget="";
}
if(is_null($action->getDurationEstimated()) || is_null($action->getDurationReal()))
{
$respectDuree="";
}
$editable="0";
//if(in_array($user,[$action->getResponsible(),$action->getCreatedBy()]) ) $editable="1";
if($user==$action->getResponsible() ) $editable="1";
$actionIsEE="0";
if($action->getTypeAction()=="AE/AI") $actionIsEE="1";
$delete_btn="";
$annuler_btn="";
if($action->getCreatedBy()==$user)
{
$urlDelete= "/action/delete/".$action->getId();
$delete_btn= "<div class='type_p'>
<button class='btn bg-delete'
onclick='open_delete_dialog_without_from(\"".$urlDelete."\",\"".$action->getRef()."\" )'
onmouseover='showToolTip(\"Supprimer l'action\",\"span_delete_".$action->getId()."\")'
onmouseout='hideToolTip(\"span_delete_".$action->getId()."\")'
>
<i class='fa fa-trash-o'></i>
</button>
<span class='span_tootltip span_priority' style='left:-80px' id='span_delete_".$action->getId()."'></span>
</div> ";
if($action->getStatus() === StatusEnum::STATUS_ANNULE) {
$urlAnnuler="/action/activate/".$action->getId();
$annuler_btn="<div class='type_p'>
<a class='btn bg-activate'
data-toggle='modal' data-target='#myModal'
href='/action/activate/".$action->getId()."'
onmouseover='showToolTip(\"Réactiver l'action\",\"span_cancel_".$action->getId()."\")'
onmouseout='hideToolTip(\"span_cancel_".$action->getId()."\")'
>
<i class='fa fa-check'></i>
</a>
<span class='span_tootltip span_priority' style='left:-60px' id='span_cancel_".$action->getId()."'></span>
</div>";
}else {
$urlAnnuler="/action/annuler/".$action->getId();
$annuler_btn="<div class='type_p'>
<button class='btn bg-annuler'
onclick='open_annuler_dialog_without_from(\"".$urlAnnuler."\",\"".$action->getRef()."\" )'
onmouseover='showToolTip(\"Annuler l'action\",\"span_cancel_".$action->getId()."\")'
onmouseout='hideToolTip(\"span_cancel_".$action->getId()."\")'
>
<i class='fa fa-times'></i>
</button>
<span class='span_tootltip span_priority' style='left:-60px' id='span_cancel_".$action->getId()."'></span>
</div>";
}
}
//validation
$validation='';
if(!empty($action->getValidator()) && $action->getStatus()==StatusEnum::STATUS_PLANNED)
{
if($action->getValidator()==$user)
{
$validation="<a class='btn btn-xs btn-danger pull-right' style='margin-left:5px' href='/action/".$action->getId()."/validation'>Valider cette action</a> ";
}
}
$ftlrActionTypePlanInd="1";
if(!empty($action->getActionPlan()))
{
$ftlrActionTypePlanInd="0";
}
$ftlrProcessus=[];
$list_processus='';
foreach($action->getProcessus() as $proc)
{
$ftlrProcessus[]=$proc->getTitle();
$list_processus.="<span class='badge bg-color-darken'>".$proc->getTitle()."</span>";
}
$durationEstimated = strval($action->getDurationEstimated());
$budgetEstimated="<span class='badge bg-color-darken'>".$action->getBudgetEstimated()." €</span>";
$img_file="";
$pdf = '';
if($action->getPdfFile()) {
$pdf = strval($action->getId());
$extension_array = explode('.', $action->getPdfFile());
$extension = strtolower($extension_array[1]);
if($extension === 'png' || $extension === 'jpg') {
$img_file='/img/icons/img.png';
}else if($extension==='doc' || $extension==='docx') {
$img_file='/img/icons/doc.png';
}else if($extension==='ppt') {
$img_file='/img/icons/ppt.png';
}else if (str_contains($extension,'xl')) {
$img_file='/img/icons/xl.png';
}else {
$img_file='/img/icons/txt.png';
}
} else {
$pdf = "";
}
$ftlrDomaine=[];
if(!empty($action->getDomaines()))
{
foreach($action->getDomaines() as $domain)
{
$ftlrDomaine[]=$domain->getTitle();
}
}
$ftlrSource='';
if($action->getSource()) $ftlrSource = $action->getSource()->getId();
// if($action->getCreatedBy()->getEntity()) $entity = $action->getCreatedBy()->getEntity()->getNom();
$entity = "";
foreach($action->getCompanyEntities() as $ce)
{
$entity.="<span class='badge bg-color-darken' style='margin-right: 5px'>".$ce->getNom()."</span>";
}
$ref="";
if($remove_link) {
$ref= $action->getRef();
}else {
$ref="<a href='/action/".$action->getId()."/edit' class='ref'>".$action->getRef()."</a>";
}
$comment_color = "#CEDCEF";
if($action->hasComment()) $comment_color = "#3466A8";
$comment = "<a href='/action/".$action->getId()."/comment' data-toggle='modal' data-target='#myModal' style='color:".$comment_color."' id='action_comment_".$action->getId()."'><i class='fa fa-comments' style='font-size:20px'></i></a>";
return [
"ftlrDomaine" => $ftlrDomaine,
"ftlrType" => $action->getType()->getId(),
"ftlrCategorie" => $action->getCategory(),
"ftlrSource" => $ftlrSource,
"ftlrProcessus" =>$ftlrProcessus,
"ftlrEnCharge" => $action->getResponsible()->getId(),
"responsibleName" => $action->getResponsible()->getFullName(),
"ftlrActionTypePlanInd" => $ftlrActionTypePlanInd,
"ftlrActionHasEfficacite" => strval($action->hasActionEE()),
"ftlrActionEfficacite" => "0",
"ftlrTypePa" => strval($action->getTypePa()),
"DT_RowId"=> $action->getId(),
"ref" => $ref,
"priorite" => $action->getPriority(),
"dateDebut" => $action->getDateStartReal(true),
"avancement" => $action->getProgress()."%",
"datefin" => $action->getDateEndReal(true),
"duree" => strval($action->getDurationReal()),
"cout" => strval($action->getBudgetReal()),
"respectBudget" => $respectBudget,
"statut" => $action->getStatus(),
"respectDuree" => $respectDuree,
"respectDelais" => $respectDelais,
"joursRetard" => '<span class="chiffre">'.$joursRetard.'</span>',
"nbrReport" =>'<span class="chiffre">'. $action->getReportNbr().'</span>',
"efficacite" => strval($action->getEfficient()),
"dateEnregistrement" => $action->getCreatedAt()->format('d/m/Y'),
"resume" => '<span class="border-text">'.$action->getTitle().'</span>',
"desc" => strval($action->getDescription()),
"commentaires" => "",
"periodePrevisionelle" => $action->getDateEndEstimated(true),
"dureeEstimee" => strval($durationEstimated),
"budgetPrevisionel" => strval($budgetEstimated),
"rapport" => $pdf,
"img_file"=>$img_file,
"action" => $delete_btn,
"actionAnnuler" => $annuler_btn,
"editable"=>$editable,
"actionIsEE"=>$actionIsEE,
"validation"=> $validation,
"list_processus"=>$list_processus,
"affectedBy"=>$action->getCreatedBy()->getFullName()." / ".$action->getCreatedBy()->getFonction(),
"entity"=> $entity,
"periodicity"=>$action->getPeriodicity() ? $action->getPeriodicity():'',
"comment"=>$comment
];
}
public function transformAll(User $user,$actionPlan='',$remove_link='',$startDate='',$endDate='')
{
$actions = $this->findActions($actionPlan,true,$startDate,$endDate);
//dd($actions);
$actionsArray = ['data' => []];
$actionsList=[];
foreach ($actions as $action)
{
$actionsList[]=$action;
if($action->hasActionEE())
{
$actionsList[]=$action->getAction();
}
}
foreach ($actionsList as $action)
{
$actionsArray['data'][] = $this->transform($action,$user, $remove_link);
}
return $actionsArray;
}
public function findNbrAction(
$processus ='',
$actionPlan='',
$status='',
$lateCondition="",
$priority='',
$budgetCondition='',
$month='',
$cumultative=true,
$source='',
$type='',
$min_progress='',
$max_progress='',
$has_started='',
$durationCondition=''
)
{
$qb = $this->createQueryBuilder('a')->select('COUNT(a.id)');
if(!empty($processus))
{
if($processus->getId() > 0)
{
$qb ->where(':processus MEMBER OF a.processus')
->setParameter("processus", $processus);
}
}
if(!empty($actionPlan))
{
if($actionPlan=="include")
{
$qb ->andWhere('a.actionPlan is NULL');
}
elseif($actionPlan=="not_include")
{
$qb ->andWhere('a.actionPlan is NOT NULL');
}
elseif($actionPlan->getId()>0)
{
$qb ->andWhere('a.actionPlan = :actionPlan')
->setParameter('actionPlan', $actionPlan);
}
}
if(!empty($status))
{
$qb ->andWhere('a.status = :status')
->setParameter('status', $status);
}
if(!empty($lateCondition))
{
$condition = '';
if($lateCondition=='late')
{
$condition = 'a.dateEndEstimated < a.dateEndReal';
if($status != StatusEnum::STATUS_CLOSED)
{
$condition = 'a.dateEndEstimated < NOW()';
}
}
else
{
$condition = 'a.dateEndEstimated >= a.dateEndReal';
if($status != StatusEnum::STATUS_CLOSED)
{
$condition = 'a.dateEndEstimated >= NOW()';
}
}
$qb ->andWhere($condition);
}
if(!empty($priority))
{
$qb ->andWhere('a.priority = :priority')
->setParameter('priority', $priority);
}
if(!empty($budgetCondition))
{
if($budgetCondition=='over')
{
$qb ->andWhere('a.budgetEstimated < a.budgetReal');
}
else
{
$qb ->andWhere('a.budgetEstimated >= a.budgetReal');
}
}
if($month > 0)
{
$month_condition = 'MONTH(a.createdAt) = :month ';
if($cumultative)
{
$month_condition = 'MONTH(a.createdAt) <= :month ';
}
$qb ->andWhere($month_condition)
->setParameter('month', $month);
}
if(!empty($source))
{
$qb ->andWhere('a.source = :source')
->setParameter('source', $source);
}
if(!empty($type))
{
$qb ->andWhere('a.type = :type')
->setParameter('type', $type);
}
if($max_progress > 0)
{
$qb ->andWhere('a.progress >= :min_progress')
->andWhere('a.progress < :max_progress')
->setParameter('min_progress', $min_progress)
->setParameter('max_progress', $max_progress);
}
if(!empty($has_started))
{
$condition = '';
if($has_started=='no')
{
$condition = 'a.dateStartEstimated < NOW()';
}
else
{
$condition = 'a.dateStartEstimated < NOW()';
}
$qb ->andWhere($condition);
}
if(!empty($durationCondition))
{
$condition = '';
if($durationCondition=='over')
{
$condition = 'a.durationEstimated < a.durationReal';
}
else
{
$condition = 'a.durationEstimated >= a.durationReal';
}
$qb ->andWhere($condition);
}
//draft
/*
$qb ->andWhere("a.status <> :draftstatus")
->setParameter('draftstatus', StatusEnum::STATUS_DRAFT);*/
//$qb ->andWhere("a.validated = 1");
//dump($qb->getQuery()->getSQL());
$nbrActions=$qb->getQuery()->getOneOrNullResult();
return $nbrActions[1];
}
public function findSumNbrReport($processus ='',$actionPlan='')
{
$qb = $this->createQueryBuilder('a')->select('SUM(a.reportNbr)');
if(!empty($processus))
{
if($processus->getId() > 0)
{
$qb ->where(':processus MEMBER OF a.processus')
->setParameter("processus", $processus);
}
}
if(!empty($actionPlan))
{
if($actionPlan->getId()>0)
{
$qb ->andWhere('a.actionPlan = :actionPlan')
->setParameter('actionPlan', $actionPlan);
}
}
//draft
// $qb ->andWhere("a.status <> :draftstatus")
// ->setParameter('draftstatus', StatusEnum::STATUS_DRAFT);
$nbrReport = $qb->getQuery()->getOneOrNullResult();
return $nbrReport[1];
}
public function findByCustom($actionPlan='',$status='',$priority='',$lateCondition='',$limit=0)
{
$qb = $this->createQueryBuilder('a');
if(!empty($actionPlan))
{
if($actionPlan->getId() > 0)
{
$qb ->where('a.actionPlan = :actionPlan')
->setParameter("actionPlan", $actionPlan);
}
}
if(!empty($status))
{
$qb ->andWhere('a.status = :status')
->setParameter('status', $status);
}
if(!empty($priority))
{
$qb ->andWhere('a.priority = :priority')
->setParameter('priority', $priority);
}
if(!empty($lateCondition))
{
$condition = '';
if($lateCondition=='late')
{
$condition = 'a.dateEndEstimated < a.dateEndReal';
if($status != StatusEnum::STATUS_CLOSED)
{
$condition = 'a.dateEndEstimated < NOW()';
}
}
else
{
$condition = 'a.dateEndEstimated >= a.dateEndReal';
if($status != StatusEnum::STATUS_CLOSED)
{
$condition = 'a.dateEndEstimated >= NOW()';
}
}
$qb ->andWhere($condition);
}
//draft
// $qb ->andWhere("a.status <> :draftstatus")
// ->setParameter('draftstatus', StatusEnum::STATUS_DRAFT);
if($limit> 0)
{
$qb->setMaxResults($limit);
}
$qb->orderBy('a.createdAt', 'DESC');
//dump($qb->getQuery()->getSQL());
return $qb->getQuery()->getResult();
}
public function findActions($actionPlan='',$withoutAcEE=true,$startDate='',$endDate='')
{
$qb = $this->createQueryBuilder('a');
if(!empty($actionPlan))
{
if($actionPlan->getId() > 0)
{
$qb ->where('a.actionPlan = :actionPlan')
->setParameter("actionPlan", $actionPlan);
}
}
if($withoutAcEE)
{
$qb ->andWhere('a.typeAction != :typeAction')
->setParameter("typeAction", 'AE/AI');
}
if($startDate) {
$qb->andWhere('a.dateEndEstimated >= :startDate ')
->setParameter("startDate", $startDate);
}
if($endDate) {
$qb->andWhere('a.dateEndEstimated < :endDate ')
->setParameter("endDate", $endDate);
}
//filtrage par entité
$selectedEntity = $this->selectedEntityService->getSelectedEntity();
if ($selectedEntity) {
$qb->join('a.companyEntities', 'ce')
->andWhere(':entity MEMBER OF a.companyEntities')
->setParameter('entity', $selectedEntity);
} else {
$user = $this->security->getUser();
$entities = $user->getEntities();
if (count($entities) > 0) {
$qb->join('a.companyEntities', 'ce2')
->andWhere('ce2 IN (:entities)')
->setParameter('entities', $entities);
}
}
$qb->orderBy('a.createdAt', 'DESC');
return $qb->getQuery()->getResult();
}
}