src/Admin/Controller/ReserveAdminController.php line 52

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Admin\Controller;
  4. use App\Entity\AdmUser;
  5. use App\Entity\Client;
  6. use App\Entity\Equipment;
  7. use App\Entity\Motorcycle;
  8. use App\Entity\Reserve;
  9. use App\Entity\Type\EquipmentType;
  10. use App\Entity\Type\RentStatusType;
  11. use App\Entity\Type\WeekDay;
  12. use App\EntityService\ReserveEntityService;
  13. use App\Repository\EquipmentRepository;
  14. use App\Repository\MotorcycleRepository;
  15. use App\Repository\ReserveRepository;
  16. use DateTime;
  17. use Doctrine\ORM\EntityManagerInterface;
  18. use MessageFormatter;
  19. use Sonata\AdminBundle\Controller\CRUDController;
  20. use Symfony\Component\HttpFoundation\JsonResponse;
  21. use Symfony\Component\HttpFoundation\Request;
  22. use Symfony\Component\HttpFoundation\Response;
  23. class ReserveAdminController extends CRUDController
  24. {
  25.     private const DEFAULT_CALENDAR_DAYS_LIMIT  30;
  26.     private EntityManagerInterface $entityManager;
  27.     private ReserveRepository $reserveRepository;
  28.     private MotorcycleRepository $motorcycleRepository;
  29.     private EquipmentRepository $equipmentRepository;
  30.     private ReserveEntityService $reserveEntityService;
  31.     public function __construct(
  32.         EntityManagerInterface $entityManager,
  33.         ReserveRepository $reserveRepository,
  34.         MotorcycleRepository $motorcycleRepository,
  35.         EquipmentRepository $equipmentRepository,
  36.         ReserveEntityService $reserveEntityService
  37.     )
  38.     {
  39.         $this->entityManager $entityManager;
  40.         $this->reserveRepository $reserveRepository;
  41.         $this->motorcycleRepository $motorcycleRepository;
  42.         $this->equipmentRepository $equipmentRepository;
  43.         $this->reserveEntityService $reserveEntityService;
  44.     }
  45.     public function getReserveCalendarAction(Request $request): JsonResponse
  46.     {
  47.         $days $request->get('days');
  48.         if (!$days) {
  49.             $days self::DEFAULT_CALENDAR_DAYS_LIMIT;
  50.         }
  51.         $mot $this->motorcycleRepository->find(7);
  52.         $searchStartDate = new \DateTime();
  53.         $searchEndDate = new \DateTime();
  54.         $searchEndDate->setTime(235959);
  55.         $searchStartDate->modify('- 1 day');
  56.         $searchEndDate->modify('- 1 day');
  57.         $graph = [];
  58.         for ($i 0$i <= $days$i++) {
  59.             $searchStartDate->setTime(0,0);
  60.             $searchStartDate->modify('+ 1 day');
  61.             $searchEndDate->modify('+ 1 day');
  62.             $result $this->reserveRepository->reserveList($searchStartDate$searchEndDate);
  63.             $reserves = [];
  64.             $result->map(static function (Reserve $reserve) use (&$reserves$searchStartDate$searchEndDate) {
  65.                 $motName $reserve->getMotorcycle()->getFullName();
  66.                 $startTime $reserve->getStartDate();
  67.                 
  68.                 $endDate $reserve->getEndDate();
  69.                 $endDay = (clone $searchEndDate)->setTime(23,59);
  70.                 if ((int)$startTime->format('d') !== (int) $searchStartDate->format('d')) {
  71.                     $startTime = clone $searchStartDate;
  72.                 }
  73.                 if ($endDate $endDay) {
  74.                     $endDate $endDay;
  75.                 }
  76.                 $list = [];
  77.                 while ($startTime <= $endDate) {
  78.                     $list[] = $startTime->format('H:i');
  79.                     $startTime->modify('+ 1 hour');
  80.                 }
  81.                 if ((int)$reserve->getEndDate()->format('d') !== (int) $searchEndDate->format('d') ||
  82.                     (int)$reserve->getEndDate()->format('m') > (int) $searchEndDate->format('m')
  83.                 ) {
  84.                     $list[] = '24:00';
  85.                 }
  86.                 
  87.                 array_pop($list);
  88.                 $reserves[$motName]['reserves'][] = $list;
  89.                 $reserves[$motName]['color'] = $reserve->getMotorcycle()->getColor();
  90.             });
  91.             $schedules $this->prepareReserves($reserves);
  92.             $graph[] = [
  93.                 'date' => sprintf(
  94.                     '(%s) %s',
  95.                     WeekDay::WEEKDAY_RU[(int)$searchStartDate->format('w')],
  96.                     $searchStartDate->format('d.m.Y')),
  97.                 'schedules' => $schedules
  98.             ];
  99.         }
  100.         return new JsonResponse($graph);
  101.     }
  102.     private function prepareReserves($reserves): array
  103.     {
  104.         $schedules = [];
  105.         foreach ($reserves as $key => $value) {
  106.             $schedules[] = [
  107.                 'name'=> $key,
  108.                 'color' => $value['color'],
  109.                 'reserves' =>  $value['reserves']
  110.             ];
  111.         }
  112.         return $schedules;
  113.     }
  114.     public function createAcceptanceCertificateAction(Request $request): Response
  115.     {
  116.         /** @var AdmUser $admin */
  117.         $admin $this->getUser();
  118.         /** @var Reserve $reserve */
  119.         $reserve $this->reserveRepository->find($request->get('id'));
  120.         /** @var Client $client */
  121.         $client $reserve->getClient();
  122.         /** @var Motorcycle $motorcycle */
  123.         $motorcycle $reserve->getMotorcycle();
  124.         $this->reserveEntityService->toActiveStatus($reserve);
  125.         $this->entityManager->flush();
  126.         $equipment = [];
  127.         /** @var Equipment $eq */
  128.         foreach ($reserve->getEquipment() as $eq) {
  129.             $number ' (№ ' $eq->getSerialNumber() . ')';
  130.             $equipment[] = EquipmentType::RU_VALUES[$eq->getType()] . ' ' $eq->getBrand() . ' ' $eq->getModel() . ' ' $eq->getSize() . $number ;
  131.         }
  132.         return $this->renderWithExtraParams('admin/Document/acceptance_certificate.html.twig', [
  133.             'admin' => [
  134.                 'jobTitle' => $admin->getBiography(),
  135.                 'name' => $admin->getLastname() . ' ' .  $admin->getFirstname()
  136.             ],
  137.             'currentDate' => (new DateTime())->format('d.m.Y'),
  138.             'client' => [
  139.                 'number' => $client->getUserNumber(),
  140.                 'fio' => $client->getFio(),
  141.                 'signDate' => $client->getDateSigningContract()->format('d.m.Y')
  142.             ],
  143.             'motorcycle' => [
  144.                 'name' => $motorcycle->getFullName(),
  145.                 'vin' => $motorcycle->getVinNumber(),
  146.                 'year' => $motorcycle->getIssueYear()->format('Y'),
  147.                 'registrationNumber' => $motorcycle->getRegistrationNumber(),
  148.                 'paymentAmount' => $motorcycle->getPaymentAmount(),
  149.                 'mileage' => $motorcycle->getMileage(),
  150.             ],
  151.             'reserve' => [
  152.                 'amount' => $reserve->getAmount(),
  153.                 'amountWords' => $this->num2str($reserve->getAmount()),
  154.                 'startDate' => $reserve->getStartDate()->format('d.m.Y H:i'),
  155.                 'endDate' => $reserve->getEndDate()->format('d.m.Y H:i'),
  156.                 'returnDate' => $reserve->getEndDate()->format('d.m.Y'),
  157.                 'returnTimeIntervalStart' => $reserve->getEndDate()->format('H:i'),
  158.                 'returnTimeIntervalEnd' => (clone $reserve->getEndDate())->modify('+ 15 minutes')->format('H:i'),
  159.             ],
  160.             'equipment' => $equipment
  161.         ]);
  162.     }
  163.     public function openReserveAction(Request $request): Response
  164.     {
  165.         $reserve $this->reserveRepository->find($request->get('id'));
  166.         ///На потом, достать весь экип у которого нет активной аренды (или типы аренды котрые раньше)
  167.         /// т текущий экип если уже брали
  168.         return $this->renderWithExtraParams('admin/Reserve/open_reserve_page.html.twig', [
  169.             'object' => $reserve,
  170.             'equipment' => $this->getEquipmentPrepare(),
  171.             'jsonEquipment' => json_encode($this->getEquipmentPrepare())
  172.         ]);
  173.     }
  174.     public function closeReserveAction(Request $request): Response
  175.     {
  176.         $reserve $this->reserveRepository->find($request->get('id'));
  177.         return $this->renderWithExtraParams('admin/Reserve/close_reserve_page.html.twig', [
  178.             'object' => $reserve,
  179.         ]);
  180.     }
  181.     public function finaleCloseReserveAction(Request $request): Response
  182.     {
  183.         /** @var Reserve $reserve */
  184.         $reserve $this->reserveRepository->find($request->get('id'));
  185.         $reserve->setStatus(RentStatusType::ENDED);
  186.         $this->entityManager->flush();
  187.         return $this->redirectToRoute('admin_app_reserve_active_list');
  188.     }
  189.     public function addToReserveAction(Request $request): Response
  190.     {
  191.         try {
  192.             $reserveId $request->get('reserve');
  193.             $equipmentList $request->get('equipment');
  194.             $startReserveMileage $request->get('startMileage');
  195.             $endReserveMileage $request->get('endMileage');
  196.             /** @var Reserve $reserve */
  197.             $reserve $this->reserveRepository->find((int) $reserveId);
  198.             if ($startReserveMileage) {
  199.                 $reserve->setStartRentMileage((int)$startReserveMileage);
  200.                 $reserve->getMotorcycle()->setMileage((int)$startReserveMileage);
  201.             }
  202.             if ($endReserveMileage) {
  203.                 $reserve->setEndRentMileage((int)$endReserveMileage);
  204.                 $reserve->getMotorcycle()->setMileage((int)$endReserveMileage);
  205.             }
  206.             if (is_array($equipmentList)) {
  207.                 foreach ($equipmentList as $item) {
  208.                     /** @var Equipment $equipment */
  209.                     $equipment $this->equipmentRepository->find((int) $item);
  210.                     $reserve->addEquipment($equipment);
  211.                 }
  212.             }
  213.             $this->entityManager->flush();
  214.             return new JsonResponse();
  215.         }catch (\Throwable $e) {
  216.             return new JsonResponse($e->getMessage(), Response::HTTP_I_AM_A_TEAPOT);
  217.         }
  218.     }
  219.     private function getEquipmentPrepare(): array
  220.     {
  221.         $equipment $this->equipmentRepository->findAll();
  222.         $res = [];
  223.         foreach ($equipment as $item) {
  224.             $image $item->getImages()->first();
  225.             $res[EquipmentType::VALUES[$item->getType()]][] = [
  226.                 'id' => $item->getId(),
  227.                 'brand' => $item->getBrand(),
  228.                 'model' => $item->getModel(),
  229.                 'size' => $item->getSize(),
  230.                 'image' => $image $image->getPath() : null
  231.             ];
  232.         }
  233.         return $res;
  234.     }
  235.     private function num2str($num): string
  236.     {
  237.         $nul='ноль';
  238.         $ten=array(
  239.             array('','один','два','три','четыре','пять','шесть','семь''восемь','девять'),
  240.             array('','одна','две','три','четыре','пять','шесть','семь''восемь','девять'),
  241.         );
  242.         $a20=array('десять','одиннадцать','двенадцать','тринадцать','четырнадцать' ,'пятнадцать','шестнадцать','семнадцать','восемнадцать','девятнадцать');
  243.         $tens=array(2=>'двадцать','тридцать','сорок','пятьдесят','шестьдесят','семьдесят' ,'восемьдесят','девяносто');
  244.         $hundred=array('','сто','двести','триста','четыреста','пятьсот','шестьсот''семьсот','восемьсот','девятьсот');
  245.         $unit=array( // Units
  246.             array('копейка' ,'копейки' ,'копеек',     1),
  247.             array('рубль'   ,'рубля'   ,'рублей'    ,0),
  248.             array('тысяча'  ,'тысячи'  ,'тысяч'     ,1),
  249.             array('миллион' ,'миллиона','миллионов' ,0),
  250.             array('миллиард','милиарда','миллиардов',0),
  251.         );
  252.         //
  253.         list($rub,$kop) = explode('.',sprintf("%015.2f"floatval($num)));
  254.         $out = array();
  255.         if (intval($rub)>0) {
  256.             foreach(str_split($rub,3) as $uk=>$v) { // by 3 symbols
  257.                 if (!intval($v)) continue;
  258.                 $uk sizeof($unit)-$uk-1// unit key
  259.                 $gender $unit[$uk][3];
  260.                 list($i1,$i2,$i3) = array_map('intval',str_split($v,1));
  261.                 // mega-logic
  262.                 $out[] = $hundred[$i1]; # 1xx-9xx
  263.                 if ($i2>1$out[]= $tens[$i2].' '.$ten[$gender][$i3]; # 20-99
  264.                 else $out[]= $i2>$a20[$i3] : $ten[$gender][$i3]; # 10-19 | 1-9
  265.                 // units without rub & kop
  266.                 if ($uk>1$out[]= $this->morph($v,$unit[$uk][0],$unit[$uk][1],$unit[$uk][2]);
  267.             } //foreach
  268.         }
  269.         else $out[] = $nul;
  270. //        $out[] = $this->morph(intval($rub), $unit[1][0],$unit[1][1],$unit[1][2]); // rub
  271. //        $out[] = $kop.' '.$this->morph($kop,$unit[0][0],$unit[0][1],$unit[0][2]); // kop
  272.         return trim(preg_replace('/ {2,}/'' 'join(' ',$out)));
  273.     }
  274.     private function morph($n$f1$f2$f5) {
  275.         $n abs(intval($n)) % 100;
  276.         if ($n>10 && $n<20) return $f5;
  277.         $n $n 10;
  278.         if ($n>&& $n<5) return $f2;
  279.         if ($n==1) return $f1;
  280.         return $f5;
  281.     }
  282. }