src/Flexy/ShopBundle/Service/FlexyShopProvider.php line 1000
<?phpnamespace App\Flexy\ShopBundle\Service;use App\Entity\Settings;use App\Flexy\ShopBundle\Entity\Customer\Customer;use App\Flexy\ShopBundle\Entity\Order\Order;use App\Flexy\ShopBundle\Entity\Promotion\Coupon;use DateTime;use Doctrine\ORM\EntityManagerInterface;use Symfony\Component\HttpFoundation\RequestStack;class FlexyShopProvider{private $messages = [];public function __construct(private readonly EntityManagerInterface $em,private readonly RequestStack $requestStack,private readonly FlexyShippingProvider $flexyShippingProvider){}public function useCoupon(Order $order,$codeCoupon = null){$coupon = $this->em->getRepository(Coupon::class)->findOneBy(["code"=>$codeCoupon]);$currentDate = new \DateTime();$isCouponOkey=false;$result = ["coupon"=>$coupon,"type"=>"applyCoupon","message"=>"Aucun coupon trouvé","messageHTML"=>'<div class="alert alert-warning" >Aucun coupon trouvé !</div>'];if($coupon){if(!$order->getCustomer()){$result = ["coupon"=>$coupon,"type"=>"applyCoupon","message"=>"Merci de choisir un client","messageHTML"=>'<div class="alert alert-warning" >Merci de choisir un client !</div>'];}if($coupon->getType() == "once_eachuser"){if(count($coupon->getAllowedCustomers()) > 0){}if($coupon->getAllowedCustomers()->contains($order->getCustomer())){$isCouponOkey = true;}}else{$isCouponOkey = true;}if(( $coupon->getUsageLimit() != null and count($coupon->getOrders()) < $coupon->getUsageLimit() ) or( $coupon->getEndAt() != null and $currentDate < $coupon->getEndAt() )){if($isCouponOkey){$result=["coupon"=>$coupon,"type"=>"applyCoupon","message"=>"Coupon Appliqué","messageHTML"=>'<div class="alert alert-success" >Code coupon Appliqué !</div>'];$order->setCoupon($coupon);}}else{$result=["coupon"=>null,"type"=>"applyCoupon","message"=>"Coupon exipré","messageHTML"=>'<div class="alert alert-danger" >Code coupon expiré !</div>'];}}return $result;}public function getOrderExtraInfosOLD(Order $order,$initDates = false){$settings = $this->em->getRepository(Settings::class)->findOneBy(["code"=>"main"]);$excludeDates = array_column($settings->getExcludeDates(), 'date');$daysInFrench = ["Monday"=>"Lundi","Tuesday"=>"Mardi","Wednesday"=>"Mercredi","Thursday"=>"Jeudi","Friday"=>"Vendredi","Saturday"=>"Samedi","Sunday"=>"Dimanche",];if($order->getStartProcessingAt() and $order->getShippingMethod()){//$processingDuration = $order->getShippingMethod()->getProcessingDuration();//$preparationDuration = $order->getShippingMethod()->getPreparationDuration();//$shippingDurationDuration = $order->getShippingMethod()->getShippingDuration();$currentDateTime = new \DateTime();$shippingDurationToMinutes = $order->getShippingMethod()->getShippingDuration() * 60;$preparationDurationToMinutes = $order->getShippingMethod()->getPreparationDuration() * 60;// NOTE : Check If ShippingMethod or DeliveryType Changed//dd($this->requestStack->getSession()->get("shippingMethodId"));if($this->requestStack->getSession()->get("shippingMethodId") != $order->getShippingMethod()->getId() or$this->requestStack->getSession()->get("deliveryType") != $order->getDeliveryType() or$this->requestStack->getSession()->get("orderStartProcessingAt") != $order->getStartProcessingAt()){//$order->setStartProcessingAt(new \DateTime());//dd($deliveryAt_process);}$deliveryAt_process = clone $order->getStartProcessingAt();//if( $order->getStartProcessingAt()->format("Y-m-d") == $currentDateTime->format("Y-m-d") and($order->getStartProcessingAt() < $currentDateTime) ){$deliveryAt_process->modify($currentDateTime->format("H:i"));}if($deliveryAt_process->format("H:i") == "00:00" and $deliveryAt_process->format("d") == $currentDateTime->format("d") ){$deliveryAt_process->modify($currentDateTime->format("H:i"));}if((int)$deliveryAt_process->format("d") > (int)$currentDateTime->format("d") and(int)$deliveryAt_process->format("H") < (int)$settings->getStartWorkAt()->format("H")){$deliveryAt_process->modify($settings->getStartWorkAt()->format("H:i"));}if($deliveryAt_process->format("i") != "00" ){$deliveryAt_process->modify(" + 1 hours ". $deliveryAt_process->format("H").":00");//$deliveryAt_process->modify(" + ".$preparationDurationToMinutes." minutes");}//dd( $deliveryAt_process);//dd($deliveryAt_process);$startDateTimeWorkChecker = clone $deliveryAt_process;$startDateTimeWorkChecker->modify($settings->getStartWorkAt()->format("H:i"));$startDateTimeWorkCheckerNextDay = clone $startDateTimeWorkChecker;$startDateTimeWorkCheckerNextDay->modify("next day ".$settings->getStartWorkAt()->format("H:i"));$endDateTimeWorkChecker = clone $deliveryAt_process;$endDateTimeWorkChecker->modify($settings->getEndWorkAt()->format("H:i"));if((int)$deliveryAt_process->format("H") >= 0 and(int)$deliveryAt_process->format("H") < (int)$settings->getEndWorkAt()->format("H") and(int)$deliveryAt_process->format("H") < (int)$settings->getStartWorkAt()->format("H")){$deliveryAt_process->modify($settings->getStartWorkAt()->format("H:i"));}if(($order->getDeliveryType() == "collecte-and-delivery" || $order->getDeliveryType() == "collecte")){$deliveryAt_process->modify(" + " . $order->getShippingMethod()->getPreparationDuration() . " hours");}$deliveryAt_process_max = clone $deliveryAt_process;$deliveryAt_process_max->modify(" + " . $shippingDurationToMinutes . " minutes");if($deliveryAt_process_max >= $endDateTimeWorkChecker and $deliveryAt_process_max < $startDateTimeWorkCheckerNextDay ){$deliveryAt_process = clone $startDateTimeWorkCheckerNextDay;if(($order->getDeliveryType() == "collecte-and-delivery" || $order->getDeliveryType() == "collecte")){$deliveryAt_process->modify(" + " . $order->getShippingMethod()->getPreparationDuration() . " hours");}$deliveryAt_process_max = clone $deliveryAt_process;$deliveryAt_process_max->modify(" + " . $shippingDurationToMinutes . " minutes");}while ( in_array($deliveryAt_process->format("l"),$settings->getExcludeDays()) or in_array($deliveryAt_process->format("Y-m-d"),$excludeDates) ) {$keyExcludedDateProccessing = array_search($deliveryAt_process->format("Y-m-d"), array_column($settings->getExcludeDates(), 'date'));$excludedDateProccessing = $settings->getExcludeDates()[$keyExcludedDateProccessing];$keyExcludedDateShipping = array_search($deliveryAt_process->format("Y-m-d"), array_column($settings->getExcludeDates(), 'date'));if(in_array($deliveryAt_process->format("l"),$settings->getExcludeDays())){$this->messages[]="<b><i>".$daysInFrench[$deliveryAt_process->format("l")] . "</i></b> Est un jour de repos, Collecte a été décalé pour le jour suivant";}else{$this->messages[]="Date <b><i>".$deliveryAt_process->format("d-m-Y")."</i></b> pour la collecte a été décalé pour le jour suivant, a l'occasion de <b><i>".$excludedDateProccessing["label"]."</i></b>";}$deliveryAt_process->modify("+ 1 day");$deliveryAt_process_max->modify("+ 1 day");}if($order->getDeliveryType() == "on-store" ){while (in_array($deliveryAt_process->format("H"),$settings->getExcludeHours()) ||in_array($deliveryAt_process_max->format("H"),$settings->getExcludeHours())) {$deliveryAt_process->modify("+ 1 Hour");$deliveryAt_process_max->modify("+ 1 Hour");}}$deliveryAt_prep = clone $deliveryAt_process_max;$deliveryAt_prep->modify("+ ".$order->getShippingMethod()->getProcessingDuration()." hours");// Note : Add preperationDuration after the ProcessingDuration exp : Classic add 4h after 48h, Express add 2h after 7h// if($order->getDeliveryType() == "collecte-and-delivery" || $order->getDeliveryType() == "delivery"){// $totalHoursShipping = $order->getShippingMethod()->getProcessingDuration() + $order->getShippingMethod()->getPreparationDuration();// $deliveryAt_prep->modify("+ ".$totalHoursShipping." hours");// }$intervalHoursCounter = $order->getShippingMethod()->getProcessingDuration();$intervalDatesEndWork=0;$differenceHours=0;$deliveryAt_shipping = clone $deliveryAt_prep;//dd($deliveryAt_shipping);if((int)$deliveryAt_process->format("d") < (int)$deliveryAt_shipping->format("d")){$deliveryAt_shipping->modify($deliveryAt_process->format("H:i"));}if($order->getDeliveryType() == "collecte-and-delivery" || $order->getDeliveryType() == "delivery" ){//$deliveryAt_shipping->modify(" + " . $order->getShippingMethod()->getPreparationDuration() . " hours");}$deliveryAt_shipping_max = clone $deliveryAt_shipping;$deliveryAt_shipping_max->modify(" + " . $shippingDurationToMinutes . " minutes");$deliveryAt_shipping_max_checker = clone $deliveryAt_shipping_max;$deliveryAt_shipping_max_checker->modify($endDateTimeWorkChecker->format("H:i"));$startDateTimeWorkCheckerLastDay = clone $deliveryAt_shipping_max;$startDateTimeWorkCheckerLastDay->modify("next day ".$settings->getStartWorkAt()->format("H:i"));$endDateTimeWorkCheckerLastDay = clone $deliveryAt_shipping_max;$endDateTimeWorkCheckerLastDay->modify($settings->getEndWorkAt()->format("H:i"));//dd($deliveryAt_shipping_max);if(($deliveryAt_shipping_max > $endDateTimeWorkCheckerLastDay and $deliveryAt_shipping_max < $startDateTimeWorkCheckerLastDay) or($deliveryAt_shipping_max->format("d")==$startDateTimeWorkCheckerLastDay->format("d") )){$deliveryAt_shipping = clone $startDateTimeWorkCheckerLastDay;//$deliveryAt_shipping->modify(" + ".$differenceHours." hours");}// add interval rest$counterHours = 0;$currentHour = (int)$deliveryAt_process_max->format("H");$limitHour = (int)$settings->getEndWorkAt()->format("H");while($currentHour < $limitHour){$counterHours =$counterHours + 1;$currentHour = $currentHour + 1;}// For example Express shipping 7hif($intervalHoursCounter > $counterHours and $intervalHoursCounter < 24){$deliveryAt_shipping = clone $deliveryAt_process_max;$deliveryAt_shipping->modify("next day ".$settings->getStartWorkAt()->format("H:i"));$difference = $intervalHoursCounter - $counterHours;$deliveryAt_shipping->modify("+ ".$difference." hours");}//dd($counterHours);$deliveryAt_shipping_max = clone $deliveryAt_shipping;$deliveryAt_shipping_max->modify(" + " . $shippingDurationToMinutes . " minutes");//dd($order->getStartDeliveryAt());/*if($order->getStartDeliveryAt()>$deliveryAt_shipping_max){$deliveryAt_shipping->modify($order->getStartDeliveryAt()->format("Y-m-d"));$deliveryAt_shipping_max->modify($order->getStartDeliveryAt()->format("Y-m-d"));}*/while ( in_array($deliveryAt_shipping->format("l"),$settings->getExcludeDays()) or in_array($deliveryAt_shipping->format("Y-m-d"),$excludeDates) ) {$keyExcludedDateShipping = array_search($deliveryAt_shipping->format("Y-m-d"), array_column($settings->getExcludeDates(), 'date'));$excludedDateShipping = $settings->getExcludeDates()[$keyExcludedDateShipping];if(in_array($deliveryAt_shipping->format("l"),$settings->getExcludeDays())){$this->messages[]= "<b><i>".$daysInFrench[$deliveryAt_shipping->format("l")] . "</i></b> Est un jour de repos, Livraison a été décalé pour le jour suivant";}else{$this->messages[]="Date <b><i>".$deliveryAt_shipping->format("d-m-Y")."</i></b> pour la livraison a été décalé pour le jour suivant, a l'occasion de <b><i>".$excludedDateShipping["label"]."</i></b>";}$deliveryAt_shipping->modify("+ 1 day");$deliveryAt_shipping_max->modify("+ 1 day");}if($order->getDeliveryType() == "on-store" ){while (in_array($deliveryAt_shipping->format("H"),$settings->getExcludeHours()) ||in_array($deliveryAt_shipping_max->format("H"),$settings->getExcludeHours())) {$deliveryAt_shipping->modify("+ 1 Hour");$deliveryAt_shipping_max->modify("+ 1 Hour");}}$interval = $deliveryAt_shipping->diff($deliveryAt_process);$intevalHours = $interval->h ;$intevalDaysToHours = $interval->d * 24;$totalIntervalHours = $intevalHours + $intevalDaysToHours;if($totalIntervalHours > $order->getShippingMethod()->getProcessingDuration() and $totalIntervalHours > 24){$deliveryAt_shipping->modify($settings->getStartWorkAt()->format("H:i"));}$ifDelayMoreThanEnough = false;/*** BySamir Test Init Time Before*/if($deliveryAt_process < $order->getStartProcessingAt()){$deliveryAt_process = clone $order->getStartProcessingAt();$deliveryAt_process_max = clone $deliveryAt_process;$deliveryAt_process_max->modify(" + " . $shippingDurationToMinutes . " minutes");}if($this->requestStack->getSession()->get("orderStartProcessingAt") ){//dd($this->requestStack->getSession()->get("orderStartProcessingAt"));if($deliveryAt_shipping < $order->getStartDeliveryAt() and$this->requestStack->getSession()->get("orderStartProcessingAt") == $order->getStartProcessingAt()){$deliveryAt_shipping = clone $order->getStartDeliveryAt();$deliveryAt_shipping_max = clone $deliveryAt_shipping;$deliveryAt_shipping_max->modify(" + " . $shippingDurationToMinutes . " minutes");}}$arrayCollectSelection = [];$arrayCollectSelectionHTML = "";$deliveryAt_processChoicesFrom = clone $deliveryAt_process;//dd($deliveryAt_process);if((int)$deliveryAt_process->format("d") > (int)$currentDateTime->format("d")and ($order->getDeliveryType() != "collecte-and-delivery" and $order->getDeliveryType() != "collecte")){$deliveryAt_processChoicesFrom->modify($settings->getStartWorkAt()->format("H:i"));}$deliveryAt_processChoicesTo = clone $deliveryAt_processChoicesFrom;while((int)$deliveryAt_processChoicesFrom->format("H") < (int)$settings->getEndWorkAt()->format("H")){$deliveryAt_processChoicesTo = clone $deliveryAt_processChoicesFrom;if($shippingDurationToMinutes > 60){$stepDurationByMinutes = 60;}else{$stepDurationByMinutes = $shippingDurationToMinutes;}$deliveryAt_processChoicesTo->modify(" + ".$stepDurationByMinutes." minutes");if((int)$deliveryAt_processChoicesTo->format("Hi") > (int)$settings->getEndWorkAt()->format("Hi")){break;}if(in_array($deliveryAt_processChoicesFrom->format("H"),$settings->getExcludeHours())){$deliveryAt_processChoicesFrom = clone $deliveryAt_processChoicesTo;//dd($deliveryAt_processChoicesFrom);continue;}if($shippingDurationToMinutes > 60){$deliveryAt_processChoicesTo->modify(" + ".$stepDurationByMinutes." minutes");}if((int)$deliveryAt_processChoicesTo->format("Hi") > (int)$settings->getEndWorkAt()->format("Hi")){break;}$arrayCollectSelection[]=["from"=>$deliveryAt_processChoicesFrom->format("H:i"),"to"=>$deliveryAt_processChoicesTo->format("H:i"),"label"=>$deliveryAt_processChoicesFrom->format("H:i")." - ".$deliveryAt_processChoicesTo->format("H:i"),];$arrayCollectSelectionHTML= $arrayCollectSelectionHTML . "<option value='".$deliveryAt_processChoicesFrom->format("H:i")."'>".$deliveryAt_processChoicesFrom->format("H:i")." - ".$deliveryAt_processChoicesTo->format("H:i")."</option>";$deliveryAt_processChoicesFrom = clone $deliveryAt_processChoicesTo;}//$startDeliveryAt = new \DateTime($order->getDeliveryAt());// dd();//dd($deliveryAt_prep);$arrayShippingSelection = [];$arrayShippingSelectionHTML = "";$deliveryAt_shippingChoicesFrom = clone $deliveryAt_shipping;//dd($deliveryAt_shipping);if((int)$deliveryAt_prep->format("md") < (int)$deliveryAt_shipping->format("md") ){$deliveryAt_shippingChoicesFrom->modify($settings->getStartWorkAt()->format("H:i"));}//dd($deliveryAt_shippingChoicesFrom);$deliveryAt_shippingChoicesTo = clone $deliveryAt_shippingChoicesFrom;while((int)$deliveryAt_shippingChoicesFrom->format("Hi") < (int)$settings->getEndWorkAt()->format("Hi")){$deliveryAt_shippingChoicesTo = clone $deliveryAt_shippingChoicesFrom;if($shippingDurationToMinutes > 60){$stepDurationByMinutes = 60;}else{$stepDurationByMinutes = $shippingDurationToMinutes;}$deliveryAt_shippingChoicesTo->modify(" + ".$stepDurationByMinutes." minutes");if((int)$deliveryAt_shippingChoicesTo->format("Hi") > (int)$settings->getEndWorkAt()->format("Hi")){break;}if(in_array($deliveryAt_shippingChoicesFrom->format("H"),$settings->getExcludeHours())){$deliveryAt_shippingChoicesFrom = clone $deliveryAt_shippingChoicesTo;//dd($deliveryAt_shippingChoicesFrom);continue;}if($shippingDurationToMinutes > 60){$deliveryAt_shippingChoicesTo->modify(" + ".$stepDurationByMinutes." minutes");}if((int)$deliveryAt_shippingChoicesTo->format("H") > (int)$settings->getEndWorkAt()->format("H")){break;}$arrayShippingSelection[]=["from"=>$deliveryAt_shippingChoicesFrom->format("H:i"),"to"=>$deliveryAt_shippingChoicesTo->format("H:i"),"label"=>$deliveryAt_shippingChoicesFrom->format("H:i")." - ".$deliveryAt_shippingChoicesTo->format("H:i"),"value"=>$deliveryAt_shippingChoicesFrom->format("H:i"),];$checkIfSelectedOption="";if($order->getStartDeliveryAt()){if($deliveryAt_shippingChoicesFrom->format("H:i") == $order->getStartDeliveryAt()->format("H:i") and$this->requestStack->getSession()->get("orderStartProcessingAt") == $order->getStartProcessingAt()){$checkIfSelectedOption =" selected='selected' ";}}$arrayShippingSelectionHTML = $arrayShippingSelectionHTML . "<option ".$checkIfSelectedOption." value='".$deliveryAt_shippingChoicesFrom->format("H:i")."'>".$deliveryAt_shippingChoicesFrom->format("H:i")." - ".$deliveryAt_shippingChoicesTo->format("H:i")."</option>";$deliveryAt_shippingChoicesFrom = clone $deliveryAt_shippingChoicesTo;}/*** BySamir Test Fix Time After*///dd($deliveryAt_shipping);if($deliveryAt_process < $order->getStartProcessingAt()){$deliveryAt_process = clone $order->getStartProcessingAt();$deliveryAt_process_max = clone $deliveryAt_process;$deliveryAt_process_max->modify(" + " . $shippingDurationToMinutes . " minutes");}if($this->requestStack->getSession()->get("orderStartProcessingAt") ){//dd($this->requestStack->getSession()->get("orderStartProcessingAt"));if($deliveryAt_shipping < $order->getStartDeliveryAt() and$this->requestStack->getSession()->get("orderStartProcessingAt") == $order->getStartProcessingAt()){$deliveryAt_shipping = clone $order->getStartDeliveryAt();$deliveryAt_shipping_max = clone $deliveryAt_shipping;$deliveryAt_shipping_max->modify(" + " . $shippingDurationToMinutes . " minutes");}}$shippingFees = $this->flexyShippingProvider->getFees(null,null,$order);$shippingFees = array_sum($shippingFees);//Remember startProcessingAt,shippingMethodId & deliveryType$this->requestStack->getSession()->set("orderStartProcessingAt",$order->getStartProcessingAt());$this->requestStack->getSession()->set("shippingMethodId",$order->getShippingMethod()->getId());$this->requestStack->getSession()->set("deliveryType",$order->getDeliveryType());$minDateShipping = clone $deliveryAt_prep;$minDateShipping->modify("previous day");$orderInfos = ["differenceHours"=>$differenceHours,"intervalDatesEndWork"=>$intervalDatesEndWork,"shippingMode"=> $order->getShippingMethod()->getName(),"startDateTimeWorkChecker"=> $startDateTimeWorkChecker,"endDateTimeWorkChecker"=> $endDateTimeWorkChecker,"getStartProcessingAt"=> $order->getStartProcessingAt(),"deliveryAt_process"=> $deliveryAt_process,"deliveryAt_process_max"=>$deliveryAt_process_max,"deliveryAt_prep"=>$deliveryAt_prep,"deliveryAt_shipping"=>$deliveryAt_shipping,"deliveryAt_shipping_max"=>$deliveryAt_shipping_max,"dataResponse"=>["minDateShipping"=> $minDateShipping->format("Y-m-d"),"shippingFees"=>$shippingFees,"collectHoursHTML"=>$arrayCollectSelectionHTML,"collectHours"=>$arrayCollectSelection,"shippingHoursHTML"=>$arrayShippingSelectionHTML,"shippingHours"=>$arrayShippingSelection,"collectDate"=>$deliveryAt_process->format("Y-m-d"),"shippingDate"=>$deliveryAt_shipping->format("Y-m-d"),"intervalShipping"=> $shippingDurationToMinutes,"startWorkLimit"=>$settings->getStartWorkAt()->format("H:i"),"endWorkLimit"=>$settings->getEndWorkAt()->format("H:i"),"messages"=>$this->messages]];return $orderInfos;}return [];}public function getOrderExtraInfos(Order $order,$collectDateTimePreview=new \DateTime(),$shippingDateTimePreview=new \DateTime(),$editMode = false){$settings = $this->em->getRepository(Settings::class)->findOneBy(["code"=>"main"]);$preparationDuration = $order->getShippingMethod()->getPreparationDuration() * 60;$processingDuration = $order->getShippingMethod()->getProcessingDuration()* 60;$shippingDuration = $order->getShippingMethod()->getShippingDuration() * 60;$excludeDates = array_column($settings->getExcludeDates(), 'date');$daysInFrench = ["Monday"=>"Lundi","Tuesday"=>"Mardi","Wednesday"=>"Mercredi","Thursday"=>"Jeudi","Friday"=>"Vendredi","Saturday"=>"Samedi","Sunday"=>"Dimanche",];if($order->getStartProcessingAt() and $order->getShippingMethod()){$currentDateTime = new \DateTime();if($editMode){//$currentDateTime = clone $order->getStartProcessingAt();$collectDateTimePreview->modify($order->getStartProcessingAt()->format("Y-m-d"));//$shippingDateTimePreview->modify($order->getStartDeliveryAt()->format("Y-m-d"));}if($currentDateTime->format("i") != "00"){$currentDateTime->modify($currentDateTime->format("H").":00");$currentDateTime->modify("+ 1 hour");}$collectDateTime = clone $collectDateTimePreview;$shippingDateTime = clone $collectDateTimePreview;$todayEndOfTime = clone $collectDateTimePreview;$todayEndOfTime->modify($settings->getEndWorkAt()->format("H:i"));// if($order->getStartProcessingAt()){// if($order->getStartProcessingAt()->format("i") != "00"){// $order->getStartProcessingAt()->modify($currentDateTime->format("H").":00");// $order->getStartProcessingAt()->modify("+ 1 hour");// }// $collectDateTime->modify($order->getStartProcessingAt()->format("H:i"));// }if(($collectDateTime > $todayEndOfTime# Note : Jai mis cette condition pour une raisonand !$editMode)//or ($collectDateTime < $currentDateTime and !$editMode)){$collectDateTime->modify("next day");$shippingDateTime->modify("next day");}$collectDateTime->modify($settings->getStartWorkAt()->format("H:i"));if($collectDateTime < $currentDateTime and !$editMode){$collectDateTime->modify($currentDateTime->format("H:i"));}if( $order->getDeliveryType()=="collecte-and-delivery" || $order->getDeliveryType()=="collecte" ){$collectDateTime->modify(" + ".$preparationDuration." minutes ");}$arrayCollectSlots = [];$arrayShippingSlots = [];$arrayCollectSelectionHTML = null;$arrayShippingSelectionHTML = null ;//$arrayCollectDate["date"] = $collectDateTime->format("Y-m-d");// ### EXCLUDE DATES AND HOURS : START #####$collectDateTime = $this->excludeDatesChecker($collectDateTime);// ### EXCLUDE DATES AND HOURS : END #####$resultCollectSlots = $this->loopStotForCollect($collectDateTime,$currentDateTime,$order,$settings,$editMode);if(count($resultCollectSlots["slots"]) == 0){$collectDateTime->modify("next day");$collectDateTime->modify($settings->getStartWorkAt()->format("H:i"));$resultCollectSlots = $this->loopStotForCollect($collectDateTime,$currentDateTime,$order,$settings,$editMode);}$shippingDateTime->modify($resultCollectSlots["slots"][0]["from"]);$shippingDateTime->modify(" + ".$processingDuration." minutes");if($shippingDateTimePreview){if($shippingDateTimePreview > $shippingDateTime){$shippingDateTime = clone $shippingDateTimePreview;$shippingDateTime->modify($settings->getStartWorkAt()->format("H:i"));}}// ### EXCLUDE DATES AND HOURS : START #####$shippingDateTime = $this->excludeDatesChecker($shippingDateTime,"livraison");// ### EXCLUDE DATES AND HOURS : END #####$resultShippingSlots = $this->loopSlotForShipping($shippingDateTime,$collectDateTimePreview,$order);if(count($resultShippingSlots["slots"]) == 0){$shippingDateTime->modify("next day");$shippingDateTime->modify($settings->getStartWorkAt()->format("H:i"));$resultShippingSlots = $this->loopSlotForShipping($shippingDateTime,$collectDateTimePreview,$order);}$allSlots["collect"]=$resultCollectSlots["slots"];$allSlots["shipping"]=$resultShippingSlots["slots"];$arrayCollectSelectionHTML = $resultCollectSlots["optionsHtml"];$arrayShippingSelectionHTML = $resultShippingSlots["optionsHtml"];$shippingFees = $this->flexyShippingProvider->getFees(null,null,$order);$shippingFees = array_sum($shippingFees);$minShippingDate = $allSlots["shipping"][0]["date"];$orderInfos = ["differenceHours"=>0,"intervalDatesEndWork"=>0,"shippingMode"=> $order->getShippingMethod()->getName(),"startDateTimeWorkChecker"=> new \DateTime(),"endDateTimeWorkChecker"=> new \DateTime(),"getStartProcessingAt"=> $order->getStartProcessingAt(),"deliveryAt_process"=> $collectDateTimePreview,"deliveryAt_process_max"=>$collectDateTimePreview,"deliveryAt_prep"=>new \DateTime(),"deliveryAt_shipping"=>$shippingDateTimePreview,"deliveryAt_shipping_max"=>$allSlots["shipping"][0]["date"],"dataResponse"=>["minDateCollect"=> $collectDateTime->format("Y-m-d") ,"minDateShipping"=> $collectDateTime->format("Y-m-d") ,"shippingFees"=>$shippingFees,"collectHoursHTML"=>$arrayCollectSelectionHTML,"collectHours"=>$allSlots["collect"],"shippingHoursHTML"=>$arrayShippingSelectionHTML,"shippingHours"=>$allSlots["shipping"],"collectDate"=>$collectDateTime->format("Y-m-d"),"shippingDate"=>$allSlots["shipping"][0]["date"]->format("Y-m-d"),"intervalShipping"=> 0,"startWorkLimit"=>$settings->getStartWorkAt()->format("H:i"),"endWorkLimit"=>$settings->getEndWorkAt()->format("H:i"),"messages"=>$this->messages]];return $orderInfos;}return [];}public function getCustomerById($id){return $this->em->getRepository(Customer::class)->find((int)$id);}public function getOrderById($id){return $this->em->getRepository(Order::class)->find((int)$id);}// Functionsfunction time_diff_in_minutes($start_time, $end_time) {$start_timestamp = strtotime($start_time);$end_timestamp = strtotime($end_time);$diff_seconds = abs($end_timestamp - $start_timestamp);$diff_minutes = round($diff_seconds / 60);return $diff_minutes;}function date_diff_in_minutes($date1, $date2) {$datetime1 = new DateTime($date1);$datetime2 = new DateTime($date2);$interval = $datetime1->diff($datetime2);$minutes = $interval->i + ($interval->h * 60) + ($interval->d * 24 * 60);return $minutes;}function is_between_night($date_time_str, $start_time_str, $end_time_str) {$date_time = new DateTime($date_time_str);// Get the time as a string in the format "H:i"$time_str = $date_time->format("H:i");// Get the date as a string in the format "Y-m-d"$date_str = $date_time->format("Y-m-d");// Get the datetime for the start time of the same day$start_datetime_str = $date_str . " " . $start_time_str;$start_datetime = new DateTime($start_datetime_str);// Get the datetime for the end time of the same day$end_datetime_str = $date_str . " " . $end_time_str;$end_datetime = new DateTime($end_datetime_str);// Adjust the start and end dates if the start time is after the end timeif ($start_datetime >= $end_datetime) {if ($time_str >= $start_time_str) {$start_datetime->modify("-1 day");} else {$end_datetime->modify("+1 day");}}// Check if the input datetime is between the start and end datetimesreturn $date_time >= $start_datetime && $date_time < $end_datetime;}function isDaytime($time) {$hour = (int) date('H', strtotime($time));return ($hour >= 8 && $hour < 20);}function loopStotForCollect ($collectDateTime,$currentDateTime,$order,$settings,$editMode=false){$preparationDuration = $order->getShippingMethod()->getPreparationDuration() * 60;$processingDuration = $order->getShippingMethod()->getProcessingDuration()* 60;$shippingDuration = $order->getShippingMethod()->getShippingDuration() * 60;$arrayCollectSelectionHTML = null;$arrayCollectSlots = [];while((int)$collectDateTime->format("H") < (int)$settings->getEndWorkAt()->format("H") ){while (in_array($collectDateTime->format("H"),$settings->getExcludeHours()) ||in_array($collectDateTime->format("H"),$settings->getExcludeHours())) {$collectDateTime->modify("+ 1 Hour");$collectDateTime->modify("+ 1 Hour");}$collectFrom = $collectDateTime->format("H:i");if($collectDateTime < $currentDateTime and !$editMode){$collectDateTime->modify(" + ".$shippingDuration." minutes ");continue;}$collectDateTime->modify(" + ".$shippingDuration." minutes ");$collectTo = $collectDateTime->format("H:i");$collectStotLabel = $collectFrom." - ".$collectTo;$arrayCollectSelectionHTML= $arrayCollectSelectionHTML . "<option value='".$collectFrom."'>".$collectFrom." - ".$collectTo."</option>";$arrayCollectSlots[] = ["label"=>$collectStotLabel,"from"=>$collectFrom,"to"=>$collectTo,"value"=>$collectFrom,"date"=>new \DateTime($collectDateTime->format("Y-m-d") . " ".$collectFrom),];}return ["optionsHtml"=>$arrayCollectSelectionHTML,"slots" => $arrayCollectSlots];}function loopSlotForShipping($shippingDateTime,$collectDateTimePreview,$order){$settings = $this->em->getRepository(Settings::class)->findOneBy(["code"=>"main"]);$preparationDuration = $order->getShippingMethod()->getPreparationDuration() * 60;$processingDuration = $order->getShippingMethod()->getProcessingDuration()* 60;$shippingDuration = $order->getShippingMethod()->getShippingDuration() * 60;$arrayShippingSelectionHTML=null;$arrayShippingSlots=[];$dateChecker = clone $collectDateTimePreview;$dateChecker->modify(" + ".$processingDuration." minutes ");while( (int)$shippingDateTime->format("H") < (int)$settings->getEndWorkAt()->format("H") ){while (in_array($shippingDateTime->format("H"),$settings->getExcludeHours()) ||in_array($shippingDateTime->format("H"),$settings->getExcludeHours())) {$shippingDateTime->modify("+ 1 Hour");$shippingDateTime->modify("+ 1 Hour");}$difference = $this->time_diff_in_minutes($shippingDateTime->format("H:i"),$collectDateTimePreview->format("H:i"));$differenceDatesInMinutes = $this->date_diff_in_minutes($shippingDateTime->format("Y-m-d H:i"),$collectDateTimePreview->format("Y-m-d H:i"));$pureDiff = $differenceDatesInMinutes - $processingDuration ;$shippingFrom = $shippingDateTime->format("H:i");if(($difference < $processingDuration and $shippingDateTime->format("d") == $collectDateTimePreview->format("d"))or ($pureDiff < 0)){$shippingDateTime->modify(" + ".$shippingDuration." minutes ");continue;}$shippingDateTime->modify(" + ".$shippingDuration." minutes ");$shippingTo = $shippingDateTime->format("H:i");$shippingStotLabel = $shippingFrom." - ".$shippingTo;$arrayShippingSelectionHTML= $arrayShippingSelectionHTML . "<option value='".$shippingFrom."'>".$shippingFrom." - ".$shippingTo."</option>";$arrayShippingSlots[] = ["label"=>$shippingStotLabel,"from"=>$shippingFrom,"to"=>$shippingTo,"value"=>$shippingFrom,"date"=>new \DateTime($shippingDateTime->format("Y-m-d") . " ".$shippingFrom),];}return ["optionsHtml"=>$arrayShippingSelectionHTML,"slots" => $arrayShippingSlots];}public function excludeDatesChecker($date,$deliveryType="collect"){$daysInFrench = ["Monday"=>"Lundi","Tuesday"=>"Mardi","Wednesday"=>"Mercredi","Thursday"=>"Jeudi","Friday"=>"Vendredi","Saturday"=>"Samedi","Sunday"=>"Dimanche",];$settings = $this->em->getRepository(Settings::class)->findOneBy(["code"=>"main"]);$excludeDates = array_column($settings->getExcludeDates(), 'date');while ( in_array($date->format("l"),$settings->getExcludeDays()) or in_array($date->format("Y-m-d"),$excludeDates) ) {$keyExcludedDate = array_search($date->format("Y-m-d"), array_column($settings->getExcludeDates(), 'date'));$excludedDate = $settings->getExcludeDates()[$keyExcludedDate];if(in_array($date->format("l"),$settings->getExcludeDays())){$this->messages[]="<b><i>".$daysInFrench[$date->format("l")] . "</i></b> Est un jour de repos, ".$deliveryType." a été décalé pour le jour suivant";}else{$this->messages[]="Date <b><i>".$date->format("d-m-Y")."</i></b> pour la ".$deliveryType." a été décalé pour le jour suivant, a l'occasion de <b><i>".$excludedDate["label"]."</i></b>";}$date->modify("+ 1 day");}return $date;}}