<?php
namespace AdminBundle\Admin\Vehicles;
use AdminBundle\Admin\BaseAdmin;
use CoreBundle\Entity\Vehicles\Equipment;
use CoreBundle\Entity\Vehicles\Specification;
use CoreBundle\Entity\Vehicles\Variation;
use CoreBundle\Entity\Vehicles\VehicleItem;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Form\Type\ModelType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Doctrine\ORM\Query\Expr\Join;
class VehicleItemAdmin extends BaseAdmin
{
protected function configureDatagridFilters(DatagridMapper $datagridMapper): void
{
$datagridMapper
->add('vehicle.id', null, ['label' => 'id основної машинки'])
->add('vehicle.vin', null, ['label' => 'ВІН'])
->add('vehicle.url', null, ['label' => 'SEO url']);
}
/**
* @param ListMapper $listMapper
*/
protected function configureListFields(ListMapper $listMapper): void
{
$listMapper
->addIdentifier('id')
->add('vehicle.model', null, ['label' => 'Підв\'язано до моделі',])
->add('vehicle.model.brand', null, ['label' => 'Підв\'язано до бренда',])
->add('vehicle.vin', null, ['label' => 'Він машинки',])
->add('vehicle.id', null, ['label' => 'ID машинки',])
->add('creator', null, ['label' => 'Створено адміном'])
->add('price', null, ['label' => 'Ціна'])
->add('sold', 'boolean', ['label' => 'Продана?'])
->add('_action', 'actions', [
'actions' => [
'edit' => [],
]
]);
}
/**
* @param FormMapper $formMapper
* @return false|void
*/
protected function configureFormFields(FormMapper $formMapper): void
{
$User = $this->getUser();
if (!$Dealer = $User->getDealer()) {
throw new AccessDeniedException('User without dealer');
}
/** @var BaseVehicleAdmin $rootAdmin */
$rootAdmin = $this->getRoot();
/** @var VehicleItem|null $parent */
$parent = $this->getRoot()->getSubject();
if (!$parent || !$parent->getId()) {
return;
}
/** @var VehicleItem $parent */
$hasRentPrice = false;
$hasPreOrderPrice = false;
$priceParams = $this->parameterBag->get('price-config');
if (isset($priceParams[$Dealer->getUniqueId()])) {
$hasPreOrderPrice =
isset($priceParams[$Dealer->getUniqueId()]['has-preorder-price']) &&
$priceParams[$Dealer->getUniqueId()]['has-preorder-price'];
$hasRentPrice =
isset($priceParams[$Dealer->getUniqueId()]['has-rent-price']) &&
$priceParams[$Dealer->getUniqueId()]['has-rent-price'];
}
$queryBuilderEquipment = $this->getModelManager()
->getEntityManager(Equipment::class)
->createQueryBuilder('e')
->select('e')
->from(Equipment::class, 'e')
->join('e.vehicle', 'v', Join::WITH, 'v.id = :id')
->setParameter('id', $parent->getId());
$queryBuilderVariation = $this->getModelManager()
->getEntityManager(Variation::class)
->createQueryBuilder('v')
->select('v')
->from(Variation::class, 'v')
->join('v.vehicle', 'veh', Join::WITH, 'veh.id = :id')
->andWhere('v.state = 1')
->setParameter('id', $parent->getId());
$queryBuilderSpecification = $this->getModelManager()
->getEntityManager(Specification::class)
->createQueryBuilder('s')
->select('s')
->from(Specification::class, 's')
->join('s.vehicle', 'veh', Join::WITH, 'veh.id = :id')
->setParameter('id', $parent->getId());
$specCount = count($queryBuilderSpecification->getQuery()->getResult());
$formMapper
->add(
'equipment',
ModelType::class,
[
'label' => 'Комплектація',
'required' => true,
'query' => $queryBuilderEquipment,
'btn_add' => false,
'empty_data' => null,
'property' => 'adminName',
]
)
->add(
'variation',
ModelType::class,
[
'label' => 'Варіація',
'query' => $queryBuilderVariation,
'btn_add' => false,
'required' => true,
'empty_data' => null,
],
[
'admin_code' => $rootAdmin->getVariationAdminCode(),
]
);
if ($specCount) {
$formMapper->add(
'specification',
ModelType::class,
[
'label' => 'Специфікація',
'query' => $queryBuilderSpecification,
'btn_add' => false,
'required' => false,
'empty_data' => null,
'attr' => [
'style' => 'width:150px'
]
],
[
'admin_code' => 'admin.vehicles.specification',
]
);
}
$formMapper
->add('state', CheckboxType::class, ['label' => 'Активна', 'required' => false])
->add('specify_price', CheckboxType::class, ['label' => 'Уточнить цену', 'required' => false])
->add('year', NumberType::class, ['label' => 'Год выпуска', 'required' => true])
->add('price', NumberType::class, ['label' => 'Цена', 'required' => true])
->add('alt_price', NumberType::class, ['label' => 'Акционная цена, грн'])
->add('alt_usd_price', NumberType::class, ['label' => 'Акционная цена, $'])
->add('alt_rate', NumberType::class, ['label' => 'Акционный курс']);
if ($hasPreOrderPrice) {
$formMapper->add('preorder_price', NumberType::class, ['label' => 'Цена предзаказа']);
}
if ($hasRentPrice) {
$formMapper->add('rent_price', NumberType::class, ['label' => 'Цена аренды', 'required' => true]);
}
return;
}
protected function getVariationAdminCode(): string
{
return 'admin.vehicles.passenger_variation';
}
protected function getVehicleAdminCode(): string
{
return 'admin.vehicles.passenger_vehicle';
}
}