ldc-mesbr-app/app/Traits/CouponTrait.php

378 lines
14 KiB
PHP
Raw Permalink Normal View History

2019-02-13 16:37:14 +01:00
<?php
namespace App\Traits;
use App\Models\Campagne;
use App\Models\Coupon;
use App\Models\Contact;
use App\Models\Calendrier;
use App\Enums\CampaignTypes;
2021-04-27 17:29:47 +02:00
use App\Models\Customers;
2025-08-14 17:05:09 +02:00
use App\Models\PrintedCoupons;
use App\Models\Mouvement;
use App\Models\Mur;
use App\Models\Panier;
use App\Models\PanierContent;
2019-02-13 16:37:14 +01:00
2021-04-27 17:29:47 +02:00
trait CouponTrait
{
public function getCouponsPublished(Campagne $campagne)
{
$coupons = $campagne->coupons()->get();
foreach ($coupons as $key => $coupon) {
// ---- Contrôle de la publication
2021-04-27 17:29:47 +02:00
if ($coupon->coupon_published == 0) {
$coupons->forget($key);
}
// ---- Contrôle la date de début de diffusion
2021-04-27 17:29:47 +02:00
if ($coupon->coupon_mindatediffusion != null) {
if (strtotime(date('Y-m-d')) < strtotime($coupon->coupon_mindatediffusion)) {
$coupons->forget($key);
}
}
2021-04-27 17:29:47 +02:00
// ---- Contrôle la date de validité
2021-04-27 17:29:47 +02:00
if ($coupon->coupon_maxdatediffusion != null) {
if (strtotime(date('Y-m-d')) > strtotime($coupon->coupon_maxdatediffusion)) {
$coupons->forget($key);
}
}
2021-04-27 17:29:47 +02:00
// ---- Contrôle des calendriers de diffusion
$calendars = Calendrier::where(['calendrier_couponId' => $coupon->coupon_id])->get();
2021-04-27 17:29:47 +02:00
if (isset($calendars) && !$calendars->isEmpty()) {
$pub = false;
foreach ($calendars as $calendar) {
if ($calendar->isPublished()) {
$pub = true;
}
}
2021-04-27 17:29:47 +02:00
if (!$pub) {
$coupons->forget($key);
}
}
2025-04-03 09:30:16 +02:00
}//end foreach
return $coupons;
}
2021-04-27 17:29:47 +02:00
public function getPanierContentPublished(Panier $panier)
{
$panierContents = $panier->panierContents()->get();
foreach ($panierContents as $key => $panierContent) {
$coupon = Coupon::where(['coupon_id' => $panierContent->panier_content_couponId])->first();
// ---- Contrôle de la publication
2021-04-27 17:29:47 +02:00
if ($coupon->coupon_published == 0) {
$panierContents->forget($key);
}
// ---- Contrôle la date de début de diffusion
2021-04-27 17:29:47 +02:00
if ($coupon->coupon_mindatediffusion != null) {
if (strtotime(date('Y-m-d')) < strtotime($coupon->coupon_mindatediffusion)) {
$panierContents->forget($key);
}
}
// ---- Contrôle la date de validité
2021-04-27 17:29:47 +02:00
if ($coupon->coupon_maxdatediffusion != null) {
if (strtotime(date('Y-m-d')) > strtotime($coupon->coupon_maxdatediffusion)) {
$panierContents->forget($key);
}
}
// ---- Contrôle des calendriers de diffusion
$calendars = Calendrier::where(['calendrier_couponId' => $coupon->coupon_id])->get();
2021-04-27 17:29:47 +02:00
if (isset($calendars) && !$calendars->isEmpty()) {
$pub = false;
foreach ($calendars as $calendar) {
if ($calendar->isPublished()) {
$pub = true;
}
}
2021-04-27 17:29:47 +02:00
if (!$pub) {
$panierContents->forget($key);
}
}
2025-04-03 09:30:16 +02:00
}//end foreach
return $panierContents;
}
2021-04-27 17:29:47 +02:00
public function getCountCouponsPanierPublished(Panier $panier)
{
$panierContents = $panier->panierContents()->get();
foreach ($panierContents as $key => $panierContent) {
$coupon = Coupon::where(['coupon_id' => $panierContent->panier_content_couponId])->firstOrFail();
// ---- Contrôle de la publication
2021-04-27 17:29:47 +02:00
if ($coupon->coupon_published == 0) {
$panierContents->forget($key);
}
2021-04-27 17:29:47 +02:00
// ---- Contrôle la date de début de diffusion
2021-04-27 17:29:47 +02:00
if ($coupon->coupon_mindatediffusion != null) {
if (strtotime(date('Y-m-d')) < strtotime($coupon->coupon_mindatediffusion)) {
$panierContents->forget($key);
}
}
// ---- Contrôle la date de validité
2021-04-27 17:29:47 +02:00
if ($coupon->coupon_maxdatediffusion != null) {
if (strtotime(date('Y-m-d')) > strtotime($coupon->coupon_maxdatediffusion)) {
$panierContents->forget($key);
}
}
2021-04-27 17:29:47 +02:00
// ---- Contrôle des calendriers de diffusion
$calendars = Calendrier::where(['calendrier_couponId' => $coupon->coupon_id])->get();
2021-04-27 17:29:47 +02:00
if (isset($calendars) && !$calendars->isEmpty()) {
$pub = false;
foreach ($calendars as $calendar) {
if ($calendar->isPublished()) {
$pub = true;
}
}
2021-04-27 17:29:47 +02:00
if (!$pub) {
$panierContents->forget($key);
}
}
2025-04-03 09:30:16 +02:00
}//end foreach
2019-02-13 16:37:14 +01:00
$count = 0;
2021-04-27 17:29:47 +02:00
foreach ($panierContents as $panierContent) {
$count = $count + $panierContent->panier_content_quantity;
}
return $count;
}
2021-04-27 17:29:47 +02:00
public function isAvailableToPrint(Coupon $coupon, Campagne $campagne)
{
/**
* Contrôle de la publication de la campagne
*/
if ($campagne->camp_published === 0) {
return false;
}
// ---- Contrôle de la publication du coupon
if ($coupon->coupon_published === 0) {
return false;
2019-02-28 13:58:25 +01:00
}
2021-04-27 17:29:47 +02:00
// ---- Contrôle la date de début de diffusion
if ($coupon->coupon_mindatediffusion !== null) {
2021-04-27 17:29:47 +02:00
if (strtotime(date('Y-m-d')) < strtotime($coupon->coupon_mindatediffusion)) {
return false;
}
}
2019-02-28 13:58:25 +01:00
// ---- Contrôle la date de validité
if ($coupon->coupon_maxdatediffusion !== null) {
2021-04-27 17:29:47 +02:00
if (strtotime(date('Y-m-d')) > strtotime($coupon->coupon_maxdatediffusion)) {
return false;
2019-02-28 13:58:25 +01:00
}
}
2021-04-27 17:29:47 +02:00
2019-02-28 13:58:25 +01:00
// ---- Contrôle des calendriers de diffusion
$calendars = Calendrier::where(['calendrier_couponId' => $coupon->coupon_id])->get();
2021-04-27 17:29:47 +02:00
if (isset($calendars) && !$calendars->isEmpty()) {
2019-02-28 13:58:25 +01:00
$pub = false;
foreach ($calendars as $calendar) {
if ($calendar->isPublished()) {
2019-02-28 13:58:25 +01:00
$pub = true;
}
}
2021-04-27 17:29:47 +02:00
if (!$pub) {
return false;
2019-02-28 13:58:25 +01:00
}
}
return true;
2019-02-28 13:58:25 +01:00
}
2021-04-27 17:29:47 +02:00
public function isPausedToPrint(Coupon $coupon, Campagne $campagne)
{
2019-03-18 09:52:43 +01:00
// ---- Contrôle la date de début de diffusion
if ($coupon->coupon_mindatediffusion !== null) {
2021-04-27 17:29:47 +02:00
if (strtotime(date('Y-m-d')) < strtotime($coupon->coupon_mindatediffusion)) {
return false;
2019-03-18 09:52:43 +01:00
}
}
// ---- Contrôle la date de validité
if ($coupon->coupon_maxdatediffusion !== null) {
2021-04-27 17:29:47 +02:00
if (strtotime(date('Y-m-d')) > strtotime($coupon->coupon_maxdatediffusion)) {
return false;
2019-03-18 09:52:43 +01:00
}
}
2021-04-27 17:29:47 +02:00
2019-03-18 09:52:43 +01:00
// ---- Contrôle des calendriers de diffusion
$calendars = Calendrier::where(['calendrier_couponId' => $coupon->coupon_id])->get();
2021-04-27 17:29:47 +02:00
if (isset($calendars) && !$calendars->isEmpty()) {
2019-03-18 09:52:43 +01:00
$pub = false;
foreach ($calendars as $calendar) {
if ($calendar->isPublished()) {
2019-03-18 09:52:43 +01:00
$pub = true;
}
}
2021-04-27 17:29:47 +02:00
if (!$pub) {
return false;
2019-03-18 09:52:43 +01:00
}
}
return true;
2019-03-18 09:52:43 +01:00
}
2021-04-27 17:29:47 +02:00
public function isAvailable(Coupon $coupon, Campagne $campagne, Contact $contact)
{
$available = true;
2019-02-13 16:37:14 +01:00
// ---- Contrôle le nombre limite d'impression
2021-04-27 17:29:47 +02:00
if ($coupon->coupon_enablelimitquantity == 1 && $coupon->coupon_enablelimitquantity > 0) {
2019-02-13 16:37:14 +01:00
$stat = Mur::where([
2021-04-27 17:29:47 +02:00
'mur_campId' => $campagne->camp_id,
'mur_contactId' => $contact->contact_id,
'mur_couponId' => $coupon->coupon_id,
2019-02-13 16:37:14 +01:00
'mur_deleted' => 0 ])
->count();
2021-04-27 17:29:47 +02:00
if ($stat >= $coupon->coupon_limitquantity) {
2019-02-13 16:37:14 +01:00
$available = false;
}
}
// ---- Contrôle la limite de période de diffusion
2021-04-27 17:29:47 +02:00
if ($coupon->coupon_enablelimitperiod == 1 && $coupon->coupon_limitperiod > 0) {
2019-02-13 16:37:14 +01:00
$stat = Mur::where([
2021-04-27 17:29:47 +02:00
'mur_campId' => $campagne->camp_id,
'mur_contactId' => $contact->contact_id,
'mur_couponId' => $coupon->coupon_id,
2019-02-13 16:37:14 +01:00
'mur_deleted' => 0 ])
->orderBy('mur_createdate', 'DESC')
->first();
2021-04-27 17:29:47 +02:00
if (isset($stat) && $stat->count() > 0) {
$dateDisponibilite = date('Y-m-d', strtotime($stat->mur_createdate . " +" . $coupon->coupon_limitperiod . " days"));
if ($dateDisponibilite > date('Y-m-d')) {
2019-02-13 16:37:14 +01:00
$available = false;
}
}
}
return $available;
}
2019-02-20 16:26:32 +01:00
2021-04-27 17:29:47 +02:00
public function getFullQuantity(Coupon $coupon)
{
return (int)Mouvement::where('mouvement_couponId', $coupon->coupon_id)->sum('mouvement_nombre');
2019-02-20 16:26:32 +01:00
}
2021-04-27 17:29:47 +02:00
public function getUsedQuantity(Coupon $coupon)
{
2019-02-20 16:26:32 +01:00
$countPrinted = 0;
foreach ($coupon->campagnes as $campagne) {
if ($campagne->camp_type->equals(CampaignTypes::mur()) || $campagne->camp_type->equals(CampaignTypes::murss())) {
// Murs
$murs = Mur::where(['mur_campid' => $campagne->camp_id, 'mur_couponId' => $coupon->coupon_id])->count();
$countPrinted += $murs;
2025-04-03 09:30:16 +02:00
} else {
// Paniers
// TODO : Revoir la requete
$campagneId = $campagne->camp_id;
$countPrinted = PanierContent::where('panier_content_couponId', $coupon->coupon_id)->whereHas('panier', function ($query) use ($campagneId) {
2019-07-10 14:36:55 +02:00
$query->where('panier_campId', $campagneId);
})->sum('panier_content_printed');
2019-02-20 16:26:32 +01:00
}
}
return $countPrinted;
}
2019-03-18 08:58:41 +01:00
2021-04-27 17:29:47 +02:00
public function getDiffusedQuantity(Coupon $coupon)
{
2019-05-07 09:43:55 +02:00
$countPrinted = 0;
foreach ($coupon->campagnes as $campagne) {
if ($campagne->camp_type->equals(CampaignTypes::mur()) || $campagne->camp_type->equals(CampaignTypes::murss())) {
// Murs
$murs = Mur::where(['mur_campid' => $campagne->camp_id, 'mur_couponId' => $coupon->coupon_id])->count();
$countPrinted += $murs;
2025-04-03 09:30:16 +02:00
} else {
// Paniers
2025-04-03 09:30:16 +02:00
$campagneId = $campagne->camp_id;
$panierContents = PanierContent::where('panier_content_couponId', $coupon->coupon_id)->whereHas('panier', function ($query) use ($campagneId) {
2019-07-10 14:36:55 +02:00
$query->where('panier_campId', $campagneId);
})->get();
2025-04-03 09:30:16 +02:00
$panierContentCountPrinted = $panierContents->sum('panier_content_printed');
2021-04-27 17:29:47 +02:00
$panierContentCountDiffused = $panierContents->sum('panier_content_quantity');
2025-04-03 09:30:16 +02:00
$countPrinted = $countPrinted + $panierContentCountPrinted + $panierContentCountDiffused;
2019-05-07 09:43:55 +02:00
}
}
return $countPrinted;
}
2021-04-27 17:29:47 +02:00
public function getUsedQuantityOnPeriod(Coupon $coupon, $startdate, $enddate)
{
2019-03-18 08:58:41 +01:00
$countPrinted = 0;
2025-04-03 09:30:16 +02:00
$startdate = date('Y-m-d H:i:s', strtotime($startdate));
$enddate = date('Y-m-d H:i:s', strtotime($enddate));
$campagnes = $coupon->campagnes()->get();
2019-03-18 08:58:41 +01:00
foreach ($campagnes as $campagne) {
if ($campagne->camp_type->equals(CampaignTypes::mur()) || $campagne->camp_type->equals(CampaignTypes::murss())) {
2025-04-03 09:30:16 +02:00
// Murs
$murs = Mur::where(['mur_campid' => $campagne->camp_id, 'mur_couponId' => $coupon->coupon_id])->whereBetween('mur_createdate', [$startdate, $enddate])->get();
2021-04-27 17:29:47 +02:00
$countPrinted = $countPrinted + count($murs);
2025-04-03 09:30:16 +02:00
} else {
// Paniers
2021-04-27 17:29:47 +02:00
$paniers = Panier::where(['panier_campId' => $campagne->camp_id])->where(function ($query) use ($startdate, $enddate) {
2019-03-18 08:58:41 +01:00
$query->whereBetween('panier_createdate', [$startdate, $enddate])
->orWhereBetween('panier_updatedate', [$startdate, $enddate]);
})->get();
foreach ($paniers as $key => $panier) {
$panierContentCount = $panier->panierContents->sum('panier_content_printed');
2025-04-03 09:30:16 +02:00
$countPrinted = $countPrinted + $panierContentCount;
2019-03-18 08:58:41 +01:00
}
}
}
return $countPrinted;
}
2021-04-27 17:29:47 +02:00
// VB 22/04/2021
public function isUsed(Coupon $coupon, Campagne $campagne, Customers $customer)
{
2021-08-05 12:06:24 +02:00
$isUsed = false;
2021-04-27 17:29:47 +02:00
// ---- Contrôle le nombre limite d'impression
if ($coupon->coupon_enablelimitquantity === 1) {
2025-08-14 17:05:09 +02:00
$count = PrintedCoupons::where(
2021-04-27 17:29:47 +02:00
[
2021-08-05 12:06:24 +02:00
['camp_id', '=', $campagne->camp_id],
['coupon_id', '=', $coupon->coupon_id],
2021-04-27 17:29:47 +02:00
['customer_id', '=', $customer->id]
]
)->count();
if ($count >= $coupon->coupon_limitquantity) {
2021-08-05 12:06:24 +02:00
$isUsed = true;
2021-04-27 17:29:47 +02:00
}
}
// ---- Contrôle la limite de période de diffusion
if ($coupon->coupon_enablelimitperiod === 1 && $coupon->coupon_limitperiod > 0) {
2025-08-14 17:05:09 +02:00
$count = PrintedCoupons::where(
2021-04-27 17:29:47 +02:00
[
2021-08-05 12:06:24 +02:00
['camp_id', '=', $campagne->camp_id],
['coupon_id', '=', $coupon->coupon_id],
2021-04-27 17:29:47 +02:00
['customer_id', '=', $customer->id]
]
)->orderBy('created_at', 'DESC')->first();
if ($count && $count->count() > 0) {
$date = date('Y-m-d', strtotime($count->created_at . " +" . $coupon->coupon_limitperiod . " days"));
if ($date > date('Y-m-d')) {
2021-08-05 12:06:24 +02:00
$isUsed = true;
2021-04-27 17:29:47 +02:00
}
}
}
2021-08-05 12:06:24 +02:00
return $isUsed;
2021-04-27 17:29:47 +02:00
}
}