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 App\Service\TransactionService;
  8. use Doctrine\ORM\EntityManagerInterface;
  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 ReserveAdmin extends AbstractReserveAdmin
  19. {
  20.     private EntityManagerInterface $entityManager;
  21.     private ?TransactionService $transactionService null;
  22.     protected $datagridValues = [
  23.         '_sort_order' => 'DESC',
  24.         '_sort_by' => 'id'
  25.     ];
  26.     protected function configureDatagridFilters(DatagridMapper $datagridMapper): void
  27.     {
  28.         $datagridMapper
  29.             ->add('id')
  30.             ->add('startDate')
  31.             ->add('endDate')
  32.             ;
  33.     }
  34.     protected function configureListFields(ListMapper $listMapper): void
  35.     {
  36.         $listMapper->add('motorcycle');
  37.         $listMapper->add('client');
  38.         $listMapper->add('startDate'null, ['template' => 'admin/Reserve/list_start_date.html.twig']);
  39.         $listMapper->add('endDate'null, ['template' => 'admin/Reserve/list_end_date.html.twig']);
  40.         $listMapper->add('amount'null, ['template' => 'admin/Reserve/list_amount.html.twig']);
  41.         $listMapper->add('acceptanceCertificate'null, [
  42.             'label' => 'Действия',
  43.             'template' => 'admin/Reserve/list_create_acceptance_certificate.html.twig'
  44.         ]);
  45.     }
  46.     protected function configureFormFields(FormMapper $formMapper): void
  47.     {
  48.         $formMapper->with('Данные резерва', ['class' => 'col-md-6 box-transition']);
  49.         $formMapper->add('motorcycle'ModelType::class, [
  50.             'btn_add' => false,
  51.             'multiple' => false,
  52.             'label' => 'Мотоцикл',
  53.             'error_bubbling' => true
  54.         ]);
  55.         $formMapper->add('startDate'DateTimeType::class, [
  56.             'widget' => 'single_text',
  57.             'required' => false,
  58.             'error_bubbling' => true,
  59.             'label' => 'Дана и время начала аренды',
  60.         ]);
  61.         $formMapper->add('endDate'DateTimeType::class, [
  62.             'widget' => 'single_text',
  63.             'required' => false,
  64.             'error_bubbling' => true,
  65.             'label' => 'Дана и время окончания аренды',
  66.         ]);
  67.         $formMapper->add('amount'null, ['label' => 'Стоимость аренды (BYN)']);
  68.         $formMapper->end();
  69.         $formMapper->with('Клиент', ['class' => 'col-md-6 box-transition']);
  70.         $formMapper->add('client'ModelType::class, [
  71.             'btn_add' => 'Новый клиент',
  72.             'multiple' => false,
  73.             'label' => 'Клиент',
  74.         ]);
  75.         $formMapper->add('notes'null, ['label' => 'Заметки']);
  76.         $formMapper->end();
  77.     }
  78.     protected function configureShowFields(ShowMapper $showMapper): void
  79.     {
  80.         $showMapper
  81.             ->add('id')
  82.             ->add('startDate')
  83.             ->add('endDate')
  84.             ;
  85.     }
  86.     /**
  87.      * {@inheritdoc}
  88.      * @param $object Reserve
  89.      */
  90.     public function validate(ErrorElement $errorElement$object) {
  91.         /** @var ReserveRepository $reserveRepository */
  92.         $reserveRepository $this->entityManager->getRepository(Reserve::class);
  93.         $intersections $reserveRepository->reserveList(clone $object->getStartDate(),(clone $object->getEndDate())->modify('- 1 second'), $object->getId(), $object->getMotorcycle());
  94.         if ($intersections->count() > 0) {
  95.             $intersections->map(static function (Reserve $reserve) use (&$errorElement) {
  96.                 $errorElement->with('motorcycle')->addViolation(sprintf('Пересечение: %s - %s (%s)',
  97.                     $reserve->getStartDate()->format('Y-m-d H:i:s'),
  98.                     $reserve->getEndDate()->format('Y-m-d H:i:s'),
  99.                     $reserve->getClient()
  100.                 ))->end();
  101.             });
  102.         }
  103.     }
  104.     /**
  105.      * Active rentals create an income transaction on issue.
  106.      * When an active rental is deleted (e.g. motorcycle swap), create a matching outgoing transaction.
  107.      *
  108.      * @param Reserve $object
  109.      */
  110.     public function preRemove($object): void
  111.     {
  112.         if (!$object instanceof Reserve) {
  113.             return;
  114.         }
  115.         if ((int) $object->getStatus() !== RentStatusType::ACTIVE) {
  116.             return;
  117.         }
  118.         if ($this->transactionService) {
  119.             $this->transactionService->createReserveOutgoingTransaction($object);
  120.         }
  121.     }
  122.     /**
  123.      * @required
  124.      * @param EntityManagerInterface $entityManager
  125.      */
  126.     public function setEntityManager(EntityManagerInterface $entityManager): void
  127.     {
  128.         $this->entityManager $entityManager;
  129.     }
  130.     /**
  131.      * @required
  132.      */
  133.     public function setTransactionService(TransactionService $transactionService): void
  134.     {
  135.         $this->transactionService $transactionService;
  136.     }
  137.     protected function configureRoutes(RouteCollection $collection): void
  138.     {
  139.         parent::configureRoutes($collection);
  140.         $collection->add('get_reserve_calendar''get-reserve-calendar');
  141.         $collection->add('create_acceptance_certificate''create-acceptance-certificate');
  142.     }
  143. }