ldc-gen-game-web/app/Http/Controllers/EnterCodeController.php

251 lines
12 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Mail\PrizeWon;
use App\Mail\ReductionWon;
use App\Models\BannedIP;
use App\Models\Codes;
use App\Models\CodesEAN;
use App\Models\InstantWin;
use App\Models\Participation;
use App\Models\Reductions;
use LDCWeb\MesBR;
use App\Models\Settings;
use CPCConnection;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Mail;
class EnterCodeController extends Controller
{
public function index() {
$nbParticipations = Participation::where('user_id', Auth::user()->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]])->orderByDesc('appear_date')->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();
$mesBR->updateContact($cpcConnect->getUser(Auth::user()->crm_id));
$result = $mesBR->updatePanier($cpcConnect->getUser(Auth::user()->crm_id), $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 = '<arcadia>' ;
$zCourrierCorps .= '<Commande> ' . "\n" ;
$zCourrierCorps .= "\t" . '<Num_Commande></Num_Commande>' . "\n" ;
$zCourrierCorps .= "\t" . '<Date_Commande>' . date ('d/m/Y') . '</Date_Commande>' . "\n" ;
$zCourrierCorps .= "\t" . '<Operation></Operation> ' . "\n" ;
$zCourrierCorps .= "\t" . '<Civilite></Civilite>' . "\n" ;
$zCourrierCorps .= "\t" . '<Nom><![CDATA[' .trim ($crmUser->zNom). ']]></Nom>' . "\n" ;
$zCourrierCorps .= "\t" . '<Prenom><![CDATA[' .trim ($crmUser->zPrenom). ']]></Prenom>' . "\n" ;
$zCourrierCorps .= "\t" . '<Adresse><![CDATA[' .trim ($crmUser->zAdresse1). ']]></Adresse>' . "\n" ;
$zCourrierCorps .= "\t" . '<Adresse_Complementaire><![CDATA[' .trim ($crmUser->zAdresse2). ']]></Adresse_Complementaire>' . "\n" ;
$zCourrierCorps .= "\t" . '<CP><![CDATA[' .trim ($crmUser->zCodePostal). ']]></CP>' . "\n" ;
$zCourrierCorps .= "\t" . '<Ville><![CDATA[' .trim ($crmUser->zVille). ']]></Ville>' . "\n" ;
$zCourrierCorps .= '<Ligne_de_Commande>' . "\n" ;
$zCourrierCorps .= "\t" . '<Code_Support></Code_Support> ' . "\n" ;
$zCourrierCorps .= "\t" . '<Libelle_Type_Support></Libelle_Type_Support> ' . "\n" ;
$zCourrierCorps .= "\t" . '<Quantite>1</Quantite>' . "\n" ;
$zCourrierCorps .= "\t" . '<Poids_Unitaire_Colis></Poids_Unitaire_Colis>' . "\n" ;
$zCourrierCorps .= '</Ligne_de_Commande>' . "\n" ;
$zCourrierCorps .= '</Commande> ' . "\n" ;
$zCourrierCorps .= '<arcadia>' ;
$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
}
}
}