<?php
/**
 * Created by PhpStorm.
 * User: sunil
 * Date: 9/29/18
 * Time: 4:30 PM
 */

namespace App\Console\Commands;


use App\ConsumerApplication;
use App\Devices;
use App\EmiPayment;
use App\FCMNotification;
use App\Http\Controllers\Admin\ConsumerApplicationController;
use App\Http\Controllers\Admin\EMICalculation;
use App\Http\Controllers\MerchantApiController;
use App\Http\Controllers\NachController;
use App\Jobs;
use App\Mandate;
use App\OnlinePayment;
use App\PaymentEmi;
use App\PaymentTransaction;
use App\Reminders;
use App\Services;
use App\Settlement;
use App\SettlementJobs;
use App\Slack;
use App\Tally\Tally;
use App\Tally\TallyConnector;
use App\Tally\TallyJobs;
use App\TallyJobsListener;
use App\User;
use Carbon\Carbon;
use Illuminate\Console\Command;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class TallyBridge extends Command
{

    protected $signature = 'tally:connect';
    private $bankSundry = null;
    private $bankObject = null;
    private $bankObjectTransfer = null;
    private $bankSundryID = -1;
    private $paymentSundry = null;
    private $subventionSundry = null;

    public function __construct(){
        parent::__construct();
    }

    public function handle(){
        $start_time = time();
        $serviceCount = (new TallyJobsListener())->start();
        if(!$serviceCount){
            $this->comment('No Pending Jobs');
        }else{
            $this->comment('Jobs successfully executed');
        }

        (new Services())->log($this->signature, ['status' => true, 'service_count' => $serviceCount ? $serviceCount : 0, 'start_time' => $start_time]);
    }

    public function process($response, $settlement){
        $payment_date = $settlement->payment_date;
        $tallyProcessedData = [];
        foreach ($response['data'] as $item){
            $jobID = $this->TallyEMIEntryOLDApplication($item['application_id'], $payment_date);
            $tallyListener = new TallyJobsListener();
            $tallyListener->job_id = $jobID;
            $tallyListener->isAuto = true;
            $tallyListener->start();
            $tallyProcessedData[] = $tallyListener->autoTally;
        }

        if($tallyProcessedData){
            $this->createEMIEntryV2Next($tallyProcessedData, $response, $settlement);
        }
    }

    public function createEMIEntryV2Next($tallyProcessedData, $response, $settlement){
        $settlement_id = $settlement->id;
        $subvention_only = isset($response['subvention_only']) ? $response['subvention_only'] : 0;
        foreach ($tallyProcessedData as $tally){
            try {
                if ($tally->request->get('bank')) {
                    $this->setBankSundry($tally, $response);
                }

                $voucher = $tally->request->get('voucher');

                if($tally->request->get('payments')) {
                    foreach ($tally->request->get('payments') as $payments) {
                        $this->paymentSundry[] = ['payment' => $payments, 'voucher' => $voucher];
                    }
                }
                if($tally->request->get('subvention')) {
                    foreach ($tally->request->get('subvention') as $subvention) {
                        $this->subventionSundry[] = ['subvention' => $subvention, 'voucher' => $voucher];
                    }
                }

            }catch (\Exception $e){

            }
        }

        $paymentSundry = [];
        $paymentAmount = 0;
        $paymentDRIndex = -1;
        $outerIndex = 0;
        if($this->paymentSundry) {
            foreach ($this->paymentSundry as $paymentIndex => $payment) {
                if ($payment['payment']->sundry == 'CR') {
                    $outerIndex++;
                    $paymentAmount += $payment['payment']->amount;
                    if ($paymentDRIndex == -1)
                        $paymentDRIndex = $paymentIndex;
                }
                $paymentSegment = $payment['payment'];
                $paymentSegment->voucher = $payment['voucher'];
                if ($payment['payment']->sundry == 'DR' || $outerIndex == 1) {
                    $paymentSundry[] = $paymentSegment;
                }
            }

            $paymentSundry[$paymentDRIndex]->amount = $paymentAmount;
        }

        $subventionSundry = [];
        $subventionAmount = 0;
        $subventionDRIndex = -1;
        $outerIndex = 0;
        if($this->subventionSundry) {
            foreach ($this->subventionSundry as $subventionIndex => $subvention) {
                if ($subvention['subvention']->sundry == 'CR') {
                    $outerIndex++;
                    $subventionAmount += $subvention['subvention']->amount;
                    if ($subventionDRIndex == -1)
                        $subventionDRIndex = $subventionIndex;
                }
                $subventionSegment = $subvention['subvention'];
                $subventionSegment->voucher = $subvention['voucher'];
                if ($subvention['subvention']->sundry == 'DR' || $outerIndex == 1) {
                    $subventionSundry[] = $subventionSegment;
                }
            }

            $subventionSundry[$subventionDRIndex]->amount = $subventionAmount;
        }

        $bankObject = [];
        $_bankSingleMain = [];
        $sundryEntry = new \stdClass();
        $sundryEntry->voucher = $voucher;

        /*$bankSingle = [];
        $bankSingleAmount = 0;
        $sundryEntry = null;
        $bankSundry = clone $this->bankSundry[$this->bankSundryID];
        unset($this->bankSundry);
        if ($this->bankObject && $this->bankSundryID >= 0) {
            $sundryEntry = $bankSingle = $bankSundry;
            $bankSingle = clone $bankSundry;
            $bankSingle->ledgerName = 'EMI CREDIT THROUGH ' . ucwords($settlement->type);
            $this->bankObject[] = $bankSingle;
        }

        $bankSingleDRID = -1;
        foreach ($this->bankObject as $itemIndex => $item) {
            if ($item->sundry == 'CR') {
                $bankSingleAmount += $item->amount;
                $bankSingleDRID = $itemIndex;
            }
        }

        $bankObject = $this->bankObject;
        unset($this->bankObject);

        $bankSingleItem = clone $bankObject[$bankSingleDRID];
        $bankSingleItem->amount = $bankSingleAmount;
        $bankSingleItem->ledgerName = $bankSundry->ledgerName;
        $bankSingleMain[] = $bankSingleItem;
        $bankSingleMain[] = $bankSingle;

        $_bankSingleMain_1 = clone $bankSingleMain[1];
        $_bankSingleMain_0 = clone $bankSingleMain[0];
        $bankSingleMainLedgerName = $_bankSingleMain_1->ledgerName;
        $_bankSingleMain_1->ledgerName = $_bankSingleMain_0->ledgerName;
        $_bankSingleMain_0->ledgerName = $bankSingleMainLedgerName;
        $_bankSingleMain[] = $_bankSingleMain_0;
        $_bankSingleMain[] = $_bankSingleMain_1;

        $data = ['data' => ['voucher' => $sundryEntry->voucher, 'payments' => $bankObject, 'bank' => $_bankSingleMain, 'credit_debtor' => $subventionSundry], 'settlement_id' => $settlement_id, 'subvention_only' => $subvention_only];*/
        $data = ['data' => ['voucher' => $sundryEntry->voucher, 'payments' => $paymentSundry, 'bank' => $_bankSingleMain, 'credit_debtor' => $subventionSundry], 'settlement_id' => $settlement_id, 'subvention_only' => $subvention_only];

        SettlementJobs::import($data);
    }

    public function setBankSundry($tally, $response){
        $this->bankSundry = $tally->request->get('bank');
        $voucher = $tally->request->get('voucher');
        foreach ($this->bankSundry as $bankIndex => $bank) {
            if ($bank->sundry == 'CR') {
                $bank->voucher = $voucher;
                $this->bankObject[] = $bank;
            } else {
                $this->bankSundry[$bankIndex]->amount = $response['settled_amount'];
                $this->bankSundry[$bankIndex]->summary[0]->amount = $response['settled_amount'];
                $this->bankSundry[$bankIndex]->voucher = $voucher;
                $this->bankSundryID = $bankIndex;
            }
        }
    }

    public function TallyEMIEntryOLDApplication($id, $payment_date){

        $applications = ConsumerApplication::whereNull('is_deleted')->whereIn('state',['disbursed','closed','nach registered'])->where('id',$id)->orderBy('created_at','desc')->get();

        $idsData = [];
        foreach ($applications as $application_key){
            $idsData[] = $application_key->id;
        }

        $applications = PaymentTransaction::whereIn('application_id', $idsData)->get(['application_id as id','emi_payment_id']);

        $arrIds = [];
        $emiIds = [];
        foreach ($applications as $applicationItem){
            if (!in_array($applicationItem->id, $arrIds)) {
                $arrIds[] = $applicationItem->id;
            }
            if (!in_array($applicationItem->emi_payment_id, $emiIds)) {
                $emiIds[] = $applicationItem->emi_payment_id;
            }
        }
        $consumerApplication = ConsumerApplication::whereIn('id',$arrIds)->whereIn('state',['disbursed','nach registered','closed'])->get(['id']);

        foreach ($consumerApplication as $application){
            $tally = $this->getPaymentDataTally($application->id, $payment_date, $emiIds);
            if ($tally['response']) {
                foreach ($tally['response'] as $key=>$value) {
                    return TallyJobs::saveTally(['tally' => [$key=>$value], 'id' => $application->id, 'emiPaymentID' => $tally['emiPaymentIds'][$key], 'emi_date' => $key, 'type' => 'EMI']);
                }
            }
        }
        return false;
    }

    public function getPaymentDataTally($id, $payment_date, $emiIds = []){
        $transactions = PaymentTransaction::where('payment_date', '>=', date('Y-m-d',strtotime($payment_date)))->where('payment_date', '<=', date('Y-m-d',strtotime($payment_date)))->whereIn('emi_payment_id',$emiIds)->where('application_id',$id)->get();
        //$transactions = PaymentTransaction::where('payment_date', '>=', '2019-04-01 00:00:00')->where('payment_date', '<=', '2019-04-31 23:59:59')->whereIn('emi_payment_id',$emiIds)->where('application_id',$id)->get();
        $emiIds = [];
        foreach ($transactions as $transaction){
            $emiIds[] = $transaction->emi_payment_id;
        }
        $payment_data = EmiPayment::with('transaction')->whereIn('id',$emiIds)->where('application_id',$id)->get();
        $emiPaymentIds = [];
        $response = [];

        foreach ($payment_data as $emi_payment){
            if ($emi_payment->transaction) {
                $amount_received = 0;
                $emiPaymentIds[$emi_payment->emi_date] = $emi_payment->id;

                //Original Code
                /*foreach ($emi_payment->transaction as $transaction) {
                    $amount_received = $amount_received + $transaction->amount;
                }*/

                //Testing Code
                //$transactions = PaymentTransaction::where('payment_date', '>=', date('Y-m-d',strtotime($payment_date)))->where('payment_date', '<=', date('Y-m-d',strtotime($payment_date)))->whereIn('emi_payment_id',$emiIds)->where('application_id',$id)->get();
                foreach ($transactions as $transaction) {
                    $amount_received = $amount_received + $transaction->amount;
                }



                if (!isset($response[$emi_payment->emi_date]['emi_amount'])) {
                    $response[$emi_payment->emi_date]['emi_amount'] = 0;
                    $response[$emi_payment->emi_date]['bounce_charges'] = 0;
                    $response[$emi_payment->emi_date]['penal_interest'] = 0;
                }


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

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

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

        $response = array_reverse($response);

        return ['response' => $response, 'emiPaymentIds' => $emiPaymentIds];
    }

    public function importRazorPaySettlement($data = array()){
        $lender = isset($data['lender_id']) ? $data['lender_id'] : 1;
        $settlement_date = isset($data['settlement_date']) ? $data['settlement_date'] : '2020-02-18';
        $consumerController = new ConsumerApplicationController();
        $nachController = new NachController();
        $payload = ['lender_id' => $lender, 'settlement_date' => $settlement_date];
        $settlementData = $consumerController->callRazorPaySettlementAPI($payload);

        foreach ($settlementData as $settlement_id => $settlements) {

            $settlementFilePath = $this->savePaymentInfoFile($settlement_id, $settlementData, $settlement_date, $lender);

            $tallyData = [];
            $totalAmountReceived = $settlements['data']->amount / 100;
            $totalAmountCalculated = 0;
            foreach ($settlements['settlement'] as $settlement) {
                if($paymentData = $this->getPaymentDataRazorPay($settlement, $settlements['date'], $settlementFilePath, $nachController, $payload)){
                    $tallyData[] = $paymentData;
                    $totalAmountCalculated += ($settlement['settlement']->amount / 100);
                }
            }

            if($totalAmountReceived > 0 && $totalAmountCalculated > 0) { //$totalAmountReceived == $totalAmountCalculated
                Settlement::import(['data' => $tallyData, 'settled_amount' => $totalAmountReceived, 'type' => 'razorpay']);
                $isProcessManually = $totalAmountReceived == $totalAmountCalculated ? ' - Process Manually Through Excel' : '';
                (new Slack(new Request(['title' => 'Tally Settlement (Data Available For Settlement)'.$isProcessManually, 'fields' => ['Settlement Date' => $settlement_date, 'Lender Id' => $lender, 'Settlement ID' => $settlement_id, 'Settled Amount' => $totalAmountReceived, 'Calculated Amount' => $totalAmountCalculated, 'Payment Fetched' => count($tallyData)], 'group' => Slack::$TALLY_INTEGRATION])))->send();
            }else{
                (new Slack(new Request(['title' => 'Tally Settlement Error (Amount Mismatch)', 'fields' => ['Settlement Date' => $settlement_date, 'Lender Id' => $lender, 'Settlement ID' => $settlement_id, 'Settled Amount' => $totalAmountReceived, 'Calculated Amount' => $totalAmountCalculated, 'Payment Fetched' => count($tallyData)], 'group' => Slack::$TALLY_INTEGRATION])))->send();
            }
        }
    }

    public function importPayTMSettlement($data = array()){
        $lender = $data['lender_id'] ?? 1;
        $settlement_date = $data['settlement_date'] ?? '2020-02-18';
        $consumerController = new ConsumerApplicationController();
        $payload = ['lender_id' => $lender, 'settlement_date' => $settlement_date];
        (new Slack(new Request(['title' => 'Tally Settlement (Before calling API)', 'fields' => ['Settlement Date' => $settlement_date, 'Lender Id' => $lender], 'group' => Slack::$TALLY_INTEGRATION])))->send();
        $settlementData = $consumerController->callPayTMSettlementAPI($payload);
        (new Slack(new Request(['title' => 'Tally Settlement (After calling API)', 'fields' => ['Settlement Date' => $settlement_date, 'Lender Id' => $lender], 'group' => Slack::$TALLY_INTEGRATION])))->send();
        $totalAmountReceived = 0;
        $totalAmountCalculated = 0;
        $tallyData = [];
        (new Slack(new Request(['title' => 'Tally Settlement (Before saving file)', 'fields' => ['Settlement Data' => json_encode($settlementData), 'Settlement Date' => $settlement_date, 'Lender Id' => $lender], 'group' => Slack::$TALLY_INTEGRATION])))->send();
        try {
            if($settlementData != 'error') {
                foreach ($settlementData as $settlement_id => $settlements) {

                    $settlementFilePath = $this->savePaymentInfoFile($settlement_id, $settlementData, $settlement_date, $lender);

                    $totalAmountReceived += $settlements['data']['TXNAMOUNT'];

                    if ($paymentData = $this->getPaymentDataPayTM($settlements['data'], $settlements['date'], $settlementFilePath, $lender)) {
                        $tallyData[] = $paymentData;
                        $totalAmountCalculated += ($settlements['data']['TXNAMOUNT']);
                    }
                }
            }
        }catch (\Exception $e){
            (new Slack(new Request(['title' => 'Tally Settlement Loop Error', 'fields' => ['settlementData' => json_encode($settlementData), 'Message' => $e->getMessage(), 'File' => $e->getFile(), 'Line' => $e->getLine()]])))->send();
        }

        if($totalAmountReceived > 0 && $totalAmountCalculated > 0 && $tallyData) {
            Settlement::import(['data' => $tallyData, 'settled_amount' => $totalAmountReceived, 'payment_date' => $settlement_date, 'reconciliation_date' => $settlement_date, 'type' => 'paytm']);
            $isProcessManually = $totalAmountReceived == $totalAmountCalculated ? ' - Process Manually Through Excel' : '';
            (new Slack(new Request(['title' => 'Tally Settlement (Data Available For Settlement)'.$isProcessManually, 'fields' => ['Settlement Date' => $settlement_date, 'Lender Id' => $lender, 'Settled Amount' => $totalAmountReceived, 'Calculated Amount' => $totalAmountCalculated, 'Payment Fetched' => count($settlementData)], 'group' => Slack::$TALLY_INTEGRATION])))->send();
        }else{
            (new Slack(new Request(['title' => 'Tally Settlement Error (Amount Mismatch)', 'fields' => ['Settlement Date' => $settlement_date, 'Lender Id' => $lender, 'Settled Amount' => $totalAmountReceived, 'Calculated Amount' => $totalAmountCalculated, 'Payment Fetched' => count($settlementData) ?? 0], 'group' => Slack::$TALLY_INTEGRATION])))->send();
        }
    }

    public function importLotusPaySettlement($data = array()){
        $lender = 2;
        $settlement_date = isset($data['settlement_date']) ? $data['settlement_date'] : '2020-02-18';
        $nachController = new NachController();
        $payload = ['lender_id' => $lender, 'settlement_date' => $settlement_date];
        $settlementData = $nachController->callLotusPaySettlementAPI($payload);

        foreach ($settlementData as $settlement_id => $settlements) {

            $settlementFilePath = $this->savePaymentInfoFile($settlement_id, $settlementData, $settlement_date, $lender);

            $tallyData = [];
            $totalAmountReceived = $settlements['data']->amount / 100;
            $totalAmountCalculated = 0;
            foreach ($settlements['settlement'] as $settlement) {
                if($paymentData = $this->getPaymentData($settlement, $settlements['date'], $settlementFilePath, $nachController, $payload)){
                    $tallyData[] = $paymentData;
                    $totalAmountCalculated += ($settlement->amount / 100);
                }
            }

            if($totalAmountReceived > 0 && $totalAmountCalculated > 0) { //$totalAmountReceived == $totalAmountCalculated
                Settlement::import(['data' => $tallyData, 'settled_amount' => $totalAmountReceived, 'payment_date' => $settlement_date, 'reconciliation_date' => $settlements['data']->arrival_date, 'type' => 'lotuspay']);
                $isProcessManually = $totalAmountReceived != $totalAmountCalculated ? ' - Process Manually Through Excel' : '';
                (new Slack(new Request(['title' => 'Tally Settlement (Data Available For Settlement)'.$isProcessManually, 'fields' => ['Settlement Date' => $settlement_date, 'Lender Id' => $lender, 'Settlement ID' => $settlement_id, 'Settled Amount' => $totalAmountReceived, 'Calculated Amount' => $totalAmountCalculated, 'Payment Fetched' => count($tallyData)], 'group' => Slack::$TALLY_INTEGRATION])))->send();
            }else{
                (new Slack(new Request(['title' => 'Tally Settlement Error (Amount Mismatch)', 'fields' => ['Settlement Date' => $settlement_date, 'Lender Id' => $lender, 'Settlement ID' => $settlement_id, 'Settled Amount' => $totalAmountReceived, 'Calculated Amount' => $totalAmountCalculated, 'Payment Fetched' => count($tallyData)], 'group' => Slack::$TALLY_INTEGRATION])))->send();
            }
        }
    }

    public function savePaymentInfoFile($settlement_id, $settlement, $settlement_date, $lender){
        $settlementFilePath = storage_path()."/payments/settlement/".$settlement_id."/".Carbon::now()->toDateString()."_".$settlement_date.'_'.$lender.".json";

        if (!file_exists(storage_path().'/payments')) {
            mkdir(storage_path().'/payments', 0777, true);
        }

        if (!file_exists(storage_path().'/payments/settlement')) {
            mkdir(storage_path().'/payments/settlement', 0777, true);
        }

        if (!file_exists(storage_path().'/payments/settlement/'.$settlement_id)) {
            mkdir(storage_path().'/payments/settlement/'.$settlement_id, 0777, true);
        }

        $settlementFile = fopen($settlementFilePath, "w") or die("Unable to open file!");
        $settlementString = json_encode($settlement);
        fwrite($settlementFile, $settlementString);
        fclose($settlementFile);
        return $settlementFilePath;
    }

    public function getPaymentDataPayTM($settlement, $payment_reconciliation_date, $settlementFilePath, $lender_id){

        $online = OnlinePayment::where(DB::raw('JSON_EXTRACT(`response`, "$.TXNID")'), $settlement['TXNID'])->first(['application_id']);

        $application_id = 0;
        if (!$online && isset($settlement['ORDERID'])){
                $Ids = explode('_', $settlement['ORDERID']);
                if(isset($Ids[1]) && $Ids[1]){
                    $application_id = $Ids[1];
                }
        }else{
            $application_id = $online->application_id ?? 0;
        }

        $date = date('Y-m-d', strtotime($settlement['TXNDATE']));

//        $paymentTransaction = PaymentTransaction::where('application_id', $application_id)->where('amount', str_replace('.00','',$settlement['TXNAMOUNT']))->where('payment_date', $date)->where('payment_for', 'EMI')->first(['id']);

        $paymentTransactions = PaymentTransaction::where('application_id', $application_id)
            ->where('amount', function($q) use ($settlement, $date){
                $q->whereIn('trasanction_id', [$settlement['TXNID'], $settlement['ORDERID']])
                    ->where('payment_date', $date)->select(DB::raw('sum(amount) as amount'));
            })->get(['id', 'payment_for']);

        $consumerApplication = ConsumerApplication::where('id', $application_id)->where('lender_id', $lender_id)->first(['id', 'lender_id']);


        if($settlement['TXNID'] && !empty($paymentTransactions) && $application_id && isset($consumerApplication->id)) {

            foreach($paymentTransactions as $paymentTransaction) {
                if($paymentTransaction->id && $paymentTransaction->payment_for == 'EMI') {

                    $status = isset($settlement['STATUS']) && $settlement['STATUS'] == 'TXN_SUCCESS' ? 'success' : 'rejected';
                    if ($status == 'rejected') {
                        if (isset($settlement['UTR']) && $settlement['UTR']) {
                            $status = 'success';
                        }
                    }

                    $bank_id = (new ConsumerApplicationController())->getTransactionBank($application_id);

                    return [
                        'mode' => 'Paytm',
                        'paid_by' => '',
                        'application_id' => $application_id,
                        'bank_id' => $bank_id,
                        'umrn' => '',
                        'collected_by' => 107,
                        'trasanction_id' => $settlement['TXNID'],
                        'wallet_name' => '',
                        'payment_date' => $date,
                        'payment_reconciliation_date' => $payment_reconciliation_date,
                        'amount' => $settlement['TXNAMOUNT'],
                        'status' => $status,
                        'reason' => $status == 'rejected' ? ($settlement['RESPMSG'] ?? '') : '',
                        'trasanction_acknowledgement' => $settlementFilePath,
                        'online_payment_id' => $settlement['UTR']
                    ];
                }else{
                    (new Slack(new Request(['title' => 'Tally Settlement Issue (App or transaction not found)',
                        'fields' => ['application_id' => $application_id, 'TXNID' => $settlement['TXNID'], 'ORDERID' => $settlement['ORDERID'], 'TXNAMOUNT' => $settlement['TXNAMOUNT'], 'TXNDATE' => $settlement['TXNDATE'], 'RESPMSG' => $settlement['RESPMSG'] ?? ''], 'group' => Slack::$TALLY_INTEGRATION])))->send();
                }
            }
        }else{

            if(isset($consumerApplication->lender_id) && in_array($consumerApplication->lender_id, [2,20])) {
                (new Slack(new Request(['title' => 'Tally Settlement Error (Payment Mismatch - TXNID)', 'fields' => ['TXNID' => $settlement['TXNID'], 'TXNAMOUNT' => $settlement['TXNAMOUNT'], 'TXNDATE' => $settlement['TXNDATE'], 'RESPMSG' => $settlement['RESPMSG'] ?? ''], 'group' => Slack::$TALLY_INTEGRATION])))->send();
                return false;
            }
        }
    }

    public function getPaymentDataRazorPay($settlement, $payment_reconciliation_date, $settlementFilePath, $nachController, $payload){

        if(isset($settlement['application']->id)) {

            $application = $settlement['application'];
            $settlement = $settlement['settlement'];

            $status = $settlement->status == 'captured' ? 'success' : 'rejected';

            $bank_id = (new ConsumerApplicationController())->getTransactionBank($application->id);

            return [
                'mode' => 'Razorpay',
                'paid_by' => '',
                'application_id' => $application->id,
                'bank_id' => $bank_id,
                'umrn' => '',
                'collected_by' => 107,
                'trasanction_id' => $settlement->order_id,
                'wallet_name' => '',
                'payment_date' => date('Y-m-d', $settlement->created_at),
                'payment_reconciliation_date' => $payment_reconciliation_date,
                'amount' => $settlement->amount / 100,
                'status' => $status,
                'reason' => $status == 'rejected' ? $status : '',
                'trasanction_acknowledgement' => $settlementFilePath,
                'online_payment_id' => ''
            ];
        }else{
            if($customer = $nachController->getCustomerByCustomerID($settlement, $payload)){
                (new Slack(new Request(['title' => 'Tally Settlement Error (Payment Mismatch - UMRN)', 'fields' => ['Name' => $customer->name, 'Mobile' => $customer->mobile, 'Phone' => $customer->phone, 'email' => $customer->email ,'UMRN' => $settlement->umrn, 'Payment Id' => $settlement->id, 'Payment Date' => $settlement->charge_date, 'Amount' => ($settlement->amount / 100), 'Status' => $settlement->failure_code, 'Description' => $settlement->failure_message], 'group' => Slack::$TALLY_INTEGRATION])))->send();
            }
            return false;
        }
    }

    public function getPaymentData($settlement, $payment_reconciliation_date, $settlementFilePath, $nachController, $payload){

        $mandate = Mandate::where('umrn',$settlement->umrn)->first();

        if(isset($mandate->consumer_application_id)) {

            $application = ConsumerApplication::where('id', $mandate->consumer_application_id)->first();

            $status = isset($settlement->failure_code) && $settlement->failure_code == '00' ? 'success' : ($settlement->status == 'confirmed' ? 'success' : 'rejected');

            $bank_id = (new ConsumerApplicationController())->getTransactionBank($application->id);

            return [
                'mode' => 'NACH-LOTUS',
                'paid_by' => '',
                'application_id' => $application->id,
                'bank_id' => $bank_id,
                'umrn' => $settlement->umrn,
                'collected_by' => 107,
                'trasanction_id' => $settlement->id,
                'wallet_name' => '',
                'payment_date' => isset($settlement->charge_date) ? $settlement->charge_date : (isset($settlement->date_charge) ? $settlement->date_charge : ''),
                'payment_reconciliation_date' => $payment_reconciliation_date,
                'amount' => $settlement->amount / 100,
                'status' => $status,
                'reason' => $status == 'rejected' ? (isset($settlement->failure_message) ? $settlement->failure_message : ($settlement->response_description ? $settlement->response_description : '')) : '',
                'trasanction_acknowledgement' => $settlementFilePath,
                'online_payment_id' => ''
            ];
        }else{
            if($customer = $nachController->getCustomerByCustomerID($settlement, $payload)){
                (new Slack(new Request(['title' => 'Tally Settlement Error (Payment Mismatch - UMRN)', 'fields' => ['Name' => $customer->name, 'Mobile' => $customer->mobile, 'Phone' => $customer->phone, 'email' => $customer->email ,'UMRN' => $settlement->umrn, 'Payment Id' => $settlement->id, 'Payment Date' => isset($settlement->charge_date) ? $settlement->charge_date : ($settlement->date_charge ? $settlement->date_charge : ''), 'Amount' => ($settlement->amount / 100), 'Status' => isset($settlement->failure_code) ? $settlement->failure_code : (isset($settlement->status) ? $settlement->status : ''), 'Description' => isset($settlement->failure_message) ? $settlement->failure_message : (isset($settlement->response_description) ? $settlement->response_description : '')], 'group' => Slack::$TALLY_INTEGRATION])))->send();
            }
            return false;
        }
    }
}
