Files
streamline-emr/docker/streamline-src/Modules/PatientDiscounts/Http/Controllers/PatientAccountsController.php
T

593 lines
28 KiB
PHP
Executable File

<?php
namespace Modules\PatientDiscounts\Http\Controllers;
use Barryvdh\Snappy\Facades\SnappyPdf;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Modules\PatientFinance\Http\Controllers\PatientFinanceController;
use Streamline\Models\ChartOfAccount;
use Streamline\Models\HospitalInformation;
use Streamline\Models\Patient;
use Streamline\Models\PatientAccountConsumption;
use Streamline\Models\PatientAccountsDeposit;
use Streamline\Models\PatientAccountsRefund;
use Streamline\Models\PatientPaymentMethod;
use Streamline\Models\TrackReceipt;
class PatientAccountsController extends Controller {
public function statement(Request $request) {
$patient_id = session()->get('patient_id');
$search_by = $request->search_by;
$reg_date = $request->reg_date;
$start_date = $request->start_date;
$end_date = $request->end_date;
$patient = DB::table('patients')
->where('id', $patient_id)
->first();
if (!is_null($search_by)){
if($search_by == "0"){
// last 24 hours
$start_date_search = Carbon::now()->subDay()->startOfDay()->toDateTimeString();
$end_date_search = Carbon::now()->endOfDay()->toDateTimeString();
} elseif($search_by == "1"){
// custom date
$start_date_search = Carbon::parse($reg_date)->startOfDay()->toDateTimeString();
$end_date_search = Carbon::parse($reg_date)->endOfDay()->toDateTimeString();
} elseif($search_by == "2"){
// custom date range
$start_date_search = Carbon::parse($start_date)->startOfDay()->toDateTimeString();
$end_date_search = Carbon::parse($end_date)->endOfDay()->toDateTimeString();
} else {
$start_date_search = Carbon::now()->startOfDay()->toDateTimeString();
$end_date_search = Carbon::now()->endOfDay()->toDateTimeString();
}
} else {
$start_date_search = Carbon::now()->startOfDay()->toDateTimeString();
$end_date_search = Carbon::now()->endOfDay()->toDateTimeString();
}
$patient_deposits = PatientAccountsDeposit::whereBetween('deposit_date', [$start_date_search, $end_date_search])
->where('patient_id', $patient_id)
->get();
$patient_refunds = PatientAccountsRefund::whereBetween('refund_date', [$start_date_search, $end_date_search])
->where('patient_id', $patient_id)
->get();
$patient_consumptions = PatientAccountConsumption::whereBetween('created_at', [$start_date_search, $end_date_search])
->where('patient_id', $patient_id)
->get();
return view('patient_discounts::patient_accounts.statement', compact('patient', 'search_by', 'reg_date', 'start_date', 'end_date',
'patient_deposits', 'patient_refunds', 'patient_consumptions'));
}
public function print_statement(Request $request) {
$patient_id = session()->get('patient_id');
$search_by = $request->search_by;
$reg_date = $request->reg_date;
$start_date = $request->start_date;
$end_date = $request->end_date;
if (!is_null($search_by)){
if($search_by == "0"){
// last 24 hours
$start_date_search = Carbon::now()->subDay()->startOfDay()->toDateTimeString();
$end_date_search = Carbon::now()->endOfDay()->toDateTimeString();
} elseif($search_by == "1"){
// custom date
$start_date_search = Carbon::parse($reg_date)->startOfDay()->toDateTimeString();
$end_date_search = Carbon::parse($reg_date)->endOfDay()->toDateTimeString();
} elseif($search_by == "2"){
// custom date range
$start_date_search = Carbon::parse($start_date)->startOfDay()->toDateTimeString();
$end_date_search = Carbon::parse($end_date)->endOfDay()->toDateTimeString();
} else {
$start_date_search = Carbon::now()->startOfDay()->toDateTimeString();
$end_date_search = Carbon::now()->endOfDay()->toDateTimeString();
}
} else {
$start_date_search = Carbon::now()->startOfDay()->toDateTimeString();
$end_date_search = Carbon::now()->endOfDay()->toDateTimeString();
}
$patient_deposits = PatientAccountsDeposit::whereBetween('deposit_date', [$start_date_search, $end_date_search])
->where('patient_id', $patient_id)
->get();
$patient_refunds = PatientAccountsRefund::whereBetween('refund_date', [$start_date_search, $end_date_search])
->where('patient_id', $patient_id)
->get();
$patient_consumptions = PatientAccountConsumption::whereBetween('created_at', [$start_date_search, $end_date_search])
->where('patient_id', $patient_id)
->get();
$hospital_information = HospitalInformation::first();
$data = [
'patient_consumptions' => $patient_consumptions,
'patient_refunds' => $patient_refunds,
'patient_deposits' => $patient_deposits,
'hospitalInfo' => $hospital_information,
'patient_id' => $patient_id,
'search_info' => "Patient Account details and transactions between " . streamline_date($start_date_search)
. " and " . streamline_date($end_date_search) . " for " .
get_full_name($patient_id, 'id', 'first_name', 'last_name', 'patients') .
" (" . get_name($patient_id, 'id', 'number', 'patients') . ")"
];
$pdf = SnappyPDF::loadView("patient_discounts::patient_accounts/print_statement", $data)
->setOrientation('portrait')
->setOption('margin-bottom', 7)
->setOption('margin-top', 5)
->setOption('footer-html', '<i>&copy; ' . date('Y') . ' Stre@mline</i>');
return $pdf->inline('Patient Account Statement' . date(" d-m-y h:ia") . '.pdf');
}
public function make_deposit() {
$patient_id = session()->get('patient_id');
$patient = DB::table('patients')->find($patient_id);
$patient_payment_methods = PatientPaymentMethod::pluck('name', 'id');
$patient_payment_methods_options = "";
foreach ($patient_payment_methods as $key => $value) {
$patient_payment_methods_options .= '<option value="' . $key . '">' . $value . '</option>';
}
return view('patient_discounts::patient_accounts.make_deposit', compact('patient', 'patient_payment_methods_options'));
}
public function store_deposit(Request $request) {
$patient_id = session()->get('patient_id');
$patient = DB::table('patients')->find($patient_id);
$deposit_amount = $request->deposit_amount;
$deposit_date = $request->deposit_date;
$track_receipts = new TrackReceipt;
$track_receipts->created_by = Auth::id();
$track_receipts->reason = 'Patient Account Deposit';
$track_receipts->save();
$receipt_number = sprintf("%04u", $track_receipts->id);
$deposit = new PatientAccountsDeposit();
$deposit->patient_id = $patient_id;
$deposit->deposit_amount = $deposit_amount;
$deposit->deposit_date = Carbon::createFromFormat('d-m-Y', $deposit_date)->toDateString();
$deposit->receipt_number = $receipt_number;
$deposit->created_by = Auth::id();
if ($deposit->save()) {
record_cash_credits_to_daily_collection_account($deposit_amount, $receipt_number, "Patient Account Deposits");
$patient_to_update = Patient::find($patient_id);
$patient_to_update->patient_account_balance = $patient_to_update->patient_account_balance + (int)$request->deposit_amount;
$patient_to_update->update();
$patient_account_balance_id = get_name("patient_account_balance", "slug", "id", "chart_of_accounts");
if (is_numeric($patient_account_balance_id)) {
// increase the balance on chart of accounts called "patient account deposit"
$chart_of_account = ChartOfAccount::find($patient_account_balance_id);
$chart_of_account->balance = $chart_of_account->balance + (int)$request->deposit_amount;
$chart_of_account->update();
} else {
flash('A chart of accounts is missing. Please contact Stre@mline support immediately!')->error();
}
$receipt_date = date('Y-m-d h:i:s');
$return_payment_methods = PatientFinanceController::register_payment_method($patient_id, 0, $request->original_cash_to_pay, $request->payment_method,
$request->payment_methods_amount, array_fill(0, ($request->payment_methods_amount ? count($request->payment_methods_amount) : 0), null), array_fill(0, ($request->payment_methods_amount ? count($request->payment_methods_amount) : 0), 0), $receipt_number, 15, Auth::id(), 0);
flash('Patient account deposit has been updated')->success();
$description = "Amount Deposited";
if (is_cashier_receipt_type_print_html()) {
return view('patient_discounts::patient_accounts.deposit_receipt',compact('deposit_amount', 'receipt_number', 'receipt_date', 'return_payment_methods',
'patient', 'deposit_date', 'description'));
} else {
// so we first have to set a session and then go back to the payment page
// on the payment page we can then set a JS variable that can help redirect us to our pdf print
session()->put('print_patient_account_receipt_pdf', 1);
// since we want to reduce the amount of duplicate code, we shall send all items to one file for printing
$data = [
"deposit_amount" => $deposit_amount, "receipt_number" => $receipt_number, "deposit_date" => $deposit_date,
"return_payment_methods" => $return_payment_methods, "receipt_date" => $receipt_date, "patient_id" => $patient_id, "description" => $description
];
session()->put('print_patient_account_receipt_pdf_details', $data);
return redirect('/patient_finance/home/');
}
} else {
return redirect('patient_accounts/make_deposit');
}
}
public function print_receipt_pdf_details() {
$data = session()->get("print_patient_account_receipt_pdf_details");
// add check for when the people try to reload the page
if (!$data) {
return redirect('/home');
}
$data['hospital_information'] = \Streamline\Models\HospitalInformation::first();
// lest i forget Thy love for me
session()->forget('print_patient_account_receipt_pdf');
session()->forget('print_patient_account_receipt_pdf_details');
$pdf = SnappyPDF::loadView("patient_discounts::patient_accounts.print_receipt_pdf_details", $data)
->setOrientation('portrait')
->setPaper('a4')
->setOption('margin-bottom', 5)
->setOption('margin-top', 5)
->setOption('footer-html', '<i>&copy; ' . date('Y') . ' Stre@mline</i>');
return $pdf->inline('Patient Accounts Receipt' . date(" d-m-y h:ia") . '.pdf');
}
public function refund_deposit() {
$patient_id = session()->get('patient_id');
$patient = DB::table('patients')->find($patient_id);
$current_balance = get_name($patient_id, 'id', 'patient_account_balance', 'patients');
$banks = DB::table('chart_of_accounts')->whereNull('deleted_at')->where('type', 4)->pluck('name', 'id')->prepend('--select--', '');
if ($current_balance > 0) {
return view('patient_discounts::patient_accounts.refund_deposit', compact('current_balance', 'patient', 'banks'));
} else {
flash("Patient account refund can not be completed because balance is less than refund limit")->error();
return redirect('/patient_accounts/statement');
}
}
public function save_refund_deposit(Request $request) {
$patient_id = session()->get('patient_id');
$patient = DB::table('patients')->find($patient_id);
$track_receipts = new TrackReceipt;
$track_receipts->created_by = Auth::id();
$track_receipts->reason = 'Patient Accounts Refund';
$track_receipts->save();
$receipt_number = sprintf("%04u", $track_receipts->id);
$current_balance = $request->current_balance;
$refund_amount = $request->refund_amount;
$refund_date = $request->refund_date;
$account_id = $request->account_id;
$account_balance = $request->account_balance;
$refund_reason = $request->refund_reason;
if (($current_balance < $refund_amount) || ($refund_amount < 1) || ($account_balance < $refund_amount)) {
flash("Please enter a valid refund amount")->error();
return redirect('/patient_accounts/refund_deposit');
}
// reduce the patient's current balance by deleted amount
$patient_to_update = Patient::find($patient_id);
$patient_to_update->patient_account_balance = (int)$current_balance - (int)$refund_amount;
$patient_to_update->update();
// decrease the balance on select account
$chart_of_account = ChartOfAccount::find($account_id);
$chart_of_account->balance = $chart_of_account->balance - (int)$refund_amount;
$chart_of_account->update();
$account_balance_record_on_expense_date = get_latest_banking_record_based_on_transaction_date($account_id, date('Y-m-d', strtotime($refund_date)));
$account_balance_on_expense_date_after_payment = ($account_balance_record_on_expense_date ? (int)$account_balance_record_on_expense_date->account_balance : 0) - $refund_amount;
$last_insert_id = capture_bank_record('Patient Account Refunds', date('Y-m-d', strtotime($refund_date)), $account_id, 0,
$account_balance_on_expense_date_after_payment, 0, $refund_amount, $refund_reason, $receipt_number);
update_banking_record_balances(date('Y-m-d', strtotime($refund_date)), $account_id, $last_insert_id, $account_balance_on_expense_date_after_payment);
$patient_account_balance_id = get_name("patient_account_balance", "slug", "id", "chart_of_accounts");
if (is_numeric($patient_account_balance_id)) {
// decrease the balance on chart of accounts called "patient account deposit"
$chart_of_account = ChartOfAccount::find($patient_account_balance_id);
$chart_of_account->balance = $chart_of_account->balance - (int)$refund_amount;
$chart_of_account->update();
} else {
flash('A chart of accounts is missing. Please contact Stre@mline support immediately!')->error();
}
$refund = new PatientAccountsRefund();
$refund->patient_id = $patient_id;
$refund->refund_amount = $refund_amount;
$refund->refund_date = Carbon::createFromFormat('d-m-Y', $refund_date)->toDateString();
$refund->refund_reason = $refund_reason;
$refund->account_id = $account_id;
$refund->receipt_number = $receipt_number;
$refund->created_by = Auth::id();
$refund->save();
$description = "Amount Refunded";
$deposit_amount = $refund_amount;
$receipt_date = date('Y-m-d h:i:s');
$deposit_date = $refund_date;
$return_payment_methods = [];
if (is_cashier_receipt_type_print_html()) {
return view('patient_discounts::patient_accounts.deposit_receipt',compact('deposit_amount', 'receipt_number', 'receipt_date', 'return_payment_methods',
'patient', 'deposit_date', 'description'));
} else {
// so we first have to set a session and then go back to the payment page
// on the payment page we can then set a JS variable that can help redirect us to our pdf print
session()->put('print_patient_account_receipt_pdf', 1);
// since we want to reduce the amount of duplicate code, we shall send all items to one file for printing
$data = [
"deposit_amount" => $deposit_amount, "receipt_number" => $receipt_number, "deposit_date" => $deposit_date,
"return_payment_methods" => $return_payment_methods, "receipt_date" => $receipt_date, "patient_id" => $patient_id, "description" => $description
];
session()->put('print_patient_account_receipt_pdf_details', $data);
return redirect('/patient_finance/home/');
}
}
public function deposits_report(Request $request) {
$search_by = $request->search_by;
$reg_date = $request->reg_date;
$start_date = $request->start_date;
$end_date = $request->end_date;
$filters = [];
if (!is_null($search_by)){
if($search_by == "0"){
// last 24 hours
$last_day = Carbon::now()->subDay();
$filters[] = ['deposit_date', '>', $last_day];
} elseif($search_by == "1"){
// custom date
$start_date_search = Carbon::parse($reg_date)->toDateString();
$filters[] = ['deposit_date', '=', $start_date_search];
} elseif($search_by == "2"){
// custom date range
if ($start_date == $end_date) {
$start_date_search = Carbon::parse($start_date)->startOfDay()->toDateString();
$filters[] = ['deposit_date', '=', $start_date_search];
} else {
$start_date_search = Carbon::parse($start_date)->startOfDay()->toDateString();
$end_date_search = Carbon::parse($end_date)->endOfDay()->toDateString();
$filters[] = ['deposit_date', '>', $start_date_search];
$filters[] = ['deposit_date', '<', $end_date_search];
}
} else {
$start_date_search = Carbon::now()->startOfDay()->toDateString();
$end_date_search = Carbon::now()->endOfDay()->toDateString();
$filters[] = ['deposit_date', '>', $start_date_search];
$filters[] = ['deposit_date', '<', $end_date_search];
}
} else {
$filters[] = ['deposit_date', '=', Carbon::now()->toDateString()];
}
if (isset($request->patient_number)) {
$filters[] = ['patient_id', '=', get_name($request->patient_number, 'number', 'id', 'patients')];
}
if (isset($request->user_id)) {
$filters[] = ['created_by', '=', $request->user_id];
}
$patient_numbers = DB::table('patients')->orderBy('number')->distinct()->pluck('number');
$patient_deposits = PatientAccountsDeposit::where($filters)->get();
return view('patient_discounts::patient_accounts.deposits_report', compact('patient_deposits', 'reg_date', 'start_date', 'end_date', 'patient_numbers'));
}
public function view_details($id) {
session()->put(['patient_id' => $id]);
return redirect('/patient_accounts/statement');
}
public function cancel_deposit($id) {
$deposit = PatientAccountsDeposit::find($id);
$receipt_number = $deposit->receipt_number;
$patient_id = $deposit->patient_id;
$deposit_amount = $deposit->deposit_amount;
if ($deposit->delete()) {
$patient_account_balance_id = get_name("patient_account_balance", "slug", "id", "chart_of_accounts");
if (is_numeric($patient_account_balance_id)) {
// decrease the balance on chart of accounts called "patient account deposit"
$chart_of_account = ChartOfAccount::find($patient_account_balance_id);
$chart_of_account->balance = (int)$chart_of_account->balance - (int)$deposit_amount;
$chart_of_account->update();
} else {
flash('A chart of accounts is missing. Please contact Stre@mline support immediately!')->error();
}
record_cash_debits_to_daily_collection_account($deposit_amount, $receipt_number, 'Cancel Patient Account Deposit');
// reduce the patient's current balance by deleted amount
$patient_to_update = Patient::find($patient_id);
$patient_to_update->patient_account_balance = $patient_to_update->patient_account_balance - $deposit_amount;
$patient_to_update->update();
// delete the patient payment methods
DB::table('payment_methods_transactions')
->where('receipt_number', $receipt_number)
->delete();
flash("Patient account deposit of " . $deposit_amount . " has been cancelled")->success();
} else {
flash("Patient account deposit of " . $deposit_amount . " has not been cancelled")->error();
}
return redirect('/patient_accounts/deposits_report');
}
public function refunds_report(Request $request) {
$search_by = $request->search_by;
$reg_date = $request->reg_date;
$start_date = $request->start_date;
$end_date = $request->end_date;
$filters = [];
if (!is_null($search_by)){
if($search_by == "0"){
// last 24 hours
$last_day = Carbon::now()->subDay();
array_push($filters, ['refund_date', '>', $last_day]);
} elseif($search_by == "1"){
// custom date
$start_date_search = Carbon::parse($reg_date)->toDateString();
array_push($filters, ['refund_date', '=', $start_date_search]);
} elseif($search_by == "2"){
// custom date range
if ($start_date == $end_date) {
$start_date_search = Carbon::parse($start_date)->startOfDay()->toDateString();
array_push($filters, ['refund_date', '=', $start_date_search]);
} else {
$start_date_search = Carbon::parse($start_date)->startOfDay()->toDateString();
$end_date_search = Carbon::parse($end_date)->endOfDay()->toDateString();
array_push($filters, ['refund_date', '>', $start_date_search]);
array_push($filters, ['refund_date', '<', $end_date_search]);
}
} else {
$start_date_search = Carbon::now()->startOfDay()->toDateString();
$end_date_search = Carbon::now()->endOfDay()->toDateString();
array_push($filters, ['refund_date', '>', $start_date_search]);
array_push($filters, ['refund_date', '<', $end_date_search]);
}
} else {
$start_date_search = Carbon::now()->startOfDay()->toDateString();
$end_date_search = Carbon::now()->endOfDay()->toDateString();
array_push($filters, ['refund_date', '>', $start_date_search]);
array_push($filters, ['refund_date', '<', $end_date_search]);
}
if (isset($request->patient_number)) {
array_push($filters, ['patient_id', '=', get_name($request->patient_number, 'number', 'id', 'patients')]);
}
$patient_numbers = DB::table('patients')->orderBy('number')->distinct()->pluck('number');
$patient_refunds = PatientAccountsRefund::where($filters)->get();
return view('patient_discounts::patient_accounts.refunds_report', compact('patient_refunds', 'reg_date', 'start_date', 'end_date', 'patient_numbers'));
}
public function cancel_refund($id) {
$refund = PatientAccountsRefund::find($id);
$refund_amount = $refund->refund_amount;
$account_id = $refund->account_id;
$track_receipts = new TrackReceipt;
$track_receipts->created_by = Auth::id();
$track_receipts->reason = 'Patient Accounts Refund';
$track_receipts->save();
$receipt_number = sprintf("%04u", $track_receipts->id);
if ($refund->delete()) {
// decrease the balance on select account
$chart_of_account = ChartOfAccount::find($account_id);
$chart_of_account->balance = $chart_of_account->balance + (int)$refund_amount;
$chart_of_account->update();
$account_balance_record_on_expense_date = get_latest_banking_record_based_on_transaction_date($account_id, date('Y-m-d'));
$account_balance_on_expense_date_after_payment = ($account_balance_record_on_expense_date ? (int)$account_balance_record_on_expense_date->account_balance : 0) + $refund_amount;
$last_insert_id = capture_bank_record('Patient Account Refunds Cancellation', date('Y-m-d'), $account_id, 0,
$account_balance_on_expense_date_after_payment, $refund_amount, 0, 'Patient Account Refunds Cancellation', $receipt_number);
update_banking_record_balances(date('Y-m-d'), $account_id, $last_insert_id, $account_balance_on_expense_date_after_payment);
$patient_account_balance_id = get_name("patient_account_balance", "slug", "id", "chart_of_accounts");
if (is_numeric($patient_account_balance_id)) {
// increase the balance on chart of accounts called "patient account deposit"
$chart_of_account = ChartOfAccount::find($patient_account_balance_id);
$chart_of_account->balance = (int)$chart_of_account->balance + (int)$refund_amount;
$chart_of_account->update();
} else {
flash('A chart of accounts is missing. Please contact Stre@mline support immediately!')->error();
}
flash("Patient account refund of " . $refund_amount . " has been cancelled")->success();
} else {
flash("Patient account refund of " . $refund_amount . " has not been cancelled")->error();
}
return redirect('/patient_accounts/refunds_report');
}
public function consumptions_report(Request $request) {
$search_by = $request->search_by;
$reg_date = $request->reg_date;
$start_date = $request->start_date;
$end_date = $request->end_date;
$filters = [];
if (!is_null($search_by)){
if($search_by == "0"){
// last 24 hours
$last_day = Carbon::now()->subDay();
array_push($filters, ['created_at', '>', $last_day]);
} elseif($search_by == "1"){
// custom date
$start_date_search = Carbon::parse($reg_date)->toDateTimeString();
array_push($filters, ['created_at', '=', $start_date_search]);
} elseif($search_by == "2"){
// custom date range
$start_date_search = Carbon::parse($start_date)->startOfDay()->toDateTimeString();
$end_date_search = Carbon::parse($end_date)->endOfDay()->toDateTimeString();
array_push($filters, ['created_at', '>', $start_date_search]);
array_push($filters, ['created_at', '<', $end_date_search]);
} else {
$start_date_search = Carbon::now()->startOfDay()->toDateTimeString();
$end_date_search = Carbon::now()->endOfDay()->toDateTimeString();
array_push($filters, ['created_at', '>', $start_date_search]);
array_push($filters, ['created_at', '<', $end_date_search]);
}
} else {
$start_date_search = Carbon::now()->startOfDay()->toDateTimeString();
$end_date_search = Carbon::now()->endOfDay()->toDateTimeString();
array_push($filters, ['created_at', '>', $start_date_search]);
array_push($filters, ['created_at', '<', $end_date_search]);
}
if (isset($request->patient_number)) {
array_push($filters, ['patient_id', '=', get_name($request->patient_number, 'number', 'id', 'patients')]);
}
$patient_numbers = DB::table('patients')->orderBy('number')->distinct()->pluck('number');
$patient_consumptions = PatientAccountConsumption::where($filters)->get();
return view('patient_discounts::patient_accounts.consumptions_report', compact('patient_consumptions', 'reg_date', 'start_date', 'end_date', 'patient_numbers'));
}
}