*/ protected $fillable = [ 'code', 'name', 'value', 'desktop_image_available', 'desktop_image_unavailable', 'mobile_image_available', 'mobile_image_unavailable', ]; // * METHODS /** * Update discounts. */ 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. */ 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 */ 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. */ public static function getCustomerDiscountsCount(string $hashcode): int { /** @var \LDC\MESBR\MesBr */ $mesBr = app('mesBrAPI'); $customerWall = $mesBr->getMurCustomer($hashcode); if ($customerWall->status === 'KO') { return 0; } if (isset($mesBr->getMurCustomer($hashcode)->coupons)) { return collect($mesBr->getMurCustomer($hashcode)->coupons)->filter(function ($discount) { return ! $discount->used; })->count(); } return 0; } /** * Replace coupons picture host. */ 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. */ public static function getCachedDiscounts(): Collection { return Cache::remember('publishedDiscounts', 86400, function () { return self::query()->get(); }); } }