<?php
/**
 * Created by PhpStorm.
 * User: sunil
 * Date: 16/11/18
 * Time: 11:04 AM
 */

namespace App;


use App\Events\V1\EventPostCSBureauBankPull;
use App\Http\Controllers\Admin\ConsumerApplicationController;
use App\Http\Controllers\Admin\ConsumerDocument;
use App\Http\Controllers\FrontController;
use App\Http\Middleware\MongoMiddleware;
use App\Slack;
use App\CampaignsJobProvider;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Mail;
use App\Logging\CloudWatchLoggerFactory;

class FinBit
{
    private $version ='v1';
    public $token = false;

    private $baseDomain = "https://www.fin360.in/scanned-statement/api/v1";

    //Upload Scanned Bank Statement (PDF)
    private $accessURLPDF = "https://www.fin360.in/bank-connect/api/v1/uploadStatement?access_token=";

    //Upload Scanned Bank Statement (Images)
    private $accessURLImages = "https://www.fin360.in/scanned-statement/api/v1/parseImages?access_token=";
    private $accessURLParsePDF = "https://www.fin360.in/scanned-statement/api/v1/parsePdf?access_token=";
    private $endPoint = "";
    private $data = [];
    private $error = false;
    private $excelResponse = null;
    private $request;
    public $response;
    private $type = '';
    private $prefix = 'www';
    private $file_type = '';
    private $headers = array(
        "Content-Type: application/json"
    );

    public function __construct(Request $request){
        $this->request = $request;
        $this->prefix = env('APP_CONNECTION') == 0 ? 'trial' : 'www';
        $this->login();
    }

    private function login()
    {
        $email =  _env('finbitemail', '');
        $password =  _env('finbitpassword', '');
        $this->data = json_encode(array('emailAddress'=>$email,'password'=>$password));
        $this->endPoint = _env('finbiturl', '')."login";
        $this->version = 'v1';
        $this->endPoint = str_replace('v1', $this->version, $this->endPoint);
        $this->connect();
    }

    public function connect(){
        $start_time = time();
        $curl = curl_init();
        $setOptArray = array(
            CURLOPT_URL => $this->endPoint,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING => "",
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "POST",
            CURLOPT_POSTFIELDS => $this->data,
            CURLOPT_HTTPHEADER => $this->headers
        );

        curl_setopt_array($curl, $setOptArray);

        $response = curl_exec($curl);
        $err = curl_error($curl);

        curl_close($curl);

        if ($err) {
            $this->error = $err;
        } else {
            $response = json_decode($response);
            if(isset($response->status) && $response->status == "SUCCESS"){
                if(isset($response->access_token)) {
                    $this->token = $response->access_token;
                    if ($this->version == 'v2') {
                        $this->setAccessToken();
                    }
                }else{
                    $this->response = $response;
                }
            }else{
                $this->error = "Invalid Login";
            }
        }
        $cwFactory = new CloudWatchLoggerFactory();
        $data1 = array('user_id'=> Auth::user()->id ?? 107, 'vendor'=> 'Finbit', 'api_url' => $this->endPoint,'Request'=> $this->data ?? '{}', 'Response'=>$response ?? '{}', 'error_msg' => $err ?? '');
        $cwFactory->logger(json_encode($data1));

        $mongo = new MongoMiddleware();
        $mongo->toMongo($this->request, new Response(['data' => $this->data, 'error' => $this->error]));

        (new Services())->log('FinBit', ['status' => true, 'service_count' => 0, 'start_time' => $start_time]);
    }

    private function setAccessToken(){
        $this->endPoint = _env('finbiturl', '')."refreshToken";
        $this->data = ['grant_type' => $this->token];
        $this->connect();
    }

    public function getExcel(){
        (new Slack(new Request(['title'=>'Finbit getExcel Triggered','fields'=>['application_id'=>$this->request->get('id')]])))->send();
        $URL = "https://".$this->prefix.".fin360.in/bank-account/api/".$this->version."/summary/";
        $failed = false;
        if(isset($this->response->accountUID)) {

            $this->response->accountUID = is_array($this->response->accountUID) ? $this->response->accountUID[0] : $this->response->accountUID;

            $URL .= $this->response->accountUID . '.xls?access_token=' . $this->token;
            $reHit = true;
            $loop = 0;
            $data = [];
            while($reHit) {
                try {
                    $data = file_get_contents($URL);
                    $reHit = false;
                } catch (\Exception $e) {
                    $reHit = true;
                    if ($loop == 3){
                        $reHit = false;
                        $failed = true;
                    }
                    $loop++;
                }
            }
            if ($data) {
                $failed = false;
                (new Slack(new Request(['title'=>'Finbit Data','fields'=>['application_id'=>$this->request->get('id'),'data'=>json_encode($data)]])))->send();
                $this->excelResponse = json_decode($data);
                (new Slack(new Request(['title'=>'Finbit Excel Response','fields'=>['application_id'=>$this->request->get('id'),'excel_response'=>json_encode($this->excelResponse)]])))->send();
                if (isset($this->excelResponse->status) && $this->excelResponse->status == 'SUCCESS') {
                    if ($this->excelResponse->documentURL) {
                        $fileURL = storage_path() . "/excel_" . time() . ".xls";
                        try{
                            file_put_contents($fileURL, fopen($this->excelResponse->documentURL, 'r'));
                        }catch(\Exception $e){
                            (new Slack(new Request(['title' => 'Finbit Excel exception', 'fields' => ['message' => $e->getMessage(), 'line' => $e->getLine(), 'trace' => $e->getTraceAsString()], 'group' => Slack::$STAGE_TESTING])))->send();
                            $dataItem['finbit_url'] = $this->excelResponse->documentURL ?? '';
                            $dataItem['user_id'] = 107;
                            $dataItem['application_id'] = $this->request->get('id');
                            $dataItem['isMerchantPipe'] = $this->request->get('isMerchantPipe') ? $this->request->get('isMerchantPipe') : '';
                            $jobs = new CampaignsJobProvider();
                            $jobs->from = 'generateFinbitAnalysisReport';
                            $jobs->payload = json_encode($dataItem);
                            $jobs->available_at = Carbon::now()->toDateTimeString();
                            $jobs->application_id = $this->request->get('id');
                            $jobs->created_at = Carbon::now()->toDateTimeString();
                            $jobs->is_available = 0;
                            $jobs->save();
                        }
                        $ConsumerDocument = new ConsumerDocument(new Request());
                        $ConsumerDocument->is_location_type = $this->request->get('isMerchantPipe') ? $this->request->get('isMerchantPipe') : '';
                        //$ConsumerDocument->uploadToS3($this->request->get('bank_name') . '_Excel_File_' . time(), $this->request->get('id'), file_get_contents($fileURL), '.xls');
                        $ConsumerDocument->uploadToS3('finbit_analysis', $this->request->get('id'), file_get_contents($fileURL), '.xls');
                        try{
                            $this->markyticsEventTrigger();
                        }catch (\Exception $e){

                        }
                        unlink($fileURL);
                    }
                }
            }
        }

        return $failed;
    }

    public function generateFinbitAnalysisReport(){
        $fileURL = storage_path() . "/excel_" . time() . ".xls";
        try{
            file_put_contents($fileURL, fopen($this->request->get('finbit_url'), 'r'));
        }catch(\Exception $e){
            (new Slack(new Request(['title'=>'Finbit File Creation Failed','fields'=>['application_id'=>$this->request->get('id'),'finbit_url'=>$this->request->get('finbit_url')]])))->send();
        }
        $ConsumerDocument = new ConsumerDocument(new Request());
        $ConsumerDocument->is_location_type = $this->request->get('isMerchantPipe') ? $this->request->get('isMerchantPipe') : '';
        //$ConsumerDocument->uploadToS3($this->request->get('bank_name') . '_Excel_File_' . time(), $this->request->get('id'), file_get_contents($fileURL), '.xls');
        $ConsumerDocument->uploadToS3('finbit_analysis', $this->request->get('application_id'), file_get_contents($fileURL), '.xls');
        try{
            //$this->markyticsEventTrigger();
        }catch (\Exception $e){
        }
        unlink($fileURL);
    }

    public function markyticsEventTrigger(){
        if ($this->request->get('id')) {
            $creditReport = CreditReport::where('application_id', $this->request->get('id'))->first(['id']);
            if (isset($creditReport->id)) {
                event(new EventPostCSBureauBankPull($this->request->get('id')));
            }
        }
    }

    public function getPDF(){
        try {
            $URL = "https://" . $this->prefix . ".fin360.in/bank-account/api/".$this->version."/summary/";
            if (isset($this->response->accountUID)) {

                $this->response->accountUID = is_array($this->response->accountUID) ? $this->response->accountUID[0] : $this->response->accountUID;

                $URL .= $this->response->accountUID . '.pdf?access_token=' . $this->token;
                $reHit = true;
                $loop = 0;
                $data = '';
                while ($reHit) {
                    try {
                        $data = file_get_contents($URL);
                        $reHit = false;
                    } catch (\Exception $e) {
                        $reHit = true;
                        if ($loop == 3) {
                            $reHit = false;
                        }
                        $loop++;
                    }
                }
                if ($data) {
                    $this->excelResponse = json_decode($data);
                    if (isset($this->excelResponse->status) && $this->excelResponse->status == 'SUCCESS') {
                        if ($this->excelResponse->documentURL) {
                            $fileURL = storage_path() . "/bank_statement_" . time() . ".pdf";
                            file_put_contents($fileURL, fopen($this->excelResponse->documentURL, 'r'));
                            $ConsumerDocument = new ConsumerDocument(new Request(['accountUID' => $this->response->accountUID]));
                            $ConsumerDocument->is_location_type = $this->request->get('isMerchantPipe') ? $this->request->get('isMerchantPipe') : '';
                            $ConsumerDocument->uploadToS3($this->request->get('bank_name') . '_bank_statement_' . time(), $this->request->get('id'), file_get_contents($fileURL), '.pdf');
                            unlink($fileURL);
                        }
                    }
                }
            }
        }catch (\Exception $e){

        }
    }

    public function cv(){
        $target_url = $this->endPoint;
        $post = $this->data;

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $target_url);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HTTPHEADER,$this->headers);
        curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
        curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 100);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
        $result = curl_exec ($ch);
        curl_close ($ch);

        $cwFactory = new CloudWatchLoggerFactory();
        $data2 = array('user_id'=> Auth::user()->id ?? 107, 'vendor'=> 'Finbit', 'api_url' => $target_url,'Request'=> $post ?? '{}', 'Response'=>json_decode($result) ?? '{}', 'error_msg' => $this->error ?? '');
        $cwFactory->logger(json_encode($data2));

        if ($result === FALSE) {
            $this->error = true;
        }else{
            $this->response = json_decode($result);
            $this->createJobForFinbitDownload();
        }
    }

    public function run_after_job_execution(){
        //$mongo = new MongoMiddleware();
        //$mongo->toMongo($this->request, new Response(['data' => $post, 'error' => $this->error]));
        $is_failed = $this->getExcel();
        if ($is_failed){
            //return $is_failed;
        }
        $dateData = $this->getStatementDetails();
        $this->getFraudReport();
        $this->generateOtherReport($dateData);
        if($this->request->has('consumer_application_file_id') && $this->request->get('consumer_application_file_id')) {
            $this->saveFraudReportDB($this->request->get('id'), $this->request->get('consumer_application_file_id'));
        }

        return false;
    }

    public function setRequest(){
        $data = $this->request->all();
        $this->type = $data['statementtype'];
        $this->file_type = $data['statemenfilettype'];
        $this->data = ['bank' => $data['bank_name'], 'accountType' => $data['accounttype'], 'password' => $data['password']];
        if($this->type == 'original'){
            $this->data = array_merge($this->data, ['bankStmt' => curl_file_create($data['uploaded_file'])]);
        }else{
            $this->data = array_merge($this->data, ['bankStmtFile' => curl_file_create($data['uploaded_file'])]);
        }
    }

    public function uploadStatement(){
        $this->setRequest();
        $this->headers = array(
            "Content-Type: multipart/form-data"
        );
        if($this->token) {
            switch ($this->type) {
                case 'original':
                    $this->endPoint = str_replace('v1', $this->version, $this->accessURLPDF) . $this->token;
                break;
                case 'scanned':
                    $this->endPoint = (($this->file_type == 'bankPdf') ? str_replace('v1', $this->version, $this->accessURLParsePDF) : str_replace('v1', $this->version, $this->accessURLImages)) . $this->token;
                break;
            }

            if(!env('APP_CONNECTION')){
                $this->endPoint = str_replace('https://www.', 'https://'.$this->prefix.'.',$this->endPoint);
            }

            if($this->data){
                $this->cv();
            }
        }

        return $this->response;
    }

    public function run_after_upload_analysis(){
        $this->response = $this->request->get('response');
        $this->request = new Request((array)$this->request->get('request'));
        return $this->run_after_job_execution();
    }

    private function createJobForFinbitDownload(){
        $payload = [
            'payload' => json_encode(['response' =>$this->response, 'request' => $this->request->all()]),
            'from' => 'run_finbit_report_analysis',
            'application_id' => $this->request->get('id'),
            'available_at' => Carbon::now()->addMinutes(6)->toDateTimeString(),
            'created_at' => Carbon::now()->toDateTimeString()
        ];
        JobProvider::insert($payload);
    }

    public function getFraudReport()
    {
        if(isset($this->response->accountUID)) {
            $url_fraud = "https://".$this->prefix.".fin360.in/analytics/fraud/getFraudAnalyticReport/" . $this->response->accountUID . ".json?access_token=" . $this->token;

            $curl = curl_init();

            curl_setopt_array($curl, array(
                CURLOPT_URL => $url_fraud,
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_ENCODING => "",
                CURLOPT_MAXREDIRS => 10,
                CURLOPT_TIMEOUT => 30,
                CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                CURLOPT_CUSTOMREQUEST => "GET",
                CURLOPT_POSTFIELDS => "",
                CURLOPT_HTTPHEADER => array(),
            ));

            $response_fraud = curl_exec($curl);
            $err_fraud = curl_error($curl);

            curl_close($curl);

            $mongo = new MongoMiddleware();
            $mongo->toMongo($this->request, new Response(['data' => ['url' => $url_fraud,'data' => $response_fraud], 'error' => $err_fraud]));

            if($response_fraud){
                $response_fraud = json_decode($response_fraud, true);
                (new FrontController())->getFraudReport($this->request, $response_fraud);
                $ConsumerDocument = (new ConsumerDocument($this->request));
                $ConsumerDocument->is_location_type = $this->request->get('isMerchantPipe') ? $this->request->get('isMerchantPipe') : '';
                $ConsumerDocument->uploadToS3Only(json_encode($response_fraud), $this->response->accountUID.'/fraud_report.json');
            }

            $cwFactory = new CloudWatchLoggerFactory();
            $data2 = array('user_id'=> Auth::user()->id ?? 107, 'vendor'=> 'Finbit', 'api_url' => $url_fraud,'Request'=> '{}', 'Response'=>$response_fraud ?? '{}', 'error_msg' => $err_fraud ?? '');
            $cwFactory->logger(json_encode($data2));
        }
    }
    public function getStatementDetails()
    {
        if(isset($this->response->accountUID)) {
            $url_period = "https://".$this->prefix.".fin360.in/bank-account/api/".$this->version."/fetchDateRange/" . $this->response->accountUID . ".json?access_token=" . $this->token;

            $curl = curl_init();

            $data = array();
            curl_setopt_array($curl, array(
                CURLOPT_URL => $url_period,
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_ENCODING => "",
                CURLOPT_MAXREDIRS => 10,
                CURLOPT_TIMEOUT => 30,
                CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                CURLOPT_CUSTOMREQUEST => "GET",
                CURLOPT_POSTFIELDS => "",
                CURLOPT_HTTPHEADER => array(),
            ));

            $response_period = curl_exec($curl);
            $err_period = curl_error($curl);
            curl_close($curl);

            if ($response_period) {
                $response_period = json_decode($response_period);
                $data['fromDate'] = isset($response_period->fromDate) ? $response_period->fromDate : "";
                $data['toDate'] = isset($response_period->toDate) ? $response_period->toDate : "";
            }

            $cwFactory = new CloudWatchLoggerFactory();
            $data1 = array('user_id'=> Auth::user()->id ?? 107, 'vendor'=> 'Finbit', 'api_url' => $url_period,'Request'=> '{}', 'Response'=>$response_period ?? '{}', 'error_msg' => $err_fraud ?? '');
            $cwFactory->logger(json_encode($data1));

            $mongo = new MongoMiddleware();
            $mongo->toMongo($this->request, new Response(['data' => $response_period, 'error' => $err_period]));

            $url_period = "https://".$this->prefix.".fin360.in/bank-account/api/".$this->version."/monthlyAverageBalance/" . $this->response->accountUID . ".json?access_token=" . $this->token;
            $curl = curl_init();
            curl_setopt_array($curl, array(
                CURLOPT_URL => $url_period,
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_ENCODING => "",
                CURLOPT_MAXREDIRS => 10,
                CURLOPT_TIMEOUT => 30,
                CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                CURLOPT_CUSTOMREQUEST => "GET",
                CURLOPT_POSTFIELDS => "",
                CURLOPT_HTTPHEADER => array(),
            ));

            $response_average_balance = curl_exec($curl);
            $err_average_balance = curl_error($curl);
            curl_close($curl);

            $cwFactory = new CloudWatchLoggerFactory();
            $data2 = array('user_id'=> isset(Auth::user()->id) ? Auth::user()->id : '', 'vendor'=> 'Finbit', 'api_url' => $url_period,'Request'=> '{}', 'Response'=>json_decode($response_average_balance) ?? '{}', 'error_msg' => $err_average_balance ?? '');
            $cwFactory->logger(json_encode($data2));

            $mongo = new MongoMiddleware();
            $mongo->toMongo($this->request, new Response(['data' => $response_average_balance, 'error' => $err_average_balance]));

            if($response_average_balance){
                $response_average_balance = json_decode($response_average_balance);
                $array_count = isset($response_average_balance->averageBalanceList) ? count($response_average_balance->averageBalanceList) : 0;
                $total_months = $array_count;
                $total_avg_balance = 0;
                $three_month_balance = 0;
                if(isset($response_average_balance->averageBalanceList)) {
                    foreach ($response_average_balance->averageBalanceList as $averageBalanceList) {
                        $total_avg_balance = $total_avg_balance + $averageBalanceList->netAverageBalance;
                        if ($array_count <= 3) {
                            $three_month_balance = $three_month_balance + $averageBalanceList->netAverageBalance;
                        }
                        $array_count--;
                    }
                }
                $data['avg_balance'] = ($total_months > 0) ? (round(($total_avg_balance/$total_months),0)) : 0;
                $data['three_month_balance'] = round(($three_month_balance/3),0);
            }


            $url_period = "https://".$this->prefix.".fin360.in/bank-account/api/".$this->version."/bounceTransactions/" . $this->response->accountUID . ".json?access_token=" . $this->token;
            $curl = curl_init();
            curl_setopt_array($curl, array(
                CURLOPT_URL => $url_period,
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_ENCODING => "",
                CURLOPT_MAXREDIRS => 10,
                CURLOPT_TIMEOUT => 30,
                CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                CURLOPT_CUSTOMREQUEST => "GET",
                CURLOPT_POSTFIELDS => "",
                CURLOPT_HTTPHEADER => array(),
            ));

            $bounce_trancations = curl_exec($curl);
            $err_bounce_trancations = curl_error($curl);
            curl_close($curl);

            $cwFactory = new CloudWatchLoggerFactory();
            $data3 = array('user_id'=> isset(Auth::user()->id) ? Auth::user()->id : '', 'vendor'=> 'Finbit', 'api_url' => $url_period,'Request'=> '{}', 'Response'=>json_decode($bounce_trancations) ?? '{}', 'error_msg' => $err_bounce_trancations ?? '');
            $cwFactory->logger(json_encode($data3));

            $mongo = new MongoMiddleware();
            $mongo->toMongo($this->request, new Response(['data' => $bounce_trancations, 'error' => $err_bounce_trancations]));

            if($bounce_trancations){
                $bounce_trancations = json_decode($bounce_trancations);
                $data['outwardChequeBouncetransactions'] = 0;
                $data['inwardChequeBouncetransactions'] = 0;

                if(isset($bounce_trancations->outwardChequeBounceMonthwise)) {
                    foreach ($bounce_trancations->outwardChequeBounceMonthwise as $outwardChequeBounceMonthwise) {
                        if (isset($outwardChequeBounceMonthwise[0])) {
                            foreach ($outwardChequeBounceMonthwise as $outwardChequeBounceMonthwiseTransactions){
                                $BounceTransaction = new BounceTransactions();
                                $BounceTransaction->finbit_uid = $this->response->accountUID;
                                $BounceTransaction->application_id = $this->request->get('id');
                                $BounceTransaction->transsaction_type = "outwardChequeBounce";
                                $BounceTransaction->date = $outwardChequeBounceMonthwiseTransactions->date;
                                $BounceTransaction->amount = $outwardChequeBounceMonthwiseTransactions->amount;
                                $BounceTransaction->description = $outwardChequeBounceMonthwiseTransactions->description;
                                $BounceTransaction->balance = $outwardChequeBounceMonthwiseTransactions->balance;
                                $BounceTransaction->category = $outwardChequeBounceMonthwiseTransactions->category;
                                $BounceTransaction->remark = $outwardChequeBounceMonthwiseTransactions->remark;
                                $BounceTransaction->transactionType = $outwardChequeBounceMonthwiseTransactions->transactionType;
                                $BounceTransaction->bank = $outwardChequeBounceMonthwiseTransactions->bank;
                                $BounceTransaction->save();

                                $data['outwardChequeBouncetransactions']++;
                            }
                        }
                    }
                }
                if(isset($bounce_trancations->inwardChequeOrEcsBounceMonthwise)) {
                    foreach ($bounce_trancations->inwardChequeOrEcsBounceMonthwise as $inwardChequeOrEcsBounceMonthwise) {
                        if (isset($inwardChequeOrEcsBounceMonthwise[0])) {
                            foreach ($inwardChequeOrEcsBounceMonthwise as $inwardChequeOrEcsBounceMonthwiseTransactions){
                                $BounceTransaction = new BounceTransactions();
                                $BounceTransaction->finbit_uid = $this->response->accountUID;
                                $BounceTransaction->application_id = $this->request->get('id');
                                $BounceTransaction->transsaction_type = "inwardChequeOrEcs";
                                $BounceTransaction->date = $inwardChequeOrEcsBounceMonthwiseTransactions->date;
                                $BounceTransaction->amount = $inwardChequeOrEcsBounceMonthwiseTransactions->amount;
                                $BounceTransaction->description = $inwardChequeOrEcsBounceMonthwiseTransactions->description;
                                $BounceTransaction->balance = $inwardChequeOrEcsBounceMonthwiseTransactions->balance;
                                $BounceTransaction->category = $inwardChequeOrEcsBounceMonthwiseTransactions->category;
                                $BounceTransaction->remark = $inwardChequeOrEcsBounceMonthwiseTransactions->remark;
                                $BounceTransaction->transactionType = $inwardChequeOrEcsBounceMonthwiseTransactions->transactionType;
                                $BounceTransaction->bank = $inwardChequeOrEcsBounceMonthwiseTransactions->bank;
                                $BounceTransaction->save();
                                $data['inwardChequeBouncetransactions']++;
                            }
                        }
                    }
                }
            }


            $url_period = "https://" . $this->prefix . ".fin360.in/bank-account/api/".$this->version."/summaryForSavings/" . $this->response->accountUID . ".json?access_token=" . $this->token;
            $curl = curl_init();
            curl_setopt_array($curl, array(
                CURLOPT_URL => $url_period,
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_ENCODING => "",
                CURLOPT_MAXREDIRS => 10,
                CURLOPT_TIMEOUT => 30,
                CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                CURLOPT_CUSTOMREQUEST => "GET",
                CURLOPT_POSTFIELDS => "",
                CURLOPT_HTTPHEADER => array(),
            ));

            $summary_for_savings = curl_exec($curl);
            $err_income = curl_error($curl);
            curl_close($curl);

            $cwFactory = new CloudWatchLoggerFactory();
            $data4 = array('user_id'=> isset(Auth::user()->id) ? Auth::user()->id : '', 'vendor'=> 'Finbit', 'api_url' => $url_period,'Request'=> '{}', 'Response'=>json_decode($summary_for_savings) ?? '{}', 'error_msg' => $err_income ?? '');
            $cwFactory->logger(json_encode($data4));

            $mongo = new MongoMiddleware();
            $mongo->toMongo($this->request, new Response(['data' => $summary_for_savings, 'error' => $err_income]));

            $emi = 0;
            $count = 0;

            if ($summary_for_savings) {
                $summary_for_savings = json_decode($summary_for_savings);
                if(isset($summary_for_savings->monthWiseAnlaysis) && isset($summary_for_savings->monthWiseAnlaysis->loanRepayment->monthlyDetails)) {
                    $monthly_details = $summary_for_savings->monthWiseAnlaysis->loanRepayment->monthlyDetails;
                    foreach ($monthly_details as $detail) {
                        $carbon = new Carbon($detail->monthYear);
                        $carbon->format('Y-m-d');
                        $threeMonthCheck = Carbon::now()->subMonth(3)->toDateString();
                        if ($carbon >= $threeMonthCheck) {
                            $emi += $detail->value;
                            $count++;
                        }
                    }
                }
                $data['avg_emi'] = $emi > 0 && $count > 0  ? $emi / $count : 0;
                $eod = [
                    1 => '',
                    5 => '',
                    15 => '',
                    25 => ''
                ];

                if(!empty($summary_for_savings->dailyEODBalance)) {
                    $farr = end($summary_for_savings->dailyEODBalance);
                    $farr = json_decode(json_encode($farr), 1);
                    if(!empty($farr)) {
                        if(!empty($farr[1]) && !empty($farr[1][0]['closingBalance'])) {
                            $eod[1] = $farr[1][0]['closingBalance'];
                        }
                        if(!empty($farr[5]) && !empty($farr[5][0]['closingBalance'])) {
                            $eod[5] = $farr[5][0]['closingBalance'];
                        }
                        if(!empty($farr[15]) && !empty($farr[15][0]['closingBalance'])) {
                            $eod[15] = $farr[15][0]['closingBalance'];
                        }
                        if(!empty($farr[25]) && !empty($farr[25][0]['closingBalance'])) {
                            $eod[25] = $farr[25][0]['closingBalance'];
                        }
                    }
                    foreach ($monthly_details as $detail) {
                        $carbon = new Carbon($detail->monthYear);
                        $carbon->format('Y-m-d');
                        $threeMonthCheck = Carbon::now()->subMonth(3)->toDateString();
                        if ($carbon >= $threeMonthCheck) {
                            $emi += $detail->value;
                            $count++;
                        }
                    }
                }
                $data['eod'] = $eod;

            }


            $url_period = "https://" . $this->prefix . ".fin360.in/bank-account/api/".$this->version."/incomeInstances/" . $this->response->accountUID . ".json?access_token=" . $this->token;
            $curl = curl_init();
            curl_setopt_array($curl, array(
                CURLOPT_URL => $url_period,
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_ENCODING => "",
                CURLOPT_MAXREDIRS => 10,
                CURLOPT_TIMEOUT => 30,
                CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                CURLOPT_CUSTOMREQUEST => "GET",
                CURLOPT_POSTFIELDS => "",
                CURLOPT_HTTPHEADER => array(),
            ));

            $response_income = curl_exec($curl);
            $err_income = curl_error($curl);
            curl_close($curl);

            $cwFactory = new CloudWatchLoggerFactory();
            $data5 = array('user_id'=> isset(Auth::user()->id) ? Auth::user()->id : '', 'vendor'=> 'Finbit', 'api_url' => $url_period,'Request'=> '{}', 'Response'=>json_decode($response_income) ?? '{}', 'error_msg' => $err_income ?? '');
            $cwFactory->logger(json_encode($data5));

            $mongo = new MongoMiddleware();
            $mongo->toMongo($this->request, new Response(['data' => $response_income, 'error' => $err_income]));

            if ($response_income) {
                $response_income = json_decode($response_income);
                $salary = [];
                if($response_income) {
                    foreach ($response_income as $income) {
                        if (isset($income->category) && $income->category == 'SALARY') {
                            $carbon = new Carbon($income->date);
                            $carbon->format('Y-m-d');
                            array_push($salary, [
                                'amount' => $income->amount,
                                'date' => (new Carbon($carbon))->toDateString()
                            ]);
                        }
                    }
                }
                $data['salary'] = json_encode($salary);
            }

            if ($response_period) {
                $finbitdata = new FinBitData();
                $finbitdata->application_id = $this->request->get('id');
                $finbitdata->id_type = $this->request->get('isMerchantPipe') ? $this->request->get('isMerchantPipe') : '';
                $finbitdata->finbit_uid = $this->response->accountUID;
                $finbitdata->period_from = isset($data['fromDate']) ? $data['fromDate'] : "";
                $finbitdata->period_too = isset($data['toDate']) ? $data['toDate'] : "";
                $finbitdata->average_balance = isset($data['avg_balance']) ? $data['avg_balance'] : "";
                $finbitdata->average_balance_three_months = isset($data['three_month_balance']) ? $data['three_month_balance'] : "";
                $finbitdata->median_balance = isset($data['median_balance']) ? $data['median_balance'] : "";
                $finbitdata->median_balance_three_months = isset($data['median_balance_three_months']) ? $data['median_balance_three_months'] : "";
                $finbitdata->inwards_bounce_transaction = isset($data['inwardChequeBouncetransactions']) ? $data['inwardChequeBouncetransactions'] : "";
                $finbitdata->outwards_bounce_transaction = isset($data['outwardChequeBouncetransactions']) ? $data['outwardChequeBouncetransactions'] : "";
                $finbitdata->avg_emi_three_months = isset($data['avg_emi']) ? $data['avg_emi'] : "";
                $finbitdata->salary = isset($data['salary']) ? $data['salary'] : "";
                $finbitdata->eod_balance_1 = !empty($data['eod'][1]) ? $data['eod'][1] : 0;
                $finbitdata->eod_balance_5 = !empty($data['eod'][5]) ? $data['eod'][5] : 0;
                $finbitdata->eod_balance_15 = !empty($data['eod'][15]) ? $data['eod'][15] : 0;
                $finbitdata->eod_balance_25 = !empty($data['eod'][25]) ? $data['eod'][25] : 0;
                //$finbitdata->net_credit_txn = isset($data['inwardChequeBouncetransactions']) ? $data['inwardChequeBouncetransactions'] : "";
                //$finbitdata->net_debit_txn = isset($data['outwardChequeBouncetransactions']) ? $data['outwardChequeBouncetransactions'] : "";
                $finbitdata->applicant_type = $this->request->get('applicant_type') ? $this->request->get('applicant_type') : 1;
                $finbitdata->save();
            }
        }

        return isset($data) ? $data : false;
    }

    public function generateOtherReport($dateData){
        try {
            $yearFrom = 0;//isset($dateData['fromDate']) ? explode('/',$dateData['fromDate'])[2] : 10;
            $netDebitTxn = $this->calculateNetDebitTransaction($yearFrom);
            $netCreditTxn = $this->calculateNetCreditTransaction($yearFrom);

            if ($netDebitTxn['response'] || $netCreditTxn['response']){
                $finBitData = FinBitData::where('finbit_uid',$this->response->accountUID)->first(['id']);
                if (isset($finBitData->id)) {
                    $finBitDataUpdate = FinBitData::find($finBitData->id);
                    if ($netDebitTxn['total_debit_transaction'])
                        $finBitDataUpdate->net_debit_txn = $netDebitTxn['total_debit_transaction'];
                    if ($netCreditTxn['total_credit_transaction'])
                        $finBitDataUpdate->net_credit_txn = $netCreditTxn['total_credit_transaction'];

                    $finBitDataUpdate->save();
                }else{
                    $finBitDataUpdate = new FinBitData();
                    $finBitDataUpdate->finbit_uid = $this->response->accountUID;
                    $finBitDataUpdate->application_id = $this->request->get('id');
                    if ($netDebitTxn['total_debit_transaction'])
                        $finBitDataUpdate->net_debit_txn = $netDebitTxn['total_debit_transaction'];
                    if ($netCreditTxn['total_credit_transaction'])
                        $finBitDataUpdate->net_credit_txn = $netCreditTxn['total_credit_transaction'];
                    $finBitDataUpdate->applicant_type = $this->request->get('applicant_type') ? $this->request->get('applicant_type') : 1;
                    $finBitDataUpdate->save();
                }
            }


            //$this->calculateBounceTransactions();
        }catch (\Exception $e){
            (new \App\Slack(new Request(['title' => 'Finbit Report Testing', 'fields' => ['error' => $e->getMessage(), 'line' => $e->getLine(), 'trace' => $e->getTraceAsString(), 'application_id' => $this->request->get('id'), 'id_type' => 'application_id'], 'group' => Slack::$STAGE_TESTING])))->send();
        }
    }

    public function getBounceTransactions(){
        if(isset($this->response->accountUID)) {
            $url_period = "https://".$this->prefix.".fin360.in/bank-account/api/".$this->version."/bounceTransactions/" . $this->response->accountUID . ".json?access_token=" . $this->token;
            $curl = curl_init();
            curl_setopt_array($curl, array(
                CURLOPT_URL => $url_period,
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_ENCODING => "",
                CURLOPT_MAXREDIRS => 10,
                CURLOPT_TIMEOUT => 30,
                CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                CURLOPT_CUSTOMREQUEST => "GET",
                CURLOPT_POSTFIELDS => "",
                CURLOPT_HTTPHEADER => array(),
            ));

            $response = curl_exec($curl);
            $error = curl_error($curl);
            curl_close($curl);

            $cwFactory = new CloudWatchLoggerFactory();
            $data1 = array('user_id'=> isset(Auth::user()->id) ? Auth::user()->id : '', 'vendor'=> 'Finbit', 'api_url' => $url_period,'Request'=> '{}', 'Response'=>json_decode($response) ?? '{}', 'error_msg' => $error ?? '');
            $cwFactory->logger(json_encode($data1));

            return json_decode($response);
        }

        return false;
    }

    public function getECSAndNACHInstances($accountUID, $token){
        if (strlen($accountUID) > 0) {
            $url_period = "https://www.fin360.in/bank-account/api/".$this->version."/ecsAndNachInstances/" . str_replace("\"",'',$accountUID) . ".json?access_token=" . $token;
            $curl = curl_init();
            curl_setopt_array($curl, array(
                CURLOPT_URL => $url_period,
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_ENCODING => "",
                CURLOPT_MAXREDIRS => 10,
                CURLOPT_TIMEOUT => 30,
                CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                CURLOPT_CUSTOMREQUEST => "GET",
                CURLOPT_POSTFIELDS => "",
                CURLOPT_HTTPHEADER => array(),
            ));

            $response = curl_exec($curl);
            $error = curl_error($curl);
            curl_close($curl);

            $cwFactory = new CloudWatchLoggerFactory();
            $data1 = array('user_id'=> isset(Auth::user()->id) ? Auth::user()->id : '', 'vendor'=> 'Finbit', 'api_url' => $url_period,'Request'=> '{}', 'Response'=>json_decode($response) ?? '{}', 'error_msg' => $error ?? '');
            $cwFactory->logger(json_encode($data1));

            return json_decode($response);
        }

        return false;
    }

    public function calculateBounceTransactions($yearFrom){
        $total_credit_transaction = 0;
        $total_credit_transaction_amount = 0;
        if($data = $this->getBounceTransactions()) {
            if (!isset($data->status) || (isset($data->status) && $data->status != 'NO_DATA')) {
                if(isset($data->outwardChequeBounceMonthwise) && $data->outwardChequeBounceMonthwise) {
                    foreach ($data->outwardChequeBounceMonthwise as $outwardChequeBounceMonthwise) {
                        foreach ($outwardChequeBounceMonthwise as $outward) {
                            if (isset($outward->date) && strtotime($outward->date) >= Carbon::now()->subMonth($yearFrom)->startOfMonth()->timestamp) {
                                $total_credit_transaction++;
                                $total_credit_transaction_amount += $outward->amount;
                            }
                        }
                    }
                }
            }
        }
        return ['total_bounced_transaction' => $total_credit_transaction, 'total_transaction_amount' => $total_credit_transaction_amount, 'response' => $data];
    }

    public function calculateECSAndNACHInstances($yearFrom, $accountUID, $token){
        $total_credit_transaction = 0;
        $total_credit_transaction_amount = 0;
        if($data = $this->getECSAndNACHInstances($accountUID, $token)) {
            if (!isset($data->status) || (isset($data->status) && $data->status != 'NO_DATA')) {
                foreach ($data as $item) {
                    if (isset($item->date) && strtotime($item->date) >= Carbon::now()->subMonth($yearFrom)->startOfMonth()->timestamp) {
                        $total_credit_transaction += $item->total;
                        $total_credit_transaction_amount += $item->amount;
                    }
                }
            }
        }
        return ['total_bounced_transaction' => $total_credit_transaction, 'total_transaction_amount' => $total_credit_transaction_amount, 'response' => $data];
    }

    public function calculateNetCreditTransaction($yearFrom){
        $total_bounced_transaction = 0;
        $total_transaction_amount = 0;
        if($data = $this->getNetCreditTransaction()) {
            foreach ($data as $item) {
                if ($item) { //isset($item->date) && strtotime($item->date) >= Carbon::now()->subMonth($yearFrom)->startOfMonth()->timestamp
                    $total_bounced_transaction += isset($item->total) ? $item->total : 0;
                    $total_transaction_amount += isset($item->amount) ? $item->amount : 0;
                }
            }
        }
        return ['total_credit_transaction' => $total_bounced_transaction, 'total_credit_transaction_amount' => $total_transaction_amount, 'response' => $data];
    }

    public function getNetCreditTransaction(){
        if(isset($this->response->accountUID)) {
            $url_period = "https://".$this->prefix.".fin360.in/bank-account/api/".$this->version."/netCreditTransaction/" . $this->response->accountUID . ".json?access_token=" . $this->token;
            $curl = curl_init();
            curl_setopt_array($curl, array(
                CURLOPT_URL => $url_period,
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_ENCODING => "",
                CURLOPT_MAXREDIRS => 10,
                CURLOPT_TIMEOUT => 30,
                CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                CURLOPT_CUSTOMREQUEST => "GET",
                CURLOPT_POSTFIELDS => "",
                CURLOPT_HTTPHEADER => array(),
            ));

            $response = curl_exec($curl);
            $error = curl_error($curl);
            curl_close($curl);

            $cwFactory = new CloudWatchLoggerFactory();
            $data1 = array('user_id'=> isset(Auth::user()->id) ? Auth::user()->id : '', 'vendor'=> 'Finbit', 'api_url' => $url_period,'Request'=> '{}', 'Response'=>json_decode($response) ?? '{}', 'error_msg' => $error ?? '');
            $cwFactory->logger(json_encode($data1));

            return json_decode($response);
        }
        return false;
    }

    public function calculateNetDebitTransaction($yearFrom){
        $total_debit_transaction = 0;
        $total_debit_transaction_amount = 0;
        if($data = $this->getNetDebitTransaction()) {
            foreach ($data as $item) {
                if ($item) { //isset($item->date) && strtotime($item->date) >= Carbon::now()->subMonth($yearFrom)->startOfMonth()->timestamp
                    $total_debit_transaction += isset($item->total) ? $item->total : 0;
                    $total_debit_transaction_amount += isset($item->amount) ? $item->amount : 0;
                }
            }
        }

        return ['total_debit_transaction' => $total_debit_transaction, 'total_debit_transaction_amount' => $total_debit_transaction_amount, 'response' => $data];
    }

    public function getNetDebitTransaction(){
        if(isset($this->response->accountUID)) {
            $url_period = "https://".$this->prefix.".fin360.in/bank-account/api/".$this->version."/netDebitTransaction/" . $this->response->accountUID . ".json?access_token=" . $this->token;
            $curl = curl_init();
            curl_setopt_array($curl, array(
                CURLOPT_URL => $url_period,
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_ENCODING => "",
                CURLOPT_MAXREDIRS => 10,
                CURLOPT_TIMEOUT => 30,
                CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                CURLOPT_CUSTOMREQUEST => "GET",
                CURLOPT_POSTFIELDS => "",
                CURLOPT_HTTPHEADER => array(),
            ));

            $response = curl_exec($curl);
            $error = curl_error($curl);
            curl_close($curl);

            $cwFactory = new CloudWatchLoggerFactory();
            $data1 = array('user_id'=> isset(Auth::user()->id) ? Auth::user()->id : '', 'vendor'=> 'Finbit', 'api_url' => $url_period,'Request'=> '{}', 'Response'=>json_decode($response) ?? '{}', 'error_msg' => $error ?? '');
            $cwFactory->logger(json_encode($data1));

            return json_decode($response);
        }
        return false;
    }

    public function getBankList(){
        $url_period = "https://www.fin360.in/bank-connect/api/".$this->version."/bankList?access_token=" . $this->token;
        $curl = curl_init();
        curl_setopt_array($curl, array(
            CURLOPT_URL => $url_period,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING => "",
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "GET",
            CURLOPT_POSTFIELDS => "",
            CURLOPT_HTTPHEADER => array(),
        ));

        $response = curl_exec($curl);
        $error = curl_error($curl);
        curl_close($curl);

        $cwFactory = new CloudWatchLoggerFactory();
        $data1 = array('user_id'=> isset(Auth::user()->id) ? Auth::user()->id : '', 'vendor'=> 'Finbit', 'api_url' => $url_period,'Request'=> '{}', 'Response'=>json_decode($response) ?? '{}', 'error_msg' => $error ?? '');
        $cwFactory->logger(json_encode($data1));

        return json_decode($response);
    }

    public function saveFraudReportDB($id, $consumer_application_file_id){
        try{
            $data =  (new ConsumerApplicationController())->isFraud($id, 'fraud_report.json', true);
            $bank_accountDetails = $data['bank_account'];
            $result = $data['result'];
            $summary = $data['summary'];

            $date = Carbon::now()->toDateTimeString();
            $bank_account = [
                'application_id' => $id,
                'consumer_application_file_id' => $consumer_application_file_id,
                'accountDetailsForAccountListPage' => $bank_accountDetails['accountDetailsForAccountListPage'],
                'accountHolder' => $bank_accountDetails['accountHolder'],
                'accountLimit' => $bank_accountDetails['accountLimit'],
                'accountNo' => $bank_accountDetails['accountNo'],
                'accountType' => $bank_accountDetails['accountType']['name'],
                'address' => $bank_accountDetails['address'],
                'availableCashLimit' => $bank_accountDetails['availableCashLimit'],
                'availableCreditLimit' => $bank_accountDetails['availableCreditLimit'],
                'bank' => $bank_accountDetails['bank']['name'],
                'bankAccountUID' => $bank_accountDetails['bankAccountUID'],
                'bankAddress' => $bank_accountDetails['bankAddress'],
                'bankCredentialCO' => $bank_accountDetails['bankCredentialCO'],
                'bankTransactionList' => json_encode($bank_accountDetails['bankTransactionList']),
                'branchAddress' => $bank_accountDetails['branchAddress'],
                'cifNumber' => $bank_accountDetails['cifNumber'],
                'client' => $bank_accountDetails['client'],
                'creditCardNo' => $bank_accountDetails['creditCardNo'],
                'creditLimit' => $bank_accountDetails['creditLimit'],
                'crnNo' => $bank_accountDetails['crnNo'],
                'currentCashAdvance' => $bank_accountDetails['currentCashAdvance'],
                'currentPurchaseCharges' => $bank_accountDetails['currentPurchaseCharges'],
                'customer' => $bank_accountDetails['customerID'],
                'customerID' => $bank_accountDetails['customerID'],
                'customerPhoneNo' => $bank_accountDetails['customerPhoneNo'],
                'dueDate' => $bank_accountDetails['dueDate'],
                'email' => $bank_accountDetails['email'],
                'fromDate' => $bank_accountDetails['fromDate'],
                'ifsCode' => $bank_accountDetails['ifsCode'],
                'isValidBankStatement' => $bank_accountDetails['isValidBankStatement'],
                'lastPaymentReceived' => $bank_accountDetails['lastPaymentReceived'],
                'micrCode' => $bank_accountDetails['micrCode'],
                'minAmountDue' => $bank_accountDetails['minAmountDue'],
                'openingBalance' => $bank_accountDetails['openingBalance'],
                'pan' => $bank_accountDetails['pan'],
                'pointsEarned' => $bank_accountDetails['pointsEarned'],
                'prevBalance' => $bank_accountDetails['prevBalance'],
                'relationshipWithBank' => $bank_accountDetails['relationshipWithBank'],
                'toDate' => $bank_accountDetails['toDate'],
                'totalAmountDue' => $bank_accountDetails['totalAmountDue'],
                'uploadBankStatementCO' => $bank_accountDetails['uploadBankStatementCO'],
                'created_at' => $date
            ];


            if($bank_account) {
                $fraudReportId = FraudReport::insertGetId($bank_account);
            }


            $fraudReportCategoryStatus = [];
            foreach ($result as $item){
                $fraudReportCategoryStatus[] = [
                    'fraud_report_id' => $fraudReportId,
                    'category' => $item['category'],
                    'rule' => $item['rule'],
                    'ruleId' => $item['ruleId'],
                    'ruleName' => $item['ruleName'],
                    'status' => $item['status'],
                    'created_at' => $date
                ];
            }

            if($fraudReportCategoryStatus) {
                FraudReportCategoryStatus::insert($fraudReportCategoryStatus);
            }



            $summaryData = [];
            foreach($summary as $item){

                if(isset($item['rule']) && in_array($item['rule'], ['CREATED_AND_MODIFIED_DATE_MISMATCH','SUSPICIOUS_FILE_INPUT'])){
                    continue;
                }

                foreach ($item['detail'] as $itemView){
                    $summaryData[] = [
                        'fraud_report_id' => $fraudReportId,
                        'rule' => isset($item['rule']) ? $item['rule'] : '',
                        'monthAndYear' => isset($itemView['monthAndYear']) ? $itemView['monthAndYear'] : '',
                        'cashDepositAmount' => isset($itemView['cashDepositAmount']) ? $itemView['cashDepositAmount'] : '',
                        'monthGapWithPrevious' => isset($itemView['monthGapWithPrevious']) ? $itemView['monthGapWithPrevious'] : '',
                        'salaryTransactionAmount' => isset($itemView['salaryTransaction']['amount']) ? $itemView['salaryTransaction']['amount'] : '',
                        'salaryTransactionBalanceAfterTransaction' => isset($itemView['salaryTransaction']['balanceAfterTransaction']) ? $itemView['salaryTransaction']['balanceAfterTransaction'] : '',
                        'salaryTransactionAmountDateTime' => isset($itemView['salaryTransaction']['dateTime']) ? $itemView['salaryTransaction']['dateTime'] : '',
                        'salaryTransactionAmountDescription' => isset($itemView['salaryTransaction']['description']) ? $itemView['salaryTransaction']['description'] : '',
                        'salaryTransactionAmountFirstLevelCategory' => isset($itemView['salaryTransaction']['firstLevelCategory']) ? $itemView['salaryTransaction']['firstLevelCategory'] : '',
                        'salaryTransactionAmountRemark' => isset($itemView['salaryTransaction']['remark']) ? $itemView['salaryTransaction']['remark'] : '',
                        'salaryTransactionAmountSecondLevelCategory' => isset($itemView['salaryTransaction']['secondLevelCategory']) ? $itemView['salaryTransaction']['secondLevelCategory'] : '',
                        'salaryTransactionAmountTransactionNumber' => isset($itemView['salaryTransaction']['transactionNumber']) ? $itemView['salaryTransaction']['transactionNumber'] : '',
                        'salaryTransactionAmountType' => isset($itemView['salaryTransaction']['type']) ? $itemView['salaryTransaction']['type'] : '',
                        'salaryTransactionAmountValueDate' => isset($itemView['salaryTransaction']['valueDate']) ? $itemView['salaryTransaction']['valueDate'] : '',

                        'debitTransactionAmount' => isset($itemView['debitTransaction']['amount']) ? $itemView['salaryTransaction']['amount'] : '',
                        'debitTransactionBalanceAfterTransaction' => isset($itemView['debitTransaction']['balanceAfterTransaction']) ? $itemView['salaryTransaction']['balanceAfterTransaction'] : '',
                        'debitTransactionAmountDateTime' => isset($itemView['debitTransaction']['dateTime']) ? $itemView['salaryTransaction']['dateTime'] : '',
                        'debitTransactionAmountDescription' => isset($itemView['debitTransaction']['description']) ? $itemView['salaryTransaction']['description'] : '',
                        'debitTransactionAmountFirstLevelCategory' => isset($itemView['debitTransaction']['firstLevelCategory']) ? $itemView['salaryTransaction']['firstLevelCategory'] : '',
                        'debitTransactionAmountRemark' => isset($itemView['debitTransaction']['remark']) ? $itemView['salaryTransaction']['remark'] : '',
                        'debitTransactionAmountSecondLevelCategory' => isset($itemView['debitTransaction']['secondLevelCategory']) ? $itemView['salaryTransaction']['secondLevelCategory'] : '',
                        'debitTransactionAmountTransactionNumber' => isset($itemView['debitTransaction']['transactionNumber']) ? $itemView['salaryTransaction']['transactionNumber'] : '',
                        'debitTransactionAmountType' => isset($itemView['debitTransaction']['type']) ? $itemView['salaryTransaction']['type'] : '',
                        'debitTransactionAmountValueDate' => isset($itemView['debitTransaction']['valueDate']) ? $itemView['salaryTransaction']['valueDate'] : '',
                        'missingSalaryInMonths' => isset($item['missingSalaryInMonths']) ? implode(',',$item['missingSalaryInMonths']) : '',
                        'created_at' => $date
                    ];
                }
            }

            if($summaryData) {
                FraudReportBankTransactions::insert($summaryData);
            }
        }catch (\Exception $e){

        }
    }
}
