<?php
namespace App\Controller;
use App\Entity\CarrierZone;
use App\Repository\CarrierRepository;
use App\Repository\CarrierZoneRepository;
use App\Repository\PriceGridRepository;
use App\Repository\RangeWeightRepository;
use App\Repository\InvoiceDetailRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class ApiController extends AbstractController
{
#[Route('/api/get_range_price', name: 'api_get_range_price',methods : "POST")]
public function index(
Request $request,
RangeWeightRepository $rangeWeightRepo,
CarrierZoneRepository $carrierZoneRepo,
PriceGridRepository $priceGridRepo,
CarrierRepository $carrierRepository,
): Response
{
$data = json_decode(
$request->getContent()
);
$carrier = $carrierRepository->find($data->id_carrier);
$carrierType = $carrier->getCarrierType();
if(isset($data->cr_inter_moyenne) && $data->cr_inter_moyenne){
$rangeWeight = $rangeWeightRepo->findAverageByCarrierWeightZipDate($data->id_carrier, $data->weight, $data->date);
if(($data->id_carrier == 1 || $carrierType->getId() == 3) && $data->weight > 30)
$rangeWeight = $rangeWeightRepo->findAverageByCarrierWeightZipDate($data->id_carrier, ($data->weight > 30 ? 30 : $data->weight), $data->date);
}
else{
$rangeWeight = $rangeWeightRepo->findOneByCarrierWeightZipDate($data->id_carrier, $data->weight, $data->zipcode, $data->date);
if(($data->id_carrier == 1 || $carrierType->getId() == 3) && $data->weight > 30)
$rangeWeight = $rangeWeightRepo->findOneByCarrierWeightZipDate($data->id_carrier, ($data->weight > 30 ? 30 : $data->weight), $data->zipcode, $data->date);
}
if($rangeWeight){
$priceGrid = $priceGridRepo->find($rangeWeight['price_grid_id']);
if($data->id_carrier == 1){
if($data->weight > 30)
$rangeWeight['price'] = round($rangeWeight['price'] + ((int)($data->weight - 29.001) * $priceGrid->getOutOfRange()), 2);
$rangeWeight['price'] = $rangeWeight['price'] * (1 + $data->surcharge / 100);
if(substr($data->zipcode,0 ,2) == '20' && strlen($data->zipcode) == 5){
$rangeWeight['price'] += $priceGrid->getLivraisonCorse();
}
foreach($priceGrid->getCarrierZoneEloignee()->getZipZones() as $zipZone){
if($data->zipcode == $zipZone->getZipcode()){
$rangeWeight['price'] += $priceGrid->getZoneEloignee();
}
}
}
elseif(in_array($data->id_carrier, [3])){
$zone_difficile = $carrierZoneRepo->find(28);
$zone_saisonniere = $carrierZoneRepo->find(35);
$zone_parisienne = $carrierZoneRepo->find(32);
if($data->weight > 99)
$rangeWeight['price'] = $rangeWeight['price'] * (ceil($data->weight / 10) / 10);
$rangeWeight['price'] = $rangeWeight['price'] * (1 + $data->surcharge / 100);
$rangeWeight['price'] += $priceGrid->getSurete();
if($this->checkZoneDifficile($zone_difficile, $data->zipcode))
$rangeWeight['price'] += (float)$priceGrid->getIlesMontagnes();
if($this->checkGeodisParis($zone_parisienne, substr($data->zipcode, 0, 2)))
$rangeWeight['price'] += (float)$priceGrid->getGeodisParis();
if($this->checkSaison($zone_saisonniere, $data->zipcode, (int)(str_replace('-', '', substr($data->date, 5)))))
$rangeWeight['price'] += $rangeWeight['price'] * (float)$priceGrid->getLivraisonSaison() / 100;
if(substr($data->zipcode, 0, 2) == 20)
$rangeWeight['price'] += (float)$priceGrid->getLivraisonCorse();
if(isset($data->particulier) && $data->particulier)
$rangeWeight['price'] += (float)$priceGrid->getOnDemand();
}
elseif($data->id_carrier == 6){//Schenker
$zipCodes = array_column($carrierZoneRepo->findZipCodeByIdZone(43), 'zipcode');
$zipCodesUrbaine = array_column($carrierZoneRepo->findZipCodeByIdZone(28), 'zipcode');
$date_begin = date_create(date('Y') . '-06-01');
$date_end = date_create(date('Y') . '-08-31');
$date_begin_jo = date_create('2024-07-01');
$date_end_jo = date_create('2024-09-15');
$date = date_create($data->date);
if(in_array($data->zipcode, $zipCodes) && in_array($data->inseecode, $zipCodes))
$rangeWeight = $rangeWeightRepo->findOneByCarrierWeightZipDateZESchenker($data->id_carrier, $data->weight, $data->zipcode, $data->date);
if($data->weight > 100 && $data->weight < 1000){
$arrondi_weight = ceil($data->weight / 10);
$rangeWeight['price'] = $rangeWeight['price'] * $arrondi_weight / 10;
}
elseif($data->weight >= 1000){
$arrondi_weight = ceil($data->weight / 10);
$rangeWeight['price'] = $rangeWeight['price'] * 50 * $arrondi_weight / 100;
}
if($data->particulier)
$rangeWeight['price'] += $priceGrid->getLivraisonParticulier();
if(in_array($data->zipcode, $zipCodesUrbaine))
$rangeWeight['price'] += $priceGrid->getZonesUrbaines();
if(in_array(substr($data->zipcode, 0, 2), [75, 77, 78, 91, 92, 93, 94, 95]))
$rangeWeight['price'] += $priceGrid->getLivraisonParis();
if(in_array($data->zipcode, $zipCodes) && in_array($data->inseecode, $zipCodes))
$rangeWeight['price'] += $priceGrid->getZoneEloignee();
if($date >= $date_begin && $date <= $date_end)
$rangeWeight['price'] = round($rangeWeight['price'] * (1 + ( $priceGrid->getLivraisonSaisonniere() / 100)), 2);
if($data->express)
$rangeWeight['price'] = round($rangeWeight['price'] * (1 + ( $priceGrid->getSchenkerExpress() / 100)), 2);
$rangeWeight['price'] = round($rangeWeight['price'] + $priceGrid->getSchenkerSurete(), 2);
$rangeWeight['price'] = $rangeWeight['price'] * (1 + $data->surcharge / 100);
if($date >= $date_begin_jo && $date <= $date_end_jo && in_array(substr($data->zipcode, 0, 2), [75, 92, 93])){
$rangeWeight['price'] += 19.81;
}
}
elseif(in_array($data->id_carrier, [7, 8, 9])){//DPD
$rangeWeight['price'] = round($rangeWeight['price'] + $priceGrid->getDpdSurete() + $priceGrid->getDpdContibutionLogistique(), 2);
$rangeWeight['price'] = $rangeWeight['price'] * (1 + $data->surcharge / 100);
}
elseif(in_array($data->id_carrier, [10, 11, 44, 45])){//DPD INTER
$rangeWeight['price'] = round($rangeWeight['price'] + $priceGrid->getDpdSurete() + $priceGrid->getDpdContibutionLogistique(), 2);
$rangeWeight['price'] = $rangeWeight['price'] * (1 + $data->surcharge / 100);
}
elseif($carrierType->getId() == 3){//FEDEX INTER
if((float)$data->weight > 70.99)
$rangeWeight['price'] = round($rangeWeight['price'] + ((int)($data->weight - 70.99) * $priceGrid->getOutOfRange()), 2);
if(isset($data->width) && isset($data->height) && isset($data->depth)){
if((float)$data->width > 121 && ((float)$data->depth > 76 || (float)$data->height > 76) ||
((float)$data->width + ((float)$data->height * 2) + ((float)$data->depth * 2)) > 266){
$rangeWeight['price'] += $priceGrid->getFedexLivraisonNonConvoyable();
}
if((float)$data->width > 243 ||
((float)$data->width + ((float)$data->height * 2) + ((float)$data->depth * 2)) > 330){
$rangeWeight['price'] += $priceGrid->getFedexHorsNorme();
}
}
$rangeWeight['price'] = $rangeWeight['price'] * (1 + $data->surcharge / 100);
}
elseif($carrierType->getId() == 4){//SCHENKER INTER
if($data->weight > 100 && $data->weight < 1000){
$arrondi_weight = ceil($data->weight / 10);
$rangeWeight['price'] = $rangeWeight['price'] * $arrondi_weight / 10;
}
elseif($data->weight >= 1000){
$arrondi_weight = ceil($data->weight / 10);
$rangeWeight['price'] = $rangeWeight['price'] * 50 * $arrondi_weight / 100;
}
if($data->id_carrier == 17)
$rangeWeight['price'] = $rangeWeight['price'] * (1 + $priceGrid->getSchenkerInterMarpol() / 100);
$rangeWeight['price'] += $priceGrid->getSchenkerInterSurete();
$rangeWeight['price'] = $rangeWeight['price'] * (1 + $data->surcharge / 100);
$rangeWeight['price'] += $priceGrid->getSchenkerInterContibutionEnergetique();
}
return new JsonResponse(['rangeweight' => [
'price' => round($rangeWeight['price'], 2), 'date' => substr($data->date, 5)
]]);
}
else{
return new JsonResponse(['rangeweight' => false]);
}
}
#[Route('/api/get_price_by_tracking', name: 'api_get_price_by_tracking', methods: ['POST'])]
public function indexPriceByTracking(
Request $request,
InvoiceDetailRepository $invoice_detail_repository
): JsonResponse
{
$data = json_decode($request->getContent(), true);
if (!isset($data['tracking'])) {
return new JsonResponse(['error' => 'Tracking value is required'], 400);
}
$invoice_details = $invoice_detail_repository->findBy(['tracking' => $data['tracking']]);
if (!empty($invoice_details)) {
$invoice_detail = $invoice_details[0];
return new JsonResponse(['price' => round($invoice_detail->getOptionsPrice() + $invoice_detail->getPrice() , 2)]);
}
return new JsonResponse(['price' => false]);
}
private function checkZoneDifficile(CarrierZone $zone_difficile, $zipcode){
$response = false;
$zips = $zone_difficile->getZipZones();
foreach($zips as $zip){
if($zip == $zipcode)
$response = true;
}
return $response;
}
private function checkGeodisParis(CarrierZone $zone_difficile, $zipcode){
$response = false;
$zips = $zone_difficile->getZipZones();
foreach($zips as $zip){
if($zip == $zipcode)
$response = true;
}
return $response;
}
private function checkSaison(CarrierZone $zone_difficile, $zipcode, $date){
$response = false;
if($date >= 501 && $date <= 831){
$zips = $zone_difficile->getZipZones();
foreach($zips as $zip){
if($zip == $zipcode)
$response = true;
}
}
return $response;
}
}