Jelajahi Sumber

RPM (admin) stat boxes

Vijayakrishnan 2 tahun lalu
induk
melakukan
86bde6b0f3

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

@@ -2371,7 +2371,61 @@ WHERE
         $perPage = $request->input('per_page') ?: $defaultPageSize;
         $paginator->setPath(route('practice-management.rpm-matrix-admin'));
 
-        return view('app.practice-management.rpm-matrix-for-admin', compact('patients', 'daysRemaining', 'careMonthStart', 'paginator', 'perPage'));
+        // counts
+        $stats = [];
+        $stats['totalPatients'] = $paginator->total();
+        $commonStatSQL = "
+SELECT COUNT(*)
+FROM care_month join client on care_month.client_id = client.id 
+    join note mrnote on client.most_recent_completed_mcp_note_id = mrnote.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 client_primary_coverage cpc on client.effective_client_primary_coverage_id = cpc.id
+    left join payer on cpc.commercial_payer_id = payer.id
+    {$genericBillJoinClause}
+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-matrix-for-admin', compact('patients', 'daysRemaining', 'careMonthStart', 'paginator', 'perPage', 'stats'));
     }
 
     public function claimsReport(Request $request) {

+ 94 - 6
resources/views/app/practice-management/rpm-matrix-for-admin.blade.php

@@ -20,6 +20,31 @@
         #table-rm-matrix_paginate {
             padding: 0.5rem;
         }
+
+        #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-remote-monitoring" v-cloak>
 
@@ -28,13 +53,17 @@
             <div class="card-header px-2 py-2 d-flex align-items-baseline">
                 <form class="d-block w-100" action="" method="GET" id="rpm-matrix-filter">
 
-                    <div class="d-flex align-items-end">
-                        <span class="mr-4">
-                            <span class="font-size-14">RPM (Admin)</span>
-                        </span>
+                    <div class="d-flex align-items-baseline">
+                        <span class="font-size-14">RPM (Admin)</span>
+                        <span class="mx-2 text-secondary text-sm">|</span>
+                        <a href="#" onclick="$('#rpm-admin-filters').toggle(); return false;">Toggle Filters</a>
+                        <span class="mx-2 text-secondary text-sm">|</span>
+                        <a href="#" onclick="$('#rpm-admin-stats-graph').toggle(); return false;">Toggle Stats & Graph</a>
                     </div>
 
-                    <div class="d-flex align-items-start mt-2 pt-1 border-top">
+                    <div id="rpm-admin-filters">
+
+                    <div class="d-flex d-none align-items-start mt-2 pt-1 border-top">
 
                         <div class="max-width-110px mr-2">
                             <label class="mb-0 text-sm {{request()->input('m') && request()->input('m') !== 'ACTIVE' ? 'font-weight-bold text-info' : 'text-secondary'}}">Month</label>
@@ -424,6 +453,65 @@
 
                     <input type="hidden" name="not-enrolled" value="{{request()->input('not-enrolled')}}">
 
+                    </div>
+
+                    <div id="rpm-admin-stats-graph">
+
+                        <div class="mt-3">
+                            <div class="d-inline-flex align-items-stretch">
+                                <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); $('.btn-apply').trigger('click');"
+                                               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); $('.btn-apply').trigger('click');"
+                                               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>
+                        </div>
+
+                    </div>
+
                 </form>
             </div>
 
@@ -443,7 +531,7 @@
                         <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> care months</div>
                             {!! $paginator->onEachSide(2)->withQueryString()->links() !!}
-                            <select class="form-control form-control-sm min-width-unset width-100px px-2 ml-2" onchange="fastLoad('{{ route('practice-management.rpm-matrix-admin') }}?{{queryLineExcept(['per_page', 'page'])}}&per_page=' + this.value)">
+                            <select class="form-control form-control-sm min-width-unset width-140px px-2 ml-2" onchange="fastLoad('{{ route('practice-management.rpm-matrix-admin') }}?{{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>