id)->count(); $settings = Settings::find(1)->select('use_ean_codes', 'nb_participation_player')->first(); if ($nbParticipations >= $settings->nb_participation_player) return view('front.basic.participation-exhausted', compact('settings')); return view('front.basic.enter-code', compact('settings')); } public function participate(Request $request) { // Récupération des données à utilisées $code = strtoupper($request->code); $codeBase = Codes::where('code_unique', $code)->first(); $settings = Settings::find(1); $rules = $request->accept_rules === null ? false : true; if (!$rules) return redirect()->back()->withErrors("Pour participer, vous devez accepter le règlement du jeu."); // Cas IP bannie if (config('app.env') == "local") { $ipBanned = BannedIP::where('ip', $_SERVER['REMOTE_ADDR'])->first() === null ? 0 : 1; } else { $ipBanned = BannedIP::where('ip', $_SERVER['HTTP_X_FORWARDED_FOR'])->first() === null ? 0 : 1; } if ($ipBanned) return view('front.basic.participation-exhausted', compact('settings')); // Cas nombre de participation maximale atteint $nbParticipations = Participation::where('user_id', Auth::user()->id)->count(); if ($nbParticipations >= $settings->nb_participation_player) return view('front.basic.participation-exhausted', compact('settings')); // Check le code pour savoir s'il est encore utilisable if (!$codeBase) return redirect()->back()->withErrors("Code incorrect, veuillez réessayer."); if ($codeBase->code_used === 1) return redirect()->back()->withErrors("Ce code n'est plus utilisable."); // Check si l'utilisateur n'a pas déjà utiliser ce code $participUser = Participation::where([ ['code_unique_id', $codeBase->id], ['user_id', Auth::user()->id] ])->first(); if ($participUser) return redirect()->back()->withErrors("Vous avez déjà utilisé ce code."); // Check si les codes ean sont utilisés, auquel cas on test celui envoyé pour savoir s'il est correct $codeEan = null; if ($settings->use_ean_codes === 1) { $codeEan = $request->code_ean; $codeEanBase = CodesEAN::where('code', $codeEan)->first(); if (!$codeEanBase) return redirect()->back()->withErrors('Le code barre entré est incorrect, veuillez réessayer.'); } $codeNbUsage = Participation::where('code_unique_id', $codeBase->id)->count(); $codeUsedChanged = false; // Gestion du nombre d'utilisation d'un code if ($codeNbUsage >= $settings->nb_unique_code_use) { $codeBase->code_used = 1; $codeBase->save(); $codeUsedChanged = true; return redirect()->back()->withErrors("Ce code n'est plus utilisable."); } else { if ($codeNbUsage + 1 >= $settings->nb_unique_code_use) $codeBase->code_used = 1; } // Tous les cas "bloquants" sont passé, l'utilisateur participe à partir d'ici $participation = new Participation(); $participation->user_id = Auth::user()->id; $participation->code_unique_id = $codeBase->id; $participation->code_ean_id = isset($codeEanBase) ? $codeEanBase->id : null; if (config('app.env') === "local") { $participation->ip = $_SERVER['REMOTE_ADDR']; } else { $participation->ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } $participation->save(); // Gestion des instants gagnants $userAlreadyWon = Participation::where([ ['user_id', Auth::user()->id], ['instant_win_id', '<>', null] ])->first(); // Si l'utilisateur actuel à déjà gagné un gros lot, pas d'instant gagnant if ($userAlreadyWon) { // Si le jeu est 100% gagnant if ($settings->reductions_activated === 1) { $coupon = $this->getRandomCoupon($settings); $crmCoupon = $this->updateCoupon($settings, $coupon->web_coupon_identifiant, $participation); if (!$crmCoupon) { $participation->delete(); return redirect()->back()->withErrors("Une erreur est survenue, merci de réessayez ultérieurement."); } Mail::to(Auth::user()->email)->send(new ReductionWon(Auth::user(), $coupon, $settings, $crmCoupon)); return view('front.basic.reduction', compact('crmCoupon', 'coupon')); } else { return view('front.basic.loose'); } } else { // Gain d'un gros lot $instantWin = InstantWin::where([['appear_date', '<', now()], ['won', 0]])->orderBy('appear_date', 'ASC')->first(); if ($instantWin) { $instantWin->won = 1; $instantWin->participation_id = $participation->id; $participation->instant_win_id = $instantWin->id; if ($instantWin->prize->arcadia_mail_id !== 0) { $cpcConnect = new CPCConnection(config('crm.CRM_PLATOS_WSDL'), config('crm.WS_SERVCE_LOGIN'), config('crm.WS_SERVCE_PASSWORD')); $cpcConnect->connect(); try { $crmUser = $cpcConnect->getUser(Auth::user()->crm_id); $this->createCourrierArcadia($crmUser, $instantWin->prize->arcadia_mail_id); } catch (Exception $e) { // TODO : Erreur mail arcadia } } $instantWin->save(); Mail::to(Auth::user()->email)->send(new PrizeWon(Auth::user(), $instantWin->prize, $settings)); $participation->save(); return view("front.basic." . $instantWin->prize->gain_view->file_name, compact('settings'))->with('prize', $instantWin->prize); } // Si le jeu est 100% gagnant if ($settings->reductions_activated === 1) { $coupon = $this->getRandomCoupon($settings); $crmCoupon = $this->updateCoupon($settings, $coupon->web_coupon_identifiant, $participation); if (!$crmCoupon) { $participation->delete(); return redirect()->back()->withErrors("Une erreur est survenue, merci de réessayez ultérieurement."); } Mail::to(Auth::user()->email)->send(new ReductionWon(Auth::user(), $coupon, $settings, $crmCoupon)); return view('front.basic.reduction', compact('crmCoupon', 'coupon')); } else { return view('front.basic.loose'); } } } private function getRandomCoupon($settings) { $webCoupons = json_decode($settings->web_coupons); if (count($webCoupons) > 1) { $lots = []; foreach($webCoupons as $webCoupon) $lots[] = $webCoupon; foreach ($lots as $lot) for ($i = 0; $i < $lot->percentage; $i++) $tmp[] = $lot; shuffle($tmp); return $tmp[0]; } else { return $webCoupons[0]; } } private function updateCoupon($settings, $coupon, $participation) { $reduction = null; $mesBR = new MesBR($settings->reductions_site, $settings->reductions_campaign); try { // Appel API CRM et MesBR $cpcConnect = new CPCConnection(config('crm.CRM_PLATOS_WSDL'), config('crm.WS_SERVCE_LOGIN'), config('crm.WS_SERVCE_PASSWORD')); $cpcConnect->connect(); $crmUser = $cpcConnect->getUser(Auth::user()->crm_id); $mesBR->updateContact($crmUser); $result = $mesBR->updatePanier($crmUser, $coupon); if ($result["status"] === "OK") { $reduction = new Reductions(); $reduction->participation_id = $participation->id; $reduction->link = $result["link"]; $reduction->verification = $result["verif"]; $reduction->basket_id = $result["basketId"]; $reduction->save(); $participation->reduction_id = $reduction->id; $participation->save(); } } catch (Exception $e) { $reduction = null; } return $reduction; } public function formWinningProof() { $participation = Participation::where([ ['user_id', Auth::user()->id], ['instant_win_id', '<>', null], ['sticker', null], ['ticket', null], ['barcode', null] ])->first(); if ($participation) return view('front.basic.winning-proof', compact('participation')); return redirect()->route('home'); } /** * Création d'un courrier en CRM pour l'export Arcadia * */ private function createCourrierArcadia ($crmUser, $courrierArcadiaId) { try{ $zCourrierCorps = '' ; $zCourrierCorps .= ' ' . "\n" ; $zCourrierCorps .= "\t" . '' . "\n" ; $zCourrierCorps .= "\t" . '' . date ('d/m/Y') . '' . "\n" ; $zCourrierCorps .= "\t" . ' ' . "\n" ; $zCourrierCorps .= "\t" . '' . "\n" ; $zCourrierCorps .= "\t" . 'zNom). ']]>' . "\n" ; $zCourrierCorps .= "\t" . 'zPrenom). ']]>' . "\n" ; $zCourrierCorps .= "\t" . 'zAdresse1). ']]>' . "\n" ; $zCourrierCorps .= "\t" . 'zAdresse2). ']]>' . "\n" ; $zCourrierCorps .= "\t" . 'zCodePostal). ']]>' . "\n" ; $zCourrierCorps .= "\t" . 'zVille). ']]>' . "\n" ; $zCourrierCorps .= '' . "\n" ; $zCourrierCorps .= "\t" . ' ' . "\n" ; $zCourrierCorps .= "\t" . ' ' . "\n" ; $zCourrierCorps .= "\t" . '1' . "\n" ; $zCourrierCorps .= "\t" . '' . "\n" ; $zCourrierCorps .= '' . "\n" ; $zCourrierCorps .= ' ' . "\n" ; $zCourrierCorps .= '' ; $cpcConnect = new CPCConnection(config('crm.CRM_PLATOS_WSDL'), config('crm.WS_SERVCE_LOGIN'), config('crm.WS_SERVCE_PASSWORD')); $cpcConnect->connect(); $cpcConnect->createOutCourrier ($crmUser->iId, $courrierArcadiaId, $zCourrierCorps) ; } catch (Exception $_eException) { // TODO : Log et/ou mail } } }