<?php
namespace App\Controller;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Security;
use Doctrine\Persistence\ManagerRegistry;
use App\Entity\Contract;
class OperationDashboardAction
{
private Security $security;
private ManagerRegistry $doctrine;
public function __construct(Security $security, ManagerRegistry $doctrine)
{
$this->security = $security;
$this->doctrine = $doctrine;
}
public function __invoke(Request $request): JsonResponse
{
$user = $this->security->getUser();
$repository = $this->doctrine->getRepository(Contract::class);
$filters = [
'broker' => $request->query->get('broker')
? str_replace('/api/users/', '', $request->query->get('broker'))
: null,
'operator' => $request->query->get('operator')
? str_replace('/api/users/', '', $request->query->get('operator'))
: null,
'contractType' => $request->query->get('contractType'),
'status' => $request->query->get('status'),
];
$query = $repository->createQueryBuilder("c")
->select('c')
;
$query
// ->andWhere("(c.status <> 'UNASSIGNED' OR c.contractType = 'COA')")
->andWhere("c.status <> 'COMPLETED'")
->andWhere("c.liftings IS EMPTY")
;
foreach ($filters as $field => $value) {
if ($value !== null) {
if ($field === 'broker') {
$query
->addSelect('b')
->innerJoin('c.broker', 'b')
->andWhere('b.id = :broker')
->setParameter('broker', $value);
} else if ($field === 'broker') {
$query
->addSelect('o')
->innerJoin('c.operator', 'o')
->andWhere('o.id = :operator')
->setParameter('operator', $value);
} else {
$query
->andWhere("c.$field = :$field")
->setParameter($field, $value);
}
}
}
$contracts = $query
->getQuery()
->getResult()
;
return new JsonResponse([
"operations" => array_map(function($contract) {
$loadPorts = $contract->getPortCalls()->filter(function($portCall) {
return $portCall->getPortCallType() === "Load";
})->getValues();
usort($loadPorts, function($a, $b) {
return $a->getArrival() <=> $b->getArrival();
});
$load = $loadPorts[0] ?? null;
$load2 = $loadPorts[1] ?? null;
$dischargePorts = $contract->getPortCalls()->filter(function($portCall) {
return $portCall->getPortCallType() === "Discharge";
})->getValues();
usort($dischargePorts, function($a, $b) {
return $b->getArrival() <=> $a->getArrival();
});
$discharge = $dischargePorts[0] ?? null;
$discharge2 = $dischargePorts[1] ?? null;
$laycanStart = strtoupper($contract->getLaycanStart()?->format('dMY')) ?: "N/A";
$laycanEnd = strtoupper($contract->getLaycanEnd()?->format('dMY')) ?: "N/A";
return [
"id" => $contract->getId(),
"type" => $contract->getContractType() ?: "N/A",
"vessel" => $contract->getVessel()?->getVesselName() ?: "N/A",
"status" => $contract->getStatus() ?: "N/A",
"charterer" => $contract->getCharterer()?->getCompanyName() ?: "N/A",
"owner" => $contract->getOwner()?->getCompanyName() ?: "N/A",
"broker" => $contract->getBroker()?->getName() ?: "N/A",
"brokerAvatar" => $contract->getBroker()?->getAvatar()?->getContentUrl(),
"operator" => $contract->getOperator()?->getName() ?: "N/A",
"operatorAvatar" => $contract->getOperator()?->getAvatar()?->getContentUrl(),
"date" => strtoupper((new \DateTime($contract->getContractDate()))?->format('dMY')) ?: "N/A",
"contractNumber" => $contract->getContractNumber() ?: "N/A",
"laycan" => $laycanStart . ' ' . $laycanEnd,
"loadPort" => $load ? $load->getPort()?->getPortName() : "N/A",
"loadArrival" => $load && $load->getArrival() ? strtoupper($load->getArrival()?->format('dMY')) : "N/A",
"loadBerthing" => $load && $load->getBerthing() ? strtoupper($load->getBerthing()?->format('dMY')) : "N/A",
"loadDeparture" => $load && $load->getDeparture() ? strtoupper($load->getDeparture()?->format('dMY')) : "N/A",
"loadPort2" => $load2 ? $load2->getPort()?->getPortName() : "N/A",
"loadArrival2" => $load2 && $load2->getArrival() ? strtoupper($load2->getArrival()?->format('dMY')) : "N/A",
"loadBerthing2" => $load2 && $load2->getBerthing() ? strtoupper($load2->getBerthing()?->format('dMY')) : "N/A",
"loadDeparture2" => $load2 && $load2->getDeparture() ? strtoupper($load2->getDeparture()?->format('dMY')) : "N/A",
"dischargePort" => $discharge ? $discharge->getPort()?->getPortName() : "N/A",
"dischargeArrival" => $discharge && $discharge->getArrival() ? strtoupper($discharge->getArrival()?->format('dMY')) : "N/A",
"dischargeBerthing" => $discharge && $discharge->getBerthing() ? strtoupper($discharge->getBerthing()?->format('dMY')) : "N/A",
"dischargeDeparture" => $discharge && $discharge->getDeparture() ? strtoupper($discharge->getDeparture()?->format('dMY')) : "N/A",
"dischargePort2" => $discharge2 ? $discharge2->getPort()?->getPortName() : "N/A",
"dischargeArrival2" => $discharge2 && $discharge2->getArrival() ? strtoupper($discharge2->getArrival()?->format('dMY')) : "N/A",
"dischargeBerthing2" => $discharge2 && $discharge2->getBerthing() ? strtoupper($discharge2->getBerthing()?->format('dMY')) : "N/A",
"dischargeDeparture2" => $discharge2 && $discharge2->getDeparture() ? strtoupper($discharge2->getDeparture()?->format('dMY')) : "N/A",
"isLifting" => $contract->getContractCoa() ? true : false,
"liftings" => $contract->getLiftings()->count() ?: 0,
];
}, $contracts),
"filters" => $filters
]);
}
}