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

namespace App;


use App\Http\Controllers\Admin\AccountingController;
use App\Http\Controllers\Admin\ConsumerApplicationController;
use App\Http\Controllers\FrontController;
use App\Tally\Tally;
use App\Tally\TallyConnector;
use App\Tally\TallyJobs;
use Hashids\Hashids;
use App\Http\Controllers\Admin\ConsumerDocument;
use Illuminate\Http\Request;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Config;

class PaymentEmi
{

    public $isPagination = false;
    public $isPaginationSkip = false;
    public $status = [];
    public $isPaginationTotal = 0;
    public $isPaginationLastPage = 0;
    public $emailCount = 0;
    public $smsCount = 0;
    /**
     * @var EmiPayment[]|\Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection
     */

    public function updateEmiPayment($data)
    {

//        if (!isset($data['go_maker_check'])) {
//            PaymentMakerChecker::insert(['application_id' => $data['application_id'] ,'data' => json_encode($data), 'maker_id' => Auth::user()->id, 'checker_id' => 0, 'type' => 'payment', 'status' => 1, 'created_at' => Carbon::now()->toDateTimeString()]);
//            return true;
//        }

        $amount = $data['amount'];
        $amount_received = $amount;
        $amount_setteled = 0;
        $payment_date = $data['payment_date'];
        $mode = $data['mode'];
        $paid_by = $data['paid_by'];
        $collected_by = $data['collected_by'];
        $wallet_name = $data['wallet_name'];
        $application_id = $data['application_id'];
        $trasanction_id = $data['trasanction_id'];
        $online_payment_id = $data['online_payment_id'];
        $trasanction_acknowledgement = $data['trasanction_acknowledgement'];
        $payment_status = isset($data['status']) ? $data['status'] : "success";
        $payment_reconciliation_date = isset($data['payment_reconciliation_date']) ? $data['payment_reconciliation_date'] : $payment_date;
        $foreclosuredate = isset($data['fore_closure_date']) ? $data['fore_closure_date'] : "";
        $bank_id = isset($data['bank_id']) ? $data['bank_id'] : "";

        $user = ConsumerApplication::with('application_element', 'emi')->where('id', $application_id)->first();
        $paymentConfig = (new LoanManagement())->getPaymentConfig($application_id);

        $data['cf_transaction_id'] = $user->id.strtoupper(substr($user->name, 0, 2)).time();

        $paymentConfig = (new LoanManagement())->getPaymentConfig($application_id);

        $payment_status = ($payment_status == "pending") ? "pending_from_bank" : $payment_status;

        $confirmation_sent = 0;
        $emi_processed = 0;
        $emiPaymentIDs = [];

        $tally = array();
//        $tally['emi_amount'] = 0;
//        $tally['bounce_charges'] = 0;
//        $tally['penal_interest'] = 0;
        if (isset($data['advance_amount']) && $data['advance_amount'] > 0) {
            $this->updateAdvanceAmount($data, "Advance Payment", $application_id);
        }

        if($foreclosuredate != ""){
            ConsumerApplicationElement::where('application_id',$application_id)->update(['foreclosure_date'=>$foreclosuredate]);
        }
        $due_data_array = $this->getEMIdetails($application_id, $payment_date);

        $due_data = isset($due_data_array[$application_id]) ? $due_data_array[$application_id] : [];
        $due_data['cf_transaction_id'] = $data['cf_transaction_id'];
        if($amount_received < 1){
            return $due_data;
        }
        if($due_data) {
            $emi_payment_id = "";
            if ($payment_status != 'rejected' &&  $payment_status != 'initial_reject'){
                foreach ($due_data as $key => $emi_payment_update) {
                    if ($key <= date('Y-m-d')) {
                        $emi_processed++;
                        $amount_setteled = 0;
                        if ($amount_received > 0 && $emi_payment_update['pending_amount'] > 0 && ($emi_payment_update['emi_amount'] - $emi_payment_update['amount_received']) > 0) {
                            if ($amount_received >= ($emi_payment_update['emi_amount'] - $emi_payment_update['amount_received'])) {
                                $amount_setteled = ($emi_payment_update['emi_amount'] - $emi_payment_update['amount_received']);
                                $amount_received = $amount_received - $amount_setteled;
                                $due_data[$key]['pending_amount'] = $emi_payment_update['pending_amount'] - $amount_setteled;
                            } else {
                                $amount_setteled = $amount_received;
                                $due_data[$key]['pending_amount'] = $emi_payment_update['pending_amount'] - $amount_received;
                                $amount_received = 0;
                            }
                            if ($amount_setteled > 0) {
                                $emiInit = false;
                                if ($emi_payment_update['emi_payment_id'] > 0) {
                                    $emi_payment = EmiPayment::find($emi_payment_update['emi_payment_id']);
                                } else {
                                    $emi_payment = new EmiPayment();
                                    $emiInit = true;
                                }
                                $emi_payment->emi_amount = $emi_payment_update['emi_amount'];
                                $emi_payment->emi_date = $key;
                                $emi_payment->bounce_charges = $emi_payment_update['bounce_charges'];
                                $emi_payment->delay_penalty = $emi_payment_update['delay_penalty'];
                                $emi_payment->charges_waived = $emi_payment_update['charges_waived'];
                                $emi_payment->payment_date = $payment_date;
                                $emi_payment->due_date = $emi_payment_update['due_date'];

                                if ($due_data[$key]['pending_amount'] > 0) {
                                    $emi_payment->payment_status = "partial";
                                } else {
                                    $emi_payment->payment_status = "success";
                                }
//                                $emi_payment->online_payment_id = $online_payment_id;
                                $emi_payment->application_id = $application_id;
                                $emi_payment->save();

                                $emi_payment_id = $emi_payment->id;

                                if ($emiInit) {
                                    $emiPaymentIDs[] = $emi_payment->id;
                                }
                                $tally[$key]['emi_amount'] = $amount_setteled;
                                $payment_transaction = new PaymentTransaction();
                                $payment_transaction->emi_payment_id = $emi_payment_id;
                                $payment_transaction->amount = $amount_setteled;
                                $payment_transaction->mode = $mode;
                                $payment_transaction->paid_by = $paid_by;
                                $payment_transaction->payment_reconciliation_date = $payment_reconciliation_date;
                                $payment_transaction->umrn = isset($data['umrn']) ? $data['umrn'] : '';
                                $payment_transaction->collected_by = $collected_by;
                                $payment_transaction->wallet_name = $wallet_name;
                                $payment_transaction->reason = isset($data['reason']) ? $data['reason'] : '';
                                $payment_transaction->trasanction_id = $trasanction_id;
                                $payment_transaction->trasanction_acknowledgement = $trasanction_acknowledgement;
                                $payment_transaction->application_id = $application_id;
                                $payment_transaction->payment_for = "EMI";
                                $payment_transaction->payment_date = $payment_date;
                                $payment_transaction->cf_transaction_id = $data['cf_transaction_id'];
                                $payment_transaction->bank_id = $bank_id;
                                $payment_transaction->status = isset($data['status']) ? $data['status'] : 'success';
                                $payment_transaction->save();

                                //$this->sendPaymentMessage($application_id, $data,$payment_status);
                            }
                        }
                    }
                }
                $payment_history_data = $this->getEMiPaidDetails($application_id);
                foreach ($due_data as $key => $emi_payment_update) {
                    if ($key <= date('Y-m-d')) {
                        $amount_setteled = 0;
                        $amount_due = 0;
                        $generate_interest_invoice = (isset($payment_history_data[$key]['generate_interest_invoice'])) ? $payment_history_data[$key]['generate_interest_invoice'] : 0;

                        if ($amount_received > 0 && $emi_payment_update['pending_amount'] > 0 && ($emi_payment_update['bounce_charges'] > 0)) {
                            $amount_due = ($emi_payment_update['bounce_charges'] < $emi_payment_update['pending_amount']) ? $emi_payment_update['bounce_charges'] : $emi_payment_update['pending_amount'];
                            if ($amount_received >= $amount_due) {
                                $amount_setteled = $amount_due;
                                $amount_received = $amount_received - $amount_setteled;
                                $due_data[$key]['pending_amount'] = $emi_payment_update['pending_amount'] - $amount_setteled;
                            } else {
                                $amount_setteled = $amount_received;
                                $due_data[$key]['pending_amount'] = $emi_payment_update['pending_amount'] - $amount_received;
                                $amount_received = 0;
                            }
                            if ($amount_setteled > 0) {
//                        if (isset($payment_history_data[$key]['id']) && $payment_history_data[$key]['id'] != 0) {
//                            $emi_payment = EmiPayment::find($payment_history_data[$key]['id']);
//                        } else {
                                //$emiInit = false;
                                $emi_payment_id = EmiPayment::where('emi_date', $key)->where('application_id', $application_id)->where('payment_status', "!=", 'rejected')->where('payment_status', "!=", 'pending')->first(['id']);
                                $emi_payment = EmiPayment::find($emi_payment_id->id);
                                $emiInit = false;
                                if (!$emi_payment) {
                                    $emi_payment = new EmiPayment();
                                    $emiInit = true;
                                }
//                        }
                                $emi_payment->emi_amount = $emi_payment_update['emi_amount'];
                                $emi_payment->emi_date = $key;
                                $emi_payment->bounce_charges = $emi_payment_update['bounce_charges'];
                                if ($generate_interest_invoice == 1) {
//                                    $gst_data = $this->getGSTAmount($application_id, ($emi_payment_update['delay_penalty'] - $emi_payment_update['charges_waived']));
//                                    $emi_payment->penal_interest_igst = isset($gst_data['IGST']) ? $gst_data['IGST'] : 0;
//                                    $emi_payment->penal_interest_cgst = isset($gst_data['CGST']) ? $gst_data['CGST'] : 0;
//                                    $emi_payment->penal_interest_sgst = isset($gst_data['SGST']) ? $gst_data['SGST'] : 0;
//                                    $emi_payment->net_penal_interest = isset($gst_data['net_amount']) ? $gst_data['net_amount'] : 0;
//                                    $emi_payment->final_penal_interest = isset($gst_data['amount']) ? $gst_data['amount'] : 0;
                                    $emi_payment->delay_penalty = $emi_payment_update['delay_penalty'];
                                } else {
                                    $emi_payment->delay_penalty = $emi_payment_update['delay_penalty'];
                                }
                                $emi_payment->charges_waived = $emi_payment_update['charges_waived'];
                                $emi_payment->payment_date = $payment_date;
                                $emi_payment->due_date = $emi_payment_update['due_date'];
                                if ($due_data[$key]['pending_amount'] > 0) {
                                    $emi_payment->payment_status = "partial";
                                } else {
                                    $emi_payment->payment_status = "success";
                                }
//                                $emi_payment->online_payment_id = $online_payment_id;
                                $emi_payment->application_id = $application_id;
                                $emi_payment->save();

                                if ($emiInit) {
                                    $emiPaymentIDs[] = $emi_payment->id;
                                }
                                $tally[$key]['bounce_charges'] = $amount_setteled;
                                $payment_transaction = new PaymentTransaction();
                                $payment_transaction->emi_payment_id = $emi_payment->id;
                                $payment_transaction->amount = $amount_setteled;
                                $payment_transaction->mode = $mode;
                                $payment_transaction->paid_by = $paid_by;
                                $payment_transaction->collected_by = $collected_by;
                                $payment_transaction->wallet_name = $wallet_name;
                                $payment_transaction->trasanction_id = $trasanction_id;
                                $payment_transaction->reason = isset($data['reason']) ? $data['reason'] : '';
                                $payment_transaction->trasanction_acknowledgement = $trasanction_acknowledgement;
                                $payment_transaction->application_id = $application_id;
                                $payment_transaction->payment_for = "EMI";
                                $payment_transaction->payment_date = $payment_date;
                                $payment_transaction->cf_transaction_id = $data['cf_transaction_id'];
                                $payment_transaction->bank_id = $bank_id;
                                $payment_transaction->payment_reconciliation_date = $payment_reconciliation_date;
                                $payment_transaction->status = isset($data['status']) ? $data['status'] : 'success';
                                $payment_transaction->save();

                                //$this->sendPaymentMessage($application_id, $data,$payment_status);
                            }

                        }
                    }
                }
                foreach ($due_data as $key => $emi_payment_update) {
                    if ($key <= date('Y-m-d')) {
                        $generate_interest_invoice = (isset($payment_history_data[$key]['generate_interest_invoice'])) ? $payment_history_data[$key]['generate_interest_invoice'] : 0;
                        $amount_setteled = 0;
                        $amount_due = 0;
                        if ($amount_received > 0 && $emi_payment_update['pending_amount'] > 0 && $emi_payment_update['delay_penalty'] > 0) {
                            $amount_due = ($emi_payment_update['delay_penalty'] < $emi_payment_update['pending_amount']) ? $emi_payment_update['delay_penalty'] : $emi_payment_update['pending_amount'];
                            if ($amount_received >= $amount_due) {
                                $amount_setteled = $amount_due;
                                $amount_received = $amount_received - $amount_setteled;
                                $due_data[$key]['pending_amount'] = $emi_payment_update['pending_amount'] - $amount_setteled;
                            } else {
                                $amount_setteled = $amount_received;
                                $due_data[$key]['pending_amount'] = $emi_payment_update['pending_amount'] - $amount_received;
                                $amount_received = 0;
                            }
                            if ($amount_setteled > 0) {
                                $emi_payment_id = EmiPayment::where('emi_date', $key)->where('application_id', $application_id)->where('payment_status', "!=", 'rejected')->where('payment_status', "!=", 'pending')->first(['id']);
                                $emi_payment = EmiPayment::find($emi_payment_id->id);
                                $emiInit = false;
                                if (!$emi_payment) {
                                    $emi_payment = new EmiPayment();
                                    $emiInit = true;
                                }

                                $emi_payment->emi_amount = $emi_payment_update['emi_amount'];
                                $emi_payment->emi_date = $key;
                                $emi_payment->bounce_charges = $emi_payment_update['bounce_charges'];
                                if ($generate_interest_invoice == 1) {
//                                    $gst_data = $this->getGSTAmount($application_id, ($emi_payment_update['delay_penalty'] - $emi_payment_update['charges_waived']));
//                                    $emi_payment->penal_interest_igst = isset($gst_data['IGST']) ? $gst_data['IGST'] : 0;
//                                    $emi_payment->penal_interest_cgst = isset($gst_data['CGST']) ? $gst_data['CGST'] : 0;
//                                    $emi_payment->penal_interest_sgst = isset($gst_data['SGST']) ? $gst_data['SGST'] : 0;
//                                    $emi_payment->net_penal_interest = isset($gst_data['net_amount']) ? $gst_data['net_amount'] : 0;
//                                    $emi_payment->final_penal_interest = isset($gst_data['amount']) ? $gst_data['amount'] : 0;
                                    $emi_payment->delay_penalty = $emi_payment_update['delay_penalty'];
                                } else {
                                    $emi_payment->delay_penalty = $emi_payment_update['delay_penalty'];
                                }
                                $emi_payment->charges_waived = $emi_payment_update['charges_waived'];
                                $emi_payment->payment_date = $payment_date;
                                $emi_payment->due_date = $emi_payment_update['due_date'];
                                if ($due_data[$key]['pending_amount'] > 0) {
                                    $emi_payment->payment_status = "partial";
                                } else {
                                    $emi_payment->payment_status = "success";
                                }
//                                $emi_payment->online_payment_id = $online_payment_id;
                                $emi_payment->application_id = $application_id;
                                $emi_payment->save();

                                if ($emiInit) {
                                    $emiPaymentIDs[] = $emi_payment->id;
                                }
                                $tally[$key]['penal_interest'] = $amount_setteled;
                                $payment_transaction = new PaymentTransaction();
                                $payment_transaction->emi_payment_id = $emi_payment->id;
                                $payment_transaction->amount = $amount_setteled;
                                $payment_transaction->mode = $mode;
                                $payment_transaction->paid_by = $paid_by;
                                $payment_transaction->collected_by = $collected_by;
                                $payment_transaction->wallet_name = $wallet_name;
                                $payment_transaction->trasanction_id = $trasanction_id;
                                $payment_transaction->payment_for = "EMI";
                                $payment_transaction->reason = isset($data['reason']) ? $data['reason'] : '';
                                $payment_transaction->trasanction_acknowledgement = $trasanction_acknowledgement;
                                $payment_transaction->payment_date = $payment_date;
                                $payment_transaction->cf_transaction_id = $data['cf_transaction_id'];
                                $payment_transaction->bank_id = $bank_id;
                                $payment_transaction->application_id = $application_id;
                                $payment_transaction->payment_reconciliation_date = $payment_reconciliation_date;
                                $payment_transaction->status = isset($data['status']) ? $data['status'] : 'success';
                                $payment_transaction->save();

                                //$this->sendPaymentMessage($application_id, $data,$payment_status);
                            }
                        }
                    }

                    //$this->sendPaymentMessage($application_id, $data,$payment_status);
                    $confirmation_sent = 1;

                }
            }
            if ($payment_status == 'rejected' || $payment_status == 'pending_from_bank' || $payment_status == 'initial_reject') {
                $emi_rejected_date = $payment_date;
                foreach ($due_data as $key => $emi_payment_update){
                    if ($key <= date('Y-m-d')) {
                        $emi_rejected_date = $key;
                    }
                }
                $emi_payment = new EmiPayment();
                $emi_payment->emi_amount = $amount_received;
                $emi_payment->emi_date = $emi_rejected_date;
                $emi_payment->bounce_charges = $payment_status == 'rejected' ? $paymentConfig['bounce'] : 0;
                $emi_payment->delay_penalty = 0;
                $emi_payment->charges_waived = 0;
                $emi_payment->payment_date = $payment_date;
                $emi_payment->payment_status = $payment_status;
//                $emi_payment->online_payment_id = $online_payment_id;
                $emi_payment->application_id = $application_id;
                $emi_payment->save();

                if ($payment_status == 'rejected') {
                    $payment_transaction = new PaymentTransaction();
                    $payment_transaction->emi_payment_id = $emi_payment->id;
                    $payment_transaction->amount = $amount_setteled;
                    $payment_transaction->mode = $mode;
                    $payment_transaction->paid_by = $paid_by;
                    $payment_transaction->umrn = isset($data['umrn']) ? $data['umrn'] : '';
                    $payment_transaction->collected_by = $collected_by;
                    $payment_transaction->wallet_name = $wallet_name;
                    $payment_transaction->application_id = $application_id;
                    $payment_transaction->reason = isset($data['reason']) ? $data['reason'] : '';
                    $payment_transaction->trasanction_id = $trasanction_id;
                    $payment_transaction->payment_for = "EMI";
                    $payment_transaction->bank_id = $data['bank_id'];
                    $payment_transaction->trasanction_acknowledgement = $trasanction_acknowledgement;
                    $payment_transaction->payment_date = $payment_date;
                    $payment_transaction->payment_reconciliation_date = $payment_reconciliation_date;
                    $payment_transaction->status = $payment_status;
                    $payment_transaction->save();

                    //$this->sendPaymentMessage($application_id, $data, $payment_status);
                    //$this->dailyReminder($application_id);}

                }
                $amount_received = 0;
            }
            if ($amount_received > 0 && $foreclosuredate == "") {
                $updateData = $this->updateAdvanceEMI($due_data, $application_id, $amount_received, $data, $emi_processed, $tally,$user->application_element->foreclosure_date);
                $amount_received = $updateData['amount_received'];

                if ($updateData['emiPaymentIDs']) {
                    if ($emiPaymentIDs) {
                        $emiPaymentIDs = array_merge($emiPaymentIDs, $updateData['emiPaymentIDs']);
                    } else {
                        $emiPaymentIDs = $updateData['emiPaymentIDs'];
                    }
                }
                if ($confirmation_sent == 0) {
                    //$this->sendPaymentMessage($application_id, $data, $payment_status);
                }
                $tally = $updateData['tally'];
            }
            if ($amount_received > 0) {
                if ((isset($user->application_element->foreclosure_date) && !empty($user->application_element->foreclosure_date) && $user->application_element->foreclosure_date != "1970-01-01") || $foreclosuredate != "") {
                    $data['advance_amount'] = $amount_received;
                    $this->updateAdvanceAmount($data, "Foreclosure", $application_id);
                } else {
                    $data['advance_amount'] = $amount_received;
                    $this->updateAdvanceAmount($data, "Over Payment", $application_id);
                }
            }

            if($tally) {
                //TallyJobs::saveTally(['tally' => $tally, 'id' => $application_id, 'emiPaymentID' => $emiPaymentIDs, 'type' => 'EMI']);
            }
            $this->sendPaymentMessage($application_id, $data,$payment_status);
            return $due_data;
        }
    }

    public function updateAdvanceEMI($due_data,$application_id,$amount_received,$data,$emi_paid,$tally = array(),$foreclosure_date = ""){
        $emiPaymentIDs = [];
        $emi_data = ApplicationEMICalculation::where('application_id',$application_id)->first();

        //$emi_paid = count($due_data);
        $emi_amount = $emi_data->emi;

        $due_data = $this->generateDues($application_id);
        $due_data = $due_data['payload'];
        //$tenure = $emi_data->remaining_emi - $emi_paid;
        //$emi_date =  date('Y-m-d',strtotime($emi_data->emi_date));
        $emi_paid = EmiPayment::where('application_id',$application_id)->whereIn('payment_status',['success'])->count();

        //$tenure = $emi_data->remaining_emi - $emi_paid;

        if($emi_paid == 0){
            $emi_date =  date('Y-m-d',strtotime($emi_data->emi_date));
        }else{
            $emi_date = date('Y-m-d', strtotime("+".$emi_paid." months", strtotime($emi_data->emi_date)));
        }
        //$tenure = 1;
        //while($tenure > 0)
        foreach ($due_data as $due){
            if($emi_date == $due['emi_date']) {
                if ($amount_received > 0) {
                    $due_amount = $due['amount'];
                    $emi_payment_details = EmiPayment::where('emi_date', $emi_date)->where('application_id', $application_id)->first();
                    if ($emi_payment_details) {
                        $payment_transaction = PaymentTransaction::where('emi_payment_id', $emi_payment_details->id)->where('status', "success")->get();
                        $emi_amount_received = 0;
                        if ($payment_transaction) {
                            foreach ($payment_transaction as $payments) {
                                $emi_amount_received = $emi_amount_received + $payments->amount;
                            }
                        }
                        $due_amount = $due['amount'] - $emi_amount_received - $emi_payment_details->charges_waived;
                        $emi_payment = EmiPayment::find($emi_payment_details->id);
                    } else {
                        $emi_payment = new EmiPayment();
                    }
                    if ($due_amount <= $amount_received) {

                        $emi_payment->emi_amount = $due['amount'];
                        $emi_payment->emi_date = $emi_date;
                        $emi_payment->bounce_charges = (isset($emi_payment_details->bounce_charges) ? $emi_payment_details->bounce_charges : 0);
                        $emi_payment->delay_penalty = (isset($emi_payment_details->delay_penalty) ? $emi_payment_details->delay_penalty : 0);
                        $emi_payment->charges_waived = (isset($emi_payment_details->charges_waived) ? $emi_payment_details->charges_waived : 0);
                        $emi_payment->payment_date = $data['payment_date'];
                        $emi_payment->payment_status = "success";
//                        $emi_payment->online_payment_id = "";
                        $emi_payment->application_id = $application_id;
                        $emi_payment->due_date = $due['due_date'];
                        $emi_payment->save();

                        $emiPaymentIDs[] = $emi_payment->id;
                        $tally[$emi_date]['emi_amount'] = $due_amount;
                        $payment_transaction = new PaymentTransaction();
                        $payment_transaction->emi_payment_id = $emi_payment->id;
                        $payment_transaction->amount = $due_amount;
                        $payment_transaction->mode = $data['mode'];
                        $payment_transaction->paid_by = $data['paid_by'];
                        $payment_transaction->umrn = isset($data['umrn']) ? $data['umrn'] : '';
                        $payment_transaction->collected_by = isset($data['collected_by']) ? $data['collected_by'] : '';
                        $payment_transaction->wallet_name = isset($data['wallet_name']) ? $data['wallet_name'] : '';
                        $payment_transaction->application_id = $application_id;
                        $payment_transaction->reason = isset($data['reason']) ? $data['reason'] : '';
                        $payment_transaction->payment_for = "EMI";
                        $payment_transaction->cf_transaction_id = $data['cf_transaction_id'];
                        $payment_transaction->bank_id = isset($data['bank_id']) ? $data['bank_id'] : '';
                        $payment_transaction->trasanction_id = isset($data['trasanction_id']) ? $data['trasanction_id'] : '';
                        $payment_transaction->trasanction_acknowledgement = isset($data['trasanction_acknowledgement']) ? $data['trasanction_acknowledgement'] : '';
                        $payment_transaction->payment_date = $data['payment_date'];
                        $payment_transaction->payment_reconciliation_date = isset($data['payment_reconciliation_date']) ? $data['payment_reconciliation_date'] : $data['payment_date'];;
                        $payment_transaction->status = "success";
                        $payment_transaction->save();
                        $amount_received = $amount_received - $due_amount;
                    } else {
                        if(empty($foreclosure_date) ) {
                            //$emi_payment = new EmiPayment();
                            $emi_payment->emi_amount = $due['amount'];
                            $emi_payment->emi_date = $emi_date;
                            $emi_payment->bounce_charges = (isset($emi_payment_details->bounce_charges) ? $emi_payment_details->bounce_charges : 0);
                            $emi_payment->delay_penalty = (isset($emi_payment_details->delay_penalty) ? $emi_payment_details->delay_penalty : 0);
                            $emi_payment->charges_waived = (isset($emi_payment_details->charges_waived) ? $emi_payment_details->charges_waived : 0);
                            $emi_payment->payment_date = $data['payment_date'];
                            $emi_payment->payment_status = "partial";
//                            $emi_payment->online_payment_id = "";
                            $emi_payment->due_date = $due['due_date'];
                            $emi_payment->application_id = $application_id;
                            $emi_payment->save();

                            $emiPaymentIDs[] = $emi_payment->id;

                            $tally[$emi_date]['emi_amount'] = $amount_received;
                            $payment_transaction = new PaymentTransaction();
                            $payment_transaction->emi_payment_id = $emi_payment->id;
                            $payment_transaction->amount = $amount_received;
                            $payment_transaction->mode = $data['mode'];
                            $payment_transaction->paid_by = $data['paid_by'];
                            $payment_transaction->umrn = isset($data['umrn']) ? $data['umrn'] : '';
                            $payment_transaction->collected_by = isset($data['collected_by']) ? $data['collected_by'] : '';
                            $payment_transaction->wallet_name = isset($data['wallet_name']) ? $data['wallet_name'] : '';
                            $payment_transaction->application_id = $application_id;
                            $payment_transaction->payment_for = "EMI";
                            $payment_transaction->cf_transaction_id = $data['cf_transaction_id'];
                            $payment_transaction->bank_id = isset($data['bank_id']) ? $data['bank_id'] : '';
                            $payment_transaction->reason = isset($data['reason']) ? $data['reason'] : '';
                            $payment_transaction->trasanction_id = isset($data['trasanction_id']) ? $data['trasanction_id'] : '';
                            $payment_transaction->trasanction_acknowledgement = isset($data['trasanction_acknowledgement']) ? $data['trasanction_acknowledgement'] : '';
                            $payment_transaction->payment_date = $data['payment_date'];
                            $payment_transaction->payment_reconciliation_date = isset($data['payment_reconciliation_date']) ? $data['payment_reconciliation_date'] : $data['payment_date'];;
                            $payment_transaction->status = "success";
                            $payment_transaction->save();
                            $amount_received = 0;
                            break;
                        }
                    }
                }
                $emi_date = date('Y-m-d', strtotime("+1 months", strtotime($emi_date)));
            }
            //$tenure++;
        }

        return ['amount_received' => $amount_received, 'emiPaymentIDs' => $emiPaymentIDs,'tally' => $tally];
    }

    public function sendPaymentMessage($application_id, $payment, $isSuccess){

        if($isSuccess == 'success'){
            $applicationController = new ConsumerApplicationController();
            $data = $applicationController->getTemplateReminders(6, $application_id, $payment);
            $data = $data->getData();
            //$data->email_id_test = ['aditya@creditfair.in','shraddha@creditfair.in','imran@creditfair.in','ashish@creditfair.in'];

            if (isset($data->email) && !empty($data->email)) {
                \Mail::send('emails.blank',
                    ['body' => $data->body]
                    , function ($message) use ($data) {
                        $message->to($data->email)->subject($data->subject);
                        //$message->cc('payments@creditfair.in');
                    });
//            $mobile = '918850077108';
//            send_sms($mobile, $data->sms);
            }
            if (isset($data->mobile_number) && !empty($data->mobile_number) && isset($data->sms)) {
                $mobile = '91' . $data->mobile_number;
                send_sms($mobile, ['message'=>$data->sms,'id'=>$application_id,'id_type'=>'application_id','message_type'=>"payment", 'templateId' => isset($data->templateId) ? $data->templateId : '', 'args' => isset($data->args) ? $data->args : '']);
            }
        }
    }

    public function getEMIdetails($id, $paymnet_date = ""){
        $payment_date = ($paymnet_date == "") ? date('Y-m-d') : date('Y-m-d',strtotime($paymnet_date));
        if(!is_array($id)){
            $application_id[] = $id;
        }else{
            $application_id = $id;
        }
        $data = array();
        foreach ($application_id as $application){
            $dues = $this->generateDues($application);
            $payment_history = $this->getPaymentHistory($application);
            //$payment_history_data = $this->getEMiPaidDetails($application);
            foreach ($dues['payload'] as $due) {
                foreach ($payment_history as $payment) {

                    if ($due['emi_date'] == $payment->emi_date) {
                        $data[$application][$due['emi_date']]['emi_amount'] = $payment->emi_amount;
                        $data[$application][$due['emi_date']]['charges_waived'] = $payment->charges_waived;
                        $data[$application][$due['emi_date']]['emi_payment_id'] = $payment->id;
                        $data[$application][$due['emi_date']]['delay_days'] = 0;
                        $data[$application][$due['emi_date']]['amount_received'] = 0;
                        $data[$application][$due['emi_date']]['pending_amount'] = 0;
                        $data[$application][$due['emi_date']]['due_date'] = (isset($payment->due_date) && !empty($payment->due_date)) ? $payment->due_date : (isset($due['due_date']) ? $due['due_date'] : $payment->emi_date);
                        if ($payment->payment_status != 'success') {
                            if ($payment->payment_status == 'partial') {
                                $bounce_penal_details  = $this->getBounceCharges($application_id,$payment->emi_amount,$due['emi_date'],$payment->transaction,$paymnet_date);
                                foreach ($payment->transaction as $transaction) {
                                    if($transaction->status = "success") {
                                        if(isset($data[$application][$due['emi_date']]['amount_received'])){
                                            $data[$application][$due['emi_date']]['amount_received'] = $data[$application][$due['emi_date']]['amount_received'] + $transaction->amount;
                                        }else{
                                            $data[$application][$due['emi_date']]['amount_received'] = $transaction->amount;
                                        }

                                        $data[$application][$due['emi_date']]['bounce_charges'] = (isset($bounce_penal_details['bounce_charges'])) ? $bounce_penal_details['bounce_charges'] : 0;

//                                        if(!isset($data[$application][$due['emi_date']]['bounce_charges']) || ($data[$application][$due['emi_date']]['bounce_charges'] == 0 || $data[$application][$due['emi_date']]['bounce_charges'] == "" )){
//                                            $data[$application][$due['emi_date']]['bounce_charges'] = (isset($payment_history_data[$due['emi_date']]['bounce_charge']) && $payment_history_data[$due['emi_date']]['bounce_charge'] == 1) ? (($this->calculateDelayDays($due['emi_date'], date('Y-m-d',strtotime($transaction->payment_date))) > 0) ? $paymentConfig['bounce'] : 0) : 0;
//                                        }else{
//                                            $data[$application][$due['emi_date']]['bounce_charges'] = (isset($data[$application][$due['emi_date']]['bounce_charges'])) ? $data[$application][$due['emi_date']]['bounce_charges'] : 0;
//                                        }

                                        $data[$application][$due['emi_date']]['delay_penalty'] = (isset($bounce_penal_details['penal_interest'])) ? $bounce_penal_details['penal_interest'] : 0;

//                                        if(!isset($data[$application][$due['emi_date']]['delay_penalty'])){
//                                            $data[$application][$due['emi_date']]['delay_penalty'] = $this->calculatePenalty($transaction->amount, $due['due_date'], date('Y-m-d',strtotime($transaction->payment_date)));
//                                        }else{
//                                            $data[$application][$due['emi_date']]['delay_penalty'] = $data[$application][$due['emi_date']]['delay_penalty'] + $this->calculatePenalty($transaction->amount, $due['due_date'], date('Y-m-d'));
//                                        }
                                        $data[$application][$due['emi_date']]['delay_days'] = (isset($bounce_penal_details['delay_days'])) ? $bounce_penal_details['delay_days'] : 0;
                                    }
                                }
                                if(($payment->emi_amount - $data[$application][$due['emi_date']]['amount_received']) > 0) {
                                    if (!isset($data[$application][$due['emi_date']]['bounce_charges']) || ($data[$application][$due['emi_date']]['bounce_charges'] == 0 || $data[$application][$due['emi_date']]['bounce_charges'] == "")) {
                                        $data[$application][$due['emi_date']]['bounce_charges'] = (isset($bounce_penal_details['bounce_charges'])) ? $bounce_penal_details['bounce_charges'] : 0;
                                    }
//                                        $data[$application][$due['emi_date']]['bounce_charges'] = (isset($payment_history_data[$due['emi_date']]['bounce_charge']) && $payment_history_data[$due['emi_date']]['bounce_charge'] == 1) ? (($this->calculateDelayDays($due['emi_date'], $payment_date) > 0) ? $paymentConfig['bounce'] : 0) : 0;
//                                    }else{
//                                        $data[$application][$due['emi_date']]['bounce_charges'] = (isset($data[$application][$due['emi_date']]['bounce_charges'])) ? $data[$application][$due['emi_date']]['bounce_charges'] : 0;
//                                    }
                                    if (!isset($data[$application][$due['emi_date']]['delay_penalty'])) {
                                        $data[$application][$due['emi_date']]['delay_penalty'] = (isset($bounce_penal_details['penal_interest'])) ? $bounce_penal_details['penal_interest'] : 0;
                                    }
                                    $data[$application][$due['emi_date']]['delay_days'] = (isset($bounce_penal_details['delay_days'])) ? $bounce_penal_details['delay_days'] : 0;
                                }
//                                        $data[$application][$due['emi_date']]['delay_penalty'] = $this->calculatePenalty(($payment->emi_amount - $data[$application][$due['emi_date']]['amount_received']), $due['due_date'], date('Y-m-d'));
//                                    }else{
//                                        $data[$application][$due['emi_date']]['delay_penalty'] = $data[$application][$due['emi_date']]['delay_penalty'] + $this->calculatePenalty(($payment->emi_amount - $data[$application][$due['emi_date']]['amount_received']), $due['due_date'], $payment_date);
//                                    }
//                                    $data[$application][$due['emi_date']]['delay_days'] = $this->calculateDelayDays($due['due_date'], $payment_date);
//                                }
                                $data[$application][$due['emi_date']]['pending_amount'] = ($payment->emi_amount + (isset($data[$application][$due['emi_date']]['bounce_charges']) ? $data[$application][$due['emi_date']]['bounce_charges'] : 0) + (isset($data[$application][$due['emi_date']]['delay_penalty']) ? $data[$application][$due['emi_date']]['delay_penalty'] : 0)) - $data[$application][$due['emi_date']]['amount_received'] - $data[$application][$due['emi_date']]['charges_waived'];
                            }
                        } else {
                            $data[$application][$due['emi_date']]['bounce_charges'] = $payment->bounce_charges;
                            $data[$application][$due['emi_date']]['delay_penalty'] = $payment->delay_penalty;
                            $data[$application][$due['emi_date']]['charges_waived'] = $payment->charges_waived;
                            $data[$application][$due['emi_date']]['amount_received'] = ($data[$application][$due['emi_date']]['emi_amount']+$data[$application][$due['emi_date']]['bounce_charges']+$data[$application][$due['emi_date']]['delay_penalty']) - $data[$application][$due['emi_date']]['charges_waived'];
                            if($payment->payment_status == 'pending_from_bank'){
                                $data[$application][$due['emi_date']]['pending_amount'] = $payment->emi_amount;
                            }else {
                                $data[$application][$due['emi_date']]['pending_amount'] = 0;
                            }

                            $data[$application][$due['emi_date']]['delay_days'] = $this->calculateDelayDays($due['due_date'], date('Y-m-d',strtotime($payment->payment_date)));
                        }
                    }
                }

                if (!isset($data[$application][$due['emi_date']])) {
                    $bounce_penal_details  = $this->getBounceCharges($application_id,$due['amount'],$due['emi_date'],array(),$payment_date);

                    $data[$application][$due['emi_date']]['emi_payment_id'] = 0;
                    $data[$application][$due['emi_date']]['emi_amount'] = $due['amount'];
                    $data[$application][$due['emi_date']]['charges_waived'] = 0;
                    $data[$application][$due['emi_date']]['amount_received'] = 0;
                    $data[$application][$due['emi_date']]['bounce_charges'] = (isset($bounce_penal_details['bounce_charges'])) ? $bounce_penal_details['bounce_charges'] : 0;
                    $data[$application][$due['emi_date']]['delay_penalty'] = (isset($bounce_penal_details['penal_interest'])) ? $bounce_penal_details['penal_interest'] : 0;
                    $data[$application][$due['emi_date']]['pending_amount'] = ($due['amount'] + $data[$application][$due['emi_date']]['bounce_charges'] + $data[$application][$due['emi_date']]['delay_penalty']) - $data[$application][$due['emi_date']]['charges_waived'];
                    $data[$application][$due['emi_date']]['delay_days'] = (isset($bounce_penal_details['delay_days'])) ? $bounce_penal_details['delay_days'] : 0;
                    $data[$application][$due['emi_date']]['due_date'] =  (isset($due['due_date'])) ? $due['due_date'] : $due['emi_date'];
                }
            }
        }
        //return $payment_history;
        return ($data);
    }

    public function calculatePenalty($amount,$due_date,$payment_date){
        $delay_day = $this->calculateDelayDays($due_date,$payment_date);
        $penalty = ($delay_day > 0) ? round((($amount * (0.15))/100) * $delay_day,0) : 0;
        return $penalty;
    }

    public function calculateDelayDays($due_date,$payment_date){
        $now = strtotime($payment_date); // or your date as well
        $your_date = strtotime($due_date);
        $datediff = $now - $your_date;

        return round($datediff / (60 * 60 * 24),0);
    }


    public function generateDues($id,$noforclosure = 0, $isMoratorium = false){
        $i = 0;
        $user = ConsumerApplication::with('application_element','emi','moratoriums')->where('id',$id)->first();
        $emiCalculation = new \App\Http\Controllers\Admin\EMICalculation(new Request());
        $payload = [];
        if($user->emi) {
            $dues = $emiCalculation->getRepaymentSchedule($user, false);

            $moratorium_amount = 0;
            $moratoriumPeriod = false;
            if (isset($dues->emis)) {
                foreach ($dues->emis as $index => $emi_amount) {
                    //$emi_date = date('Y-m-d', strtotime($user->emi->emi_date . ' +' . $i . ' month'));
                    $emi_date = $emiCalculation->getEMIDateByPaymentFrequency($user,$i);

                    /*$moratorium_amount = 0;
                    if(isset($user->moratoriums) && count($user->moratoriums)) {
                        foreach ($user->moratoriums as $moratoriumItem) {
                            if ((isset($moratoriumItem->id) && $moratoriumItem->emi_date <= $emi_date) || $moratoriumPeriod) { # <= because we want to increase next emi date to 1 month

                                $emi_date = Carbon::createFromFormat('Y-m-d', $emi_date)->addMonth(1)->toDateString();

                                if ($moratoriumItem->emi_date == Carbon::createFromFormat('Y-m-d', $emi_date)->subMonth(1)->toDateString() && !$isMoratorium) { //!$moratoriumPeriod
                                    $moratorium_amount = (new Moratorium())->getPrincipalOutstanding($user, $moratoriumItem);
                                    $emi_amount += $moratorium_amount;
                                    break;
                                }

                                $moratoriumPeriod = true;
                            }
                        }
                    }*/

                    if(isset($user->application_element->foreclosure_date) && !empty($user->application_element->foreclosure_date) && $user->application_element->foreclosure_date != "1970-01-01" && date('Y-m-d', strtotime($emi_date)) > ($user->application_element->foreclosure_date ) && $noforclosure != 1){
                        break;
                    }else {
                        //if (strtotime($emi_date) <= time()) {
                        $due_date = Carbon::createFromFormat('Y-m-d', $emi_date)->subDay(0);
                        $holidays = [];//$this->getHolidayList();
                        while(in_array($due_date,$holidays) || $due_date->isSunday()){
                            $due_date = Carbon::createFromFormat('Y-m-d', $due_date->toDateString())->addDay(1);
                        }
//                        if ($due_date->isSunday()) {
//                            $due_date = date('Y-m-d', strtotime($due_date->addDays(2)));
//                        } elseif ($due_date->isSaturday()) {
//                            $due_date = date('Y-m-d', strtotime($due_date->addDays(3)));
//                        } else {
//                            $due_date = date('Y-m-d', strtotime($due_date->addDays(1)));
//                        }
                        $payload[] = ['id' => $id, 'offer_id' => $user->emi->offer_id, 'emi_id' => $user->emi->id, 'emi_date' => $emi_date, 'amount' => $emi_amount, 'moratorium_amount' => $moratorium_amount, 'due_date' => $due_date];
                    }
                    //}
                    $i++;
                }
            }
        }
        return ['payload'=> (new LoanManagement())->applyMoratorium($user, $payload, $isMoratorium), 'beforePayload' => $payload];
    }

    public function getPaymentHistory($id){
        $payment = EmiPayment::with('transaction')->where('application_id',$id)->where('payment_status','!=','rejected')->where('payment_status','!=','pending')->get();
        return $payment;
    }

    public function getWaivedOff($id){
        $waived_off = WaiveOffLog::with('emi_payment','users')->where('application_id',$id)->orderBy('emi_payment_id')->get();
        $response =array();
        if($waived_off) {
            foreach ($waived_off as $waived){
                $response[$waived->emi_payment->emi_date]['amount'] = $waived->amount;
                $response[$waived->emi_payment->emi_date]['waived_by'] = $waived->users->name;
                $response[$waived->emi_payment->emi_date]['waived_on'] = $waived->created_at;
            }
        }
        return $response;
    }

    public function getData(){
        $response = array();
        $status =  ['disbursed','nach registered'];
        $consumerApplication = ConsumerApplication::wherein('state',$status)->whereNull('is_deleted')->orderBy('updated_at', 'desc')->get();
        $response =  "<table><tr><th>id</th><th>emi_date</th><th>emi_amount</th><th>bounce_charges</th><th>delay_penalty</th><th>payment_mode</th><th>charges_waived</th><th>payment_date</th><th>application_id</th></tr>";
        $x = 1;

        foreach ($consumerApplication as $application){
            $amount_due = 0;
            $dues = $this->generateDues($application->id);
            if(isset($dues['payload'][0])) {
                foreach ($dues['payload'] as $application_dues){
                    $emi_date = $application_dues['emi_date'];
                    $emi_amount = $application_dues['amount'];
                    $response.= "<tr><td>$x</td><td>$emi_date</td><td>$emi_amount</td><td>0</td><td>0</td><td>Nach</td><td>0</td><td>$emi_date</td><td>$application->id</td>";
                    $amount_due = $amount_due + $application_dues['amount'];
                    $x++;
                }

//                    $dues['amount_due'] = $amount_due;
//                    if($amount_due > 0){
//
//                    }
                //$response[$application->id] = $dues;
            }
        }
        return $response;
    }
    public function getPaymentDueHistory($application_id = 0,$last_date = "",$all_status = 1,$check_mandate = 0){
        if($last_date == ""){
            $last_date =  date('Y-m-d');
        }
        $response = array();
        $status =  ['disbursed','nach registered'];
        $consumerApplication = ConsumerApplication::with('merchant','lender','lender.bank_details','checkmandate');
        if($all_status == 0) {
            $consumerApplication = $consumerApplication->wherein('state', $status);
        }
        $consumerApplication = $consumerApplication->whereNull('is_deleted')->orderBy('updated_at', 'desc');
        if($application_id != 0 && $application_id != null) {
            $consumerApplication = $consumerApplication->where('id', $application_id);
        }

        if($this->isPagination) {
            $consumerApplication = $consumerApplication->whereNotIn('state',$this->status)->skip($this->isPaginationSkip)->paginate($this->isPagination);
            $this->isPaginationTotal = $consumerApplication->total();
            $this->isPaginationLastPage = $consumerApplication->lastPage();
        }else{
            $consumerApplication = $consumerApplication->get();
        }

        if($application_id == 0 || $application_id == ""){
            $payment_history = EmiPayment::with('transaction.bank')->get();
        }else{
            $payment_history = EmiPayment::with('transaction.bank')->where('application_id',$application_id)->get();
        }

        foreach ($consumerApplication as $application) {
            if ($check_mandate == 0 || isset($application->checkmandate->id)){
            $advance_emi_accepatble = 0;
            $amount_due = 0;
            $emi = 0;
            $emi_due = 0;
            $amount_paid = 0;
            $amount_pending = 0;
            $emi_paid = 0;
            $amount_payable = 0;
            $dues = $this->getEMIdetails($application->id);
                //if (isset($dues[$application->id]) && !in_array($application->id, ['494', '1439', '375'])) {
                if (isset($dues[$application->id])) {
                        $advance_emi_accepatble = 0;
                    foreach ($dues[$application->id] as $key => $application_dues) {
                        $last_emi_date = $key;
                        if ($key < $last_date) {
                            $amount_due = $amount_due + (isset($application_dues['pending_amount']) ? $application_dues['pending_amount'] : 0);
                            $amount_payable = $amount_payable + (isset($application_dues['pending_amount']) ? $application_dues['pending_amount'] : 0);

                        if ($emi == 0) {
                            $emi = $application_dues['emi_amount'];
                        }
                    }else{
                        $advance_emi_accepatble = 1;
                        $check_date = date('Y-m-d',strtotime("+11 days",time()));
                        if($check_date > $key) {
                            $amount_payable = $amount_payable + $application_dues['emi_amount'];
                        }
                    }
                    foreach ($payment_history as $payment) {
                        if ($payment->id == $application_dues['emi_payment_id']) {
                            $dues[$application->id][$key]['payment_history'] = $payment;
                        }
                    }
                    $amount_paid = $amount_paid + $application_dues['amount_received'];
                    $amount_pending = $amount_pending + (isset($application_dues['pending_amount']) ? $application_dues['pending_amount'] : 0);
                    //if($key < date('Y-m-d')) {
                    if (isset($application_dues['pending_amount']) && $application_dues['pending_amount'] > 0) {
                        $emi_due = $emi_due + 1;
                    } else {
                        $emi_paid = $emi_paid + 1;
                    }

                        $last_emi_date = $key;
                        //}
                    }
                    $overpayments = PaymentTransaction::where('application_id', $application->id)->whereIn('payment_for', ['Over Payment', 'Advance Payment', 'rejected', 'Foreclosure'])->get();
                    $over_payment = 0;
                    $adhoc_payment = 0;
                    if ($overpayments) {
                        foreach ($overpayments as $overpayment) {
                            if ($overpayment->amount > 0 && ($overpayment->payment_for == "Over Payment") && $overpayment->status != "rejected") {
                                $over_payment = $over_payment + $overpayment->amount;
                            }
                            if ($overpayment->amount > 0 && ($overpayment->payment_for == "Over Payment" || $overpayment->payment_for == "Advance Payment" || $overpayment->payment_for == "Foreclosure") && $overpayment->status != "rejected") {
                                $adhoc_payment = $adhoc_payment + $overpayment->amount;
                            }

                        }
                        $pending_dues[$application->id]['over_payment'] = $over_payment;
                    } else {
                        $pending_dues[$application->id]['over_payment'] = 0;
                    }

                    $pending_dues[$application->id]['waived_off_data'] = $this->getWaivedOff($application->id);
                    $pending_dues[$application->id]['adhoc_transaction'] = $overpayments;
                    $pending_dues[$application->id]['amount_due'] = $amount_due;
                    $pending_dues[$application->id]['application_id'] = $application->id;
                    $pending_dues[$application->id]['applicant_name'] = $application->name;
                    $pending_dues[$application->id]['coapplicant_name'] = $application->co_applicant_name;
                    $pending_dues[$application->id]['merchant_name'] = $application->merchant->merchant_name;
                    $pending_dues[$application->id]['merchant_id'] = $application->merchant->id;
                    $pending_dues[$application->id]['applicant_email'] = $application->email;
                    $pending_dues[$application->id]['coapplicant_email'] = $application->co_applicant_email;
                    $pending_dues[$application->id]['applicant_number'] = $application->mobile_number;
                    $pending_dues[$application->id]['coapplicant_number'] = $application->co_applicant_mobile_number;
                    $pending_dues[$application->id]['last_emi_date'] = $last_emi_date;
                    $pending_dues[$application->id]['purpose'] = $application->purpose;
                    $pending_dues[$application->id]['max_payable'] = ($advance_emi_accepatble == 2) ? $amount_due + $emi : $amount_due;
                    $pending_dues[$application->id]['lender_id'] = $application->lender_id;
                    $pending_dues[$application->id]['lender_name'] = isset($application->lender->name) ? $application->lender->name : "";
                    $pending_dues[$application->id]['purpose'] = $application->purpose;
                    $pending_dues[$application->id]['account_holder'] = isset($application->lender->bank_details->account_holder) ? $application->lender->bank_details->account_holder : "";
                    $pending_dues[$application->id]['bank'] = isset($application->lender->bank_details->bank_name) ? $application->lender->bank_details->bank_name : "";
                    $pending_dues[$application->id]['branch'] = isset($application->lender->bank_details->branch_name) ? $application->lender->bank_details->branch_name : "";
                    $pending_dues[$application->id]['account_number'] = isset($application->lender->bank_details->account_number) ? $application->lender->bank_details->account_number : "";
                    $pending_dues[$application->id]['ifsc'] = isset($application->lender->bank_details->ifsc_code) ? $application->lender->bank_details->ifsc_code : "";
                    $pending_dues[$application->id]['amount_paid'] = $amount_paid + $adhoc_payment;
                    $pending_dues[$application->id]['emi_due'] = $emi_due;
                    $pending_dues[$application->id]['emi_paid'] = $emi_paid;
                    $pending_dues[$application->id]['amount_pending'] = $amount_pending;
                    $pending_dues[$application->id]['last_emi_date'] = $last_emi_date;
                    $pending_dues[$application->id]['amount_payable'] = $amount_payable;
                    $pending_dues[$application->id]['mandate'] = $application->checkmandate;
                    $pending_dues[$application->id]['approved_amount'] = ($application->approved_amount == 0 || $application->approved_amount == "") ? $application->loan_amount : $application->approved_amount;
                    $pending_dues[$application->id]['payment'] = $dues[$application->id];
                    $response[$application->id] = $pending_dues[$application->id];
                }
            }
        }
        return $response;
    }

    public function dailyReminder($application_id = 0,$send_email= 1,$send_message=1,$send_anyways= 0){
        $serviceCount  = 0;
        $current_date_check = date("Y-m-d", strtotime("+ 1 day"));
        $current_data = date("Y-m-d");
        if($application_id == 0){
            $payment_data = $this->getPaymentDueHistory(0,"",0);
        }else{
            $payment_data = $this->getPaymentDueHistory($application_id,"",0);
        }
        $view_data = array();


        foreach ($payment_data as $id=>$application) {

                foreach ($application['payment'] as $key1 => $payment) {
                    if ((isset($payment['pending_amount']) && $payment['pending_amount'] == 0) || $key1 > date('Y-m-d', time())) {
                        unset($application['payment'][$key1]);
                    }
                }
                $bounce_charges = 0;
                $delay_penalty = 0;
                $total_emi = 0;
                $amount_received = 0;
                $waived = 0;
                $view_data['delay_days'] = 0;
                foreach ($application['payment'] as $key2 => $payment) {
                    $emi_current_date_check = date("Y-m-d", strtotime("+ 1 day", strtotime($key2)));
                    $view_data['for_today_emi_amount'] = (isset($payment['emi_amount']) ? $payment['emi_amount'] : 0);
                    if ($key2 != $current_data && $current_data != $emi_current_date_check) {
                        $bounce_charges = $bounce_charges + (isset($payment['bounce_charges']) ? $payment['bounce_charges'] : 0);
                        $delay_penalty = $delay_penalty + (isset($payment['delay_penalty']) ? $payment['delay_penalty'] : 0);
                        $total_emi = $total_emi + (isset($payment['emi_amount']) ? $payment['emi_amount'] : 0);
                        $amount_received = $amount_received + (isset($payment['amount_received']) ? $payment['amount_received'] : 0);
                        $waived = $waived + (isset($payment['charges_waived']) ? $payment['charges_waived'] : 0);
                        if ($view_data['delay_days'] == 0 && isset($payment['pending_amount']) && $payment['pending_amount'] > 0) {
                            $due_date_delay = Carbon::createFromFormat('Y-m-d', $key2)->subDay(0);
                            $holidays = [];//$this->getHolidayList();
                            while(in_array($due_date_delay,$holidays) || $due_date_delay->isSunday()){
                                $due_date_delay = Carbon::createFromFormat('Y-m-d', $due_date_delay->toDateString())->addDay(1);
                            }
                            $view_data['delay_days'] = $this->calculateDelayDays($due_date_delay->toDateString(), date('Y-m-d'));
                        }

                        if (isset($payment['payment_history']['transaction'])) {
                            foreach ($payment['payment_history']['transaction'] as $transaction) {
                                if (isset($view_data['reason'])) {
                                    $view_data['reason'] = $transaction['reason'];

                                } else {
                                    $view_data['reason'] = "and your payment hasn’t been received by us";
                                }
                            }
                        } else {
                            $view_data['reason'] = "and your payment hasn’t been received by us";
                        }
                    } else {
                        unset($application['payment'][$key2]);
                    }
                }


                if ($total_emi >= $amount_received) {
                    $balance_emi = $total_emi - $amount_received;
                    $charges = $bounce_charges + $delay_penalty;
                } else {
                    $balance_emi = 0;
                    $amount_received = $amount_received - $total_emi;
                    $charges = $amount_received - ($bounce_charges + $delay_penalty);

                }

                if ($waived <= $charges) {
                    $charges = $charges - $waived;
                } else {
                    $charges = 0;
                    $balance_emi = $balance_emi - ($waived - $charges);
                }

                $application['balance_emi'] = $balance_emi;
                $application['charges'] = $charges;
                $view_data['data'] = $application;
                $view_data['send_anyways'] = $send_anyways;




                if ($view_data['data']['amount_due'] > 0 && (($charges > 699 || $balance_emi > 0) || $send_anyways == 1)) {
                    $razorpaydata['amount'] = $view_data['data']['amount_due'];
                    $razorpaydata['email'] = "";
                    $razorpaydata['lender_id'] = $view_data['data']['lender_id'];
                    $razorpaydata['id'] = $id;
                    $razorpaydata['purpose'] = 'emi & penalty';
                    $razorpaydata['emi_date'] = Carbon::now()->toDateString();

                    if (!$view_data['delay_days'] && empty($view_data['payment_link'])){
                        $send_anyways = 1;
                        $view_data['data']['amount_due'] = $view_data['for_today_emi_amount'] ?? 0;
                    }

                    setlocale(LC_MONETARY, 'en_IN.UTF-8');
                    if ($view_data['data']['amount_due'] > 999 || $send_anyways == 1) {
                        $hashids = new Hashids('Creditfair by CS', 20);
                        $hashed_id = $hashids->encode($id);
                        try {
                            $view_data['rajorpay_link'] = Shortio::getUrl(asset("paytm/" . $hashed_id));
                        }catch (\Exception $e){
                            $view_data['rajorpay_link'] = asset("paytm/" . $hashed_id);
                        }

                        //$consumerapplication = new ConsumerApplicationController();
                        //$view_data['rajorpay_link'] = $consumerapplication->getrazorpaylink($razorpaydata);
                    } else {
                        $view_data['rajorpay_link'] = "";
                    }
                    //$view_data['subject'] = "Your EMI is " . $view_data['delay_days'] . " Days overdue. Please pay Rs " . \str_replace('.00', '', money_format('%!i', ($view_data['data']['amount_due']))) . " now";
                    $view_data['subject'] = "Your payment of Rs " . \str_replace('.00', '', money_format('%!i', ($view_data['data']['amount_due']))) . " is overdue";
                    if (isset($view_data['data']['coapplicant_name']) && !empty($view_data['data']['coapplicant_name'])) {
                        $applicant = $view_data['data']['applicant_name'] . " / " . $view_data['data']['coapplicant_name'];
                    } else {
                        $applicant = $view_data['data']['applicant_name'];
                    }
                    $view_data['sms'] = "Dear " . $applicant . ",<br><br>
You are " . $view_data['delay_days'] . " days late on your payment of Rs. " . \str_replace('.00', '', money_format('%!i', ($view_data['data']['amount_due']))) . " due towards.";
                    if ($application['balance_emi'] > 0) {
                        $view_data['sms'] .= " EMI of Rs " . \str_replace('.00', '', money_format('%!i', ($application['balance_emi']))) . "";
                    }
                    if ($application['balance_emi'] > 0 && $application['charges'] > 0) {
                        $view_data['sms'] .= " and";
                    }
                    if ($application['charges'] > 0) {
                        $view_data['sms'] .= " fees of Rs " . \str_replace('.00', '', money_format('%!i', ($application['charges']))) . "";
                    }
                    if ($view_data['data']['amount_due'] > 999 || $send_anyways == 1) {
                        $view_data['sms'] .= " Pay now on " . $view_data['rajorpay_link'] . "";
                    }

                    if (count($application['payment']) > 1) {
                        $view_data['body'] = view('emails.reminders.emi_due_reminder_with_payment_link_with_penalty_multiple', $view_data)->render();
                        //$view_data['sms'] = "Dear " . $applicant . ",<br><br>You are " . $view_data['delay_days'] . " days late on your EMI " . $view_data['reason'] . ". Please send a total of Rs " . \str_replace('.00', '', money_format('%!i', ($view_data['data']['amount_due']))) . "/- immediately using " . $view_data['rajorpay_link'] . ". <br>We might have to pursue legal action if we don’t hear from you. Call us on +91-9967235047 if you are facing any issues while making the payment.<br><br>Regards,<br>Team Credit Fair";
                        $view_data['sms'] .= "<br>We might have to pursue legal action if we don't hear from you. Call us on +91-8928769161 if you need any help or have already paid.<br><br>Regards,<br>Team Credit Fair";

                    } else {

                        $view_data['body'] = view('emails.reminders.emi_due_reminder_with_payment_link_with_penalty', $view_data)->render();

                        //$view_data['sms'] = "Dear " . $applicant . ",<br><br>You are " . $view_data['delay_days'] . " days late on your EMI " . $view_data['reason'] . ". Please send a total of Rs. " . \str_replace('.00', '', money_format('%!i', ($view_data['data']['amount_due']))) . "/- immediately using " . $view_data['rajorpay_link'] . ". <br>Late payments can spoil your credit history and you might not be able to get loans in the future from any bank or finance company. Call us on +91-9967235047 if you face any issues while making the payment.<br><br>Regards,<br>Team Credit Fair";
                        $view_data['sms'] .= "<br>Late payments can spoil your credit history and you might not be able to get loans in the future from any bank or finance company. Call us on +91-8928769161 if you need any help or have already paid.<br><br>Regards,<br>Team Credit Fair";


                    }

                    $view_data['sms'] = str_replace('<br/>', "\n", $view_data['sms']);
                    $view_data['sms'] = str_replace('<br>', "\n", $view_data['sms']);




                    // testing email start
//                $view_data['email_id'] = ['payments@creditfair.in'];
//
//                \Mail::send('emails.blank',
//                    ['body' => $view_data['body']]
//                    , function ($message) use ($view_data) {
//                        $message->to($view_data['email_id'])->subject($view_data['subject']);
//                    });
//                    $this->emailCount++;
                //$mobile = '918291919036';
                //send_sms($mobile, ['message'=>$view_data['sms'],'id'=>$application_id,'id_type'=>'application_id']);
                    // testing email end

                if (isset($view_data['data']['applicant_email']) && !empty($view_data['data']['applicant_email']) && $send_email == 1 && UserEmails::isValid($view_data['data']['applicant_email']) && !(BNPL::is($view_data['data']['merchant_id'])) && !in_array($view_data['data']['merchant_id'],[6418,6517,6598,6865,6600])) {
                    \Mail::send('emails.blank',
                        ['body' => $view_data['body']]
                        , function ($message) use ($view_data) {
                            $message->to($view_data['data']['applicant_email'])->subject($view_data['subject']);

                            if (isset($view_data['data']['coapplicant_email']) && !empty($view_data['data']['coapplicant_email'])) {
                                $message->cc([$view_data['data']['coapplicant_email']]);
                            }else{
                                //$message->cc('payments@creditfair.in');
                            }
                        });

                    $this->emailCount++;
                }
                if (isset($view_data['data']['applicant_number']) && !empty($view_data['data']['applicant_number']) && isset($view_data['sms']) && $send_message == 1 && !(BNPL::is($view_data['data']['merchant_id'])) && !in_array($view_data['data']['merchant_id'],[6418,6517,6598,6865,6600])) {
                    $mobile = '91' . $view_data['data']['applicant_number'];
                    if(isset($view_data['data']['coapplicant_number']) && !empty($view_data['data']['coapplicant_number'])){
                        $mobile.= $mobile.",91".$view_data['data']['coapplicant_number'];
                    }
                    send_sms($mobile, ['message'=>$view_data['sms'],'id'=>$id,'id_type'=>'application_id','message_type'=>"payment"]);
                    $this->smsCount++;
                }

                $serviceCount++;
                }
                $view_data['delay_days'] = 0;
        }
        return $application_id ? $view_data : $serviceCount;
    }
//    public function dailyReminder($application_id = 0,$send_email= 1,$send_message=1,$send_anyways= 0){
//        $serviceCount  = 0;
//        $current_date_check = date("Y-m-d", strtotime("+ 1 day"));
//        $current_data = date("Y-m-d");
//        $loanmanagement = new LoanManagement();
//        if($application_id == 0){
//            $payment_data = $loanmanagement->getPaymentDueHistory(0,"",0);
//        }else{
//            $payment_data = $loanmanagement->getPaymentDueHistory($application_id,"",0);
//        }
//        $view_data = array();
//        foreach ($payment_data as $id=>$application) {
//            foreach ($application['payment'] as $key1 => $payment) {
//                if ((isset($payment['pending_amount']) && $payment['pending_amount'] == 0) || $key1 > date('Y-m-d', time())) {
//                    unset($application['payment'][$key1]);
//                }
//            }
//            $bounce_charges = 0;
//            $delay_penalty = 0;
//            $total_emi = 0;
//            $amount_received = 0;
//            $waived = 0;
//            $view_data['delay_days'] = 0;
//            foreach ($application['payment'] as $key2 => $payment) {
//                if ($key2 != $current_data && $key2 != $current_date_check) {
//                    $bounce_charges = $bounce_charges + (isset($payment['bounce_charges']) ? $payment['bounce_charges'] : 0);
//                    $delay_penalty = $delay_penalty + (isset($payment['delay_penalty']) ? $payment['delay_penalty']: 0);
//                    $total_emi = $total_emi + (isset($payment['emi_amount']) ? $payment['emi_amount']: 0);
//                    $amount_received = $amount_received + (isset($payment['amount_received']) ? $payment['amount_received']: 0);
//                    $waived = $waived + (isset($payment['charges_waived']) ? $payment['charges_waived']: 0);
//                    if ($view_data['delay_days'] == 0 && isset($payment['pending_amount']) && $payment['pending_amount'] > 0) {
//                        $view_data['delay_days'] = $this->calculateDelayDays($key2, date('Y-m-d'));
//                    }
//
//                    if (isset($payment['payment_history']['transaction'])) {
//                        foreach ($payment['payment_history']['transaction'] as $transaction) {
//                            if (isset($view_data['reason'])) {
//                                $view_data['reason'] = $transaction['reason'];
//
//                            } else {
//                                $view_data['reason'] = "and your payment hasn’t been received by us";
//                            }
//                        }
//                    } else {
//                        $view_data['reason'] = "and your payment hasn’t been received by us";
//                    }
//                }else{
//                    unset($application['payment'][$key2]);
//                }
//            }
//
//
//            if ($total_emi >= $amount_received) {
//                $balance_emi = $total_emi - $amount_received;
//                $charges = $bounce_charges + $delay_penalty;
//            } else {
//                $balance_emi = 0;
//                $amount_received = $amount_received - $total_emi;
//                $charges = $amount_received - ($bounce_charges + $delay_penalty);
//
//            }
//
//            if($waived <= $charges){
//                $charges = $charges - $waived;
//            }else{
//                $charges = 0;
//                $balance_emi = $balance_emi - ($waived-$charges);
//            }
//
//            $application['balance_emi'] = $balance_emi;
//            $application['charges'] = $charges;
//            $view_data['data'] = $application;
//            $view_data['send_anyways'] = $send_anyways;
//            if ($view_data['data']['amount_due'] > 0 && (($charges > 699 || $balance_emi > 0) || $send_anyways == 1)) {
//                $razorpaydata['amount'] = $view_data['data']['amount_due'];
//                $razorpaydata['email'] = "";
//                $razorpaydata['lender_id'] = $view_data['data']['lender_id'];
//                $razorpaydata['id'] = $id;
//                $razorpaydata['purpose'] = 'emi & penalty';
//                $razorpaydata['emi_date'] = Carbon::now()->toDateString();
//
//                setlocale(LC_MONETARY, 'en_IN.UTF-8');
//                if($view_data['data']['amount_due'] > 999 || $send_anyways == 1){
//                    $hashids = new Hashids('Creditfair by CS', 20);
//                    $hashed_id = $hashids->encode($id);
//                    $view_data['rajorpay_link'] = \Bitly::getUrl(asset("paytm/".$hashed_id));
//
//                    //$consumerapplication = new ConsumerApplicationController();
//                    //$view_data['rajorpay_link'] = $consumerapplication->getrazorpaylink($razorpaydata);
//                }else{
//                    $view_data['rajorpay_link'] =  "";
//                }
//                //$view_data['subject'] = "Your EMI is " . $view_data['delay_days'] . " Days overdue. Please pay Rs " . \str_replace('.00', '', money_format('%!i', ($view_data['data']['amount_due']))) . " now";
//                $view_data['subject'] = "Your payment of Rs " . \str_replace('.00', '', money_format('%!i', ($view_data['data']['amount_due']))) . " is overdue";
//                if (isset($view_data['data']['coapplicant_name']) && !empty($view_data['data']['coapplicant_name'])) {
//                    $applicant = $view_data['data']['applicant_name'] . " / " . $view_data['data']['coapplicant_name'];
//                } else {
//                    $applicant = $view_data['data']['applicant_name'];
//                }
//                $view_data['sms'] = "Dear " . $applicant . ",<br><br>
//You are " . $view_data['delay_days'] . " days late on your payment of Rs. " . \str_replace('.00', '', money_format('%!i', ($view_data['data']['amount_due']))) . " due towards.";
//                if($application['balance_emi'] > 0){
//                    $view_data['sms'].= " EMI of Rs " . \str_replace('.00', '', money_format('%!i', ($application['balance_emi']))) . "";
//                }
//                if($application['balance_emi'] > 0 && $application['charges'] > 0){
//                    $view_data['sms'].= " and";
//                }
//                if($application['charges'] > 0){
//                    $view_data['sms'].= " fees of Rs " . \str_replace('.00', '', money_format('%!i', ($application['charges']))) . "";
//                }
//                if($view_data['data']['amount_due'] > 999  || $send_anyways == 1){
//                    $view_data['sms'].= " Pay now on " . $view_data['rajorpay_link'] . "";
//                }
//
//                if (count($application['payment']) > 1) {
//                    $view_data['body'] = view('emails.reminders.emi_due_reminder_with_payment_link_with_penalty_multiple', $view_data)->render();
//                    //$view_data['sms'] = "Dear " . $applicant . ",<br><br>You are " . $view_data['delay_days'] . " days late on your EMI " . $view_data['reason'] . ". Please send a total of Rs " . \str_replace('.00', '', money_format('%!i', ($view_data['data']['amount_due']))) . "/- immediately using " . $view_data['rajorpay_link'] . ". <br>We might have to pursue legal action if we don’t hear from you. Call us on +91-9967235047 if you are facing any issues while making the payment.<br><br>Regards,<br>Team Credit Fair";
//                    $view_data['sms'].= "<br>We might have to pursue legal action if we don’t hear from you. Call us on +91-8928769161 if you need any help or have already paid.<br><br>Regards,<br>Team Credit Fair";
//
//                } else {
//                    $view_data['body'] = view('emails.reminders.emi_due_reminder_with_payment_link_with_penalty', $view_data)->render();
//
//                    //$view_data['sms'] = "Dear " . $applicant . ",<br><br>You are " . $view_data['delay_days'] . " days late on your EMI " . $view_data['reason'] . ". Please send a total of Rs. " . \str_replace('.00', '', money_format('%!i', ($view_data['data']['amount_due']))) . "/- immediately using " . $view_data['rajorpay_link'] . ". <br>Late payments can spoil your credit history and you might not be able to get loans in the future from any bank or finance company. Call us on +91-9967235047 if you face any issues while making the payment.<br><br>Regards,<br>Team Credit Fair";
//                    $view_data['sms'].= "<br>Late payments can spoil your credit history and you might not be able to get loans in the future from any bank or finance company. Call us on +91-8928769161 if you need any help or have already paid.<br><br>Regards,<br>Team Credit Fair";
//
//
//                }
//                $view_data['sms'] = str_replace('<br/>', "\n", $view_data['sms']);
//                $view_data['sms'] = str_replace('<br>', "\n", $view_data['sms']);
//                // testing email start
////                $view_data['email_id'] = ['aditya@creditfair.in', 'shraddha@creditfair.in', 'imran@creditfair.in', 'ashish@creditfair.in'];
////                $view_data['email_id'] = ['ashish@creditfair.in'];
////
////                \Mail::send('emails.blank',
////                    ['body' => $view_data['body']]
////                    , function ($message) use ($view_data) {
////                        $message->to($view_data['email_id'])->subject($view_data['subject']);
////                    });
////                $mobile = '918291919036';
////                send_sms($mobile, ['message'=>$view_data['sms'],'id'=>$application_id,'id_type'=>'application_id']);
//                // testing email end
//
//                if (isset($view_data['data']['applicant_email']) && !empty($view_data['data']['applicant_email']) && $send_email == 1 && UserEmails::isValid($view_data['data']['applicant_email'])) {
//                    \Mail::send('emails.blank',
//                        ['body' => $view_data['body']]
//                        , function ($message) use ($view_data) {
//                            $message->to($view_data['data']['applicant_email'])->subject($view_data['subject']);
//
//                            if (isset($view_data['data']['coapplicant_email']) && !empty($view_data['data']['coapplicant_email'])) {
//                                $message->cc([$view_data['data']['coapplicant_email'],'payments@creditfair.in']);
//                            }else{
//                                $message->cc('payments@creditfair.in');
//                            }
//                        });
//
//                    $this->emailCount++;
//                }
//                if (isset($view_data['data']['applicant_number']) && !empty($view_data['data']['applicant_number']) && isset($view_data['sms']) && $send_message == 1) {
//                    $mobile = '91' . $view_data['data']['applicant_number'];
//                    if(isset($view_data['data']['coapplicant_number']) && !empty($view_data['data']['coapplicant_number'])){
//                        $mobile.= $mobile.",91".$view_data['data']['coapplicant_number'];
//                    }
//                    send_sms($mobile, ['message'=>$view_data['sms'],'id'=>$application_id,'id_type'=>'application_id','message_type'=>"payment"]);
//                    $this->smsCount++;
//                }
//
//                $serviceCount++;
//            }
//            $view_data['delay_days'] = 0;
//        }
//        return $application_id ? $view_data : $serviceCount;
//    }

    public function updateAdvanceAmount($data,$payment_for = "Advance Payment",$application_id){
        $payment_transaction = new PaymentTransaction();
        $payment_transaction->emi_payment_id = 0;
        $payment_transaction->amount = $data['advance_amount'];
        $payment_transaction->mode = $data['mode'];
        $payment_transaction->paid_by = $data['paid_by'];
        $payment_transaction->collected_by = $data['collected_by'];
        $payment_transaction->wallet_name = $data['wallet_name'];
        $payment_transaction->trasanction_id = $data['trasanction_id'];
        $payment_transaction->reason = isset($data['reason']) ? $data['reason'] : '';
        $payment_transaction->trasanction_acknowledgement = $data['trasanction_acknowledgement'];
        $payment_transaction->payment_date = $data['payment_date'];
        $payment_transaction->cf_transaction_id = $data['cf_transaction_id'];
        $payment_transaction->bank_id = isset($data['bank_id']) ? $data['bank_id'] : '';
        $payment_transaction->payment_reconciliation_date = isset($data['payment_reconciliation_date']) ? $data['payment_reconciliation_date'] : $data['payment_date'];;
        $payment_transaction->payment_for = $payment_for;
        $payment_transaction->application_id = $application_id;
        $payment_transaction->status = isset($data['status']) ? $data['status'] : 'success';
        $payment_transaction->save();
    }

    public function getEMiPaidDetails($application_id){
        $payment_details = $this->getPaymentHistory($application_id);
        $response = array();
        $emi_id = array();
        foreach ($payment_details as $payments){
            $response[$payments->emi_date]['id'] = $payments->id;
            $response[$payments->emi_date]['emi_amount'] = $payments->emi_amount;
            $response[$payments->emi_date]['after_due'] = 0;
            $response[$payments->emi_date]['before_due'] = 0;
            $response[$payments->emi_date]['bounce_charge'] = 0;
            $response[$payments->emi_date]['generate_interest_invoice'] = 0;
            $response[$payments->emi_date]['emi_amount_pending'] = 0;
            array_push($emi_id,$payments->emi_date);
            $is_rejected_payment = EmiPayment::where('application_id',$application_id)->where('emi_date',$payments->emi_date)->where('payment_status','rejected')->first();
            foreach ($payments->transaction as $payment_transaction){
                if($this->calculateDelayDays($payments->emi_date,$payment_transaction->payment_date) > 0){
                    $response[$payments->emi_date]['after_due'] =  $response[$payments->emi_date]['after_due'] + $payment_transaction->amount;
                }else{
                    $response[$payments->emi_date]['before_due'] = $response[$payments->emi_date]['before_due'] + $payment_transaction->amount;
                }
            }
            if($response[$payments->emi_date]['emi_amount'] > ($response[$payments->emi_date]['after_due'] + $response[$payments->emi_date]['before_due'])){
                $response[$payments->emi_date]['emi_amount_pending'] = $response[$payments->emi_date]['emi_amount'] - ($response[$payments->emi_date]['after_due'] + $response[$payments->emi_date]['before_due']);
            }

            if($response[$payments->emi_date]['before_due'] < ($response[$payments->emi_date]['emi_amount'] *.9) || $is_rejected_payment){
                $response[$payments->emi_date]['bounce_charge'] = 1 ;
            }
            if($response[$payments->emi_date]['emi_amount'] <= ($response[$payments->emi_date]['after_due'] + $response[$payments->emi_date]['before_due'])){
                $response[$payments->emi_date]['generate_interest_invoice'] = 1;
            }
        }

        $rejected_payments = EmiPayment::where('application_id',$application_id)->whereNotIn('emi_date',$emi_id)->where('payment_status','rejected')->get();
        foreach ($rejected_payments as $rejected_payment){
            $response[$rejected_payment->emi_date]['id'] =0;
            $response[$rejected_payment->emi_date]['emi_amount'] = $rejected_payment->emi_amount;
            $response[$rejected_payment->emi_date]['after_due'] = 0;
            $response[$rejected_payment->emi_date]['before_due'] = 0;
            $response[$rejected_payment->emi_date]['emi_amount_pending'] = $rejected_payment->emi_amount;
            $response[$rejected_payment->emi_date]['bounce_charge'] = 1;
            $response[$rejected_payment->emi_date]['generate_interest_invoice'] = 0;
        }
        return $response;
    }

    public function getGSTAmount($application_id,$amount){

        $consumer_details = ConsumerApplication::where('id',$application_id)->first(['permanent_address_state','current_address_state']);
        if(isset($consumer_details->permanent_address_state) && !empty($consumer_details->permanent_address_state)){
            $details['state'] = $consumer_details->permanent_address_state;
        }else{
            $details['state'] = $consumer_details->current_address_state;
        }
        //$details['state'] = "Maharashtra";
        $details['amount'] = $amount;
        $consumer_document = new ConsumerDocument(new Request());
        $gst_details_array = $consumer_document->getGSTDetails($details);
        if(count($gst_details_array) > 1){
            $gst_details['net_amount'] = $gst_details_array[0]['net_amount'];
            $gst_details['CGST'] = $gst_details_array[0]['gst_amount'];
            $gst_details['SGST'] = $gst_details_array[1]['gst_amount'];
            $gst_details['IGST'] = 0;
            $gst_details['amount'] = $gst_details_array[0]['amount'];
        }else{
            $gst_details['net_amount'] = $gst_details_array[0]['net_amount'];
            $gst_details['CGST'] = 0;
            $gst_details['SGST'] = 0;
            $gst_details['IGST'] = $gst_details_array[0]['gst_amount'];
            $gst_details['amount'] = $gst_details_array[0]['amount'];
        }
        return $gst_details;
    }

    public function getForeclosureAmount($application_id ,$foreclosure_date, $payload_data = []){
        //$loanmanagement = new LoanManagement();
        $payment_data = $this->getPaymentDueHistory($application_id, "", 1);

        $response['previous_pending'] = 0;
        $response['future_emi'] = 0;
        $response['due_emi'] = 0;
        $response['bounce_charges'] = 0;
        $response['penal_interest'] = 0;
        $response['gst'] = 0;
        if($payment_data && $payment_data[$application_id] && $payment_data[$application_id]['payment']) {
            foreach ($payment_data[$application_id]['payment'] as $emi_date => $payments) {
                if ($emi_date <= $foreclosure_date) {
                    $response['previous_pending'] = $response['previous_pending'] + $payments['pending_amount'];
                    $response['bounce_charges'] = $response['bounce_charges'] + (isset($payments['bounce_charges']) ? $payments['bounce_charges'] : 0);
                    $response['penal_interest'] = $response['penal_interest'] + (isset($payments['delay_penalty']) ? $payments['delay_penalty'] : 0);
                }
            }
        }
        if($payload_data){
            $schedule['schedule'] = $payload_data;
        }else{
            $amort = new AccountingController();
            $schedule = $amort->viewloanschedule($application_id,1,1);
        }
        foreach ($schedule['schedule'] as $loan_schedule){
            if($loan_schedule['emi_date'] > $foreclosure_date){
                $response['future_emi'] = $response['future_emi'] + $loan_schedule['principal'];
            }
        }
        $response['future_emi'] = round($response['future_emi'],0);
        $response['total_outstanding'] = $response['previous_pending'] + $response['future_emi'];
        return $response;
    }

    public function getBounceCharges($application_id,$emi_amount,$emi_date,$transactions = array(),$payment_date = "",$payment_amount = 0){
        if($payment_date == ""){
            $payment_date = date('Y-m-d');
        }

        $paymentConfig = (new LoanManagement())->getPaymentConfig($application_id);

        $holidays = [];//$this->getHolidayList();
        $due_date = Carbon::createFromFormat('Y-m-d', $emi_date)->subDay(0);
        $response['bounce_charges'] = 0;
        $response['penal_interest'] = 0;
        $response['delay_days'] = 0;
        $response['generate_interest_invoice'] = 0;
        $after_due = 0;
        $before_due = 0;

        $paymentConfig = (new LoanManagement())->getPaymentConfig($application_id);

        while(in_array($due_date->toDateString(),$holidays) || $due_date->isSunday()){
            $due_date = Carbon::createFromFormat('Y-m-d', $due_date->toDateString())->addDay(1);
        }
        $due_date_innitial = $due_date->toDateString();
        $delay_days = $this->calculateDelayDays($due_date->toDateString(),$payment_date);
        $due_date_string = $due_date->toDateString();
        $delay_days_penalty = Carbon::createFromFormat('Y-m-d', $due_date_string)->addDay(1);
        $amount_paid = 0;
        if($transactions){
            foreach ($transactions as $transaction){
                if($transaction->status != "rejected")
                    if(($amount_paid + $transaction->amount) <= $emi_amount) {
                        if (strtotime($transaction->payment_date) > $due_date->timestamp) {
                            $after_due = $after_due + $transaction->amount;
                        }else {
                            $before_due = $before_due + $transaction->amount;
                        }

                        if(strtotime($transaction->payment_date) > ($delay_days_penalty->timestamp)){
                            $delay_days = ($this->calculateDelayDays($delay_days_penalty->toDateString(),$transaction->payment_date));
                            $response['penal_interest'] = $response['penal_interest'] + (($transaction->amount * (($paymentConfig['penal']))/100) * ($delay_days));
                            if($response['delay_days'] < $delay_days)
                            {
                                $response['delay_days'] = $delay_days;
                            }
                        }
                        $amount_paid = $amount_paid + $transaction->amount;
                    }else{
                        $transactionamount = $emi_amount - $amount_paid;
                        $amount_paid = $amount_paid + $transactionamount;
                        if (strtotime($transaction->payment_date) > $due_date->timestamp) {
                            $after_due = $after_due + $transactionamount;
                        }else {
                            $before_due = $before_due + $transactionamount;
                        }
                        if($transactionamount > 0 && (strtotime($transaction->payment_date) > ($due_date->addDay(1)->timestamp))) {
                            $delay_days = (($this->calculateDelayDays($due_date->toDateString(), $transaction->payment_date)) - 1);

                            $response['penal_interest'] = $response['penal_interest'] + (($transactionamount * (($paymentConfig['penal']))/100) * ($delay_days));
                            if($response['delay_days'] < $delay_days)
                            {
                                $response['delay_days'] = $delay_days;
                            }
                        }
                    }
            }

            if($amount_paid < $emi_amount){
                if(($amount_paid + $payment_amount) <= $emi_amount){
                    $delay_days = (($this->calculateDelayDays($due_date->toDateString(),$payment_date)) - 1);
                    $response['penal_interest'] = $response['penal_interest'] + (($payment_amount * (($paymentConfig['penal']))/100) * ($delay_days));
                    if($response['delay_days'] < $delay_days)
                    {
                        $response['delay_days'] = $delay_days;
                    }
                    $amount_paid = $payment_amount + $amount_paid;
                    if($amount_paid < $emi_amount) {
                        $delay_days = (($this->calculateDelayDays($due_date->toDateString(), (date('Y-m-d')))) - 1);

                        $pending_amount = $emi_amount - $amount_paid;
                        $response['penal_interest'] = $response['penal_interest'] + ((($pending_amount) * ((($paymentConfig['penal']))/100)) * ($delay_days));
                        if($response['delay_days'] < $delay_days)
                        {
                            $response['delay_days'] = $delay_days;
                        }
                    }
                }else{
                    $delay_days = (($this->calculateDelayDays($due_date->toDateString(), (date('Y-m-d')))) - 1);

                    $response['penal_interest'] = $response['penal_interest'] + ((($emi_amount - $amount_paid) * (($paymentConfig['penal']))/100) * ($delay_days));
                    if($response['delay_days'] < $delay_days)
                    {
                        $response['delay_days'] = $delay_days;
                    }

                }
            }

            if($payment_date != "" && $payment_date < $due_date_innitial && $payment_amount > 0){
                $before_due = $before_due + $payment_amount ;
            }

            if($emi_amount <= ($before_due + $after_due)){
                $response['generate_interest_invoice'] = 1;

            }
            if(($emi_amount > 0 && (($before_due/$emi_amount)*100) >= 90) || ($due_date_innitial >= date('Y-m-d'))){
                $response['bounce_charges'] = 0;
            }else{
                $response['bounce_charges'] = $paymentConfig['bounce'];
            }
        }else{
            if($delay_days > 0){
                if(($due_date->toDateString() < date('Y-m-d'))) {
                    $response['bounce_charges'] = $paymentConfig['bounce'];
                }
                if($response['delay_days'] < ($delay_days-1))
                {
                    $response['delay_days'] = ($delay_days-1);
                }
                if($delay_days > 1) {
                    $response['penal_interest'] = ($emi_amount * (($paymentConfig['penal']))/100) * ($delay_days - 1);
                }
            }
        }

        if($response['penal_interest'] < 0){
            $response['penal_interest'] = 0;
        }else{
            $response['penal_interest'] = round($response['penal_interest'],0);
        }
        if($response['delay_days'] < 0){
            $response['delay_days'] = 0;
        }
        if($response['bounce_charges'] < 0){
            $response['bounce_charges'] = 0;
        }
        return(array) $response;
    }

    public function getHolidayList()
    {
        $holidays = HolidayList::get();
        $holiday_list = array();
        foreach ($holidays as $holiday){
            array_push($holiday_list,$holiday->date);
        }
        return $holiday_list;
    }

    public function getPaymentDataTally($id){
        $payment_data = EmiPayment::with('transaction')->where('application_id',$id)->get();
        $response['emi_amount'] = 0;
        $response['bounce'] = 0;
        $response['penal_interest'] = 0;

        foreach ($payment_data as $emi_payment){
            $amount_received = 0;
            foreach ($emi_payment->transaction as $transaction){
                $amount_received = $amount_received + $transaction->amount;
            }

            if($amount_received > $emi_payment->emi_amount){
                $response['emi_amount'] = $response['emi_amount'] + $emi_payment->emi_amount;
                $amount_received = $amount_received - $emi_payment->emi_amount;

                if($amount_received > $emi_payment->bounce_charges){
                    $response['bounce'] = $response['bounce'] + $emi_payment->bounce_charges;
                    $amount_received = $amount_received - $emi_payment->bounce_charges;

                    if($amount_received > 0){
                        $response['penal_interest'] = $response['penal_interest'] + $emi_payment->delay_penalty;
                    }
                }else{
                    $response['bounce'] = $response['bounce'] + $amount_received;
                }
            }else{
                $response['emi_amount'] = $response['emi_amount'] + $amount_received;
            }
        }
        return $response;
    }
}

