Path : /var/www/html/usd_loan_system/app/Http/Controllers/ |
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'); } } }