src/Admin/ReserveApprovedAdmin.php line 22

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 Doctrine\ORM\QueryBuilder;
  9. use Sonata\AdminBundle\Admin\AbstractAdmin;
  10. use Sonata\AdminBundle\Datagrid\DatagridMapper;
  11. use Sonata\AdminBundle\Datagrid\ListMapper;
  12. use Sonata\AdminBundle\Form\FormMapper;
  13. use Sonata\AdminBundle\Form\Type\ModelType;
  14. use Sonata\AdminBundle\Route\RouteCollection;
  15. use Sonata\AdminBundle\Show\ShowMapper;
  16. use Sonata\Form\Validator\ErrorElement;
  17. use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
  18. final class ReserveApprovedAdmin extends AbstractReserveAdmin
  19. {
  20.     private EntityManagerInterface $entityManager;
  21.     public function createQuery($context 'list')
  22.     {
  23.         /** @var QueryBuilder $query */
  24.         $query parent::createQuery();
  25.         $alias $query->getRootAliases()[0];
  26.         $query->andWhere($alias .'.status = :statue');
  27.         $query->setParameter('statue'RentStatusType::APPROVED);
  28.         return $query;
  29.     }
  30.     protected $datagridValues = [
  31.         '_sort_order' => 'DESC',
  32.         '_sort_by' => 'id'
  33.     ];
  34.     protected function configureDatagridFilters(DatagridMapper $datagridMapper): void
  35.     {
  36.         $datagridMapper
  37.             ->add('id')
  38.             ->add('startDate')
  39.             ->add('endDate')
  40.             ;
  41.     }
  42.     protected function configureListFields(ListMapper $listMapper): void
  43.     {
  44.         $listMapper->add('motorcycle'null, ['template' => 'admin/Reserve/list_motorcycle.html.twig']);
  45.         $listMapper->add('client');
  46.         $listMapper->add('startDate'null, ['template' => 'admin/Reserve/list_start_date.html.twig']);
  47.         $listMapper->add('endDate'null, ['template' => 'admin/Reserve/list_end_date.html.twig']);
  48.         $listMapper->add('amount'null, ['template' => 'admin/Reserve/list_amount.html.twig']);
  49.         $listMapper->add('notes'null, ['label' => 'Заметки''template' => 'admin/Reserve/list_notes.html.twig']);
  50.         $listMapper->add('acceptanceCertificate'null, [
  51.             'label' => 'Действия',
  52.             'template' => 'admin/Reserve/Approved/list_action.html.twig'
  53.         ]);
  54.     }
  55.     protected function configureFormFields(FormMapper $formMapper): void
  56.     {
  57.         $formMapper->with('Данные резерва', ['class' => 'col-md-6 box-transition']);
  58.         $formMapper->add('motorcycle'ModelType::class, [
  59.             'btn_add' => false,
  60.             'multiple' => false,
  61.             'label' => 'Мотоцикл',
  62.             'error_bubbling' => true,
  63.             'attr' => ['data-reserve-field' => 'motorcycle'],
  64.         ]);
  65.         $formMapper->add('startDate'DateTimeType::class, [
  66.             'widget' => 'single_text',
  67.             'required' => false,
  68.             'error_bubbling' => true,
  69.             'label' => 'Дата и время начала аренды',
  70.             'attr' => ['data-reserve-field' => 'start-date'],
  71.         ]);
  72.         $formMapper->add('endDate'DateTimeType::class, [
  73.             'widget' => 'single_text',
  74.             'required' => false,
  75.             'error_bubbling' => true,
  76.             'label' => 'Дата и время окончания аренды',
  77.             'attr' => ['data-reserve-field' => 'end-date'],
  78.         ]);
  79.         $formMapper->add('amount'null, [
  80.             'label' => 'Стоимость аренды (BYN)',
  81.             'attr' => ['data-reserve-field' => 'amount'],
  82.         ]);
  83.         $formMapper->end();
  84.         $formMapper->with('Клиент', ['class' => 'col-md-6 box-transition']);
  85.         $formMapper->add('client'ModelType::class, [
  86.             'btn_add' => 'Новый клиент',
  87.             'multiple' => false,
  88.             'label' => 'Клиент',
  89.         ]);
  90.         $formMapper->add('notes'null, ['label' => 'Заметки']);
  91.         $formMapper->end();
  92.     }
  93.     protected function configureShowFields(ShowMapper $showMapper): void
  94.     {
  95.         $showMapper
  96.             ->add('id')
  97.             ->add('startDate')
  98.             ->add('endDate')
  99.             ;
  100.     }
  101.     /**
  102.      * {@inheritdoc}
  103.      * @param $object Reserve
  104.      */
  105.     public function validate(ErrorElement $errorElement$object) {
  106.         /** @var ReserveRepository $reserveRepository */
  107.         $reserveRepository $this->entityManager->getRepository(Reserve::class);
  108.         $intersections $reserveRepository->reserveList(clone $object->getStartDate(),(clone $object->getEndDate())->modify('- 1 second'), $object->getId(), $object->getMotorcycle());
  109.         if ($intersections->count() > 0) {
  110.             $intersections->map(static function (Reserve $reserve) use (&$errorElement) {
  111.                 $errorElement->with('motorcycle')->addViolation(sprintf('Пересечение: %s - %s (%s)',
  112.                     $reserve->getStartDate()->format('Y-m-d H:i:s'),
  113.                     $reserve->getEndDate()->format('Y-m-d H:i:s'),
  114.                     $reserve->getClient()
  115.                 ))->end();
  116.             });
  117.         }
  118.     }
  119.     /**
  120.      * @required
  121.      * @param EntityManagerInterface $entityManager
  122.      */
  123.     public function setEntityManager(EntityManagerInterface $entityManager): void
  124.     {
  125.         $this->entityManager $entityManager;
  126.     }
  127.     protected function configureRoutes(RouteCollection $collection): void
  128.     {
  129.         parent::configureRoutes($collection);
  130.         $collection->add('get_reserve_calendar''get-reserve-calendar');
  131.         $collection->add('create_acceptance_certificate''create-acceptance-certificate');
  132.         $collection->add('open_reserve''open-reserve');
  133.         $collection->add('close_reserve''close-reserve');
  134.         $collection->add('finale_close_reserve''finale-close-reserve');
  135.         $collection->add('add_to_reserve''add-to-reserve');
  136.         $collection->add('calculate_amount''calculate-amount');
  137.         $collection->get('add_to_reserve')->setMethods('POST');
  138.     }
  139.     public function setBaseRouteName(string $baseRouteName): void
  140.     {
  141.         $this->baseRouteName $baseRouteName;
  142.     }
  143.     public function setBaseRoutePattern(string $baseRoutePattern): void
  144.     {
  145.         $this->baseRoutePattern $baseRoutePattern;
  146.     }
  147.     public function setClassnameLabel(string $label): void
  148.     {
  149.         $this->classnameLabel $label;
  150.     }
  151. }