Path : /var/www/html/thb_loan_system/app/Http/Controllers/ |
B-Con CMD Config cPanel C-Rdp D-Log Info Jump Mass Ransom Symlink vHost Zone-H |
Current File : /var/www/html/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'); } }