src/Admin/ReserveAdmin.php line 21

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Admin;
  4. use App\Entity\Reserve;
  5. use App\Entity\Type\RentStatusType;
  6. use App\Repository\ReserveRepository;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Sonata\AdminBundle\Admin\AbstractAdmin;
  9. use Sonata\AdminBundle\Datagrid\DatagridMapper;
  10. use Sonata\AdminBundle\Datagrid\ListMapper;
  11. use Sonata\AdminBundle\Form\FormMapper;
  12. use Sonata\AdminBundle\Form\Type\ModelType;
  13. use Sonata\AdminBundle\Route\RouteCollection;
  14. use Sonata\AdminBundle\Show\ShowMapper;
  15. use Sonata\Form\Validator\ErrorElement;
  16. use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
  17. final class ReserveAdmin extends AbstractAdmin
  18. {
  19.     private EntityManagerInterface $entityManager;
  20.     protected $datagridValues = [
  21.         '_sort_order' => 'DESC',
  22.         '_sort_by' => 'id'
  23.     ];
  24.     protected function configureDatagridFilters(DatagridMapper $datagridMapper): void
  25.     {
  26.         $datagridMapper
  27.             ->add('id')
  28.             ->add('startDate')
  29.             ->add('endDate')
  30.             ;
  31.     }
  32.     protected function configureListFields(ListMapper $listMapper): void
  33.     {
  34.         $listMapper->add('motorcycle');
  35.         $listMapper->add('client');
  36.         $listMapper->add('startDate'null, ['template' => 'admin/Reserve/list_start_date.html.twig']);
  37.         $listMapper->add('endDate'null, ['template' => 'admin/Reserve/list_end_date.html.twig']);
  38.         $listMapper->add('amount'null, ['template' => 'admin/Reserve/list_amount.html.twig']);
  39.         $listMapper->add('acceptanceCertificate'null, [
  40.             'label' => 'Действия',
  41.             'template' => 'admin/Reserve/list_create_acceptance_certificate.html.twig'
  42.         ]);
  43.     }
  44.     protected function configureFormFields(FormMapper $formMapper): void
  45.     {
  46.         $formMapper->with('Данные резерва', ['class' => 'col-md-6 box-transition']);
  47.         $formMapper->add('motorcycle'ModelType::class, [
  48.             'btn_add' => false,
  49.             'multiple' => false,
  50.             'label' => 'Мотоцикл',
  51.             'error_bubbling' => true
  52.         ]);
  53.         $formMapper->add('startDate'DateTimeType::class, [
  54.             'widget' => 'single_text',
  55.             'required' => false,
  56.             'error_bubbling' => true,
  57.             'label' => 'Дана и время начала аренды',
  58.         ]);
  59.         $formMapper->add('endDate'DateTimeType::class, [
  60.             'widget' => 'single_text',
  61.             'required' => false,
  62.             'error_bubbling' => true,
  63.             'label' => 'Дана и время окончания аренды',
  64.         ]);
  65.         $formMapper->add('amount'null, ['label' => 'Стоимость аренды (BYN)']);
  66.         $formMapper->end();
  67.         $formMapper->with('Клиент', ['class' => 'col-md-6 box-transition']);
  68.         $formMapper->add('client'ModelType::class, [
  69.             'btn_add' => true,
  70.             'multiple' => false,
  71.             'label' => 'Клиент',
  72.         ]);
  73.         $formMapper->add('notes'null, ['label' => 'Заметки']);
  74.         $formMapper->end();
  75.     }
  76.     protected function configureShowFields(ShowMapper $showMapper): void
  77.     {
  78.         $showMapper
  79.             ->add('id')
  80.             ->add('startDate')
  81.             ->add('endDate')
  82.             ;
  83.     }
  84.     /**
  85.      * {@inheritdoc}
  86.      * @param $object Reserve
  87.      */
  88.     public function validate(ErrorElement $errorElement$object) {
  89.         /** @var ReserveRepository $reserveRepository */
  90.         $reserveRepository $this->entityManager->getRepository(Reserve::class);
  91.         $intersections $reserveRepository->reserveList(clone $object->getStartDate(),(clone $object->getEndDate())->modify('- 1 second'), $object->getId(), $object->getMotorcycle());
  92.         if ($intersections->count() > 0) {
  93.             $intersections->map(static function (Reserve $reserve) use (&$errorElement) {
  94.                 $errorElement->with('motorcycle')->addViolation(sprintf('Пересечение: %s - %s (%s)',
  95.                     $reserve->getStartDate()->format('Y-m-d H:i:s'),
  96.                     $reserve->getEndDate()->format('Y-m-d H:i:s'),
  97.                     $reserve->getClient()
  98.                 ))->end();
  99.             });
  100.         }
  101.     }
  102.     /**
  103.      * @param Reserve $object
  104.      */
  105.     public function prePersist($object): void
  106.     {
  107.         $object->setEndDate($object->getEndDate()->modify('- 1 second'));
  108.         $object->setStatus(RentStatusType::APPROVED);
  109.     }
  110.     /**
  111.      * @param Reserve $object
  112.      */
  113.     public function postPersist($object): void
  114.     {
  115.     }
  116.     /**
  117.      * @required
  118.      * @param EntityManagerInterface $entityManager
  119.      */
  120.     public function setEntityManager(EntityManagerInterface $entityManager): void
  121.     {
  122.         $this->entityManager $entityManager;
  123.     }
  124.     protected function configureRoutes(RouteCollection $collection): void
  125.     {
  126.         parent::configureRoutes($collection);
  127.         $collection->add('get_reserve_calendar''get-reserve-calendar');
  128.         $collection->add('create_acceptance_certificate''create-acceptance-certificate');
  129.     }
  130. }