Explorar o código

Problems report (wip)

Vijayakrishnan %!s(int64=3) %!d(string=hai) anos
pai
achega
9c23a07ed7

+ 94 - 0
app/Http/Controllers/PracticeManagementController.php

@@ -2260,6 +2260,100 @@ WHERE
         return view('app.practice-management.claims-report', compact('rows', 'paginator', 'perPage'));
     }
 
+    public function problemsReport(Request $request) {
+
+        $performer = $this->performer();
+
+        $conditions = [];
+
+        // default sort
+        if(!$request->input('sort_by')) {
+            $orderBy = "p.created_at DESC NULLS LAST";
+        }
+        else {
+            $sortBy = json_decode($request->input('sort_by'));
+            $orderByClause = [];
+            foreach ($sortBy as $sortCriteria) {
+                $orderByClause[] = "{$sortCriteria->key} {$sortCriteria->order} NULLS LAST";
+            }
+            $orderBy = implode(', ', $orderByClause);
+        }
+
+        // filters from the UI
+        /*if(trim($request->input('f_start'))) {
+            $v = trim($request->input('f_start'));
+            $conditions[] = "(cline.date_of_service >= '{$v}')";
+        }
+        if(trim($request->input('f_end'))) {
+            $v = trim($request->input('f_end'));
+            $conditions[] = "(cline.date_of_service <= '{$v}')";
+        }*/
+
+        $defaultPageSize = 25;
+
+        $page = $request->input('page') ?: 1;
+        $perPage = $request->input('per_page') ?: $defaultPageSize;
+        $offset = ($page - 1) * $perPage;
+
+        $countQuery = "
+SELECT COUNT(*)
+FROM point p
+    join client c on p.client_id = c.id
+    join pro mcp on c.mcp_pro_id = mcp.id
+    left join client_primary_coverage cpc on c.effective_client_primary_coverage_id = cpc.id
+    left join payer on cpc.commercial_payer_id = payer.id
+WHERE p.category = 'PROBLEM'
+    AND p.is_removed_due_to_entry_error IS NOT TRUE " .
+    (count($conditions) ? ' AND ' . implode(' AND ', $conditions) : '');
+
+        $countResult = DB::select($countQuery);
+        $total = $countResult[0]->count;
+
+        $query = "
+SELECT p.uid as point_uid,
+       (c.name_first || ' ' || c.name_last) as client_name,
+       c.uid as client_uid, 
+       c.dob,
+       c.age_in_years,
+       c.is_enrolled_in_rm,
+       c.mailing_address_state,
+       (mcp.name_first || ' ' || mcp.name_last) as mcp_name,
+       (CASE 
+           WHEN cpc.plan_type LIKE 'COMMERCIAL' THEN payer.name
+           ELSE cpc.plan_type
+       END) as payer_name,
+       row_to_json(p.*) as point,
+       ((p.data)::json->>'name')::text as problem,
+       ((p.data)::json->>'icd')::text as icd,
+       p.last_child_review_effective_date as last_review_date,
+       (p.last_child_review_creator_pro_first_name || ' ' || p.last_child_review_creator_pro_last_name) as last_review_by,
+       ((last_review.data)::json->>'value')::text as last_review_content,
+       p.last_child_plan_effective_date as last_plan_date,
+       (p.last_child_plan_creator_pro_first_name || ' ' || p.last_child_plan_creator_pro_last_name) as last_plan_by,
+       ((last_plan.data)::json->>'value')::text as last_plan_content
+FROM point p
+    join client c on p.client_id = c.id
+    join pro mcp on c.mcp_pro_id = mcp.id
+    left join client_primary_coverage cpc on c.effective_client_primary_coverage_id = cpc.id
+    left join payer on cpc.commercial_payer_id = payer.id
+    left join point last_review on p.last_child_review_point_id = last_review.id 
+    left join point last_plan on p.last_child_plan_point_id = last_plan.id
+WHERE p.category = 'PROBLEM'
+    AND p.is_removed_due_to_entry_error IS NOT TRUE " .
+    (count($conditions) ? ' AND ' . implode(' AND ', $conditions) : '') . "
+    ORDER BY {$orderBy} OFFSET {$offset} LIMIT {$perPage}";
+
+        // dd($query);
+
+        $rows = DB::select($query);
+
+        $paginator = new LengthAwarePaginator($rows, $total, $request->input('per_page') ?: $defaultPageSize, $request->input('page') ?: 1);
+        $perPage = $request->input('per_page') ?: $defaultPageSize;
+        $paginator->setPath(route('practice-management.problems-report'));
+
+        return view('app.practice-management.problems-report', compact('rows', 'paginator', 'perPage'));
+    }
+
     public function remoteMonitoringMCP(Request $request) {
         return $this->rpmMatrixByProType($request, 'mcp');
     }

+ 7 - 0
public/css/style.css

@@ -3713,3 +3713,10 @@ table.v-top th {
     background: #ddd;
     height: 20px;
 }
+.mcp-theme-1 .col-divider {
+    max-width: 4px;
+    min-width: 4px;
+    background: #BBB;
+    border-color: #BBB !important;
+    padding: 0 !important;
+}

+ 3 - 0
resources/views/app/patient/note/plan-log.blade.php

@@ -11,6 +11,9 @@
                            href="<?= route('patients.view.notes.view.dashboard', ['patient' => $record->client, 'note' => $record->note]) ?>">
                             <?= friendlier_date_time($record->created_at) ?>
                         </a>
+                        @if($record->creatorPro)
+                            <span class="text-secondary text-sm">by {{$record->creatorPro->displayName()}}</span>
+                        @endif
                     @elseif($record->parentPoint && $record->parentPoint->core_child_plan_point_id === $record->id)
                         <span class="text-sm"><?= friendlier_date_time($record->created_at) ?> as pre-existing plan</span>
                     @else

+ 3 - 0
resources/views/app/patient/note/review-log.blade.php

@@ -11,6 +11,9 @@
                            href="<?= route('patients.view.notes.view.dashboard', ['patient' => $record->client, 'note' => $record->note]) ?>">
                             <?= friendlier_date_time($record->created_at) ?>
                         </a>
+                        @if($record->creatorPro)
+                            <span class="text-secondary text-sm">by {{$record->creatorPro->displayName()}}</span>
+                        @endif
                     @else
                         <span class="text-sm"><?= friendlier_date_time($record->created_at) ?> from the patient's chart</span>
                     @endif

+ 169 - 0
resources/views/app/practice-management/problems-report.blade.php

@@ -0,0 +1,169 @@
+@extends ('layouts/template')
+
+@section('content')
+<style>
+	#rm-action-report-filters label {
+		font-weight: bold;
+	}
+
+	#rm-action-report-filters .mw-100px {
+		min-width: 100px;
+	}
+	.filter-container{
+		display: flex;
+		align-items: flex-start;
+		flex-wrap: wrap;
+	}
+	.filter-container >div {
+		width: 165px;
+	}
+	.filter-container >div:not(:last-child) {
+		margin-right: 15px;
+	}
+	.sm-section {
+		width: 150px !important;
+	}
+    thead.border-bottom-0 tr th {
+        border-bottom: none;
+    }
+</style>
+<div id="rm-action-report" class="p-3 mcp-theme-1">
+    <div class="card">
+
+        <div class="card-header px-2 py-1 d-flex align-items-center">
+            <strong class="mr-4">
+                <i class="fas fa-user"></i>
+                Problems Report
+            </strong>
+        </div>
+        <div class="card-body p-0 border-0 table-responsive">
+            <div class="m-2">
+                <form method="GET" action="{{ route('practice-management.problems-report') }}">
+                    <div class="d-flex align-items-baseline">
+                        <div class="my-0 mr-2">
+                            <!--<label class="font-weight-normal mb-1">DOS From</label>
+                            <input name="f_start" type="date" class="form-control form-control-sm" value="{{request()->input('f_start')}}">
+                        </div>
+                        <div class="form-group my-0 mr-2">
+                            <label class="font-weight-normal mb-1">DOS To</label>
+                            <input name="f_end" type="date" class="form-control form-control-sm" value="{{request()->input('f_end')}}">-->
+                            TODO
+                        </div>
+                        <div class="form-group m-0">
+                            <label class="font-weight-normal mb-1">&nbsp;</label>
+                            <div class=" d-flex">
+                                <button type="button" onclick="return fastLoad('{{  route('practice-management.problems-report') }}?' + $(this).closest('form').serialize())" class="btn btn-primary btn-sm mr-2"><i class="fas fa-filter"></i> Filter</button>
+                                <a href="#" onclick="return fastLoad('{{  route('practice-management.problems-report') }}')" class="btn btn-link btn-sm text-danger">Clear Filters</a>
+                            </div>
+                        </div>
+                    </div>
+                </form>
+            </div> 
+            <table class="table table-sm table-striped table-bordered border-0 p-0 m-0">
+                <thead class="bg-light border-bottom-0">
+                <tr>
+                    <th colspan="5"></th>
+                    <th class="col-divider"></th>
+                    <th class="text-secondary" colspan="3">Last Review</th>
+                    <th class="col-divider"></th>
+                    <th class="text-secondary" colspan="3">Last Plan</th>
+                    <th rowspan="2" class="col-divider"></th>
+                    <th rowspan="2" class="text-secondary">Review<br>Trail</th>
+                    <th rowspan="2" class="text-secondary">Plan<br>Trail</th>
+                </tr>
+                    <tr>
+                        <th>@include('app.practice-management._sort_header_multi', ['route' => route("practice-management.problems-report"), 'label' => 'Patient', 'key' => 'client_name'])</th>
+                        <th>@include('app.practice-management._sort_header_multi', ['route' => route("practice-management.problems-report"), 'label' => 'DOB', 'key' => 'dob'])</th>
+                        <th>@include('app.practice-management._sort_header_multi', ['route' => route("practice-management.problems-report"), 'label' => 'Provider', 'key' => 'mcp_name'])</th>
+                        <th>@include('app.practice-management._sort_header_multi', ['route' => route("practice-management.problems-report"), 'label' => 'Problem', 'key' => 'problem'])</th>
+                        <th class="text-nowrap">@include('app.practice-management._sort_header_multi', ['route' => route("practice-management.problems-report"), 'label' => 'ICD', 'key' => 'icd'])</th>
+                        <th class="col-divider"></th>
+                        <th>@include('app.practice-management._sort_header_multi', ['route' => route("practice-management.problems-report"), 'label' => 'Date', 'key' => 'last_review_date'])</th>
+                        <th>@include('app.practice-management._sort_header_multi', ['route' => route("practice-management.problems-report"), 'label' => 'By', 'key' => 'last_review_by'])</th>
+                        <th>@include('app.practice-management._sort_header_multi', ['route' => route("practice-management.problems-report"), 'label' => 'Content', 'key' => 'last_review_content'])</th>
+                        <th class="col-divider"></th>
+                        <th>@include('app.practice-management._sort_header_multi', ['route' => route("practice-management.problems-report"), 'label' => 'Date', 'key' => 'last_plan_date'])</th>
+                        <th>@include('app.practice-management._sort_header_multi', ['route' => route("practice-management.problems-report"), 'label' => 'By', 'key' => 'last_plan_by'])</th>
+                        <th>@include('app.practice-management._sort_header_multi', ['route' => route("practice-management.problems-report"), 'label' => 'Content', 'key' => 'last_plan_content'])</th>
+                    </tr>
+                </thead>
+                <tbody>
+                    @foreach ($rows as $row)
+                    <tr class="{{false ? 'bg-light' : ''}}">
+                        <td class="">
+                            <a href="/patients/view/{{$row->client_uid}}">
+                                {{$row->client_name}}
+                            </a>
+                        </td>
+                        <td class="text-nowrap">
+                            {{$row->dob}}
+                        </td>
+                        <td>
+                            {{$row->mcp_name}}
+                        </td>
+                        <td>
+                            <div class="max-width-200px">
+                                {{$row->problem}}
+                            </div>
+                        </td>
+                        <td>
+                            {{$row->icd}}
+                        </td>
+                        <td class="col-divider"></td>
+                        <td class="text-nowrap">
+                            {{$row->last_review_date}}
+                        </td>
+                        <td>
+                            {{$row->last_review_by}}
+                        </td>
+                        <td>
+                            <div class="inline-html-container max-width-200px max-height-200px overflow-overlay-on-hover">{!! $row->last_review_content !!}</div>
+                        </td>
+                        <td class="col-divider"></td>
+                        <td class="text-nowrap">
+                            {{$row->last_plan_date}}
+                        </td>
+                        <td>
+                            {{$row->last_plan_by}}
+                        </td>
+                        <td>
+                            <div class="inline-html-container max-width-200px max-height-200px overflow-overlay-on-hover">{!! $row->last_plan_content !!}</div>
+                        </td>
+                        <td class="col-divider"></td>
+                        <td>
+                            <a class="px-1 view-review-log"
+                               native target="_blank"
+                               open-in-stag-popup
+                               popup-style="stag-popup-md"
+                               title="Review log for {{$row->problem}}"
+                               href="/point/review-log/{{$row->point_uid}}">
+                                View
+                            </a>
+                        </td>
+                        <td>
+                            <a class="px-1 view-plan-log"
+                               native target="_blank"
+                               open-in-stag-popup
+                               popup-style="stag-popup-md"
+                               title="Plan log for {{$row->problem}}"
+                               href="/point/plan-log/{{$row->point_uid}}">
+                                View
+                            </a>
+                        </td>
+                    </tr>
+                    @endforeach
+                </tbody>
+            </table>
+
+        </div>
+    </div>
+    <div class="d-flex align-items-baseline mt-3">
+        {!! $paginator->withQueryString()->links() !!}
+        <div class="mb-3">
+            <div class="ml-4 mb-3">Showing <b>{{$paginator->firstItem()}}</b> to <b>{{$paginator->lastItem()}}</b> (page {{$paginator->currentPage()}}) of <b>{{$paginator->total()}}</b> problems</div>
+        </div>
+    </div>
+
+</div>
+
+@endsection

+ 2 - 0
routes/web.php

@@ -384,6 +384,8 @@ Route::middleware('pro.auth')->group(function () {
             Route::get('rpm-admin', 'PracticeManagementController@rpmMatrixForAdmin')->name('rpm-matrix-admin');
 
             Route::get('claims-report', 'PracticeManagementController@claimsReport')->name('claims-report');
+
+            Route::get('problems-report', 'PracticeManagementController@problemsReport')->name('problems-report');
         });
 
         Route::get('supply-orders/cancelled-but-unacknowledged', 'PracticeManagementController@supplyOrdersCancelledButUnacknowledged')->name('supply-orders-cancelled-but-unacknowledged');