<?php
declare(strict_types=1);
namespace App\Admin;
use App\Entity\Motorcycle;
use App\Entity\SparePart;
use App\Repository\SparePartRepository;
use Doctrine\ORM\EntityManagerInterface;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Form\Type\ModelType;
use Sonata\AdminBundle\Show\ShowMapper;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
final class SparePartAdmin extends AbstractAdmin
{
private ?EntityManagerInterface $entityManager = null;
protected $datagridValues = [
'_sort_order' => 'DESC',
'_sort_by' => 'id',
];
public function configure(): void
{
// Pink row when quantity is 0
$this->setTemplate('outer_list_rows_list', 'admin/SparePart/list_outer_rows_list.html.twig');
}
protected function configureDatagridFilters(DatagridMapper $datagridMapper): void
{
$datagridMapper
->add('name', null, ['label' => 'Название'])
->add('partNumber', null, ['label' => 'Номер детали'])
->add('motorcycles', null, ['label' => 'Мотоциклы'])
->add('quantity', null, ['label' => 'Количество'])
->add('cost', null, ['label' => 'Стоимость'])
;
}
protected function configureListFields(ListMapper $listMapper): void
{
$listMapper
->add('name', null, ['label' => 'Название'])
->add('partNumber', null, ['label' => 'Номер детали'])
->add('motorcycles', null, ['label' => 'Мотоциклы'])
->add('quantity', null, ['label' => 'Количество'])
->add('cost', null, ['label' => 'Стоимость'])
->add('createdAt', null, ['label' => 'Добавлено'])
->add('_action', null, [
'actions' => [
'show' => [],
'edit' => [],
'delete' => [],
],
])
;
}
protected function configureFormFields(FormMapper $formMapper): void
{
$formMapper
->add('name', TextType::class, [
'required' => true,
'label' => 'Название',
])
->add('partNumber', TextType::class, [
'required' => false,
'label' => 'Номер детали',
])
->add('motorcycles', ModelType::class, [
'class' => Motorcycle::class,
'required' => false,
'multiple' => true,
'btn_add' => false,
'label' => 'Мотоциклы',
'help' => 'Необязательно. Можно оставить пустым, если неизвестно, к какому мотоциклу относится запчасть.',
])
->add('quantity', IntegerType::class, [
'required' => true,
'label' => 'Количество',
'attr' => ['min' => 0],
'help' => 'Если запчасть с такими же полями уже есть — количество будет добавлено к существующей записи.',
])
->add('cost', NumberType::class, [
'required' => false,
'label' => 'Стоимость',
'scale' => 2,
])
;
}
protected function configureShowFields(ShowMapper $showMapper): void
{
$showMapper
->add('id')
->add('name', null, ['label' => 'Название'])
->add('partNumber', null, ['label' => 'Номер детали'])
->add('motorcycles', null, ['label' => 'Мотоциклы'])
->add('quantity', null, ['label' => 'Количество'])
->add('cost', null, ['label' => 'Стоимость'])
->add('createdAt', null, ['label' => 'Добавлено'])
;
}
/**
* If a twin already exists (same name, part number, cost, motorcycles),
* increase its quantity instead of creating a duplicate row.
*
* @param SparePart $object
*
* @return SparePart
*/
public function create($object)
{
if ($this->entityManager) {
/** @var SparePartRepository $repo */
$repo = $this->entityManager->getRepository(SparePart::class);
$twin = $repo->findTwin($object);
if ($twin !== null) {
$addQty = max(0, $object->getQuantity());
$twin->setQuantity($twin->getQuantity() + $addQty);
$this->getModelManager()->update($twin);
$this->postPersist($twin);
foreach ($this->getExtensions() as $extension) {
$extension->postPersist($this, $twin);
}
return $twin;
}
}
$object->setName(trim($object->getName()));
return parent::create($object);
}
/**
* @required
*/
public function setEntityManager(EntityManagerInterface $entityManager): void
{
$this->entityManager = $entityManager;
}
}