<?php
namespace App\Controller;
use App\Service\SessionService;
use App\Service\CartService;
use App\Service\VoucherService;
use App\Entity\Main\Forfait;
use App\Entity\Main\Price;
use App\Entity\Main\CartoBon;
use App\Entity\Main\PromosPanier;
use App\Entity\Main\ReservationDetails;
use App\Entity\Main\Calendar;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class CartController extends AbstractController
{
private $ss;
private $cart_service;
private $vs;
public function __construct( SessionService $ss, CartService $cart_service, VoucherService $vs )
{
$this->ss = $ss;
$this->cart_service = $cart_service;
$this->vs = $vs;
}
/**
* @Route("/panier", name="cart")
*/
public function showPanier(Request $request): Response
{
$em = $this->getDoctrine()->getManager();
// $this->ss->empty(); // force vidage panier
// dd($request->request->get('reset_cart'));
if( $request->request->get('reset_cart') == "true" ) {
$cart = array();
// $this->ss->update($cart);
$this->ss->empty();
} else {
$cart = $this->ss->get();
}
// dd($cart);
$code_promo_response = null;
if( null !== $request->request->get('codepromo') && null !== $request->request->get('totalPanier') ) {
$codepromo = $request->request->get('codepromo');
$totalPanier = $request->request->get('totalPanier');
$code_promo_response = $this->checkCodePromo($codepromo, $totalPanier);
}
if($code_promo_response && !$code_promo_response['error']) {
$cart['code_promo'] = $code_promo_response['codeToCheck'][0];
$this->ss->update($cart);
}
// dd($cart);
if( null !== $request->request->get('remove_formule') ) {
$remove_formule = $request->request->get('remove_formule');
if (($key = array_search($remove_formule, $cart['formules'])) !== false) {
unset($cart['formules'][$key]);
unset($cart['forfaits'][$remove_formule]);
}
if(count($cart['formules']) == 0) $cart = array();
$this->ss->update($cart);
}
if( null !== $request->request->get('remove_bon_numerique') && $cart['bon_numerique'] ) {
foreach ($cart['bon_numerique'] as $key => $bon_data) {
if($bon_data['bon'] == $request->request->get('remove_bon_numerique')) {
if(isset($cart['nb_bon_id_product_shop_'.$cart['bon_numerique'][$key]['_product_id']])) {
$cart['nb_bon_id_product_shop_'.$cart['bon_numerique'][$key]['_product_id']] = $cart['nb_bon_id_product_shop_'.$cart['bon_numerique'][$key]['_product_id']] - $cart['bon_numerique'][$key]['qty'];
}
unset($cart['bon_numerique'][$key]);
}
}
$this->ss->update($cart);
}
// dd($request->request);
if( $request->request->get('tarifs') ) {
if(!empty($cart) && isset($cart['forfaits'])) {
$forfaits = $cart['forfaits'];
} else {
$forfaits = array();
}
foreach ($request->request->get('tarifs') as $id_forfait => $array_tarif) {
if(!isset($forfait)) {
$forfait = $em->getRepository(Forfait::class)->findOneBy(['id' => $id_forfait]);
$formule = $forfait->getFormule();
}
$tarifs = array();
foreach ($array_tarif as $id_tarif => $quantity) {
if($quantity != "" && $quantity != "0") {
$tarif = $em->getRepository(Price::class)->findOneBy(['id' => $id_tarif]);
$tarifs[$id_tarif] = $quantity / $tarif->getMultiGame();
}
}
if(!isset($forfaits[$formule->getCode()])) $forfaits[$formule->getCode()] = array();
if(!empty($tarifs)) $forfaits[$formule->getCode()][$id_forfait] = array('tarifs' => $tarifs);
}
if( $request->request->get('options') ) {
foreach ($request->request->get('options') as $id_forfait => $array_option) {
$options = array();
foreach ($array_option as $id_option => $quantity) {
if($quantity != "" && $quantity != "0") {
$options[$id_option] = $quantity;
}
}
if(!isset($forfaits[$formule->getCode()])) $forfaits[$formule->getCode()] = array();
if(!empty($options)) $forfaits[$formule->getCode()][$id_forfait]['options'] = $options;
}
}
if( $request->request->get('creneaux') ) {
$creneaux = $request->request->get('creneaux');
// dd($creneaux,$forfaits[$formule->getCode()][$id_forfait]);
foreach ($creneaux as $id_forfait => $array_creneau) {
foreach ($array_creneau as $id_activity => $creneau) {
if($creneau != "" && $creneau != "0") {
if(isset($forfaits[$formule->getCode()][$id_forfait]) && !empty($forfaits[$formule->getCode()][$id_forfait])) {
if(isset($forfaits[$formule->getCode()][$id_forfait]['activity'])
&& !empty($forfaits[$formule->getCode()][$id_forfait]['activity']))
{
$forfaits[$formule->getCode()][$id_forfait]['activity'][$id_activity] = array('creneau' => $creneau);
} else {
$forfaits[$formule->getCode()][$id_forfait]['activity'] = array($id_activity => array('creneau' => $creneau));
}
}
}
}
}
// dd($creneaux,$forfaits[$formule->getCode()][$id_forfait]['activity']);
}
if( $request->request->get('participants') ) {
$participants = $request->request->get('participants');
// dd($participants);
foreach ($participants as $id_forfait => $array_participant) {
foreach ($array_participant as $id_activity => $participant) {
if($participant != "" && $participant != "0") {
if(isset($forfaits[$formule->getCode()][$id_forfait]) && !empty($forfaits[$formule->getCode()][$id_forfait])) {
if(is_array($participant)) {
$forfaits[$formule->getCode()][$id_forfait]['activity'][$id_activity]['participants'] = 0;
foreach ($participant as $key => $value) {
$forfaits[$formule->getCode()][$id_forfait]['activity'][$id_activity]['participants'] += $value;
}
} else {
$forfaits[$formule->getCode()][$id_forfait]['activity'][$id_activity]['participants'] = $participant;
}
}
}
}
}
}
if( $request->request->get('parties') ) {
$parties = $request->request->get('parties');
// dd($parties);
foreach ($parties as $id_forfait => $array_partie) {
foreach ($array_partie as $id_activity => $partie) {
if($partie != "" && $partie != "0") {
if(isset($forfaits[$formule->getCode()][$id_forfait]) && !empty($forfaits[$formule->getCode()][$id_forfait])) {
if(is_array($partie)) {
$forfaits[$formule->getCode()][$id_forfait]['activity'][$id_activity]['parties'] = 0;
foreach ($partie as $key => $value) {
if($forfaits[$formule->getCode()][$id_forfait]['activity'][$id_activity]['parties'] < $value) {
$forfaits[$formule->getCode()][$id_forfait]['activity'][$id_activity]['parties'] = $value;
}
}
} else {
$forfaits[$formule->getCode()][$id_forfait]['activity'][$id_activity]['parties'] = $partie;
}
}
}
}
}
}
$cart['forfaits'] = $forfaits;
// dd($request->request,$cart);
$this->ss->update($cart);
}
$cart_details = $this->cart_service->getCartDetails($cart);
$alert = "";
if(null !== $request->request->get('birthday_customer_comment')){
$cart['birthday_customer_comment'] = $request->request->get('birthday_customer_comment');
$this->ss->update($cart);
}
if(null !== $request->request->get('bon_numerique')){
$bon_numerique = $request->request->get('bon_numerique');
if(strpos($bon_numerique,' ') !== false){
$alert = 'Vérifiez la conformité du code saisi, un espace a été trouvé.';
$data = array();
} else {
$data = $this->vs->getVoucher($bon_numerique);
}
if(!empty($data)) {
$date_resa = \DateTime::createFromFormat('d-m-Y H:i',$cart['date'].' 00:00');
if(isset($data['unlimited_voucher'])) {
$unlimited_voucher_start = \DateTime::createFromFormat('d/m/Y H:i', $data['unlimited_voucher']['unlimited_voucher_start'].' 00:00');
$unlimited_voucher_start->add(new \DateInterval('P1D'));
$unlimited_voucher_end = \DateTime::createFromFormat('d/m/Y H:i', $data['unlimited_voucher']['unlimited_voucher_end'].' 00:00');
$unlimited_voucher_end->add(new \DateInterval('P1D'));
}
if(isset($data['limited_voucher'])) {
$limited_voucher_start = \DateTime::createFromFormat('d/m/Y H:i', $data['limited_voucher']['unlimited_voucher_start'].' 00:00');
$limited_voucher_start->add(new \DateInterval('P1D'));
$limited_voucher_end = \DateTime::createFromFormat('d/m/Y H:i', $data['limited_voucher']['unlimited_voucher_end'].' 00:00');
$limited_voucher_end->add(new \DateInterval('P1D'));
}
if ($data['status'] == "wcpdf-redeemed" || $data['_remaining_value'] == 0) {
$alert = 'Ce bon a été consommé.';
} elseif($data['status'] != "wcpdf-active") {
$alert = 'Ce bon est inactif, contactez la boutique.';
} elseif(
isset($data['unlimited_voucher'])
&& (
($date_resa < $unlimited_voucher_start || $date_resa > $unlimited_voucher_end)
|| !$this->checkVoucherValid($date_resa,$data['unlimited_voucher'])
)
) {
if($date_resa < $unlimited_voucher_start) {
$alert = "Ce bon à usage illimité ne sera utilisable qu'à partir du ".$unlimited_voucher_start->format('d/m/Y')." !";
}
if($date_resa > $unlimited_voucher_end) {
$alert = "Ce bon à usage illimité n'est utilisable que jusqu'au ".$unlimited_voucher_end->format('d/m/Y')." !";
}
if(!$this->checkVoucherValid($date_resa,$data['unlimited_voucher'])) {
$alert = "Ce bon à usage illimité n'est pas valable pour ce jour ! Vérifiez les conditions d'utilisation";
}
} elseif(
isset($data['limited_voucher'])
&& (
($date_resa < $limited_voucher_start || $date_resa > $limited_voucher_end)
|| !$this->checkVoucherValid($date_resa,$data['limited_voucher'])
)
) {
if($date_resa < $limited_voucher_start) {
$alert = "Ce E-ticket ne sera utilisable qu'à partir du ".$limited_voucher_start->format('d/m/Y')." !";
}
if($date_resa > $limited_voucher_end) {
$alert = "Ce E-ticket n'est utilisable que jusqu'au ".$limited_voucher_end->format('d/m/Y')." !";
}
if(!$this->checkVoucherValid($date_resa,$data['limited_voucher'])) {
$alert = "Ce E-ticket n'est pas valable pour ce jour ! Vérifiez les conditions d'utilisation";
}
} else {
$map = $em->getRepository(CartoBon::class)->findOneBy(array("idBon" => $data['_product_id']));
// dd($cart_details,$data,$map);
if($map == NULL || $map->getType() == 3) {
$alert = 'Ce bon ne peut pas être utilisé en ligne.';
} else {
if($map->getType() == 2 || $map->getType() == 4){
// Vérifions si le bon a déja été utilisé pour aujourd'hui
$exist_resa_today = $em->getRepository(ReservationDetails::class)->findOneByBonNumerique($bon_numerique);
if($map->getType() == 4 && !empty($exist_resa_today) && $date_resa == $exist_resa_today[0]->getDate()) {
$alert = "Ce bon n'est utilisable qu'une fois par jour !";
} else {
$price = array();
$exact_prices_founded = array();
foreach ($map->getForfait() as $forfait) {
$code_formule = $forfait->getFormule()->getCode();
if( isset($cart_details[$code_formule]) ) {
foreach($cart_details[$code_formule]['forfaits'] as $detail){
if($detail['obj_forfait']->getId() == $forfait->getId()){
foreach($detail['tarifs'] as $tarif){
for ($i=0; $i < $tarif['qty']; $i++) {
// FIX Multi-tarifs ############
$prices[] = array(
'price' => $tarif['obj_tarif']->getPriceTtc(),
'tax_rate' => $tarif['obj_tarif']->getTauxTva(),
'id_forfait' => $forfait->getId(),
);
// if(($data['_product_price'] + $data['_product_tax']) == $tarif['obj_tarif']->getPriceTtc()) {
// $exact_prices_founded[] = array(
// 'price' => $tarif['obj_tarif']->getPriceTtc(),
// 'tax_rate' => $tarif['obj_tarif']->getTauxTva(),
// 'id_forfait' => $forfait->getId(),
// );
// }
// ############
}
}
}
}
}
}
// dd($prices,$cart,$data['id']);
if(!empty($prices)) {
// if(!empty($exact_prices_founded)) $prices = $exact_prices_founded;
rsort($prices);
if(!isset($data['_product_quantity'])){
$data['_product_quantity'] = round($data['_remaining_value'] / $data['_product_price']);
}
$remises = array();
$total = 0;
if($data['_product_quantity']>count($prices)){
$data['_product_quantity'] = count($prices);
}
// dd($cart,$prices,$data['_product_id'],$cart['nb_bon_id_product_shop_'.$data['_product_id']],count($prices));
if(isset($cart['nb_bon_id_product_shop_'.$data['_product_id']]) && $cart['nb_bon_id_product_shop_'.$data['_product_id']] > 0 ) {
$new_prices_list = array();
for ($i=$cart['nb_bon_id_product_shop_'.$data['_product_id']]; $i < count($prices); $i++) {
$new_prices_list[] = $prices[$i];
}
$prices = $new_prices_list;
}
for ($i=0; $i < $data['_product_quantity']; $i++) {
if (isset($remises[(string)$prices[$i]['tax_rate']])) {
$remises[(string)$prices[$i]['tax_rate']] += $prices[$i]['price'];
}else{
$remises[(string)$prices[$i]['tax_rate']] = $prices[$i]['price'];
}
if(!isset($cart['nb_bon_id_product_shop_'.$data['_product_id']])) $cart['nb_bon_id_product_shop_'.$data['_product_id']] = 1;
else $cart['nb_bon_id_product_shop_'.$data['_product_id']]++;
$total += $prices[$i]['price'];
}
$tax = 0;
foreach($remises as $i => $remise){
$tax += (float)$i*(float)$remise;
}
if($total == 0) {
$alert = 'Une erreur est survenu ! Veuillez réessayer.';
} else {
$cart['bon_numerique'][$data['id']] = array(
'total' => $total,
'qty' => $data['_product_quantity'],
'tax' => $tax,
'bon' => $bon_numerique,
'_product_id' => $data['_product_id'],
);
}
// dd($cart,$prices,$data['_product_id']);
} else {
$alert = 'La valeur du E-ticket ne correspond à aucun tarif.';
}
}
} elseif($map->getType() == 1) {
$cart['bon_numerique'][$data['id']] = array(
'total' => $data['ttc'] * $data['_product_quantity'],
'qty' => $data['_product_quantity'],
'bon_total' => $data['_product_price'],
'bon' => $bon_numerique
);
}
$this->ss->update($cart);
}
}
} elseif(strpos($bon_numerique,' ') === false) {
$alert = 'Vérifiez la conformité du code saisi, auccun bon valide n\'a été trouvé.';
}
// dd($data);
}
// dd($cart,$cart_details);
return $this->render('etapes/panier.html.twig', [
'code_promo_response' => $code_promo_response,
'cart' => $cart,
'alert_voucher' => $alert,
'cart_details' => $cart_details,
'controller_name' => 'CartController',
'page_name' => 'page_panier',
]);
}
public function checkCodePromo($codepromo, $montantTTC)
{
/* POST Method */
// $data = json_decode($request->request->get('data'));
$error = false;
$data = null;
// if(md5($this->pk) != $request->request->get('key')) exit();
$dateTimeZone = new \DateTimeZone('Europe/Paris');
$dateAchat = new \DateTime('now', $dateTimeZone);
$formatter = new \IntlDateFormatter('fr_FR', NULL, NULL, $dateTimeZone, NULL, 'EEEE');
$dayName = $formatter->format($dateAchat);
// On récupère les infos du client
$em = $this->getDoctrine()->getManager();
$codeToCheck = $em->getRepository(PromosPanier::class)->checkCode($codepromo, $dateAchat, $dayName);
if (!$codeToCheck) {
$error = 'E.1: Le code utilisé n\'est pas valide';
// return new JsonResponse(['error' => $error], JsonResponse::HTTP_CREATED);
} else if($codeToCheck[0][0] instanceof PromosPanier) {
// dd($codeToCheck);
if($montantTTC >= $codeToCheck[0][0]->getMontantMinimun()) {
$data = $codeToCheck[0];
} else {
$error = 'E.2: Le code utilisé n\'est pas valide';
}
} else $error = 'E.3: Le code utilisé n\'est pas valide';
return array('error' => $error, 'codeToCheck' => $data);
}
private function checkVoucherValid( $dateResa, $unlimitedVoucherDatas ) {
$isValid = false;
$em = $this->getDoctrine()->getManager();
$dateTypes = $em->getRepository(Calendar::class)->findTypeByDate($dateResa);
$formatter = new \IntlDateFormatter('fr_FR', NULL, NULL, NULL, NULL, 'EEEE');
$dayName = $formatter->format($dateResa);
if(in_array($dayName, $unlimitedVoucherDatas['day_enabled'])) $isValid = true;
if($dateTypes) {
foreach ($dateTypes as $key => $dateType) {
if(!in_array($dateType['type'], $unlimitedVoucherDatas['day_enabled'])
&& $dateType['type'] != 'indisponible' && $dateType['activityClosed'] == null)
{
$isValid = false;
}
}
}
// dd($dateTypes,$dayName,$unlimitedVoucherDatas,$isValid);
return $isValid;
}
/**
* @Route("/vider_panier", name="resetcart")
*/
public function resetCart(Request $request): Response
{
return $this->redirectToRoute('cart');
}
}