Просмотр исходного кода

Merge branch 'master' of rav.triplestart.com:jmudaka/stagfe2 into dev

= 3 лет назад
Родитель
Сommit
6f67866a70

BIN
app/Http/Controllers/.PracticeManagementController.php.swp


+ 192 - 5
app/Http/Controllers/PracticeManagementController.php

@@ -3656,8 +3656,12 @@ ORDER BY c.name_last, c.name_first
 	    JOIN bill AS b ON (b.note_id = n.id AND b.is_cancelled IS NOT TRUE AND b.code ILIKE '%treatment%')
             ";
         $where = "WHERE
-            n.is_signed_by_hcp IS TRUE AND
-            -- n.is_claim_closed IS NOT TRUE AND
+            
+		-- n.visit_number = 2 AND
+		n.is_signed_by_hcp IS TRUE AND
+            -- n.effective_dateest < '2022-03-01' AND
+	    -- n.id IN (SELECT note_id FROM segment WHERE summary_html ILIKE '%n95%') AND
+	    n.is_claim_closed IS NOT TRUE AND
             n.is_cancelled IS NOT TRUE AND 
             n.created_at::DATE >= '2022-01-01'::DATE AND
             c.client_engagement_status_category <> 'DUMMY' AND
@@ -3667,8 +3671,8 @@ ORDER BY c.name_last, c.name_first
             -- n.id NOT IN (SELECT note_id FROM claim WHERE note_id IS NOT NULL) AND
             c.is_part_b_primary = 'YES' AND
             c.latest_eligible_refresh_at::DATE >= '2022-01-01' AND
-            c.mpb_remaining = 0 AND
-            c.created_at::DATE >= '2022-01-01'::DATE
+            c.mpb_remaining = 0 -- AND
+            -- c.created_at::DATE >= '2022-01-01'::DATE
             ";
         $filters = [];
         if($request->input('f')) {
@@ -3684,7 +3688,9 @@ ORDER BY c.name_last, c.name_first
             $filters = '';
         }
         // $filters = '';
-        $orderBy = "ORDER BY c.id ASC, n.effective_dateest ASC";
+        $orderBy = "ORDER BY 
+		c.id ASC, 
+		n.id ASC, n.effective_dateest ASC";
 
         $countQuery = "SELECT count(*) {$from} {$where} {$filters}";
         // dd($countQuery);
@@ -3706,5 +3712,186 @@ ORDER BY c.name_last, c.name_first
         return view('app.practice-management.notes-resolution-center-v2', compact('rows', 'paginator'));
     }
 
+    public function coverages(Request $request) {
+
+        $columns = "(c.name_first || ' ' || c.name_last) as client_name,
+            c.id,
+            c.uid,
+            c.created_at,
+            c.sex,
+            c.dob,
+            c.age_in_years,
+            row_to_json(lcpc.*)::json as latest_client_primary_coverage,
+            row_to_json(lacpc.*) as latest_auto_client_primary_coverage,
+            row_to_json(lmcpc.*) as latest_manual_client_primary_coverage,
+            row_to_json(lmcpc_payer) as latest_manual_client_primary_coverage_payer
+            ";
+        $from = "FROM client AS c
+            LEFT JOIN client_primary_coverage lcpc on c.latest_client_primary_coverage_id = lcpc.id
+            LEFT JOIN client_primary_coverage lacpc on c.latest_auto_refresh_client_primary_coverage_id = lacpc.id
+            LEFT JOIN client_primary_coverage lmcpc on c.latest_manual_client_primary_coverage_id = lmcpc.id
+            LEFT JOIN payer lmcpc_payer on lmcpc.commercial_payer_id = lmcpc_payer.id
+            ";
+        $where = "WHERE
+            c.client_engagement_status_category <> 'DUMMY' AND
+            c.name_first NOT ILIKE '%test%' AND 
+            c.name_last NOT ILIKE '%test%' AND
+            c.created_at::DATE >= '2022-01-01'::DATE
+             -- lmcpc.id IS NOT NULL ANd lmcpc.plan_type != 'MEDICARE'
+            ";
+        $filters = [];
+
+        if(trim($request->input('f_name'))) {
+            $v = trim($request->input('f_name'));
+            $filters[] = "(c.name_first ILIKE '%{$v}%' OR c.name_last ILIKE '%{$v}%')";
+        }
+        if(trim($request->input('f_covered'))) {
+            $v = trim($request->input('f_covered'));
+            if($v !== 'any') {
+                switch($v) {
+                    case 'covered':
+                        $filters[] = "(
+                        (lmcpc.id IS NOT NULL AND lmcpc.is_cancelled IS NOT TRUE AND lmcpc.manual_determination_category = 'COVERED') OR
+                        ((lmcpc.id IS NULL OR lmcpc.is_cancelled IS TRUE) AND lacpc.id IS NOT NULL AND lacpc.is_cancelled IS NOT TRUE AND lacpc.auto_medicare_is_partbprimary = 'YES')
+                        )";
+                        break;
+                    case 'not-covered':
+                        $filters[] = "(
+                        (lmcpc.id IS NULL OR (lmcpc.is_cancelled IS TRUE OR lmcpc.manual_determination_category = 'NOT_COVERED')) AND
+                        (lacpc.id IS NULL OR (lacpc.is_cancelled IS TRUE OR lacpc.auto_medicare_is_partbprimary = 'NO')) AND
+                        (lmcpc.id IS NOT NULL OR lacpc.id IS NOT NULL)
+                        )";
+                        break;
+                    case 'unknown':
+                        $filters[] = "(
+                        (lmcpc.id IS NOT NULL AND lmcpc.is_cancelled IS NOT TRUE AND lmcpc.manual_determination_category = 'UNKNOWN') OR
+                        ((lmcpc.id IS NULL OR lmcpc.is_cancelled IS TRUE) AND lacpc.id IS NOT NULL AND lacpc.is_cancelled IS NOT TRUE AND lacpc.auto_medicare_is_partbprimary = 'UNKNOWN')
+                        )";
+                        break;
+                }
+            }
+        }
+        if(trim($request->input('f_covered'))) {
+            $v = trim($request->input('f_covered'));
+            if($v !== 'any') {
+                switch($v) {
+                    case 'covered':
+                        $filters[] = "(
+                (lmcpc.id IS NOT NULL AND lmcpc.is_cancelled IS NOT TRUE AND lmcpc.manual_determination_category = 'COVERED') OR
+                ((lmcpc.id IS NULL OR lmcpc.is_cancelled IS TRUE) AND lacpc.id IS NOT NULL AND lacpc.is_cancelled IS NOT TRUE AND lacpc.auto_medicare_is_partbprimary = 'YES')
+                )";
+                        break;
+                    case 'not-covered':
+                        $filters[] = "(
+                (lmcpc.id IS NULL OR (lmcpc.is_cancelled IS TRUE OR lmcpc.manual_determination_category = 'NOT_COVERED')) AND
+                (lacpc.id IS NULL OR (lacpc.is_cancelled IS TRUE OR lacpc.auto_medicare_is_partbprimary = 'NO')) AND
+                (lmcpc.id IS NOT NULL OR lacpc.id IS NOT NULL)
+                )";
+                        break;
+                    case 'unknown':
+                        $filters[] = "(
+                (lmcpc.id IS NOT NULL AND lmcpc.is_cancelled IS NOT TRUE AND lmcpc.manual_determination_category = 'UNKNOWN') OR
+                ((lmcpc.id IS NULL OR lmcpc.is_cancelled IS TRUE) AND lacpc.id IS NOT NULL AND lacpc.is_cancelled IS NOT TRUE AND lacpc.auto_medicare_is_partbprimary = 'UNKNOWN')
+                )";
+                        break;
+                }
+            }
+        }
+        if(trim($request->input('f_plan_type'))) {
+            $v = strtoupper(trim($request->input('f_plan_type')));
+            if($v !== 'ANY') {
+                $filters[] = "(
+                (lmcpc.id IS NOT NULL AND lmcpc.is_cancelled IS NOT TRUE AND lmcpc.plan_type = '{$v}') OR
+                ((lmcpc.id IS NULL OR lmcpc.is_cancelled IS TRUE) AND lacpc.id IS NOT NULL AND lacpc.is_cancelled IS NOT TRUE AND lacpc.plan_type = '{$v}')
+                )";
+            }
+        }
+        if(trim($request->input('f_pb_primary'))) {
+            $v = trim($request->input('f_pb_primary'));
+            if($v !== 'any') {
+                switch($v) {
+                    case 'primary':
+                        $filters[] = "(
+                (lmcpc.id IS NOT NULL AND lmcpc.is_cancelled IS NOT TRUE AND lmcpc.is_partbprimary = 'YES') OR
+                ((lmcpc.id IS NULL OR lmcpc.is_cancelled IS TRUE) AND lacpc.id IS NOT NULL AND lacpc.is_cancelled IS NOT TRUE AND lacpc.auto_medicare_is_partbprimary = 'YES')
+                )";
+                        break;
+                    case 'not-primary':
+                        $filters[] = "(
+                (lmcpc.id IS NOT NULL AND lmcpc.is_cancelled IS NOT TRUE AND lmcpc.is_partbprimary = 'NO') OR
+                ((lmcpc.id IS NULL OR lmcpc.is_cancelled IS TRUE) AND lacpc.id IS NOT NULL AND lacpc.is_cancelled IS NOT TRUE AND lacpc.auto_medicare_is_partbprimary = 'NO')
+                )";
+                        break;
+                    case 'unknown':
+                        $filters[] = "(
+                (lmcpc.id IS NOT NULL AND lmcpc.is_cancelled IS NOT TRUE AND lmcpc.is_partbprimary = 'UNKNOWN') OR
+                ((lmcpc.id IS NULL OR lmcpc.is_cancelled IS TRUE) AND lacpc.id IS NOT NULL AND lacpc.is_cancelled IS NOT TRUE AND lacpc.auto_medicare_is_partbprimary = 'UNKNOWN')
+                )";
+                        break;
+                }
+            }
+        }
+        if(trim($request->input('f_pb_active'))) {
+            $v = trim($request->input('f_pb_active'));
+            // TODO
+        }
+        if(trim($request->input('f_pc_active'))) {
+            $v = trim($request->input('f_pc_active'));
+            // TODO
+        }
+        if(trim($request->input('f_comm_payer'))) {
+            $v = trim($request->input('f_comm_payer'));
+            $filters[] = "(lmcpc_payer.name ILIKE '%{$v}%')";
+        }
+        if(trim($request->input('f_comm_member_id'))) {
+            $v = trim($request->input('f_comm_member_id'));
+            if($v !== 'any') {
+                $filters[] = "(
+                (lmcpc.id IS NOT NULL AND lmcpc.is_cancelled IS NOT TRUE AND lmcpc.commercial_member_identifier ILIKE '%{$v}%') OR
+                ((lmcpc.id IS NULL OR lmcpc.is_cancelled IS TRUE) AND lacpc.id IS NOT NULL AND lacpc.is_cancelled IS NOT TRUE AND lacpc.commercial_member_identifier ILIKE '%{$v}%')
+                )";
+            }
+        }
+        if(trim($request->input('f_comm_group_num'))) {
+            $v = trim($request->input('f_comm_group_num'));
+            if($v !== 'any') {
+                $filters[] = "(
+                (lmcpc.id IS NOT NULL AND lmcpc.is_cancelled IS NOT TRUE AND lmcpc.commercial_group_number ILIKE '%{$v}%') OR
+                ((lmcpc.id IS NULL OR lmcpc.is_cancelled IS TRUE) AND lacpc.id IS NOT NULL AND lacpc.is_cancelled IS NOT TRUE AND lacpc.commercial_group_number ILIKE '%{$v}%')
+                )";
+            }
+        }
+
+        if(count($filters)) {
+            $filters = 'AND ' . implode(' AND ',  $filters);
+        }
+        else {
+            $filters = '';
+        }
+        // $filters = '';
+        $orderBy = "ORDER BY client_name ASC";
+
+        $countQuery = "SELECT count(*) {$from} {$where} {$filters}";
+        // dd($countQuery);
+        $countResult = DB::select($countQuery);
+        $total = $countResult[0]->count;
+
+        $defaultPageSize = 10;
+
+        $page = $request->input('page') ?: 1;
+        $perPage = $request->input('per_page') ?: $defaultPageSize;
+        $offset = ($page - 1) * $perPage;
+
+        $dataQuery = "SELECT {$columns} {$from} {$where} {$filters} {$orderBy} OFFSET {$offset} LIMIT {$perPage}";
+        $rows = DB::select($dataQuery);
+
+        $paginator = new LengthAwarePaginator($rows, $total, $request->input('per_page') ?: $defaultPageSize, $request->input('page') ?: 1);
+        $paginator->setPath(route('practice-management.coverages'));
+
+        // dd($rows);
+
+        return view('app.practice-management.coverages', compact('rows', 'paginator'));
+    }
+
    
 }

+ 15 - 0
app/Models/Note.php

@@ -197,4 +197,19 @@ class Note extends Model
             ->orderBy('position_index', 'asc');
     }
 
+    public function hasUnacknowledgedCancelledBillsByPro(Pro $pro) {
+        return Bill::where('note_id', $this->id)
+            ->where('hcp_pro_id', $pro->id)
+            ->where('bill_service_type', '<>', 'GENERIC')
+            ->where('is_cancelled', true)
+            ->where('is_cancelled_by_administrator', true)
+            ->where('is_cancellation_acknowledged', false)
+            ->count();
+    }
+
+    public function hasClaims() {
+        return Claim::where('note_id', $this->id)
+            ->where('status', '!=', 'CANCELLED')
+            ->count();
+    }
 }

+ 1 - 1
config/app.php

@@ -65,7 +65,7 @@ return [
 
     'hrm2_url' => env('HRM2_URL'),
 
-    'asset_version' => 89,
+    'asset_version' => 90,
 
     'temp_dir' => env('TEMP_DIR'),
 

+ 0 - 3
public/css/style.css

@@ -3569,16 +3569,13 @@ table.v-top th {
 .note_template_psych_followup_visit .edit-container [visit-moe]>form>div:last-child>.d-inline-flex {
     display: flex !important;
 }
-<<<<<<< HEAD
 .cpc-cancelled {
     pointer-events: none;
     opacity: 0.4;
     border: 1px dashed #333;
     padding: 5px;
 }
-=======
 .note-container .segments-list p>br:first-child:last-child,
 .note-container .segments-list p:empty {
     display: none;
 }
->>>>>>> c1e0c71f9c582039c8765ac74613532abceffe59

+ 1 - 1
resources/views/app/dashboard-admin.blade.php

@@ -102,7 +102,7 @@
                                     <th class="px-2 text-center">{{$pro->get_open_tickets_count_as_mcp()}}</th>
                                     <th class="pl-2">
                                         <a href="{{ route('practice-management.myTickets') }}">
-                                            Open Tickets
+                                            Open Ticket{{$pro->get_open_tickets_count_as_mcp() !== 1 ? 's' : ''}}
                                         </a>
                                     </th>
                                 </tr>

+ 9 - 1
resources/views/app/patient/note/_create-bill.blade.php

@@ -1,5 +1,11 @@
 <?php $noteRates = $note->hcpPro->noteRates(); ?>
 @if(!$note->is_bill_closed && !$note->is_billing_marked_done)
+    @if($note->hasUnacknowledgedCancelledBillsByPro($pro))
+        <b class="ml-3 text-warning-dark">
+            <i class="fa fa-exclamation-triangle"></i>
+            There are unacknowledged cancelled bills in this note!
+        </b>
+    @else
     <span class="mx-2 text-secondary">|</span>
     <div moe relative wide bottom class="">
         <a class="" href="" show start>Create Bill</a>
@@ -107,6 +113,7 @@
             <input type="hidden" name="numberOfUnits" value="1">
         </div>
     </div>
+    @endif
 @endif
 @if($note->is_bill_closed)
     <b class="ml-2 text-info">[BILLING CLOSED]</b>
@@ -140,6 +147,7 @@
         </span>
     @endif
 @endif
+@if(!$note->hasUnacknowledgedCancelledBillsByPro($pro))
 @if(!$note->is_billing_marked_done)
     <span class="mx-2 text-secondary">|</span>
     <span class="d-block" moe wide relative bottom>
@@ -168,7 +176,7 @@
         </form>
     </span>
 @endif
-
+@endif
 
 <script>
     (function() {

+ 18 - 2
resources/views/app/patient/note/_create-claim.blade.php

@@ -151,7 +151,8 @@
                         numberOfUnits: 1
                     }
                 ]
-            }
+            },
+            saving: false,
         },
         methods: {
             addLine: function () {
@@ -210,9 +211,13 @@
                 });
             },
             saveClaim: function() {
+                let self = this;
+                if(self.saving) return false;
+                self.saving = true;
                 let form = $('form#createClaimApp').first();
                 if(!form[0].checkValidity()) {
                     form[0].reportValidity();
+                    self.saving = false;
                     return false;
                 }
 
@@ -227,13 +232,16 @@
                         else {
                             toastr.error('Unable to save the claim!');
                         }
+                        self.saving = false;
                     }
                     else {
                         toastr.success('Claim saved!');
                         closeStagPopup();
                         fastReload();
                     }
-                }, 'json')
+                }, 'json').then(function() {
+                    self.saving = false;
+                });
             },
             getPrefillValues: function() {
                 @if(@$note && !empty($note->claim_suggestion_json))
@@ -242,6 +250,14 @@
                         this.payload.lines.splice(0, 1);
                         this.payload.lines = csj.lines;
                     }
+                    // clear empty icds
+                    for(let i=0; i<this.payload.lines.length; i++) {
+                        for (let j = this.payload.lines[i].icds.length - 1; j >=0; j--) {
+                            if(!this.payload.lines[i].icds[j].code && !this.payload.lines[i].icds[j].description) {
+                                this.payload.lines[i].icds.splice(j, 1);
+                            }
+                        }
+                    }
                 @endif
             }
         },

+ 2 - 2
resources/views/app/patient/note/dashboard.blade.php

@@ -335,10 +335,10 @@ use App\Models\Handout;
                                     <i class="fa fa-check"></i>
                                     Note Signed
                                 </div>
-                                @if($pro->pro_type === 'ADMIN')
+                                @if($pro->pro_type === 'ADMIN' || ($note->hcpPro && $pro->id === $note->hcpPro->id && !$note->hasClaims()))
                                     <div class="ml-3">
                                         <div moe>
-                                            <a class="" href="" show start>Undo Sign As HCP</a>
+                                            <a class="" href="" show start>Undo Sign{{$pro->pro_type === 'ADMIN' ? ' As HCP' : ''}}</a>
                                             <form url="/api/note/adminUndoSignAsHcp" right>
                                                 <input type="hidden" name="uid" value="{{$note->uid}}">
                                                 <p>Undo HCP signature?</p>

+ 6 - 6
resources/views/app/patient/note/partials/care-plan-details.blade.php

@@ -26,7 +26,7 @@
                             @endif
                         </div>
                         @if($patient->mcp_pro_id === $pro->id || $pro->pro_type === 'ADMIN')
-                            <div moe class="ml-3">
+                            <div moe class="ml-2">
                                 <a href="" show start>Undo</a>
                                 <form url="/api/note/undoMarkCmSetupPerformed" >
                                     <input type="hidden" name="uid" value="{{$note->uid}}">
@@ -44,7 +44,7 @@
                                     <b>Not Created</b>
                                 </span>
                         @if($patient->mcp_pro_id === $pro->id || $pro->pro_type === 'ADMIN')
-                            <div moe class="ml-3">
+                            <div moe class="ml-2">
                                 <a href="#" show start>Mark as created</a>
                                 <form url="/api/note/markCmSetupPerformed" >
                                     <input type="hidden" name="uid" value="{{$note->uid}}">
@@ -60,8 +60,8 @@
                 </div>
                 @if($pro->pro_type === 'ADMIN' && $note->was_cm_setup_performed)
                     <div class="d-flex align-items-baseline">
-                        <div class="d-inline-flex align-items-center flex-grow-1">
-                            <span class="pr-2">Manager Signature:</span>
+                        <div class="d-inline-flex align-items-center flex-grow-1 ml-3">
+                            <span class="pr-1">Manager Signature:</span>
                             @if($note->cm_setup_manager_signature_status !== 'SIGNED')
                                 <div moe class="">
                                     <a start show>Sign</a>
@@ -76,8 +76,8 @@
                                     </form>
                                 </div>
                             @else
-                                <b>SIGNED</b>
-                                <div moe class="ml-3">
+                                <b class="pr-1">SIGNED</b>
+                                <div moe class="">
                                     <a start show>Undo</a>
                                     <form url="/api/note/updateCmSetupManagerSignatureStatus" class="mcp-theme-1">
                                         <input type="hidden" name="uid" value="{{$note->uid}}">

+ 1 - 0
resources/views/app/patient/note/partials/resolve-content.blade.php

@@ -435,6 +435,7 @@
         addMCInitializer('note-resolve-{{$note->uid}}', init, '#note-resolve-{{$note->uid}}');
         addMCHook('onICDUpdate-{{$note->uid}}', function() {
             toastr.success('ICDs updated');
+            fastReload(); // needed to ensure that the note rendered picks the new icds and uses them for create-claim
         });
     }).call(window);
 </script>

+ 5 - 1
resources/views/app/patient/note/segment-print.blade.php

@@ -41,7 +41,11 @@
     <?php if(!$isLSSegment): ?>
 
     <div class="inset-comment summary-container {{$iName === 'medrisk_vigilence' ? 'px-0' : 'p-2 pl-4'}}">
-        {!! $segment->summary_html !!}
+        @if($note->is_signed_by_hcp && $segment->accepted_suggestion_summary_html)
+            {!! $segment->accepted_suggestion_summary_html !!}
+        @else
+            {!! $segment->summary_html !!}
+        @endif
     </div>
 
     <?php endif ?>

+ 1 - 1
resources/views/app/patient/note/segment-resolve.blade.php

@@ -70,7 +70,7 @@
                 }
             }
         ?>
-        @if(!$rhsEdit)
+        @if(!$rhsEdit && !in_array($segment->display_title, ['Subjective', 'Plan']))
             <div class="inset-comment summary-container p-2">
                 {!! $html !!}
             </div>

+ 23 - 11
resources/views/app/patient/tickets.blade.php

@@ -302,6 +302,12 @@
                             if (_item) {
                                 this.currentCategory = _type;
                                 this.currentItemUid = _item.uid;
+
+                                // autogrow textarea
+                                let self = this;
+                                $('[stag-popup-key="other-popup"] textarea').each(function() {
+                                    self.autoGrow(this);
+                                });
                             }
                         },
 
@@ -535,7 +541,7 @@
                             if(this.otherPopupMode === 'add') {
                                 payload.clientUid = '{{ $patient->uid  }}';
                                 payload.category = 'other';
-                                payload.assignedProUid = '{{ $pro->uid  }}';
+                                payload.assignedProUid = this.otherPopupItem.assigned_pro_uid ? this.otherPopupItem.assigned_pro_uid : '{{ $pro->uid  }}';
                                 payload.managerProUid = '{{ $pro->uid  }}';
                                 payload.orderingProUid = '{{ $pro->uid  }}';
                                 payload.initiatingProUid = '{{ $pro->uid  }}';
@@ -903,6 +909,7 @@
                             $(document).on('pro-changed', '#ticketsApp select[provider-search]', function() {
                                 console.log('ALIX pro-changed', $(this).attr('data-field'), $(this).val());
                                 if(!!$(this).val()) {
+                                    if(!self.currentCategory) self.currentCategory = 'other';
                                     self[self.currentCategory + 'PopupItem'][$(this).attr('data-field')] = $(this).val();
 
                                     // save
@@ -915,7 +922,7 @@
                                             proType = 'Ordering';
                                             break;
                                     }
-                                    if (proType) {
+                                    if (proType && self[self.currentCategory + 'PopupMode'] !== 'add') {
                                         $.post('/api/ticket/update' + proType + 'Pro', {
                                             uid: self[self.currentCategory + 'PopupItem'].uid,
                                             newProUid: $(this).val()
@@ -940,8 +947,11 @@
                                     todayHighlight: true,
                                     format: 'yyyy-mm-dd',
                                     onSelect: function(_date) {
+                                        if(!self.currentCategory) self.currentCategory = 'other';
                                         self[self.currentCategory + 'PopupItem'].data.due_date = $(this).val();
-                                        self[self.currentCategory + 'SavePopupItem'].call(self, true);
+                                        if(self[self.currentCategory + 'PopupMode'] !== 'add') {
+                                            self[self.currentCategory + 'SavePopupItem'].call(self, true);
+                                        }
                                     }
                                 });
 
@@ -998,6 +1008,11 @@
                                 window.localStorage.autoOpen = '';
                             }
                         },
+                        autoGrow: function(_ta) {
+                            _ta.style.minHeight = "46px";
+                            _ta.style.height = "46px";
+                            _ta.style.height = (_ta.scrollHeight + 10)+"px";
+                        },
                         @include('app.patient.tickets.pharmacy-suggest', ['category' => 'erx'])
                         @include('app.patient.tickets.pharmacy-suggest', ['category' => 'lab'])
                         @include('app.patient.tickets.pharmacy-suggest', ['category' => 'imaging'])
@@ -1015,7 +1030,9 @@
 
                         @for ($i=0; $i<count($categories); $i++)
                             this.{{ $categories[$i] }}AutoSave = debounce(() => {
-                                this.{{ $categories[$i] }}SavePopupItem(true);
+                                if(this.{{ $categories[$i] }}PopupMode !== 'add') {
+                                    this.{{ $categories[$i] }}SavePopupItem(true);
+                                }
                             }, 1000);
                         @endfor
 
@@ -1033,20 +1050,15 @@
                             @endif
                         @endif
 
-                        function autoGrow(_ta) {
-                            _ta.style.minHeight = "46px";
-                            _ta.style.height = "46px";
-                            _ta.style.height = (_ta.scrollHeight + 10)+"px";
-                        }
                         $(document)
                             .off('input.auto-grow', '#ticketsApp textarea.auto-grow')
                             .on('input.auto-grow', '#ticketsApp textarea.auto-grow', function() {
-                                autoGrow(this);
+                                this.autoGrow(this);
                             });
                         $(document)
                             .off('focus.auto-grow', '#ticketsApp textarea.auto-grow')
                             .on('focus.auto-grow', '#ticketsApp textarea.auto-grow', function() {
-                                autoGrow(this);
+                                this.autoGrow(this);
                             });
                     }
                 })

+ 23 - 21
resources/views/app/patient/tickets/common-fields.blade.php

@@ -1,29 +1,31 @@
 <div class="p-3 border-bottom">
 
-    <div v-if="<?=$category?>PopupMode === 'edit'">
-        <div class="row mb-2">
-            <div class="col-3 d-inline-flex align-items-center">
-                <label class="text-secondary m-0">Assigned Pro</label>
-            </div>
-            <div class="col-9">
-                <div class="d-flex align-items-center">
-                    <div class="pro-initials text-uppercase"
-                         :title="allProsFlat['pro_' + <?=$category?>PopupItem.assigned_pro_id].displayedName"
-                         :style="'background-color: ' + allProsFlat['pro_' + <?=$category?>PopupItem.assigned_pro_id].colors.bc + '; color: ' + allProsFlat['pro_' + <?=$category?>PopupItem.assigned_pro_id].colors.fc + ';'"
-                         v-html="allProsFlat['pro_' + <?=$category?>PopupItem.assigned_pro_id].displayedInitials">
-                    </div>
-                    <div class="flex-grow-1 ml-2">
-                        <select provider-search
-                                data-field="assigned_pro_uid"
-                                v-model="<?=$category?>PopupItem.assigned_pro_uid"
-                                :data-pro-name="[<?=$category?>PopupItem.assigned_pro.name_last, <?=$category?>PopupItem.assigned_pro.name_first].filter(Boolean).join(', ')"
-                                class="form-control form-control-sm">
-                            <option value=""> --select--</option>
-                        </select>
-                    </div>
+    <div class="row mb-2">
+        <div class="col-3 d-inline-flex align-items-center">
+            <label class="text-secondary m-0">Assigned Pro</label>
+        </div>
+        <div class="col-9">
+            <div class="d-flex align-items-center">
+                <div class="pro-initials text-uppercase"
+                     v-if="<?=$category?>PopupItem.assigned_pro_id"
+                     :title="allProsFlat['pro_' + <?=$category?>PopupItem.assigned_pro_id].displayedName"
+                     :style="'background-color: ' + allProsFlat['pro_' + <?=$category?>PopupItem.assigned_pro_id].colors.bc + '; color: ' + allProsFlat['pro_' + <?=$category?>PopupItem.assigned_pro_id].colors.fc + ';'"
+                     v-html="allProsFlat['pro_' + <?=$category?>PopupItem.assigned_pro_id].displayedInitials">
+                </div>
+                <div class="flex-grow-1 ml-2">
+                    <select provider-search
+                            data-field="assigned_pro_uid"
+                            v-model="<?=$category?>PopupItem.assigned_pro_uid"
+                            :data-pro-name="<?=$category?>PopupItem.assigned_pro_id ? [<?=$category?>PopupItem.assigned_pro.name_last, <?=$category?>PopupItem.assigned_pro.name_first].filter(Boolean).join(', ') : ''"
+                            class="form-control form-control-sm">
+                        <option value=""> --select--</option>
+                    </select>
                 </div>
             </div>
         </div>
+    </div>
+
+    <div v-if="<?=$category?>PopupMode === 'edit'">
         <div class="row mb-2">
             <div class="col-3 d-inline-flex align-items-center">
                 <label class="text-secondary m-0">Ordering Pro</label>

+ 10 - 2
resources/views/app/patient/tickets/other.blade.php

@@ -6,7 +6,7 @@
                 v-if="(statusFilter === 'all' || (statusFilter === 'open' && item.is_open) || (statusFilter === 'closed' && !item.is_open))"
                 :class="(item.is_open ? ' ' : 'opacity-60 bg-light ') + (currentItemUid === item.uid ? 'current' : '')">
                 <td class="px-2 py-2 c-pointer" v-on:click.prevent="otherShowPopup(item)">
-                    <div class="d-flex align-items-center">
+                    <div class="d-flex align-items-baseline">
                         <div class="pro-initials text-uppercase"
                              :title="allProsFlat['pro_' + item.assigned_pro_id].displayedName"
                              :style="'background-color: ' + allProsFlat['pro_' + item.assigned_pro_id].colors.bc + '; color: ' + allProsFlat['pro_' + item.assigned_pro_id].colors.fc + ';'">
@@ -15,7 +15,15 @@
                         <div class="flex-grow-1 d-inline-flex ml-2 flex-wrap align-items-center">
                             <span class="font-weight-bold text-dark font-size-13"
                                   v-html="item.data.title"></span>
-                            <span class="ml-3 font-weight-bold" v-if="item.data.attachments && item.data.attachments.length">
+                            <span class="ml-2">
+                                <span class="text-secondary">Assigned to:</span>
+                                <span>@{{allProsFlat['pro_' + item.assigned_pro_id].displayedName}}</span>
+                            </span>
+                            <span class="ml-2">
+                                <span class="text-secondary">Ordered by:</span>
+                                <span>@{{allProsFlat['pro_' + item.ordering_pro_id].displayedName}}</span>
+                            </span>
+                            <span class="ml-2 font-weight-bold" v-if="item.data.attachments && item.data.attachments.length">
                                 <i class="fa fa-paperclip"></i>
                             </span>
                             <span class="text-nowrap ml-auto text-sm" v-if="item.data.due_date">

+ 30 - 0
resources/views/app/practice-management/_cpc.blade.php

@@ -0,0 +1,30 @@
+<table class="table table-sm m-0 text-sm">
+    <tr>
+        <td class="width-70px">{{friendly_date($cpc->created_at)}}</td>
+        <td class="width-70px">{{$cpc->plan_type}}</td>
+        <td>
+            <!--NEW
+AUTO_REFRESH
+MANUAL_DETERMINATION-->
+            @if($cpc->plan_type === 'MEDICARE')
+                @if($cpc->creation_strategy === 'AUTO_REFRESH')
+                    <span class="text-secondary">Part B Primary:</span> {{@$cpc->auto_medicare_is_partbprimary ?: '-'}}<br>
+                    <span class="text-secondary">Part B Active:</span> {{@$cpc->auto_medicare_is_partbactive ?: '-'}}<br>
+                    <span class="text-secondary">Part C Active:</span> {{@$cpc->auto_medicare_is_partcactive ?: '-'}}
+                @elseif($cpc->creation_strategy === 'MANUAL_DETERMINATION')
+                    <span class="text-secondary">Manual Determination:</span> {{$cpc->manual_determination_category}}<br>
+                    <span class="text-secondary">Part B Primary:</span> {{@$cpc->is_partbprimary ?: '-'}}
+                @elseif($cpc->creation_strategy === 'NEW')
+                @endif
+            @elseif($cpc->plan_type === 'MEDICAID')
+            @elseif($cpc->plan_type === 'COMMERCIAL')
+                <span class="text-secondary">Manual Determination:</span> {{$cpc->manual_determination_category}}<br>
+                @if(@$cpc->lmcpc_payer && @$cpc->lmcpc_payer->name)
+                    <span class="text-secondary">Payer:</span> {{@$cpc->lmcpc_payer->name}}<br>
+                @endif
+                <span class="text-secondary">Member ID:</span> {{@$cpc->commercial_member_identifier ?: '-'}}<br>
+                <span class="text-secondary">Group #:</span> {{@$cpc->commercial_group_number ?: '-'}}
+            @endif
+        </td>
+    </tr>
+</table>

+ 234 - 0
resources/views/app/practice-management/coverages.blade.php

@@ -0,0 +1,234 @@
+@extends ('layouts/template')
+
+@section('content')
+    <div 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>
+                    Coverage Center
+                </strong>
+            </div>
+            <div class="card-header p-2">
+                <form class="d-flex align-items-start" onsubmit="return fastLoad('{{route('practice-management.coverages')}}?' + $(this).serialize());">
+
+                    <div>
+                        <label class="mb-0 text-sm text-secondary">Patient</label>
+                        <input type="text" class="mr-2 form-control form-control-sm min-width-unset max-width-110px" name="f_name" value="{{request()->input('f_name')}}">
+                    </div>
+
+                    <div>
+                        <label class="mb-0 text-sm text-secondary">Covered</label>
+                        <div class="d-flex align-items-start">
+                            <select name="f_covered" class="mr-2 form-control form-control-sm min-width-unset max-width-110px pl-0">
+                                <option {{!request()->input('f_covered') || request()->input('f_covered') === 'any' ? 'selected' : ''}} value="any">Any</option>
+                                <option {{request()->input('f_covered') === 'covered' ? 'selected' : ''}} value="covered">Covered</option>
+                                <option {{request()->input('f_covered') === 'not-covered' ? 'selected' : ''}} value="not-covered">Not Covered</option>
+                                <option {{request()->input('f_covered') === 'unknown' ? 'selected' : ''}} value="unknown">Unknown</option>
+                            </select>
+                        </div>
+                    </div>
+
+                    <div>
+                        <label class="mb-0 text-sm text-secondary">Type</label>
+                        <div class="d-flex align-items-start">
+                            <select name="f_plan_type" class="mr-2 form-control form-control-sm min-width-unset max-width-110px pl-0">
+                                <option {{!request()->input('f_plan_type') || request()->input('f_plan_type') === 'any' ? 'selected' : ''}} value="any">Any</option>
+                                <option {{request()->input('f_plan_type') === 'medicare' ? 'selected' : ''}} value="medicare">Medicare</option>
+                                <option {{request()->input('f_plan_type') === 'medicaid' ? 'selected' : ''}} value="medicaid">Medicaid</option>
+                                <option {{request()->input('f_plan_type') === 'commercial' ? 'selected' : ''}} value="commercial">Commercial</option>
+                            </select>
+                        </div>
+                    </div>
+
+                    <div>
+                        <label class="mb-0 text-sm text-secondary">PB Primary:</label>
+                        <div class="d-flex align-items-start">
+                            <select name="f_pb_primary" class="mr-2 form-control form-control-sm min-width-unset max-width-110px pl-0">
+                                <option {{!request()->input('f_pb_primary') || request()->input('f_pb_primary') === 'any' ? 'selected' : ''}} value="any">Any</option>
+                                <option {{request()->input('f_pb_primary') === 'primary' ? 'selected' : ''}} value="primary">Primary</option>
+                                <option {{request()->input('f_pb_primary') === 'not-primary' ? 'selected' : ''}} value="not-primary">Not Primary</option>
+                                <option {{request()->input('f_pb_primary') === 'unknown' ? 'selected' : ''}} value="unknown">Unknown</option>
+                            </select>
+                        </div>
+                    </div>
+
+                    <div>
+                        <label class="mb-0 text-sm text-secondary">PB Active:</label>
+                        <div class="d-flex align-items-start">
+                            <select name="f_pb_active" class="mr-2 form-control form-control-sm min-width-unset max-width-110px pl-0">
+                                <option {{!request()->input('f_pb_active') || request()->input('f_pb_active') === 'any' ? 'selected' : ''}} value="any">Any</option>
+                                <option {{request()->input('f_pb_active') === 'active' ? 'selected' : ''}} value="active">Active</option>
+                                <option {{request()->input('f_pb_active') === 'not-active' ? 'selected' : ''}} value="not-active">Not Active</option>
+                                <option {{request()->input('f_pb_active') === 'unknown' ? 'selected' : ''}} value="unknown">Unknown</option>
+                            </select>
+                        </div>
+                    </div>
+
+                    <div>
+                        <label class="mb-0 text-sm text-secondary">PC Active:</label>
+                        <div class="d-flex align-items-start">
+                            <select name="f_pc_active" class="mr-2 form-control form-control-sm min-width-unset max-width-110px pl-0">
+                                <option {{!request()->input('f_pc_active') || request()->input('f_pc_active') === 'any' ? 'selected' : ''}} value="any">Any</option>
+                                <option {{request()->input('f_pc_active') === 'active' ? 'selected' : ''}} value="active">Active</option>
+                                <option {{request()->input('f_pc_active') === 'not-active' ? 'selected' : ''}} value="not-active">Not Active</option>
+                                <option {{request()->input('f_pc_active') === 'unknown' ? 'selected' : ''}} value="unknown">Unknown</option>
+                            </select>
+                        </div>
+                    </div>
+
+                    <div>
+                        <label class="mb-0 text-sm text-secondary">Comm. Payer</label>
+                        <input type="text" class="mr-2 form-control form-control-sm min-width-unset max-width-110px" name="f_comm_payer" value="{{request()->input('f_comm_payer')}}">
+                    </div>
+
+                    <div>
+                        <label class="mb-0 text-sm text-secondary">Comm. Member ID:</label>
+                        <input type="text" class="mr-2 form-control form-control-sm min-width-unset max-width-110px" name="f_comm_member_id" value="{{request()->input('f_comm_member_id')}}">
+                    </div>
+
+                    <div>
+                        <label class="mb-0 text-sm text-secondary">Comm. Group #:</label>
+                        <input type="text" class="mr-2 form-control form-control-sm min-width-unset max-width-110px" name="f_comm_group_num" value="{{request()->input('f_comm_group_num')}}">
+                    </div>
+
+                    <div>
+                        <label class="mb-0 text-sm text-secondary">&nbsp;</label>
+                        <div class="d-flex align-items-start">
+                            <button type="button" class="btn-apply btn btn-sm btn-primary mr-2"
+                                    onclick="return fastLoad('{{route('practice-management.coverages')}}?' + $(this).closest('form').serialize());">
+                                <i class="fa fa-check"></i>
+                            </button>
+                            <button type="button" class="btn-reset btn btn-sm btn-default bg-white text-secondary border"
+                                    onclick="return fastLoad('{{route('practice-management.coverages')}}');">
+                                <i class="fa fa-times"></i>
+                            </button>
+                        </div>
+                    </div>
+                </form>
+            </div>
+            <div class="card-body p-0">
+                <table class="table table-sm table-striped p-0 m-0">
+                    <thead class="bg-light">
+                        <tr>
+                            <th class="border-0">Patient</th>
+                            <th class="border-0">DOB</th>
+                            <th class="border-0">Covered?</th>
+                            <th class="border-0">Effective Coverage</th>
+                            <th class="border-0 width-500px">Latest Auto Refresh</th>
+                            <th class="border-0 width-500px">Latest Manual Verif.</th>
+                        </tr>
+                    </thead>
+                    <tbody>
+                        @foreach($rows as $row)
+                            <?php
+                            $lcpc = null;
+                            $lacpc = null;
+                            $lmcpc = null;
+                            $lmcpc_payer = null;
+                            if($row->latest_client_primary_coverage) {
+                                $lcpc = json_decode($row->latest_client_primary_coverage);
+                            }
+                            if($row->latest_auto_client_primary_coverage) {
+                                $lacpc = json_decode($row->latest_auto_client_primary_coverage);
+                            }
+                            if($row->latest_manual_client_primary_coverage) {
+                                $lmcpc = json_decode($row->latest_manual_client_primary_coverage);
+                            }
+
+                            $coveredState = -1;
+                            $effective = '-';
+                            if($lmcpc && !$lmcpc->is_cancelled) {
+
+                                if($lmcpc->manual_determination_category == 'COVERED') {
+                                    $coveredState = 1;
+                                }
+                                else if($lmcpc->manual_determination_category == 'NOT_COVERED') {
+                                    $coveredState = 2;
+                                }
+                                else {
+                                    $coveredState = 3; // unknown
+                                }
+
+                                $effective = 'Latest Manual';
+                                if($row->latest_manual_client_primary_coverage_payer) {
+                                    $lmcpc_payer = json_decode($row->latest_manual_client_primary_coverage_payer);
+                                }
+                                $lmcpc->lmcpc_payer = $lmcpc_payer;
+                            }
+                            else if($lacpc && !$lacpc->is_cancelled) {
+
+                                if($lacpc->auto_medicare_is_partbprimary == 'YES') {
+                                    $coveredState = 1;
+                                }
+                                else if($lacpc->auto_medicare_is_partbprimary == 'NO') {
+                                    $coveredState = 2;
+                                }
+                                else {
+                                    $coveredState = 3; // unknown
+                                }
+
+                                $effective = 'Latest Auto';
+                            }
+                            ?>
+                            <tr>
+                                <td>
+                                    <div class="d-flex align-items-baseline">
+                                        <a href="/mc/patients/view/primary-coverage/{{$row->uid}}"
+                                           native
+                                           target="_blank">{{$row->client_name}}</a>
+                                        <span class="ml-1 text-nowrap">({{$row->sex}})</span>
+                                    </div>
+                                </td>
+                                <td>
+                                    {{$row->dob}} ({{$row->age_in_years}} y)
+                                </td>
+                                <td>
+                                    @if($coveredState === 1)
+                                        <div class="text-success">
+                                            <i class="fa fa-check"></i>
+                                            Covered
+                                        </div>
+                                    @elseif($coveredState === 2)
+                                        <div class="text-secondary">
+                                            <i class="fa fa-times"></i>
+                                            Not Covered
+                                        </div>
+                                    @else
+                                        <div class="text-warning-dark">
+                                            <i class="fa fa-exclamation-triangle"></i>
+                                            Unknown
+                                        </div>
+                                    @endif
+                                </td>
+                                <td>{{$effective}}</td>
+                                <td class="p-0">
+                                    @if($lacpc && !$lacpc->is_cancelled)
+                                        @include('app.practice-management._cpc', ['cpc' => $lacpc])
+                                    @else
+                                        -
+                                    @endif
+                                </td>
+                                <td class="p-0">
+                                    @if($lmcpc && !$lmcpc->is_cancelled)
+                                        @include('app.practice-management._cpc', ['cpc' => $lmcpc])
+                                    @else
+                                        -
+                                    @endif
+                                </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> coverages</div>
+            </div>
+        </div>
+    </div>
+@endsection

+ 8 - 0
resources/views/app/practice-management/notes-resolution-center-v2.blade.php

@@ -67,6 +67,14 @@
                                     <a href="/patients/view/{{$row->client_uid}}" class="text-nowrap d-block pl-2" target="top" native>Chart #: {{$row->chart_number}}</a>
                                     <span class="text-nowrap d-block pl-2">Pro: {{$row->hcp_name}}</span>
                                     <span class="text-nowrap d-block pl-2">Date: {{friendly_date($row->effective_dateest)}}</span>
+                                    <span class="text-nowrap d-block pl-2">Minutes: {{$row->minutes}}</span>
+					@for($i = 1; $i < 5; $i++)
+                                    		<span class="text-nowrap d-block pl-2">
+							@if($row->{"icd".$i}) 
+								{{ $row->{"icd".$i} }} {{$row->{"icd".$i."description"} }}
+							@endif
+						</span>
+					@endfor
                                 </div>
                             </td>
                         </tr>

+ 1 - 0
resources/views/layouts/template.blade.php

@@ -184,6 +184,7 @@
                             <i class="mr-1 fas fa-tasks"></i> Admin
                         </a>
                         <div class="dropdown-menu mcp-theme-1 no-overflow-menu p-0" aria-labelledby="practice-management">
+                            <a class="dropdown-item" href="{{ route('practice-management.coverages') }}">Coverage Center</a>
                             <a class="dropdown-item" href="{{ route('practice-management.notes-resolution-center') }}">Notes Resolution Center</a>
                             <a class="dropdown-item" href="{{ route('practice-management.notes-resolution-center-v2') }}">Notes Resolution Center V2</a>
                             <a class="dropdown-item" href="{{ route('practice-management.remote-monitoring-admin') }}">Remote Monitoring (admin)</a>

+ 2 - 0
routes/web.php

@@ -237,6 +237,8 @@ Route::middleware('pro.auth')->group(function () {
         Route::get('notes-resolution-center', 'PracticeManagementController@notesResolutionCenter')->name('notes-resolution-center');
         Route::get('notes-resolution-center-v2', 'PracticeManagementController@notesResolutionCenterV2')->name('notes-resolution-center-v2');
 
+        Route::get('coverages', 'PracticeManagementController@coverages')->name('coverages');
+
         Route::get('rates/{selectedProUid?}', 'PracticeManagementController@rates')->name('rates');
         Route::get('dashboard', 'PracticeManagementController@dashboard')->name('dashboard');
         Route::get('previous-bills', 'PracticeManagementController@previousBills')->name('previousBills');