src/Controller/OperationDashboardAction.php line 100

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Component\HttpFoundation\JsonResponse;
  4. use Symfony\Component\HttpFoundation\Request;
  5. use Symfony\Component\Security\Core\Security;
  6. use Doctrine\Persistence\ManagerRegistry;
  7. use App\Entity\Contract;
  8. class OperationDashboardAction
  9. {
  10.     private Security $security;
  11.     private ManagerRegistry $doctrine;
  12.     public function __construct(Security $securityManagerRegistry $doctrine)
  13.     {
  14.         $this->security $security;
  15.         $this->doctrine $doctrine;
  16.     }
  17.     public function __invoke(Request $request): JsonResponse
  18.     {
  19.         $user $this->security->getUser();
  20.         $repository $this->doctrine->getRepository(Contract::class);
  21.         $filters = [
  22.             'broker' => $request->query->get('broker'
  23.                 ? str_replace('/api/users/'''$request->query->get('broker')) 
  24.                 : null,
  25.             'operator' => $request->query->get('operator'
  26.                 ? str_replace('/api/users/'''$request->query->get('operator')) 
  27.                 : null,
  28.             'contractType' => $request->query->get('contractType'),
  29.             'status' => $request->query->get('status'),
  30.         ];
  31.         $query $repository->createQueryBuilder("c")
  32.             ->select('c')
  33.         ;
  34.         $query
  35.             // ->andWhere("(c.status <> 'UNASSIGNED' OR c.contractType = 'COA')")
  36.             ->andWhere("c.status <> 'COMPLETED'")
  37.             ->andWhere("c.liftings IS EMPTY")
  38.         ;
  39.         foreach ($filters as $field => $value) {
  40.             if ($value !== null) {
  41.                 if ($field === 'broker') {
  42.                     $query
  43.                         ->addSelect('b')
  44.                         ->innerJoin('c.broker''b')
  45.                         ->andWhere('b.id = :broker')
  46.                         ->setParameter('broker'$value);
  47.                 } else if ($field === 'broker') {
  48.                     $query
  49.                         ->addSelect('o')
  50.                         ->innerJoin('c.operator''o')
  51.                         ->andWhere('o.id = :operator')
  52.                         ->setParameter('operator'$value);
  53.                 } else {
  54.                     $query
  55.                         ->andWhere("c.$field = :$field")
  56.                         ->setParameter($field$value);
  57.                 }
  58.             }
  59.         }
  60.         $contracts $query
  61.             ->getQuery()
  62.             ->getResult()
  63.         ;
  64.         return new JsonResponse([
  65.             "operations" => array_map(function($contract) {
  66.                 $loadPorts $contract->getPortCalls()->filter(function($portCall) {
  67.                     return $portCall->getPortCallType() === "Load";
  68.                 })->getValues();
  69.                 usort($loadPorts, function($a$b) {
  70.                     return $a->getArrival() <=> $b->getArrival();
  71.                 });
  72.                 $load $loadPorts[0] ?? null;
  73.                 $load2 $loadPorts[1] ?? null;
  74.                 $dischargePorts $contract->getPortCalls()->filter(function($portCall) {
  75.                     return $portCall->getPortCallType() === "Discharge";
  76.                 })->getValues();
  77.                 usort($dischargePorts, function($a$b) {
  78.                     return $b->getArrival() <=> $a->getArrival();
  79.                 });
  80.                 $discharge $dischargePorts[0] ?? null;
  81.                 $discharge2 $dischargePorts[1] ?? null;
  82.                 $laycanStart strtoupper($contract->getLaycanStart()?->format('dMY')) ?: "N/A"
  83.                 $laycanEnd strtoupper($contract->getLaycanEnd()?->format('dMY')) ?: "N/A";
  84.                 return [
  85.                     "id" => $contract->getId(),
  86.                     "type" => $contract->getContractType() ?: "N/A",
  87.                     "vessel" => $contract->getVessel()?->getVesselName() ?: "N/A",
  88.                     "status" => $contract->getStatus() ?: "N/A",
  89.                     "charterer" => $contract->getCharterer()?->getCompanyName() ?: "N/A",
  90.                     "owner" => $contract->getOwner()?->getCompanyName() ?: "N/A",
  91.                     "broker" => $contract->getBroker()?->getName() ?: "N/A",
  92.                     "brokerAvatar" => $contract->getBroker()?->getAvatar()?->getContentUrl(),
  93.                     "operator" => $contract->getOperator()?->getName() ?: "N/A",
  94.                     "operatorAvatar" => $contract->getOperator()?->getAvatar()?->getContentUrl(),
  95.                     "date" => strtoupper((new \DateTime($contract->getContractDate()))?->format('dMY')) ?: "N/A",
  96.                     "contractNumber" => $contract->getContractNumber() ?: "N/A",
  97.                     "laycan" => $laycanStart ' ' $laycanEnd,
  98.                     "loadPort" => $load $load->getPort()?->getPortName() : "N/A",
  99.                     "loadArrival" => $load && $load->getArrival() ? strtoupper($load->getArrival()?->format('dMY')) : "N/A",
  100.                     "loadBerthing" => $load && $load->getBerthing() ? strtoupper($load->getBerthing()?->format('dMY')) : "N/A",
  101.                     "loadDeparture" => $load && $load->getDeparture() ? strtoupper($load->getDeparture()?->format('dMY')) : "N/A",
  102.                     "loadPort2" => $load2 $load2->getPort()?->getPortName() : "N/A",
  103.                     "loadArrival2" => $load2 && $load2->getArrival() ? strtoupper($load2->getArrival()?->format('dMY')) : "N/A",
  104.                     "loadBerthing2" => $load2 && $load2->getBerthing() ? strtoupper($load2->getBerthing()?->format('dMY')) : "N/A",
  105.                     "loadDeparture2" => $load2 && $load2->getDeparture() ? strtoupper($load2->getDeparture()?->format('dMY')) : "N/A",
  106.                     "dischargePort" => $discharge $discharge->getPort()?->getPortName() : "N/A",
  107.                     "dischargeArrival" => $discharge && $discharge->getArrival() ? strtoupper($discharge->getArrival()?->format('dMY')) : "N/A",
  108.                     "dischargeBerthing" => $discharge && $discharge->getBerthing() ? strtoupper($discharge->getBerthing()?->format('dMY')) : "N/A",
  109.                     "dischargeDeparture" => $discharge && $discharge->getDeparture() ? strtoupper($discharge->getDeparture()?->format('dMY')) : "N/A",
  110.                     "dischargePort2" => $discharge2 $discharge2->getPort()?->getPortName() : "N/A",
  111.                     "dischargeArrival2" => $discharge2 && $discharge2->getArrival() ? strtoupper($discharge2->getArrival()?->format('dMY')) : "N/A",
  112.                     "dischargeBerthing2" => $discharge2 && $discharge2->getBerthing() ? strtoupper($discharge2->getBerthing()?->format('dMY')) : "N/A",
  113.                     "dischargeDeparture2" => $discharge2 && $discharge2->getDeparture() ? strtoupper($discharge2->getDeparture()?->format('dMY')) : "N/A",
  114.                     "isLifting" => $contract->getContractCoa() ? true false,
  115.                     "liftings" => $contract->getLiftings()->count() ?: 0,
  116.                 ];
  117.             }, $contracts),
  118.             "filters" => $filters
  119.         ]);
  120.     }
  121. }