src/Controller/Api/DeliveryController.php line 82

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Api;
  3. use App\Env;
  4. use stdClass;
  5. use App\Entity\City;
  6. use App\Entity\Page;
  7. use App\Entity\Region;
  8. use App\Entity\PostOffice;
  9. use App\Entity\Translation\CityTranslation;
  10. use App\Service\Dadata\Address;
  11. use App\Repository\CityRepository;
  12. use App\Repository\RegionRepository;
  13. use App\Service\Delivery\Provider\NP;
  14. use App\Repository\PostofficeRepository;
  15. use Doctrine\ORM\EntityManagerInterface;
  16. use App\Service\Delivery\ProviderFactory;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\HttpFoundation\Response;
  19. use Symfony\Component\Routing\Annotation\Route;
  20. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  21. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  22. class DeliveryController extends AbstractController
  23. {
  24.     protected EntityManagerInterface $em;
  25.     protected $default_region_id '0c5b2444-70a0-4932-980c-b4dc0d3f02b5';
  26.     protected $default_city_id '0c5b2444-70a0-4932-980c-b4dc0d3f02b5';
  27.     
  28.     //Repositories    
  29.     protected RegionRepository $Regions;
  30.     protected CityRepository $Cities;
  31.     protected PostofficeRepository $Postoffices;
  32.     public function __construct(EntityManagerInterface $em, private CityRepository $cityRepository)
  33.     {
  34.         if(Env::site() == Env::DOM || Env::site() == Env::OPT) {
  35.             $default_region_id 'dcaadb64-4b33-11e4-ab6d-005056801329';
  36.             $default_city_id 'e718a680-4b33-11e4-ab6d-005056801329';
  37.         }
  38.         $this->em $em;
  39.         $this->Regions $this->em->getRepository(Region::class);
  40.         $this->Cities $this->em->getRepository(City::class);
  41.         $this->Postoffices $this->em->getRepository(PostOffice::class);
  42.     }
  43.     // Показать все почтовые отделения в городе
  44.     #[Route('/api/delivery/getoffices'name'api_delivery_getoffices_no_locale'defaults: ['_locale' => '%app.default_lang%'])]
  45.     #[Route(path'/{_locale}/api/delivery/getoffices'name'api_delivery_getoffices'requirements: ['_locale' => '%app.langs%'])]
  46.     public function getoffices(Request $request): Response
  47.     {       
  48.         $city = (string) $request->query->get('city');
  49.         $fias = (string) $request->query->get('fias');
  50.         $lon = (string) $request->query->get('lon');
  51.         $lat = (string) $request->query->get('lat');
  52.         $delivery_intname = (string) $request->query->get('delivery_id');
  53.         $Delivery ProviderFactory::factory($delivery_intname$this->em$request);
  54.         $offices $Delivery->getOffices($this->Postoffices$city$lat$lon);
  55.         return $this->json($offices);
  56.     }
  57.     // Показать адрес
  58.     #[Route('/api/delivery/getaddress'name'api_delivery_getaddress_no_locale'defaults: ['_locale' => '%app.default_lang%'])]
  59.     #[Route(path'/{_locale}/api/delivery/getaddress'name'api_delivery_getaddress'requirements: ['_locale' => '%app.langs%'])]
  60.     public function getaddress(Request $request): Response
  61.     {     
  62.         $city = (string) $request->query->get('city');
  63.         $address = (string) $request->query->get('address');
  64.         $addr Address::getAddress($address);
  65.         return $this->json($addr);
  66.     }
  67.     // Расчет стоимости доставки
  68.     #[Route('/api/delivery/getprice'name'api_delivery_getprice_no_locale'defaults: ['_locale' => '%app.default_lang%'])]
  69.     #[Route(path'/{_locale}/api/delivery/getprice'name'api_delivery_getprice'requirements: ['_locale' => '%app.langs%'])]
  70.     public function getprice(Request $request): Response
  71.     {       
  72.         $city = (string) $request->query->get('city');
  73.         $sub = (string) $request->query->get('subdelivery_id');
  74.         $fias = (string) $request->query->get('fias');
  75.         $weight = (float) $request->query->get('weight');
  76.         $amount = (float) $request->query->get('amount');
  77.         $delivery_intname = (string) $request->query->get('delivery_id');
  78.         $Delivery ProviderFactory::factory($delivery_intname$this->em$request);
  79.         $res $Delivery->calculate($city$sub$weight);
  80.         // if (($amount >= (int) $sett['free_delivery_amount'])&&(!Auth::isOpt())) {
  81.         //     $res->sum = 0;
  82.         // }
  83.         return $this->json($res);
  84.     }
  85.     // Список регионов
  86.     #[Route('/api/delivery/getregions'name'api_delivery_getregions_no_locale'defaults: ['_locale' => '%app.default_lang%'])]
  87.     #[Route(path'/{_locale}/api/delivery/getregions'name'api_delivery_getregions'requirements: ['_locale' => '%app.langs%'])]
  88.     public function getregions(Request $request): Response
  89.     {       
  90.         $response = [];
  91.         $response['regions'] = [];
  92.         // $response['regions'] = $this->em->createQuery("SELECT r.id, r.fias_id, r.name, r.prior, r.visible FROM App\Entity\Region r WHERE r.visible = 1 ORDER BY r.name ASC")->getResult();
  93.         $regions $this->Regions->findBy(
  94.             ['visible' => 1],
  95.             ['name' => 'ASC']
  96.         );
  97.         if(Env::site() == Env::MIR || Env::site() == Env::OPT_MIR) {
  98.         } else {
  99.             $i 299;
  100.             $cc count($regions) / 1;
  101.             $c 0;
  102.             foreach ($regions as $k => $region) {
  103.                 $response['regions'][$k]['id'] = $region->getId();
  104.                 $response['regions'][$k]['fias_id'] = $region->getFiasId();
  105.                 $response['regions'][$k]['name'] = $region->getName();
  106.                 $response['regions'][$k]['visible'] = $region->isVisible();
  107.                 $response['regions'][$k]['prior'] = $i;
  108.                 // $region->setPrior($i);
  109.                 if ($c $cc 2) {
  110.                     $i 99;
  111.                 } elseif ($c $cc 1) {
  112.                     $i 199;
  113.                 }
  114.                 $c++;
  115.             }
  116.         }        
  117.         
  118.         /** @var \App\Entity\City[] $cities */
  119.         $cities $this->em->createQuery("SELECT c FROM App\Entity\City c WHERE c.visible = 1 and c.top > 0 ORDER BY c.top DESC")->getResult();
  120.         $response['cities'] = [];
  121.         foreach ($cities as $k => $city) {
  122.             $response['cities'][$k]['id'] = $city->getId();
  123.             $response['cities'][$k]['fias_id'] = $city->getFiasId();
  124.             $response['cities'][$k]['name'] = $city->getName();
  125.             $response['cities'][$k]['postal_code'] = $city->getPostalCode();
  126.             $response['cities'][$k]['type'] = $city->getType();
  127.             $response['cities'][$k]['prior'] = $city->getPrior();
  128.             $response['cities'][$k]['visible'] = $city->isVisible();
  129.             $response['cities'][$k]['top'] = $city->isTop();
  130.         }
  131.         
  132.         return $this->json($response);
  133.     }
  134.     // Список городов
  135.     #[Route('/api/delivery/getcities'name'api_delivery_getcities_no_locale'defaults: ['_locale' => '%app.default_lang%'])]
  136.     #[Route(path'/{_locale}/api/delivery/getcities'name'api_delivery_getcities'requirements: ['_locale' => '%app.langs%'])]
  137.     public function getcities(Request $request): Response
  138.     {               
  139.         $region = (int) $request->query->get('region');
  140.         $cities_array = [];
  141.         if(Env::site() == Env::MIR || Env::site() == Env::OPT_MIR) {
  142.             //$cities = $City->getall(['where' => 'visible=1 and region=' . (int)$_GET['region'], 'order' => 'prior desc']);
  143.             $cities_array $this->em->createQuery("SELECT c.id, c.region, c.fias_id, c.name, c.postal_code, c.type, c.prior, c.visible, c.top, c.top2 FROM App\Entity\City c WHERE c.visible = 1 and c.region = ".$region." ORDER BY c.prior DESC")->getResult();
  144.         } else {
  145.             //$cities = $City->getall(['where' => 'visible=1 and top2=1 and region=' . (int)$_GET['region'], 'order' => '`type` desc, name asc']);
  146.             // $cities = $this->em->createQuery("SELECT c.id, c.region, c.fias_id, c.name, c.postal_code, c.type, c.prior, c.visible, c.top, c.top2 FROM App\Entity\City c WHERE c.visible = 1 and c.top2 = 1 and c.region = ".$region." ORDER BY c.prior DESC")->getResult();
  147.             $cities $this->cityRepository->getTop2ByRegion($region);
  148.             $i 299;
  149.             $cc count($cities)/3-1;
  150.             $c 0;
  151.             foreach ($cities as $k => $city) {
  152.                 $city->setPrior($i);
  153.                 if ($c $cc 2) {
  154.                     $i 99;
  155.                 } elseif ($c $cc) {
  156.                     $i 199;
  157.                 }
  158.                 $c++;
  159.                 $cities_array[] = [
  160.                     "id" => $city->getId(),
  161.                     "region" => $city->getRegion(),
  162.                     "fias_id" => $city->getFiasId(),
  163.                     "name" => $city->getName(),
  164.                     "postal_code" => $city->getPostalCode(),
  165.                     "type" => $city->getType(),
  166.                     "prior" => $city->getPrior(),
  167.                     "visible" => (int) $city->isVisible(),
  168.                     "top" => (int) $city->isTop(),
  169.                     "top2" => (int) $city->isTop2(), 
  170.                 ];
  171.             }
  172.         }
  173.     
  174.         return $this->json($cities_array);
  175.     }
  176.     // Список регионов НП
  177.     #[Route('/api/delivery/setregions'name'api_delivery_setregions_no_locale'defaults: ['_locale' => '%app.default_lang%'])]
  178.     #[Route(path'/{_locale}/api/delivery/setregions'name'api_delivery_setregions'requirements: ['_locale' => '%app.langs%'])]
  179.     public function setregions(Request $request): Response
  180.     {       
  181.         $NP = new NP($this->em$request);
  182.         $cities $NP->getCities();
  183.         $regions = [];
  184.         foreach ($cities as $city) {
  185.             $regions[$city['Area']] = ['fias_id' => $city['Area'], 'name' => $city['AreaDescriptionRu']];    
  186.         }
  187.     
  188.         foreach ($regions as $k => $v) {
  189.             $regions_num $this->em->createQuery("SELECT r.id FROM App\Entity\Region r WHERE r.fias_id = '".$v['fias_id']."'")->getResult();
  190.             if (count($regions_num) == 0) {
  191.                 $Region = new Region();
  192.                 $Region->setFiasId($v['fias_id']);
  193.                 $Region->setName($v['name']);
  194.                 $this->em->persist($Region);                
  195.             }
  196.         }            
  197.         $this->em->flush();
  198.         $response = [];
  199.         return $this->json($response);
  200.     }
  201.     // Список городов НП
  202.     #[Route('/api/delivery/setcities'name'api_delivery_setcities_no_locale'defaults: ['_locale' => '%app.default_lang%'])]
  203.     #[Route(path'/{_locale}/api/delivery/setcities'name'api_delivery_setcities'requirements: ['_locale' => '%app.langs%'])]
  204.     public function setcities(Request $request): Response
  205.     {      
  206.         set_time_limit(0);
  207.         $region_fias = [];
  208.         $NP = new NP($this->em$request);
  209.         $regions $this->Regions->findAll();
  210.         $added 0;
  211.         foreach ($regions as $r) {
  212.             $region_fias[$r->getFiasId()] = $r->getId();
  213.         }
  214.         $cities $NP->getCities();
  215.         $i 0;
  216.         foreach ($cities as $city) {
  217.             $type str_replace("поселок городского типа""пгт."$city['SettlementTypeDescriptionRu']);
  218.             $type str_replace(["город""село"], ["г.""с."], $type);
  219.             $city_num $this->em->createQuery("SELECT c.id FROM App\Entity\City c WHERE c.fias_id = '".$city['Ref']."'")->getResult();
  220.             if (count($city_num) == 0) {
  221.                 $added++;
  222.                 $top = ($city['SettlementTypeDescriptionRu'] == 'город') ? 0;
  223.                 $City = new City();
  224.                 $City->setRegion((int) $region_fias[$city['Area']]);
  225.                 $City->setName($city['DescriptionRu']);
  226.                 $City->setFiasId($city['Ref']);
  227.                 $City->setType($type);
  228.                 $City->setPostalCode($city['Index1']);
  229.                 $City->setTop2($top);
  230.                 $City->setPrior(0);
  231.                 $City->setVisible(true);
  232.                 $this->em->persist($City);
  233.                 $this->em->flush();
  234.                 $ukName = new CityTranslation('uk''name'$city['Description']);
  235.                 $City->addTranslation($ukName);
  236.                 $this->em->persist($City);                
  237.                 if ($i++ > 100) {
  238.                     $this->em->flush();
  239.                     $i 0;
  240.                 }
  241.             }
  242.             $this->em->flush();
  243.         }
  244.         
  245.         
  246.         return $this->json($cities);
  247.     }
  248.     // Список отделений НП
  249.     #[Route('/api/delivery/setoffices'name'api_delivery_setoffices_no_locale'defaults: ['_locale' => '%app.default_lang%'])]
  250.     #[Route(path'/{_locale}/api/delivery/setoffices'name'api_delivery_setoffices'requirements: ['_locale' => '%app.langs%'])]
  251.     public function setoffices(Request $request): Response
  252.     {       
  253.         set_time_limit(0);
  254.         $NP = new NP($this->em$request);
  255.         $cities $this->Cities->findAll();
  256.     
  257.         foreach ($cities as $city) {
  258.             $offices $NP->getOfficesFromApi($city->getFiasId());
  259.             echo $city->getName().": ".count($offices)."<br>";
  260.             foreach ($offices as $office) {
  261.                 $office_num $this->em->createQuery("SELECT p.id FROM App\Entity\PostOffice p WHERE p.code = '".$office['Ref']."'")->getResult();
  262.                 if (count($office_num) == 0) {
  263.                     $PO = new PostOffice();
  264.                     $PO->setDelivery('np');
  265.                     $PO->setName($office['DescriptionRu']);
  266.                     $PO->setAddress($office['ShortAddressRu']);
  267.                     $PO->setLat($office['Latitude']);
  268.                     $PO->setLon($office['Longitude']);
  269.                     $PO->setWorktime($office["worktime"]);
  270.                     $PO->setPostcode($city->getPostalCode());
  271.                     $PO->setCode($office['Ref']);
  272.                     $PO->setComment($office['Number']);
  273.                     $PO->setPhone($office['Phone']);
  274.                     $PO->setUpdated(time());
  275.                     $this->em->persist($PO);
  276.                 }
  277.             }
  278.         }
  279.         $this->em->flush();
  280.         $response = ["status" => "ok"];
  281.         return $this->json($response);
  282.     }
  283. }