/home/thegtkjw/cresviafinancial.com/project__549d4a8/app/Http/Controllers/Admin/FdrController.php
<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\Currency;
use App\Models\User;
use App\Models\UserFdr;
use Illuminate\Http\Request;
use Datatables;
use Illuminate\Support\Carbon;

class FdrController extends Controller
{
    public function __construct()
    {

    }

    public function datatables(Request $request)
    {
         if($request->status == 'all'){
            $datas = UserFdr::orderBy('id','desc')->get();
          }else{
            $datas = UserFdr::where('status',$request->status)->orderBy('id','desc')->get();
          }

         return Datatables::of($datas)

                            ->editColumn('transaction_no', function(UserFdr $data) {
                                return '<div>
                                        '.$data->transaction_no.'
                                        <br>
                                        <span class="text-info">'.$data->plan->title.'</span>
                                </div>';

                            }) 
                            ->editColumn('amount', function(UserFdr $data){
                                $curr = Currency::where('is_default','=',1)->first();
                                return  '<div>
                                            '.$curr->sign.$data->amount.'
                                            <br>
                                            <span class="text-info">Profit Rate '.$data->interest_rate.' (%)</span>
                                        </div>';
                            })
                            ->editColumn('user_id', function(UserFdr $data){

                                return '<div>
                                            <span>'.$data->user->name.'</span>
                                            <p>'.$data->user->account_number.'</p>
                                        </div>';
                            })

                            ->editColumn('profit_type', function(UserFdr $data) {
                                return $data->profit_type;
                            })

                            ->editColumn('profit_amount', function(UserFdr $data) {
                                $curr = Currency::where('is_default','=',1)->first();
                                $nextProfitTime = $data->next_profit_time != NULL ? Carbon::parse($data->next_profit_time)->toDateString() : 'Closed FDR';
                                if($data->profit_type == 'partial'){
                                    return '<div>
                                            '.$curr->sign.$data->profit_amount.'
                                            <br>
                                            <span class="text-info"> '.__('Next Frofit Days').' ('.$nextProfitTime.')</span>
                                        </div>';
                                }else{
                                    if($data->status == 2){
                                        return '<div>
                                                <span class="text-success">'.$curr->sign.$data->profit_amount.'</span>
                                            </div>';
                                    }
                                    return '<div>
                                                '.$curr->sign.$data->profit_amount.'
                                                <br>
                                                <span class="text-info"> '.__('Profit will get after locked period').' </span>
                                            </div>';
                                }
                            })

                            ->editColumn('status', function(UserFdr $data) {
                                $status      = $data->status == 1 ? _('Running') : _('Closed');
                                $status_sign = $data->status == 1 ? 'info'   : 'danger';

                                return '<div class="btn-group mb-1">
                                        <span class="badge bg-'.$status_sign.' text-white">'.$status .'</span>
                              </div>';
                            })

                            ->rawColumns(['transaction_no','amount','user_id','profit_type','profit_amount','status'])
                            ->toJson();
    }

    public function index(){
        $this->nextProfitCheck();
        return view('admin.fdr.index');
    }

    public function running(){
        $this->nextProfitCheck();
        return view('admin.fdr.running');
    }

    public function closed(){
        return view('admin.fdr.closed');
    }

    public function nextProfitCheck(){
        $fdrs = UserFdr::whereStatus(1)->orderBy('id','desc')->get();
        $now = Carbon::now();

        foreach($fdrs as $key=>$data){
            if($data->profit_type == 'partial'){
                if($now->gt($data->next_profit_time)){
                    $this->getPartialProfit($data->id);

                    if($now->gt($data->matured_time)){
                        $this->closedFdr($data->id);
                    }
                }
            }else{
                if($now->gt($data->matured_time)){
                    $this->getFixedProfit($data);
                }
            }
        }
    }

    public function getPartialProfit($id){
        $fdr = UserFdr::findOrFail($id);
        if($fdr){
            $this->getUserProfit($fdr->user_id,$fdr->profit_amount);

            $fdr->next_profit_time = Carbon::now()->addDays($fdr->plan->interest_interval);
            $fdr->update();
        }
    }

    public function getFixedProfit($data){
        $fdr = UserFdr::findOrFail($data->id);

        if($fdr){
            $this->getUserProfit($fdr->user_id,$fdr->profit_amount);
            $this->getMainAmount($fdr->user_id,$fdr->amount);

            $fdr->status = 2;
            $fdr->update();
        }
    }

    public function getUserProfit($userId,$profitAmount){
        $user = User::whereId($userId)->first();
        $user->balance += $profitAmount;
        $user->update();
    }

    public function closedFdr($id){
        $fdr = UserFdr::findOrFail($id);
        $this->getMainAmount($fdr->user_id,$fdr->amount);
        $fdr->next_profit_time = NULL;
        $fdr->status = 2;
        $fdr->update();
    }

    public function getMainAmount($userId,$amount){
        $user = User::whereId($userId)->first();
        $user->balance += $amount;
        $user->update();
    }
}