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

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

Current File : /var/www/html/thb_loan_system/app/Http/Controllers/LoanControllerCopy.php


<?php

namespace App\Http\Controllers;

use Aloha\Twilio\Twilio;
use App\Helpers\GeneralHelper;
use App\Helpers\Infobip;
use App\Helpers\RouteSms;
use App\Models\CustomField;
use App\Models\CustomFieldMeta;
use App\Models\Email;
use App\Models\Loan;
use App\Models\LoanApplication;
use App\Models\LoanFee;
use App\Models\LoanFeeMeta;
use App\Models\LoanProduct;
use App\Models\LoanRepayment;
use App\Models\LoanRepaymentMethod;
use App\Models\LoanDisbursedBy;
use App\Models\Borrower;
use App\Models\LoanSchedule;
use App\Models\Setting;
use App\Models\Sms;
use Cartalyst\Sentinel\Laravel\Facades\Sentinel;
use Clickatell\Api\ClickatellHttp;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\View;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Validator;
use Laracasts\Flash\Flash;

class LoanControllerCopy extends Controller
{
    public function __construct()
    {
        $this->middleware('sentinel');
    }


    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {
        if (!Sentinel::hasAccess('loans')) {
            Flash::warning(translate('permission_denied'));
            return redirect('/');
        }
        if (empty($request->status)) {
            $data = Loan::orderBy('id','desc')->get();
        } else {
            $data = Loan::where('status', $request->status)->orderBy('id','desc')->get();
        }

        return view('loan.data', compact('data'));
    }

    public function create(Request $request)
    {
        if (!Sentinel::hasAccess('loans.create')) {
            Flash::warning(translate('permission_denied'));
            return redirect('/');
        }
        $borrowers = array();
        foreach (Borrower::all() as $key) {
            $borrowers[$key->id] = $key->first_name . ' ' . $key->last_name . '(' . $key->unique_number . ')';
        }
        $loan_products = array();
        foreach (LoanProduct::all() as $key) {
            $loan_products[$key->id] = $key->name;
        }

        $loan_disbursed_by = array();
        foreach (LoanDisbursedBy::all() as $key) {
            $loan_disbursed_by[$key->id] = $key->name;
        }
        if (isset($request->product_id)) {
            $loan_product = LoanProduct::find($request->product_id);
        } else {
            $loan_product = LoanProduct::first();
        }
        if (isset($request->borrower_id)) {
            $borrower_id = $request->borrower_id;
        } else {
            $borrower_id = '';
        }
        if (empty($loan_product)) {
            Flash::warning("No loan product set. You must first set a loan product");
            return redirect()->back();
        }
        //get custom fields
        $custom_fields = CustomField::where('category', 'loans')->get();
        $loan_fees = LoanFee::all();
        return view('loan.create',
            compact('borrowers', 'loan_disbursed_by', 'loan_products', 'loan_product', 'borrower_id', 'custom_fields',
                'loan_fees'));
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        if (!Sentinel::hasAccess('loans.create')) {
            Flash::warning(translate('permission_denied'));
            return redirect('/');
        }
        $loan = new Loan();
        $loan->loan_disbursed_by_id = $request->loan_disbursed_by_id;
        $loan->principal = $request->principal;
        $loan->interest_method = $request->interest_method;
        $loan->interest_rate = $request->interest_rate;
        $loan->interest_period = $request->interest_period;
        $loan->loan_duration = $request->loan_duration;
        $loan->loan_duration_type = $request->loan_duration_type;
        $loan->repayment_cycle = $request->repayment_cycle;
        $loan->decimal_places = $request->decimal_places;
        $loan->repayment_order = $request->repayment_order;
        $loan->override_interest = $request->override_interest;
        $loan->override_interest_amount = $request->override_interest_amount;
        $loan->grace_on_interest_charged = $request->grace_on_interest_charged;
        $loan->borrower_id = $request->borrower_id;
        $loan->user_id = Sentinel::getUser()->id;
        $loan->loan_product_id = $request->loan_product_id;
        $loan->release_date = $request->release_date;
        $date = explode('-', $request->release_date);
        $loan->month = $date[1];
        $loan->year = $date[0];
        $loan->first_payment_date = $request->first_payment_date;
        $loan->description = $request->description;
        $files = array();
        if (!empty(array_filter($request->file('files')))) {
            $count = 0;
            foreach ($request->file('files') as $key) {
                $file = array('files' => $key);
                $rules = array('files' => 'required|mimes:jpeg,jpg,bmp,png,pdf,docx,xlsx');
                $validator = Validator::make($file, $rules);
                if ($validator->fails()) {
                    Flash::warning(translate('validation_error'));
                    return redirect()->back()->withInput()->withErrors($validator);
                } else {
                    $files[$count] = $key->getClientOriginalName();
                    $key->move(public_path() . '/uploads',
                        $key->getClientOriginalName());
                }
                $count++;
            }
        }
        $loan->files = serialize($files);
        $loan->save();

        //save custom meta
        $custom_fields = CustomField::where('category', 'loans')->get();
        foreach ($custom_fields as $key) {
            $custom_field = new CustomFieldMeta();
            $id = $key->id;
            $custom_field->name = $request->$id;
            $custom_field->parent_id = $loan->id;
            $custom_field->custom_field_id = $key->id;
            $custom_field->category = "loans";
            $custom_field->save();
        }
        //save loan fees
        $fees_distribute = 0;
        $fees_first_payment = 0;
        $fees_last_payment = 0;
        foreach (LoanFee::all() as $key) {
            $loan_fee = new LoanFeeMeta();
            $value = 'loan_fees_amount_' . $key->id;
            $loan_fees_schedule = 'loan_fees_schedule_' . $key->id;
            $loan_fee->user_id = Sentinel::getUser()->id;
            $loan_fee->category = 'loan';
            $loan_fee->parent_id = $loan->id;
            $loan_fee->loan_fees_id = $key->id;
            $loan_fee->value = $request->$value;
            $loan_fee->loan_fees_schedule = $request->$loan_fees_schedule;
            $loan_fee->save();
            //determine amount to use
            if ($key->loan_fee_type == 'fixed') {
                if ($loan_fee->loan_fees_schedule == 'distribute_fees_evenly') {
                    $fees_distribute = $fees_distribute + $loan_fee->value;
                }
                if ($loan_fee->loan_fees_schedule == 'charge_fees_on_first_payment') {
                    $fees_first_payment = $fees_first_payment + $loan_fee->value;
                }
                if ($loan_fee->loan_fees_schedule == 'charge_fees_on_last_payment') {
                    $fees_last_payment = $fees_last_payment + $loan_fee->value;
                }
            } else {
                if ($loan_fee->loan_fees_schedule == 'distribute_fees_evenly') {
                    $fees_distribute = $fees_distribute + ($loan_fee->value * $loan->principal / 100);
                }
                if ($loan_fee->loan_fees_schedule == 'charge_fees_on_first_payment') {
                    $fees_first_payment = $fees_first_payment + ($loan_fee->value * $loan->principal / 100);
                }
                if ($loan_fee->loan_fees_schedule == 'charge_fees_on_last_payment') {
                    $fees_last_payment = $fees_last_payment + ($loan_fee->value * $loan->principal / 100);
                }
            }
        }
        //lets create schedules here
        //determine interest rate to use

        $interest_rate = GeneralHelper::determine_interest_rate($loan->id);

        $period = GeneralHelper::loan_period($loan->id);
        $loan = Loan::find($loan->id);
        if ($loan->repayment_cycle == 'daily') {
            $repayment_cycle = 'day';
            $loan->maturity_date = date_format(date_add(date_create($request->first_payment_date),
                date_interval_create_from_date_string($period . ' days')),
                'Y-m-d');
        }
        if ($loan->repayment_cycle == 'weekly') {
            $repayment_cycle = 'week';
            $loan->maturity_date = date_format(date_add(date_create($request->first_payment_date),
                date_interval_create_from_date_string($period . ' weeks')),
                'Y-m-d');
        }
        if ($loan->repayment_cycle == 'monthly') {
            $repayment_cycle = 'month';
            $loan->maturity_date = date_format(date_add(date_create($request->first_payment_date),
                date_interval_create_from_date_string($period . ' months')),
                'Y-m-d');
        }
        if ($loan->repayment_cycle == 'bi_monthly') {
            $repayment_cycle = 'month';
            $loan->maturity_date = date_format(date_add(date_create($request->first_payment_date),
                date_interval_create_from_date_string($period . ' months')),
                'Y-m-d');
        }
        if ($loan->repayment_cycle == 'quarterly') {
            $repayment_cycle = 'month';
            $loan->maturity_date = date_format(date_add(date_create($request->first_payment_date),
                date_interval_create_from_date_string($period . ' months')),
                'Y-m-d');
        }
        if ($loan->repayment_cycle == 'semi_annually') {
            $repayment_cycle = 'month';
            $loan->maturity_date = date_format(date_add(date_create($request->first_payment_date),
                date_interval_create_from_date_string($period . ' months')),
                'Y-m-d');
        }
        if ($loan->repayment_cycle == 'yearly') {
            $repayment_cycle = 'year';
            $loan->maturity_date = date_format(date_add(date_create($request->first_payment_date),
                date_interval_create_from_date_string($period . ' years')),
                'Y-m-d');
        }
        $loan->save();
        //generate schedules until period finished
        $next_payment = $request->first_payment_date;
        $balance = $request->principal;
        for ($i = 1; $i <= $period; $i++) {
            $fees = 0;
            if ($i == 1) {
                $fees = $fees + ($fees_first_payment);
            }
            if ($i == $period) {
                $fees = $fees + ($fees_last_payment);
            }
            $fees = $fees + ($fees_distribute / $period);
            $loan_schedule = new LoanSchedule();
            $loan_schedule->loan_id = $loan->id;
            $loan_schedule->fees = $fees;
            $loan_schedule->borrower_id = $loan->borrower_id;
            $loan_schedule->description = 'Repayment';
            $loan_schedule->due_date = $next_payment;
            $date = explode('-', $next_payment);
            $loan_schedule->month = $date[1];
            $loan_schedule->year = $date[0];
            //determine which method to use
            $due = 0;
            //reducing balance equal installments
            if ($request->interest_method == 'declining_balance_equal_installments') {
                $due = GeneralHelper::amortized_monthly_payment($loan->id, $loan->principal);
                if ($loan->decimal_places == 'round_off_to_two_decimal') {
                    //determine if we have grace period for interest

                    $interest = round(($interest_rate * $balance), 2);
                    $loan_schedule->principal = round(($due - $interest), 2);
                    if ($loan->grace_on_interest_charged >= $i) {
                        $loan_schedule->interest = 0;
                    } else {
                        $loan_schedule->interest = round($interest, 2);
                    }
                    $loan_schedule->due = round($due, 2);
                    //determine next balance
                    $balance = round(($balance - ($due - $interest)), 2);
                    $loan_schedule->principal_balance = round($balance, 2);
                } else {
                    //determine if we have grace period for interest

                    $interest = round(($interest_rate * $balance));
                    $loan_schedule->principal = round(($due - $interest));
                    if ($loan->grace_on_interest_charged >= $i) {
                        $loan_schedule->interest = 0;
                    } else {
                        $loan_schedule->interest = round($interest);
                    }
                    $loan_schedule->due = round($due);
                    //determine next balance
                    $balance = round(($balance - ($due - $interest)));
                    $loan_schedule->principal_balance = round($balance);
                }


            }
            //reducing balance equal principle
            if ($request->interest_method == 'declining_balance_equal_principal') {
                $principal = $loan->principal / $period;
                if ($loan->decimal_places == 'round_off_to_two_decimal') {

                    $interest = round(($interest_rate * $balance), 2);
                    $loan_schedule->principal = round($principal, 2);
                    if ($loan->grace_on_interest_charged >= $i) {
                        $loan_schedule->interest = 0;
                    } else {
                        $loan_schedule->interest = round($interest, 2);
                    }
                    $loan_schedule->due = round(($principal + $interest), 2);
                    //determine next balance
                    $balance = round(($balance - ($principal + $interest)), 2);
                    $loan_schedule->principal_balance = round($balance, 2);
                } else {

                    $loan_schedule->principal = round(($principal));

                    $interest = round(($interest_rate * $balance));
                    if ($loan->grace_on_interest_charged >= $i) {
                        $loan_schedule->interest = 0;
                    } else {
                        $loan_schedule->interest = round($interest);
                    }
                    $loan_schedule->due = round($principal + $interest);
                    //determine next balance
                    $balance = round(($balance - ($principal + $interest)));
                    $loan_schedule->principal_balance = round($balance);
                }

            }
            //flat  method
            if ($request->interest_method == 'flat_rate') {
                $principal = $loan->principal / $period;
                if ($loan->decimal_places == 'round_off_to_two_decimal') {
                    $interest = round(($interest_rate * $loan->principal), 2);
                    $loan_schedule->principal = round(($principal), 2);
                    if ($loan->grace_on_interest_charged >= $i) {
                        $loan_schedule->interest = 0;
                    } else {
                        $loan_schedule->interest = round($interest, 2);
                    }
                    $loan_schedule->principal = round(($principal), 2);
                    $loan_schedule->due = round(($principal + $interest), 2);
                    //determine next balance
                    $balance = round(($balance - $principal), 2);
                    $loan_schedule->principal_balance = round($balance, 2);
                } else {
                    $interest = round(($interest_rate * $loan->principal));
                    if ($loan->grace_on_interest_charged >= $i) {
                        $loan_schedule->interest = 0;
                    } else {
                        $loan_schedule->interest = round($interest);
                    }
                    $loan_schedule->principal = round($principal);
                    $loan_schedule->due = round($principal + $interest);
                    //determine next balance
                    $balance = round(($balance - $principal));
                    $loan_schedule->principal_balance = round($balance);
                }
            }
            //interest only method
            if ($request->interest_method == 'interest_only') {
                if ($i == $period) {
                    $principal = $loan->principal;
                } else {
                    $principal = 0;
                }
                if ($loan->decimal_places == 'round_off_to_two_decimal') {
                    $interest = round(($interest_rate * $loan->principal), 2);
                    if ($loan->grace_on_interest_charged >= $i) {
                        $loan_schedule->interest = 0;
                    } else {
                        $loan_schedule->interest = round($interest, 2);
                    }
                    $loan_schedule->principal = round(($principal), 2);
                    $loan_schedule->due = round(($principal + $interest), 2);
                    //determine next balance
                    $balance = round(($balance - $principal), 2);
                    $loan_schedule->principal_balance = round($balance, 2);
                } else {
                    $interest = round(($interest_rate * $loan->principal));
                    if ($loan->grace_on_interest_charged >= $i) {
                        $loan_schedule->interest = 0;
                    } else {
                        $loan_schedule->interest = round($interest);
                    }
                    $loan_schedule->principal = round($principal);
                    $loan_schedule->due = round($principal + $interest);
                    //determine next balance
                    $balance = round(($balance - $principal));
                    $loan_schedule->principal_balance = round($balance);
                }
            }
            //determine next due date
            if ($loan->repayment_cycle == 'daily') {
                $next_payment = date_format(date_add(date_create($next_payment),
                    date_interval_create_from_date_string('1 days')),
                    'Y-m-d');
                $loan_schedule->due_date = $next_payment;
            }
            if ($loan->repayment_cycle == 'weekly') {
                $next_payment = date_format(date_add(date_create($next_payment),
                    date_interval_create_from_date_string('1 weeks')),
                    'Y-m-d');
                $loan_schedule->due_date = $next_payment;
            }
            if ($loan->repayment_cycle == 'monthly') {
                $next_payment = date_format(date_add(date_create($next_payment),
                    date_interval_create_from_date_string('1 months')),
                    'Y-m-d');
                $loan_schedule->due_date = $next_payment;
            }
            if ($loan->repayment_cycle == 'bi_monthly') {
                $next_payment = date_format(date_add(date_create($request->first_payment_date),
                    date_interval_create_from_date_string($period . ' months')),
                    'Y-m-d');
                $loan_schedule->due_date = $next_payment;
            }
            if ($loan->repayment_cycle == 'quarterly') {
                $next_payment = date_format(date_add(date_create($next_payment),
                    date_interval_create_from_date_string('2 months')),
                    'Y-m-d');
                $loan_schedule->due_date = $next_payment;
            }
            if ($loan->repayment_cycle == 'semi_annually') {
                $next_payment = date_format(date_add(date_create($next_payment),
                    date_interval_create_from_date_string('6 months')),
                    'Y-m-d');
                $loan_schedule->due_date = $next_payment;
            }
            if ($loan->repayment_cycle == 'yearly') {
                $next_payment = date_format(date_add(date_create($next_payment),
                    date_interval_create_from_date_string('1 years')),
                    'Y-m-d');
                $loan_schedule->due_date = $next_payment;
            }
            if ($i == $period) {
                $loan_schedule->principal_balance = round($balance);
            }
            $loan_schedule->save();
        }
        Flash::success(translate('successfully_saved'));
        return redirect('loan/data');
    }


    public function show($loan)
    {
        if (!Sentinel::hasAccess('loans.view')) {
            Flash::warning(translate('permission_denied'));
            return redirect('/');
        }
        $schedules = LoanSchedule::where('loan_id', $loan->id)->orderBy('due_date', 'asc')->get();
        $payments = LoanRepayment::where('loan_id', $loan->id)->orderBy('collection_date', 'asc')->get();
        $custom_fields = CustomFieldMeta::where('category', 'loans')->where('parent_id', $loan->id)->get();
        return view('loan.show', compact('loan', 'schedules', 'payments', 'custom_fields'));
    }


    public function edit($loan)
    {
        if (!Sentinel::hasAccess('loans.update')) {
            Flash::warning(translate('permission_denied'));
            return redirect('/');
        }
        $borrowers = array();
        foreach (Borrower::all() as $key) {
            $borrowers[$key->id] = $key->first_name . ' ' . $key->last_name . '(' . $key->unique_number . ')';
        }
        $loan_products = array();
        foreach (LoanProduct::all() as $key) {
            $loan_products[$key->id] = $key->name;
        }

        $loan_disbursed_by = array();
        foreach (LoanDisbursedBy::all() as $key) {
            $loan_disbursed_by[$key->id] = $key->name;
        }

        //get custom fields
        $custom_fields = CustomField::where('category', 'loans')->get();
        $loan_fees = LoanFee::all();
        return view('loan.edit',
            compact('loan', 'borrowers', 'loan_disbursed_by', 'loan_products', 'custom_fields', 'loan_fees'));
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  int $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        if (!Sentinel::hasAccess('loans.update')) {
            Flash::warning(translate('permission_denied'));
            return redirect('/');
        }
        $loan = Loan::find($id);
        $loan->loan_disbursed_by_id = $request->loan_disbursed_by_id;
        $loan->principal = $request->principal;
        $loan->interest_method = $request->interest_method;
        $loan->interest_rate = $request->interest_rate;
        $loan->interest_period = $request->interest_period;
        $loan->loan_duration = $request->loan_duration;
        $loan->loan_duration_type = $request->loan_duration_type;
        $loan->repayment_cycle = $request->repayment_cycle;
        $loan->decimal_places = $request->decimal_places;
        $loan->repayment_order = $request->repayment_order;
        $loan->override_interest = $request->override_interest;
        $loan->override_interest_amount = $request->override_interest_amount;
        $loan->grace_on_interest_charged = $request->grace_on_interest_charged;
        $loan->borrower_id = $request->borrower_id;
        $loan->loan_product_id = $request->loan_product_id;
        $loan->release_date = $request->release_date;
        $date = explode('-', $request->release_date);
        $loan->month = $date[1];
        $loan->year = $date[0];
        $loan->first_payment_date = $request->first_payment_date;
        $loan->description = $request->description;
        $files = unserialize($loan->files);
        $count = count($files);
        if (!empty(array_filter($request->file('files')))) {
            foreach ($request->file('files') as $key) {
                $count++;
                $file = array('files' => $key);
                $rules = array('files' => 'required|mimes:jpeg,jpg,bmp,png,pdf,docx,xlsx');
                $validator = Validator::make($file, $rules);
                if ($validator->fails()) {
                    Flash::warning(translate('validation_error'));
                    return redirect()->back()->withInput()->withErrors($validator);
                } else {
                    $files[$count] = $key->getClientOriginalName();
                    $key->move(public_path() . '/uploads',
                        $key->getClientOriginalName());
                }

            }
        }
        $loan->files = serialize($files);
        $loan->save();
        $custom_fields = CustomField::where('category', 'loans')->get();
        foreach ($custom_fields as $key) {
            if (!empty(CustomFieldMeta::where('custom_field_id', $key->id)->where('parent_id', $id)->where('category',
                'loans')->first())
            ) {
                $custom_field = CustomFieldMeta::where('custom_field_id', $key->id)->where('parent_id',
                    $id)->where('category', 'loans')->first();
            } else {
                $custom_field = new CustomFieldMeta();
            }
            $kid = $key->id;
            $custom_field->name = $request->$kid;
            $custom_field->parent_id = $id;
            $custom_field->custom_field_id = $key->id;
            $custom_field->category = "loans";
            $custom_field->save();
        }
        foreach (LoanFee::all() as $key) {
            if (!empty(LoanFeeMeta::where('loan_fees_id', $key->id)->where('parent_id', $id)->where('category',
                'loan')->first())
            ) {
                $loan_fee = LoanFeeMeta::where('loan_fees_id', $key->id)->where('parent_id', $id)->where('category',
                    'loan')->first();
            } else {
                $loan_fee = new LoanFeeMeta();
            }

            $value = 'loan_fees_amount_' . $key->id;
            $loan_fees_schedule = 'loan_fees_schedule_' . $key->id;
            $loan_fee->user_id = Sentinel::getUser()->id;
            $loan_fee->category = 'loan';
            $loan_fee->parent_id = $loan->id;
            $loan_fee->loan_fees_id = $key->id;
            $loan_fee->value = $request->$value;
            $loan_fee->loan_fees_schedule = $request->$loan_fees_schedule;
            $loan_fee->save();
        }
        Flash::success(translate('successfully_saved'));
        return redirect('loan/data');
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int $id
     * @return \Illuminate\Http\Response
     */
    public function delete($id)
    {
        if (!Sentinel::hasAccess('loans.delete')) {
            Flash::warning(translate('permission_denied'));
            return redirect('/');
        }
        Loan::destroy($id);
        LoanSchedule::where('loan_id', $id)->delete();
        LoanRepayment::where('loan_id', $id)->delete();
        Flash::success(translate('successfully_deleted'));
        return redirect('loan/data');
    }

    public function deleteFile(Request $request, $id)
    {
        if (!Sentinel::hasAccess('loans.delete')) {
            Flash::warning(translate('permission_denied'));
            return redirect('/');
        }
        $loan = Loan::find($id);
        $files = unserialize($loan->files);
        @unlink(public_path() . '/uploads/' . $files[$request->id]);
        $files = array_except($files, [$request->id]);
        $loan->files = serialize($files);
        $loan->save();


    }

    public function indexRepayment()
    {
        if (!Sentinel::hasAccess('repayments')) {
            Flash::warning(translate('permission_denied'));
            return redirect('/');
        }
        $data = LoanRepayment::all();

        return view('loan_repayment.data', compact('data'));
    }

    //loan repayments
    public function createBulkRepayment()
    {
        if (!Sentinel::hasAccess('repayments.create')) {
            Flash::warning(translate('permission_denied'));
            return redirect('/');
        }
        $loans = array();
        foreach (Loan::all() as $key) {
            $loans[$key->id] = $key->borrower->first_name . ' ' . $key->borrower->last_name . '(' . translate('loan',
                    1) . '#' . $key->id . ',' . translate('due',
                    1) . ':' . GeneralHelper::loan_total_balance($key->id) . ')';
        }
        $repayment_methods = array();
        foreach (LoanRepaymentMethod::all() as $key) {
            $repayment_methods[$key->id] = $key->name;
        }
        $custom_fields = CustomField::where('category', 'repayments')->get();
        return view('loan_repayment.bulk', compact( 'repayment_methods', 'custom_fields', 'loans'));
    }

    public function storeBulkRepayment(Request $request)
    {
        if (!Sentinel::hasAccess('repayments.create')) {
            Flash::warning(translate('permission_denied'));
            return redirect('/');
        }
        for ($i = 1; $i <= 20; $i++) {
            $amount = "repayment_amount" . $i;
            $loan_id = "loan_id" . $i;
            $repayment_method = "repayment_method_id" . $i;
            $collected_date = "repayment_collected_date" . $i;
            $repayment_description = "repayment_description" . $i;
            if (!empty($request->$amount && !empty($request->$loan_id))) {
                $loan = Loan::find($request->$loan_id);
                if ($request->$amount > GeneralHelper::loan_total_balance($loan->id)) {
                    Flash::warning("Amount is more than the balance(" . GeneralHelper::loan_total_balance($loan->id) . ')');
                    return redirect()->back()->withInput();

                } else {
                    $repayment = new LoanRepayment();
                    $repayment->user_id = Sentinel::getUser()->id;
                    $repayment->amount = $request->$amount;
                    $repayment->loan_id = $loan->id;
                    $repayment->borrower_id = $loan->borrower_id;
                    $repayment->collection_date = $request->$collected_date;
                    $repayment->repayment_method_id = $request->$repayment_method;
                    $repayment->notes = $request->$repayment_description;
                    $date = explode('-', $request->$collected_date);
                    $repayment->year = $date[0];
                    $repayment->month = $date[1];
                    //determine which schedule due date the payment applies too
                    $schedule = LoanSchedule::where('due_date', '>=', $request->$collected_date)->where('loan_id',
                        $loan->id)->orderBy('due_date',
                        'asc')->first();
                    if (!empty($schedule)) {
                        $repayment->due_date = $schedule->due_date;
                    } else {
                        $schedule = LoanSchedule::where('loan_id',
                            $loan->id)->orderBy('due_date',
                            'desc')->first();
                        if ($request->$collected_date > $schedule->due_date) {
                            $repayment->due_date = $schedule->due_date;
                        } else {
                            $schedule = LoanSchedule::where('due_date', '>',
                                $request->$collected_date)->where('loan_id',
                                $loan->id)->orderBy('due_date',
                                'asc')->first();
                            $repayment->due_date = $schedule->due_date;
                        }

                    }
                    $repayment->save();

                    //update loan status if need be
                    if ($request->$amount == GeneralHelper::loan_total_balance($loan->id)) {
                        $l = Loan::find($loan->id);
                        $l->loan_status = "fully_paid";
                        $l->save();

                    }
                    //check if late repayment is to be applied when adding payment

                    if (!empty($loan->loan_product)) {
                        if ($loan->loan_product->enable_late_repayment_penalty == 1) {
                            $schedules = LoanSchedule::where('due_date', '<',
                                $repayment->due_date)->where('missed_penalty_applied',
                                0)->orderBy('due_date', 'asc')->get();
                            foreach ($schedules as $schedule) {
                                if (GeneralHelper::loan_total_due_period($loan->id,
                                        $schedule->due_date) > GeneralHelper::loan_total_paid_period($loan->id,
                                        $schedule->due_date)
                                ) {
                                    $sch = LoanSchedule::find($schedule->id);
                                    $sch->missed_penalty_applied = 1;
                                    //determine which amount to use
                                    if ($loan->loan_product->late_repayment_penalty_type == "fixed") {
                                        $sch->penalty = $sch->penalty + $loan->loan_product->late_repayment_penalty_amount;
                                    } else {
                                        if ($loan->loan_product->late_repayment_penalty_calculate == 'overdue_principal') {
                                            $principal = (GeneralHelper::loan_total_principal($loan->id,
                                                    $schedule->due_date) - GeneralHelper::loan_paid_item($loan->id,
                                                    'principal', $schedule->due_date));
                                            $sch->penalty = $sch->penalty + (($loan->loan_product->late_repayment_penalty_amount / 100) * $principal);
                                        }
                                        if ($loan->loan_product->late_repayment_penalty_calculate == 'overdue_principal_interest') {
                                            $principal = (GeneralHelper::loan_total_principal($loan->id,
                                                    $schedule->due_date) + GeneralHelper::loan_total_interest($loan->id,
                                                    $schedule->due_date) - GeneralHelper::loan_paid_item($loan->id,
                                                    'principal',
                                                    $schedule->due_date) - GeneralHelper::loan_paid_item($loan->id,
                                                    'interest', $schedule->due_date));
                                            $sch->penalty = $sch->penalty + (($loan->loan_product->late_repayment_penalty_amount / 100) * $principal);
                                        }
                                        if ($loan->loan_product->late_repayment_penalty_calculate == 'overdue_principal_interest_fees') {
                                            $principal = (GeneralHelper::loan_total_principal($loan->id,
                                                    $schedule->due_date) + GeneralHelper::loan_total_interest($loan->id,
                                                    $schedule->due_date) + GeneralHelper::loan_total_fees($loan->id,
                                                    $schedule->due_date) - GeneralHelper::loan_paid_item($loan->id,
                                                    'principal',
                                                    $schedule->due_date) - GeneralHelper::loan_paid_item($loan->id,
                                                    'interest',
                                                    $schedule->due_date) - GeneralHelper::loan_paid_item($loan->id,
                                                    'fees',
                                                    $schedule->due_date));
                                            $sch->penalty = $sch->penalty + (($loan->loan_product->late_repayment_penalty_amount / 100) * $principal);
                                        }
                                        if ($loan->loan_product->late_repayment_penalty_calculate == 'total_overdue') {
                                            $principal = (GeneralHelper::loan_total_due_amount($loan->id,
                                                    $schedule->due_date) - GeneralHelper::loan_total_paid($loan->id,
                                                    $schedule->due_date));
                                            $sch->penalty = $sch->penalty + (($loan->loan_product->late_repayment_penalty_amount / 100) * $principal);
                                        }
                                    }
                                    $sch->save();
                                }
                            }
                        }

                    }
                }
            }
            //notify borrower


        }
        Flash::success("Repayment successfully saved");
        return redirect('repayment/data');
    }

    public function createRepayment($loan)
    {
        if (!Sentinel::hasAccess('repayments.create')) {
            Flash::warning(translate('permission_denied'));
            return redirect('/');
        }
        $repayment_methods = array();
        foreach (LoanRepaymentMethod::all() as $key) {
            $repayment_methods[$key->id] = $key->name;
        }
        $custom_fields = CustomField::where('category', 'repayments')->get();
        return view('loan_repayment.create', compact('loan', 'repayment_methods', 'custom_fields'));
    }

    public function storeRepayment(Request $request, $loan)
    {
        if (!Sentinel::hasAccess('repayments.create')) {
            Flash::warning(translate('permission_denied'));
            return redirect('/');
        }
        if ($request->amount > GeneralHelper::loan_total_balance($loan->id)) {
            Flash::warning("Amount is more than the balance(" . GeneralHelper::loan_total_balance($loan->id) . ')');
            return redirect()->back()->withInput();

        } else {
            $repayment = new LoanRepayment();
            $repayment->user_id = Sentinel::getUser()->id;
            $repayment->amount = $request->amount;
            $repayment->loan_id = $loan->id;
            $repayment->borrower_id = $loan->borrower_id;
            $repayment->collection_date = $request->collection_date;
            $repayment->repayment_method_id = $request->repayment_method_id;
            $repayment->notes = $request->notes;
            $date = explode('-', $request->collection_date);
            $repayment->year = $date[0];
            $repayment->month = $date[1];
            //determine which schedule due date the payment applies too
            $schedule = LoanSchedule::where('due_date', '>=', $request->collection_date)->where('loan_id',
                $loan->id)->orderBy('due_date',
                'asc')->first();
            if (!empty($schedule)) {
                $repayment->due_date = $schedule->due_date;
            } else {
                $schedule = LoanSchedule::where('loan_id',
                    $loan->id)->orderBy('due_date',
                    'desc')->first();
                if ($request->collection_date > $schedule->due_date) {
                    $repayment->due_date = $schedule->due_date;
                } else {
                    $schedule = LoanSchedule::where('due_date', '>', $request->collection_date)->where('loan_id',
                        $loan->id)->orderBy('due_date',
                        'asc')->first();
                    $repayment->due_date = $schedule->due_date;
                }

            }
            $repayment->save();
            //save custom meta
            $custom_fields = CustomField::where('category', 'repayments')->get();
            foreach ($custom_fields as $key) {
                $custom_field = new CustomFieldMeta();
                $id = $key->id;
                $custom_field->name = $request->$id;
                $custom_field->parent_id = $repayment->id;
                $custom_field->custom_field_id = $key->id;
                $custom_field->category = "repayments";
                $custom_field->save();
            }
            //update loan status if need be
            if ($request->amount == GeneralHelper::loan_total_balance($loan->id)) {
                $l = Loan::find($loan->id);
                $l->loan_status = "fully_paid";
                $l->save();

            }
            //check if late repayment is to be applied when adding payment
            if ($request->apply_penalty == 1) {
                if (!empty($loan->loan_product)) {
                    if ($loan->loan_product->enable_late_repayment_penalty == 1) {
                        $schedules = LoanSchedule::where('due_date', '<',
                            $repayment->due_date)->where('missed_penalty_applied',
                            0)->orderBy('due_date', 'asc')->get();
                        foreach ($schedules as $schedule) {
                            if (GeneralHelper::loan_total_due_period($loan->id,
                                    $schedule->due_date) > GeneralHelper::loan_total_paid_period($loan->id,
                                    $schedule->due_date)
                            ) {
                                $sch = LoanSchedule::find($schedule->id);
                                $sch->missed_penalty_applied = 1;
                                //determine which amount to use
                                if ($loan->loan_product->late_repayment_penalty_type == "fixed") {
                                    $sch->penalty = $sch->penalty + $loan->loan_product->late_repayment_penalty_amount;
                                } else {
                                    if ($loan->loan_product->late_repayment_penalty_calculate == 'overdue_principal') {
                                        $principal = (GeneralHelper::loan_total_principal($loan->id,
                                                $schedule->due_date) - GeneralHelper::loan_paid_item($loan->id,
                                                'principal', $schedule->due_date));
                                        $sch->penalty = $sch->penalty + (($loan->loan_product->late_repayment_penalty_amount / 100) * $principal);
                                    }
                                    if ($loan->loan_product->late_repayment_penalty_calculate == 'overdue_principal_interest') {
                                        $principal = (GeneralHelper::loan_total_principal($loan->id,
                                                $schedule->due_date) + GeneralHelper::loan_total_interest($loan->id,
                                                $schedule->due_date) - GeneralHelper::loan_paid_item($loan->id,
                                                'principal',
                                                $schedule->due_date) - GeneralHelper::loan_paid_item($loan->id,
                                                'interest', $schedule->due_date));
                                        $sch->penalty = $sch->penalty + (($loan->loan_product->late_repayment_penalty_amount / 100) * $principal);
                                    }
                                    if ($loan->loan_product->late_repayment_penalty_calculate == 'overdue_principal_interest_fees') {
                                        $principal = (GeneralHelper::loan_total_principal($loan->id,
                                                $schedule->due_date) + GeneralHelper::loan_total_interest($loan->id,
                                                $schedule->due_date) + GeneralHelper::loan_total_fees($loan->id,
                                                $schedule->due_date) - GeneralHelper::loan_paid_item($loan->id,
                                                'principal',
                                                $schedule->due_date) - GeneralHelper::loan_paid_item($loan->id,
                                                'interest',
                                                $schedule->due_date) - GeneralHelper::loan_paid_item($loan->id, 'fees',
                                                $schedule->due_date));
                                        $sch->penalty = $sch->penalty + (($loan->loan_product->late_repayment_penalty_amount / 100) * $principal);
                                    }
                                    if ($loan->loan_product->late_repayment_penalty_calculate == 'total_overdue') {
                                        $principal = (GeneralHelper::loan_total_due_amount($loan->id,
                                                $schedule->due_date) - GeneralHelper::loan_total_paid($loan->id,
                                                $schedule->due_date));
                                        $sch->penalty = $sch->penalty + (($loan->loan_product->late_repayment_penalty_amount / 100) * $principal);
                                    }
                                }
                                $sch->save();
                            }
                        }
                    }
                }
            }
            //notify borrower
            if ($request->notify_borrower == 1) {
                if ($request->notify_method == 'both') {
                    $borrower = $loan->borrower;
                    //sent via email
                    if (!empty($borrower->email)) {
                        $body = Setting::where('setting_key',
                            'payment_received_email_template')->first()->setting_value;
                        $body = str_replace('{borrowerTitle}', $borrower->title, $body);
                        $body = str_replace('{borrowerFirstName}', $borrower->first_name, $body);
                        $body = str_replace('{borrowerLastName}', $borrower->last_name, $body);
                        $body = str_replace('{borrowerAddress}', $borrower->address, $body);
                        $body = str_replace('{borrowerUniqueNumber}', $borrower->unique_number, $body);
                        $body = str_replace('{borrowerMobile}', $borrower->mobile, $body);
                        $body = str_replace('{borrowerPhone}', $borrower->phone, $body);
                        $body = str_replace('{borrowerEmail}', $borrower->email, $body);
                        $body = str_replace('{loanNumber}', '#' . $loan->id, $body);
                        $body = str_replace('{paymentAmount}', $request->amount, $body);
                        $body = str_replace('{paymentDate}', $request->date, $body);
                        $body = str_replace('{loanAmount}', $loan->principal, $body);
                        $body = str_replace('{loanDue}',
                            round(GeneralHelper::loan_total_due_amount($loan->id), 2), $body);
                        $body = str_replace('{loanBalance}',
                            round(GeneralHelper::loan_total_due_amount($loan->id) - GeneralHelper::loan_total_paid($loan->id),
                                2), $body);
                        $body = str_replace('{loansDue}',
                            round(GeneralHelper::borrower_loans_total_due($borrower->id), 2), $body);
                        $body = str_replace('{loansBalance}',
                            round((GeneralHelper::borrower_loans_total_due($borrower->id) - GeneralHelper::borrower_loans_total_paid($borrower->id)),
                                2), $body);
                        $body = str_replace('{loansPayments}',
                            GeneralHelper::borrower_loans_total_paid($borrower->id),
                            $body);
                        PDF::AddPage();
                        PDF::writeHTML(View::make('loan_repayment.pdf', compact('loan', 'repayment'))->render());
                        PDF::SetAuthor('Tererai Mugova');
                        PDF::Output(public_path() . '/uploads/temporary/repayment_receipt' . $loan->id . ".pdf", 'F');
                        $file_name = $loan->borrower->title . ' ' . $loan->borrower->first_name . ' ' . $loan->borrower->last_name . " - Repayment Receipt.pdf";
                        Mail::raw($body, function ($message) use ($loan, $request, $borrower, $file_name) {
                            $message->from(Setting::where('setting_key', 'company_email')->first()->setting_value,
                                Setting::where('setting_key', 'company_name')->first()->setting_value);
                            $message->to($borrower->email);
                            $headers = $message->getHeaders();
                            $message->attach(public_path() . '/uploads/temporary/repayment_receipt' . $loan->id . ".pdf",
                                ["as" => $file_name]);
                            $message->setContentType('text/html');
                            $message->setSubject(Setting::where('setting_key',
                                'payment_received_email_subject')->first()->setting_value);

                        });
                        unlink(public_path() . '/uploads/temporary/repayment_receipt' . $loan->id . ".pdf");
                        $mail = new Email();
                        $mail->user_id = Sentinel::getUser()->id;
                        $mail->message = $body;
                        $mail->subject = $request->subject;
                        $mail->recipients = 1;
                        $mail->send_to = $borrower->first_name . ' ' . $borrower->last_name . '(' . $borrower->unique_number . ')';
                        $mail->save();
                    }
                    if (!empty($borrower->mobile)) {
                        if (Setting::where('setting_key', 'sms_enabled')->first()->setting_value == 1) {
                            //lets build and replace available tags
                            $body = Setting::where('setting_key',
                                'payment_received_sms_template')->first()->setting_value;
                            $body = str_replace('{borrowerTitle}', $borrower->title, $body);
                            $body = str_replace('{borrowerFirstName}', $borrower->first_name, $body);
                            $body = str_replace('{borrowerLastName}', $borrower->last_name, $body);
                            $body = str_replace('{borrowerAddress}', $borrower->address, $body);
                            $body = str_replace('{borrowerMobile}', $borrower->mobile, $body);
                            $body = str_replace('{borrowerEmail}', $borrower->email, $body);
                            $body = str_replace('{loanNumber}', '#' . $loan->id, $body);
                            $body = str_replace('{paymentAmount}', $request->amount, $body);
                            $body = str_replace('{paymentDate}', $request->date, $body);
                            $body = str_replace('{loanAmount}', $loan->principal, $body);
                            $body = str_replace('{loanTotalDue}',
                                round(GeneralHelper::loan_total_due_amount($loan->id), 2), $body);
                            $body = str_replace('{loanBalance}',
                                round(GeneralHelper::loan_total_due_amount($loan->id) - GeneralHelper::loan_total_paid($loan->id),
                                    2), $body);
                            $body = str_replace('{lLoansDue}',
                                round(GeneralHelper::borrower_loans_total_due($borrower->id), 2), $body);
                            $body = str_replace('{loansBalance}',
                                round((GeneralHelper::borrower_loans_total_due($borrower->id) - GeneralHelper::borrower_loans_total_paid($borrower->id)),
                                    2), $body);
                            $body = str_replace('{loansPayments}',
                                GeneralHelper::borrower_loans_total_paid($borrower->id),
                                $body);
                            $body = trim(strip_tags($body));
                            if (!empty($borrower->mobile)) {
                                $active_sms = Setting::where('setting_key', 'active_sms')->first()->setting_value;
                                if ($active_sms == 'twilio') {
                                    $twilio = new Twilio(Setting::where('setting_key',
                                        'twilio_sid')->first()->setting_value,
                                        Setting::where('setting_key', 'twilio_token')->first()->setting_value,
                                        Setting::where('setting_key', 'twilio_phone_number')->first()->setting_value);
                                    $twilio->message('+' . $borrower->mobile, $body);
                                }
                                if ($active_sms == 'routesms') {
                                    $host = Setting::where('setting_key', 'routesms_host')->first()->setting_value;
                                    $port = Setting::where('setting_key', 'routesms_port')->first()->setting_value;
                                    $username = Setting::where('setting_key',
                                        'routesms_username')->first()->setting_value;
                                    $password = Setting::where('setting_key',
                                        'routesms_password')->first()->setting_value;
                                    $sender = Setting::where('setting_key', 'sms_sender')->first()->setting_value;
                                    $SMSText = $body;
                                    $GSM = $borrower->mobile;
                                    $msgtype = 2;
                                    $dlr = 1;
                                    $routesms = new RouteSms($host, $port, $username, $password, $sender, $SMSText,
                                        $GSM, $msgtype,
                                        $dlr);
                                    $routesms->Submit();
                                }
                                if ($active_sms == 'clickatell') {
                                    $clickatell = new ClickatellHttp(Setting::where('setting_key',
                                        'clickatell_username')->first()->setting_value,
                                        Setting::where('setting_key', 'clickatell_password')->first()->setting_value,
                                        Setting::where('setting_key', 'clickatell_api_id')->first()->setting_value);
                                    $response = $clickatell->sendMessage(array($borrower->mobile), $body);
                                }
                                if ($active_sms == 'infobip') {
                                    $infobip = new Infobip(Setting::where('setting_key',
                                        'sms_sender')->first()->setting_value, $body,
                                        $borrower->mobile);
                                }
                                $sms = new Sms();
                                $sms->user_id = Sentinel::getUser()->id;
                                $sms->message = $body;
                                $sms->gateway = $active_sms;
                                $sms->recipients = 1;
                                $sms->send_to = $borrower->first_name . ' ' . $borrower->last_name . '(' . $borrower->unique_number . ')';
                                $sms->save();

                            }

                        }
                    }
                    //send via sms
                }
                if ($request->notify_method == 'email') {
                    $borrower = $loan->borrower;
                    //sent via email
                    if (!empty($borrower->email)) {
                        $body = Setting::where('setting_key',
                            'payment_received_email_template')->first()->setting_value;
                        $body = str_replace('{borrowerTitle}', $borrower->title, $body);
                        $body = str_replace('{borrowerFirstName}', $borrower->first_name, $body);
                        $body = str_replace('{borrowerLastName}', $borrower->last_name, $body);
                        $body = str_replace('{borrowerAddress}', $borrower->address, $body);
                        $body = str_replace('{borrowerUniqueNumber}', $borrower->unique_number, $body);
                        $body = str_replace('{borrowerMobile}', $borrower->mobile, $body);
                        $body = str_replace('{borrowerPhone}', $borrower->phone, $body);
                        $body = str_replace('{borrowerEmail}', $borrower->email, $body);
                        $body = str_replace('{loanNumber}', '#' . $loan->id, $body);
                        $body = str_replace('{paymentAmount}', $request->amount, $body);
                        $body = str_replace('{paymentDate}', $request->date, $body);
                        $body = str_replace('{loanAmount}', $loan->principal, $body);
                        $body = str_replace('{loanDue}',
                            round(GeneralHelper::loan_total_due_amount($loan->id), 2), $body);
                        $body = str_replace('{loanBalance}',
                            round(GeneralHelper::loan_total_due_amount($loan->id) - GeneralHelper::loan_total_paid($loan->id),
                                2), $body);
                        $body = str_replace('{loansDue}',
                            round(GeneralHelper::borrower_loans_total_due($borrower->id), 2), $body);
                        $body = str_replace('{loansBalance}',
                            round((GeneralHelper::borrower_loans_total_due($borrower->id) - GeneralHelper::borrower_loans_total_paid($borrower->id)),
                                2), $body);
                        $body = str_replace('{loansPayments}',
                            GeneralHelper::borrower_loans_total_paid($borrower->id),
                            $body);
                        PDF::AddPage();
                        PDF::writeHTML(View::make('loan_repayment.pdf', compact('loan', 'repayment'))->render());
                        PDF::SetAuthor('Tererai Mugova');
                        PDF::Output(public_path() . '/uploads/temporary/repayment_receipt' . $loan->id . ".pdf", 'F');
                        $file_name = $loan->borrower->title . ' ' . $loan->borrower->first_name . ' ' . $loan->borrower->last_name . " - Repayment Receipt.pdf";
                        Mail::raw($body, function ($message) use ($loan, $request, $borrower, $file_name) {
                            $message->from(Setting::where('setting_key', 'company_email')->first()->setting_value,
                                Setting::where('setting_key', 'company_name')->first()->setting_value);
                            $message->to($borrower->email);
                            $headers = $message->getHeaders();
                            $message->attach(public_path() . '/uploads/temporary/repayment_receipt' . $loan->id . ".pdf",
                                ["as" => $file_name]);
                            $message->setContentType('text/html');
                            $message->setSubject(Setting::where('setting_key',
                                'payment_received_email_subject')->first()->setting_value);

                        });
                        unlink(public_path() . '/uploads/temporary/repayment_receipt' . $loan->id . ".pdf");
                        $mail = new Email();
                        $mail->user_id = Sentinel::getUser()->id;
                        $mail->message = $body;
                        $mail->subject = $request->subject;
                        $mail->recipients = 1;
                        $mail->send_to = $borrower->first_name . ' ' . $borrower->last_name . '(' . $borrower->unique_number . ')';
                        $mail->save();
                    }
                }
                if ($request->notify_method == 'sms') {
                    $borrower = $loan->borrower;
                    if (!empty($borrower->mobile)) {
                        if (Setting::where('setting_key', 'sms_enabled')->first()->setting_value == 1) {
                            //lets build and replace available tags
                            $body = Setting::where('setting_key',
                                'payment_received_sms_template')->first()->setting_value;
                            $body = str_replace('{borrowerTitle}', $borrower->title, $body);
                            $body = str_replace('{borrowerFirstName}', $borrower->first_name, $body);
                            $body = str_replace('{borrowerLastName}', $borrower->last_name, $body);
                            $body = str_replace('{borrowerAddress}', $borrower->address, $body);
                            $body = str_replace('{borrowerMobile}', $borrower->mobile, $body);
                            $body = str_replace('{borrowerEmail}', $borrower->email, $body);
                            $body = str_replace('{loanNumber}', '#' . $loan->id, $body);
                            $body = str_replace('{paymentAmount}', $request->amount, $body);
                            $body = str_replace('{paymentDate}', $request->date, $body);
                            $body = str_replace('{loanAmount}', $loan->principal, $body);
                            $body = str_replace('{loanTotalDue}',
                                round(GeneralHelper::loan_total_due_amount($loan->id), 2), $body);
                            $body = str_replace('{loanBalance}',
                                round(GeneralHelper::loan_total_due_amount($loan->id) - GeneralHelper::loan_total_paid($loan->id),
                                    2), $body);
                            $body = str_replace('{lLoansDue}',
                                round(GeneralHelper::borrower_loans_total_due($borrower->id), 2), $body);
                            $body = str_replace('{loansBalance}',
                                round((GeneralHelper::borrower_loans_total_due($borrower->id) - GeneralHelper::borrower_loans_total_paid($borrower->id)),
                                    2), $body);
                            $body = str_replace('{loansPayments}',
                                GeneralHelper::borrower_loans_total_paid($borrower->id),
                                $body);
                            $body = trim(strip_tags($body));
                            if (!empty($borrower->mobile)) {
                                $active_sms = Setting::where('setting_key', 'active_sms')->first()->setting_value;
                                if ($active_sms == 'twilio') {
                                    $twilio = new Twilio(Setting::where('setting_key',
                                        'twilio_sid')->first()->setting_value,
                                        Setting::where('setting_key', 'twilio_token')->first()->setting_value,
                                        Setting::where('setting_key', 'twilio_phone_number')->first()->setting_value);
                                    $twilio->message('+' . $borrower->mobile, $body);
                                }
                                if ($active_sms == 'routesms') {
                                    $host = Setting::where('setting_key', 'routesms_host')->first()->setting_value;
                                    $port = Setting::where('setting_key', 'routesms_port')->first()->setting_value;
                                    $username = Setting::where('setting_key',
                                        'routesms_username')->first()->setting_value;
                                    $password = Setting::where('setting_key',
                                        'routesms_password')->first()->setting_value;
                                    $sender = Setting::where('setting_key', 'sms_sender')->first()->setting_value;
                                    $SMSText = $body;
                                    $GSM = $borrower->mobile;
                                    $msgtype = 2;
                                    $dlr = 1;
                                    $routesms = new RouteSms($host, $port, $username, $password, $sender, $SMSText,
                                        $GSM, $msgtype,
                                        $dlr);
                                    $routesms->Submit();
                                }
                                if ($active_sms == 'clickatell') {
                                    $clickatell = new ClickatellHttp(Setting::where('setting_key',
                                        'clickatell_username')->first()->setting_value,
                                        Setting::where('setting_key', 'clickatell_password')->first()->setting_value,
                                        Setting::where('setting_key', 'clickatell_api_id')->first()->setting_value);
                                    $response = $clickatell->sendMessage(array($borrower->mobile), $body);
                                }
                                if ($active_sms == 'infobip') {
                                    $infobip = new Infobip(Setting::where('setting_key',
                                        'sms_sender')->first()->setting_value, $body,
                                        $borrower->mobile);
                                }
                                $sms = new Sms();
                                $sms->user_id = Sentinel::getUser()->id;
                                $sms->message = $body;
                                $sms->gateway = $active_sms;
                                $sms->recipients = 1;
                                $sms->send_to = $borrower->first_name . ' ' . $borrower->last_name . '(' . $borrower->unique_number . ')';
                                $sms->save();

                            }

                        }
                    }
                }
            }
            Flash::success("Repayment successfully saved");
            return redirect('loan/' . $loan->id . '/show');
        }
    }

    public function deleteRepayment($loan, $id)
    {
        if (!Sentinel::hasAccess('repayments.delete')) {
            Flash::warning(translate('permission_denied'));
            return redirect('/');
        }
        LoanRepayment::destroy($id);
        if (GeneralHelper::loan_total_balance($loan->id) > 0 && $loan->loan_status == "full_paid") {
            $l = Loan::find($loan->id);
            $l->loan_status = "open";
            $l->save();
        }
        Flash::success("Repayment successfully deleted");
        return redirect('loan/' . $loan->id . '/show');
    }

//    print repayment
    public function pdfRepayment($loan, $repayment)
    {
        PDF::AddPage();
        PDF::writeHTML(View::make('loan_repayment.pdf', compact('loan', 'repayment'))->render());
        PDF::SetAuthor('Tererai Mugova');
        PDF::Output($loan->borrower->title . ' ' . $loan->borrower->first_name . ' ' . $loan->borrower->last_name . " - Repayment Receipt.pdf",
            'D');
    }

    public function printRepayment($loan, $repayment)
    {

        return view('loan_repayment.print', compact('loan', 'repayment'));
    }

    public function editRepayment($loan, $repayment)
    {
        if (!Sentinel::hasAccess('repayments.update')) {
            Flash::warning(translate('permission_denied'));
            return redirect('/');
        }
        $repayment_methods = array();
        foreach (LoanRepaymentMethod::all() as $key) {
            $repayment_methods[$key->id] = $key->name;
        }
        $custom_fields = CustomField::where('category', 'repayments')->get();
        return view('loan_repayment.edit', compact('loan', 'repayment_methods', 'custom_fields', 'repayment'));
    }

    public function updateRepayment(Request $request, $loan, $id)
    {
        if (!Sentinel::hasAccess('repayments.update')) {
            Flash::warning(translate('permission_denied'));
            return redirect('/');
        }
        if ($request->amount > GeneralHelper::loan_total_balance($loan->id)) {
            Flash::warning("Amount is more than the balance(" . GeneralHelper::loan_total_balance($loan->id) . ')');
            return redirect()->back()->withInput();

        } else {
            $repayment = LoanRepayment::find($id);
            $repayment->amount = $request->amount;
            $repayment->loan_id = $loan->id;
            $repayment->collection_date = $request->collection_date;
            $repayment->repayment_method_id = $request->repayment_method_id;
            $repayment->notes = $request->notes;
            $date = explode('-', $request->collection_date);
            $repayment->year = $date[0];
            $repayment->month = $date[1];
            //determine which schedule due date the payment applies too
            $schedule = LoanSchedule::where('due_date', '>=', $request->collection_date)->where('loan_id',
                $loan->id)->orderBy('due_date',
                'asc')->first();
            if (!empty($schedule)) {
                $repayment->due_date = $schedule->due_date;
            } else {
                $schedule = LoanSchedule::where('loan_id',
                    $loan->id)->orderBy('due_date',
                    'desc')->first();
                if ($request->collection_date > $schedule->due_date) {
                    $repayment->due_date = $schedule->due_date;
                } else {
                    $schedule = LoanSchedule::where('due_date', '>', $request->collection_date)->where('loan_id',
                        $loan->id)->orderBy('due_date',
                        'asc')->first();
                    $repayment->due_date = $schedule->due_date;
                }

            }
            $repayment->save();
            //save custom meta
            $custom_fields = CustomField::where('category', 'repayments')->get();
            foreach ($custom_fields as $key) {
                if (!empty(CustomFieldMeta::where('custom_field_id', $key->id)->where('parent_id',
                    $id)->where('category', 'repayments')->first())
                ) {
                    $custom_field = CustomFieldMeta::where('custom_field_id', $key->id)->where('parent_id',
                        $id)->where('category', 'repayments')->first();
                } else {
                    $custom_field = new CustomFieldMeta();
                }
                $kid = $key->id;
                $custom_field->name = $request->$kid;
                $custom_field->parent_id = $id;
                $custom_field->custom_field_id = $key->id;
                $custom_field->category = "repayments";
                $custom_field->save();
            }
            //update loan status if need be
            if ($request->amount == GeneralHelper::loan_total_balance($loan->id)) {
                $l = Loan::find($loan->id);
                $l->loan_status = "fully_paid";
                $l->save();

            }
            Flash::success("Repayment successfully saved");
            return redirect('loan/' . $loan->id . '/show');
        }
    }

    //edit loan schedule
    public function editSchedule($loan)
    {
        if (!Sentinel::hasAccess('loans.update')) {
            Flash::warning(translate('permission_denied'));
            return redirect('/');
        }
        $rows = 0;
        $schedules = LoanSchedule::where('loan_id', $loan->id)->orderBy('due_date', 'asc')->get();
        return view('loan.edit_schedule', compact('loan', 'schedules', 'rows'));
    }

    public function updateSchedule(Request $request, $loan)
    {
        if (!Sentinel::hasAccess('loans.update')) {
            Flash::warning(translate('permission_denied'));
            return redirect('/');
        }
        if ($request->submit == 'add_row') {
            $rows = $request->addrows;
            $schedules = LoanSchedule::where('loan_id', $loan->id)->orderBy('due_date', 'asc')->get();
            return view('loan.edit_schedule', compact('loan', 'schedules', 'rows'));
        }
        if ($request->submit == 'submit') {
            //lets delete existing schedules
            LoanSchedule::where('loan_id', $loan->id)->delete();
            for ($count = 0; $count < $request->count; $count++) {
                $schedule = new LoanSchedule();
                if (empty($request->due_date) && empty($request->principal) && empty($request->interest) && empty($request->fees) && empty($request->penalty)) {
                    //do nothing
                } elseif (empty($request->due_date)) {
                    //do nothing
                } else {
                    //all rosy, lets save our data here
                    $schedule->due_date = $request->due_date[$count];
                    $schedule->principal = $request->principal[$count];
                    $schedule->description = $request->description[$count];
                    $schedule->loan_id = $loan->id;
                    $schedule->borrower_id = $loan->borrower_id;
                    $schedule->interest = $request->interest[$count];
                    $schedule->fees = $request->fees[$count];
                    $schedule->penalty = $request->penalty[$count];
                    $date = explode('-', $request->due_date[$count]);
                    $schedule->month = $date[1];
                    $schedule->year = $date[0];
                    $schedule->save();
                }
            }
            Flash::success("Schedule successfully updated");
            return redirect('loan/' . $loan->id . '/show');
        }
    }

    public function pdfSchedule($loan)
    {

        $schedules = LoanSchedule::where('loan_id', $loan->id)->orderBy('due_date', 'asc')->get();
        PDF::AddPage();
        PDF::writeHTML(View::make('loan.pdf_schedule', compact('loan', 'schedules'))->render());
        PDF::SetAuthor('Tererai Mugova');
        PDF::Output($loan->borrower->title . ' ' . $loan->borrower->first_name . ' ' . $loan->borrower->last_name . " - Loan Repayment Schedule.pdf",
            'D');

    }

    public function printSchedule($loan)
    {
        $schedules = LoanSchedule::where('loan_id', $loan->id)->orderBy('due_date', 'asc')->get();
        return view('loan.print_schedule', compact('loan', 'schedules'));
    }

    public function pdfLoanStatement($loan)
    {
        $payments = LoanRepayment::where('loan_id', $loan->id)->orderBy('collection_date', 'asc')->get();
        PDF::AddPage();
        PDF::writeHTML(View::make('loan.pdf_loan_statement', compact('loan', 'payments'))->render());
        PDF::SetAuthor('Tererai Mugova');
        PDF::Output($loan->borrower->title . ' ' . $loan->borrower->first_name . ' ' . $loan->borrower->last_name . " - Loan Statement.pdf",
            'D');
    }

    public function printLoanStatement($loan)
    {
        $payments = LoanRepayment::where('loan_id', $loan->id)->orderBy('collection_date', 'asc')->get();
        return view('loan.print_loan_statement', compact('loan', 'payments'));
    }

    public function pdfBorrowerStatement($borrower)
    {
        $loans = Loan::where('borrower_id', $borrower->id)->orderBy('release_date', 'asc')->get();
        PDF::AddPage();
        PDF::writeHTML(View::make('loan.pdf_borrower_statement', compact('loans'))->render());
        PDF::SetAuthor('Tererai Mugova');
        PDF::Output($borrower->title . ' ' . $borrower->first_name . ' ' . $borrower->last_name . " - Client Statement.pdf",
            'D');
    }

    public function printBorrowerStatement($borrower)
    {
        $loans = Loan::where('borrower_id', $borrower->id)->orderBy('release_date', 'asc')->get();
        return view('loan.print_borrower_statement', compact('loans'));
    }

    public function override(Request $request, $loan)
    {
        if (!Sentinel::hasAccess('loans.update')) {
            Flash::warning(translate('permission_denied'));
            return redirect('/');
        }
        if ($request->isMethod('post')) {
            $l = Loan::find($loan->id);
            $l->balance = $request->balance;
            if (empty($request->override)) {
                $l->override = 0;
            } else {
                $l->override = $request->override;
            }
            $l->save();
            Flash::success(translate('override_successfully_applied'));
            return redirect('loan/' . $loan->id . '/show');
        }
        return view('loan.override', compact('loan'));
    }

    public function emailBorrowerStatement($borrower)
    {
        if (!empty($borrower->email)) {
            $body = Setting::where('setting_key',
                'borrower_statement_email_template')->first()->setting_value;
            $body = str_replace('{borrowerTitle}', $borrower->title, $body);
            $body = str_replace('{borrowerFirstName}', $borrower->first_name, $body);
            $body = str_replace('{borrowerLastName}', $borrower->last_name, $body);
            $body = str_replace('{borrowerAddress}', $borrower->address, $body);
            $body = str_replace('{borrowerUniqueNumber}', $borrower->unique_number, $body);
            $body = str_replace('{borrowerMobile}', $borrower->mobile, $body);
            $body = str_replace('{borrowerPhone}', $borrower->phone, $body);
            $body = str_replace('{borrowerEmail}', $borrower->email, $body);
            $body = str_replace('{loansPayments}', GeneralHelper::borrower_loans_total_paid($borrower->id), $body);
            $body = str_replace('{loansDue}',
                round(GeneralHelper::borrower_loans_total_due($borrower->id), 2), $body);
            $body = str_replace('{loansBalance}',
                round((GeneralHelper::borrower_loans_total_due($borrower->id) - GeneralHelper::borrower_loans_total_paid($borrower->id)),
                    2), $body);
            $body = str_replace('{loanPayments}',
                GeneralHelper::borrower_loans_total_paid($borrower->id),
                $body);
            $loans = Loan::where('borrower_id', $borrower->id)->orderBy('release_date', 'asc')->get();
            PDF::AddPage();
            PDF::writeHTML(View::make('loan.pdf_borrower_statement', compact('loans'))->render());
            PDF::SetAuthor('Tererai Mugova');
            PDF::Output(public_path() . '/uploads/temporary/borrower_statement' . $borrower->id . ".pdf", 'F');
            $file_name = $borrower->title . ' ' . $borrower->first_name . ' ' . $borrower->last_name . " - Client Statement.pdf";
            Mail::raw($body, function ($message) use ($borrower, $file_name) {
                $message->from(Setting::where('setting_key', 'company_email')->first()->setting_value,
                    Setting::where('setting_key', 'company_name')->first()->setting_value);
                $message->to($borrower->email);
                $headers = $message->getHeaders();
                $message->attach(public_path() . '/uploads/temporary/borrower_statement' . $borrower->id . ".pdf",
                    ["as" => $file_name]);
                $message->setContentType('text/html');
                $message->setSubject(Setting::where('setting_key',
                    'borrower_statement_email_subject')->first()->setting_value);

            });
            unlink(public_path() . '/uploads/temporary/borrower_statement' . $borrower->id . ".pdf");
            $mail = new Email();
            $mail->user_id = Sentinel::getUser()->id;
            $mail->message = $body;
            $mail->subject = Setting::where('setting_key',
                'borrower_statement_email_subject')->first()->setting_value;
            $mail->recipients = 1;
            $mail->send_to = $borrower->first_name . ' ' . $borrower->last_name . '(' . $borrower->unique_number . ')';
            $mail->save();
            Flash::success("Statment successfully sent");
            return redirect('borrower/' . $borrower->id . '/show');
        } else {
            Flash::warning("Borrower has no email set");
            return redirect('borrower/' . $borrower->id . '/show');
        }
    }

    public function emailLoanStatement($loan)
    {
        $borrower = $loan->borrower;
        if (!empty($borrower->email)) {
            $body = Setting::where('setting_key',
                'loan_statement_email_template')->first()->setting_value;
            $body = str_replace('{borrowerTitle}', $borrower->title, $body);
            $body = str_replace('{borrowerFirstName}', $borrower->first_name, $body);
            $body = str_replace('{borrowerLastName}', $borrower->last_name, $body);
            $body = str_replace('{borrowerAddress}', $borrower->address, $body);
            $body = str_replace('{borrowerUniqueNumber}', $borrower->unique_number, $body);
            $body = str_replace('{borrowerMobile}', $borrower->mobile, $body);
            $body = str_replace('{borrowerPhone}', $borrower->phone, $body);
            $body = str_replace('{borrowerEmail}', $borrower->email, $body);
            $body = str_replace('{loanNumber}', $loan->id, $body);
            $body = str_replace('{loanPayments}', GeneralHelper::loan_total_paid($loan->id), $body);
            $body = str_replace('{loanDue}',
                round(GeneralHelper::loan_total_due_amount($loan->id), 2), $body);
            $body = str_replace('{loanBalance}',
                round((GeneralHelper::loan_total_due_amount($loan->id) - GeneralHelper::loan_total_paid($loan->id)),
                    2), $body);
            $payments = LoanRepayment::where('loan_id', $loan->id)->orderBy('collection_date', 'asc')->get();
            PDF::AddPage();
            PDF::writeHTML(View::make('loan.pdf_loan_statement', compact('loan', 'payments'))->render());
            PDF::SetAuthor('Tererai Mugova');
            PDF::Output(public_path() . '/uploads/temporary/loan_statement' . $loan->id . ".pdf", 'F');
            $file_name = $borrower->title . ' ' . $borrower->first_name . ' ' . $borrower->last_name . " - Loan Statement.pdf";
            Mail::raw($body, function ($message) use ($borrower, $loan, $file_name) {
                $message->from(Setting::where('setting_key', 'company_email')->first()->setting_value,
                    Setting::where('setting_key', 'company_name')->first()->setting_value);
                $message->to($borrower->email);
                $headers = $message->getHeaders();
                $message->attach(public_path() . '/uploads/temporary/loan_statement' . $loan->id . ".pdf",
                    ["as" => $file_name]);
                $message->setContentType('text/html');
                $message->setSubject(Setting::where('setting_key',
                    'loan_statement_email_subject')->first()->setting_value);

            });
            unlink(public_path() . '/uploads/temporary/loan_statement' . $loan->id . ".pdf");
            $mail = new Email();
            $mail->user_id = Sentinel::getUser()->id;
            $mail->message = $body;
            $mail->subject = Setting::where('setting_key',
                'loan_statement_email_subject')->first()->setting_value;
            $mail->recipients = 1;
            $mail->send_to = $borrower->first_name . ' ' . $borrower->last_name . '(' . $borrower->unique_number . ')';
            $mail->save();
            Flash::success("Loan Statement successfully sent");
            return redirect('loan/' . $loan->id . '/show');
        } else {
            Flash::warning("Borrower has no email set");
            return redirect('loan/' . $loan->id . '/show');
        }
    }

    public function emailLoanSchedule($loan)
    {
        $borrower = $loan->borrower;
        if (!empty($borrower->email)) {
            $body = Setting::where('setting_key',
                'loan_schedule_email_template')->first()->setting_value;
            $body = str_replace('{borrowerTitle}', $borrower->title, $body);
            $body = str_replace('{borrowerFirstName}', $borrower->first_name, $body);
            $body = str_replace('{borrowerLastName}', $borrower->last_name, $body);
            $body = str_replace('{borrowerAddress}', $borrower->address, $body);
            $body = str_replace('{borrowerUniqueNumber}', $borrower->unique_number, $body);
            $body = str_replace('{borrowerMobile}', $borrower->mobile, $body);
            $body = str_replace('{borrowerPhone}', $borrower->phone, $body);
            $body = str_replace('{borrowerEmail}', $borrower->email, $body);
            $body = str_replace('{loanNumber}', $loan->id, $body);
            $body = str_replace('{loanPayments}', GeneralHelper::loan_total_paid($loan->id), $body);
            $body = str_replace('{loanDue}',
                round(GeneralHelper::loan_total_due_amount($loan->id), 2), $body);
            $body = str_replace('{loanBalance}',
                round((GeneralHelper::loan_total_due_amount($loan->id) - GeneralHelper::loan_total_paid($loan->id)),
                    2), $body);
            $schedules = LoanSchedule::where('loan_id', $loan->id)->orderBy('due_date', 'asc')->get();
            PDF::AddPage();
            PDF::writeHTML(View::make('loan.pdf_schedule', compact('loan', 'schedules'))->render());
            PDF::SetAuthor('Tererai Mugova');
            PDF::Output(public_path() . '/uploads/temporary/loan_schedule' . $loan->id . ".pdf", 'F');
            $file_name = $borrower->title . ' ' . $borrower->first_name . ' ' . $borrower->last_name . " - Loan Schedule.pdf";
            Mail::raw($body, function ($message) use ($borrower, $loan, $file_name) {
                $message->from(Setting::where('setting_key', 'company_email')->first()->setting_value,
                    Setting::where('setting_key', 'company_name')->first()->setting_value);
                $message->to($borrower->email);
                $headers = $message->getHeaders();
                $message->attach(public_path() . '/uploads/temporary/loan_schedule' . $loan->id . ".pdf",
                    ["as" => $file_name]);
                $message->setContentType('text/html');
                $message->setSubject(Setting::where('setting_key',
                    'loan_schedule_email_subject')->first()->setting_value);

            });
            unlink(public_path() . '/uploads/temporary/loan_schedule' . $loan->id . ".pdf");
            $mail = new Email();
            $mail->user_id = Sentinel::getUser()->id;
            $mail->message = $body;
            $mail->subject = Setting::where('setting_key',
                'loan_statement_email_subject')->first()->setting_value;
            $mail->recipients = 1;
            $mail->send_to = $borrower->first_name . ' ' . $borrower->last_name . '(' . $borrower->unique_number . ')';
            $mail->save();
            Flash::success("Loan Statement successfully sent");
            return redirect('loan/' . $loan->id . '/show');
        } else {
            Flash::warning("Borrower has no email set");
            return redirect('loan/' . $loan->id . '/show');
        }
    }

    //loan applications
    public function indexApplication()
    {
        if (!Sentinel::hasAccess('loans')) {
            Flash::warning(translate('permission_denied'));
            return redirect('/');
        }
        $data = LoanApplication::all();

        return view('loan.applications', compact('data'));
    }

    public function declineApplication($id)
    {
        if (!Sentinel::hasAccess('loans')) {
            Flash::warning(translate('permission_denied'));
            return redirect('/');
        }
        $application = LoanApplication::find($id);
        $application->status = "declined";
        $application->save();
        Flash::success(translate('successfully_saved'));
        return redirect('loan/loan_application/data');
    }

    public function deleteApplication($id)
    {
        if (!Sentinel::hasAccess('loans')) {
            Flash::warning(translate('permission_denied'));
            return redirect('/');
        }
        LoanApplication::destroy($id);
        Flash::success(translate('successfully_deleted'));
        return redirect('loan/loan_application/data');
    }

    public function approveApplication($id)
    {
        if (!Sentinel::hasAccess('loans')) {
            Flash::warning(translate('permission_denied'));
            return redirect('/');
        }
        $loan_disbursed_by = array();
        foreach (LoanDisbursedBy::all() as $key) {
            $loan_disbursed_by[$key->id] = $key->name;
        }
        $application = LoanApplication::find($id);
        //get custom fields
        $custom_fields = CustomField::where('category', 'loans')->get();
        $loan_fees = LoanFee::all();
        $loan_product = $application->loan_product;
        if (!empty($application->loan_product)) {
            return view('loan.approve_application',
                compact('id', 'application', 'loan_product', 'loan_disbursed_by', 'custom_fields', 'loan_fees'));

        } else {
            Flash::warning(translate('loan_application_approve_error'));
            return redirect('loan/loan_application/data');
        }
    }

    public function storeApproveApplication(Request $request, $id)
    {
        if (!Sentinel::hasAccess('loans')) {
            Flash::warning(translate('permission_denied'));
            return redirect('/');
        }
        $application = LoanApplication::find($id);
        $application->status = "approved";
        $application->save();
        //lets save the loan here
        if (!Sentinel::hasAccess('loans.create')) {
            Flash::warning(translate('permission_denied'));
            return redirect('/');
        }
        $loan = new Loan();
        $loan->loan_disbursed_by_id = $request->loan_disbursed_by_id;
        $loan->principal = $request->principal;
        $loan->interest_method = $request->interest_method;
        $loan->interest_rate = $request->interest_rate;
        $loan->interest_period = $request->interest_period;
        $loan->loan_duration = $request->loan_duration;
        $loan->loan_duration_type = $request->loan_duration_type;
        $loan->repayment_cycle = $request->repayment_cycle;
        $loan->decimal_places = $request->decimal_places;
        $loan->repayment_order = $request->repayment_order;
        $loan->override_interest = $request->override_interest;
        $loan->override_interest_amount = $request->override_interest_amount;
        $loan->grace_on_interest_charged = $request->grace_on_interest_charged;
        $loan->borrower_id = $request->borrower_id;
        $loan->user_id = Sentinel::getUser()->id;
        $loan->loan_product_id = $request->loan_product_id;
        $loan->release_date = $request->release_date;
        $date = explode('-', $request->release_date);
        $loan->month = $date[1];
        $loan->year = $date[0];
        $loan->first_payment_date = $request->first_payment_date;
        $loan->description = $request->description;
        $files = array();
        if (!empty(array_filter($request->file('files')))) {
            $count = 0;
            foreach ($request->file('files') as $key) {
                $file = array('files' => $key);
                $rules = array('files' => 'required|mimes:jpeg,jpg,bmp,png,pdf,docx,xlsx');
                $validator = Validator::make($file, $rules);
                if ($validator->fails()) {
                    Flash::warning(translate('validation_error'));
                    return redirect()->back()->withInput()->withErrors($validator);
                } else {
                    $files[$count] = $key->getClientOriginalName();
                    $key->move(public_path() . '/uploads',
                        $key->getClientOriginalName());
                }
                $count++;
            }
        }
        $loan->files = serialize($files);
        $loan->save();

        //save custom meta
        $custom_fields = CustomField::where('category', 'loans')->get();
        foreach ($custom_fields as $key) {
            $custom_field = new CustomFieldMeta();
            $id = $key->id;
            $custom_field->name = $request->$id;
            $custom_field->parent_id = $loan->id;
            $custom_field->custom_field_id = $key->id;
            $custom_field->category = "loans";
            $custom_field->save();
        }
        //save loan fees
        $fees_distribute = 0;
        $fees_first_payment = 0;
        $fees_last_payment = 0;
        foreach (LoanFee::all() as $key) {
            $loan_fee = new LoanFeeMeta();
            $value = 'loan_fees_amount_' . $key->id;
            $loan_fees_schedule = 'loan_fees_schedule_' . $key->id;
            $loan_fee->user_id = Sentinel::getUser()->id;
            $loan_fee->category = 'loan';
            $loan_fee->parent_id = $loan->id;
            $loan_fee->loan_fees_id = $key->id;
            $loan_fee->value = $request->$value;
            $loan_fee->loan_fees_schedule = $request->$loan_fees_schedule;
            $loan_fee->save();
            //determine amount to use
            if ($key->loan_fee_type == 'fixed') {
                if ($loan_fee->loan_fees_schedule == 'distribute_fees_evenly') {
                    $fees_distribute = $fees_distribute + $loan_fee->value;
                }
                if ($loan_fee->loan_fees_schedule == 'charge_fees_on_first_payment') {
                    $fees_first_payment = $fees_first_payment + $loan_fee->value;
                }
                if ($loan_fee->loan_fees_schedule == 'charge_fees_on_last_payment') {
                    $fees_last_payment = $fees_last_payment + $loan_fee->value;
                }
            } else {
                if ($loan_fee->loan_fees_schedule == 'distribute_fees_evenly') {
                    $fees_distribute = $fees_distribute + ($loan_fee->value * $loan->principal / 100);
                }
                if ($loan_fee->loan_fees_schedule == 'charge_fees_on_first_payment') {
                    $fees_first_payment = $fees_first_payment + ($loan_fee->value * $loan->principal / 100);
                }
                if ($loan_fee->loan_fees_schedule == 'charge_fees_on_last_payment') {
                    $fees_last_payment = $fees_last_payment + ($loan_fee->value * $loan->principal / 100);
                }
            }
        }
        //lets create schedules here
        //determine interest rate to use

        $interest_rate = GeneralHelper::determine_interest_rate($loan->id);

        $period = GeneralHelper::loan_period($loan->id);
        $loan = Loan::find($loan->id);
        if ($loan->repayment_cycle == 'daily') {
            $repayment_cycle = 'day';
            $loan->maturity_date = date_format(date_add(date_create($request->first_payment_date),
                date_interval_create_from_date_string($period . ' days')),
                'Y-m-d');
        }
        if ($loan->repayment_cycle == 'weekly') {
            $repayment_cycle = 'week';
            $loan->maturity_date = date_format(date_add(date_create($request->first_payment_date),
                date_interval_create_from_date_string($period . ' weeks')),
                'Y-m-d');
        }
        if ($loan->repayment_cycle == 'monthly') {
            $repayment_cycle = 'month';
            $loan->maturity_date = date_format(date_add(date_create($request->first_payment_date),
                date_interval_create_from_date_string($period . ' months')),
                'Y-m-d');
        }
        if ($loan->repayment_cycle == 'bi_monthly') {
            $repayment_cycle = 'month';
            $loan->maturity_date = date_format(date_add(date_create($request->first_payment_date),
                date_interval_create_from_date_string($period . ' months')),
                'Y-m-d');
        }
        if ($loan->repayment_cycle == 'quarterly') {
            $repayment_cycle = 'month';
            $loan->maturity_date = date_format(date_add(date_create($request->first_payment_date),
                date_interval_create_from_date_string($period . ' months')),
                'Y-m-d');
        }
        if ($loan->repayment_cycle == 'semi_annually') {
            $repayment_cycle = 'month';
            $loan->maturity_date = date_format(date_add(date_create($request->first_payment_date),
                date_interval_create_from_date_string($period . ' months')),
                'Y-m-d');
        }
        if ($loan->repayment_cycle == 'yearly') {
            $repayment_cycle = 'year';
            $loan->maturity_date = date_format(date_add(date_create($request->first_payment_date),
                date_interval_create_from_date_string($period . ' years')),
                'Y-m-d');
        }
        $loan->save();
        //generate schedules until period finished
        $next_payment = $request->first_payment_date;
        $balance = $request->principal;
        for ($i = 1; $i <= $period; $i++) {
            $fees = 0;
            if ($i == 1) {
                $fees = $fees + ($fees_first_payment);
            }
            if ($i == $period) {
                $fees = $fees + ($fees_last_payment);
            }
            $fees = $fees + ($fees_distribute / $period);
            $loan_schedule = new LoanSchedule();
            $loan_schedule->loan_id = $loan->id;
            $loan_schedule->fees = $fees;
            $loan_schedule->borrower_id = $loan->borrower_id;
            $loan_schedule->description = 'Repayment';
            $loan_schedule->due_date = $next_payment;
            $date = explode('-', $next_payment);
            $loan_schedule->month = $date[1];
            $loan_schedule->year = $date[0];
            //determine which method to use
            $due = 0;
            //reducing balance equal installments
            if ($request->interest_method == 'declining_balance_equal_installments') {
                $due = GeneralHelper::amortized_monthly_payment($loan->id, $loan->principal);
                if ($loan->decimal_places == 'round_off_to_two_decimal') {
                    //determine if we have grace period for interest

                    $interest = round(($interest_rate * $balance), 2);
                    $loan_schedule->principal = round(($due - $interest), 2);
                    if ($loan->grace_on_interest_charged >= $i) {
                        $loan_schedule->interest = 0;
                    } else {
                        $loan_schedule->interest = round($interest, 2);
                    }
                    $loan_schedule->due = round($due, 2);
                    //determine next balance
                    $balance = round(($balance - ($due - $interest)), 2);
                    $loan_schedule->principal_balance = round($balance, 2);
                } else {
                    //determine if we have grace period for interest

                    $interest = round(($interest_rate * $balance));
                    $loan_schedule->principal = round(($due - $interest));
                    if ($loan->grace_on_interest_charged >= $i) {
                        $loan_schedule->interest = 0;
                    } else {
                        $loan_schedule->interest = round($interest);
                    }
                    $loan_schedule->due = round($due);
                    //determine next balance
                    $balance = round(($balance - ($due - $interest)));
                    $loan_schedule->principal_balance = round($balance);
                }


            }
            //reducing balance equal principle
            if ($request->interest_method == 'declining_balance_equal_principal') {
                $principal = $loan->principal / $period;
                if ($loan->decimal_places == 'round_off_to_two_decimal') {

                    $interest = round(($interest_rate * $balance), 2);
                    $loan_schedule->principal = round($principal, 2);
                    if ($loan->grace_on_interest_charged >= $i) {
                        $loan_schedule->interest = 0;
                    } else {
                        $loan_schedule->interest = round($interest, 2);
                    }
                    $loan_schedule->due = round(($principal + $interest), 2);
                    //determine next balance
                    $balance = round(($balance - ($principal + $interest)), 2);
                    $loan_schedule->principal_balance = round($balance, 2);
                } else {

                    $loan_schedule->principal = round(($principal));

                    $interest = round(($interest_rate * $balance));
                    if ($loan->grace_on_interest_charged >= $i) {
                        $loan_schedule->interest = 0;
                    } else {
                        $loan_schedule->interest = round($interest);
                    }
                    $loan_schedule->due = round($principal + $interest);
                    //determine next balance
                    $balance = round(($balance - ($principal + $interest)));
                    $loan_schedule->principal_balance = round($balance);
                }

            }
            //flat  method
            if ($request->interest_method == 'flat_rate') {
                $principal = $loan->principal / $period;
                if ($loan->decimal_places == 'round_off_to_two_decimal') {
                    $interest = round(($interest_rate * $loan->principal), 2);
                    $loan_schedule->principal = round(($principal), 2);
                    if ($loan->grace_on_interest_charged >= $i) {
                        $loan_schedule->interest = 0;
                    } else {
                        $loan_schedule->interest = round($interest, 2);
                    }
                    $loan_schedule->principal = round(($principal), 2);
                    $loan_schedule->due = round(($principal + $interest), 2);
                    //determine next balance
                    $balance = round(($balance - $principal), 2);
                    $loan_schedule->principal_balance = round($balance, 2);
                } else {
                    $interest = round(($interest_rate * $loan->principal));
                    if ($loan->grace_on_interest_charged >= $i) {
                        $loan_schedule->interest = 0;
                    } else {
                        $loan_schedule->interest = round($interest);
                    }
                    $loan_schedule->principal = round($principal);
                    $loan_schedule->due = round($principal + $interest);
                    //determine next balance
                    $balance = round(($balance - $principal));
                    $loan_schedule->principal_balance = round($balance);
                }
            }
            //interest only method
            if ($request->interest_method == 'interest_only') {
                if ($i == $period) {
                    $principal = $loan->principal;
                } else {
                    $principal = 0;
                }
                if ($loan->decimal_places == 'round_off_to_two_decimal') {
                    $interest = round(($interest_rate * $loan->principal), 2);
                    if ($loan->grace_on_interest_charged >= $i) {
                        $loan_schedule->interest = 0;
                    } else {
                        $loan_schedule->interest = round($interest, 2);
                    }
                    $loan_schedule->principal = round(($principal), 2);
                    $loan_schedule->due = round(($principal + $interest), 2);
                    //determine next balance
                    $balance = round(($balance - $principal), 2);
                    $loan_schedule->principal_balance = round($balance, 2);
                } else {
                    $interest = round(($interest_rate * $loan->principal));
                    if ($loan->grace_on_interest_charged >= $i) {
                        $loan_schedule->interest = 0;
                    } else {
                        $loan_schedule->interest = round($interest);
                    }
                    $loan_schedule->principal = round($principal);
                    $loan_schedule->due = round($principal + $interest);
                    //determine next balance
                    $balance = round(($balance - $principal));
                    $loan_schedule->principal_balance = round($balance);
                }
            }
            //determine next due date
            if ($loan->repayment_cycle == 'daily') {
                $next_payment = date_format(date_add(date_create($next_payment),
                    date_interval_create_from_date_string('1 days')),
                    'Y-m-d');
                $loan_schedule->due_date = $next_payment;
            }
            if ($loan->repayment_cycle == 'weekly') {
                $next_payment = date_format(date_add(date_create($next_payment),
                    date_interval_create_from_date_string('1 weeks')),
                    'Y-m-d');
                $loan_schedule->due_date = $next_payment;
            }
            if ($loan->repayment_cycle == 'monthly') {
                $next_payment = date_format(date_add(date_create($next_payment),
                    date_interval_create_from_date_string('1 months')),
                    'Y-m-d');
                $loan_schedule->due_date = $next_payment;
            }
            if ($loan->repayment_cycle == 'bi_monthly') {
                $next_payment = date_format(date_add(date_create($request->first_payment_date),
                    date_interval_create_from_date_string($period . ' months')),
                    'Y-m-d');
                $loan_schedule->due_date = $next_payment;
            }
            if ($loan->repayment_cycle == 'quarterly') {
                $next_payment = date_format(date_add(date_create($next_payment),
                    date_interval_create_from_date_string('2 months')),
                    'Y-m-d');
                $loan_schedule->due_date = $next_payment;
            }
            if ($loan->repayment_cycle == 'semi_annually') {
                $next_payment = date_format(date_add(date_create($next_payment),
                    date_interval_create_from_date_string('6 months')),
                    'Y-m-d');
                $loan_schedule->due_date = $next_payment;
            }
            if ($loan->repayment_cycle == 'yearly') {
                $next_payment = date_format(date_add(date_create($next_payment),
                    date_interval_create_from_date_string('1 years')),
                    'Y-m-d');
                $loan_schedule->due_date = $next_payment;
            }
            if ($i == $period) {
                $loan_schedule->principal_balance = round($balance);
            }
            $loan_schedule->save();
        }
        Flash::success(translate('successfully_saved'));
        return redirect('loan/loan_application/data');
    }
}

© KUJUNTI.ID