ECOMMERCE/app/Repositories/Member/Voucher/VoucherRepository.php

150 lines
4.7 KiB
PHP

<?php
namespace App\Repositories\Member\Voucher;
use App\Models\Voucher;
use App\Models\Customer;
use App\Models\User;
use App\Models\Cart;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\ValidationException;
use Carbon\Carbon;
class VoucherRepository
{
public function getList($request)
{
$user_id = auth()->user()->id;
$customer = Customer::where("user_id", $user_id)->first();
$model = Voucher::where('customer_id', (int) @$customer->id)
->where('used_at', null)
->where('expired_at','>=',Carbon::now())
->orderBy('created_at','desc')->paginate($request->limit ?? 100);
return $model;
}
public function getValidByItems($carts, $customer_id)
{
$item_reference_ids = $carts->pluck("item_reference_id")->toArray();
// collect voucher ids valids
if (count($item_reference_ids) == 0){
$item_reference_ids[] = 0;
}
$item_ids = implode(',', $item_reference_ids);
$ids = DB::select("SELECT distinct vouchers.id from vouchers
left join voucher_events on vouchers.voucher_event_id = voucher_events.id
left join voucher_items on voucher_items.voucher_event_id = voucher_events.id
where used_at is null and
(expired_at > now() or expired_at is null) and
customer_id = ? and (
redeem_point > 0 or
( vouchers.voucher_event_id is null and vouchers.item_reference_id is null) or
( vouchers.voucher_event_id is not null and voucher_items.item_reference_id is null) or
( vouchers.item_reference_id is not null and vouchers.item_reference_id in ($item_ids)) or
( vouchers.voucher_event_id is not null and voucher_items.item_reference_id in ($item_ids))
)",[$customer_id]);
$ids = collect($ids)->pluck("id")->toArray();
return $ids;
}
public function getSum($params)
{
$user_id = auth()->user()->id;
$customer = Customer::where("user_id", $user_id)->firstOrFail();
$voucher_ids = $params["voucher_ids"];
// collect item_reference_ids
$cart_ids = @$params["cart_ids"] ?? [];
$carts = Cart::where("user_id", $user_id)
->where(function($query) use ($cart_ids){
if (count($cart_ids)){
$query->whereIn("id", $cart_ids);
}
})
->get();
$ids = $this->getValidByItems($carts, $customer->id);
return Voucher::where('customer_id', (int) @$customer->id)
->where('used_at', null)
->whereIn('id', $ids)
->whereIn('id', $ids)
->orderBy('created_at','desc')
->get();
}
public function getValid($params)
{
$user_id = auth()->user()->id;
$customer = Customer::where("user_id", $user_id)->first();
$limit = $params["limit"] ?? 10;
// collect item_reference_ids
$cart_ids = @$params["cart_ids"] ?? [];
$carts = Cart::where("user_id", $user_id)
->where(function($query) use ($cart_ids){
if (count($cart_ids)){
$query->whereIn("id", $cart_ids);
}
})
->get();
$ids = $this->getValidByItems($carts, $customer->id);
return Voucher::where('customer_id', (int) @$customer->id)
->where('used_at', null)
->orderBy('created_at','desc')->paginate($limit)
->transform(function ($voucher, $key) use ($ids) {
$voucher->is_valid = in_array($voucher->id, $ids);
return $voucher;
});
}
public function detail($id)
{
$model = Voucher::findOrFail($id);
return $model;
}
public function send($id, $data)
{
$model = DB::transaction(function () use ($id, $data) {
$customer = Customer::where("user_id", $data['customer_id'])->firstOrFail();
$model = Voucher::findOrFail($id);
\Log::info("VOUCHER SEND FROM ".$model->customer_id." TO ".$customer->id);
$model->customer_id = $customer->id;
$model->save();
return $model;
});
return $model;
}
public function phoneCheck($data)
{
$model = DB::transaction(function () use ($data) {
$model = Customer::where('phone', $data['phone'])->first();
if ($model->user_id == null) {
throw ValidationException::withMessages([
"phone" => "User dari phone number belum terdaftar"
]);
}
$model = User::findOrfail($model->user_id);
return $model;
});
return $model;
}
}