| Server IP : 34.87.99.72 / Your IP : 216.73.217.31 Web Server : Apache/2.4.46 (Unix) OpenSSL/1.1.1n System : Linux zlock-bitnami-lamp-prod-v2-vm 4.19.0-16-cloud-amd64 #1 SMP Debian 4.19.181-1 (2021-03-19) x86_64 User : bitnami ( 1000) PHP Version : 7.4.18 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : OFF Directory : /opt/bitnami/apache/htdocs/app/app/Http/Services/ |
Upload File : |
<?php
namespace App\Http\Services;
use App\Models\UserCredit;
use App\Models\NotificationMessage;
use Auth;
use DB;
use Queriplex;
use App\Http\Services\NotificationService;
use App\Exports\BasicExcelExport;
use Maatwebsite\Excel\Facades\Excel;
use App\Classes\GCSFileUploader;
use Carbon\Carbon;
class UserCreditService
{
public function __construct(
NotificationService $notificationService
)
{
$this->notificationService = $notificationService;
}
public function userCreditList(Array $request)
{
$query = UserCredit::query();
$userCredit = self::queriplex($query, $request);
$result = $userCredit->orderBy("created_at","DESC")
->paginate($request['itemsPerPage'] ?? null);
$result->load('user');
return $result;
}
public function searchQuery($query, $value, $search_by){
$common_searchable = [
'id',
'title',
];
if(in_array($search_by,$common_searchable)){
$query->search($search_by,$value);
}
else
{
if($search_by == "name"){
$query->whereHas("user",function($q) use ($value){
$q->search("full_name",$value);
});
}
else if($search_by == "created_at")
{
$query->where('created_at', '>=', $value[0]);
if(sizeof($value)>1)
$query->where('created_at', '<=', $value[1]);
}
else if($search_by == "description")
{
$query->search('meta', $value);
}
}
return null;
}
public function insertCredit(Array $request)
{
$userCredit = new UserCredit();
$userCredit->user_id = $request['user_id'];
$userCredit->type_id = $request['type_id'];
$userCredit->title = $request['title'];
$userCredit->amount = $request['amount'];
$userCredit->meta = $request['meta'] ?? [
'description' => $request['description'] ?? null,
];
$userCredit->save();
return $userCredit;
}
public function userCreditCreate(Array $request)
{
$userCredit = self::insertCredit($request);
$this->notificationService->createUserNotification([
'type_id' => NotificationMessage::CREDIT_ADJUSTMENT,
'title' => $userCredit->type_name,
'content' => abs($userCredit->amount)." credit has been ".($userCredit->amount < 0 ? "deducted from" : "added to")." your account.",
'user_id' => $userCredit->user_id,
], $shouldNotifyUser = true);
return $userCredit;
}
public function userCreditRefs()
{
$refs = collect(UserCredit::TYPES);
$refs = $refs->map(function ($item, $key) {
$sign = 1;
if(in_array($key, [ UserCredit::DEDUCT_CREDIT ])){
$sign = -1;
}
return [
"value" => $key,
"text" => $item,
"sign" => $sign,
];
});
return $refs->values();
}
public function userRegisterFreeCredit($user_id)
{
$userCredit = $this->userCreditCreate([
"user_id" => $user_id,
"type_id" => UserCredit::NEW_USER_CREDIT,
"title" => "New User Free Credit",
"amount" => UserCredit::NEW_USER_FREE_CREDIT_AMOUNT,
"meta" => [
"userId" => $user_id
],
]);
return $userCredit;
}
public function queriplex($query, Array $request)
{
$order_mode = ( $request['sortDesc'] ?? false ) ? 'DESC' : 'ASC';
$search_by = $request['searchBy'] ?? null;
// // filter
$userCredit = Queriplex::make($query)
->withFilters($request, [
'id' => 'id',
'type_id' => 'type_id',
'user_id' => function($query, $value){
$query->whereHas('user',function($q) use ($value){
$q->where('id',$value);
});
},
"date" => function($query, $value){
$date_1 = new Carbon($value[0]);
$date_2 = count($value) > 1 ? new Carbon($value[1]) : new Carbon($value[0]);
if($date_1->gt($date_2))
{
$datetime_1 = $date_2->startOfDay();
$datetime_2 = $date_1->endOfDay();
}
else
{
$datetime_1 = $date_1->startOfDay();
$datetime_2 = $date_2->endOfDay();
}
\Debugbar::info($datetime_1, $datetime_2);
$query->whereDate("created_at",'>=',$datetime_1)->whereDate("created_at",'<=',$datetime_2);
},
'search' => ( fn($query, $value) => self::searchQuery($query,$value,$search_by) ),
])
->withSort($request['sortBy'] ?? null, [
"id" => fn($query) => $query->orderBy('id', $order_mode),
"created_at" => fn($query) => $query->orderBy('created_at', $order_mode),
])->apply();
return $userCredit;
}
public function exportUserCreditList(Array $request)
{
$fileUploader = false;
$user = Auth::user();
$userCredits = UserCredit::query();
$userCredits = self::queriplex($userCredits, $request);
$result = $userCredits->orderBy("created_at","DESC")
->get();
if($result->isEmpty())
return false;
$result->load([
'user'
]);
if($user->isSuperAdmin())
{
$data = $result->map(function($item) use($user)
{
return [
'id' => $item->id,
'user' => $item->user ? $item->user->full_name : '-',
'user_email' => $item->user ? $item->user->email : '-',
'user_mobile_num' => $item->user ? $item->user->mobile_num : '-',
'title' => $item->title,
'amount (RM)' => $item->amount,
'description' => $item->meta["description"],
'created_at' => $item->created_at,
];
});
$export = new BasicExcelExport($data);
$file_name = now()->format('Ymdhms')."-User-Credit.xlsx";
Excel::store($export, $file_name);
$fileUploader = new GCSFileUploader($file_name);
$fileUploader->setDirectory('reports/user-credit');
$fileUploader->upload();
}
return $fileUploader;
}
}