415 lines
15 KiB
PHP
415 lines
15 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\Campagne;
|
|
use App\Models\Site;
|
|
use App\Models\Coupon;
|
|
use App\Models\Contact;
|
|
use App\Enums\CampaignTypes;
|
|
use App\Http\Requests\Campaign\AddCouponsCampaign;
|
|
use App\Http\Requests\Campaign\DeleteCampaign;
|
|
use App\Http\Requests\Campaign\RemoveCouponCampaign;
|
|
use App\Http\Requests\Campaign\RemoveNotifCampaign;
|
|
use App\Http\Requests\Campaign\ShowDemoCampaign;
|
|
use App\Http\Requests\Campaign\StoreCampaign;
|
|
use App\Http\Requests\Campaign\StoreNotifCampaign;
|
|
use App\Http\Requests\Campaign\UpdateCampaign;
|
|
use App\Models\Mur;
|
|
use App\Models\PanierContent;
|
|
use App\Models\Notification;
|
|
use App\Models\Panier;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\File;
|
|
use App\Traits\CouponTrait;
|
|
|
|
class CampagneController extends Controller
|
|
{
|
|
use CouponTrait;
|
|
|
|
/**
|
|
* Display a listing of the resource.
|
|
*
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function index()
|
|
{
|
|
// TODO : Revoir le passage du site id ?
|
|
$siteId = session()->get('site')->site_id;
|
|
|
|
$campagnes = Campagne::where('camp_siteId', $siteId)->get();
|
|
return view('campagnes.index')->with('campagnes', $campagnes);
|
|
}
|
|
|
|
/**
|
|
* Show the form for creating a new resource.
|
|
*
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function create()
|
|
{
|
|
return view('campagnes.create');
|
|
}
|
|
|
|
/**
|
|
* Store a newly created resource in storage.
|
|
*
|
|
* @param StoreCampaign $request
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function store(StoreCampaign $request)
|
|
{
|
|
// TODO : Revoir le passage du site
|
|
$site = session()->get('site');
|
|
|
|
$campagne = new Campagne();
|
|
$campagne->fill(array_merge($request->validated(), ['camp_siteId' => $site->site_id]));
|
|
$campagne->save();
|
|
|
|
if ($site->campagnes()->save($campagne)) {
|
|
if ($campagne->camp_type->equals(CampaignTypes::mur())) {
|
|
File::copyDirectory(resource_path('/views/template/mur'), public_path('/landings/' . $campagne->camp_id));
|
|
} elseif ($campagne->camp_type->equals(CampaignTypes::panier())) {
|
|
File::copyDirectory(resource_path('/views/template/panier'), public_path('/landings/' . $campagne->camp_id));
|
|
} elseif ($campagne->camp_type->equals(CampaignTypes::murss())) {
|
|
File::copyDirectory(resource_path('/views/template/murnoselection'), public_path('/landings/' . $campagne->camp_id));
|
|
} elseif ($campagne->camp_type->equals(CampaignTypes::paniers())) {
|
|
File::copyDirectory(resource_path('/views/template/panierselection'), public_path('/landings/' . $campagne->camp_id));
|
|
}
|
|
}
|
|
|
|
return redirect(route('campagne.edit', ['campagne' => $campagne]));
|
|
}
|
|
|
|
/**
|
|
* Show the form for editing the specified resource.
|
|
*
|
|
* @param \App\Models\Campagne $campagne
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function edit(Campagne $campagne)
|
|
{
|
|
// TODO : Revoir le passage du site id
|
|
$siteId = session()->get('site')->id;
|
|
|
|
$couponsNotLinked = Coupon::whereDoesntHave('campagnes', function ($q) use ($campagne) {
|
|
$q->where('campagne_id', $campagne->camp_id);
|
|
})->where('coupon_siteId', $siteId)->where('coupon_published', 1)->get();
|
|
|
|
return view('campagnes.edit', ['campagne' => $campagne, 'coupons' => $couponsNotLinked]);
|
|
}
|
|
|
|
/**
|
|
* Update the specified resource in storage.
|
|
*
|
|
* @param UpdateCampaign $request
|
|
* @param \App\Models\Campagne $campagne
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function update(UpdateCampaign $request, Campagne $campagne)
|
|
{
|
|
$campagne->fill($request->validated());
|
|
|
|
if (!isset($request->camp_limitedPrinting)) {
|
|
$campagne->camp_limitedPrinting = 0;
|
|
}
|
|
|
|
if ($campagne->save()) {
|
|
session()->flash('update_ok', __('La campagne a bien été modifiée'));
|
|
} else {
|
|
session()->flash('update_nok', __("Erreur lors de l'enregistrement"));
|
|
}
|
|
|
|
return redirect()->route('campagne.edit', ['campagne' => $campagne]);
|
|
}
|
|
|
|
/**
|
|
* Remove the specified resource from storage.
|
|
*
|
|
* @param DeleteCampaign $request
|
|
* @param \App\Models\Campagne $campagne
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function destroy(DeleteCampaign $request, Campagne $campagne)
|
|
{
|
|
$campagne->camp_published = 0;
|
|
$campagne->save();
|
|
|
|
if ($campagne->delete()) {
|
|
return redirect(route('campagne.index'));
|
|
} else {
|
|
session()->flash('delete_nok', 'Erreur lors de la suppression');
|
|
return view('campagnes.edit')->with('campagne', $campagne);
|
|
}
|
|
}
|
|
|
|
// ---- Ajoute des coupons à une campagne
|
|
public function addCoupons(AddCouponsCampaign $request, Campagne $campaign)
|
|
{
|
|
$coupons = Coupon::find($request->ids);
|
|
$campaign->coupons()->attach($coupons);
|
|
return json_encode($coupons);
|
|
}
|
|
|
|
// ---- Efface des coupons d'une campagne
|
|
public function removeCoupon(RemoveCouponCampaign $request, Campagne $campaign, Coupon $coupon)
|
|
{
|
|
$campaign->coupons()->detach($coupon);
|
|
return json_encode($coupon);
|
|
}
|
|
|
|
/**
|
|
* @param \Illuminate\Http\Request $request
|
|
*
|
|
* @return array
|
|
*/
|
|
public function saveNotification(StoreNotifCampaign $request, Campagne $campaign)
|
|
{
|
|
$notification = new Notification();
|
|
$notification->fill(array_merge($request->validated(), ['notif_campId' => $campaign->camp_id]));
|
|
$notification->save();
|
|
|
|
return redirect()->back();
|
|
}
|
|
|
|
/**
|
|
* @param RemoveNotifCampaign $request
|
|
* @param \App\Models\Notification $notification
|
|
*
|
|
* @return array
|
|
*/
|
|
public function deleteNotification(RemoveNotifCampaign $request, Notification $notification)
|
|
{
|
|
if ($notification->delete()) {
|
|
return redirect()->back();
|
|
} else {
|
|
session()->flash('delete_nok', 'Erreur lors de la suppression');
|
|
return redirect()->back();
|
|
}
|
|
}
|
|
|
|
// ---- Montre les campagnes avec un compte de démo
|
|
public function showDemo(ShowDemoCampaign $request, Campagne $campaign)
|
|
{
|
|
$siteId = $campaign->camp_siteId;
|
|
$demoContact = Contact::where(['contact_siteId' => $siteId, 'contact_ref' => 'DEMO'])->first();
|
|
|
|
if (!isset($demoContact)) {
|
|
$req = new \Illuminate\Http\Request();
|
|
$req->setMethod('POST');
|
|
$req->request->add([
|
|
'refsite' => $siteId,
|
|
'refadherent' => 'DEMO',
|
|
'prenom' => 'Compte',
|
|
'nom' => 'Démonstration',
|
|
'email' => 'demo@demo.fr',
|
|
'code_postal' => '72000',
|
|
'commune' => 'Le Mans',
|
|
'pays' => 250
|
|
]);
|
|
|
|
$contact = new \App\Http\Controllers\ContactController();
|
|
$res = $contact->updateContact($req);
|
|
$demoContact = Contact::where(['contact_siteId' => $siteId, 'contact_ref' => 'DEMO'])->first();
|
|
}
|
|
|
|
if ($campaign->camp_type->equals(CampaignTypes::mur()) || $campaign->camp_type->equals(CampaignTypes::murss())) {
|
|
// ---- DEMONSTRATION POUR LES MURS
|
|
$myRequest = new \Illuminate\Http\Request();
|
|
$myRequest->setMethod('POST');
|
|
$myRequest->request->add(['refcamp' => $campaign->camp_id, 'refadherent' => 'DEMO', 'admin' => 1]);
|
|
|
|
// ---- EFFACER LES CONTROLES SI EXISTANT
|
|
$mur = new \App\Http\Controllers\MurController();
|
|
$res = $mur->deleteControlContact($myRequest);
|
|
|
|
// ---- RETOURNE l'URL
|
|
$url = "/?refsite=" . $siteId . "&refcamp=" . $campaign->camp_id . "&hash=" . $demoContact->contact_hash;
|
|
return json_encode($url);
|
|
} else {
|
|
// ---- DEMONSTRATION POUR LES PANIERS
|
|
$panier = Panier::where(['panier_campId' => $campaign->camp_id, 'panier_contactId' => $demoContact->contact_id, 'panier_pending' => 1])->first();
|
|
|
|
if ($panier) {
|
|
$url = "/?basketid=" . $panier->panier_ref;
|
|
} else {
|
|
// --- Pas de panier Création d'un nouveau
|
|
// --- Récuperation des coupons de la campagne
|
|
$coupons = $campaign->coupons()->get();
|
|
|
|
foreach ($coupons as $key => $coupon) {
|
|
if (!$this->isAvailableToPrint($coupon, $campaign)) {
|
|
$coupons->forget($key);
|
|
}
|
|
}
|
|
|
|
$couponsTotal = count($coupons);
|
|
$couponsAdded = 0;
|
|
$basketContent = "";
|
|
|
|
foreach ($coupons as $coupon) {
|
|
$basketContent .= "(1)" . $coupon->coupon_code;
|
|
$couponsAdded++;
|
|
if ($couponsAdded != $couponsTotal) {
|
|
$basketContent .= ",";
|
|
}
|
|
}
|
|
// --- création de l'objet request
|
|
$req = new \Illuminate\Http\Request();
|
|
$req->setMethod('POST');
|
|
$req->request->add([
|
|
'refsite' => $siteId,
|
|
'refcamp' => $campaign->camp_id,
|
|
'refadherent' => $demoContact->contact_ref,
|
|
'nom' => $demoContact->contact_nom,
|
|
'prenom' => $demoContact->contact_prenom,
|
|
'email' => $demoContact->contact_email,
|
|
'code_postal' => $demoContact->contact_cp,
|
|
'commune' => $demoContact->contact_ville,
|
|
'pays' => $demoContact->contact_country,
|
|
'panier' => $basketContent,
|
|
'admin' => 1
|
|
]);
|
|
$panier = new \App\Http\Controllers\PanierController();
|
|
$res = $panier->updateBasket($req);
|
|
$url = "/?basketid=" . $res->original['Panier']->Panier;
|
|
}
|
|
return json_encode($url);
|
|
}
|
|
}
|
|
|
|
// ---- Dépublie une campagne
|
|
public function togglePublish(Request $request, Campagne $campaign, int $state)
|
|
{
|
|
$campaign->camp_published = $state;
|
|
$campaign->save();
|
|
|
|
return json_encode($campaign);
|
|
}
|
|
|
|
public function getDetail(Request $request)
|
|
{
|
|
|
|
$error = false;
|
|
|
|
// ---- Contrôle des paramètres
|
|
if (isset($request->refcamp) && $request->refcamp != "") {
|
|
$refcamp = $request->refcamp;
|
|
$campagne = Campagne::where(['camp_id' => $refcamp])->first();
|
|
if (!$campagne) {
|
|
return response()->json([
|
|
'Statut' => 'KO',
|
|
'Code' => 103,
|
|
'Message' => 'La campagne n\'existe pas'
|
|
]);
|
|
}
|
|
} else {
|
|
$error = true;
|
|
}
|
|
if (isset($request->refsite) && $request->refsite != "") {
|
|
$refsite = $request->refsite;
|
|
$site = Site::where(['site_id' => $refsite])->first();
|
|
if (!$site) {
|
|
return response()->json([
|
|
'Statut' => 'KO',
|
|
'Code' => 102,
|
|
'Message' => 'Le site n\'existe pas'
|
|
]);
|
|
};
|
|
} else {
|
|
$error = true;
|
|
}
|
|
|
|
if ($campagne->camp_siteId != $site->site_id) {
|
|
return response()->json([
|
|
'Statut' => 'KO',
|
|
'Code' => 108,
|
|
'Message' => 'Pas de campagne pour ce site'
|
|
]);
|
|
}
|
|
|
|
if ($error) {
|
|
return response()->json([
|
|
'Statut' => 'KO',
|
|
'Code' => 101,
|
|
'Message' => 'Des paramètres de la requête sont mal renseignés ou non présents'
|
|
]);
|
|
}
|
|
|
|
$enligne = ($campagne->camp_published == 1) ? "oui" : "non";
|
|
switch ($campagne->camp_type) {
|
|
case CampaignTypes::mur():
|
|
$type = "mur";
|
|
break;
|
|
case CampaignTypes::panier():
|
|
$type = "panier";
|
|
break;
|
|
case CampaignTypes::murss():
|
|
$type = "mur sans sélection";
|
|
break;
|
|
case CampaignTypes::paniers():
|
|
$type = "panier avec sélection";
|
|
break;
|
|
}
|
|
$data = array (
|
|
'Site' => $site->site_nom,
|
|
'Ref campagne' => $campagne->camp_id,
|
|
'Nom campagne' => $campagne->camp_name,
|
|
"En ligne" => $enligne,
|
|
"Type" => $type,
|
|
);
|
|
|
|
|
|
$coupons = $campagne->coupons()->get();
|
|
|
|
if ($coupons->count() > 0) {
|
|
foreach ($coupons as $coupon) {
|
|
// ---- Calcul du nombre de BR consommé
|
|
$diffuseMur = Mur::where(['mur_campId' => $campagne->camp_id, 'mur_couponId' => $coupon->coupon_id])->count();
|
|
|
|
$diffusePanier01 = PanierContent::where(['panier_content_couponId' => $coupon->coupon_id])->sum('panier_content_quantity');
|
|
$diffusePanier02 = PanierContent::where(['panier_content_couponId' => $coupon->coupon_id])->sum('panier_content_printed');
|
|
$diffusePanier = $diffusePanier01 + $diffusePanier02;
|
|
|
|
if (!$diffusePanier) {
|
|
$diffusePanier = 0;
|
|
}
|
|
$diffuse = $diffuseMur + $diffusePanier;
|
|
|
|
// ---- Calcul de la quantité restante
|
|
$qRestante = $this->getFullQuantity($coupon) - $this->getUsedQuantity($coupon);
|
|
// ---- En ligne oui/non
|
|
$enligne = ($coupon->coupon_published == 1) ? "oui" : "non";
|
|
|
|
// ---- Calcul de la date de fin de diffusion
|
|
$dateFinDiffusion = "n/c";
|
|
if ($coupon->coupon_maxdatediffusion != null) {
|
|
$dateFinDiffusion = date("d/m/Y", strtotime($coupon->coupon_maxdatediffusion));
|
|
}
|
|
|
|
// ---- Calcul de la date de fin de validité
|
|
$dateFinValidite = "n/c";
|
|
if ($coupon->coupon_maxdatevalidity != null) {
|
|
$dateFinValidite = date("d/m/Y", strtotime($coupon->coupon_maxdatevalidity));
|
|
}
|
|
|
|
$codeTraitement = array (
|
|
"Code traitement" => $coupon->coupon_code,
|
|
"Nom" => $coupon->coupon_name,
|
|
"Nb à diffuser" => $this->getFullQuantity($coupon),
|
|
"Nb diffusé" => $diffuse,
|
|
"Quantité restante" => $qRestante,
|
|
"Valeur faciale" => $coupon->coupon_value . "€",
|
|
"En ligne" => $enligne,
|
|
"Date de fin de diffusion" => $dateFinDiffusion,
|
|
"Date de fin de validité" => $dateFinValidite,
|
|
);
|
|
$data['Coupons'][] = $codeTraitement;
|
|
}//end foreach
|
|
}//end if
|
|
return response()->json([
|
|
'Statut' => 'OK',
|
|
'Détails Campagne' => $data
|
|
]);
|
|
}
|
|
}
|