Path : /var/www/html/thb_loan_system/app/Helpers/ |
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/Helpers/GeneralHelper.php |
<?php /** * Created by PhpStorm. * User: Tj * Date: 6/29/2016 * Time: 3:11 PM */ namespace App\Helpers; use App\Models\Asset; use App\Models\AssetValuation; use App\Models\AuditTrail; use App\Models\Capital; use App\Models\Expense; use App\Models\JournalEntry; use App\Models\Loan; use App\Models\LoanRepayment; use App\Models\LoanSchedule; use App\Models\LoanTransaction; use App\Models\OtherIncome; use App\Models\Payroll; use App\Models\PayrollMeta; use App\Models\Product; use App\Models\ProductCheckin; use App\Models\ProductCheckinItem; use App\Models\ProductCheckout; use App\Models\ProductCheckoutItem; use App\Models\Saving; use App\Models\SavingTransaction; use App\Models\Setting; use App\Models\SmsGateway; use Cartalyst\Sentinel\Laravel\Facades\Sentinel; use Illuminate\Support\Str; class GeneralHelper { //get active theme public static function get_active_theme_directory($sep = '.') { return 'themes' . $sep . Setting::where('setting_key', 'active_theme')->first()->setting_value; } /* * determine interest */ public static function determine_interest_rate($id) { $loan = Loan::find($id); $interest = ''; if ($loan->override_interest == 1) { $interest = $loan->override_interest_amount; } else { if ($loan->repayment_cycle == 'annually') { //return the interest per year if ($loan->interest_period == 'year') { $interest = $loan->interest_rate; } if ($loan->interest_period == 'month') { $interest = $loan->interest_rate * 12; } if ($loan->interest_period == 'week') { $interest = $loan->interest_rate * 52; } if ($loan->interest_period == 'day') { $interest = $loan->interest_rate * 365; } } if ($loan->repayment_cycle == 'semi_annually') { //return the interest per semi annually if ($loan->interest_period == 'year') { $interest = $loan->interest_rate / 2; } if ($loan->interest_period == 'month') { $interest = $loan->interest_rate * 6; } if ($loan->interest_period == 'week') { $interest = $loan->interest_rate * 26; } if ($loan->interest_period == 'day') { $interest = $loan->interest_rate * 182.5; } } if ($loan->repayment_cycle == 'quarterly') { //return the interest per quaterly if ($loan->interest_period == 'year') { $interest = $loan->interest_rate / 4; } if ($loan->interest_period == 'month') { $interest = $loan->interest_rate * 3; } if ($loan->interest_period == 'week') { $interest = $loan->interest_rate * 13; } if ($loan->interest_period == 'day') { $interest = $loan->interest_rate * 91.25; } } if ($loan->repayment_cycle == 'bi_monthly') { //return the interest per bi-monthly if ($loan->interest_period == 'year') { $interest = $loan->interest_rate / 6; } if ($loan->interest_period == 'month') { $interest = $loan->interest_rate * 2; } if ($loan->interest_period == 'week') { $interest = $loan->interest_rate * 8.67; } if ($loan->interest_period == 'day') { $interest = $loan->interest_rate * 58.67; } } if ($loan->repayment_cycle == 'monthly') { //return the interest per monthly if ($loan->interest_period == 'year') { $interest = $loan->interest_rate / 12; } if ($loan->interest_period == 'month') { $interest = $loan->interest_rate * 1; } if ($loan->interest_period == 'week') { $interest = $loan->interest_rate * 4.33; } if ($loan->interest_period == 'day') { $interest = $loan->interest_rate * 30.4; } } if ($loan->repayment_cycle == 'weekly') { //return the interest per weekly if ($loan->interest_period == 'year') { $interest = $loan->interest_rate / 52; } if ($loan->interest_period == 'month') { $interest = $loan->interest_rate / 4; } if ($loan->interest_period == 'week') { $interest = $loan->interest_rate; } if ($loan->interest_period == 'day') { $interest = $loan->interest_rate * 7; } } if ($loan->repayment_cycle == 'daily') { //return the interest per day if ($loan->interest_period == 'year') { $interest = $loan->interest_rate / 365; } if ($loan->interest_period == 'month') { $interest = $loan->interest_rate / 30.4; } if ($loan->interest_period == 'week') { $interest = $loan->interest_rate / 7.02; } if ($loan->interest_period == 'day') { $interest = $loan->interest_rate * 1; } } } return $interest / 100; } //determine monthly payment using amortization public static function amortized_monthly_payment($id, $balance, $isFullMonth = false) { $loan = Loan::find($id); $period = GeneralHelper::loan_period($id); $period = $isFullMonth ? $period : $period - 1; $interest_rate = GeneralHelper::determine_interest_rate($id); //calculate here $amount = ($interest_rate * $balance * pow((1 + $interest_rate), $period)) / (pow((1 + $interest_rate), $period) - 1); return $amount; } public static function loan_period($id) { $loan = Loan::find($id); $period = 0; if ($loan->repayment_cycle == 'annually') { if ($loan->loan_duration_type == 'year') { $period = ceil($loan->loan_duration); } if ($loan->loan_duration_type == 'month') { $period = ceil($loan->loan_duration * 12); } if ($loan->loan_duration_type == 'week') { $period = ceil($loan->loan_duration * 52); } if ($loan->loan_duration_type == 'day') { $period = ceil($loan->loan_duration * 365); } } if ($loan->repayment_cycle == 'semi_annually') { if ($loan->loan_duration_type == 'year') { $period = ceil($loan->loan_duration * 2); } if ($loan->loan_duration_type == 'month') { $period = ceil($loan->loan_duration * 6); } if ($loan->loan_duration_type == 'week') { $period = ceil($loan->loan_duration * 26); } if ($loan->loan_duration_type == 'day') { $period = ceil($loan->loan_duration * 182.5); } } if ($loan->repayment_cycle == 'quarterly') { if ($loan->loan_duration_type == 'year') { $period = ceil($loan->loan_duration); } if ($loan->loan_duration_type == 'month') { $period = ceil($loan->loan_duration * 12); } if ($loan->loan_duration_type == 'week') { $period = ceil($loan->loan_duration * 52); } if ($loan->loan_duration_type == 'day') { $period = ceil($loan->loan_duration * 365); } } if ($loan->repayment_cycle == 'bi_monthly') { if ($loan->loan_duration_type == 'year') { $period = ceil($loan->loan_duration * 6); } if ($loan->loan_duration_type == 'month') { $period = ceil($loan->loan_duration / 2); } if ($loan->loan_duration_type == 'week') { $period = ceil($loan->loan_duration * 8); } if ($loan->loan_duration_type == 'day') { $period = ceil($loan->loan_duration * 60); } } if ($loan->repayment_cycle == 'monthly') { if ($loan->loan_duration_type == 'year') { $period = ceil($loan->loan_duration * 12); } if ($loan->loan_duration_type == 'month') { $period = ceil($loan->loan_duration); } if ($loan->loan_duration_type == 'week') { $period = ceil($loan->loan_duration * 4.3); } if ($loan->loan_duration_type == 'day') { $period = ceil($loan->loan_duration * 30.4); } } if ($loan->repayment_cycle == 'weekly') { if ($loan->loan_duration_type == 'year') { $period = ceil($loan->loan_duration * 52); } if ($loan->loan_duration_type == 'month') { $period = ceil($loan->loan_duration * 4); } if ($loan->loan_duration_type == 'week') { $period = ceil($loan->loan_duration * 1); } if ($loan->loan_duration_type == 'day') { $period = ceil($loan->loan_duration * 7); } } if ($loan->repayment_cycle == 'daily') { if ($loan->loan_duration_type == 'year') { $period = ceil($loan->loan_duration * 365); } if ($loan->loan_duration_type == 'month') { $period = ceil($loan->loan_duration * 30.42); } if ($loan->loan_duration_type == 'week') { $period = ceil($loan->loan_duration * 7.02); } if ($loan->loan_duration_type == 'day') { $period = ceil($loan->loan_duration); } } return $period; } public static function time_ago($eventTime) { $totaldelay = time() - strtotime($eventTime); if ($totaldelay <= 0) { return ''; } else { if ($days = floor($totaldelay / 86400)) { $totaldelay = $totaldelay % 86400; return $days . ' days ago'; } if ($hours = floor($totaldelay / 3600)) { $totaldelay = $totaldelay % 3600; return $hours . ' hours ago'; } if ($minutes = floor($totaldelay / 60)) { $totaldelay = $totaldelay % 60; return $minutes . ' minutes ago'; } if ($seconds = floor($totaldelay / 1)) { $totaldelay = $totaldelay % 1; return $seconds . ' seconds ago'; } } } public static function determine_due_date($id, $date) { $schedule = LoanSchedule::where('due_date', ' >=', $date)->where('loan_id', $id)->orderBy('due_date', 'asc')->first(); if (!empty($schedule)) { return $schedule->due_date; } else { $schedule = LoanSchedule::where('loan_id', $id)->orderBy('due_date', 'desc')->first(); if ($date > $schedule->due_date) { return $schedule->due_date; } else { $schedule = LoanSchedule::where('due_date', '>=', $date)->where('loan_id', $id)->orderBy('due_date', 'asc')->first(); return $schedule->due_date; } } } public static function loan_total_interest($id, $date = '') { return LoanSchedule::query() ->when(!is_array($id), function ($query) use ($id) { $query->where('loan_id', $id); }) ->when(is_array($id), function ($query) use ($id) { $query->whereIn('loan_id', $id); }) ->when(!empty($date), function ($query) use ($date) { $query->where('due_date', '<=', $date); }) ->sum('interest'); /* if (empty($date)) { return LoanSchedule::where('loan_id', $id)->sum('interest'); } else { return LoanSchedule::where('loan_id', $id)->where('due_date', '<=', $date)->sum('interest'); } */ } public static function loan_total_interest_pay_off($id, $date = '') { return LoanSchedule::query() ->when(!is_array($id), function ($query) use ($id) { $query->where('loan_id', $id); }) ->when(is_array($id), function ($query) use ($id) { $query->whereIn('loan_id', $id); }) ->when(!empty($date), function ($query) use ($date) { $query->where('due_date', '<=', $date); }) ->sum('interest'); /* if (empty($date)) { return LoanSchedule::where('loan_id', $id)->sum('interest'); } else { return LoanSchedule::where('loan_id', $id)->where('due_date', '<=', $date)->sum('interest'); } */ } public static function loan_total_interest_waived($id, $date = '') { return LoanSchedule::query() ->when(!is_array($id), function ($query) use ($id) { $query->where('loan_id', $id); }) ->when(is_array($id), function ($query) use ($id) { $query->whereIn('loan_id', $id); }) ->when(!empty($date), function ($query) use ($date) { $query->where('due_date', '<=', $date); }) ->sum('interest_waived'); /* if (empty($date)) { return LoanSchedule::where('loan_id', $id)->sum('interest_waived'); } else { return LoanSchedule::where('loan_id', $id)->where('due_date', '<=', $date)->sum('interest_waived'); } */ } public static function loan_total_principal($id, $date = '') { return LoanSchedule::query() ->when(!is_array($id), function ($query) use ($id) { $query->where('loan_id', $id); }) ->when(is_array($id), function ($query) use ($id) { $query->whereIn('loan_id', $id); }) ->when(!empty($date), function ($query) use ($date) { $query->where('due_date', '<=', $date); }) ->sum('principal'); /* if (empty($date)) { return LoanSchedule::where('loan_id', $id)->sum('principal'); } return LoanSchedule::where('loan_id', $id)->where('due_date', '<=', $date)->sum('principal'); */ } public static function loan_total_fees($id, $date = '') { return LoanSchedule::query() ->when(!is_array($id), function ($query) use ($id) { $query->where('loan_id', $id); }) ->when(is_array($id), function ($query) use ($id) { $query->whereIn('loan_id', $id); }) ->when(!empty($date), function ($query) use ($date) { $query->where('due_date', '<=', $date); }) ->sum('fees'); /* if (empty($date)) { return LoanSchedule::where('loan_id', $id)->sum('fees'); } return LoanSchedule::where('loan_id', $id)->where('due_date', '<=', $date)->sum('fees'); */ } public static function loan_total_penalty($id, $date = '') { return LoanSchedule::query() ->when($date, function ($query) use ($date) { $query->where('due_date', '<=', $date); }) ->when(!is_array($id), function ($query) use ($id) { $query->where('loan_id', $id); }) ->when(is_array($id), function ($query) use ($id) { $query->whereIn('loan_id', $id); }) ->sum('penalty'); /* if (empty($date)) { return LoanSchedule::where('loan_id', $id)->sum('penalty'); } else { return LoanSchedule::where('loan_id', $id)->where('due_date', '<=', $date)->sum('penalty'); } */ } public static function loan_total_pay_off($id, $date = '') { return LoanSchedule::query() ->when($date, function ($query) use ($date) { $query->where('due_date', '<=', $date); }) ->when(!is_array($id), function ($query) use ($id) { $query->where('loan_id', $id); }) ->when(is_array($id), function ($query) use ($id) { $query->whereIn('loan_id', $id); }) ->sum('pay_off'); /* if (empty($date)) { return LoanSchedule::where('loan_id', $id)->sum('pay_off'); } else { return LoanSchedule::where('loan_id', $id)->where('due_date', '<=', $date)->sum('pay_off'); } */ } public static function loan_total_paid($id, $date = '') { if (empty($date)) { return LoanTransaction::where('loan_id', $id)->whereIn('transaction_type', [ 'repayment', 'pay_off'])->where('reversed', 0)->sum('credit'); } else { return LoanTransaction::where('loan_id', $id)->whereIn('transaction_type', [ 'repayment', 'pay_off'])->where('reversed', 0)->where('due_date', '<=', $date)->sum('credit'); } } public static function loan_paid($schedule_id) { return LoanTransaction::where('loan_schedule_id', $schedule_id)->whereIn('transaction_type', ['repayment', 'pay_off'])->where('reversed', 0)->sum('credit'); } public static function loan_total_balance($id, $date = '') { if (empty($date)) { // dd($id, GeneralHelper::loan_total_due_amount($id) , GeneralHelper::loan_total_paid($id)); return GeneralHelper::loan_total_due_amount($id) - GeneralHelper::loan_total_paid($id); } else { return GeneralHelper::loan_total_due_amount($id, $date) - GeneralHelper::loan_total_paid($id, $date); } } public static function loan_total_due_amount($id, $date = '') { if (empty($date)) { return (GeneralHelper::loan_total_penalty($id) + GeneralHelper::loan_total_fees($id) + GeneralHelper::loan_total_interest($id) + GeneralHelper::loan_total_principal($id) - GeneralHelper::loan_total_interest_waived($id)) + GeneralHelper::loan_total_pay_off($id); } return (GeneralHelper::loan_total_penalty($id, $date) + GeneralHelper::loan_total_fees($id, $date) + GeneralHelper::loan_total_interest($id, $date) + GeneralHelper::loan_total_principal($id, $date) - GeneralHelper::loan_total_interest_waived($id, $date)) + GeneralHelper::loan_total_pay_off($id); } public static function loan_total_due_period($id, $date) { return (LoanSchedule::where('loan_id', $id)->where('due_date', $date)->sum('penalty') + LoanSchedule::where('loan_id', $id)->where('due_date', $date)->sum('fees') + LoanSchedule::where('loan_id', $id)->where('due_date', $date)->sum('principal') + LoanSchedule::where('loan_id', $id)->where('due_date', $date)->sum('interest') + LoanSchedule::where('loan_id', $id)->where('due_date', $date)->sum('interest_waived')); } public static function loan_total_paid_period($id, $date) { return LoanRepayment::where('loan_id', $id)->where('due_date', $date)->sum('amount'); } public static function loans_total_paid($start_date = '', $end_date = '') { return Loan::query() ->select('id') ->whereIn('status', ['disbursed', 'closed', 'written_off']) ->when(!empty($start_date) && !empty($end_date), function ($query) use ($start_date, $end_date) { $query->whereBetween('release_date', [$start_date, $end_date]); }) ->withSum(['transactions' => function ($query) { $query->whereIn('transaction_type', ['repayment', 'pay_off'])->where('reversed', 0); }], 'credit') ->get() ->sum('transactions_sum_credit'); /* if (empty($start_date)) { $paid = 0; foreach (Loan::whereIn('status', ['disbursed', 'closed', 'written_off'])->get() as $key) { $paid = $paid + LoanTransaction::where('loan_id', $key->id)->whereIn('transaction_type', [ 'repayment', 'pay_off'])->where('reversed', 0)->sum('credit'); } dd($paid); return $paid; } else { $paid = 0; foreach (Loan::whereIn('status', ['disbursed', 'closed', 'written_off'])->whereBetween('release_date', [$start_date, $end_date])->get() as $key) { $paid = $paid + LoanTransaction::where('loan_id', $key->id)->whereIn('transaction_type', [ 'repayment', 'pay_off'])->where('reversed', 0)->sum('credit'); } dd($paid); return $paid; } */ } public static function diff_in_months(\DateTime $date1, \DateTime $date2) { $diff = $date1->diff($date2); $months = $diff->y * 12 + $diff->m + $diff->d / 30; return (int)round($months); } public static function addMonths($date, $months) { $orig_day = $date->format("d"); $date->modify("+" . $months . " months"); while ($date->format("d") < $orig_day && $date->format("d") < 5) { $date->modify("-1 day"); } } //determine paid principal public static function loan_paid_item($id, $item = 'principal', $date = '') { $loan = Loan::find($id); $principal = 0; $interest = 0; $penalty = 0; $fees = 0; if (empty($date)) { $schedules = $loan->schedules; $payments = LoanRepayment::where('loan_id', $id)->sum('amount'); } else { $schedules = LoanSchedule::where('loan_id', $id)->where('due_date', '<=', $date)->get(); $payments = LoanRepayment::where('loan_id', $id)->where('due_date', '<=', $date)->sum('amount'); } if (!empty($loan->loan_product)) { $repayment_order = unserialize($loan->loan_product->repayment_order); foreach ($schedules as $schedule) { if ($payments > 0) { foreach ($repayment_order as $order) { if ($payments > 0) { if ($order == 'interest') { if ($payments > $schedule->interest) { $interest = $interest + $schedule->interest; $payments = $payments - $schedule->interest; } else { $interest = $interest + $payments; $payments = 0; } } if ($order == 'penalty') { if ($payments > $schedule->penalty) { $penalty = $penalty + $schedule->penalty; $payments = $payments - $schedule->penalty; } else { $penalty = $penalty + $payments; $payments = 0; } } if ($order == 'fees') { if ($payments > $schedule->fees) { $fees = $fees + $schedule->fees; $payments = $payments - $schedule->fees; } else { $fees = $fees + $payments; $payments = 0; } } if ($order == 'principal') { if ($payments > $schedule->principal) { $principal = $principal + $schedule->principal; $payments = $payments - $schedule->principal; } else { $principal = $principal + $payments; $payments = 0; } } } } } //apply remainder to principal $principal = $principal + $payments; } } if ($item == 'principal') { return $principal; } if ($item == 'fees') { return $fees; } if ($item == 'penalty') { return $penalty; } if ($item == 'interest') { return $interest; } return $principal; } public static function loan_terms_paid_item($id, $item = 'principal') { $loan = Loan::find($id); $principal = 0; $interest = 0; $penalty = 0; $fees = 0; $payments = GeneralHelper::loan_total_paid($id); $total_principal = GeneralHelper::loan_total_principal($id); $total_interest = GeneralHelper::loan_total_interest($id); $total_fees = GeneralHelper::loan_total_fees($id); $total_penalty = GeneralHelper::loan_total_penalty($id); if (!empty($loan->loan_product)) { $repayment_order = unserialize($loan->loan_product->repayment_order); if ($payments > 0) { foreach ($repayment_order as $order) { if ($payments > 0) { if ($order == 'interest') { if ($payments > $total_interest) { $interest = $interest + $total_interest; $payments = $payments - $total_interest; } else { $interest = $interest + $payments; $payments = 0; } } if ($order == 'penalty') { if ($payments > $total_penalty) { $penalty = $penalty + $total_penalty; $payments = $payments - $total_penalty; } else { $penalty = $penalty + $payments; $payments = 0; } } if ($order == 'fees') { if ($payments > $total_fees) { $fees = $fees + $total_fees; $payments = $payments - $total_fees; } else { $fees = $fees + $payments; $payments = 0; } } if ($order == 'principal') { if ($payments > $total_principal) { $principal = $principal + $total_principal; $payments = $payments - $total_principal; } else { $principal = $principal + $payments; $payments = 0; } } } } //apply remainder to principal $principal = $principal + $payments; } } if ($item == 'principal') { return $principal; } if ($item == 'fees') { return $fees; } if ($item == 'penalty') { return $penalty; } if ($item == 'interest') { return $interest; } return $principal; } public static function single_payroll_total_pay($id) { return PayrollMeta::where('payroll_id', $id)->where('position', 'bottom_left')->sum('value'); } public static function single_payroll_total_deductions($id) { return PayrollMeta::where('payroll_id', $id)->where('position', 'bottom_right')->sum('value'); } public static function total_expenses($start_date = '', $end_date = '') { if (empty($start_date)) { return Expense::where('branch_id', session('branch_id'))->sum('amount'); } else { return Expense::where('branch_id', session('branch_id'))->whereBetween('date', [$start_date, $end_date])->sum('amount'); } } public static function total_payroll($start_date = '', $end_date = '') { if (empty($start_date)) { $payroll = 0; foreach (Payroll::where('branch_id', session('branch_id'))->get() as $key) { $payroll = $payroll + GeneralHelper::single_payroll_total_pay($key->id); } return $payroll; } else { $payroll = 0; foreach (Payroll::where('branch_id', session('branch_id'))->whereBetween('date', [$start_date, $end_date])->get() as $key) { $payroll = $payroll + GeneralHelper::single_payroll_total_pay($key->id); } return $payroll; } } public static function loans_total_principal($start_date = '', $end_date = '') { $principal = 0; if (empty($start_date)) { $principal = Loan::query() ->select('id') ->withSum('schedules', 'principal') ->where('branch_id', session('branch_id')) ->whereIn('status', ['disbursed', 'closed', 'written_off']) ->get() ->sum('schedules_sum_principal'); } else { $principal = Loan::query() ->where('branch_id', session('branch_id')) ->whereIn('status', ['disbursed', 'closed', 'written_off']) ->whereBetween('release_date', [$start_date, $end_date]) ->sum('principal'); } return $principal; } public static function total_other_income($start_date = '', $end_date = '') { if (empty($start_date)) { return OtherIncome::where('branch_id', session('branch_id'))->sum('amount'); } else { return OtherIncome::where('branch_id', session('branch_id'))->whereBetween('date', [$start_date, $end_date])->sum('amount'); } } public static function total_savings_interest($start_date = '', $end_date = '') { if (empty($start_date)) { return SavingTransaction::where('branch_id', session('branch_id'))->where('type', 'interest')->where('reversed', 0)->sum('debit'); } else { return SavingTransaction::where('branch_id', session('branch_id'))->where('type', 'interest')->where('reversed', 0)->whereBetween('date', [$start_date, $end_date])->sum('debit'); } } public static function total_savings_deposits($start_date = '', $end_date = '') { if (empty($start_date)) { return SavingTransaction::where('branch_id', session('branch_id'))->where('type', 'deposit')->where('reversed', 0)->sum('credit'); } else { return SavingTransaction::where('branch_id', session('branch_id'))->where('type', 'deposit')->where('reversed', 0)->whereBetween('date', [$start_date, $end_date])->sum('credit'); } } public static function total_savings_transactions($id, $start_date = '', $end_date = '') { $interest = 0; $deposits = 0; $withdrawals = 0; $fees = 0; $guarantee = 0; $allocation = []; if (empty($start_date)) { foreach (SavingTransaction::where('savings_id', $id)->where('reversed', 0)->get() as $key) { if ($key->type == "interest") { $interest = $interest + $key->credit; } if ($key->type == "deposit") { $deposits = $deposits + $key->credit; } if ($key->type == "interest") { $withdrawals = $withdrawals + $key->debit; } if ($key->type == "bank_fees") { $fees = $fees + $key->credit; } if ($key->type == "guarantee") { $guarantee = $guarantee + $key->credit; } } } else { foreach (SavingTransaction::where('savings_id', $id)->where('reversed', 0)->whereBetween('date', [$start_date, $end_date])->get() as $key) { if ($key->type == "interest") { $interest = $interest + $key->credit; } if ($key->type == "deposit") { $deposits = $deposits + $key->credit; } if ($key->type == "interest") { $withdrawals = $withdrawals + $key->debit; } if ($key->type == "bank_fees") { $fees = $fees + $key->credit; } if ($key->type == "guarantee") { $guarantee = $guarantee + $key->credit; } } } $allocation["interest"] = $interest; $allocation["deposits"] = $deposits; $allocation["withdrawals"] = $withdrawals; $allocation["fees"] = $fees; $allocation["guarantee"] = $guarantee; return $allocation; } public static function total_savings_withdrawals($start_date = '', $end_date = '') { if (empty($start_date)) { return SavingTransaction::where('branch_id', session('branch_id'))->where('type', 'withdrawal')->where('reversed', 0)->sum('credit'); } else { return SavingTransaction::where('branch_id', session('branch_id'))->where('type', 'withdrawal')->where('reversed', 0)->whereBetween('date', [$start_date, $end_date])->sum('credit'); } } public static function total_capital($start_date = '', $end_date = '') { if (empty($start_date)) { return Capital::where('branch_id', session('branch_id'))->where('type', 'deposit')->sum('amount') - Capital::where('branch_id', session('branch_id'))->where('type', 'withdrawal')->sum('amount'); } else { return Capital::where('branch_id', session('branch_id'))->where('type', 'deposit')->sum('amount') - Capital::where('branch_id', session('branch_id'))->where('type', 'withdrawal')->sum('amount'); } } public static function loans_total_paid_item($item, $start_date = '', $end_date = '') { if (empty($start_date)) { $amount = 0; foreach (Loan::where('branch_id', session('branch_id'))->whereIn('status', ['disbursed', 'closed', 'written_off'])->get() as $key) { $amount = $amount + GeneralHelper::loan_terms_paid_item($key->id, $item); } return $amount; } else { $amount = 0; foreach (Loan::where('branch_id', session('branch_id'))->whereIn('status', ['disbursed', 'closed', 'written_off'])->whereBetween('release_date', [$start_date, $end_date])->get() as $key) { $amount = $amount + GeneralHelper::loan_terms_paid_item($key->id, $item); } return $amount; } } public static function loans_product_total_paid_item($id, $item, $start_date = '', $end_date = '') { if (empty($start_date)) { $amount = 0; foreach (Loan::where('loan_product_id', $id)->where('branch_id', session('branch_id'))->whereIn('status', ['disbursed', 'closed', 'written_off'])->get() as $key) { $amount = $amount + GeneralHelper::loan_terms_paid_item($key->id, $item); } return $amount; } else { $amount = 0; foreach (Loan::where('loan_product_id', $id)->where('branch_id', session('branch_id'))->whereIn('status', ['disbursed', 'closed', 'written_off'])->whereBetween('release_date', [$start_date, $end_date])->get() as $key) { $amount = $amount + GeneralHelper::loan_terms_paid_item($key->id, $item); } return $amount; } } public static function loans_borrower_total_paid_item($id, $item, $start_date = '', $end_date = '') { if (empty($start_date)) { $amount = 0; foreach (Loan::where('borrower_id', $id)->where('branch_id', session('branch_id'))->whereIn('status', ['disbursed', 'closed', 'written_off'])->get() as $key) { $amount = $amount + GeneralHelper::loan_terms_paid_item($key->id, $item); } return $amount; } else { $amount = 0; foreach (Loan::where('borrower_id', $id)->where('branch_id', session('branch_id'))->whereIn('status', ['disbursed', 'closed', 'written_off'])->whereBetween('release_date', [$start_date, $end_date])->get() as $key) { $amount = $amount + GeneralHelper::loan_terms_paid_item($key->id, $item); } return $amount; } } public static function loans_total_due_item($item, $start_date = '', $end_date = '') { if (empty($start_date)) { $amount = 0; foreach (Loan::where('branch_id', session('branch_id'))->whereIn('status', ['disbursed', 'closed', 'written_off'])->get() as $key) { if ($item == 'principal') { $amount = $amount + GeneralHelper::loan_total_principal($key->id); } if ($item == 'interest') { $amount = $amount + GeneralHelper::loan_total_interest($key->id); } if ($item == 'fees') { $amount = $amount + GeneralHelper::loan_total_fees($key->id); } if ($item == 'penalty') { $amount = $amount + GeneralHelper::loan_total_penalty($key->id); } } return $amount; } else { $amount = 0; foreach (Loan::where('branch_id', session('branch_id'))->whereIn('status', ['disbursed', 'closed', 'written_off'])->whereBetween('release_date', [$start_date, $end_date])->get() as $key) { if ($item == 'principal') { $amount = $amount + GeneralHelper::loan_total_principal($key->id); } if ($item == 'interest') { $amount = $amount + GeneralHelper::loan_total_interest($key->id); } if ($item == 'fees') { $amount = $amount + GeneralHelper::loan_total_fees($key->id); } if ($item == 'penalty') { $amount = $amount + GeneralHelper::loan_total_penalty($key->id); } } return $amount; } } public static function loans_product_total_due_items($id, $start_date = '', $end_date = '') { if (empty($start_date)) { $interest = 0; $penalty = 0; $fees = 0; $principal = 0; foreach (Loan::where('loans.loan_product_id', $id)->where('loans.branch_id', session('branch_id'))->whereIn('loans.status', ['disbursed', 'closed', 'written_off'])->join('loan_schedules', 'loans.id', '=', 'loan_schedules.loan_id')->where('loan_schedules.deleted_at', NULL)->get() as $key) { $interest = $interest + $key->interest; $penalty = $penalty + $key->penalty; $fees = $fees + $key->fees; $principal = $principal + $key->principal; } return ["interest" => $interest, 'principal' => $principal, 'penalty' => $penalty, 'fees' => $fees]; } else { $interest = 0; $penalty = 0; $fees = 0; $principal = 0; foreach (Loan::where('loans.loan_product_id', $id)->where('loans.branch_id', session('branch_id'))->whereIn('loans.status', ['disbursed', 'closed', 'written_off'])->join('loan_schedules', 'loans.id', '=', 'loan_schedules.loan_id')->whereBetween('loan_schedules.due_date', [$start_date, $end_date])->where('loan_schedules.deleted_at', NULL)->get() as $key) { $interest = $interest + $key->interest; $penalty = $penalty + $key->penalty; $fees = $fees + $key->fees; $principal = $principal + $key->principal; } return ["interest" => $interest, 'principal' => $principal, 'penalty' => $penalty, 'fees' => $fees]; } } public static function loans_product_total_paid_items($id, $start_date = '', $end_date = '') { if (empty($start_date)) { $interest = 0; $penalty = 0; $fees = 0; $principal = 0; foreach (Loan::where('loans.loan_product_id', $id)->where('loans.branch_id', session('branch_id'))->whereIn('loans.status', ['disbursed', 'closed', 'written_off'])->join('loan_repayments', 'loans.id', '=', 'loan_repayments.loan_id')->where('loan_repayments.deleted_at', NULL)->get() as $key) { $interest = $interest + $key->interest; $penalty = $penalty + $key->penalty; $fees = $fees + $key->fees; $principal = $principal + $key->principal; } return ["interest" => $interest, 'principal' => $principal, 'penalty' => $penalty, 'fees' => $fees]; } else { $interest = 0; $penalty = 0; $fees = 0; $principal = 0; foreach (Loan::where('loans.loan_product_id', $id)->where('loans.branch_id', session('branch_id'))->whereIn('loans.status', ['disbursed', 'closed', 'written_off'])->join('loan_repayments', 'loans.id', '=', 'loan_repayments.loan_id')->whereBetween('loan_repayments.collection_date', [$start_date, $end_date])->where('loan_repayments.deleted_at', NULL)->get() as $key) { $interest = $interest + $key->interest; $penalty = $penalty + $key->penalty; $fees = $fees + $key->fees; $principal = $principal + $key->principal; } return ["interest" => $interest, 'principal' => $principal, 'penalty' => $penalty, 'fees' => $fees]; } } public static function loans_borrower_total_due_item($id, $item, $start_date = '', $end_date = '') { if (empty($start_date)) { $amount = 0; foreach (Loan::where('borrower_id', $id)->where('branch_id', session('branch_id'))->whereIn('status', ['disbursed', 'closed', 'written_off'])->get() as $key) { if ($item == 'principal') { $amount = $amount + GeneralHelper::loan_total_principal($key->id); } if ($item == 'interest') { $amount = $amount + GeneralHelper::loan_total_interest($key->id); } if ($item == 'fees') { $amount = $amount + GeneralHelper::loan_total_fees($key->id); } if ($item == 'penalty') { $amount = $amount + GeneralHelper::loan_total_penalty($key->id); } } return $amount; } else { $amount = 0; foreach (Loan::where('borrower_id', $id)->where('branch_id', session('branch_id'))->whereIn('status', ['disbursed', 'closed', 'written_off'])->whereBetween('release_date', [$start_date, $end_date])->get() as $key) { if ($item == 'principal') { $amount = $amount + GeneralHelper::loan_total_principal($key->id); } if ($item == 'interest') { $amount = $amount + GeneralHelper::loan_total_interest($key->id); } if ($item == 'fees') { $amount = $amount + GeneralHelper::loan_total_fees($key->id); } if ($item == 'penalty') { $amount = $amount + GeneralHelper::loan_total_penalty($key->id); } } return $amount; } } public static function loans_total_default($start_date = '', $end_date = '') { if (empty($start_date)) { $principal = 0; foreach (Loan::where('branch_id', session('branch_id'))->where('status', 'written_off')->get() as $key) { $principal = $principal + ($key->principal - GeneralHelper::loan_total_paid($key->id)); } return $principal; } else { $principal = 0; foreach (Loan::where('branch_id', session('branch_id'))->where('status', 'written_off')->whereBetween('release_date', [$start_date, $end_date])->get() as $key) { $principal = $principal + ($key->principal - GeneralHelper::loan_total_paid($key->id)); } return $principal; } } public static function loans_total_due($start_date = '', $end_date = '') { $loan_ids = Loan::query() ->where('branch_id', session('branch_id')) ->whereIn('status', ['disbursed', 'closed', 'written_off']) ->when(!empty($start_date) && !empty($end_date), function ($query) use ($start_date, $end_date) { $query->whereBetween('release_date', [$start_date, $end_date]); }) ->pluck('id') ->toArray(); return GeneralHelper::loan_total_due_amount($loan_ids); /* if (empty($start_date)) { $due = 0; foreach (Loan::where('branch_id', session('branch_id'))->whereIn('status', ['disbursed', 'closed', 'written_off'])->get() as $key) { $due = $due + GeneralHelper::loan_total_due_amount($key->id); } return $due; } else { $due = 0; foreach (Loan::where('branch_id', session('branch_id'))->whereIn('status', ['disbursed', 'closed', 'written_off'])->whereBetween('release_date', [$start_date, $end_date])->get() as $key) { $due = $due + GeneralHelper::loan_total_due_amount($key->id); } return $due; } */ } public static function loans_count($start_date = '', $end_date = '') { if (empty($start_date)) { $due = 0; $due = $due + Loan::where('branch_id', session('branch_id'))->whereIn('status', ['disbursed', 'closed', 'written_off'])->count(); return $due; } else { $due = 0; $due = $due + Loan::where('branch_id', session('branch_id'))->whereIn('status', ['disbursed', 'closed', 'written_off'])->whereBetween('release_date', [$start_date, $end_date])->count(); return $due; } } public static function loans_product_count($id, $start_date = '', $end_date = '') { if (empty($start_date)) { $due = 0; $due = $due + Loan::where('loan_product_id', $id)->where('branch_id', session('branch_id'))->whereIn('status', ['disbursed', 'closed', 'written_off'])->count(); return $due; } else { $due = 0; $due = $due + Loan::where('loan_product_id', $id)->where('branch_id', session('branch_id'))->whereIn('status', ['disbursed', 'closed', 'written_off'])->whereBetween('release_date', [$start_date, $end_date])->count(); return $due; } } public static function loans_borrower_count($id, $start_date = '', $end_date = '') { if (empty($start_date)) { $due = 0; $due = $due + Loan::where('borrower_id', $id)->where('branch_id', session('branch_id'))->whereIn('status', ['disbursed', 'closed', 'written_off'])->count(); return $due; } else { $due = 0; $due = $due + Loan::where('borrower_id', $id)->where('branch_id', session('branch_id'))->whereIn('status', ['disbursed', 'closed', 'written_off'])->whereBetween('release_date', [$start_date, $end_date])->count(); return $due; } } public static function payments_product_count($id, $start_date = '', $end_date = '') { if (empty($start_date)) { $due = 0; foreach (Loan::where('loan_product_id', $id)->where('branch_id', session('branch_id'))->whereIn('status', ['disbursed', 'closed', 'written_off'])->get() as $key) { $due = $due + LoanTransaction::where('loan_id', $key->id)->whereIn('transaction_type', [ 'repayment', 'pay_off'])->where('reversed', 0)->count(); } return $due; } else { $due = 0; foreach (Loan::where('loan_product_id', $id)->where('branch_id', session('branch_id'))->whereIn('status', ['disbursed', 'closed', 'written_off'])->whereBetween('release_date', [$start_date, $end_date])->get() as $key) { $due = $due + LoanTransaction::where('loan_id', $key->id)->whereIn('transaction_type', [ 'repayment', 'pay_off'])->where('reversed', 0)->count(); } return $due; } } public static function payments_borrower_count($id, $start_date = '', $end_date = '') { if (empty($start_date)) { $due = 0; foreach (Loan::where('borrower_id', $id)->where('branch_id', session('branch_id'))->whereIn('status', ['disbursed', 'closed', 'written_off'])->get() as $key) { $due = $due + LoanTransaction::where('loan_id', $key->id)->whereIn('transaction_type', [ 'repayment', 'pay_off'])->where('reversed', 0)->count(); } return $due; } else { $due = 0; foreach (Loan::where('borrower_id', $id)->where('branch_id', session('branch_id'))->whereIn('status', ['disbursed', 'closed', 'written_off'])->whereBetween('release_date', [$start_date, $end_date])->get() as $key) { $due = $due + LoanTransaction::where('loan_id', $key->id)->whereIn('transaction_type', [ 'repayment', 'pay_off'])->where('reversed', 0)->count(); } return $due; } } public static function borrower_loans_total_due($id) { $due = 0; foreach (Loan::whereIn('status', ['disbursed', 'closed', 'written_off'])->where('borrower_id', $id)->get() as $key) { $due = $due + GeneralHelper::loan_total_due_amount($key->id); } return $due; } public static function borrower_loans_total_paid($id) { $paid = 0; foreach (Loan::whereIn('status', ['disbursed', 'closed', 'written_off'])->where('borrower_id', $id)->get() as $key) { $paid = $paid + LoanTransaction::where('loan_id', $key->id)->whereIn('transaction_type', [ 'repayment', 'pay_off'])->where('reversed', 0)->sum('credit'); } return $paid; } public static function audit_trail($notes) { $audit_trail = new AuditTrail(); $audit_trail->user_id = Sentinel::getUser()->id; $audit_trail->user = Sentinel::getUser()->first_name . ' ' . Sentinel::getUser()->last_name; $audit_trail->notes = $notes; $audit_trail->branch_id = session('branch_id'); $audit_trail->save(); } public static function savings_account_balance($id) { $balance = 0; $cr = 0; $dr = 0; foreach (SavingTransaction::where('savings_id', $id)->get() as $key) { $cr = $cr + $key->credit; $dr = $dr + $key->debit; } return $cr - $dr; } public static function borrower_savings_account_balance($id) { $balance = 0; foreach (Saving::where('borrower_id', $id)->get() as $key) { $balance = $balance - GeneralHelper::savings_account_balance($key->id); } return $balance; } public static function asset_valuation($id, $start_date = '') { if (empty($start_date)) { $value = 0; if (!empty(AssetValuation::where('asset_id', $id)->orderBy('date', 'desc')->first())) { $value = AssetValuation::where('asset_id', $id)->orderBy('date', 'desc')->first()->amount; } return $value; } else { $value = 0; if (!empty(AssetValuation::where('asset_id', $id)->where('date', '<=', $start_date)->orderBy('date', 'desc')->first()) ) { $value = AssetValuation::where('asset_id', $id)->where('date', '<=', $start_date)->orderBy('date', 'desc')->first()->amount; } return $value; } } public static function asset_type_valuation($id, $start_date = '') { if (empty($start_date)) { $value = 0; foreach (Asset::where('asset_type_id', $id)->get() as $key) { if (!empty(AssetValuation::where('asset_id', $key->id)->orderBy('date', 'desc')->first())) { $value = AssetValuation::where('asset_id', $key->id)->orderBy('date', 'desc')->first()->amount; } } return $value; } else { $value = 0; foreach (Asset::where('asset_type_id', $id)->get() as $key) { if (!empty(AssetValuation::where('asset_id', $key->id)->where('date', '<=', $start_date)->orderBy('date', 'desc')->first()) ) { $value = AssetValuation::where('asset_id', $key->id)->where('date', '<=', $start_date)->orderBy('date', 'desc')->first()->amount; } } return $value; } } public static function bank_account_balance($id) { return Capital::where('bank_account_id', $id)->where('branch_id', session('branch_id'))->where('type', 'deposit')->sum('amount') - Capital::where('bank_account_id', $id)->where('branch_id', session('branch_id'))->where('type', 'withdrawal')->sum('amount'); } public static function send_sms($to, $msg) { if (Setting::where('setting_key', 'sms_enabled')->first()->setting_value == 1) { if (!empty(SmsGateway::find(Setting::where('setting_key', 'active_sms')->first()->setting_value)) ) { $active_sms = SmsGateway::find(Setting::where('setting_key', 'active_sms')->first()->setting_value); $append = "&"; $append .= $active_sms->to_name . "=" . $to; $append .= "&" . $active_sms->msg_name . "=" . $msg; $url = $active_sms->url . $append; //send sms here $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_VERBOSE, true); $curl_scraped_page = curl_exec($ch); curl_close($ch); } } } public static function buildTree($data, $parent = 0) { $tree = array(); foreach ($data as $d) { if ($d['parent_id'] == $parent) { $children = GeneralHelper::buildTree($data, $d['id']); // set a trivial key if (!empty($children)) { $d['_children'] = $children; } $tree[] = $d; } } return $tree; } public static function printTree($tree, $r = 0, $p = null) { foreach ($tree as $i => $t) { $dash = ($t['parent_id'] == 0) ? '' : str_repeat('-', $r) . ' '; printf("\t<option value='%d'>%s%s</option>\n", $t['id'], $dash, $t['name']); if (isset($t['_children'])) { GeneralHelper::printTree($t['_children'], $r + 1, $t['parent_id']); } } } public static function printTableTree($tree, $r = 0, $p = null) { $html = ''; foreach ($tree as $i => $t) { $dash = ($t['parent_id'] == 0) ? '' : str_repeat('-', $r) . ' '; $html .= '<tr>'; $html .= "<td>" . $dash . $t['name'] . '</td>'; $html .= "<td>" . $t['slug'] . '</td>'; if ($t['active'] == 1) { $html .= "<td><span class='label label-success'>" . translate('yes') . "</span></td>"; } else { $html .= "<td><span class='label label-danger'>" . translate('no') . "</span></td>"; } $html .= "<td>" . $t['notes'] . '</td>'; $html .= "<td>" . count($t['products']) . '</td>'; $html .= "<td> <div class='btn-group'>"; $html .= '<button type="button" class="btn btn-info btn-xs dropdown-toggle" data-toggle="dropdown" aria-expanded="false">' . translate('choose'); $html .= '<span class="caret"></span><span class="sr-only">Toggle Dropdown</span></button>'; $html .= '<ul class="dropdown-menu" role="menu">'; if (Sentinel::hasAccess('stock.update')) { $html .= '<li><a href="' . url('product/category/' . $t['id'] . '/edit') . '"><i class="fa fa-edit"></i>' . translate('edit') . '</a> </li>'; } if (Sentinel::hasAccess('stock.delete')) { $html .= '<li><a href="' . url('product/category/' . $t['id'] . '/delete') . '" class="delete"><i class="fa fa-trash"></i>' . translate('delete') . '</a> </li>'; } $html .= '</ul></div></td>'; $html .= '</tr>'; if (isset($t['_children'])) { $html .= GeneralHelper::printTableTree($t['_children'], $r + 1, $t['parent_id']); } } return $html; } public static function getUniqueSlug($model, $value) { $slug = Str::slug($value); $slugCount = count($model->whereRaw("slug REGEXP '^{$slug}(-[0-9]+)?$' and id != '{$model->id}'")->get()); return ($slugCount > 0) ? "{$slug}-{$slugCount}" : $slug; } public static function limit_text($text, $limit) { if (str_word_count($text, 0) > $limit) { $words = str_word_count($text, 2); $pos = array_keys($words); $text = substr($text, 0, $pos[$limit]) . '...'; } return $text; } public static function check_in_total_amount($id) { return ProductCheckinItem::where('product_check_in_id', $id)->sum('total_cost'); } public static function check_in_total_paid_amount($id) { return ProductCheckinItem::where('product_check_in_id', $id)->sum('total_cost'); } public static function check_out_total_amount($id) { return ProductCheckoutItem::where('product_check_out_id', $id)->sum('total_cost'); } public static function check_ins_total_amount($start_date = '', $end_date = '') { if (empty($start_date)) { $due = 0; foreach (ProductCheckin::where('branch_id', session('branch_id'))->get() as $key) { $due = $due + GeneralHelper::check_in_total_amount($key->id); } return $due; } else { $due = 0; foreach (ProductCheckin::where('branch_id', session('branch_id'))->whereBetween('date', [$start_date, $end_date])->get() as $key) { $due = $due + GeneralHelper::check_in_total_amount($key->id); } return $due; } } public static function check_outs_total_amount($start_date = '', $end_date = '') { if (empty($start_date)) { $due = 0; foreach (ProductCheckout::where('branch_id', session('branch_id'))->get() as $key) { $due = $due + GeneralHelper::check_in_total_amount($key->id); } return $due; } else { $due = 0; foreach (ProductCheckout::where('branch_id', session('branch_id'))->whereBetween('date', [$start_date, $end_date])->get() as $key) { if ($key->type == 'cash') { $due = $due + GeneralHelper::check_in_total_amount($key->id); } else { if (!empty($key->loan)) { $due = $due + GeneralHelper::loan_total_due_amount($key->loan_id); } } } return $due; } } public static function stock_total_cost_amount() { $due = 0; foreach (Product::get() as $key) { $due = $due + ($key->qty * $key->cost_price); } return $due; } public static function stock_total_selling_amount() { $due = 0; foreach (Product::get() as $key) { $due = $due + ($key->qty * $key->selling_price); } return $due; } public static function modify_loan_schedules($loan_transaction, $rateToRemove) { $loan_schedule = new LoanSchedule(); $loan_schedule->loan_id = $loan_transaction->loan_id; $loan_schedule->borrower_id = $loan_transaction->borrower_id; $loan_schedule->description = "Pay Off"; $loan_schedule->due_date = $loan_transaction->date; $loan_schedule->month = $loan_transaction->month; $loan_schedule->year = $loan_transaction->years; $loan_schedule->missed_penalty_applied = 1; // $loan_schedule->principal = $loan_transaction->loan_id; // $loan_schedule->principal_balance = $loan_transaction->loan_id; $loan_schedule->due = $rateToRemove; $loan_schedule->branch_id = $loan_transaction->brasnch_id; $loan_schedule->pay_off = $rateToRemove; $loan_schedule->save(); } public static function loan_allocate_payment($loan_transaction) { $allocation = []; $loan = $loan_transaction->loan; $principal = 0; $fees = 0; $penalty = 0; $interest = 0; $amount = (float)$loan_transaction->credit; //amount that customer pay in current month if (!empty($loan->loan_product)) { //find all payments up to this date //subtract this current payment //$payments = LoanTransaction::where('loan_id', $loan_transaction->loan_id)->where('transaction_type', // 'repayment')->where('reversed', 0)->where('date', '<=', $loan_transaction->date)->sum('credit')-$amount; if ($loan_transaction->transaction_type == "pay_off") { $credit = LoanTransaction::where('loan_id', $loan_transaction->loan_id)->whereIn('transaction_type', [ 'pay_off'])->where('reversed', 0)->where('date', '<=', $loan_transaction->date)->sum('credit'); } else { $credit = LoanTransaction::where('loan_id', $loan_transaction->loan_id)->whereIn('transaction_type', [ 'repayment'])->where('reversed', 0)->where('date', '<=', $loan_transaction->date)->sum('credit'); } $payments = floatval($credit) - floatval($amount); // TODO: add loan_schedule for pay off foreach ($loan->schedules as $schedule) { if ($amount > 0) { if (($schedule->principal + $schedule->fees + $schedule->penalty + $schedule->interest - $schedule->interest_waived) < $payments) { $payments = $payments - ($schedule->principal + $schedule->fees + $schedule->penalty + $schedule->interest - $schedule->interest_waived); //these schedules have been covered } else { //$schedules have not yet been covered if ($payments > 0) { //try to allocate the remaining payment to the respective elements $repayment_order = unserialize($loan->loan_product->repayment_order); foreach ($repayment_order as $order) { if ($order == 'interest') { if ($payments > $schedule->interest - $schedule->interest_waived) { $schedule_interest = 0; $payments = $payments - $schedule->interest - $schedule->interest_waived; } else { $schedule_interest = $schedule->interest - $schedule->interest_waived - $payments; $payments = 0; if ($amount > $schedule_interest) { $interest = $interest + $schedule_interest; $amount = $amount - $schedule_interest; } else { $interest = $interest + $amount; $amount = 0; } } } if ($order == 'penalty') { if ($payments > $schedule->penalty) { $schedule_penalty = 0; $payments = $payments - $schedule->penalty; } else { $schedule_penalty = $schedule->penalty - $payments; $payments = 0; if ($amount > $schedule_penalty) { $penalty = $penalty + $schedule_penalty; $amount = $amount - $schedule_penalty; } else { $penalty = $penalty + $amount; $amount = 0; } } } if ($order == 'fees') { if ($payments > $schedule->fees) { $payments = $payments - $schedule->fees; $schedule_fees = 0; } else { $schedule_fees = $schedule->fees - $payments; $payments = 0; if ($amount > $schedule_fees) { $fees = $fees + $schedule_fees; $amount = $amount - $schedule_fees; } else { $fees = $fees + $amount; $amount = 0; } } } if ($order == 'principal') { if ($payments > $schedule->principal) { $schedule_principal = 0; $payments = $payments - $schedule->principal; } else { $schedule_principal = $schedule->principal - $payments; $payments = 0; if ($amount > $schedule_principal) { $principal = $principal + $schedule_principal; $amount = $amount - floatval($schedule_principal); } else { $principal = $principal + $amount; $amount = 0; } } } } } else { if ((($schedule->principal + $schedule->fees + $schedule->penalty + $schedule->interest - $schedule->interest_waived)) == $amount) { $principal = $principal + $schedule->principal; $fees = $fees + $schedule->fees; $penalty = $penalty + $schedule->penalty; $interest = $interest + $schedule->interest; $amount = 0; break; } else { //check with loan product $repayment_order = unserialize($loan->loan_product->repayment_order); foreach ($repayment_order as $order) { if ($order == 'interest') { if ($amount > $schedule->interest - $schedule->interest_waived) { $interest = $interest + $schedule->interest - $schedule->interest_waived; $amount = $amount - $schedule->interest - $schedule->interest_waived; } else { $interest = $interest + $amount; $amount = 0; } } if ($order == 'penalty') { if ($amount > $schedule->penalty) { $penalty = $penalty + $schedule->penalty; $amount = $amount - $schedule->penalty; } else { $penalty = $penalty + $amount; $amount = 0; } } if ($order == 'fees') { if ($amount > $schedule->fees) { $fees = $fees + $schedule->fees; $amount = $amount - $schedule->fees; } else { $fees = $fees + $amount; $amount = 0; } } if ($order == 'principal') { if ($amount > $schedule->principal) { $principal = $principal + $schedule->principal; $amount = $amount - $schedule->principal; } else { $principal = $principal + $amount; $amount = 0; } } } } } } } else { break; } } } $allocation["principal"] = $principal; $allocation["interest"] = $interest; $allocation["fees"] = $fees; $allocation["penalty"] = $penalty; // $allocation["pay_off"] = $payOff; return $allocation; } public static function loan_schedule_dtermine_paid_by($id) { $schedule = LoanSchedule::find($id); $amount = $schedule->principal + $schedule->interest + $schedule->fees + $schedule->penalty; $payments = 0; foreach (LoanRepayment::where('loan_id', $schedule->loan_id)->orderBy('collection_date', 'asc')->get() as $payment) { $payments = $payments + $payment->amount; } } public static function loan_paid_items($id, $start_date = '', $end_date = '') { $allocation = []; $loan = Loan::query() ->with([ 'loan_product', 'schedules' ]) ->withSum(['transactions as transactions_sum_payment' => function ($query) use ($start_date, $end_date) { return $query->whereIn('transaction_type', ['repayment', 'pay_off']) ->where('reversed', 0) ->when(!empty($start_date) && !empty($end_date), function ($query) use ($start_date, $end_date) { return $query->whereBetween('date', [$start_date, $end_date]); }); }], 'credit') ->withSum(['transactions as transactions_sum_waived' => function ($query) use ($start_date, $end_date) { return $query->where('transaction_type', 'waiver') ->where('reversed', 0) ->when(!empty($start_date) && !empty($end_date), function ($query) use ($start_date, $end_date) { return $query->whereBetween('date', [$start_date, $end_date]); }); }], 'credit') ->find($id); $principal = 0; $fees = 0; $penalty = 0; $interest_waived = 0; $interest = 0; if (!empty($loan->loan_product)) { $payments = $loan->transactions_sum_payment; $interest_waived = $loan->transactions_sum_waived; foreach ($loan->schedules as $schedule) { //$schedules have not yet been covered if ($payments > 0) { //try to allocate the remaining payment to the respective elements $repayment_order = unserialize($loan->loan_product->repayment_order); foreach ($repayment_order as $order) { if ($order == 'interest') { if ($payments > ($schedule->interest - $schedule->interest_waived)) { $interest = $interest + $schedule->interest - $schedule->interest_waived; $payments = $payments - $schedule->interest - $schedule->interest_waived; } else { $interest = $interest + $payments; $payments = 0; } } if ($order == 'penalty') { if ($payments > $schedule->penalty) { $penalty = $penalty + $schedule->penalty; $payments = $payments - $schedule->penalty; } else { $penalty = $penalty + $payments; $payments = 0; } } if ($order == 'fees') { if ($payments > $schedule->fees) { $fees = $fees + $schedule->fees; $payments = $payments - $schedule->fees; } else { $fees = $fees + $payments; $payments = 0; } } if ($order == 'principal') { if ($payments > $schedule->principal) { $principal = $principal + $schedule->principal; $payments = $payments - $schedule->principal; } else { $principal = $principal + $payments; $payments = 0; } } } } else { break; } } } $allocation["principal"] = $principal; $allocation["interest"] = $interest; $allocation["interest_waived"] = $interest_waived; $allocation["fees"] = $fees; $allocation["penalty"] = $penalty; return $allocation; } public static function loan_due_items($id, $start_date = '', $end_date = '') { $allocation = []; $principal = 0; $fees = 0; $penalty = 0; $interest = 0; if (empty($start_date)) { $schedules = LoanSchedule::where('loan_id', $id)->get(); } else { $schedules = LoanSchedule::where('loan_id', $id)->whereBetween('due_date', [$start_date, $end_date])->get(); } // dd($id,$schedules, $start_date,$end_date); foreach ($schedules as $schedule) { $interest = $interest + $schedule->interest; $penalty = $penalty + $schedule->penalty; $fees = $fees + $schedule->fees; $principal = $principal + $schedule->principal; } $allocation["principal"] = $principal; $allocation["interest"] = $interest; $allocation["fees"] = $fees; $allocation["penalty"] = $penalty; return $allocation; } public static function schedule_due_amount($id) { $schedule = LoanSchedule::find($id); $amount = 0; $payments = LoanRepayment::where('loan_id', $schedule->loan_id)->sum('amount'); foreach (LoanSchedule::where('due_date', '<=', $schedule->due_date)->where('loan_id', $schedule->loan_id)->get() as $key) { if ($key->id != $id) { $payments = $payments - ($key->interest + $key->penalty + $key->fees + $key->principal); } } if ($payments > 0 && $payments > ($schedule->interest + $schedule->penalty + $schedule->fees + $schedule->principal)) { $amount = 0; } elseif ($payments > 0 && $payments < ($schedule->interest + $schedule->penalty + $schedule->fees + $schedule->principal)) { $amount = $schedule->interest + $schedule->penalty + $schedule->fees + $schedule->principal - $payments; } else { $amount = $schedule->interest + $schedule->penalty + $schedule->fees + $schedule->principal; } return $amount; } public static function loans_paid_items($start_date = '', $end_date = '') { $allocation = []; $principal = 0; $fees = 0; $penalty = 0; $interest = 0; $interest_waived = 0; $over_payments = 0; if (empty($start_date)) { $principal = $principal + JournalEntry::whereIn('transaction_type', [ 'repayment', 'pay_off'])->where('transaction_sub_type', 'repayment_principal')->where('reversed', 0)->where('branch_id', session('branch_id'))->sum('credit'); $interest = $interest + JournalEntry::whereIn('transaction_type', ['repayment', 'pay_off'])->where('transaction_sub_type', 'repayment_interest')->where('reversed', 0)->where('branch_id', session('branch_id'))->sum('credit'); $fees = $fees + JournalEntry::whereIn('transaction_type', ['repayment', 'pay_off'])->where('transaction_sub_type', 'repayment_fees')->where('reversed', 0)->where('branch_id', session('branch_id'))->sum('credit'); $penalty = $penalty + JournalEntry::whereIn('transaction_type', ['repayment', 'pay_off'])->where('transaction_sub_type', 'repayment_penalty')->where('reversed', 0)->where('branch_id', session('branch_id'))->sum('credit'); $over_payments = $over_payments + JournalEntry::where('transaction_type', 'repayment')->where('transaction_sub_type', 'overpayment')->where('reversed', 0)->where('branch_id', session('branch_id'))->sum('credit'); } else { $principal = $principal + JournalEntry::where('transaction_type', 'repayment')->where('transaction_sub_type', 'repayment_principal')->where('reversed', 0)->whereBetween('date', [$start_date, $end_date])->where('branch_id', session('branch_id'))->sum('credit'); $interest = $interest + JournalEntry::whereIn('transaction_type', ['repayment', 'pay_off'])->where('transaction_sub_type', 'repayment_interest')->where('reversed', 0)->whereBetween('date', [$start_date, $end_date])->where('branch_id', session('branch_id'))->sum('credit'); $fees = $fees + JournalEntry::whereIn('transaction_type', ['repayment', 'pay_off'])->where('transaction_sub_type', 'repayment_fees')->where('reversed', 0)->whereBetween('date', [$start_date, $end_date])->where('branch_id', session('branch_id'))->sum('credit'); $penalty = $penalty + JournalEntry::whereIn('transaction_type', ['repayment', 'pay_off'])->where('transaction_sub_type', 'repayment_penalty')->where('reversed', 0)->whereBetween('date', [$start_date, $end_date])->where('branch_id', session('branch_id'))->sum('credit'); $over_payments = $over_payments + JournalEntry::where('transaction_type', 'repayment')->where('transaction_sub_type', 'overpayment')->where('reversed', 0)->whereBetween('date', [$start_date, $end_date])->where('branch_id', session('branch_id'))->sum('credit'); } $allocation["principal"] = $principal; $allocation["interest"] = $interest; $allocation["fees"] = $fees; $allocation["penalty"] = $penalty; $allocation["over_payments"] = $over_payments; return $allocation; } public static function loans_due_items($start_date = '', $end_date = '') { $allocation = []; $principal = 0; $fees = 0; $penalty = 0; $interest = 0; if (empty($start_date)) { foreach (Loan::select("loan_schedules.principal", "loan_schedules.interest", "loan_schedules.penalty", "loan_schedules.fees")->where('loans.branch_id', session('branch_id'))->whereIn('loans.status', ['disbursed', 'closed', 'written_off'])->join('loan_schedules', 'loans.id', '=', 'loan_schedules.loan_id')->where('loan_schedules.deleted_at', NULL)->get() as $key) { $interest = $interest + $key->interest; $penalty = $penalty + $key->penalty; $fees = $fees + $key->fees; $principal = $principal + $key->principal; } } else { foreach (Loan::select("loan_schedules.principal", "loan_schedules.interest", "loan_schedules.penalty", "loan_schedules.fees")->where('loans.branch_id', session('branch_id'))->whereIn('loans.status', ['disbursed', 'closed', 'written_off'])->join('loan_schedules', 'loans.id', '=', 'loan_schedules.loan_id')->whereBetween('loan_schedules.due_date', [$start_date, $end_date])->where('loan_schedules.deleted_at', NULL)->get() as $key) { $interest = $interest + $key->interest; $penalty = $penalty + $key->penalty; $fees = $fees + $key->fees; $principal = $principal + $key->principal; } } $allocation["principal"] = $principal; $allocation["interest"] = $interest; $allocation["fees"] = $fees; $allocation["penalty"] = $penalty; return $allocation; } public static function get_total_repayment_amount($schedule_id) { $schedule = LoanSchedule::findOrFail($schedule_id); return $schedule->principal + $schedule->interest + $schedule->fees + $schedule->penalty - $schedule->interest_waived; } }