KUJUNTI.ID MINISH3LL
Path : /var/www/html/usd_loan_system/app/Http/Controllers/
(S)h3ll Cr3at0r :
F!le Upl0ad :

B-Con CMD Config cPanel C-Rdp D-Log Info Jump Mass Ransom Symlink vHost Zone-H

Current File : /var/www/html/usd_loan_system/app/Http/Controllers/ReportController.php


<?php

namespace App\Http\Controllers;

use App\Exports\BorrowerNumberExport;
use App\Exports\IncomeStatementCSVExport;
use App\Exports\ReportTrailBalance;
use App\Exports\ReportBalanceSheet;
use App\Exports\ReportProductSummary;
use App\Exports\ReportRepaymentExport;
use App\Models\Loan;
use App\Models\User;
use App\Models\Borrower;
use Laracasts\Flash\Flash;
use App\Models\LoanProduct;
use App\Models\JournalEntry;
use App\Models\LoanSchedule;
use Illuminate\Http\Request;
use App\Models\LoanRepayment;
use App\Models\ProvisionRate;
use App\Helpers\GeneralHelper;
use App\Models\ChartOfAccount;
use App\Models\LoanTransaction;
use App\Models\SavingTransaction;
use Maatwebsite\Excel\Facades\Excel;
use Cartalyst\Sentinel\Laravel\Facades\Sentinel;
use Barryvdh\DomPDF\Facade\Pdf;
use PhpOffice\PhpSpreadsheet\Exception;
class ReportController extends Controller
{
    public function __construct()
    {
        $this->middleware(['sentinel', 'branch']);
    }


    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function cash_flow(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        return view('report.cash_flow', compact('start_date', 'end_date'));
    }


    public function loan_arrears(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        return view('report.balance_sheet');
    }

    public function loan_transaction(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        if ($request->isMethod('post')) {

            $data = LoanRepayment::where('branch_id', session('branch_id'))->whereBetween('collection_date',
                [$start_date, $end_date])->orderBy('id', 'desc')->get();

        } else {
            $data = LoanRepayment::orderBy('id', 'desc')->get();
        }
        return view('report.loan_transaction',compact('data', 'start_date',     'end_date'));
    }

    public function loan_classification(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;


        $data = Loan::whereIn('status', ['disbursed', 'closed', 'written_off'])->orderBy('id', 'desc')->get();

        return view('report.loan_classification',
            compact('data', 'start_date',
                'end_date'));
    }

    public function loan_product(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;


        $data = LoanProduct::orderBy('id', 'desc')->get();

        return view('report.loan_product',
            compact('data', 'start_date',
                'end_date'));
    }


    public function loan_projection(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;

        $monthly_collections = array();
        $start_date1 = date("Y-m-d");
        for ($i = 1; $i < 14; $i++) {
            $d = explode('-', $start_date1);
            //get loans in that period
            $payments = 0;
            $payments_due = 0;
            foreach (LoanSchedule::where('branch_id', session('branch_id'))->where('year', $d[0])->where('month',
                $d[1])->get() as $key) {
                if (!empty($key->loan)) {
                    if ($key->loan->status == 'disbursed' || $key->loan->status == 'written_off' || $key->loan->status == 'closed') {
                        $payments_due = $payments_due + $key->principal + $key->fees + $key->interest + $key->penalty;
                    }
                }
            }
            $payments_due = round($payments_due, 2);
            $ext = ' ' . $d[0];
            $monthly_collections[] = array(
                'month' => date_format(date_create($start_date1),
                    'M' . $ext),
                'due' => $payments_due

            );
            //add 1 month to start date
            $start_date1 = date_format(date_add(date_create($start_date1),
                date_interval_create_from_date_string('1 months')),
                'Y-m-d');
        }
        $monthly_collections = json_encode($monthly_collections);
        return view('report.loan_projection',
            compact('monthly_collections', 'start_date',
                'end_date'));
    }


    public function financial_report(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;

        return view('financial_report.data',
            compact('start_date',
                'end_date'));
    }

    public function loan_report(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;

        return view('loan_report.data',
            compact('start_date',
                'end_date'));
    }

    public function borrower_report(Request $request)
    {

        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }

        $start_date = $request->start_date;
        $end_date = $request->end_date;

        return view('borrower_report.data', compact('start_date', 'end_date'));
    }

    public function company_report(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;

        return view('company_report.data',
            compact('start_date',
                'end_date'));
    }

    public function savings_report(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;

        return view('savings_report.data',
            compact('start_date',
                'end_date'));
    }

    public function trial_balance(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }

        $date_range = $this->getDateRange($request->date_range);
        $start_date = $date_range->start_date;
        $end_date = $date_range->end_date;

        $chart_of_accounts = [];
        if(!empty($start_date)){
            $chart_of_accounts = \App\Models\ChartOfAccount::query()
                ->withSum(['journal_entries' => function ($query) use ($start_date, $end_date) {
                    return $query->whereBetween('date', [$start_date, $end_date])->where('branch_id', session('branch_id'));
                }], 'credit')
                ->withSum(['journal_entries' => function ($query) use ($start_date, $end_date) {
                    return $query->whereBetween('date', [$start_date, $end_date])->where('branch_id', session('branch_id'));
                }], 'debit')
                ->orderBy('gl_code', 'asc')
                ->get();
        }

        return view('financial_report.trial_balance',compact('start_date', 'end_date', 'chart_of_accounts'));
    }

    public function trial_balance_pdf(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        $pdf = Pdf::loadView('financial_report.trial_balance_pdf', compact('start_date','end_date'));
        return $pdf->download(translate('trial_balance') . ' : ' . $request->end_date . ".pdf");

    }

    public function trial_balance_excel(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        if (!empty($start_date)) {
            $data = [];
            $data[] = [
                translate('trial_balance') . " " . translate('for period') . ":" . $start_date . " " . translate('to') . " " . $end_date
            ];
            $data[] = [
                translate('gl_code'),
                translate('account'),
                translate('debit'),
                translate('credit')
            ];
            $credit_total = 0;
            $debit_total = 0;
            foreach (ChartOfAccount::orderBy('gl_code', 'asc')->get() as $key) {
                $cr = 0;
                $dr = 0;
                $cr = \App\Models\JournalEntry::where('account_id', $key->id)->whereBetween('date',
                    [$start_date, $end_date])->where('branch_id',
                    session('branch_id'))->sum('credit');
                $dr = \App\Models\JournalEntry::where('account_id', $key->id)->whereBetween('date',
                    [$start_date, $end_date])->where('branch_id',
                    session('branch_id'))->sum('debit');
                $credit_total = $credit_total + $cr;
                $debit_total = $debit_total + $dr;
                array_push($data, [$key->gl_code, $key->name, number_format($dr, 2), number_format($cr, 2)]);
            }
            $data[] = [
                translate('total'),
                "",
                number_format($debit_total, 2),
                number_format($credit_total, 2)
            ];

            /*Excel::create(translate('trial_balance') . ' : ' . $request->end_date,
                function ($excel) use ($data) {
                    $excel->sheet('Sheet', function ($sheet) use ($data) {
                        $sheet->fromArray($data, null, 'A1', false, false);
                        $sheet->mergeCells('A1:D1');
                    });

                })->download('xls');*/
            return Excel::download(
                new ReportTrailBalance($data),
                translate('trial_balance') . ' : ' . $request->end_date .'.xls',
                \Maatwebsite\Excel\Excel::XLS
            );
        }
    }

    public function trial_balance_csv(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        if (!empty($start_date)) {
            $data = [];
            $data[] = [
                translate('trial_balance') . " " . translate('for period') . ":" . $start_date . " " . translate('to') . " " . $end_date
            ];
            $data[] = [
                translate('gl_code'),
                translate('account'),
                translate('debit'),
                translate('credit')
            ];
            $credit_total = 0;
            $debit_total = 0;
            foreach (ChartOfAccount::orderBy('gl_code', 'asc')->get() as $key) {
                $cr = 0;
                $dr = 0;
                $cr = \App\Models\JournalEntry::where('account_id', $key->id)->whereBetween('date',
                    [$start_date, $end_date])->where('branch_id',
                    session('branch_id'))->sum('credit');
                $dr = \App\Models\JournalEntry::where('account_id', $key->id)->whereBetween('date',
                    [$start_date, $end_date])->where('branch_id',
                    session('branch_id'))->sum('debit');
                $credit_total = $credit_total + $cr;
                $debit_total = $debit_total + $dr;
                array_push($data, [$key->gl_code, $key->name, number_format($dr, 2), number_format($cr, 2)]);
            }
            $data[] = [
                translate('total'),
                "",
                number_format($debit_total, 2),
                number_format($credit_total, 2)
            ];
            /*
            Excel::create(translate('trial_balance') . ' : ' . $request->end_date,
                function ($excel) use ($data) {
                    $excel->sheet('Sheet', function ($sheet) use ($data) {
                        $sheet->fromArray($data, null, 'A1', false, false);
                        $sheet->mergeCells('A1:D1');
                    });

                })->download('csv');
            */

            return Excel::download(
                new ReportTrailBalance($data),
                translate('trial_balance') . ' : ' . $request->end_date .'.csv',
                \Maatwebsite\Excel\Excel::CSV
            );
        }
    }

    public function income_statement(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }

        $date_range = $this->getDateRange($request->date_range);
        $start_date = $date_range->start_date;
        $end_date = $date_range->end_date;

        $chart_of_accounts = [];
        $expenses = [];
        $incomes = [];
        $total_incomes = 0;
        $total_expenses = 0;
        $net_income  = 0;
        if (!empty($start_date)) {
            $chart_of_accounts = \App\Models\ChartOfAccount::query()
                ->withSum(['journal_entries' => function ($query) use ($start_date, $end_date) {
                    return $query->whereBetween('date', [$start_date, $end_date])->where('branch_id', session('branch_id'));
                }], 'credit')
                ->withSum(['journal_entries' => function ($query) use ($start_date, $end_date) {
                    return $query->whereBetween('date', [$start_date, $end_date])->where('branch_id', session('branch_id'));
                }], 'debit')
                ->orderBy('gl_code', 'asc')
                ->get();

            $expenses = $chart_of_accounts->where('account_type', 'expense');
            $incomes = $chart_of_accounts->where('account_type', 'income');

            $total_incomes = $incomes->sum(function ($value) {
                return $value->journal_entries_sum_credit - $value->journal_entries_sum_debit;
            });

            $total_expenses = $expenses->sum(function ($value) {
                return $value->journal_entries_sum_credit - $value->journal_entries_sum_debit;
            });

            $net_income = $total_incomes - $total_expenses;

            // dd($total_incomes, $total_expenses);
        }

        // return $chart_of_accounts ?? 0;

        return view('financial_report.income_statement',compact('start_date','end_date', 'chart_of_accounts', 'expenses', 'incomes', 'total_incomes', 'total_expenses', 'net_income'));
    }

    public function income_statement_pdf(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        $pdf = Pdf::loadView('financial_report.income_statement_pdf', compact('start_date',  'end_date'));
        return $pdf->download(translate('income statement') . ' : ' . $request->end_date . ".pdf");
    }

    /**
     * @throws Exception
     * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception
     */
    public function income_statement_excel(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        if (!empty($start_date)) {
            $data = [];
            $data[] = [
                "",
                translate('income statement') . ' : ' . $request->end_date,
                "",
            ];
            $data[] = [
                translate('gl_code'),
                translate('account'),
                translate('balance'),
            ];
            $data[] = [
                "",
                translate('income'),
                ""
            ];
            $total_income = 0;
            $total_expenses = 0;
            foreach (ChartOfAccount::where('account_type', 'income')->orderBy('gl_code', 'asc')->get() as $key) {
                $cr = \App\Models\JournalEntry::where('account_id', $key->id)->whereBetween('date',
                    [$start_date, $end_date])->where('branch_id',
                    session('branch_id'))->sum('credit');
                $dr = \App\Models\JournalEntry::where('account_id', $key->id)->whereBetween('date',
                    [$start_date, $end_date])->where('branch_id',
                    session('branch_id'))->sum('debit');
                $balance = $cr - $dr;
                $total_income = $total_income + $balance;
                array_push($data, [$key->gl_code, $key->name, number_format($balance, 2)]);
            }
            $data[] = [
                "",
                translate('total income'),
                number_format($total_income, 2)
            ];
            $data[] = [
                "",
                translate('expense'),
                ""
            ];
            foreach (ChartOfAccount::where('account_type', 'expense')->orderBy('gl_code', 'asc')->get() as $key) {
                $cr = \App\Models\JournalEntry::where('account_id', $key->id)->whereBetween('date',
                    [$start_date, $end_date])->where('branch_id',
                    session('branch_id'))->sum('credit');
                $dr = \App\Models\JournalEntry::where('account_id', $key->id)->whereBetween('date',
                    [$start_date, $end_date])->where('branch_id',
                    session('branch_id'))->sum('debit');
                $balance = $dr - $cr;
                $total_expenses = $total_expenses + $balance;
                array_push($data, [$key->gl_code, $key->name, number_format($balance, 2)]);
            }
            $data[] = [
                "",
                translate('total expense'),
                number_format($total_expenses, 2)
            ];
            $data[] = [
                "",
                translate('net income'),
                number_format($total_income - $total_expenses, 2)
            ];

            /*Excel::create(translate('income statement') . ' : ' . $request->end_date,
                function ($excel) use ($data) {
                    $excel->sheet('Sheet', function ($sheet) use ($data) {
                        $sheet->fromArray($data, null, 'A1', false, false);
                        $sheet->mergeCells('A1:C1');
                    });

                })->download('xls');*/
            return Excel::download(
                new IncomeStatementCSVExport($data),
                translate('income statement') . ' : ' . $request->end_date. '.xls',
                \Maatwebsite\Excel\Excel::XLS
            );
        }
    }

    /**
     * @throws Exception
     * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception
     */
    public function income_statement_csv(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        if (!empty($start_date)) {
            $data = [];
            $data[] = [
                "",
                translate('income statement') . ' : ' . $request->end_date,
                "",
            ];
            $data[] = [
                translate('gl_code'),
                translate('account'),
                translate('balance'),
            ];
            $data[] = [
                "",
                translate('income'),
                ""
            ];
            $total_income = 0;
            $total_expenses = 0;
            foreach (ChartOfAccount::where('account_type', 'income')->orderBy('gl_code', 'asc')->get() as $key) {
                $cr = \App\Models\JournalEntry::where('account_id', $key->id)->whereBetween('date',
                    [$start_date, $end_date])->where('branch_id',
                    session('branch_id'))->sum('credit');
                $dr = \App\Models\JournalEntry::where('account_id', $key->id)->whereBetween('date',
                    [$start_date, $end_date])->where('branch_id',
                    session('branch_id'))->sum('debit');
                $balance = $cr - $dr;
                $total_income = $total_income + $balance;
                $data[] = [$key->gl_code, $key->name, number_format($balance, 2)];
            }
            $data[] = [
                "",
                translate('total income'),
                number_format($total_income, 2)
            ];
            $data[] = [
                "",
                translate('expense'),
                ""
            ];
            foreach (ChartOfAccount::where('account_type', 'expense')->orderBy('gl_code', 'asc')->get() as $key) {
                $cr = \App\Models\JournalEntry::where('account_id', $key->id)->whereBetween('date',
                    [$start_date, $end_date])->where('branch_id',
                    session('branch_id'))->sum('credit');
                $dr = \App\Models\JournalEntry::where('account_id', $key->id)->whereBetween('date',
                    [$start_date, $end_date])->where('branch_id',
                    session('branch_id'))->sum('debit');
                $balance = $dr - $cr;
                $total_expenses = $total_expenses + $balance;
                $data[] = [$key->gl_code, $key->name, number_format($balance, 2)];
            }
            $data[] = [
                "",
                translate('total expense'),
                number_format($total_expenses, 2)
            ];
            $data[] = [
                "",
                translate('net income'),
                number_format($total_income - $total_expenses, 2)
            ];

            return Excel::download(
                new IncomeStatementCSVExport($data),
                translate('income statement') . ' : ' . $request->end_date. '.csv',
                \Maatwebsite\Excel\Excel::CSV
            );
        }
    }

    public function balance_sheet(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }

        $date_range = $this->getDateRange($request->date_range);
        $start_date = $date_range->start_date;
        $end_date = $date_range->end_date;

        return view('financial_report.balance_sheet', compact('start_date','end_date'));
    }

    public function balance_sheet_pdf(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        $pdf = Pdf::loadView('financial_report.balance_sheet_pdf', compact('start_date','end_date'));
        return $pdf->download(translate('balance sheet') . ' : ' . $request->end_date . ".pdf");
    }

    public function balance_sheet_excel(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        if (!empty($start_date)) {
            $data = [];
            $data[] = [
                translate('balance sheet') . ' : ' . $request->start_date
            ];
            $data[] = [
                translate('gl_code'),
                translate('account'),
                translate('balance'),
            ];
            $data[] = [
                translate('asset'),
                "",
                ""
            ];
            $total_liabilities = 0;
            $total_assets = 0;
            $total_equity = 0;
            $retained_earnings = 0;
            foreach (ChartOfAccount::where('account_type', 'asset')->orderBy('gl_code', 'asc')->get() as $key) {
                $cr = \App\Models\JournalEntry::where('account_id', $key->id)->where('date', '<=',
                    $start_date)->where('branch_id',
                    session('branch_id'))->sum('credit');
                $dr = \App\Models\JournalEntry::where('account_id', $key->id)->where('date', '<=',
                    $start_date)->where('branch_id',
                    session('branch_id'))->sum('debit');
                $balance = $dr - $cr;
                $total_assets = $total_assets + $balance;
                $data[] = [$key->gl_code, $key->name, number_format($balance, 2)];
            }
            $data[] = [
                "",
                translate('total asset'),
                number_format($total_assets, 2)
            ];
            $data[] = [
                translate('liability'),
                "",
                ""
            ];
            foreach (ChartOfAccount::where('account_type', 'liability')->orderBy('gl_code', 'asc')->get() as $key) {
                $cr = \App\Models\JournalEntry::where('account_id', $key->id)->where('date', '<=',
                    $start_date)->where('branch_id',
                    session('branch_id'))->sum('credit');
                $dr = \App\Models\JournalEntry::where('account_id', $key->id)->where('date', '<=',
                    $start_date)->where('branch_id',
                    session('branch_id'))->sum('debit');
                $balance = $cr - $dr;
                $total_liabilities = $total_liabilities + $balance;
                $data[] = [$key->gl_code, $key->name, number_format($balance, 2)];
            }
            $data[] = [
                "",
                translate('total liability'),
                number_format($total_liabilities, 2)
            ];
            $data[] = [
                "",
                translate('equity'),
                ""
            ];
            foreach (ChartOfAccount::where('account_type', 'equity')->orderBy('gl_code', 'asc')->get() as $key) {
                $cr = \App\Models\JournalEntry::where('account_id', $key->id)->where('date', '<=',
                    $start_date)->where('branch_id',
                    session('branch_id'))->sum('credit');
                $dr = \App\Models\JournalEntry::where('account_id', $key->id)->where('date', '<=',
                    $start_date)->where('branch_id',
                    session('branch_id'))->sum('debit');
                $balance = $cr - $dr;
                $total_equity = $total_equity + $balance;
                $data[] = [$key->gl_code, $key->name, number_format($balance, 2)];
            }
            $data[] = [
                "",
                translate('total equity'),
                number_format($total_equity, 2)
            ];
            $data[] = [
                "",
                translate('total liability') . " " . translate('and', 2) . " " . translate('equity'),
                number_format($total_liabilities + $total_equity, 2)
            ];


            /*Excel::create(translate('balance sheet') . ' : ' . $request->start_date,
                function ($excel) use ($data) {
                    $excel->sheet('Sheet', function ($sheet) use ($data) {
                        $sheet->fromArray($data, null, 'A1', false, false);
                        $sheet->mergeCells('A1:C1');
                    });

                })->download('xls');*/
            return Excel::download(
                new ReportBalanceSheet($data),
                translate('balance sheet') . ' : ' . $request->start_date. '.xls',
                \Maatwebsite\Excel\Excel::XLS
            );
        }
    }

    public function balance_sheet_csv(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        if (!empty($start_date)) {
            $data = [];
            $data[] = [
                translate('balance sheet') . ' : ' . $request->start_date
            ];
            $data[] = [
                translate('gl_code'),
                translate('account'),
                translate('balance'),
            ];
            $data[] = [
                translate('asset'),
                "",
                ""
            ];
            $total_liabilities = 0;
            $total_assets = 0;
            $total_equity = 0;
            $retained_earnings = 0;
            foreach (ChartOfAccount::where('account_type', 'asset')->orderBy('gl_code', 'asc')->get() as $key) {
                $cr = \App\Models\JournalEntry::where('account_id', $key->id)->where('date', '<=',
                    $start_date)->where('branch_id',
                    session('branch_id'))->sum('credit');
                $dr = \App\Models\JournalEntry::where('account_id', $key->id)->where('date', '<=',
                    $start_date)->where('branch_id',
                    session('branch_id'))->sum('debit');
                $balance = $dr - $cr;
                $total_assets = $total_assets + $balance;
                array_push($data, [$key->gl_code, $key->name, number_format($balance, 2)]);
            }
            $data[] = [
                "",
                translate('total  asset'),
                number_format($total_assets, 2)
            ];
            $data[] = [
                translate('liability'),
                "",
                ""
            ];
            foreach (ChartOfAccount::where('account_type', 'liability')->orderBy('gl_code', 'asc')->get() as $key) {
                $cr = \App\Models\JournalEntry::where('account_id', $key->id)->where('date', '<=',
                    $start_date)->where('branch_id',
                    session('branch_id'))->sum('credit');
                $dr = \App\Models\JournalEntry::where('account_id', $key->id)->where('date', '<=',
                    $start_date)->where('branch_id',
                    session('branch_id'))->sum('debit');
                $balance = $cr - $dr;
                $total_liabilities = $total_liabilities + $balance;
                array_push($data, [$key->gl_code, $key->name, number_format($balance, 2)]);
            }
            $data[] = [
                "",
                translate('total  liability'),
                number_format($total_liabilities, 2)
            ];
            $data[] = [
                "",
                translate('equity'),
                ""
            ];
            foreach (ChartOfAccount::where('account_type', 'equity')->orderBy('gl_code', 'asc')->get() as $key) {
                $cr = \App\Models\JournalEntry::where('account_id', $key->id)->where('date', '<=',
                    $start_date)->where('branch_id',
                    session('branch_id'))->sum('credit');
                $dr = \App\Models\JournalEntry::where('account_id', $key->id)->where('date', '<=',
                    $start_date)->where('branch_id',
                    session('branch_id'))->sum('debit');
                $balance = $cr - $dr;
                $total_equity = $total_equity + $balance;
                array_push($data, [$key->gl_code, $key->name, number_format($balance, 2)]);
            }
            $data[] = [
                "",
                translate('total  equity'),
                number_format($total_equity, 2)
            ];
            $data[] = [
                "",
                translate('total  liability') . " " . translate('and', 2) . " " . translate('equity'),
                number_format($total_liabilities + $total_equity, 2)
            ];


            /*Excel::create(translate('balance sheet') . ' : ' . $request->start_date,
                function ($excel) use ($data) {
                    $excel->sheet('Sheet', function ($sheet) use ($data) {
                        $sheet->fromArray($data, null, 'A1', false, false);
                        $sheet->mergeCells('A1:C1');
                    });

                })->download('csv');*/
            return Excel::download(
                new ReportBalanceSheet($data),
                translate('balance sheet') . ' : ' . $request->start_date. '.csv',
                \Maatwebsite\Excel\Excel::CSV
            );
        }
    }

    public function expected_repayments(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $date_range = $this->getDateRange($request->date_range);
        $start_date = $date_range->start_date;
        $end_date = $date_range->end_date;
        $due_items = GeneralHelper::loans_due_items($start_date, $end_date);
        $paid_items = GeneralHelper::loans_paid_items($start_date, $end_date);
        return view('loan_report.expected_repayments',compact('start_date','end_date', 'due_items', 'paid_items'));
    }

    public function expected_repayments_pdf(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        $due_items = GeneralHelper::loans_due_items($start_date, $end_date);
        $paid_items = GeneralHelper::loans_paid_items($start_date, $end_date);
        $pdf = Pdf::loadView('loan_report.expected_repayments_pdf', compact('start_date',
            'end_date', 'due_items', 'paid_items'));
        return $pdf->download(translate('expected repayment') . ".pdf");
    }

    public function expected_repayments_excel(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        $due_items = GeneralHelper::loans_due_items($start_date, $end_date);
        $paid_items = GeneralHelper::loans_paid_items($start_date, $end_date);

        $data = [];
        $data[] = [
            translate('expected repayment')
        ];
        $data[] = [
            "",
            translate('principal'),
            translate('interest'),
            translate('fee'),
            translate('penalty'),
            translate('total'),
        ];
        $data[] = [
            translate('expected'),
            number_format($due_items["principal"], 2),
            number_format($due_items["interest"], 2),
            number_format($due_items["fees"], 2),
            number_format($due_items["penalty"], 2),
            number_format($due_items["principal"] + $due_items["interest"] + $due_items["fees"] + $due_items["penalty"],
                2),
        ];
        $data[] = [
            translate('actual'),
            number_format($paid_items["principal"], 2),
            number_format($paid_items["interest"], 2),
            number_format($paid_items["fees"], 2),
            number_format($paid_items["penalty"], 2),
            number_format($paid_items["principal"] + $paid_items["interest"] + $paid_items["fees"] + $paid_items["penalty"],
                2),
        ];
        $data[] = [
            translate('balance'),
            number_format($due_items["principal"] - $paid_items["principal"], 2),
            number_format($due_items["interest"] - $paid_items["interest"], 2),
            number_format($due_items["fees"] - $paid_items["fees"], 2),
            number_format($due_items["penalty"] - $paid_items["penalty"], 2),
            number_format(($due_items["principal"] + $due_items["interest"] + $due_items["fees"] + $due_items["penalty"]) - ($paid_items["principal"] + $paid_items["interest"] + $paid_items["fees"] + $paid_items["penalty"]),
                2),
        ];

        Excel::create(translate('expected repayment'),
            function ($excel) use ($data) {
                $excel->sheet('Sheet', function ($sheet) use ($data) {
                    $sheet->fromArray($data, null, 'A1', false, false);
                    $sheet->mergeCells('A1:F1');
                });

            })->download('xls');
    }

    public function expected_repayments_csv(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        $due_items = GeneralHelper::loans_due_items($start_date, $end_date);
        $paid_items = GeneralHelper::loans_paid_items($start_date, $end_date);

        $data = [];
        $data[] = [
            translate('expected repayment')
        ];
        $data[] = [
            "",
            translate('principal'),
            translate('interest'),
            translate('fee'),
            translate('penalty'),
            translate('total'),
        ];
        $data[] = [
            translate('expected'),
            number_format($due_items["principal"], 2),
            number_format($due_items["interest"], 2),
            number_format($due_items["fees"], 2),
            number_format($due_items["penalty"], 2),
            number_format($due_items["principal"] + $due_items["interest"] + $due_items["fees"] + $due_items["penalty"],
                2),
        ];
        array_push($data, [
            translate('actual'),
            number_format($paid_items["principal"], 2),
            number_format($paid_items["interest"], 2),
            number_format($paid_items["fees"], 2),
            number_format($paid_items["penalty"], 2),
            number_format($paid_items["principal"] + $paid_items["interest"] + $paid_items["fees"] + $paid_items["penalty"],
                2),
        ]);
        $data[] = [
            translate('balance'),
            number_format($due_items["principal"] - $paid_items["principal"], 2),
            number_format($due_items["interest"] - $paid_items["interest"], 2),
            number_format($due_items["fees"] - $paid_items["fees"], 2),
            number_format($due_items["penalty"] - $paid_items["penalty"], 2),
            number_format(($due_items["principal"] + $due_items["interest"] + $due_items["fees"] + $due_items["penalty"]) - ($paid_items["principal"] + $paid_items["interest"] + $paid_items["fees"] + $paid_items["penalty"]),
                2),
        ];

        Excel::create(translate('expected repayment'),
            function ($excel) use ($data) {
                $excel->sheet('Sheet', function ($sheet) use ($data) {
                    $sheet->fromArray($data, null, 'A1', false, false);
                    $sheet->mergeCells('A1:F1');
                });

            })->download('csv');
    }

    public function repayments_report(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }

        $date_range = $this->getDateRange($request->date_range);
        $start_date = $date_range->start_date;
        $end_date = $date_range->end_date;

        $data = LoanTransaction::query()
            ->sum_principal()
            ->sum_interest()
            ->sum_fees()
            ->sum_penalty()
            ->with(['borrower','loan_repayment_method'])
            ->where('transaction_type','repayment')
            ->where('reversed', 0)->where('branch_id',session('branch_id'))
            ->whereBetween('date', [$start_date, $end_date])
            ->orderBy('created_at', 'desc')->get();

        return view('loan_report.repayments_report', compact('start_date','end_date', 'data'));
    }

    public function repayments_report_pdf(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $date_range = $this->getDateRange($request->date_range);
        $start_date = $date_range->start_date;
        $end_date = $date_range->end_date;


        $data = LoanTransaction::query()
            ->sum_principal()
            ->sum_interest()
            ->sum_fees()
            ->sum_penalty()
            ->with(['borrower', 'loan_repayment_method'])
            ->where('transaction_type', 'repayment')
            ->where('reversed', 0)->where('branch_id', session('branch_id'))
            ->whereBetween('date', [$start_date, $end_date])
            ->orderBy('created_at', 'desc')->get();

        $pdf = \App\Services\Pdf::loadView('loan_report.repayments_report_pdf', compact('start_date',
            'end_date', 'data'));
        $pdf->setPaper('A4', 'landscape');
        return $pdf->download(translate('repayment report') . ".pdf");
    }

    public function repayments_report_excel(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }

        $date_range = $this->getDateRange($request->date_range);
        $start_date = $date_range->start_date;
        $end_date = $date_range->end_date;

        $data = [];
        $reports = LoanTransaction::query()
            ->sum_principal()
            ->sum_interest()
            ->sum_fees()
            ->sum_penalty()
            ->with(['borrower', 'loan_repayment_method'])
            ->where('transaction_type', 'repayment')
            ->where('reversed', 0)->where('branch_id', session('branch_id'))
            ->whereBetween('date', [$start_date, $end_date])
            ->orderBy('created_at', 'desc')->get();

        $total_principal = 0;
        $total_fees = 0;
        $total_interest = 0;
        $total_penalty = 0;
        foreach ($reports as $index => $key) {
            $principal = $key->schedule_sum_principal ?? 0;
            $interest = $key->schedule_sum_interest ?? 0;
            $fees = $key->schedule_sum_fees ?? 0;
            $penalty = $key->schedule_sum_penalty ?? 0;
            $total_principal = $total_principal + $principal;
            $total_interest = $total_interest + $interest;
            $total_fees = $total_fees + $fees;
            $total_penalty = $total_penalty + $penalty;

            if (!empty($key->borrower)) {
                $borrower = $key->borrower->first_name . " " . $key->borrower->last_name;
            } else {
                $borrower = "";
            }

            $data[] = [
                ++$index,
                $borrower,
                number_format($principal, 2),
                number_format($interest, 2),
                number_format($fees, 2),
                number_format($penalty, 2),
                number_format($principal + $interest + $fees + $penalty, 2),
                $key->date,
                $key->receipt,
                @$key->loan_repayment_method->name ?? '',
            ];
        }
        $data[] = [
            "",
            "",
            number_format($total_principal, 2),
            number_format($total_interest, 2),
            number_format($total_fees, 2),
            number_format($total_penalty, 2),
            number_format($total_principal + $total_interest + $total_fees + $total_penalty, 2),
            "",
            "",
            "",
        ];

        $filename = translate('repayment report') . ' - ' . $request->start_date . '-' . $request->end_date . '.xlsx';

        return Excel::download(new ReportRepaymentExport($data), $filename, \Maatwebsite\Excel\Excel::XLSX);

    }

    public function collection_sheet(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }

        $date_range = $this->getDateRange($request->date_range);
        $start_date = $date_range->start_date;
        $end_date = $date_range->end_date;
        $user_id = $request->user_id;
        $users = [];

        $users[""] = translate('all');

        foreach (User::query()->select('id', 'first_name', 'last_name')->get() as $key) {
            $users[$key->id] = $key->first_name . ' ' . $key->last_name;
        }

        $data = Loan::query()
            ->loan_total_penalty($end_date)
            ->loan_total_fees($end_date)
            ->loan_total_interest($end_date)
            ->loan_total_principal($end_date)
            ->loan_total_interest_waived($end_date)
            ->loan_total_pay_off($end_date)
            ->loan_total_paid()
            ->loan_total_penalty()
            ->loan_total_fees()
            ->loan_total_interest()
            ->loan_total_principal()
            ->loan_total_interest_waived()
            ->loan_total_pay_off()
            ->transactions_sum_payment($start_date, $end_date)
            ->transactions_sum_waived($start_date, $end_date)
            ->with([
                'borrower',
                'schedules',
                'loan_product:id,name,repayment_order',
                'loan_officer:id,first_name,last_name',
                'latest_schedule' => function ($query) use ($start_date, $end_date) {
                    return $query->whereBetween('due_date', [$start_date, $end_date])->withCount('loanTransactions');
                },
            ])
            ->when(!empty($request->user_id), function ($query) use ($request) {
                $query->where('loan_officer_id', $request->user_id);
            })
            ->where('branch_id', session('branch_id'))
            ->where('status', 'disbursed')
            ->get();
        return view('loan_report.collection_sheet', compact('start_date', 'end_date', 'data', 'users', 'user_id'));
    }

    public function over_due(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $today = \Carbon\Carbon::today()->toDateString();
        $date = $request->date ? $request->date : $today;
        $user_id = $request->user_id;
        $users = [];
        $users["-1"] = translate('all', 1);
        foreach (User::all() as $key) {
            $users[$key->id] = $key->first_name . ' ' . $key->last_name;
        }
        if (!empty($date)) {
            //get disbursed loans within specified period and officer
            if ($request->user_id == "-1" || $user_id == null) {
                $data = Loan::where('status', 'disbursed')->where('branch_id',
                    session('branch_id'))->paginate(default_paginate());
            } else {
                $data = Loan::where('loan_officer_id', $request->user_id)->where('branch_id',
                    session('branch_id'))->where('status', 'disbursed')->paginate(default_paginate());
            }
        }
        return view('loan_report.over_due',
            compact('date', 'data', 'users', 'user_id'));
    }

    public function over_due_print(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $date = $request->date;
        $user_id = $request->user_id;
        $data = null;
        if (!empty($date)) {
            //get disbursed loans within specified period and officer

            if ($request->user_id == "-1" || $user_id == null) {
                $data = Loan::where('status', 'disbursed')->where('branch_id', session('branch_id'))->get();
            } else {
                $data = Loan::where('loan_officer_id', $request->user_id)->where('branch_id', session('branch_id'))->where('status', 'disbursed')->get();
            }
        }
        return view('loan_report.over_due_print', compact('date',
            'user_id', 'data'));
    }

    public function collection_sheet_print(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        $user_id = $request->user_id;
        $data = null;
        if (!empty($start_date)) {
            //get disbursed loans within specified period and officer
            if ($request->user_id == "-1" || $user_id == null) {
                $data = Loan::where('status', 'disbursed')->where('branch_id', session('branch_id'))->get();
            } else {
                $data = Loan::where('loan_officer_id', $request->user_id)->where('branch_id', session('branch_id'))->where('status', 'disbursed')->get();
            }
            return view('loan_report.print_collection_sheet', compact('start_date', 'end_date', 'user_id', 'data'));
        }
    }
    
    public function collection_sheet_pdf(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        $user_id = $request->user_id;
        if (!empty($start_date)) {
            //get disbursed loans within specified period and officer

            if ($request->user_id == "-1" || $user_id == null) {
                $data = Loan::where('status', 'disbursed')->where('branch_id',
                    session('branch_id'))->get();
            } else {
                $data = Loan::where('loan_officer_id', $request->user_id)->where('branch_id',
                    session('branch_id'))->where('status', 'disbursed')->get();
            }

            $pdf = \App\Services\Pdf::loadView('loan_report.collection_sheet_pdf', compact('start_date','end_date', 'user_id', 'data'));
            
            $pdf->setPaper('A4', 'landscape');
            return $pdf->download(translate('collection sheet') . ".pdf");
        }


    }

    public function collection_sheet_excel(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }

        $date_range = $this->getDateRange($request->date_range);
        $start_date = $date_range->start_date;
        $end_date = $date_range->end_date;

        Excel::create(translate('collection sheet'),
            function ($excel) use ($data) {
                $excel->sheet('Sheet', function ($sheet) use ($data) {
                    $sheet->fromArray($data, null, 'A1', false, false);
                    $sheet->mergeCells('A1:J1');
                });
            })->download('xls');
    }

    public function collection_sheet_csv(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        if (!empty($start_date)) {
            if ($request->user_id == "-1") {
                $ldata = Loan::where('status', 'disbursed')->where('branch_id',
                    session('branch_id'))->get();
            } else {
                $ldata = Loan::where('loan_officer_id', $request->user_id)->where('branch_id',
                    session('branch_id'))->where('status', 'disbursed')->get();
            }
            $data = [];
            $data[] = [
                translate('collection sheet')
            ];
            $data[] = [
                translate('loan_officer'),
                translate('borrower'),
                translate('phone'),
                translate('loan  id'),
                translate('product'),
                translate('expected repayment date'),
                translate('maturity date'),
                translate('expected amount'),
                translate('due'),
                translate('outstanding'),
            ];
            $total_outstanding = 0;
            $total_due = 0;
            $total_expected = 0;
            $total_actual = 0;
            $expected = null;
            $due = null;
            $balance = null;
            foreach ($ldata as $key) {
                $schedule = \App\Models\LoanSchedule::where('loan_id', $key->id)->whereBetween('due_date',
                    [$start_date, $end_date])->orderBy('due_date', 'desc')->limit(1)->first();
                if (!empty($schedule)) {
                    $balance = \App\Helpers\GeneralHelper::loan_total_balance($key->id);
                    $loan_due_items = \App\Helpers\GeneralHelper::loan_due_items($key->id,
                        $key->release_date, $schedule->due_date);
                    $loan_paid_items = \App\Helpers\GeneralHelper::loan_paid_items($key->id,
                        $key->release_date, $schedule->due_date);
                    $expected = $schedule->principal + $schedule->interest + $schedule->fees + $schedule->panalty;
                    $due = ($loan_due_items["principal"] + $loan_due_items["interest"] + $loan_due_items["fees"] + $loan_due_items["penalty"]) - ($loan_paid_items["principal"] + $loan_paid_items["interest"] + $loan_paid_items["fees"] + $loan_paid_items["penalty"]);
                    if ($due < 0) {
                        $actual = $expected;
                    } else {
                        $actual = 0;
                    }
                    $total_outstanding = $total_outstanding + $balance;
                    $total_due = $total_due + $due;
                    $total_expected = $total_expected + $expected;
                    $total_actual = $total_actual + $actual;
                }
                if (!empty($key->borrower)) {
                    $borrower = $key->borrower->first_name . " " . $key->borrower->last_name;
                    $borrower_phone = $key->borrower->mobile;
                } else {
                    $borrower = "";
                    $borrower_phone = "";
                }
                if (!empty($key->loan_officer)) {
                    $loan_officer = $key->loan_officer->first_name . " " . $key->loan_officer->last_name;
                } else {
                    $loan_officer = "";
                }
                if (!empty($key->loan_product)) {
                    $loan_product = $key->loan_product->name;
                } else {
                    $loan_product = "";
                }
                $data[] = [
                    $loan_officer,
                    $borrower,
                    $borrower_phone,
                    $key->id,
                    $loan_product,
                    $schedule->due_date??'',
                    $key->maturity_date,
                    number_format($expected, 2),
                    number_format($due, 2),
                    number_format($balance, 2)
                ];
            }
            $data[] = [
                "",
                "",
                "",
                "",
                "",
                "",
                "",
                number_format($total_expected, 2),
                number_format($total_due, 2),
                number_format($total_outstanding, 2)
            ];

            Excel::create(translate('collection sheet'),
                function ($excel) use ($data) {
                    $excel->sheet('Sheet', function ($sheet) use ($data) {
                        $sheet->fromArray($data, null, 'A1', false, false);
                        $sheet->mergeCells('A1:J1');
                    });

                })->download('csv');
        }


    }

    public function arrears_report(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }

        $date_range = $this->getDateRange($request->date_range);
        $start_date = $date_range->start_date;
        $end_date = $date_range->end_date;

        return view('loan_report.arrears_report', compact('start_date','end_date'));
    }

    public function arrears_report_pdf(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;

        if (!empty($end_date)) {
            $pdf = \App\Services\Pdf::loadView('loan_report.arrears_report_pdf', compact('start_date', 'end_date'));
            $pdf->setPaper('A4', 'landscape');
            return $pdf->download(translate('arrears report') . ".pdf");

        //     $pdf = \App\Services\Pdf::loadView('loan_report.repayments_report_pdf', compact('start_date',
        //     'end_date', 'data'));
        // $pdf->setPaper('A4', 'landscape');
        // return $pdf->download(translate('repayment report') . ".pdf");

        }

    }

    public function arrears_report_excel(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        if (!empty($end_date)) {

            $data = [];
            array_push($data, [
                translate('collection sheet')
            ]);
            array_push($data, [
                translate('loan_officer'),
                translate('borrower'),
                translate('phone'),
                translate('loan  id'),
                translate('product'),
                translate('amount'),
                translate('disbursed'),
                translate('maturity  date'),
                translate('principal'),
                translate('interest'),
                translate('fee'),
                translate('penalty'),
                translate('outstanding'),
                translate('due'),
                translate('day', 2) . " " . translate('in') . " " . translate('arrears'),
                translate('day', 2) . " " . translate('since') . " " . translate('payment')
            ]);
            $total_outstanding = 0;
            $total_due = 0;
            $total_principal = 0;
            $total_interest = 0;
            $total_fees = 0;
            $total_penalty = 0;
            $total_amount = 0;
            foreach (Loan::where('first_payment_date', '<=', $end_date)->where('branch_id',
                session('branch_id'))->where('status', 'disbursed')->orderBy('release_date', 'asc')->get() as $key) {
                $loan_due_items = GeneralHelper::loan_due_items($key->id,
                    $key->release_date, $end_date);
                $loan_paid_items = GeneralHelper::loan_paid_items($key->id,
                    $key->release_date, $end_date);
                $balance = GeneralHelper::loan_total_balance($key->id);
                $due = ($loan_due_items["principal"] + $loan_due_items["interest"] + $loan_due_items["fees"] + $loan_due_items["penalty"]) - ($loan_paid_items["principal"] + $loan_paid_items["interest"] + $loan_paid_items["fees"] + $loan_paid_items["penalty"]);
                $principal = $loan_due_items["principal"];
                $interest = $loan_due_items["interest"];
                $fees = $loan_due_items["fees"];
                $penalty = $loan_due_items["penalty"];
                if ($due > 0) {
                    $total_outstanding = $total_outstanding + $balance;
                    $total_due = $total_due + $due;
                    $total_principal = $total_principal + $principal;
                    $total_interest = $total_interest + $interest;
                    $total_fees = $total_fees + $fees;
                    $total_penalty = $total_penalty + $penalty;
                    $total_amount = $total_amount + $key->principal;
                    //lets find arrears information
                    $schedules = LoanSchedule::where('loan_id', $key->id)->where('due_date', '<=',
                        $end_date)->orderBy('due_date', 'asc')->get();
                    $payments = $loan_paid_items["principal"] + $loan_paid_items["interest"] + $loan_paid_items["fees"] + $loan_paid_items["penalty"];
                    if ($payments > 0) {
                        foreach ($schedules as $schedule) {
                            if ($payments > $schedule->principal + $schedule->interest + $schedule->penalty + $schedule->fees) {
                                $payments = $payments - ($schedule->principal + $schedule->interest + $schedule->penalty + $schedule->fees);
                            } else {
                                $payments = 0;
                                $overdue_date = $schedule->due_date;
                                break;
                            }
                        }
                    } else {
                        $overdue_date = $schedules->first()->due_date;
                    }
                    $date1 = new \DateTime($overdue_date);
                    $date2 = new \DateTime($end_date);
                    $days_arrears = $date2->diff($date1)->format("%a");
                    $transaction = LoanTransaction::where('loan_id',
                        $key->id)->where('transaction_type',
                        'repayment')->where('reversed', 0)->orderBy('date', 'desc')->first();
                    if (!empty($transaction)) {
                        $date2 = new \DateTime($transaction->date);
                        $date1 = new \DateTime($end_date);
                        $days_last_payment = $date2->diff($date1)->format("%r%a");
                    } else {
                        $days_last_payment = 0;
                    }
                }
                if (!empty($key->borrower)) {
                    $borrower = $key->borrower->first_name . " " . $key->borrower->last_name;
                    $borrower_phone = $key->borrower->mobile;
                } else {
                    $borrower = "";
                    $borrower_phone = "";
                }
                if (!empty($key->loan_officer)) {
                    $loan_officer = $key->loan_officer->first_name . " " . $key->loan_officer->last_name;
                } else {
                    $loan_officer = "";
                }
                if (!empty($key->loan_product)) {
                    $loan_product = $key->loan_product->name;
                } else {
                    $loan_product = "";
                }
                if ($due > 0) {
                    array_push($data, [
                        $loan_officer,
                        $borrower,
                        $borrower_phone,
                        $key->id,
                        $loan_product,
                        number_format($key->principal, 2),
                        $key->release_date,
                        $key->maturity_date,
                        number_format($principal, 2),
                        number_format($interest, 2),
                        number_format($fees, 2),
                        number_format($penalty, 2),
                        number_format($due, 2),
                        number_format($balance, 2),
                        number_format($days_arrears, 2),
                        number_format($days_last_payment, 2),
                    ]);
                }

            }
            array_push($data, [
                "",
                "",
                "",
                "",
                "",
                number_format($total_amount, 2),
                "",
                "",
                number_format($total_principal, 2),
                number_format($total_interest, 2),
                number_format($total_fees, 2),
                number_format($total_penalty, 2),
                number_format($total_outstanding, 2),
                number_format($total_due, 2),
                "",
                "",
            ]);

            Excel::create(translate('arrears report'),
                function ($excel) use ($data) {
                    $excel->sheet('Sheet', function ($sheet) use ($data) {
                        $sheet->fromArray($data, null, 'A1', false, false);
                        $sheet->mergeCells('A1:P1');
                    });

                })->download('xls');
        }


    }

    public function arrears_report_csv(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        if (!empty($end_date)) {

            $data = [];
            $data[] = [
                translate('collection sheet')
            ];
            $data[] = [
                translate('loan_officer'),
                translate('borrower'),
                translate('phone'),
                translate('loan  id'),
                translate('product'),
                translate('amount'),
                translate('disbursed'),
                translate('maturity  date'),
                translate('principal'),
                translate('interest'),
                translate('fee'),
                translate('penalty'),
                translate('outstanding'),
                translate('due'),
                translate('day', 2) . " " . translate('in') . " " . translate('arrears'),
                translate('day', 2) . " " . translate('since') . " " . translate('payment')
            ];
            $total_outstanding = 0;
            $total_due = 0;
            $total_principal = 0;
            $total_interest = 0;
            $total_fees = 0;
            $total_penalty = 0;
            $total_amount = 0;
            foreach (Loan::where('first_payment_date', '<=', $end_date)->where('branch_id',
                session('branch_id'))->where('status', 'disbursed')->orderBy('release_date', 'asc')->get() as $key) {
                $loan_due_items = GeneralHelper::loan_due_items($key->id,
                    $key->release_date, $end_date);
                $loan_paid_items = GeneralHelper::loan_paid_items($key->id,
                    $key->release_date, $end_date);
                $balance = GeneralHelper::loan_total_balance($key->id);
                $due = ($loan_due_items["principal"] + $loan_due_items["interest"] + $loan_due_items["fees"] + $loan_due_items["penalty"]) - ($loan_paid_items["principal"] + $loan_paid_items["interest"] + $loan_paid_items["fees"] + $loan_paid_items["penalty"]);
                $principal = $loan_due_items["principal"];
                $interest = $loan_due_items["interest"];
                $fees = $loan_due_items["fees"];
                $penalty = $loan_due_items["penalty"];
                if ($due > 0) {
                    $total_outstanding = $total_outstanding + $balance;
                    $total_due = $total_due + $due;
                    $total_principal = $total_principal + $principal;
                    $total_interest = $total_interest + $interest;
                    $total_fees = $total_fees + $fees;
                    $total_penalty = $total_penalty + $penalty;
                    $total_amount = $total_amount + $key->principal;
                    //lets find arrears information
                    $schedules = LoanSchedule::where('loan_id', $key->id)->where('due_date', '<=',
                        $end_date)->orderBy('due_date', 'asc')->get();
                    $payments = $loan_paid_items["principal"] + $loan_paid_items["interest"] + $loan_paid_items["fees"] + $loan_paid_items["penalty"];
                    if ($payments > 0) {
                        foreach ($schedules as $schedule) {
                            if ($payments > $schedule->principal + $schedule->interest + $schedule->penalty + $schedule->fees) {
                                $payments = $payments - ($schedule->principal + $schedule->interest + $schedule->penalty + $schedule->fees);
                            } else {
                                $payments = 0;
                                $overdue_date = $schedule->due_date;
                                break;
                            }
                        }
                    } else {
                        $overdue_date = $schedules->first()->due_date;
                    }
                    $date1 = new \DateTime($overdue_date);
                    $date2 = new \DateTime($end_date);
                    $days_arrears = $date2->diff($date1)->format("%a");
                    $transaction = LoanTransaction::where('loan_id',
                        $key->id)->where('transaction_type',
                        'repayment')->where('reversed', 0)->orderBy('date', 'desc')->first();
                    if (!empty($transaction)) {
                        $date2 = new \DateTime($transaction->date);
                        $date1 = new \DateTime($end_date);
                        $days_last_payment = $date2->diff($date1)->format("%r%a");
                    } else {
                        $days_last_payment = 0;
                    }
                }
                if (!empty($key->borrower)) {
                    $borrower = $key->borrower->first_name . " " . $key->borrower->last_name;
                    $borrower_phone = $key->borrower->mobile;
                } else {
                    $borrower = "";
                    $borrower_phone = "";
                }
                if (!empty($key->loan_officer)) {
                    $loan_officer = $key->loan_officer->first_name . " " . $key->loan_officer->last_name;
                } else {
                    $loan_officer = "";
                }
                if (!empty($key->loan_product)) {
                    $loan_product = $key->loan_product->name;
                } else {
                    $loan_product = "";
                }
                if ($due > 0) {
                    array_push($data, [
                        $loan_officer,
                        $borrower,
                        $borrower_phone,
                        $key->id,
                        $loan_product,
                        number_format($key->principal, 2),
                        $key->release_date,
                        $key->maturity_date,
                        number_format($principal, 2),
                        number_format($interest, 2),
                        number_format($fees, 2),
                        number_format($penalty, 2),
                        number_format($due, 2),
                        number_format($balance, 2),
                        number_format($days_arrears, 2),
                        number_format($days_last_payment, 2),
                    ]);
                }

            }
            $data[] = [
                "",
                "",
                "",
                "",
                "",
                number_format($total_amount, 2),
                "",
                "",
                number_format($total_principal, 2),
                number_format($total_interest, 2),
                number_format($total_fees, 2),
                number_format($total_penalty, 2),
                number_format($total_outstanding, 2),
                number_format($total_due, 2),
                "",
                "",
            ];

            Excel::create(translate('arrears report'),
                function ($excel) use ($data) {
                    $excel->sheet('Sheet', function ($sheet) use ($data) {
                        $sheet->fromArray($data, null, 'A1', false, false);
                        $sheet->mergeCells('A1:P1');
                    });

                })->download('csv');
        }


    }

    public function disbursed_loans(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }

        $date_range = $this->getDateRange($request->date_range);
        $start_date = $date_range->start_date;
        $end_date = $date_range->end_date;

        $user_id = $request->user_id;
        $loan_product_id = $request->loan_product_id;
        $users = [];
        $users["-1"] = translate('all', 1);
        $users = User::query()->select('id', 'first_name', 'last_name')->get();
        foreach ($users as $key) {
            $users[$key->id] = $key->first_name . ' ' . $key->last_name;
        }
        $users = [];
        $users["-1"] = translate('all', 1);
        foreach (User::all() as $key) {
            $users[$key->id] = $key->first_name . ' ' . $key->last_name;
        }
        $loan_products = [];
        $loan_products[""] = translate('all', 1);
        foreach (LoanProduct::query()->get(['id','name']) as $key) {
            $loan_products[$key->id] = $key->name;
        }

        $data = [];
        if (!empty($start_date)) {

            $data = Loan::query()
                ->with(['schedules' , 'borrower:id,first_name,last_name', 'loan_product:id,name,repayment_order'])
                ->where('branch_id',session('branch_id'))
                ->where('status', 'disbursed')->whereBetween('release_date',[$start_date, $end_date])
                ->when(!empty($request->loan_product_id),function($query) use($request){
                    return $query->where('loan_product_id', $request->loan_product_id);
                })
                ->transactions_sum_payment()
                ->transactions_sum_waived()
                ->sum_principal()
                ->sum_interest()
                ->sum_fees()
                ->sum_penalty()
                ->orderBy('id','desc')
                ->get();
        }


        return view('loan_report.disbursed_loans', compact('start_date', 'end_date', 'data', 'user_id', 'loan_product_id', 'users', 'loan_products'));
    }
    public function disbursed_loans_pdf(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }

        $date_range = $this->getDateRange($request->date_range);
        $start_date = $date_range->start_date;
        $end_date = $date_range->end_date;

        $user_id = $request->user_id;
        $loan_product_id = $request->loan_product_id;
        $users = [];
        $users["-1"] = translate('all', 1);
        $users = User::query()->select('id', 'first_name', 'last_name')->get();
        foreach ($users as $key) {
            $users[$key->id] = $key->first_name . ' ' . $key->last_name;
        }
        $users = [];
        $users["-1"] = translate('all', 1);
        foreach (User::all() as $key) {
            $users[$key->id] = $key->first_name . ' ' . $key->last_name;
        }
        $loan_products = [];
        $loan_products[""] = translate('all', 1);
        foreach (LoanProduct::query()->get(['id','name']) as $key) {
            $loan_products[$key->id] = $key->name;
        }

        $data = [];
        if (!empty($start_date)) {

            $data = Loan::query()
                ->with(['schedules' , 'borrower:id,first_name,last_name', 'loan_product:id,name,repayment_order'])
                ->where('branch_id',session('branch_id'))
                ->where('status', 'disbursed')->whereBetween('release_date',[$start_date, $end_date])
                ->when(!empty($request->loan_product_id),function($query) use($request){
                    return $query->where('loan_product_id', $request->loan_product_id);
                })
                ->transactions_sum_payment()
                ->transactions_sum_waived()
                ->sum_principal()
                ->sum_interest()
                ->sum_fees()
                ->sum_penalty()
                ->orderBy('id','desc')
                ->get();
        }

        $pdf = \App\Services\Pdf::loadView('loan_report.disbursed_loan_pdf', compact('start_date',
            'end_date', 'data'));
        $pdf->setPaper('A4', 'landscape');
        return $pdf->download(translate('disbursed_loan_pdf report') . ".pdf");

    }

    public function disbursed_loans_excel(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        $user_id = $request->user_id;
        $loan_product_id = $request->loan_product_id;
        if (!empty($end_date)) {
            if ($request->loan_product_id == "-1") {
                $ldata = Loan::where('status', 'disbursed')->where('branch_id',
                    session('branch_id'))->whereBetween('release_date',
                    [$start_date, $end_date])->orderBy('id','desc')->get();
            } else {
                $ldata = Loan::where('loan_product_id', $request->loan_product_id)->where('branch_id',
                    session('branch_id'))->where('status', 'disbursed')->whereBetween('release_date',
                    [$start_date, $end_date])->orderBy('id','desc')->get();
            }
            $data = [];
            $data[] = [
                translate('disbursed loan')
            ];
            $data[] = [
                translate('id'),
                translate('product'),
                translate('disbursed'),
                translate('maturity  date'),
                translate('principal'),
                translate('interest'),
                translate('fee'),
                translate('penalty'),
                translate('total'),
                translate('payment'),
                translate('balance'),
            ];
            $total_outstanding = 0;
            $total_due = 0;
            $total_payments = 0;
            $total_principal = 0;
            $total_interest = 0;
            $total_fees = 0;
            $total_penalty = 0;
            $total_amount = 0;
            foreach ($ldata as $key) {
                $loan_due_items = \App\Helpers\GeneralHelper::loan_due_items($key->id);
                $loan_paid_items = \App\Helpers\GeneralHelper::loan_paid_items($key->id);
                $due = $loan_due_items["principal"] + $loan_due_items["interest"] + $loan_due_items["fees"] + $loan_due_items["penalty"];
                $payments = $loan_paid_items["principal"] + $loan_paid_items["interest"] + $loan_paid_items["fees"] + $loan_paid_items["penalty"];
                $balance = $due - $payments;
                $principal = $loan_due_items["principal"];
                $interest = $loan_due_items["interest"];
                $fees = $loan_due_items["fees"];
                $penalty = $loan_due_items["penalty"];

                $total_outstanding = $total_outstanding + $balance;
                $total_due = $total_due + $due;
                $total_principal = $total_principal + $principal;
                $total_interest = $total_interest + $interest;
                $total_fees = $total_fees + $fees;
                $total_penalty = $total_penalty + $penalty;
                $total_payments = $total_payments + $payments;
                if (!empty($key->borrower)) {
                    $borrower = $key->borrower->first_name . " " . $key->borrower->last_name;
                    $borrower_phone = $key->borrower->mobile;
                } else {
                    $borrower = "";
                    $borrower_phone = "";
                }
                if (!empty($key->loan_officer)) {
                    $loan_officer = $key->loan_officer->first_name . " " . $key->loan_officer->last_name;
                } else {
                    $loan_officer = "";
                }
                if (!empty($key->loan_product)) {
                    $loan_product = $key->loan_product->name;
                } else {
                    $loan_product = "";
                }
                if ($due > 0) {
                    array_push($data, [
                        $key->id,
                        $borrower,
                        $loan_product,
                        $key->release_date,
                        $key->maturity_date,
                        number_format($principal, 2),
                        number_format($interest, 2),
                        number_format($fees, 2),
                        number_format($penalty, 2),
                        number_format($due, 2),
                        number_format($payments, 2),
                        number_format($balance, 2),
                    ]);
                }

            }
            $data[] = [
                "",
                "",
                "",
                "",
                number_format($total_principal, 2),
                number_format($total_interest, 2),
                number_format($total_fees, 2),
                number_format($total_penalty, 2),
                number_format($total_due, 2),
                number_format($total_payments, 2),
                number_format($total_outstanding, 2),
            ];

            Excel::create(translate('disbursed loan'),
                function ($excel) use ($data) {
                    $excel->sheet('Sheet', function ($sheet) use ($data) {
                        $sheet->fromArray($data, null, 'A1', false, false);
                        $sheet->mergeCells('A1:K1');
                    });

                })->download('xls');
        }


    }

    public function disbursed_loans_csv(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        $user_id = $request->user_id;
        $loan_product_id = $request->loan_product_id;
        if (!empty($end_date)) {
            if ($request->loan_product_id == "-1") {
                $ldata = Loan::where('status', 'disbursed')->where('branch_id',
                    session('branch_id'))->whereBetween('release_date',
                    [$start_date, $end_date])->orderBy('id','desc')->get();
            } else {
                $ldata = Loan::where('loan_product_id', $request->loan_product_id)->where('branch_id',
                    session('branch_id'))->where('status', 'disbursed')->whereBetween('release_date',
                    [$start_date, $end_date])->orderBy('id','desc')->get();
            }
            $data = [];
            array_push($data, [
                translate('disbursed loan')
            ]);
            array_push($data, [
                translate('id'),
                translate('product'),
                translate('disbursed'),
                translate('maturity  date'),
                translate('principal'),
                translate('interest'),
                translate('fee'),
                translate('penalty'),
                translate('total'),
                translate('payment'),
                translate('balance'),
            ]);
            $total_outstanding = 0;
            $total_due = 0;
            $total_payments = 0;
            $total_principal = 0;
            $total_interest = 0;
            $total_fees = 0;
            $total_penalty = 0;
            $total_amount = 0;
            foreach ($ldata as $key) {
                $loan_due_items = \App\Helpers\GeneralHelper::loan_due_items($key->id);
                $loan_paid_items = \App\Helpers\GeneralHelper::loan_paid_items($key->id);
                $due = $loan_due_items["principal"] + $loan_due_items["interest"] + $loan_due_items["fees"] + $loan_due_items["penalty"];
                $payments = $loan_paid_items["principal"] + $loan_paid_items["interest"] + $loan_paid_items["fees"] + $loan_paid_items["penalty"];
                $balance = $due - $payments;
                $principal = $loan_due_items["principal"];
                $interest = $loan_due_items["interest"];
                $fees = $loan_due_items["fees"];
                $penalty = $loan_due_items["penalty"];

                $total_outstanding = $total_outstanding + $balance;
                $total_due = $total_due + $due;
                $total_principal = $total_principal + $principal;
                $total_interest = $total_interest + $interest;
                $total_fees = $total_fees + $fees;
                $total_penalty = $total_penalty + $penalty;
                $total_payments = $total_payments + $payments;
                if (!empty($key->borrower)) {
                    $borrower = $key->borrower->first_name . " " . $key->borrower->last_name;
                    $borrower_phone = $key->borrower->mobile;
                } else {
                    $borrower = "";
                    $borrower_phone = "";
                }
                if (!empty($key->loan_officer)) {
                    $loan_officer = $key->loan_officer->first_name . " " . $key->loan_officer->last_name;
                } else {
                    $loan_officer = "";
                }
                if (!empty($key->loan_product)) {
                    $loan_product = $key->loan_product->name;
                } else {
                    $loan_product = "";
                }
                if ($due > 0) {
                    $data[] = [
                        $key->id,
                        $borrower,
                        $loan_product,
                        $key->release_date,
                        $key->maturity_date,
                        number_format($principal, 2),
                        number_format($interest, 2),
                        number_format($fees, 2),
                        number_format($penalty, 2),
                        number_format($due, 2),
                        number_format($payments, 2),
                        number_format($balance, 2),
                    ];
                }

            }
            $data[] = [
                "",
                "",
                "",
                "",
                number_format($total_principal, 2),
                number_format($total_interest, 2),
                number_format($total_fees, 2),
                number_format($total_penalty, 2),
                number_format($total_due, 2),
                number_format($total_payments, 2),
                number_format($total_outstanding, 2),
            ];

            Excel::create(translate('disbursed loan'),
                function ($excel) use ($data) {
                    $excel->sheet('Sheet', function ($sheet) use ($data) {
                        $sheet->fromArray($data, null, 'A1', false, false);
                        $sheet->mergeCells('A1:K1');
                    });

                })->download('csv');
        }


    }

    public function borrower_numbers(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $date_range = $this->getDateRange($request->date_range);
        $start_date = $date_range->start_date;
        $end_date = $date_range->end_date;
        $borrower_reports = get_borrowers_reports($start_date, $end_date);

        return view('borrower_report.borrower_numbers', compact('start_date', 'end_date', 'borrower_reports'));
    }

    public function borrower_numbers_pdf(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }

        $start_date = $request->start_date ?? null;
        $end_date = $request->end_date ?? null;

        $borrower_reports = get_borrowers_reports($start_date, $end_date);

        $pdf = Pdf::loadView('borrower_report.borrower_numbers_pdf', compact('start_date', 'end_date', 'borrower_reports'));
        //$pdf->setPaper('A4', 'landscape');
        return $pdf->download(translate('borrower number') . ".pdf");

    }

    public function borrower_numbers_excel(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }

        $start_date = $request->start_date;
        $end_date = $request->end_date;

        return Excel::download(new BorrowerNumberExport($start_date, $end_date), 'borrower_numbers.xlsx');
    }

    public function borrower_numbers_csv(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;

        return Excel::download(new BorrowerNumberExport($start_date, $end_date), 'borrower_numbers.csv');

    }

    public function provisioning(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;

        return view('financial_report.provisioning', compact('start_date', 'end_date'));
    }

    public function provisioning_pdf(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;

        if (!empty($end_date)) {
            $pdf = Pdf::loadView('financial_report.provisioning_pdf', compact('start_date','end_date'));
            $pdf->setPaper('A4', 'landscape');
            return $pdf->download(translate('provisioning report') . ".pdf");
        }

    }

    public function provisioning_excel(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        if (!empty($end_date)) {

            $data = [];
            $data[] = [
                translate('provisioning report')
            ];
            $data[] = [
                "",
                "",
                "",
                "",
                "",
                "",
                "",
                translate('outstanding'),
                "",
                "",
                "",
                "",
                translate('arrears'),
                "",
                translate('provisioning'),
                "",
                "",
            ];
            array_push($data, [
                translate('loan_officer'),
                translate('borrower'),
                translate('loan id'),
                translate('product'),
                translate('amount'),
                translate('disbursed'),
                translate('maturity date'),
                translate('principal'),
                translate('interest'),
                translate('fee'),
                translate('penalty'),
                translate('total'),
                translate('day'),
                translate('amount'),
                translate('percentage'),
                translate('amount'),
                translate('classification'),
            ]);
            $total_outstanding = 0;
            $total_arrears = 0;
            $total_principal = 0;
            $total_interest = 0;
            $total_fees = 0;
            $total_penalty = 0;
            $total_provisioning_amount = 0;
            $total_amount = 0;
            foreach (Loan::where('release_date', '<=', $end_date)->where('branch_id',
                session('branch_id'))->where('status', 'disbursed')->orderBy('release_date', 'asc')->get() as $key) {
                $loan_due_items = \App\Helpers\GeneralHelper::loan_due_items($key->id);
                $loan_due_items_arrears = \App\Helpers\GeneralHelper::loan_due_items($key->id,
                    $key->release_date, $end_date);
                $loan_paid_items = \App\Helpers\GeneralHelper::loan_paid_items($key->id,
                    $key->release_date, $end_date);
                $due = ($loan_due_items["principal"] + $loan_due_items["interest"] + $loan_due_items["fees"] + $loan_due_items["penalty"]) - ($loan_paid_items["principal"] + $loan_paid_items["interest"] + $loan_paid_items["fees"] + $loan_paid_items["penalty"]);
                $principal = $loan_due_items["principal"] - $loan_paid_items["principal"];
                $interest = $loan_due_items["interest"] - $loan_paid_items["interest"];
                $fees = $loan_due_items["fees"] - $loan_paid_items["fees"];
                $penalty = $loan_due_items["penalty"] - $loan_paid_items["penalty"];
                $arrears = ($loan_due_items_arrears["principal"] + $loan_due_items_arrears["interest"] + $loan_due_items_arrears["fees"] + $loan_due_items_arrears["penalty"]) - ($loan_paid_items["principal"] + $loan_paid_items["interest"] + $loan_paid_items["fees"] + $loan_paid_items["penalty"]);
                $total_outstanding = $total_outstanding + $due;
                $total_arrears = $total_arrears + $arrears;
                $total_principal = $total_principal + $principal;
                $total_interest = $total_interest + $interest;
                $total_fees = $total_fees + $fees;
                $total_penalty = $total_penalty + $penalty;
                $total_amount = $total_amount + $key->principal;

                if (!empty($key->borrower)) {
                    $borrower = $key->borrower->first_name . " " . $key->borrower->last_name;
                    $borrower_phone = $key->borrower->mobile;
                } else {
                    $borrower = "";
                    $borrower_phone = "";
                }
                if (!empty($key->loan_officer)) {
                    $loan_officer = $key->loan_officer->first_name . " " . $key->loan_officer->last_name;
                } else {
                    $loan_officer = "";
                }
                if (!empty($key->loan_product)) {
                    $loan_product = $key->loan_product->name;
                } else {
                    $loan_product = "";
                }

                if ($due > 0) {
                    //lets find arrears information
                    $schedules = LoanSchedule::where('loan_id', $key->id)->where('due_date', '<=',
                        $end_date)->orderBy('due_date', 'asc')->get();
                    $payments = $loan_paid_items["principal"] + $loan_paid_items["interest"] + $loan_paid_items["fees"] + $loan_paid_items["penalty"];
                    if ($payments > 0) {
                        foreach ($schedules as $schedule) {
                            if ($payments > $schedule->principal + $schedule->interest + $schedule->penalty + $schedule->fees) {
                                $payments = $payments - ($schedule->principal + $schedule->interest + $schedule->penalty + $schedule->fees);
                            } else {
                                $payments = 0;
                                $overdue_date = $schedule->due_date;
                                break;
                            }
                        }
                    } else {
                        $overdue_date = $schedules->first()->due_date;
                    }
                    $date1 = new \DateTime($overdue_date);
                    $date2 = new \DateTime($end_date);
                    $days_arrears = $date2->diff($date1)->format("%a");
                    $transaction = LoanTransaction::where('loan_id',
                        $key->id)->where('transaction_type',
                        'repayment')->where('reversed', 0)->orderBy('date', 'desc')->first();
                    if (!empty($transaction)) {
                        $date2 = new \DateTime($transaction->date);
                        $date1 = new \DateTime($end_date);
                        $days_last_payment = $date2->diff($date1)->format("%r%a");
                    } else {
                        $days_last_payment = 0;
                    }
                } else {
                    $days_arrears = 0;
                }
                //find the classification
                if ($days_arrears < 30) {
                    $classification = translate('current', 1);
                    $provision_rate = ProvisionRate::find(1)->rate;
                    $provision = $provision_rate * $principal / 100;
                    $total_provisioning_amount = $total_provisioning_amount + $provision;
                } elseif ($days_arrears > 30 && $days_arrears < 61) {
                    $classification = translate('especially_mentioned', 1);
                    $provision_rate = ProvisionRate::find(2)->rate;
                    $provision = $provision_rate * $principal / 100;
                    $total_provisioning_amount = $total_provisioning_amount + $provision;
                } elseif ($days_arrears > 60 && $days_arrears < 91) {
                    $classification = translate('substandard', 1);
                    $provision_rate = ProvisionRate::find(3)->rate;
                    $provision = $provision_rate * $principal / 100;
                    $total_provisioning_amount = $total_provisioning_amount + $provision;
                } elseif ($days_arrears > 90 && $days_arrears < 181) {
                    $classification = translate('doubtful', 1);
                    $provision_rate = ProvisionRate::find(4)->rate;
                    $provision = $provision_rate * $principal / 100;
                    $total_provisioning_amount = $total_provisioning_amount + $provision;
                } elseif ($days_arrears > 180) {
                    $classification = translate('loss', 1);
                    $provision_rate = ProvisionRate::find(5)->rate;
                    $provision = $provision_rate * $principal / 100;
                    $total_provisioning_amount = $total_provisioning_amount + $provision;
                }
                $data[] = [
                    $loan_officer,
                    $borrower,
                    $key->id,
                    $loan_product,
                    $key->principal,
                    $key->release_date,
                    $key->maturity_date,
                    number_format($principal, 2),
                    number_format($interest, 2),
                    number_format($fees, 2),
                    number_format($penalty, 2),
                    number_format($due, 2),
                    $days_arrears,
                    number_format($arrears, 2),
                    number_format($provision_rate, 2),
                    number_format($provision, 2),
                    $classification,
                ];
            }
            $data[] = [
                "",
                "",
                "",
                "",
                number_format($total_amount, 2),
                "",
                "",
                number_format($total_principal, 2),
                number_format($total_interest, 2),
                number_format($total_fees, 2),
                number_format($total_penalty, 2),
                number_format($total_outstanding, 2),
                "",
                number_format($total_arrears, 2),
                "",
                number_format($total_provisioning_amount, 2),
                "",
            ];

            Excel::create(translate('provisioning report'),
                function ($excel) use ($data) {
                    $excel->sheet('Sheet', function ($sheet) use ($data) {
                        $sheet->fromArray($data, null, 'A1', false, false);
                        $sheet->mergeCells('A1:Q1');
                    });

                })->download('xls');
        }


    }

    public function provisioning_csv(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        if (!empty($end_date)) {

            $data = [];
            $data[] = [
                translate('provisioning report')
            ];
            $data[] = [
                "",
                "",
                "",
                "",
                "",
                "",
                "",
                translate('outstanding'),
                "",
                "",
                "",
                "",
                translate('arrears'),
                "",
                translate('provisioning'),
                "",
                "",
            ];
            $data[] = [
                translate('loan_officer'),
                translate('borrower'),
                translate('loan  id'),
                translate('product'),
                translate('amount'),
                translate('disbursed'),
                translate('maturity date'),
                translate('principal'),
                translate('interest'),
                translate('fee'),
                translate('penalty'),
                translate('total'),
                translate('day'),
                translate('amount'),
                translate('percentage'),
                translate('amount'),
                translate('classification'),
            ];
            $total_outstanding = 0;
            $total_arrears = 0;
            $total_principal = 0;
            $total_interest = 0;
            $total_fees = 0;
            $total_penalty = 0;
            $total_provisioning_amount = 0;
            $total_amount = 0;
            foreach (Loan::where('release_date', '<=', $end_date)->where('branch_id',
                session('branch_id'))->where('status', 'disbursed')->orderBy('release_date', 'asc')->get() as $key) {
                $loan_due_items = \App\Helpers\GeneralHelper::loan_due_items($key->id);
                $loan_due_items_arrears = \App\Helpers\GeneralHelper::loan_due_items($key->id,
                    $key->release_date, $end_date);
                $loan_paid_items = \App\Helpers\GeneralHelper::loan_paid_items($key->id,
                    $key->release_date, $end_date);
                $due = ($loan_due_items["principal"] + $loan_due_items["interest"] + $loan_due_items["fees"] + $loan_due_items["penalty"]) - ($loan_paid_items["principal"] + $loan_paid_items["interest"] + $loan_paid_items["fees"] + $loan_paid_items["penalty"]);
                $principal = $loan_due_items["principal"] - $loan_paid_items["principal"];
                $interest = $loan_due_items["interest"] - $loan_paid_items["interest"];
                $fees = $loan_due_items["fees"] - $loan_paid_items["fees"];
                $penalty = $loan_due_items["penalty"] - $loan_paid_items["penalty"];
                $arrears = ($loan_due_items_arrears["principal"] + $loan_due_items_arrears["interest"] + $loan_due_items_arrears["fees"] + $loan_due_items_arrears["penalty"]) - ($loan_paid_items["principal"] + $loan_paid_items["interest"] + $loan_paid_items["fees"] + $loan_paid_items["penalty"]);
                $total_outstanding = $total_outstanding + $due;
                $total_arrears = $total_arrears + $arrears;
                $total_principal = $total_principal + $principal;
                $total_interest = $total_interest + $interest;
                $total_fees = $total_fees + $fees;
                $total_penalty = $total_penalty + $penalty;
                $total_amount = $total_amount + $key->principal;

                if (!empty($key->borrower)) {
                    $borrower = $key->borrower->first_name . " " . $key->borrower->last_name;
                    $borrower_phone = $key->borrower->mobile;
                } else {
                    $borrower = "";
                    $borrower_phone = "";
                }
                if (!empty($key->loan_officer)) {
                    $loan_officer = $key->loan_officer->first_name . " " . $key->loan_officer->last_name;
                } else {
                    $loan_officer = "";
                }
                if (!empty($key->loan_product)) {
                    $loan_product = $key->loan_product->name;
                } else {
                    $loan_product = "";
                }

                if ($due > 0) {
                    //lets find arrears information
                    $schedules = LoanSchedule::where('loan_id', $key->id)->where('due_date', '<=',
                        $end_date)->orderBy('due_date', 'asc')->get();
                    $payments = $loan_paid_items["principal"] + $loan_paid_items["interest"] + $loan_paid_items["fees"] + $loan_paid_items["penalty"];
                    if ($payments > 0) {
                        foreach ($schedules as $schedule) {
                            if ($payments > $schedule->principal + $schedule->interest + $schedule->penalty + $schedule->fees) {
                                $payments = $payments - ($schedule->principal + $schedule->interest + $schedule->penalty + $schedule->fees);
                            } else {
                                $payments = 0;
                                $overdue_date = $schedule->due_date;
                                break;
                            }
                        }
                    } else {
                        $overdue_date = $schedules->first()->due_date;
                    }
                    $date1 = new \DateTime($overdue_date);
                    $date2 = new \DateTime($end_date);
                    $days_arrears = $date2->diff($date1)->format("%a");
                    $transaction = LoanTransaction::where('loan_id',
                        $key->id)->where('transaction_type',
                        'repayment')->where('reversed', 0)->orderBy('date', 'desc')->first();
                    if (!empty($transaction)) {
                        $date2 = new \DateTime($transaction->date);
                        $date1 = new \DateTime($end_date);
                        $days_last_payment = $date2->diff($date1)->format("%r%a");
                    } else {
                        $days_last_payment = 0;
                    }
                } else {
                    $days_arrears = 0;
                }
                //find the classification
                if ($days_arrears < 30) {
                    $classification = translate('current', 1);
                    $provision_rate = ProvisionRate::find(1)->rate;
                    $provision = $provision_rate * $principal / 100;
                    $total_provisioning_amount = $total_provisioning_amount + $provision;
                } elseif ($days_arrears > 30 && $days_arrears < 61) {
                    $classification = translate('especially_mentioned', 1);
                    $provision_rate = ProvisionRate::find(2)->rate;
                    $provision = $provision_rate * $principal / 100;
                    $total_provisioning_amount = $total_provisioning_amount + $provision;
                } elseif ($days_arrears > 60 && $days_arrears < 91) {
                    $classification = translate('substandard', 1);
                    $provision_rate = ProvisionRate::find(3)->rate;
                    $provision = $provision_rate * $principal / 100;
                    $total_provisioning_amount = $total_provisioning_amount + $provision;
                } elseif ($days_arrears > 90 && $days_arrears < 181) {
                    $classification = translate('doubtful', 1);
                    $provision_rate = ProvisionRate::find(4)->rate;
                    $provision = $provision_rate * $principal / 100;
                    $total_provisioning_amount = $total_provisioning_amount + $provision;
                } elseif ($days_arrears > 180) {
                    $classification = translate('loss', 1);
                    $provision_rate = ProvisionRate::find(5)->rate;
                    $provision = $provision_rate * $principal / 100;
                    $total_provisioning_amount = $total_provisioning_amount + $provision;
                }
                $data[] = [
                    $loan_officer,
                    $borrower,
                    $key->id,
                    $loan_product,
                    $key->principal,
                    $key->release_date,
                    $key->maturity_date,
                    number_format($principal, 2),
                    number_format($interest, 2),
                    number_format($fees, 2),
                    number_format($penalty, 2),
                    number_format($due, 2),
                    $days_arrears,
                    number_format($arrears, 2),
                    number_format($provision_rate, 2),
                    number_format($provision, 2),
                    $classification,
                ];
            }
            $data[] = [
                "",
                "",
                "",
                "",
                number_format($total_amount, 2),
                "",
                "",
                number_format($total_principal, 2),
                number_format($total_interest, 2),
                number_format($total_fees, 2),
                number_format($total_penalty, 2),
                number_format($total_outstanding, 2),
                "",
                number_format($total_arrears, 2),
                "",
                number_format($total_provisioning_amount, 2),
                "",
            ];

            Excel::create(translate('provisioning report'),
                function ($excel) use ($data) {
                    $excel->sheet('Sheet', function ($sheet) use ($data) {
                        $sheet->fromArray($data, null, 'A1', false, false);
                        $sheet->mergeCells('A1:Q1');
                    });

                })->download('csv');
        }


    }

    public function products_summary(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }

        $date_range = $this->getDateRange($request->date_range);
        $start_date = $date_range->start_date;
        $end_date = $date_range->end_date;

        $loan_products = LoanProduct::query()
            ->withCount(['loans' => function ($query) use ($start_date, $end_date) {
            return $query->where('branch_id', session('branch_id'))
                ->whereIn('status', ['disbursed', 'closed', 'written_off'])
                ->whereBetween('release_date', [$start_date, $end_date]);
        }])
            ->with([
                'loans' => function ($query) use ($start_date, $end_date) {
                    $query->whereIn('status', ['disbursed', 'closed', 'written_off'])
                    ->whereBetween('release_date', [$start_date, $end_date])
                    ->with([
                        'schedules'
                    ])
                    ->orderBy('id', 'ASC');
                },
                'schedules',
            ])
            ->transactions_sum_payment($start_date,$end_date)
            ->transactions_sum_waived($start_date, $end_date)
            ->get();

        return view('company_report.products_summary', compact('start_date', 'end_date', 'loan_products'));
    }

    public function products_summary_pdf(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }

        $date_range = $this->getDateRange($request->date_range);
        $start_date = $date_range->start_date;
        $end_date = $date_range->end_date;

        $loan_products = LoanProduct::query()
            ->withCount(['loans' => function ($query) use ($start_date, $end_date) {
                return $query->where('branch_id', session('branch_id'))
                ->whereIn('status', ['disbursed', 'closed', 'written_off'])
                ->whereBetween('release_date', [$start_date, $end_date]);
            }])
            ->with([
                'loans' => function ($query) use ($start_date, $end_date) {
                    $query->whereIn('status', ['disbursed', 'closed', 'written_off'])
                    ->whereBetween('release_date', [$start_date, $end_date])
                        ->with([
                            'schedules'
                        ])
                        ->orderBy('id', 'ASC');
                },
                'schedules',
            ])
            ->transactions_sum_payment($start_date, $end_date)
            ->transactions_sum_waived($start_date, $end_date)
            ->get();

        $filename = translate('product summary')  . ' - ' . $request->start_date . '-' . $request->end_date . '.pdf';

        $pdf = Pdf::loadView('company_report.products_summary_pdf', compact('start_date', 'end_date', 'loan_products'));
        $pdf->setPaper('A4', 'landscape');
        return $pdf->download($filename);

    }

    public function products_summary_excel(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $date_range = $this->getDateRange($request->date_range);
        $start_date = $date_range->start_date;
        $end_date = $date_range->end_date;

        $loan_products = LoanProduct::query()
            ->withCount(['loans' => function ($query) use ($start_date, $end_date) {
                return $query->where('branch_id', session('branch_id'))
                ->whereIn('status', ['disbursed', 'closed', 'written_off'])
                ->whereBetween('release_date', [$start_date, $end_date]);
            }])
            ->with([
                'loans' => function ($query) use ($start_date, $end_date) {
                    $query->whereIn('status', ['disbursed', 'closed', 'written_off'])
                    ->whereBetween('release_date', [$start_date, $end_date])
                        ->with([
                            'schedules'
                        ])
                        ->orderBy('id', 'ASC');
                },
                'schedules',
            ])
            ->transactions_sum_payment($start_date, $end_date)
            ->transactions_sum_waived($start_date, $end_date)
            ->get();

        $data = [];

        $data[] = [
            translate('name'),
            translate('loan'),
            translate('principal'),
            translate('interest'),
            translate('fee'),
            translate('total'),
            translate('principal'),
            translate('interest'),
            translate('fee'),
            translate('penalty'),
            translate('total'),
        ];
        $total_disbursed = 0;
        $total_disbursed_loans = 0;
        $total_disbursed_principal = 0;
        $total_disbursed_interest = 0;
        $total_disbursed_fees = 0;
        $total_disbursed_penalty = 0;
        $total_outstanding = 0;
        $total_outstanding_principal = 0;
        $total_outstanding_interest = 0;
        $total_outstanding_fees = 0;
        $total_outstanding_penalty = 0;
        foreach($loan_products as $key) {
            $principal_disbursed = 0;
            $interest_disbursed = 0;
            $fees_disbursed = 0;
            $penalty_disbursed = 0;
            $principal_outstanding = 0;
            $interest_outstanding = 0;
            $fees_outstanding = 0;
            $penalty_outstanding = 0;
            $disbursed_loans = 0;
            $disbursed = 0;
            $outstanding = 0;
            //loop through loans, this will need to be improved
            foreach($key->loans as $loan) {
                $disbursed_loans = $disbursed_loans + 1;
                // $loan_due_items = \App\Helpers\GeneralHelper::loan_due_items($loan->id); // old used $key->id => means loan product id
                // $loan_paid_items = \App\Helpers\GeneralHelper::loan_paid_items($key->id);
                $loan_due_items = $key->loan_due_items($loan->schedules);
                $loan_paid_items = $key->loan_paid_items();
                $principal_disbursed = $principal_disbursed + $loan_due_items["principal"];
                $interest_disbursed = $interest_disbursed + $loan_due_items["interest"];
                $fees_disbursed = $fees_disbursed + $loan_due_items["fees"];
                $penalty_disbursed = $penalty_disbursed + $loan_due_items["penalty"];
                $principal_outstanding = $principal_outstanding + $loan_due_items["principal"] - $loan_paid_items["principal"];
                $interest_outstanding = $interest_outstanding + $loan_due_items["interest"] - $loan_paid_items["interest"];
                $fees_outstanding = $fees_outstanding + $loan_due_items["fees"] - $loan_paid_items["fees"];
                $penalty_outstanding = $penalty_outstanding + $loan_due_items["penalty"] - $loan_paid_items["penalty"];
            }
            $disbursed = $principal_disbursed + $interest_disbursed + $fees_disbursed;
            $outstanding = $principal_outstanding + $interest_outstanding + $fees_outstanding + $penalty_outstanding;
            $total_disbursed = $total_disbursed + $disbursed;
            $total_disbursed_loans = $total_disbursed_loans + $disbursed_loans;
            $total_disbursed_principal = $total_disbursed_principal + $principal_disbursed;
            $total_disbursed_interest = $total_disbursed_interest + $interest_disbursed;
            $total_disbursed_fees = $total_disbursed_fees + $fees_disbursed;
            $total_disbursed_penalty = $total_disbursed_penalty + $penalty_disbursed;
            $total_outstanding_principal = $total_outstanding_principal + $principal_outstanding;
            $total_outstanding_interest = $total_outstanding_interest + $interest_outstanding;
            $total_outstanding_fees = $total_outstanding_fees + $fees_outstanding;
            $total_outstanding_penalty = $total_outstanding_penalty + $penalty_outstanding;
            $total_outstanding = $total_outstanding + $principal_outstanding + $interest_outstanding + $fees_outstanding + $penalty_outstanding;

            $data[] = [
                $key->name,
                $disbursed_loans,
                number_format($principal_disbursed, 2),
                number_format($interest_disbursed, 2),
                number_format($fees_disbursed, 2),
                number_format($disbursed, 2),
                number_format($principal_outstanding, 2),
                number_format($interest_outstanding, 2),
                number_format($fees_outstanding, 2),
                number_format($penalty_outstanding, 2),
                number_format($outstanding, 2),
            ];
        }
        $data[] = [
            "",
            $total_disbursed_loans,
            number_format($total_disbursed_principal, 2),
            number_format($total_disbursed_interest, 2),
            number_format($total_disbursed_fees, 2),
            number_format($total_disbursed, 2),
            number_format($total_outstanding_principal, 2),
            number_format($total_outstanding_interest, 2),
            number_format($total_outstanding_fees, 2),
            number_format($total_outstanding_penalty, 2),
            number_format($total_outstanding, 2),
        ];

        $filename = translate('product summary')  . ' - ' . $request->start_date . '-' . $request->end_date . '.xlsx';

        return Excel::download(new ReportProductSummary($data), $filename , \Maatwebsite\Excel\Excel::XLSX);

    }

    public function products_summary_csv(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $date_range = $this->getDateRange($request->date_range);
        $start_date = $date_range->start_date;
        $end_date = $date_range->end_date;

        $data = [];

        $data[] = [
            translate('name'),
            translate('loan'),
            translate('principal'),
            translate('interest'),
            translate('fee'),
            translate('total'),
            translate('principal'),
            translate('interest'),
            translate('fee'),
            translate('penalty'),
            translate('total'),
        ];

        $total_disbursed = 0;
        $total_disbursed_loans = 0;
        $total_disbursed_principal = 0;
        $total_disbursed_interest = 0;
        $total_disbursed_fees = 0;
        $total_disbursed_penalty = 0;
        $total_outstanding = 0;
        $total_outstanding_principal = 0;
        $total_outstanding_interest = 0;
        $total_outstanding_fees = 0;
        $total_outstanding_penalty = 0;
        foreach (LoanProduct::get() as $key) {
            $principal_disbursed = 0;
            $interest_disbursed = 0;
            $fees_disbursed = 0;
            $penalty_disbursed = 0;
            $principal_outstanding = 0;
            $interest_outstanding = 0;
            $fees_outstanding = 0;
            $penalty_outstanding = 0;
            $disbursed_loans = 0;
            $disbursed = 0;
            $outstanding = 0;
            //loop through loans, this will need to be improved
            foreach (Loan::where('loan_product_id', $key->id)->where('branch_id',
                session('branch_id'))->whereIn('status',
                ['disbursed', 'closed', 'written_off'])->whereBetween('release_date',
                [$start_date, $end_date])->get() as $loan) {
                $disbursed_loans = $disbursed_loans + 1;
                $loan_due_items = \App\Helpers\GeneralHelper::loan_due_items($key->id);
                $loan_paid_items = \App\Helpers\GeneralHelper::loan_paid_items($key->id);
                $principal_disbursed = $principal_disbursed + $loan_due_items["principal"];
                $interest_disbursed = $interest_disbursed + $loan_due_items["interest"];
                $fees_disbursed = $fees_disbursed + $loan_due_items["fees"];
                $penalty_disbursed = $penalty_disbursed + $loan_due_items["penalty"];
                $principal_outstanding = $principal_outstanding + $loan_due_items["principal"] - $loan_paid_items["principal"];
                $interest_outstanding = $interest_outstanding + $loan_due_items["interest"] - $loan_paid_items["interest"];
                $fees_outstanding = $fees_outstanding + $loan_due_items["fees"] - $loan_paid_items["fees"];
                $penalty_outstanding = $penalty_outstanding + $loan_due_items["penalty"] - $loan_paid_items["penalty"];
            }
            $disbursed = $principal_disbursed + $interest_disbursed + $fees_disbursed;
            $outstanding = $principal_outstanding + $interest_outstanding + $fees_outstanding + $penalty_outstanding;
            $total_disbursed = $total_disbursed + $disbursed;
            $total_disbursed_loans = $total_disbursed_loans + $disbursed_loans;
            $total_disbursed_principal = $total_disbursed_principal + $principal_disbursed;
            $total_disbursed_interest = $total_disbursed_interest + $interest_disbursed;
            $total_disbursed_fees = $total_disbursed_fees + $fees_disbursed;
            $total_disbursed_penalty = $total_disbursed_penalty + $penalty_disbursed;
            $total_outstanding_principal = $total_outstanding_principal + $principal_outstanding;
            $total_outstanding_interest = $total_outstanding_interest + $interest_outstanding;
            $total_outstanding_fees = $total_outstanding_fees + $fees_outstanding;
            $total_outstanding_penalty = $total_outstanding_penalty + $penalty_outstanding;
            $total_outstanding = $total_outstanding + $principal_outstanding + $interest_outstanding + $fees_outstanding + $penalty_outstanding;

            $data[] = [
                $key->name,
                $disbursed_loans,
                number_format($principal_disbursed, 2),
                number_format($interest_disbursed, 2),
                number_format($fees_disbursed, 2),
                number_format($disbursed, 2),
                number_format($principal_outstanding, 2),
                number_format($interest_outstanding, 2),
                number_format($fees_outstanding, 2),
                number_format($penalty_outstanding, 2),
                number_format($outstanding, 2),
            ];
        }
        $data[] = [
            "",
            $total_disbursed_loans,
            number_format($total_disbursed_principal, 2),
            number_format($total_disbursed_interest, 2),
            number_format($total_disbursed_fees, 2),
            number_format($total_disbursed, 2),
            number_format($total_outstanding_principal, 2),
            number_format($total_outstanding_interest, 2),
            number_format($total_outstanding_fees, 2),
            number_format($total_outstanding_penalty, 2),
            number_format($total_outstanding, 2),
        ];

        return Excel::download(new ReportProductSummary($data), translate('product summary') . '.csv', \Maatwebsite\Excel\Excel::CSV);

    }

    public function general_report(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }

        $date_range = $this->getDateRange($request->date_range);
        $start_date = $date_range->start_date;
        $end_date = $date_range->end_date;

        //loan product pie data
        $loan_product_data = [];
        foreach (LoanProduct::all() as $key) {
            $count = Loan::query()
                ->where('loan_product_id', $key->id)
                ->where('branch_id', session('branch_id'))
                ->whereIn('status', ['disbursed', 'closed', 'written_off', 'rescheduled'])
                ->whereBetween('release_date', [$start_date, $end_date])->count();
            $loan_product_data[] = array(
                'product' => $key->name,
                'value' => $count
            );
        }
        $monthly_net_income_data = array();
        $loop_date = date_format(date_sub(date_create($end_date), date_interval_create_from_date_string('1 years')), 'Y-m-d');
        for ($i = 1; $i < 14; $i++) {
            $d = explode('-', $loop_date);
            //get loans in that period
            $total_income = 0;
            foreach (ChartOfAccount::where('account_type', 'income')->get() as $key) {
                $cr = JournalEntry::where('account_id', $key->id)->where('year',
                    $d[0])->where('month',
                    $d[1])->where('branch_id',
                    session('branch_id'))->sum('credit');
                $dr = JournalEntry::where('account_id', $key->id)->where('year',
                    $d[0])->where('month',
                    $d[1])->where('branch_id',
                    session('branch_id'))->sum('debit');
                $balance = $cr - $dr;
                $total_income = $total_income + $balance;
            }
            $total_expenses = 0;
            foreach (ChartOfAccount::where('account_type', 'expense')->get() as $key) {
                $cr = JournalEntry::where('account_id', $key->id)->where('year',
                    $d[0])->where('month',
                    $d[1])->where('branch_id',
                    session('branch_id'))->sum('credit');
                $dr = JournalEntry::where('account_id', $key->id)->where('year',
                    $d[0])->where('month',
                    $d[1])->where('branch_id',
                    session('branch_id'))->sum('debit');
                $balance = $dr - $cr;
                $total_expenses = $total_expenses + $balance;
            }
            $monthly_net_income_data[] = array(
                'month' => date_format(date_create($loop_date),
                    'M' . ' ' . $d[0]),
                'income' => $total_income,
                'expenses' => $total_expenses
            );
            //add 1 month to start date
            $loop_date = date_format(date_add(date_create($loop_date),
                date_interval_create_from_date_string('1 months')),
                'Y-m-d');
        }
        //user registrations
        $monthly_borrower_data = [];
        $loop_date = date_format(date_sub(date_create($end_date),
            date_interval_create_from_date_string('1 years')),
            'Y-m-d');
        for ($i = 1; $i < 14; $i++) {
            $d = explode('-', $loop_date);
            //get loans in that period
            $count = Borrower::where('year',
                $d[0])->where('month',
                $d[1])->where('branch_id',
                session('branch_id'))->count();
            $monthly_borrower_data[] = array(
                'month' => date_format(date_create($loop_date),
                    'M' . ' ' . $d[0]),
                'value' => $count,
            );
            //add 1 month to start date
            $loop_date = date_format(date_add(date_create($loop_date),
                date_interval_create_from_date_string('1 months')),
                'Y-m-d');
        }
        $monthly_repayments_data = [];
        $loop_date = date_format(date_sub(date_create($end_date),
            date_interval_create_from_date_string('1 years')),
            'Y-m-d');
        for ($i = 1; $i < 14; $i++) {
            $d = explode('-', $loop_date);
            //get loans in that period
            $amount = LoanTransaction::where('transaction_type',
                'repayment')->where('reversed', 0)->where('year',
                $d[0])->where('month',
                $d[1])->where('branch_id',
                session('branch_id'))->sum('credit');
            $monthly_repayments_data[] = array(
                'month' => date_format(date_create($loop_date),
                    'M' . ' ' . $d[0]),
                'value' => $amount,
            );
            //add 1 month to start date
            $loop_date = date_format(date_add(date_create($loop_date),
                date_interval_create_from_date_string('1 months')),
                'Y-m-d');
        }
        $monthly_actual_expected_data = [];
        $monthly_disbursed_loans_data = [];
        $loop_date = date_format(date_sub(date_create($end_date),
            date_interval_create_from_date_string('1 years')),
            'Y-m-d');
        for ($i = 1; $i < 14; $i++) {
            $d = explode('-', $loop_date);
            $actual = 0;
            $expected = 0;
            $principal = 0;
            $actual = $actual + LoanTransaction::where('transaction_type',
                    'repayment')->where('reversed', 0)->where('year',
                    $d[0])->where('month',
                    $d[1])->where('branch_id',
                    session('branch_id'))->sum('credit');
            foreach (Loan::select("loan_schedules.principal", "loan_schedules.interest", "loan_schedules.penalty",
                "loan_schedules.fees")->where('loans.branch_id',
                session('branch_id'))->whereIn('loans.status',
                ['disbursed', 'closed', 'written_off'])->join('loan_schedules', 'loans.id', '=',
                'loan_schedules.loan_id')->where('loan_schedules.deleted_at', NULL)->where('loan_schedules.year',
                $d[0])->where('loan_schedules.month',
                $d[1])->get() as $key) {
                $expected = $expected + $key->interest + $key->penalty + $key->fees + $key->principal;
                $principal = $principal + $key->principal;

            }
            $monthly_actual_expected_data[] = array(
                'month' => date_format(date_create($loop_date),
                    'M' . ' ' . $d[0]),
                'actual' => $actual,
                'expected' => $expected
            );
            $monthly_disbursed_loans_data[] = array(
                'month' => date_format(date_create($loop_date),
                    'M' . ' ' . $d[0]),
                'value' => $principal,
            );
            //add 1 month to start date
            $loop_date = date_format(date_add(date_create($loop_date),
                date_interval_create_from_date_string('1 months')),
                'Y-m-d');
        }

        $loan_product_data = json_encode($loan_product_data);
        $monthly_net_income_data = json_encode($monthly_net_income_data);
        $monthly_borrower_data = json_encode($monthly_borrower_data);
        $monthly_repayments_data = json_encode($monthly_repayments_data);
        $monthly_actual_expected_data = json_encode($monthly_actual_expected_data);
        $monthly_disbursed_loans_data = json_encode($monthly_disbursed_loans_data);
        return view('company_report.general_report', compact('loan_product_data', 'monthly_net_income_data', 'monthly_borrower_data', 'monthly_repayments_data', 'monthly_actual_expected_data', 'monthly_disbursed_loans_data', 'start_date', 'end_date'));
    }

    public function journal(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;

        return view('financial_report.journal', compact('start_date', 'end_date'));
    }

    public function ledger(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;

        return view('financial_report.ledger', compact('start_date', 'end_date'));
    }

    public function savings_transactions(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        if (!empty($start_date)) {
            $data = SavingTransaction::where('reversed', 0)->where('branch_id',
                session('branch_id'))->whereBetween('date',
                [$start_date, $end_date])->get();
        }
        return view('savings_report.savings_transactions', compact('start_date', 'end_date', 'data'));
    }

    public function savings_transactions_pdf(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        if (!empty($start_date)) {
            $data = SavingTransaction::where('reversed', 0)->where('branch_id',
                session('branch_id'))->whereBetween('date',
                [$start_date, $end_date])->get();
            $pdf = Pdf::loadView('savings_report.savings_transactions_pdf', compact('start_date',
                'end_date', 'data'));
            $pdf->setPaper('A4', 'landscape');
            return $pdf->download(translate('saving transaction') . ".pdf");
        }


    }

    public function savings_transactions_excel(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        if (!empty($start_date)) {
            $data = [];
            $data[] = [
                translate('saving transaction')
            ];
            $data[] = [
                translate('borrower'),
                translate('account'),
                translate('type'),
                translate('debit'),
                translate('credit'),
                translate('date'),
                translate('receipt'),
                translate('payment  method'),
            ];
            $total_deposited = 0;
            $total_withdrawn = 0;
            $cr = 0;
            $dr = 0;
            foreach (SavingTransaction::where('reversed', 0)->where('branch_id',
                session('branch_id'))->whereBetween('date',
                [$start_date, $end_date])->get() as $key) {
                $dr = $dr + $key->debit;
                $cr = $cr + $key->credit;
                if (!empty($key->borrower)) {
                    $borrower = $key->borrower->first_name . " " . $key->borrower->last_name;
                } else {
                    $borrower = "";
                }
                if (!empty($key->payment_method)) {
                    $payment_method = $key->payment_method->name;
                } else {
                    $payment_method = "";
                }
                if (!empty($key->savings)) {
                    if (!empty($key->savings->savings_product)) {
                        $savings_product = $key->savings->savings_product->name;
                    } else {
                        $savings_product = "";
                    }

                } else {
                    $savings_product = "";
                }
                $data[] = [
                    $borrower,
                    $key->savings_id,
                    $savings_product,
                    number_format($key->debit, 2),
                    number_format($key->credit, 2),
                    $key->date,
                    $key->receipt,
                    $payment_method,
                ];
            }
            $data[] = [
                "",
                "",
                "",
                number_format($dr, 2),
                number_format($cr, 2),
                "",
                "",
                "",
            ];

            Excel::create(translate('saving transaction'),
                function ($excel) use ($data) {
                    $excel->sheet('Sheet', function ($sheet) use ($data) {
                        $sheet->fromArray($data, null, 'A1', false, false);
                    });

                })->download('xls');
        }


    }

    public function savings_transactions_csv(Request $request)
    {
        if (!Sentinel::hasAccess('reports')) {
            Flash::warning("Permission Denied");
            return redirect('/');
        }
        $start_date = $request->start_date;
        $end_date = $request->end_date;
        if (!empty($start_date)) {
            $data = [];
            $data[] = [
                translate('saving transaction')
            ];
            $data[] = [
                translate('borrower'),
                translate('account'),
                translate('type'),
                translate('debit'),
                translate('credit'),
                translate('date'),
                translate('receipt'),
                translate('payment method'),
            ];
            $total_deposited = 0;
            $total_withdrawn = 0;
            $cr = 0;
            $dr = 0;
            foreach (SavingTransaction::where('reversed', 0)->where('branch_id',
                session('branch_id'))->whereBetween('date',
                [$start_date, $end_date])->get() as $key) {
                $dr = $dr + $key->debit;
                $cr = $cr + $key->credit;
                if (!empty($key->borrower)) {
                    $borrower = $key->borrower->first_name . " " . $key->borrower->last_name;
                } else {
                    $borrower = "";
                }
                if (!empty($key->payment_method)) {
                    $payment_method = $key->payment_method->name;
                } else {
                    $payment_method = "";
                }
                if (!empty($key->savings)) {
                    if (!empty($key->savings->savings_product)) {
                        $savings_product = $key->savings->savings_product->name;
                    } else {
                        $savings_product = "";
                    }

                } else {
                    $savings_product = "";
                }
                $data[] = [
                    $borrower,
                    $key->savings_id,
                    $savings_product,
                    number_format($key->debit, 2),
                    number_format($key->credit, 2),
                    $key->date,
                    $key->receipt,
                    $payment_method,
                ];
            }
            $data[] = [
                "",
                "",
                "",
                number_format($dr, 2),
                number_format($cr, 2),
                "",
                "",
                "",
            ];

            Excel::create(translate('saving transaction'),
                function ($excel) use ($data) {
                    $excel->sheet('Sheet', function ($sheet) use ($data) {
                        $sheet->fromArray($data, null, 'A1', false, false);
                        //$sheet->mergeCells('A1:J1');
                    });

                })->download('csv');
        }


    }
}

© KUJUNTI.ID