<?php
namespace App\Controller\ViewOrder;
use App\Transformer\FQCNToShortNameTransformer;
use App\V4\Form\FormFieldExtractor;
use App\ViewOrders\Builder\ViewOrdersBuilder;
use App\ViewOrders\Builder\ViewOrdersBuilderInterface;
use App\ViewOrders\Model\ViewOrder;
use Symfony\Component\HttpFoundation\Request;
class GetViewOrdersFieldsAction
{
/**
* @var ViewOrdersBuilder
*/
private $viewOrdersBuilder;
/**
* @var FormFieldExtractor
*/
private $formFieldExtractor;
/**
* @param ViewOrdersBuilder $viewOrdersBuilder
* @param FormFieldExtractor $formFieldExtractor
*/
public function __construct(ViewOrdersBuilder $viewOrdersBuilder, FormFieldExtractor $formFieldExtractor)
{
$this->viewOrdersBuilder = $viewOrdersBuilder;
$this->formFieldExtractor = $formFieldExtractor;
}
/**
* @param Request $request
* @param string $entityShortName
*
* @return array
*/
public function __invoke(Request $request, string $entityShortName): array
{
$tabId = $request->query->get('tabId');
if ('null' === $tabId) {
$tabId = null;
}
$entityFQCN = (new FQCNToShortNameTransformer())->reverseTransform($entityShortName);
// @todo refacto : a supprimer lorsque la cohabitation ancien/nouveau prospect sera terminée
$entityFQCN = 'App\Model\Prospect\Prospect' === $entityFQCN ? 'App\V4\Model\Prospect\Prospect' : $entityFQCN;
$entityFQCN = 'App\Model\Contact\Contact' === $entityFQCN ? 'App\V4\Model\Contact\Contact' : $entityFQCN;
$entityFQCN = 'App\Model\Task\Task' === $entityFQCN ? 'App\V4\Model\Task\Task' : $entityFQCN;
$entityFQCN = 'App\Model\Quote\Quote' === $entityFQCN ? 'App\V4\Model\Quote\Quote' : $entityFQCN;
$entityFQCN = 'App\Model\Quote\MailType' === $entityFQCN ? 'App\V4\Model\Quote\MailType' : $entityFQCN;
$entityFQCN = null === $entityFQCN && 'mail-type' === $entityShortName ? 'App\V4\Model\MailType\MailType' : $entityFQCN;
$viewOrders = $this->viewOrdersBuilder->getViewOrder($entityFQCN, ViewOrdersBuilderInterface::VIEW_ORDER_TYPE_LIST, $tabId);
$fields = $this->getFields($entityFQCN, $viewOrders);
usort($fields, function ($a, $b) {
return $a['metadata']['order'] <=> $b['metadata']['order'];
});
return ['fields' => $fields];
}
/**
* @param string $entityFQCN
* @param ViewOrder $viewOrders
*
* @return array
*/
private function getFields(string $entityFQCN, ViewOrder $viewOrders): array
{
$allFields = $this->formFieldExtractor->getAllFormFieldNamesFromEntity($entityFQCN);
$fields = [];
foreach ($allFields as $fieldKey => $fieldValue) {
$isDisplayed = false;
$order = PHP_INT_MAX;
foreach ($viewOrders->getGroups()[0]->getItems() as $voItem) {
$voKey = $voItem->getKey();
$voKey = str_replace(['specificFields_', 'specificFields.'], 'sf_', $voKey);
if ($voKey === $fieldKey) {
$isDisplayed = true;
$order = $voItem->getOrder();
break;
}
}
$fields[] = [
'key' => $fieldKey,
'label' => $fieldValue->getConfig()->getOption('label') ?? $fieldValue->getName(),
'metadata' => [
'isDisplayed' => $isDisplayed,
'order' => $order,
],
];
}
return $fields;
}
}