ldc-legaulois/app/Models/Discount.php
2024-10-23 16:42:29 +00:00

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();
});
}
}