src/Controller/ApiChronoController.php line 112

  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\HttpFoundation\Response;
  5. use Symfony\Component\Routing\Annotation\Route;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use App\Repository\CommandeRepository;
  9. use App\Repository\ChronoPrixRepository;
  10. use App\Repository\ProduitRepository;
  11. use App\Entity\Pays;
  12. use App\Entity\TarifEuropeClassic;
  13. use App\Entity\TarifMondeExpress;
  14. use App\Entity\TarifFranceMetropolitaine;
  15. use App\Repository\TarifEuropeClassicRepository;
  16. use App\Repository\TarifMondeExpressRepository;
  17. use App\Repository\TarifFranceMetropolitaineRepository;
  18. #[Route('/api'name'api_')]
  19. class ApiChronoController extends AbstractController
  20. {
  21.     #[Route('/chrono/get/{codePostal}/{ville}'name'_chrono')]
  22.     public function index($codePostal$ville): Response
  23.     {
  24.         //$user = $this->getUser();
  25.         //$getCodePostal = $user->getAdresseLivraison()->getCodePostal();
  26.         //$getVille = $user->getAdresseLivraison()->getVille();
  27.         
  28.        // Récupérer les point relais de Chronopost par rapport à l'adresse de l'utilisateur
  29.         $accountNumber '19869502';
  30.         //$contrat = 'Contrat TEST';
  31.         $password '255562';
  32.         $client = new \SoapClient('https://www.chronopost.fr/recherchebt-ws-cxf/PointRelaisServiceWS?wsdl', array('trace' => 1));
  33.         
  34.          // Paramètres de recherche pour les points relais
  35.          $params = array(
  36.             'accountNumber' => $accountNumber,
  37.             'password'  => $password,
  38.             'zipCode' => $codePostal// Code postal
  39.             'city' => $ville// Ville
  40.             'countryCode' => 'FR'// Code pays (ISO 3166-1 alpha-2)
  41.             'type' => 'P'// Type de point relais (A = tous les points relais, B = points relais Chronopost, C = points relais Chronopost Express) P = point relais
  42.             'productCode' => '04'// Code produit (01 = Chrono 13, 02 = Chrono 18, 03 = Chrono Relais, 04 = Chrono Classic)
  43.             'service'            => 'T'// Type de service (T = tous les services, D = Chrono 13, R = Chrono 18, S = Chrono Relais, L = Chrono Classic)
  44.             'weight'             => 2000// Poids du colis (en grammes)
  45.             'shippingDate'       => date('d/m/Y'), // Date d'expédition (format : jj/mm/aaaa)
  46.             'maxPointChronopost' => 5// Nombre maximum de points relais Chronopost
  47.             'maxDistanceSearch'  => 10000// Distance de recherche (en mètres)
  48.             'holidayTolerant'    => 1// Tolerance aux jours fériés (0 = non, 1 = oui)
  49.         );
  50.         
  51.         try {
  52.             $response $client->recherchePointChronopostInter($params);
  53.             // Récupération des points relais
  54.             $data $response->return->listePointRelais;
  55.             $getPointRelais = [];
  56.             foreach ($data as $key => $pointRelais) {
  57.                 if ($pointRelais->actif){
  58.                     $getPointRelais[$key]['adresse'] = $pointRelais->adresse1;
  59.                     $getPointRelais[$key]['code_pays'] = $pointRelais->codePays;
  60.                     $getPointRelais[$key]['code_postal'] = $pointRelais->codePostal;
  61.                     $getPointRelais[$key]['latitude'] = $pointRelais->coordGeolocalisationLatitude;
  62.                     $getPointRelais[$key]['longitude'] = $pointRelais->coordGeolocalisationLongitude;
  63.                     $getPointRelais[$key]['distance'] = $pointRelais->distanceEnMetre;
  64.                     $getPointRelais[$key]['identifiant'] = $pointRelais->identifiant;
  65.                     $getPointRelais[$key]['localite'] = $pointRelais->localite;
  66.                     $getPointRelais[$key]['nom'] = $pointRelais->nom;
  67.                     $getPointRelais[$key]['urlGoogleMaps'] = $pointRelais->urlGoogleMaps;
  68.                     $getPointRelais[$key]['liste_horaires'] = $pointRelais->listeHoraireOuverture;
  69.                 }
  70.             };
  71.             
  72.         } catch (\SoapFault $e) {
  73.             // Gestion des erreurs
  74.             echo "Erreur : " $e->getMessage();
  75.         }
  76.     
  77.         return $this->json([
  78.             'message' => ' get chrono relais',
  79.             'data' => $getPointRelais,
  80.         ], 200);
  81.     }
  82.     #[Route('/chrono/price/{produit}/{quantite}'name'_chrono_price')]
  83.     public function chronoPrice(string $produitint $quantiteChronoPrixRepository $ChronoPrixRepository): Response
  84.     {
  85.         $getPrice $ChronoPrixRepository->getPrix($quantite$produit);
  86.         return $this->json([
  87.             'message' => ' get chrono price',
  88.             'data' => $getPrice,
  89.             'test' => $quantite,
  90.             'test2' => $produit,
  91.         ], 200);
  92.     }
  93.     #[Route('/chrono/poids/{produit}/{quantite}'name'_chrono_price_poids')]
  94.     public function chronoPricePays(string $produitint $quantite,ProduitRepository $produitRepository ): Response
  95.     {
  96.         $produit $produitRepository->findOneBy(['nom' => $produit]);
  97.         if (!$produit) {
  98.             return $this->json([
  99.                 'message' => 'Produit non trouvé',
  100.             ], 404);
  101.         }
  102.     
  103.         $poids $produit->getPoids();
  104.     
  105.         $poidsTotal $poids $quantite;
  106.     
  107.         return $this->json([
  108.             'message' => 'Poids du produit récupéré avec succès',
  109.             'data' => [
  110.                 'poids' => $poids,
  111.                 'poidsTotal' => $poidsTotal,
  112.             ],
  113.         ], 200);
  114.     }
  115.     #[Route('/chrono/prix/{poids}/{pays}'name'chrono_prix_poids_pays')]
  116.     public function chronoPrixPoidsPays(float $poidsstring $paysEntityManagerInterface $em): Response
  117.     {
  118.         // Convertir 20Kg en gramme
  119.         $limitePoidsRelais 20000// 20kg * 1000
  120.         
  121.         // Initialisation des variables de prix
  122.         $prixLivraisonMaison null;
  123.         $prixLivraisonRelais null;
  124.     
  125.         if (strtolower($pays) === 'france') {
  126.             $tarifFranceRepository $em->getRepository(TarifFranceMetropolitaine::class);
  127.             // Convertir le poids en grammes en kilogrammes pour la comparaison dans la méthode findTarifByPoids
  128.             $poidsEnKilogrammes $poids 1000;
  129.         
  130.             // Recherche du tarif pour la livraison en relais si le poids est dans la limite
  131.             if ($poids <= $limitePoidsRelais) {
  132.                 $tarifRelais $tarifFranceRepository->findTarifByPoids($poidsEnKilogrammes'CRELAIS');
  133.                 $prixLivraisonRelais $tarifRelais !== null $tarifRelais null;
  134.             }
  135.             
  136.             // Recherche du tarif pour la livraison à domicile
  137.             $tarifDomicile $tarifFranceRepository->findTarifByPoids($poidsEnKilogrammes'C13');
  138.             $prixLivraisonMaison $tarifDomicile !== null $tarifDomicile null;
  139.         
  140.     
  141.         
  142.         } else {
  143.             $paysEntity $em->getRepository(Pays::class)->findOneBy(['nom' => strtoupper($pays)]);
  144.             if ($paysEntity) {
  145.                 $zone $paysEntity->getZone();
  146.                 if ($zone >= && $zone <= 4) {
  147.                     $tarifRepository $em->getRepository(TarifEuropeClassic::class);
  148.                 } elseif ($zone >= && $zone <= 9) {
  149.                     $tarifRepository $em->getRepository(TarifMondeExpress::class);
  150.                 } else {
  151.                     // Gestion des zones non couvertes
  152.                     $tarifRepository null;
  153.                 }
  154.     
  155.                 if ($tarifRepository) {
  156.                     $prixLivraisonMaison $tarifRepository->findTarifByPoids($zone$poids);
  157.                 }
  158.             }
  159.         }
  160.     
  161.         return $this->json([
  162.             'message' => 'Prix de livraison basé sur le poids et le pays',
  163.             'data' => [
  164.                 'poids' => $poids,
  165.                 'pays' => $pays,
  166.                 'prixLivraisonMaison' => $prixLivraisonMaison,
  167.                 'prixLivraisonRelais' => $prixLivraisonRelais,
  168.             ],
  169.         ], 200);
  170.     }   
  171. }