209 lines
6.8 KiB
PHP
209 lines
6.8 KiB
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use App\Lib\Helpers\FileStorageHelper;
|
|
use App\Traits\Models\ActivityLog;
|
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Support\Arr;
|
|
use Illuminate\Support\Str;
|
|
use Illuminate\Support\Facades\Cache;
|
|
|
|
/**
|
|
* @property string $name Discount name.
|
|
* @property string $picture Discount picture.
|
|
* @property string $desktop_image_available Discount desktop image available.
|
|
* @property string $desktop_image_unavailable Discount desktop image unavailable.
|
|
* @property string $mobile_image_available Discount mobile image available.
|
|
* @property string $mobile_image_unavailable Discount mobile image unavailable.
|
|
* @property integer $code Discount code.
|
|
* @property float $value Discount value.
|
|
* @property-read \Carbon\Carbon $created_at Created date.
|
|
* @property-read \Carbon\Carbon $updated_at Updated date.
|
|
*/
|
|
class Discount extends Model
|
|
{
|
|
use ActivityLog;
|
|
use HasFactory;
|
|
|
|
/**
|
|
* The attributes that are mass assignable.
|
|
*
|
|
* @var array<int, string>
|
|
*/
|
|
protected $fillable = [
|
|
'code',
|
|
'name',
|
|
'value',
|
|
'desktop_image_available',
|
|
'desktop_image_unavailable',
|
|
'mobile_image_available',
|
|
'mobile_image_unavailable',
|
|
];
|
|
|
|
// * METHODS
|
|
|
|
/**
|
|
* Update discounts.
|
|
*
|
|
* @return void
|
|
*/
|
|
public static function updateDiscounts(): void
|
|
{
|
|
// Get all discounts from api.
|
|
$coupons = collect(self::getStaticBr()->coupons);
|
|
|
|
// Get all discounts from database.
|
|
$discountModels = self::all();
|
|
|
|
// Remove all non existent discounts.
|
|
foreach ($discountModels as $discountModel) {
|
|
if (($coupon = $coupons->where('code', $discountModel->code)->first())) {
|
|
self::fillModel($discountModel, \json_decode(\json_encode($coupon), true));
|
|
$coupons->forget([$coupons->search(function ($i) use ($coupon) {
|
|
return $coupon->code == $i->code;
|
|
})]);
|
|
} else {
|
|
$discountModel->deleteOrFail();
|
|
}
|
|
}
|
|
|
|
// Save all new discounts.
|
|
foreach (\json_decode(\json_encode($coupons), true) as $coupon) {
|
|
$discountModel = new self();
|
|
self::fillModel($discountModel, $coupon);
|
|
}
|
|
self::getCachedDiscounts();
|
|
}
|
|
|
|
/**
|
|
* Fill an existing discount model with a specific coupon.
|
|
*
|
|
* @param self $discountModel
|
|
* @param array $coupon
|
|
* @return void
|
|
*/
|
|
private static function fillModel(self $discountModel, array $coupon): void
|
|
{
|
|
$discountModel->name = $coupon['name'];
|
|
$discountModel->desktop_image_available = FileStorageHelper::storeFile(
|
|
$discountModel,
|
|
$coupon['desktop_image_available'],
|
|
true
|
|
);
|
|
$discountModel->desktop_image_unavailable = FileStorageHelper::storeFile(
|
|
$discountModel,
|
|
$coupon['desktop_image_unavailable'],
|
|
true
|
|
);
|
|
$discountModel->mobile_image_available = FileStorageHelper::storeFile(
|
|
$discountModel,
|
|
$coupon['mobile_image_available'],
|
|
true
|
|
);
|
|
$discountModel->mobile_image_unavailable = FileStorageHelper::storeFile(
|
|
$discountModel,
|
|
$coupon['mobile_image_unavailable'],
|
|
true
|
|
);
|
|
$discountModel->code = $coupon['code'];
|
|
$discountModel->value = $coupon['value'];
|
|
$discountModel->saveOrFail();
|
|
}
|
|
|
|
/**
|
|
* Static method to fetch br List.
|
|
* ! see fetchActiveBr for output object definition
|
|
*
|
|
* @return object|null
|
|
*/
|
|
public static function getStaticBr(): ?object
|
|
{
|
|
/** @var \LDC\MESBR\MesBr */
|
|
$mesBr = app('mesBrAPI');
|
|
$message = null;
|
|
|
|
try {
|
|
$res = $mesBr->getMur();
|
|
if (!$res) {
|
|
$message = 'ERROR MesBR API : getMur on api failed';
|
|
} elseif (Arr::get((array)$res, 'status') === 'KO') {
|
|
$message = Arr::get(
|
|
(array)$res,
|
|
'message',
|
|
'ERROR MesBR API : getMur on api failed (no message)'
|
|
);
|
|
}
|
|
|
|
if ($message === null) {
|
|
// * Replace local picture urls for dev Env
|
|
if (config('app.env') === 'local') {
|
|
$res = self::replaceCouponsPictureHost($res);
|
|
}
|
|
return $res;
|
|
}
|
|
report(new \RuntimeException($message));
|
|
return null;
|
|
} catch (\Exception $e) {
|
|
report($e);
|
|
return null;
|
|
} //end try
|
|
}
|
|
|
|
/**
|
|
* Get customer discounts count.
|
|
*
|
|
* @param string $hashcode
|
|
* @return integer
|
|
*/
|
|
public static function getCustomerDiscountsCount(string $hashcode): int
|
|
{
|
|
/** @var \LDC\MESBR\MesBr */
|
|
$mesBr = app('mesBrAPI');
|
|
$customerWall = $mesBr->getMurCustomer($hashcode);
|
|
if ($customerWall->status === "KO") {
|
|
return 0;
|
|
}
|
|
|
|
return collect($mesBr->getMurCustomer($hashcode)->coupons)->filter(function ($discount) {
|
|
return !$discount->used;
|
|
})->count();
|
|
}
|
|
|
|
/**
|
|
* Replace coupons picture host.
|
|
*
|
|
* @param object $res
|
|
* @return object
|
|
*/
|
|
public static function replaceCouponsPictureHost(object $res): object
|
|
{
|
|
$replaceUrl = fn(?string $url) => $url ? Str::replace(
|
|
'https://dev.mesbr.eu',
|
|
config('mesbr.endpoint'),
|
|
$url
|
|
) : $url;
|
|
|
|
$res->coupons = collect($res->coupons)->map(fn(object $coupon) =>
|
|
(object)array_merge((array)$coupon, [
|
|
'desktop_image_available' => $replaceUrl($coupon->desktop_image_available),
|
|
'desktop_image_unavailable' => $replaceUrl($coupon->desktop_image_unavailable),
|
|
'mobile_image_available' => $replaceUrl($coupon->mobile_image_available),
|
|
'mobile_image_unavailable' => $replaceUrl($coupon->mobile_image_unavailable),
|
|
]))->all();
|
|
return $res;
|
|
}
|
|
|
|
/**
|
|
* Get cached discounts or remember it for 24h.
|
|
*
|
|
* @return \Illuminate\Database\Eloquent\Collection
|
|
*/
|
|
public static function getCachedDiscounts(): \Illuminate\Database\Eloquent\Collection
|
|
{
|
|
return Cache::remember('publishedDiscounts', 86400, function () {
|
|
return self::query()->get();
|
|
});
|
|
}
|
|
}
|