src/Controller/Api/Immo/AdController.php line 53

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Api\Immo;
  3. use App\Service\DataSanitize;
  4. use App\Service\Immo\CreateAgency;
  5. use App\Service\Immo\Creator;
  6. use App\Service\Immo\Data;
  7. use League\Csv\InvalidArgument;
  8. use League\Csv\Reader;
  9. use PhpOffice\PhpSpreadsheet\IOFactory;
  10. use PhpOffice\PhpSpreadsheet\Reader\Exception;
  11. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  12. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  13. use Symfony\Component\HttpFoundation\File\UploadedFile;
  14. use Symfony\Component\HttpFoundation\JsonResponse;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\HttpFoundation\Response;
  17. use Symfony\Component\Routing\Annotation\Route;
  18. use OpenApi\Annotations as OA;
  19. use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;
  20. use Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface;
  21. use Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface;
  22. use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
  23. use Symfony\Contracts\HttpClient\HttpClientInterface;
  24. /**
  25.  * Class AdController
  26.  * @package App\Controller\Api\Immo
  27.  * @Route("/api/immo/ad", name="api_immo_ad_")
  28.  */
  29. class AdController extends AbstractController
  30. {
  31.     /**
  32.      * Get file annonces from SELOGER
  33.      *
  34.      * @Route("/csv", name="csv", methods={"POST"})
  35.      * @OA\Response(
  36.      *     response=200,
  37.      *     description="Return list of JSON objects",
  38.      * )
  39.      * @OA\Tag(name="Immobilier")
  40.      *
  41.      * @param Request $request
  42.      * @param ParameterBagInterface $parameterBag
  43.      * @param DataSanitize $dataSanitize
  44.      * @param Creator $creator
  45.      * @param CreateAgency $creatorAgency
  46.      * @return Response
  47.      * @throws InvalidArgument
  48.      * @throws Exception
  49.      */
  50.     public function adCSV(Request $requestParameterBagInterface $parameterBagDataSanitize $dataSanitize,
  51.                           Creator $creatorCreateAgency $creatorAgency): Response
  52.     {
  53.         $type Data::TYPE_CSV;
  54.         $dirname $request->get('dirname');
  55.         $identifiant $request->get('identifiant');
  56.         $getAll $request->get('all') ?: false;
  57.         if(!$dirname || !$identifiant){
  58.             return new JsonResponse(['message' => 'Identification erronée.'], 400);
  59.         }
  60.         $file $this->getFile($request->files->get('file'));
  61.         if(!($file instanceof UploadedFile)){
  62.             return $file;
  63.         }
  64.         // récupération des données du csv
  65.         $reader Reader::createFromPath($file);
  66.         $reader->setDelimiter('#');
  67.         $records $reader->getRecords();
  68.         // get agency info
  69.         $agency $this->getAgency($parameterBag$dirname$identifiant$creatorAgency);
  70.         if(!is_array($agency)){
  71.             return $agency;
  72.         }
  73.         // get list of ad
  74.         $ads = []; $ref 0;
  75.         if(count($reader) != 0){
  76.             foreach ($records as $record) {
  77.                 $record $dataSanitize->cleaner($record);
  78.                 $go false;
  79.                 if($getAll){
  80.                     $go true;
  81.                 }else{
  82.                     if($record[140] != "VENDU" && $record[140] != "LOUE" && $record[140] != "loué"
  83.                         && $record[140] != "SOUS OFFRE ACCEPTEE" && $record[140] != "SOUS OFFRE D ACHAT" && $record[139] != "OUI"
  84.                     ){
  85.                         $go true;
  86.                     }
  87.                 }
  88.                 if($go){
  89.                     if(count($record) === 295){
  90.                         for($i $i<= 35 $i++){
  91.                             $record[] = "";
  92.                         }
  93.                     }
  94.                     $tmp $creator->createAd($type$record$agency$identifiant$ref);
  95.                     array_push($ads$tmp);
  96.                 }
  97.                 $ref++;
  98.             }
  99.         }
  100.         return new JsonResponse($ads);
  101.     }
  102.     /**
  103.      * Get file annonces from APIMMO
  104.      *
  105.      * @Route("/apimmo", name="apimmo", methods={"POST"})
  106.      * @OA\Response(
  107.      *     response=200,
  108.      *     description="Return list of JSON objects",
  109.      * )
  110.      * @OA\Tag(name="Immobilier")
  111.      *
  112.      * @param Request $request
  113.      * @param ParameterBagInterface $parameterBag
  114.      * @param HttpClientInterface $client
  115.      * @param Creator $creator
  116.      * @param CreateAgency $creatorAgency
  117.      * @return Response
  118.      * @throws Exception
  119.      * @throws TransportExceptionInterface
  120.      * @throws ClientExceptionInterface
  121.      * @throws RedirectionExceptionInterface
  122.      * @throws ServerExceptionInterface
  123.      */
  124.     public function adAPIMMO(Request $requestParameterBagInterface $parameterBagHttpClientInterface $client,
  125.                           Creator $creatorCreateAgency $creatorAgency): Response
  126.     {
  127.         $type Data::TYPE_APIMMO;
  128.         $dirname $request->get('dirname');
  129.         $identifiant $request->get('identifiant');
  130.         $apiAgency $request->get('apimmo_agency');
  131.         $apiProvider $request->get('apimmo_provider');
  132.         $apiToken $request->get('apimmo_token');
  133.         if(!$dirname || !$identifiant){
  134.             return new JsonResponse(['message' => 'Identification erronée.'], 400);
  135.         }
  136.         // récupération des données de l'api de apimmo
  137.         $response $client->request("GET""https://api.apimo.pro/agencies/" $apiAgency "/properties", [
  138.             'auth_basic' => [$apiProvider$apiToken],
  139.         ]);
  140.         $records json_decode($response->getContent());
  141.         // get agency info
  142.         $agency $this->getAgency($parameterBag$dirname$identifiant$creatorAgency);
  143.         if(!is_array($agency)){
  144.             return $agency;
  145.         }
  146.         // get list of ad
  147.         $ads = []; $ref 0;
  148.         if($records->total_items 0){
  149.             foreach ($records->properties as $record) {
  150.                 $tmp $creator->createAd($type$record$agency$identifiant$ref);
  151.                 array_push($ads$tmp);
  152.                 $ref++;
  153.             }
  154.         }
  155.         return new JsonResponse($ads);
  156.     }
  157.     private function getFile(?UploadedFile $file)
  158.     {
  159.         if(!$file){
  160.             return new JsonResponse(['message' => 'Fichier introuvable.'], 400);
  161.         }
  162.         if($file->getClientOriginalExtension() !== "csv"){
  163.             return new JsonResponse(['message' => 'Fichier invalide.'], 400);
  164.         }
  165.         return $file;
  166.     }
  167.     /**
  168.      * @throws Exception
  169.      */
  170.     private function getAgencyData($fileAgences$dirname$identifiantCreateAgency $creatorAgency): array
  171.     {
  172.         $readerXlsx IOFactory::createReader("Xlsx");
  173.         $spreadsheet $readerXlsx->load($fileAgences);
  174.         $agences $spreadsheet->getActiveSheet()->toArray();
  175.         $agency null// on se base sur les agences du fichier excel, s'il l'agence n'existe pas, on en créé une vierge
  176.         foreach($agences as $a){
  177.             if($agency == null && $a[1] === $dirname){
  178.                 $agency $a;
  179.             }
  180.         }
  181.         return $creatorAgency->create($agency$dirname$identifiant);
  182.     }
  183.     /**
  184.      * @throws Exception
  185.      */
  186.     private function getAgency(ParameterBagInterface $parameterBag$dirname$identifiantCreateAgency $creatorAgency)
  187.     {
  188.         $fileAgences $parameterBag->get('kernel.project_dir') . '/documents/init/agences.xlsx';
  189.         if(!file_exists($fileAgences)){
  190.             return new JsonResponse(['message' => 'Agences introuvable.'], 400);
  191.         }
  192.         return $this->getAgencyData($fileAgences$dirname$identifiant$creatorAgency);
  193.     }
  194. }