/home/thegtkjw/cresviafinancial.com/project__549d4a8/app/Http/Controllers/Admin/LoanController.php
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Currency;
use App\Models\InstallmentLog;
use App\Models\User;
use App\Models\UserLoan;
use Illuminate\Http\Request;
use Datatables;
use Illuminate\Support\Carbon;
class LoanController extends Controller
{
public function __construct()
{
}
public function datatables(Request $request)
{
if($request->status == 'all'){
$datas = UserLoan::orderBy('id','desc')->get();
}else{
$datas = UserLoan::where('status',$request->status)->orderBy('id','desc')->get();
}
return Datatables::of($datas)
->editColumn('transaction_no', function(UserLoan $data) {
return '<div>
'.$data->transaction_no.'
<br>
<span class="text-info">'.$data->plan->title.'</span>
</div>';
})
->editColumn('user_id', function(UserLoan $data){
return '<div>
<span>'.$data->user->name.'</span>
<p>'.$data->user->account_number.'</p>
</div>';
})
->editColumn('loan_amount', function(UserLoan $data){
$curr = Currency::where('is_default','=',1)->first();
return '<div>
'.$curr->sign.$data->loan_amount.'
<br>
<span class="text-info">Per Installment '.$curr->sign.$data->per_installment_amount.'</span>
</div>';
})
->editColumn('total_installment', function(UserLoan $data) {
return '<div>
'.$data->total_installment.'
<br>
<span class="text-info">'.$data->given_installment.' Given</span>
</div>';
})
->editColumn('total_amount', function(UserLoan $data) {
$curr = Currency::where('is_default','=',1)->first();
return '<div>
'.$curr->sign.round($data->total_installment * $data->per_installment_amount,2).'
<br>
<span class="text-info">Paid Amount '.$curr->sign.$data->paid_amount.'</span>
</div>';
})
->editColumn('next_installment', function(UserLoan $data){
return $data->next_installment ? Carbon::parse($data->next_installment)->toDateString() : '--';
})
->addColumn('status', function(UserLoan $data) {
if($data->status==0){
$status= __('Pending');
}
elseif($data->status==1){
$status= __('Running');
}
elseif($data->status==3){
$status=__('Completed');
}
else{
$status=__('Rejected');
}
if($data->status==1){
$status_sign='success';
}
elseif($data->status==0){
$status_sign='warning';
}
elseif($data->status==3){
$status_sign='info';
}
else{
$status_sign='danger';
}
if($data->status==3){
return '<div class="btn-group mb-1">
<span class="badge bg-'.$status_sign.'">'.$status .'</span>
</div>';
}else{
return '<div class="btn-group mb-1">
<button type="button" class="btn btn-'.$status_sign.' btn-sm btn-rounded dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
'.$status .'
</button>
<div class="dropdown-menu" x-placement="bottom-start">
<a href="javascript:;" data-toggle="modal" data-target="#statusModal" class="dropdown-item" data-href="'. route('admin.loan.status',['id1' => $data->id, 'id2' => 0]).'">'.__("Pending").'</a>
<a href="javascript:;" data-toggle="modal" data-target="#statusModal" class="dropdown-item" data-href="'. route('admin.loan.status',['id1' => $data->id, 'id2' => 1]).'">'.__("Approved").'</a>
<a href="javascript:;" data-toggle="modal" data-target="#statusModal" class="dropdown-item" data-href="'. route('admin.loan.status',['id1' => $data->id, 'id2' => 2]).'">'.__("Rejected").'</a>
</div>
</div>';
}
})
->addColumn('action', function(UserLoan $data) {
return '<div class="btn-group mb-1">
<button type="button" class="btn btn-primary btn-sm btn-rounded dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
'.'Actions' .'
</button>
<div class="dropdown-menu" x-placement="bottom-start">
<a href="' . route('admin.loan.log.show',$data->id) . '" class="dropdown-item">'.__("Logs").'</a>
<a href="' . route('admin.loan.show',$data->id) . '" class="dropdown-item">'.__("Details").'</a>
</div>
</div>';
})
->rawColumns(['transaction_no','user_id','loan_amount','total_installment','total_amount','next_installment','status','action'])
->toJson();
}
public function index(){
$this->installmentCheck();
return view('admin.loan.index');
}
public function running(){
$this->installmentCheck();
return view('admin.loan.running');
}
public function completed(){
return view('admin.loan.completed');
}
public function pending(){
return view('admin.loan.pending');
}
public function rejected(){
return view('admin.loan.rejected');
}
public function status($id1,$id2){
$data = UserLoan::findOrFail($id1);
if($data->status == 1){
$msg = 'Already Running this loan!';
return response()->json($msg);
}
if($id2 == 1){
if($user = User::where('id',$data->user_id)->first()){
$user->balance += $data->loan_amount;
$user->update();
}
$data->next_installment = Carbon::now()->addDays($data->plan->installment_interval);
}
$data->status = $id2;
$data->update();
$msg = 'Data Updated Successfully.';
return response()->json($msg);
}
public function show($id){
$data = UserLoan::findOrFail($id);
$data['requiredInformations'] = json_decode($data->required_information,true);
$data['data'] = $data;
$data['currency'] = Currency::whereIsDefault(1)->first();
return view('admin.loan.show',$data);
}
public function logShow($id){
$loan = UserLoan::findOrfail($id);
$logs = InstallmentLog::where('transaction_no',$loan->transaction_no)->latest()->paginate(20);
$currency = Currency::whereIsDefault(1)->first();
return view('admin.loan.log',compact('loan','logs','currency'));
}
public function installmentCheck(){
$loans = UserLoan::whereStatus(1)->get();
$now = Carbon::now();
foreach($loans as $key=>$data){
if($data->given_installment == $data->total_installment){
return false;
}
if($now->gt($data->next_installment)){
$this->takeLoanAmount($data->user_id,$data->per_installment_amount);
$this->logCreate($data->transaction_no,$data->per_installment_amount,$data->user_id);
$data->next_installment = Carbon::now()->addDays($data->plan->installment_interval);
$data->given_installment += 1;
$data->paid_amount += $data->per_installment_amount;
$data->update();
if($data->given_installment == $data->total_installment){
$this->paid($data);
}
}
}
}
public function takeLoanAmount($userId,$installment){
$user = User::whereId($userId)->first();
if($user && $user->balance>=$installment){
$user->balance -= $installment;
$user->update();
}
}
public function paid($loan){
$loan = UserLoan::whereId($loan->id)->first();
if($loan){
$loan->status = 3;
$loan->next_installment = NULL;
$loan->update();
}
}
public function logCreate($transactionNo,$amount,$userId){
$data = new InstallmentLog();
$data->user_id = $userId;
$data->transaction_no = $transactionNo;
$data->type = 'loan';
$data->amount = $amount;
$data->save();
}
}