| Path : /var/www/html/usd_loan_system/app/Http/Controllers/ |
|
B-Con CMD Config cPanel C-Rdp D-Log Info Jump Mass Ransom Symlink vHost Zone-H |
| Current File : /var/www/html/usd_loan_system/app/Http/Controllers/CronController.php |
<?php
namespace App\Http\Controllers;
use App\Helpers\GeneralHelper;
use App\Models\CustomFieldMeta;
use App\Models\Email;
use App\Models\Expense;
use App\Models\JournalEntry;
use App\Models\Loan;
use App\Models\LoanProductCharge;
use App\Models\LoanRepayment;
use App\Models\LoanSchedule;
use App\Models\LoanTransaction;
use App\Models\Payroll;
use App\Models\PayrollMeta;
use App\Models\Saving;
use App\Models\SavingProduct;
use App\Models\SavingsCharge;
use App\Models\SavingsProductCharge;
use App\Models\SavingTransaction;
use App\Models\Setting;
use App\Models\Sms;
use Illuminate\Support\Facades\Mail;
use Carbon\Carbon;
class CronController extends Controller
{
public function __construct()
{
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$company_email = Setting::where('setting_key', 'company_email')->first()->setting_value;
$company_name = Setting::where('setting_key', 'company_name')->first()->setting_value;
if (Setting::where('setting_key', 'enable_cron')->first()->setting_value == 0) {
//someone attempted to run con job but it is disabled
Mail::raw('Someone attempted to run con job but it is disabled, please enable it in settings',
function ($message) use ($company_email, $company_name) {
$message->from($company_email, $company_name);
$message->to($company_email);
$message->setContentType('text/html');
$message->setSubject('Cron Job Failed');
});
}
//check for upcoming payments
//send via email
// if (Setting::where('setting_key', 'auto_repayment_email_reminder')->first()->setting_value == 1) {
// $days = Setting::where('setting_key', 'auto_repayment_days')->first()->setting_value;
// $due_date = Carbon::now()->addDays($days)->format('Y-m-d');
// $schedules = LoanSchedule::query()
// ->select('id', 'loan_id', 'due_date')
// ->with(['borrower'])
// ->where('due_date', $due_date)
// ->get();
// $loan_payment_reminder_subject = Setting::where('setting_key', 'loan_payment_reminder_subject')->first()->setting_value;
// foreach ($schedules as $schedule) {
// //check if borrower has email
// if (!empty($schedule->borrower->email)) {
// $borrower = $schedule->borrower;
// $loan = $schedule->loan;
// $body = Setting::where('setting_key', 'loan_payment_reminder_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}', round(($schedule->principal + $schedule->interest + $schedule->fees + $schedule->penalty), 2), $body);
// $body = str_replace('{paymentDate}', $schedule->due_date, $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);
// Mail::raw($body, function ($message) use ($borrower, $loan, $loan_payment_reminder_subject) {
// $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->setContentType('text/html');
// $message->setSubject($loan_payment_reminder_subject);
// });
// $mail = new Email();
// //$mail->user_id = Sentinel::getUser()->id;
// $mail->message = $body;
// $mail->subject = $loan_payment_reminder_subject;
// $mail->recipients = 1;
// $mail->send_to = $borrower->first_name . ' ' . $borrower->last_name . '(' . $borrower->unique_number . ')';
// $mail->save();
// }
// }
// }
//send via sms
// if (Setting::where('setting_key', 'auto_repayment_sms_reminder')->first()->setting_value == 1) {
// $days = Setting::where('setting_key', 'auto_repayment_days')->first()->setting_value;
// $due_date = date_format(date_add(date_create(date("Y-m-d")), date_interval_create_from_date_string($days . ' days')), 'Y-m-d');
// $schedules = LoanSchedule::where('due_date', $due_date)->get();
// foreach ($schedules as $schedule) {
// //check if borrower has email
// if (!empty($schedule->borrower->email)) {
// $borrower = $schedule->borrower;
// $loan = $schedule->loan;
// $body = Setting::where('setting_key',
// 'loan_payment_reminder_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}',
// round(($schedule->principal + $schedule->interest + $schedule->fees + $schedule->penalty),
// 2), $body);
// $body = str_replace('{paymentDate}', $schedule->due_date, $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);
// if (!empty($borrower->mobile)) {
// $active_sms = Setting::where('setting_key', 'active_sms')->first()->setting_value;
// GeneralHelper::send_sms($borrower->mobile, $body);
// $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();
// }
// }
// }
// }
//check for missed repayments
//send via email
// if (Setting::where('setting_key', 'auto_overdue_repayment_email_reminder')->first()->setting_value == 1) {
// $days = Setting::where('setting_key', 'auto_overdue_repayment_days')->first()->setting_value;
// $due_date = date_format(date_sub(date_create(date("Y-m-d")),
// date_interval_create_from_date_string($days . ' days')),
// 'Y-m-d');
// $schedules = LoanSchedule::where('due_date', $due_date)->get();
// foreach ($schedules as $schedule) {
// //check if borrower has email
// if (!empty($schedule->borrower->email)) {
// $borrower = $schedule->borrower;
// $loan = $schedule->loan;
// $payments = LoanRepayment::where('loan_id', $loan->id)->where('due_date',
// $schedule->due_date)->sum('amount');
// if ($payments == 0) {
// $body = Setting::where('setting_key', 'missed_payment_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}', round(($schedule->principal + $schedule->interest + $schedule->fees + $schedule->penalty), 2), $body);
// $body = str_replace('{paymentDate}', $schedule->due_date, $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);
// Mail::raw($body, function ($message) use ($borrower, $loan) {
// $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->setContentType('text/html');
// $message->setSubject(Setting::where('setting_key',
// 'missed_payment_email_subject')->first()->setting_value);
// });
// $mail = new Email();
// //$mail->user_id = Sentinel::getUser()->id;
// $mail->message = $body;
// $mail->subject = Setting::where('setting_key', 'missed_payment_email_subject')->first()->setting_value;
// $mail->recipients = 1;
// $mail->send_to = $borrower->first_name . ' ' . $borrower->last_name . '(' . $borrower->unique_number . ')';
// $mail->save();
// }
// }
// }
// }
//send via sms
// if (Setting::where('setting_key', 'auto_overdue_repayment_sms_reminder')->first()->setting_value == 1) {
// $days = Setting::where('setting_key', 'auto_overdue_repayment_days')->first()->setting_value;
// $due_date = date_format(date_sub(date_create(date("Y-m-d")),
// date_interval_create_from_date_string($days . ' days')), 'Y-m-d');
// $schedules = LoanSchedule::where('due_date', $due_date)->get();
// foreach ($schedules as $schedule) {
// //check if borrower has email
// if (!empty($schedule->borrower->email)) {
// $borrower = $schedule->borrower;
// $loan = $schedule->loan;
// $payments = LoanRepayment::where('loan_id', $loan->id)->where('due_date',
// $schedule->due_date)->sum('amount');
// if ($payments == 0) {
// $body = Setting::where('setting_key',
// 'missed_payment_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('{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}',
// round(($schedule->principal + $schedule->interest + $schedule->fees + $schedule->penalty),
// 2), $body);
// $body = str_replace('{paymentDate}', $schedule->due_date, $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);
// if (!empty($borrower->mobile)) {
// $active_sms = Setting::where('setting_key', 'active_sms')->first()->setting_value;
// GeneralHelper::send_sms($borrower->mobile, $body);
// $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();
// }
// } else {
// //user has paid something
// }
// }
// }
// }
//check for overdue loans
//send via email
// if (Setting::where('setting_key', 'auto_overdue_loan_email_reminder')->first()->setting_value == 1) {
// $days = Setting::where('setting_key', 'auto_overdue_loan_days')->first()->setting_value;
// $due_date = date_format(date_sub(date_create(date("Y-m-d")),
// date_interval_create_from_date_string($days . ' days')),
// 'Y-m-d');
// $loans = Loan::where('maturity_date', $due_date)->where('loan_status', 'open')->get();
// foreach ($loans as $loan) {
// //check if borrower has email
// if (!empty($loan->borrower->email)) {
// $borrower = $loan->borrower;
// $body = Setting::where('setting_key',
// 'loan_overdue_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);
// Mail::raw($body, function ($message) use ($borrower, $loan) {
// $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->setContentType('text/html');
// $message->setSubject(Setting::where('setting_key',
// 'loan_overdue_email_subject')->first()->setting_value);
// });
// $mail = new Email();
// //$mail->user_id = Sentinel::getUser()->id;
// $mail->message = $body;
// $mail->subject = Setting::where('setting_key',
// 'loan_overdue_email_subject')->first()->setting_value;
// $mail->recipients = 1;
// $mail->send_to = $borrower->first_name . ' ' . $borrower->last_name . '(' . $borrower->unique_number . ')';
// $mail->save();
// }
// }
// }
// //send via sms
// if (Setting::where('setting_key', 'auto_overdue_loan_sms_reminder')->first()->setting_value == 1) {
// $days = Setting::where('setting_key', 'auto_overdue_loan_days')->first()->setting_value;
// $due_date = date_format(date_sub(date_create(date("Y-m-d")),
// date_interval_create_from_date_string($days . ' days')),
// 'Y-m-d');
// $loans = Loan::where('maturity_date', $due_date)->where('loan_status', 'open')->get();
// foreach ($loans as $loan) {
// //check if borrower has email
// if (!empty($loan->borrower->email)) {
// $borrower = $loan->borrower;
// $body = Setting::where('setting_key',
// 'loan_overdue_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('{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);
// if (!empty($borrower->mobile)) {
// $active_sms = Setting::where('setting_key', 'active_sms')->first()->setting_value;
// GeneralHelper::send_sms($borrower->mobile, $body);
// $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();
// }
// }
// }
// }
//check for penalties
//missed payment penalty
$loans = Loan::query()
->with([
'loan_product',
'schedules' => function ($query) {
return $query->doesnthave('loanTransactions')->orderBy('due_date', 'asc');
}
])
->where('status', 'disbursed')
->get();
foreach ($loans as $loan) {
if (!empty($loan->loan_product) && $loan->loan_product->enable_late_repayment_penalty == 1) {
foreach ($loan->schedules as $schedule) {
if ($loan->loan_product->late_repayment_penalty_grace_period > 0) {
$date = date_format(date_add(date_create($schedule->due_date), date_interval_create_from_date_string($loan->loan_product->late_repayment_penalty_grace_period . ' days')), 'Y-m-d');
} else {
$date = $schedule->due_date;
}
if ($date < date("Y-m-d")) {
$sch = $schedule;
$sch->missed_penalty_applied = 1;
//determine which amount to use
if ($loan->loan_product->late_repayment_penalty_type == "fixed") {
if(!$sch->penalty_waived) {
$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(!$sch->penalty_waived) {
$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);
$diffDays = Carbon::parse($schedule->due_date)->diffInDays(date("Y-m-d"));
if(!$sch->penalty_waived) {
$sch->penalty = (($loan->loan_product->late_repayment_penalty_amount / 100) * $schedule->due) * $diffDays;
}
}
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 = $scsssh->penalty + (($loan->loan_product->late_repayment_penalty_amount / 100) * $principal);
if(!$sch->penalty_waived) {
$sch->penalty = (0.01 * $schedule->due);
}
}
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);
if(!$sch->penalty_waived) {
$sch->penalty = (($loan->loan_product->late_repayment_penalty_amount / 100) * $principal);
}
}
}
$sch->save();
}
}
}
}
//after maturity date payment
$loans = Loan::where('status', 'disbursed')->get();
foreach ($loans as $loan) {
$product = $loan->loan_product;
if (!empty($product)) {
//check for charges
foreach (LoanProductCharge::where('loan_product_id', $product->id)->where('penalty',
1)->get() as $tkey) {
if (!empty($tkey->charge)) {
$date = date_format(date_sub(date_create(date("Y-m-d")),
date_interval_create_from_date_string($product->late_repayment_penalty_grace_period . ' days')),
'Y-m-d');
//missed penalty charge
if ($tkey->charge->charge_type == "overdue_installment_fee") {
$schedule = LoanSchedule::where('loan_id', $loan->id)->where('due_date',
$date)->first();
if (!empty($schedule)) {
$due_items = GeneralHelper::loan_due_items($loan->id, $loan->release_date, $date);
$paid_items = GeneralHelper::loan_paid_items($loan->id, $loan->release_date,
date("Y-m-d"));
if ($tkey->charge->charge_option == "fixed") {
$amount = $tkey->charge->amount;
}
if ($tkey->charge->charge_option == "principal_due") {
if (($due_items["principal"] - $paid_items["principal"]) > 0) {
$amount = $tkey->charge->amount * (($due_items["principal"] - $paid_items["principal"]) / 100);
} else {
$amount = 0;
}
}
if ($tkey->charge->charge_option == "principal_interest") {
if (($due_items["principal"] + $due_items["interest"] - $paid_items["principal"] - $paid_items["interest"]) > 0) {
$amount = $tkey->charge->amount * (($due_items["principal"] + $due_items["interest"] - $paid_items["principal"] - $paid_items["interest"]) / 100);
} else {
$amount = 0;
}
}
if ($tkey->charge->charge_option == "interest_due") {
if (($due_items["interest"] - $paid_items["interest"]) > 0) {
$amount = $tkey->charge->amount * (($due_items["interest"] - $paid_items["interest"]) / 100);
} else {
$amount = 0;
}
}
if ($tkey->charge->charge_option == "total_due") {
if (($due_items["principal"] + $due_items["interest"] + $due_items["fees"] + $due_items["penalty"] - $paid_items["principal"] - $paid_items["interest"] - $paid_items["fees"] - $paid_items["penalty"]) > 0) {
$amount = $tkey->charge->amount * (($due_items["principal"] + $due_items["interest"] + $due_items["fees"] + $due_items["penalty"] - $paid_items["principal"] - $paid_items["interest"] - $paid_items["fees"] - $paid_items["penalty"]) / 100);
} else {
$amount = 0;
}
}
if ($tkey->charge->charge_option == "original_principal") {
$amount = $tkey->charge->amount * $loan->principal / 100;
}
if ($amount > 0) {
$loan_transaction = new LoanTransaction();
$loan_transaction->branch_id = $loan->branch_id;
$loan_transaction->loan_id = $loan->id;
$loan_transaction->borrower_id = $loan->borrower_id;
$loan_transaction->transaction_type = "overdue_installment_fee";
$loan_transaction->date = $due_date;
$date = explode('-', $due_date);
$loan_transaction->year = $date[0];
$loan_transaction->month = $date[1];
$loan_transaction->debit = $amount;
$loan_transaction->reversible = 1;
$loan_transaction->save();
//update schedule
$schedule->penalty = $schedule->penalty + $amount;
$schedule->missed_penalty_applied = 1;
$schedule->save();
}
}
}
//overdue penalty
if ($tkey->charge->charge_type == "overdue_maturity") {
$due_items = GeneralHelper::loan_due_items($loan->id, $loan->release_date,
date("Y-m-d"));
$paid_items = GeneralHelper::loan_paid_items($loan->id, $loan->release_date,
date("Y-m-d"));
if ($loan->maturity_date < date("Y-m-d") && ($due_items["interest"] + $due_items["principal"] + $due_items["fees"] + $due_items["penalty"] - $paid_items["interest"] - $paid_items["principal"] - $paid_items["fees"] - $paid_items["penalty"]) > 0) {
if ($tkey->charge->charge_option == "fixed") {
$amount = $tkey->charge->amount;
}
if ($tkey->charge->charge_option == "principal_due") {
if (($due_items["principal"] - $paid_items["principal"]) > 0) {
$amount = $tkey->charge->amount * (($due_items["principal"] - $paid_items["principal"]) / 100);
} else {
$amount = 0;
}
}
if ($tkey->charge->charge_option == "principal_interest") {
if (($due_items["principal"] + $due_items["interest"] - $paid_items["principal"] - $paid_items["interest"]) > 0) {
$amount = $tkey->charge->amount * (($due_items["principal"] + $due_items["interest"] - $paid_items["principal"] - $paid_items["interest"]) / 100);
} else {
$amount = 0;
}
}
if ($tkey->charge->charge_option == "interest_due") {
if (($due_items["interest"] - $paid_items["interest"]) > 0) {
$amount = $tkey->charge->amount * (($due_items["interest"] - $paid_items["interest"]) / 100);
} else {
$amount = 0;
}
}
if ($tkey->charge->charge_option == "total_due") {
if (($due_items["principal"] + $due_items["interest"] + $due_items["fees"] + $due_items["penalty"] - $paid_items["principal"] - $paid_items["interest"] - $paid_items["fees"] - $paid_items["penalty"]) > 0) {
$amount = $tkey->charge->amount * (($due_items["principal"] + $due_items["interest"] + $due_items["fees"] + $due_items["penalty"] - $paid_items["principal"] - $paid_items["interest"] - $paid_items["fees"] - $paid_items["penalty"]) / 100);
} else {
$amount = 0;
}
}
if ($tkey->charge->charge_option == "original_principal") {
$amount = $tkey->charge->amount * $loan->principal / 100;
}
$schedule = LoanSchedule::where('loan_id', $loan->id)->orderBy('due_date',
'desc')->first();
if (!empty($schedule)) {
if ($amount > 0) {
$loan_transaction = new LoanTransaction();
$loan_transaction->branch_id = $loan->branch_id;
$loan_transaction->loan_id = $loan->id;
$loan_transaction->borrower_id = $loan->borrower_id;
$loan_transaction->transaction_type = "overdue_maturity";
$loan_transaction->date = date("Y-m-d");
$date = explode('-', date("Y-m-d"));
$loan_transaction->year = $date[0];
$loan_transaction->month = $date[1];
$loan_transaction->debit = $amount;
$loan_transaction->reversible = 1;
$loan_transaction->save();
//update schedule
$schedule->penalty = $schedule->penalty + $amount;
$schedule->missed_penalty_applied = 1;
$schedule->save();
}
}
}
}
}
}
}
}
//check for recurring expenses
$expenses = Expense::where('recurring', 1)->get();
foreach ($expenses as $expense) {
if (empty($expense->recur_end_date)) {
if ($expense->recur_next_date == date("Y-m-d")) {
$exp1 = new Expense();
$exp1->expense_type_id = $expense->expense_type_id;
$exp1->amount = $expense->amount;
$exp1->notes = $expense->notes;
$exp1->date = date("Y-m-d");
$date = explode('-', date("Y-m-d"));
$exp1->year = $date[0];
$exp1->month = $date[1];
$exp1->save();
$custom_fields = CustomFieldMeta::where('parent_id', $expense->id)->where('category',
'expenses')->get();
foreach ($custom_fields as $key) {
$custom_field = new CustomFieldMeta();
$custom_field->name = $key->name;
$custom_field->parent_id = $exp1->id;
$custom_field->custom_field_id = $key->custom_field_id;
$custom_field->category = "expenses";
$custom_field->save();
}
$exp2 = Expense::find($expense->id);
$exp2->recur_next_date = date_format(date_add(date_create(date("Y-m-d")),
date_interval_create_from_date_string($expense->recur_frequency . ' ' . $expense->recur_type . 's')),
'Y-m-d');
$exp2->save();
}
} else {
if (date("Y-m-d") <= $expense->recur_end_date) {
if ($expense->recur_next_date == date("Y-m-d")) {
$exp1 = new Expense();
$exp1->expense_type_id = $expense->expense_type_id;
$exp1->amount = $expense->amount;
$exp1->notes = $expense->notes;
$exp1->date = date("Y-m-d");
$date = explode('-', date("Y-m-d"));
$exp1->year = $date[0];
$exp1->month = $date[1];
$exp1->save();
$custom_fields = CustomFieldMeta::where('parent_id', $expense->id)->where('category',
'expenses')->get();
foreach ($custom_fields as $key) {
$custom_field = new CustomFieldMeta();
$custom_field->name = $key->name;
$custom_field->parent_id = $exp1->id;
$custom_field->custom_field_id = $key->custom_field_id;
$custom_field->category = "expenses";
$custom_field->save();
}
$exp2 = Expense::find($expense->id);
$exp2->recur_next_date = date_format(date_add(date_create(date("Y-m-d")),
date_interval_create_from_date_string($expense->recur_frequency . ' ' . $expense->recur_type . 's')),
'Y-m-d');
$exp2->save();
}
}
}
}
//check for recurring payroll
$payrolls = Payroll::where('recurring', 1)->get();
foreach ($payrolls as $payroll) {
if (empty($payroll->recur_end_date)) {
if ($payroll->recur_next_date == date("Y-m-d")) {
$pay1 = new Payroll();
$pay1->payroll_template_id = $payroll->payroll_template_id;
$pay1->user_id = $payroll->user_id;
$pay1->employee_name = $payroll->employee_name;
$pay1->business_name = $payroll->business_name;
$pay1->payment_method = $payroll->payment_method;
$pay1->bank_name = $payroll->bank_name;
$pay1->account_number = $payroll->account_number;
$pay1->description = $payroll->description;
$pay1->comments = $payroll->comments;
$pay1->paid_amount = $payroll->paid_amount;
$date = explode('-', date("Y-m-d"));
$pay1->date = date("Y-m-d");
$pay1->year = $date[0];
$pay1->month = $date[1];
$pay1->save();
//save payroll meta
$metas = PayrollMeta::where('payroll_id',
$payroll->id)->get();;
foreach ($metas as $key) {
$meta = new PayrollMeta();
$meta->value = $key->value;
$meta->payroll_id = $pay1->id;
$meta->payroll_template_meta_id = $key->payroll_template_meta_id;
$meta->position = $key->position;
$meta->save();
}
$pay2 = Payroll::find($payroll->id);
$pay2->recur_next_date = date_format(date_add(date_create(date("Y-m-d")),
date_interval_create_from_date_string($payroll->recur_frequency . ' ' . $payroll->recur_type . 's')),
'Y-m-d');
$pay2->save();
} else {
if (date("Y-m-d") <= $payroll->recur_end_date) {
if ($payroll->recur_next_date == date("Y-m-d")) {
$pay1 = new Payroll();
$pay1->payroll_template_id = $payroll->payroll_template_id;
$pay1->user_id = $payroll->user_id;
$pay1->employee_name = $payroll->employee_name;
$pay1->business_name = $payroll->business_name;
$pay1->payment_method = $payroll->payment_method;
$pay1->bank_name = $payroll->bank_name;
$pay1->account_number = $payroll->account_number;
$pay1->description = $payroll->description;
$pay1->comments = $payroll->comments;
$pay1->paid_amount = $payroll->paid_amount;
$date = explode('-', date("Y-m-d"));
$pay1->date = date("Y-m-d");
$pay1->year = $date[0];
$pay1->month = $date[1];
$pay1->save();
//save payroll meta
$metas = PayrollMeta::where('payroll_id',
$payroll->id)->get();;
foreach ($metas as $key) {
$meta = new PayrollMeta();
$meta->value = $key->value;
$meta->payroll_id = $pay1->id;
$meta->payroll_template_meta_id = $key->payroll_template_meta_id;
$meta->position = $key->position;
$meta->save();
}
$pay2 = Payroll::find($payroll->id);
$pay2->recur_next_date = date_format(date_add(date_create(date("Y-m-d")),
date_interval_create_from_date_string($payroll->recur_frequency . ' ' . $payroll->recur_type . 's')),
'Y-m-d');
$pay2->save();
}
}
}
}
}
//savings interest and charges
foreach (SavingProduct::all() as $key) {
//check post date
foreach (Saving::where('savings_product_id', $key->id)->where('status',
'active')->get() as $saving) {
//check for fees
foreach (SavingsProductCharge::where('savings_product_id', $key->id)->get() as $tkey) {
if (!empty($tkey->charge)) {
//specified due date charge
if ($tkey->charge->charge_type == "specified_due_date") {
//check if the date is today
foreach (SavingsCharge::where('savings_id', $saving->id)->where('charge_id',
$tkey->charge_id)->where('date', date("Y-m-d"))->get() as $charge) {
$savings_transaction = new SavingTransaction();
$savings_transaction->borrower_id = $saving->borrower_id;
$savings_transaction->branch_id = $saving->branch_id;
$savings_transaction->savings_id = $saving->id;
$savings_transaction->type = "bank_fees";
$savings_transaction->reversible = 1;
$savings_transaction->date = date("Y-m-d");
$savings_transaction->time = date("H:i");
$date = explode('-', date("Y-m-d"));
$savings_transaction->year = $date[0];
$savings_transaction->month = $date[1];
$savings_transaction->debit = $tkey->charge->amount;
$savings_transaction->save();
if (!empty($key->chart_reference)) {
$journal = new JournalEntry();
$journal->account_id = $key->chart_reference->id;
$journal->branch_id = $savings_transaction->branch_id;
$journal->date = date("Y-m-d");
$journal->year = $date[0];
$journal->month = $date[1];
$journal->borrower_id = $savings_transaction->borrower_id;
$journal->transaction_type = 'pay_charge';
$journal->name = "Charge";
$journal->savings_id = $saving->id;
$journal->credit = $tkey->charge->amount;
$journal->reference = $savings_transaction->id;
$journal->save();
}
if (!empty($key->chart_control)) {
$journal = new JournalEntry();
$journal->account_id = $key->chart_control->id;
$journal->branch_id = $savings_transaction->branch_id;
$journal->date = date("Y-m-d");
$journal->year = $date[0];
$journal->month = $date[1];
$journal->borrower_id = $savings_transaction->borrower_id;
$journal->transaction_type = 'pay_charge';
$journal->name = "Charge";
$journal->savings_id = $saving->id;
$journal->debit = $tkey->charge->amount;
$journal->reference = $savings_transaction->id;
$journal->save();
}
}
}
//monthly fee
if ($tkey->charge->charge_type == "monthly_fee" && date("d") == "01") {
$savings_transaction = new SavingTransaction();
$savings_transaction->borrower_id = $saving->borrower_id;
$savings_transaction->branch_id = $saving->branch_id;
$savings_transaction->savings_id = $saving->id;
$savings_transaction->type = "bank_fees";
$savings_transaction->reversible = 1;
$savings_transaction->date = date("Y-m-d");
$savings_transaction->time = date("H:i");
$date = explode('-', date("Y-m-d"));
$savings_transaction->year = $date[0];
$savings_transaction->month = $date[1];
$savings_transaction->debit = $tkey->charge->amount;
$savings_transaction->save();
if (!empty($key->chart_reference)) {
$journal = new JournalEntry();
$journal->account_id = $key->chart_reference->id;
$journal->branch_id = $savings_transaction->branch_id;
$journal->date = date("Y-m-d");
$journal->year = $date[0];
$journal->month = $date[1];
$journal->borrower_id = $savings_transaction->borrower_id;
$journal->transaction_type = 'pay_charge';
$journal->name = "Charge";
$journal->savings_id = $saving->id;
$journal->credit = $tkey->charge->amount;
$journal->reference = $savings_transaction->id;
$journal->save();
}
if (!empty($key->chart_control)) {
$journal = new JournalEntry();
$journal->account_id = $key->chart_control->id;
$journal->branch_id = $savings_transaction->branch_id;
$journal->date = date("Y-m-d");
$journal->year = $date[0];
$journal->month = $date[1];
$journal->borrower_id = $savings_transaction->borrower_id;
$journal->transaction_type = 'pay_charge';
$journal->name = "Charge";
$journal->savings_id = $saving->id;
$journal->debit = $tkey->charge->amount;
$journal->reference = $savings_transaction->id;
$journal->save();
}
}
if ($tkey->charge->charge_type == "annual_fee" && date("d-m") == "01-01") {
$savings_transaction = new SavingTransaction();
$savings_transaction->borrower_id = $saving->borrower_id;
$savings_transaction->branch_id = $saving->branch_id;
$savings_transaction->savings_id = $saving->id;
$savings_transaction->type = "bank_fees";
$savings_transaction->reversible = 1;
$savings_transaction->date = date("Y-m-d");
$savings_transaction->time = date("H:i");
$date = explode('-', date("Y-m-d"));
$savings_transaction->year = $date[0];
$savings_transaction->month = $date[1];
$savings_transaction->debit = $tkey->charge->amount;
$savings_transaction->save();
if (!empty($key->chart_reference)) {
$journal = new JournalEntry();
$journal->account_id = $key->chart_reference->id;
$journal->branch_id = $savings_transaction->branch_id;
$journal->date = date("Y-m-d");
$journal->year = $date[0];
$journal->month = $date[1];
$journal->borrower_id = $savings_transaction->borrower_id;
$journal->transaction_type = 'pay_charge';
$journal->name = "Charge";
$journal->savings_id = $saving->id;
$journal->credit = $tkey->charge->amount;
$journal->reference = $savings_transaction->id;
$journal->save();
}
if (!empty($key->chart_control)) {
$journal = new JournalEntry();
$journal->account_id = $key->chart_control->id;
$journal->branch_id = $savings_transaction->branch_id;
$journal->date = date("Y-m-d");
$journal->year = $date[0];
$journal->month = $date[1];
$journal->borrower_id = $savings_transaction->borrower_id;
$journal->transaction_type = 'pay_charge';
$journal->name = "Charge";
$journal->savings_id = $saving->id;
$journal->debit = $tkey->charge->amount;
$journal->reference = $savings_transaction->id;
$journal->save();
}
}
}
}
//apply interest
if (GeneralHelper::savings_account_balance($saving->id) >= $key->minimum_balance && $key->interest_rate > 0) {
//interest posted right away
$interest = GeneralHelper::savings_account_balance($saving->id) * $key->interest_rate / 100;
$last_interest = SavingTransaction::where('savings_id', $saving->id)->where('type',
'interest')->where('system_interest', 1)->orderBy('date', 'desc')->first();
//check number of months passed
$d = new \DateTime(date("Y-m-d"));
if ($key->interest_adding == 0) {
$interest_adding = $d->format('t');
} else {
$interest_adding = $key->interest_adding;
}
if (empty($last_interest)) {
if (str_replace("0", "", date("d")) == $interest_adding) {
$savings_transaction = new SavingTransaction();
$savings_transaction->borrower_id = $saving->borrower_id;
$savings_transaction->branch_id = $saving->branch_id;
$savings_transaction->savings_id = $saving->id;
$savings_transaction->system_interest = 1;
$savings_transaction->type = "interest";
$savings_transaction->reversible = 1;
$savings_transaction->date = date("Y-m-d");
$savings_transaction->time = date("H:i");
$date = explode('-', date("Y-m-d"));
$savings_transaction->year = $date[0];
$savings_transaction->month = $date[1];
$savings_transaction->credit = $interest;
$savings_transaction->notes = $key->interest_rate . " Per Annum Interest calculated";
$savings_transaction->save();
if (!empty($key->chart_reference)) {
$journal = new JournalEntry();
$journal->account_id = $key->chart_reference->id;
$journal->branch_id = $savings_transaction->branch_id;
$journal->date = date("Y-m-d");
$journal->year = $date[0];
$journal->month = $date[1];
$journal->borrower_id = $savings_transaction->borrower_id;
$journal->transaction_type = 'interest';
$journal->name = "Savings Interest";
$journal->savings_id = $saving->id;
$journal->credit = $interest;
$journal->reference = $savings_transaction->id;
$journal->save();
}
if (!empty($key->chart_control)) {
$journal = new JournalEntry();
$journal->account_id = $key->chart_control->id;
$journal->branch_id = $savings_transaction->branch_id;
$journal->date = date("Y-m-d");
$journal->year = $date[0];
$journal->month = $date[1];
$journal->borrower_id = $savings_transaction->borrower_id;
$journal->transaction_type = 'interest';
$journal->name = "Savings Interest";
$journal->savings_id = $saving->id;
$journal->debit = $interest;
$journal->reference = $savings_transaction->id;
$journal->save();
}
}
} else {
$diff = GeneralHelper::diff_in_months(new \DateTime(date("Y-m-d")),
new \DateTime($last_interest->date));
if (str_replace("0", "",
date("d")) == $interest_adding && $diff >= $key->interest_posting && $diff <= $key->interest_posting + 1
) {
$savings_transaction = new SavingTransaction();
$savings_transaction->borrower_id = $saving->borrower_id;
$savings_transaction->branch_id = $saving->branch_id;
$savings_transaction->savings_id = $saving->id;
$savings_transaction->system_interest = 1;
$savings_transaction->type = "interest";
$savings_transaction->reversible = 1;
$savings_transaction->date = date("Y-m-d");
$savings_transaction->time = date("H:i");
$date = explode('-', date("Y-m-d"));
$savings_transaction->year = $date[0];
$savings_transaction->month = $date[1];
$savings_transaction->credit = $interest;
$savings_transaction->notes = $key->interest_rate . " Per Annum Interest calculated";
$savings_transaction->save();
if (!empty($key->chart_reference)) {
$journal = new JournalEntry();
$journal->account_id = $key->chart_reference->id;
$journal->branch_id = $savings_transaction->branch_id;
$journal->date = date("Y-m-d");
$journal->year = $date[0];
$journal->month = $date[1];
$journal->borrower_id = $savings_transaction->borrower_id;
$journal->transaction_type = 'interest';
$journal->name = "Savings Interest";
$journal->savings_id = $saving->id;
$journal->credit = $interest;
$journal->reference = $savings_transaction->id;
$journal->save();
}
if (!empty($key->chart_control)) {
$journal = new JournalEntry();
$journal->account_id = $key->chart_control->id;
$journal->branch_id = $savings_transaction->branch_id;
$journal->date = date("Y-m-d");
$journal->year = $date[0];
$journal->month = $date[1];
$journal->borrower_id = $savings_transaction->borrower_id;
$journal->transaction_type = 'interest';
$journal->name = "Savings Interest";
$journal->savings_id = $saving->id;
$journal->debit = $interest;
$journal->reference = $savings_transaction->id;
$journal->save();
}
}
}
}
}
}
Setting::where('setting_key', 'cron_last_run')->update(['setting_value' => date("Y-m-d H:i:s")]);
echo "Cron job executed successfully";
}
}