Procházet zdrojové kódy

RPM manager - add stats from rpm matrix

Vijayakrishnan před 2 roky
rodič
revize
a51f2dcf2e

+ 57 - 1
app/Http/Controllers/PracticeManagementController.php

@@ -2660,7 +2660,63 @@ WHERE
 
         $mins = $request->input('mins');
 
-        return view('app.practice-management.rpm-manager.index', compact('patients', 'month', 'year', 'paginator', 'perPage', 'proRoles', 'viewingAs', 'cmStartDate', 'cmEndDate', 'mins'));
+        // counts
+        $stats = [];
+        $stats['totalPatients'] = $paginator->total();
+        $commonStatSQL = "
+SELECT COUNT(*)
+FROM care_month join client on care_month.client_id = client.id 
+    left join pro mcpPro on care_month.mcp_pro_id = mcpPro.id
+    left join pro rmmPro on care_month.rmm_pro_id = rmmPro.id
+    left join pro rmePro on care_month.rme_pro_id = rmePro.id
+    left join note mrnote on client.most_recent_completed_mcp_note_id = mrnote.id
+    left join appointment nv on nv.id = mrnote.follow_up_appointment_id
+    left join bill mcpBill on care_month.mcp_rm_generic_bill_id = mcpBill.id AND mcpBill.is_cancelled IS NOT TRUE
+    left join bill rmmBill on care_month.rmm_rm_generic_bill_id = rmmBill.id AND rmmBill.is_cancelled IS NOT TRUE
+    left join bill rmeBill on care_month.rme_rm_generic_bill_id = rmeBill.id AND rmeBill.is_cancelled IS NOT TRUE
+WHERE
+        ";
+
+        $stats['withMeasOn'] = 'N/A';
+        $v = $request->input('wmo') ?: date('Y-m-d');
+        $statQuery = "$commonStatSQL
+(SELECT COUNT(mstat.id) FROM measurement mstat WHERE mstat.care_month_id = care_month.id AND mstat.created_at::date = '$v' AND mstat.is_cellular_zero IS FALSE) > 0 AND
+  " . (count($conditions) > 0 ? implode(" AND ", $conditions) : '1') . "      
+";
+        $statResult = DB::select($statQuery);
+        $stats['withMeasOn'] = $statResult[0]->count;
+
+        $stats['noMeasOn'] = 'N/A';
+        $v = $request->input('nmo') ?: date('Y-m-d');
+        $statQuery = "$commonStatSQL
+(SELECT COUNT(mstat.id) FROM measurement mstat WHERE mstat.care_month_id = care_month.id AND mstat.created_at::date = '$v' AND mstat.is_cellular_zero IS FALSE) = 0 AND
+  " . (count($conditions) > 0 ? implode(" AND ", $conditions) : '1') . "      
+";
+        $statResult = DB::select($statQuery);
+        $stats['noMeasOn'] = $statResult[0]->count;
+
+        $statQuery = "$commonStatSQL
+    care_month.number_of_days_with_remote_measurements >= 16 AND
+      " . (count($conditions) > 0 ? implode(" AND ", $conditions) : '1') . "      
+";
+        $statResult = DB::select($statQuery);
+        $stats['gt16MD'] = $statResult[0]->count;
+
+        $statQuery = "$commonStatSQL
+    care_month.rm_total_time_in_seconds >= 1200 AND care_month.rm_total_time_in_seconds < 2400 AND
+      " . (count($conditions) > 0 ? implode(" AND ", $conditions) : '1') . "      
+";
+        $statResult = DB::select($statQuery);
+        $stats['gt20M'] = $statResult[0]->count;
+
+        $statQuery = "$commonStatSQL
+    care_month.rm_total_time_in_seconds >= 2400 AND
+      " . (count($conditions) > 0 ? implode(" AND ", $conditions) : '1') . "      
+";
+        $statResult = DB::select($statQuery);
+        $stats['gt40M'] = $statResult[0]->count;
+
+        return view('app.practice-management.rpm-manager.index', compact('patients', 'month', 'year', 'paginator', 'perPage', 'proRoles', 'viewingAs', 'cmStartDate', 'cmEndDate', 'mins', 'stats'));
     }
 
     public function rpmManagerRow(Request $request, $uid) {

+ 107 - 19
resources/views/app/practice-management/rpm-manager/index.blade.php

@@ -116,7 +116,32 @@
             border-left-width: 0 !important;
         }
     </style>
-
+    <style>
+        #rpm-admin-stats-graph .stat-bg-total-light {
+            background-color: #fbe7ce;
+        }
+        #rpm-admin-stats-graph .stat-bg-total-dark {
+            background-color: #f6b26b;
+        }
+        #rpm-admin-stats-graph .stat-bg-recd-light {
+            background-color: #d8ead2;
+        }
+        #rpm-admin-stats-graph .stat-bg-recd-dark {
+            background-color: #69a751;
+        }
+        #rpm-admin-stats-graph .stat-bg-not-recd-light {
+            background-color: #f3cdcc;
+        }
+        #rpm-admin-stats-graph .stat-bg-not-recd-dark {
+            background-color: #e06665;
+        }
+        #rpm-admin-stats-graph .stat-bg-crit-light {
+            background-color: #dbd3eb;
+        }
+        #rpm-admin-stats-graph .stat-bg-crit-dark {
+            background-color: #aa98d5;
+        }
+    </style>
     <div class="p-3 mcp-theme-1" id="practice-rpm-manager">
 
         <div class="card h-100">
@@ -127,12 +152,12 @@
 
             <div class="card-body p-0">
                 <div class="d-flex align-items-baseline p-2 border-bottom">
-                    <div class="d-inline-flex align-items-center">
-                        <form action="">
+                    <form action="" class="flex-grow-1">
+                        <div class="d-flex align-items-center">
                             <div class="mr-2 d-inline-flex align-items-center">
                                 <label class="mb-0 mr-1">Month</label>
                                 <select name="m" class="form-control form-control-sm min-width-unset pl-0 font-weight-bold"
-                                    onchange="fastLoad('{{route('practice-management.rpm-manager')}}?' + $(this).closest('form').serialize())">
+                                        onchange="fastLoad('{{route('practice-management.rpm-manager')}}?' + $(this).closest('form').serialize())">
                                     <option value="">All</option>
                                     <option value="01" {{$month && intval($month) === 1 ? 'selected' : ''}}>Jan</option>
                                     <option value="02" {{$month && intval($month) === 2 ? 'selected' : ''}}>Feb</option>
@@ -151,7 +176,7 @@
                             <div class="mr-2 d-inline-flex align-items-center">
                                 <label class="mb-0 mr-1">Year</label>
                                 <select name="y" class="form-control form-control-sm min-width-unset pl-0 font-weight-bold"
-                                    onchange="fastLoad('{{route('practice-management.rpm-manager')}}?' + $(this).closest('form').serialize())">
+                                        onchange="fastLoad('{{route('practice-management.rpm-manager')}}?' + $(this).closest('form').serialize())">
                                     <option value="">All</option>
                                     <option value="2020" {{$year && intval($year) === 2020 ? 'selected' : ''}}>2020</option>
                                     <option value="2021" {{$year && intval($year) === 2021 ? 'selected' : ''}}>2021</option>
@@ -162,7 +187,7 @@
                                 <div class="mr-2 d-inline-flex align-items-center">
                                     <label class="mb-0 mr-1 text-nowrap">View As</label>
                                     <select name="viewingAs" class="form-control form-control-sm min-width-unset pl-0 font-weight-bold"
-                                        onchange="fastLoad('{{route('practice-management.rpm-manager')}}?' + $(this).closest('form').serialize())">
+                                            onchange="fastLoad('{{route('practice-management.rpm-manager')}}?' + $(this).closest('form').serialize())">
                                         @foreach($proRoles as $proRole)
                                             <option value="{{$proRole}}" {{$viewingAs === $proRole ? 'selected' : ''}}>{{$proRole}}</option>
                                         @endforeach
@@ -182,6 +207,7 @@
                                     </div>
                                 </div>
                             @endif
+                            {{--
                             <div class="mr-2 d-inline-flex align-items-center">
                                 <label class="mb-0 mr-1 text-nowrap">Date</label>
                                 <input name="specificDate" class="form-control form-control-sm min-width-unset pl-1 font-weight-bold"
@@ -189,6 +215,7 @@
                                        type="date" min="{{$cmStartDate}}" max="{{$cmEndDate}}"
                                        onchange="fastLoad('{{route('practice-management.rpm-manager')}}?' + $(this).closest('form').serialize())">
                             </div>
+                            --}}
                             <div class="mr-2 d-inline-flex align-items-center">
                                 <label class="mb-0 mr-1 text-nowrap">Mins.</label>
                                 <select name="mins" class="form-control form-control-sm min-width-unset pl-0 font-weight-bold"
@@ -200,20 +227,81 @@
                                 </select>
                             </div>
                             <a href="#" onclick="return fastLoad('{{route('practice-management.rpm-manager')}}')">Clear</a>
-                        </form>
-                    </div>
-                    @if($paginator->total())
-                        <div class="d-inline-flex align-items-baseline ml-auto mb-0-pagination">
-                            <div class="mr-2"><b>{{$paginator->firstItem()}}</b> to <b>{{$paginator->lastItem()}}</b> (page {{$paginator->currentPage()}}) of <b>{{$paginator->total()}}</b></div>
-                            {!! $paginator->onEachSide(1)->withQueryString()->links() !!}
-                            <select class="form-control form-control-sm min-width-unset width-140px px-2 ml-2" onchange="fastLoad('{{ route('practice-management.rpm-manager') }}?{{queryLineExcept(['per_page', 'page'])}}&per_page=' + this.value)">
-                                <option {{$perPage == 25 ? 'selected' : ''}} value="25">25/page</option>
-                                <option {{$perPage == 50 ? 'selected' : ''}} value="50">50/page</option>
-                                <option {{$perPage == 75 ? 'selected' : ''}} value="75">75/page</option>
-                                <option {{$perPage == 100 ? 'selected' : ''}} value="100">100/page</option>
-                            </select>
+                            @if($paginator->total())
+                                <div class="d-inline-flex align-items-baseline ml-auto mb-0-pagination">
+                                    <div class="mr-2"><b>{{$paginator->firstItem()}}</b> to <b>{{$paginator->lastItem()}}</b> (page {{$paginator->currentPage()}}) of <b>{{$paginator->total()}}</b></div>
+                                    {!! $paginator->onEachSide(1)->withQueryString()->links() !!}
+                                    <select class="form-control form-control-sm min-width-unset width-140px px-2 ml-2" onchange="fastLoad('{{ route('practice-management.rpm-manager') }}?{{queryLineExcept(['per_page', 'page'])}}&per_page=' + this.value)">
+                                        <option {{$perPage == 25 ? 'selected' : ''}} value="25">25/page</option>
+                                        <option {{$perPage == 50 ? 'selected' : ''}} value="50">50/page</option>
+                                        <option {{$perPage == 75 ? 'selected' : ''}} value="75">75/page</option>
+                                        <option {{$perPage == 100 ? 'selected' : ''}} value="100">100/page</option>
+                                    </select>
+                                </div>
+                            @endif
                         </div>
-                    @endif
+                        <div id="rpm-admin-stats-graph" class="w-100">
+
+                            <div class="mt-2 pt-2 border-top w-100">
+                                <div class="d-flex align-items-stretch justify-content-center">
+                                    <div class="width-140px mr-3 stat-bg-total-light d-inline-flex flex-column">
+                                        <div class="flex-grow-1 py-1 d-flex align-items-end"><span class="w-100 text-center">Total Patients</span></div>
+                                        <div class="font-size-16 font-weight-bold stat-bg-total-dark w-100 py-1 text-center">
+                                            {{$stats['totalPatients']}}
+                                        </div>
+                                    </div>
+                                    <div class="width-140px mr-3 stat-bg-recd-light d-inline-flex flex-column">
+                                        <div class="flex-grow-1 py-1 d-flex align-items-end">
+                                            <span class="w-100 text-center">With Meas. On:</span>
+                                        </div>
+                                        <div style="padding: 0 1px">
+                                            <input type="date" name="wmo" class="border-0 py-0 px-1 w-100 rounded-0 text-center"
+                                                   onchange="$('[name=nmo]').val(this.value); fastLoad('{{route('practice-management.rpm-manager')}}?' + $(this).closest('form').serialize());"
+                                                   value="{{request()->input('wmo') ?: date('Y-m-d')}}">
+                                        </div>
+                                        <div class="font-size-16 font-weight-bold stat-bg-recd-dark w-100 py-1 text-center">
+                                            {{$stats['withMeasOn']}}
+                                        </div>
+                                    </div>
+                                    <div class="width-140px mr-3 stat-bg-not-recd-light d-inline-flex flex-column">
+                                        <div class="flex-grow-1 py-1 d-flex align-items-end"><span class="w-100 text-center">No Meas. On:</span></div>
+                                        <div style="padding: 0 1px">
+                                            <input type="date" name="nmo" class="border-0 py-0 px-1 w-100 rounded-0 text-center"
+                                                   onchange="$('[name=wmo]').val(this.value); fastLoad('{{route('practice-management.rpm-manager')}}?' + $(this).closest('form').serialize());"
+                                                   value="{{request()->input('wmo') ?: date('Y-m-d')}}">
+                                        </div>
+                                        <div class="font-size-16 font-weight-bold stat-bg-not-recd-dark w-100 py-1 text-center">
+                                            {{$stats['noMeasOn']}}
+                                        </div>
+                                    </div>
+                                    <div class="width-140px mr-3 stat-bg-crit-light d-inline-flex flex-column">
+                                        <div class="flex-grow-1 py-1 d-flex align-items-end"><span class="w-100 text-center">With >= 16 Meas. days</span></div>
+                                        <div class="font-size-16 font-weight-bold stat-bg-crit-dark w-100 py-1 text-center">
+                                            {{$stats['gt16MD']}}
+                                        </div>
+                                    </div>
+                                    <div class="width-140px mr-3 stat-bg-crit-light d-inline-flex flex-column">
+                                        <div class="flex-grow-1 py-1 d-flex align-items-end"><span class="w-100 text-center">With >= 20m Interaction</span></div>
+                                        <div class="font-size-16 font-weight-bold stat-bg-crit-dark w-100 py-1 text-center">
+                                            {{$stats['gt20M']}}
+                                        </div>
+                                    </div>
+                                    <div class="width-140px mr-3 stat-bg-crit-light d-inline-flex flex-column">
+                                        <div class="flex-grow-1 py-1 d-flex align-items-end"><span class="w-100 text-center">With >= 40m Interaction</span></div>
+                                        <div class="font-size-16 font-weight-bold stat-bg-crit-dark w-100 py-1 text-center">
+                                            {{$stats['gt40M']}}
+                                        </div>
+                                    </div>
+                                </div>
+                                @if(date('m') == $month && date('Y') == $year)
+                                    <div class="mt-2 font-size-14 text-center">
+                                        Days left in the month ({{friendly_month(date('Y-m-d'))}}):
+                                        <b class="font-size-14">{{date('t') - date('j')}}</b>
+                                    </div>
+                                @endif
+                            </div>
+                        </div>
+                    </form>
                 </div>
                 <div class="rpm-manager-table-container">
                     <table class="table table-sm table-bordered table-striped table-hover p-0 mb-4 min-width-1100px border-0" id="table-pm-manager-matrix">