updated streamline-setup v2

This commit is contained in:
2025-01-15 08:53:49 -08:00
committed by alec.turner
parent a2ce9248f0
commit 4b569f81b0
20228 changed files with 2932048 additions and 63204 deletions
@@ -0,0 +1,409 @@
<?php
namespace Modules\Insurance\Http\Controllers;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Streamline\Models\Drug;
use Streamline\Models\InsuranceExpenditure;
use Streamline\Models\InsuranceGroup;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Auth;
use Streamline\Models\InsurancePremiums;
use Streamline\Models\InsuranceSubscription;
class InsuranceReportsController extends Controller {
public function __construct() {
$this->middleware('auth');
$this->middleware('permission:insurance-reports', ['only' => ['index']]);
$this->middleware('permission:insurance-almost-expiring', ['only' => ['view_expiry_status', 'view_expiry_status_details']]);
$this->middleware('permission:insurance-drugs-covered', ['only' => ['drugs_covered']]);
$this->middleware('permission:expired-insurance', ['only' => ['expired_insurance', 'expired_insurance_details']]);
$this->middleware('permission:insurance-premiums-report', ['only' => ['insurance_transactions']]);
$this->middleware('permission:insurance-cumulative-premiums-report', ['only' => ['cumulative_premiums_report']]);
$this->middleware('permission:insurance-income-received', ['only' => ['insurance_income_received']]);
$this->middleware('permission:insurance-expenditure', ['only' => ['insurance_expenditure']]);
}
public function index(){}
public function view_expiry_status(Request $request) {
$insurance_group_options = InsuranceGroup::orderBy('name', 'asc')->pluck('name', 'id')->toArray();
$insurance_group_options = ['' => '- select -'] + $insurance_group_options;
$today = Carbon::today();
$two_months_from_now = Carbon::now()->addMonths(2);
if ($request->has('group_id')) {
$insurance_groups = InsuranceGroup::orderBy('insurance_subscriptions.end_date', 'asc')
->join('insurance_subscriptions', 'insurance_groups.id', '=', 'insurance_subscriptions.group_id')
->select('insurance_groups.name', 'insurance_groups.id', 'insurance_subscriptions.start_date', 'insurance_subscriptions.end_date', 'insurance_subscriptions.payment_date')
->whereBetween('insurance_subscriptions.end_date', [$today, $two_months_from_now])
->where('insurance_subscriptions.group_id', $request->group_id)
->get();
} else {
$insurance_groups = InsuranceGroup::orderBy('insurance_subscriptions.end_date', 'asc')
->join('insurance_subscriptions', 'insurance_groups.id', '=', 'insurance_subscriptions.group_id')
->select('insurance_groups.name', 'insurance_groups.id', 'insurance_subscriptions.start_date', 'insurance_subscriptions.end_date', 'insurance_subscriptions.payment_date')
->whereBetween('insurance_subscriptions.end_date', [$today, $two_months_from_now])
->get();
}
$group_ids = DB::table('insurance_groups')->select('id')->distinct()->get();
$total_insurance = DB::table('insurance_subscriptions')->sum('amount');
return view('insurance::insurance_reports.view_expiry_status', compact('total_insurance', 'insurance_groups', 'group_ids', 'insurance_group_options'));
}
public function view_expiry_status_details($id) {
$insurance_subscriptions = InsuranceSubscription::where(['group_id' => $id])->select('amount', 'start_date', 'end_date', 'payment_date')
->orderBy('start_date', 'asc')->paginate(50);
$result = DB::table('insurance_groups')->select('name')->where('id', $id)->first();
$group_name = $result->name;
return view('insurance::insurance_reports.view_expiry_status_details', compact('group_name', 'insurance_subscriptions'));
}
public function expired_insurance() {
$insurance_groups = InsuranceGroup::where('insurance_subscriptions.end_date', '<', date('Y-m-d'))->orderBy('insurance_subscriptions.end_date', 'desc')
->join('insurance_subscriptions', 'insurance_groups.id', '=', 'insurance_subscriptions.group_id')
->select('insurance_groups.*', 'insurance_subscriptions.start_date', 'insurance_subscriptions.end_date', 'insurance_subscriptions.payment_date', 'insurance_subscriptions.covered_member_ids', 'insurance_subscriptions.covered_member_premiums_paid')
->get(50); //this is the old query. I have left if just in case
$insurance_premiums = DB::select("SELECT insurance_subscriptions.group_id, end_date, start_date, amount, payment_date, covered_member_ids,covered_member_premiums_paid FROM insurance_subscriptions INNER JOIN (SELECT group_id, MAX(end_date) AS max_end_date FROM insurance_subscriptions GROUP BY group_id) ms ON insurance_subscriptions.group_id = ms.group_id AND end_date = max_end_date");
return view('insurance::insurance_reports.expired_insurance', compact('insurance_groups', 'insurance_premiums'));
}
public function expired_insurance_details($id) {
$insurance_subscriptions = DB::table('insurance_subscriptions')->where(['group_id' => $id])
->select('amount', 'start_date', 'end_date', 'payment_date', 'covered_member_ids')->orderBy('start_date', 'asc')->paginate(50);
$result = DB::table('insurance_groups')->select('name')->where('id', $id)->first();
$group_name = $result->name;
return view('insurance::insurance_reports.view_expiry_status_details', compact('group_name', 'insurance_subscriptions'));
}
public function insurance_transactions(Request $request) {
if($request->start_date){
$start = Carbon::createFromFormat('d/m/Y', $request->start_date)->toDateString();
$end = Carbon::createFromFormat('d/m/Y', $request->end_date)->toDateString();
} else {
$start = Carbon::now()->startOfDay()->toDateTimeString();
$end = Carbon::now()->endOfDay()->toDateTimeString();
}
$search_text = "Searching between " . streamline_date($start) . " and " . streamline_date($end);
$start = date("Y-m-d", strtotime($start));
$end = date("Y-m-d", strtotime($end));
$insurance_transactions = DB::table('insurance_subscriptions')
->whereBetween('payment_date', [$start, $end])->get();
$insurance_groups = DB::table('insurance_groups')->whereNull('deleted_at')->pluck('name', 'id');
return view('insurance::insurance_reports.insurance_transactions', compact('insurance_transactions', 'start', 'end', 'search_text', 'insurance_groups'));
}
public function cumulative_premiums_report(Request $request) {
if($request->start_date){
$start_date = Carbon::createFromFormat('d/m/Y', $request->start_date)->toDateString();
$end_date = Carbon::createFromFormat('d/m/Y', $request->end_date)->toDateString();
} else {
$start_date = Carbon::now()->startOfDay()->toDateTimeString();
$end_date = Carbon::now()->endOfDay()->toDateTimeString();
}
$reports = DB::table('insurance_groups')
->whereBetween('insurance_subscriptions.payment_date', [$start_date, $end_date])
->orderBy('name', 'asc')
->join('insurance_subscriptions', 'insurance_groups.id', '=', 'insurance_subscriptions.group_id')
->select('insurance_groups.*', 'insurance_subscriptions.start_date', 'insurance_subscriptions.end_date', 'insurance_subscriptions.payment_date')
->paginate(50);
$search_text = "Searching between " . streamline_date($start_date) . " and " . streamline_date($end_date);
return view('insurance::insurance_reports.cumulative_premiums_report', compact('reports', 'start_date', 'end_date', 'search_text'));
}
public function group_premiums_report(Request $request) {
$start_date = $request->start_date;
$end_date = $request->end_date;
$id = $request->id;
$group_transactions = DB::table('insurance_subscriptions')->where(['group_id' => $id])
->whereBetween('payment_date', [$start_date, $end_date])->orderBy('payment_date', 'asc')->paginate(50);
$insurance_groups = InsuranceGroup::orderBy('name', 'asc')->pluck('name', 'id');
return view('insurance::insurance_reports.group_premiums_report', compact('group_transactions', 'insurance_groups'));
}
public function insurance_income_received(Request $request) {
if($request->start_date){
$start_date = Carbon::createFromFormat('d/m/Y', $request->start_date)->toDateString();
$end_date = Carbon::createFromFormat('d/m/Y', $request->end_date)->toDateString();
} else {
$start_date = Carbon::now()->startOfDay()->toDateTimeString();
$end_date = Carbon::now()->endOfDay()->toDateTimeString();
}
$premiums = 0;
$co_payments = 0;
$insurance_subscriptions = DB::table('insurance_subscriptions')->whereBetween('payment_date', [$start_date, $end_date])
->select('family_amount')->get();
foreach ($insurance_subscriptions as $insurance_subscription) {
$arrayPremium = explode(",", $insurance_subscription->family_amount);
for ($x = 0; $x < count($arrayPremium); $x++) {
if (is_numeric($arrayPremium[$x])){
$premiums += $arrayPremium[$x];
}
}
}
/*$single_group_receipts_sum = DB::table('single_group_receipts')->whereBetween('payment_date', [$start_date, $end_date])
->sum('amount');
$premiums += $single_group_receipts_sum;*/
$service_deposits = DB::table('service_deposits')->whereBetween('created_at', [$start_date, $end_date])
->where('service_type', '=', 'Co_Payment')->select('patient_amount_paid')->get();
foreach ($service_deposits as $service_deposit) {
$co_payments += $service_deposit->patient_amount_paid;
}
$insurance_claims = DB::table('insurance_claims')
->whereBetween('created_at', [$start_date, $end_date])
->whereNotIn('claim_status', [1,4,5]) // should be adjudicated or released
->whereNull('deleted_at')->get();
$expenditure_total = 0;
foreach ($insurance_claims as $insurance_claim) {
$expenditure_total += $insurance_claim->primary_plan_claim_total;
}
//store dates in session variable
session()->put('start_date', $start_date);
session()->put('end_date', $end_date);
$total = $premiums + $co_payments;
$search_text = "Searching between " . streamline_date($start_date) . " and " . streamline_date($end_date);
return view('insurance::insurance_reports.insurance_income_received', compact('premiums', 'co_payments', 'total', 'search_text', 'expenditure_total'));
}
public function total_insurance_expenditure_redirect() {
$start_date = session()->get('start_date');
$end_date = session()->get('end_date');
$insurance_claims = DB::table('insurance_claims')
->whereBetween('created_at', [$start_date, $end_date])
->whereNotIn('claim_status', [1,4,5]) // should be adjudicated or released
->whereNull('deleted_at')->get();
$drugs_total = 0;
$investigations_total = 0;
$procedures_total = 0;
$bed_stay_total = 0;
$sundries_total = 0;
$services_total = 0;
foreach ($insurance_claims as $insurance_claim) {
if ($insurance_claim->item_type == 1) {
$services_total += $insurance_claim->primary_plan_claim_total;
} elseif ($insurance_claim->item_type == 2) {
$procedures_total += $insurance_claim->primary_plan_claim_total;
} elseif ($insurance_claim->item_type == 3) {
$investigations_total += $insurance_claim->primary_plan_claim_total;
} elseif ($insurance_claim->item_type == 4) {
$drugs_total += $insurance_claim->primary_plan_claim_total;
} elseif ($insurance_claim->item_type == 5) {
$sundries_total += $insurance_claim->primary_plan_claim_total;
} elseif ($insurance_claim->item_type == 6) {
$bed_stay_total += $insurance_claim->primary_plan_claim_total;
}
}
$total = $drugs_total + $investigations_total + $procedures_total + $services_total + $sundries_total + $bed_stay_total;
$insurance_groups_select = InsuranceGroup::orderBy('name', 'asc')->pluck('name', 'id')->toArray();
$insurance_groups_select = ['' => '- select -'] + $insurance_groups_select;
$group_id = 0;
return view('insurance::insurance_reports.insurance_expenditure', compact('bed_stay_total', 'drugs_total', 'investigations_total', 'procedures_total', 'total', 'sundries_total', 'start_date', 'end_date', 'services_total', 'insurance_groups_select', 'group_id'));
}
public function insurance_deposit_income() {
$start_date = session()->get('start_date');
$end_date = session()->get('end_date');
$service_deposits = DB::table('service_deposits')->whereBetween('created_at', [$start_date, $end_date])
->where('service_type', '=', 'Co_Payment')->orderBy('created_at', 'asc')->get();
$groups = DB::table('insurance_members')->orderBy('id', 'asc')->pluck('group_id', 'patient_id');
$families = DB::table('insurance_members')->orderBy('id', 'asc')->pluck('family_id', 'patient_id');
$search_text = "Showing details for " . streamline_date($start_date) . " to " . streamline_date($end_date);
return view('insurance::insurance_reports.insurance_deposit_income', compact('service_deposits', 'families', 'groups', 'search_text'));
}
public function insurance_income_received_details() {
$start_date = session()->get('start_date');
$end_date = session()->get('end_date');
$insurance_subscriptions = DB::table('insurance_subscriptions')->whereBetween('payment_date', [$start_date, $end_date])
->orderBy('payment_date', 'asc')->get();
$single_group_receipts = []; /*DB::table('single_group_receipts')->whereBetween('payment_date', [$start_date, $end_date])
->get();*/
$search_text = "Showing details for " . streamline_date($start_date) . " to " . streamline_date($end_date);
return view('insurance::insurance_reports.insurance_income_received_details', compact('insurance_subscriptions', 'search_text', 'single_group_receipts'));
}
public function insurance_expenditure(Request $request) {
$start_date = Carbon::now()->startOfDay()->toDateTimeString();
$end_date = Carbon::now()->endOfDay()->toDateTimeString();
$filter = [];
$group_id = 0;
try {
if($request->start_date){
$start_date = Carbon::createFromFormat('d/m/Y', $request->start_date)->toDateString();
$end_date = Carbon::createFromFormat('d/m/Y', $request->end_date)->toDateString();
} elseif (!empty(session()->get('start_date'))) {
$start_date = Carbon::createFromFormat('Y-m-d', session()->get('start_date'))->toDateString();
$end_date = Carbon::createFromFormat('Y-m-d', session()->get('end_date'))->toDateString();
}
} catch (\Exception $e) {}
if (isset($request->group_id)) {
$filter[] = ['group_id', '=', $request->group_id];
$group_id = $request->group_id;
session()->put('group_id', $request->group_id);
}
$insurance_claims = DB::table('insurance_claims')
->where($filter)
->whereBetween('created_at', [$start_date, $end_date])
->whereNotIn('claim_status', [1,4,5]) // should be adjudicated or released
->whereNull('deleted_at')->get();
$drugs_total = 0;
$investigations_total = 0;
$procedures_total = 0;
$bed_stay_total = 0;
$sundries_total = 0;
$services_total = 0;
foreach ($insurance_claims as $insurance_claim) {
if ($insurance_claim->item_type == 1) {
$services_total += $insurance_claim->primary_plan_claim_total;
} elseif ($insurance_claim->item_type == 2) {
$procedures_total += $insurance_claim->primary_plan_claim_total;
} elseif ($insurance_claim->item_type == 3) {
$investigations_total += $insurance_claim->primary_plan_claim_total;
} elseif ($insurance_claim->item_type == 4) {
$drugs_total += $insurance_claim->primary_plan_claim_total;
} elseif ($insurance_claim->item_type == 5) {
$sundries_total += $insurance_claim->primary_plan_claim_total;
} elseif ($insurance_claim->item_type == 6) {
$bed_stay_total += $insurance_claim->primary_plan_claim_total;
}
}
$total = $drugs_total + $investigations_total + $procedures_total + $services_total + $sundries_total + $bed_stay_total;
//store dates in session variable
session()->put('start_date', $start_date);
session()->put('end_date', $end_date);
$insurance_groups_select = InsuranceGroup::orderBy('name', 'asc')->pluck('name', 'id')->toArray();
$insurance_groups_select = ['' => '- select -'] + $insurance_groups_select;
return view('insurance::insurance_reports.insurance_expenditure', compact('drugs_total', 'investigations_total', 'procedures_total', 'services_total', 'total', 'sundries_total', 'start_date', 'end_date', 'bed_stay_total', 'insurance_groups_select', 'group_id'));
}
public function insurance_expenditure_details($item_type) {
//get date
$start_date = session()->get('start_date');
$end_date = session()->get('end_date');
$group_id = session()->get('group_id');
$item_type_name = [1 => 'Services', 2 => 'Procedures', 3 => 'Investigations', 4 => 'Drugs', 5 => 'Sundries', 6 => 'Inpatient Accommodation'][$item_type] ?? "";
if(!empty($group_id)) $insurance_claims = DB::table('insurance_claims')
->where([['item_type', $item_type], ['group_id', $group_id]])
->whereBetween('created_at', [$start_date, $end_date])
->whereNotIn('claim_status', [1,4,5]) // should be adjudicated or released
->whereNull('deleted_at')->get();
else $insurance_claims = DB::table('insurance_claims')
->where('item_type', $item_type)
->whereBetween('created_at', [$start_date, $end_date])
->whereNotIn('claim_status', [1,4,5]) // should be adjudicated or released
->whereNull('deleted_at')->get();
if ($item_type == 1) {
$items = DB::table('services')->where('available', 1)->pluck('name', 'id');
} elseif ($item_type == 2) {
$items = DB::table('procedures')->where('available', 1)->pluck('name', 'id');
} elseif ($item_type == 3) {
$items = DB::table('investigations')->pluck('name', 'id');
} elseif ($item_type == 4) {
$items = DB::table('drugs')->pluck('name', 'id');
} elseif ($item_type == 5) {
$items = DB::table('sundries')->where('available', 1)->pluck('name', 'id');
} elseif ($item_type == 6) {
$items = DB::table('inpatient_bed_categories')->pluck('name', 'id');
} else {
$items = [];
}
return view('insurance::insurance_reports.insurance_expenditure_details', compact('insurance_claims', 'start_date', 'end_date', 'item_type_name', 'items', 'item_type'));
}
public function expired_premiums_search(Request $request)
{
$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) && $search_by != "3"){
if($search_by == "1"){
// custom date
$start_date_search = Carbon::parse($reg_date)->startOfDay()->toDateString();
$end_date_search = Carbon::parse($reg_date)->endOfDay()->toDateString();
} elseif($search_by == "2"){
// custom date range
$start_date_search = Carbon::parse($start_date)->startOfDay()->toDateString();
$end_date_search = Carbon::parse($end_date)->endOfDay()->toDateString();
} else {
$start_date_search = Carbon::now()->subDay()->toDateString();
$end_date_search = Carbon::now()->toDateString();
}
$insurance_premiums = DB::select("SELECT insurance_subscriptions.group_id, end_date, start_date, amount, payment_date, covered_member_ids,covered_member_premiums_paid FROM insurance_subscriptions INNER JOIN (SELECT group_id, MAX(end_date) AS max_end_date FROM insurance_subscriptions GROUP BY group_id) ms ON insurance_subscriptions.group_id = ms.group_id AND end_date = max_end_date WHERE end_date BETWEEN '{$start_date_search}' AND '{$end_date_search}'");
} else {
$insurance_premiums = DB::select("SELECT insurance_subscriptions.group_id, end_date, start_date, amount, payment_date, covered_member_ids,covered_member_premiums_paid FROM insurance_subscriptions INNER JOIN (SELECT group_id, MAX(end_date) AS max_end_date FROM insurance_subscriptions GROUP BY group_id) ms ON insurance_subscriptions.group_id = ms.group_id AND end_date = max_end_date");
}
return view('insurance::insurance_reports.expired_insurance', compact('insurance_premiums'));
}
}