src/Controller/PmcController.php line 95

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Dvf;
  4. use App\Entity\Ville;
  5. use App\Repository\PmcVilleRepository;
  6. use App\Repository\VilleRepository;
  7. use App\Services\ApiData;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use http\Exception\UnexpectedValueException;
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  11. use Symfony\Component\HttpFoundation\JsonResponse;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\RequestStack;
  14. use Symfony\Component\Routing\Annotation\Route;
  15. use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory;
  16. use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
  17. use Symfony\Component\Serializer\Serializer;
  18. use Doctrine\Common\Annotations\AnnotationReader;
  19. use Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader;
  20. class PmcController extends AbstractController
  21. {
  22.     private $entityManager;
  23.     private $request;
  24.     const GROUP_API 'pmc:api';
  25.     private $errors = [];
  26.     public function __construct(EntityManagerInterface $entityManagerRequestStack $requestStack)
  27.     {
  28.         $this->entityManager $entityManager;
  29.         $this->request $requestStack->getCurrentRequest();
  30.     }
  31.     protected function returnJsonResponseApi($groups$datas)
  32.     {
  33.         $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader()));
  34.         $normalizer = new ObjectNormalizer($classMetadataFactory);
  35.         $serializer = new Serializer([$normalizer]);
  36.         $datasSerialized $serializer->normalize($datasnull, ['groups' => $groups]);
  37.         return new JsonResponse($datasSerialized);
  38.     }
  39.     /**
  40.      * @Route("/api/pmc", name="pmc")
  41.      * @throws \Symfony\Component\Serializer\Exception\ExceptionInterface
  42.      */
  43.     public function index(ApiData $apiData)
  44.     {
  45.         $ville $this->validVille();
  46.         if(count($this->errors)) {
  47.             $datas $this->errors;
  48.         }else {
  49.             $datas $apiData->getDatas($ville);
  50.             $datas array_merge($datas, [
  51.                 'ville' => $ville,
  52.                 'insee' => json_decode($ville->getInsee(),true)
  53.             ]);
  54.         }
  55.         return $this->returnJsonResponseApi(self::GROUP_API$datas);
  56.     }
  57.     /**
  58.      * @Route("/api/pmc/ville-replace", name="pmc_replace")
  59.      * @throws \Symfony\Component\Serializer\Exception\ExceptionInterface
  60.      */
  61.     public function villeReplace(ApiData $apiDataPmcVilleRepository $pmcVilleRepository)
  62.     {
  63.         $ville $this->validVille();
  64.         $this->validType();
  65.         $this->validOffre();
  66.         if(count($this->errors)) {
  67.             $datas $this->errors;
  68.         }else{
  69.             $pmcVille $pmcVilleRepository->getVilleReplace(
  70.                 $ville,
  71.                 $this->request->query->get('type'),
  72.                 $this->request->query->get('offre') === 'location'
  73.             );
  74.             $datas $apiData->getDatas($pmcVille->getVille());
  75.             $datas['villeReplaced'] = $ville;
  76.             $datas['ville'] = $pmcVille->getVille();
  77.         }
  78.         return $this->returnJsonResponseApi(self::GROUP_API$datas);
  79.     }
  80.     /**
  81.      * @Route("/api/pmc/arround-city", name="pmc_arround_city")
  82.      * @throws \Symfony\Component\Serializer\Exception\ExceptionInterface
  83.      */
  84.     public function cityArround(ApiData $apiData)
  85.     {
  86.         $ville $this->validVille();
  87.         $this->validType();
  88.         $this->validOffre();
  89.         $this->validYear();
  90.         if(count($this->errors)) {
  91.             $datas $this->errors;
  92.         }else{
  93.             $datas =  $apiData->arroundCityPmcData(
  94.                 $ville,
  95.                 $this->request->query->get('type'),
  96.                 $this->request->query->get('offre'),
  97.                 $this->request->query->get('year'),
  98.                 $this->request->query->get('pondere') == '1'
  99.             );
  100.         }
  101.         return $this->returnJsonResponseApi(self::GROUP_API$datas);
  102.     }
  103.     /**
  104.      * @Route("/api/pmc/insert-dvf", name="dvf_insert")
  105.      * @throws \Symfony\Component\Serializer\Exception\ExceptionInterface
  106.      */
  107.     public function insertDvf(Request $request)
  108.     {
  109.         $post $request->request->all();
  110.         $get $request->query->all();
  111.         $datas = !empty($post) ? $post $get;
  112.         $year $datas['year'/* année : 2021 */;
  113.         $idbien $datas['id_bien'];
  114.         $natureMutation $datas['type_offre']/* typeOffre : Location, Vente */;
  115.         $valeurFonciere $datas['valeur_fonciere'];/* float accepté */
  116.         $codePostal $datas['ville_cp'];
  117.         $nomCommune $datas['nom_commune'];/* avec majuscules */
  118.         $codeInsee $datas['code_insee'];
  119.         $codeDpt $datas['code_departement'];/* 34 pour hérault */
  120.         $typeBien $datas['type_bien'];/* maison, appartement */
  121.         $nbPieces $datas['nb_pieces'];
  122.         $surface $datas['surface'];
  123.         $latitude $datas['latitude'];/* float */
  124.         $longitude $datas['longitude'];/* float */
  125.         $codeTypeLocal $datas['code_type_bien'];/* 1 = maison, 2 = appartement */
  126.         $dvf = (new Dvf())
  127.             ->setIdMutation($year '-' $idbien)
  128.             ->setNatureMutation($natureMutation)
  129.             ->setDateMutation(new \DateTime($year '-01-01 12:00:00'))
  130.             ->setValeurFonciere((float) $valeurFonciere)
  131.             ->setCodePostal($codePostal)
  132.             ->setNomCommune($nomCommune)
  133.             ->setCodeCommune($codeInsee)
  134.             ->setCodeDepartement($codeDpt)
  135. //                ->setNombreLots((int) $row['nombre_lots'])
  136.             ->setTypeLocal($typeBien)
  137.             ->setNombrePiecesPrincipales((int) $nbPieces)
  138.             ->setSurfaceReelleBati((float) $surface)
  139. //                ->setNatureCulture($row['nature_culture'])
  140. //                ->setSurfaceTerrain((float) $row['surface_terrain'])
  141.             ->setLatitude((float) $latitude)
  142.             ->setLongitude((float) $longitude)
  143.             ->setCodeTypeLocal($codeTypeLocal)
  144.             ->setPmc(null);
  145.         $this->entityManager->persist($dvf);
  146.         $this->entityManager->flush();
  147.         return new JsonResponse($dvf);
  148.     }
  149.     /**
  150.      * Check Ville if valid
  151.      * @return Ville
  152.      */
  153.     protected function validVille()
  154.     {
  155.         $rVille $this->entityManager->getRepository(Ville::class);
  156.         $cp $this->request->query->get('cp');
  157.         $villeSlug $this->request->query->get('ville_slug');
  158.         $codeInsee $this->request->query->get('code_insee');
  159.         if(is_null($villeSlug) || $villeSlug === "") {
  160.             $this->errors[] = "ville_slug non valide";
  161.         }
  162.         if(is_null($cp) || $cp === "") {
  163.             $this->errors[] = "cp non valide";
  164.         }
  165.         if(in_array($villeSlug, ['marseille','paris','lyon'])) {
  166.             $villeSlug $villeSlug '-' substr($cp, -2);
  167.         }
  168.         $ville $rVille->findOneByMultipleFields($cp,$villeSlug);
  169.         if (!$ville instanceof Ville) {
  170.             $resultVille $rVille->getVilleByCodeInsee($codeInsee);
  171.             $ville = !empty($resultVille) ? $resultVille[0] : null;
  172.             if (!$ville instanceof Ville) {
  173.                 $this->errors[] = 'Ville not found for cp : ' $this->request->query->get('cp')
  174.                     . ' ville_slug : ' $this->request->query->get('ville_slug');
  175.             }
  176.         }
  177.         return $ville;
  178.     }
  179.     /**
  180.      * Check param Type is valid
  181.      */
  182.     protected function validType()
  183.     {
  184.         if (!in_array($this->request->query->get('type'), ['maison''appartement'])) {
  185.             $this->errors[] = 'type non invalide  ' $this->request->query->get('type');
  186.         }
  187.     }
  188.     /**
  189.      * Check offre is valid
  190.      */
  191.     protected function validOffre()
  192.     {
  193.         if (!in_array($this->request->query->get('offre'), ['location''vente'])) {
  194.             $this->errors[] = 'offre non valide : '
  195.                 $this->request->query->get('offre');
  196.         }
  197.     }
  198.     /**
  199.      * Check year is valid
  200.      */
  201.     protected function validYear()
  202.     {
  203.         if (!in_array((int) $this->request->query->get('year'), [2022202120202019201820172016,'all'])) {
  204.             throw new \UnexpectedValueException('year non valide : '
  205.                 $this->request->query->get('year'));
  206.         }
  207.     }
  208. }