Browse Source

merged dev-dashboard

= 3 years ago
parent
commit
6c8952e8fb
90 changed files with 5561 additions and 1125 deletions
  1. 123 0
      app/Http/Controllers/DnaController.php
  2. 45 64
      app/Http/Controllers/HomeController.php
  3. 269 0
      app/Http/Controllers/McpController.php
  4. 35 0
      app/Models/Client.php
  5. 12 0
      app/Models/Note.php
  6. 160 1
      app/Models/Pro.php
  7. 62 0
      config/constants.php
  8. 0 1
      public/css/style.css
  9. 5 0
      resources/views/app/admin/appointments.blade.php
  10. 5 0
      resources/views/app/admin/bills.blade.php
  11. 1 0
      resources/views/app/admin/dashboard/calls_memos.blade.php
  12. 1 0
      resources/views/app/admin/dashboard/erx_orders.blade.php
  13. 1 0
      resources/views/app/admin/dashboard/measurements.blade.php
  14. 1 0
      resources/views/app/admin/dashboard/messages.blade.php
  15. 1 0
      resources/views/app/admin/dashboard/notifications.blade.php
  16. 1 0
      resources/views/app/admin/dashboard/supply_orders.blade.php
  17. 5 0
      resources/views/app/admin/erx_and_orders.blade.php
  18. 5 0
      resources/views/app/admin/notes.blade.php
  19. 6 0
      resources/views/app/admin/patients.blade.php
  20. 5 0
      resources/views/app/admin/reports.blade.php
  21. 5 0
      resources/views/app/admin/supply_orders.blade.php
  22. 977 0
      resources/views/app/dashboard-admin.blade.php
  23. 977 0
      resources/views/app/dashboard-dna.blade.php
  24. 746 0
      resources/views/app/dashboard-mcp.blade.php
  25. 0 988
      resources/views/app/dashboard.blade.php
  26. 5 0
      resources/views/app/dna/appointments.blade.php
  27. 5 0
      resources/views/app/dna/bills.blade.php
  28. 0 0
      resources/views/app/dna/cancelled_appointments_pending_review.blade.php
  29. 0 0
      resources/views/app/dna/cancelled_bills_pending_review.blade.php
  30. 0 0
      resources/views/app/dna/cancelled_supply_orders_pending_review.blade.php
  31. 1 0
      resources/views/app/dna/dashboard/calls_memos.blade.php
  32. 1 0
      resources/views/app/dna/dashboard/erx_orders.blade.php
  33. 1 0
      resources/views/app/dna/dashboard/measurements.blade.php
  34. 1 0
      resources/views/app/dna/dashboard/messages.blade.php
  35. 1 0
      resources/views/app/dna/dashboard/notifications.blade.php
  36. 1 0
      resources/views/app/dna/dashboard/supply_orders.blade.php
  37. 5 0
      resources/views/app/dna/erx_and_orders.blade.php
  38. 0 0
      resources/views/app/dna/erx_and_orders_pending_signature.blade.php
  39. 0 0
      resources/views/app/dna/new_patients_awaiting_visit.blade.php
  40. 5 0
      resources/views/app/dna/notes.blade.php
  41. 0 0
      resources/views/app/dna/notes_pending_billing.blade.php
  42. 0 0
      resources/views/app/dna/notes_pending_signature.blade.php
  43. 6 0
      resources/views/app/dna/patients.blade.php
  44. 0 0
      resources/views/app/dna/patients_overdue.blade.php
  45. 0 0
      resources/views/app/dna/patients_without_appointments.blade.php
  46. 5 0
      resources/views/app/dna/reports.blade.php
  47. 0 0
      resources/views/app/dna/reports_pending_signature.blade.php
  48. 5 0
      resources/views/app/dna/supply_orders.blade.php
  49. 0 0
      resources/views/app/dna/supply_orders_pending_signature.blade.php
  50. 55 0
      resources/views/app/mcp/appointments.blade.php
  51. 100 0
      resources/views/app/mcp/appointments_filters.blade.php
  52. 53 0
      resources/views/app/mcp/bills.blade.php
  53. 87 0
      resources/views/app/mcp/bills_filters.blade.php
  54. 19 0
      resources/views/app/mcp/cancelled_appointments_pending_review.blade.php
  55. 44 0
      resources/views/app/mcp/cancelled_bills_pending_review.blade.php
  56. 45 0
      resources/views/app/mcp/cancelled_supply_orders_pending_review.blade.php
  57. 53 0
      resources/views/app/mcp/client_messages.blade.php
  58. 95 0
      resources/views/app/mcp/client_messages_filters.blade.php
  59. 71 0
      resources/views/app/mcp/dashboard/appointments.blade.php
  60. 1 0
      resources/views/app/mcp/dashboard/calls_memos.blade.php
  61. 1 0
      resources/views/app/mcp/dashboard/erx_orders.blade.php
  62. 1 0
      resources/views/app/mcp/dashboard/measurements.blade.php
  63. 1 0
      resources/views/app/mcp/dashboard/messages.blade.php
  64. 1 0
      resources/views/app/mcp/dashboard/notifications.blade.php
  65. 1 0
      resources/views/app/mcp/dashboard/reports.blade.php
  66. 1 0
      resources/views/app/mcp/dashboard/supply_orders.blade.php
  67. 51 0
      resources/views/app/mcp/erx_and_orders.blade.php
  68. 87 0
      resources/views/app/mcp/erx_and_orders_filters.blade.php
  69. 76 0
      resources/views/app/mcp/erx_and_orders_pending_signature.blade.php
  70. 79 0
      resources/views/app/mcp/new_patients_awaiting_visit.blade.php
  71. 51 0
      resources/views/app/mcp/notes.blade.php
  72. 87 0
      resources/views/app/mcp/notes_filters.blade.php
  73. 48 0
      resources/views/app/mcp/notes_pending_billing.blade.php
  74. 48 0
      resources/views/app/mcp/notes_pending_signature.blade.php
  75. 93 0
      resources/views/app/mcp/patients.blade.php
  76. 261 0
      resources/views/app/mcp/patients_filters.blade.php
  77. 19 0
      resources/views/app/mcp/patients_overdue_for_visit.blade.php
  78. 19 0
      resources/views/app/mcp/patients_without_appointments.blade.php
  79. 5 0
      resources/views/app/mcp/reports.blade.php
  80. 60 0
      resources/views/app/mcp/reports_pending_signature.blade.php
  81. 53 0
      resources/views/app/mcp/supply_orders.blade.php
  82. 87 0
      resources/views/app/mcp/supply_orders_filters.blade.php
  83. 45 0
      resources/views/app/mcp/supply_orders_pending_signature.blade.php
  84. 4 1
      resources/views/app/new-patient.blade.php
  85. 0 12
      resources/views/app/patients.blade.php
  86. 21 19
      resources/views/app/practice-management/financial-transactions.blade.php
  87. 4 2
      resources/views/layouts/patient.blade.php
  88. 79 34
      resources/views/layouts/template.blade.php
  89. 62 3
      routes/web.php
  90. 103 0
      spec/10-03-2021.txt

+ 123 - 0
app/Http/Controllers/DnaController.php

@@ -0,0 +1,123 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Models\Appointment;
+use App\Models\BDTDevice;
+use App\Models\CareMonth;
+use App\Models\Client;
+use App\Models\ClientBDTDevice;
+use App\Models\ClientInfoLine;
+use App\Models\Erx;
+use App\Models\Facility;
+use App\Models\Handout;
+use App\Models\IncomingReport;
+use App\Models\MBClaim;
+use App\Models\MBPayer;
+use App\Models\Note;
+use App\Models\NoteTemplate;
+use App\Models\Pro;
+use App\Models\Product;
+use App\Models\ProProAccess;
+use App\Models\SectionTemplate;
+use App\Models\Shipment;
+use App\Models\SupplyOrder;
+use App\Models\Ticket;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\File;
+
+use Illuminate\Support\Facades\Http;
+use PDF;
+
+class DnaController extends Controller
+{
+
+    public function patients(Request $request)
+    {
+        $data = [];
+        return view('app.dna.patients', $data);
+    }
+
+    public function notes(Request $request)
+    {
+        $data = [];
+        return view('app.dna.notes', $data);
+    }
+
+    public function appointments(Request $request)
+    {
+        $data = [];
+        return view('app.dna.appointments', $data);
+    }
+
+    public function bills(Request $request)
+    {
+        $data = [];
+        return view('app.dna.bills', $data);
+    }
+
+    public function erx_and_orders(Request $request)
+    {
+        $data = [];
+        return view('app.dna.erx_and_orders', $data);
+    }
+
+    public function reports(Request $request)
+    {
+        $data = [];
+        return view('app.dna.reports', $data);
+    }
+
+    public function supply_orders(Request $request)
+    {
+        $data = [];
+        return view('app.dna.supply_orders', $data);
+    }
+
+    public function new_patients_awaiting_visit(Request $request){
+        $data = [];
+        return view('app.dna.new_patients_awaiting_visit', $data);
+    }
+    public function notes_pending_signature(Request $request){
+        $data = [];
+        return view('app.dna.notes_pending_signature', $data);
+    }
+    public function notes_pending_billing(Request $request){
+        $data = [];
+        return view('app.dna.notes_pending_billing', $data);
+    }
+    public function reports_pending_signature(Request $request){
+        $data = [];
+        return view('app.dna.reports_pending_signature', $data);
+    }
+    public function patients_without_appointments(Request $request){
+        $data = [];
+        return view('app.dna.patients_without_appointments', $data);
+    }
+    public function patients_overdue_for_visit(Request $request){
+        $data = [];
+        return view('app.dna.patients_overdue_for_visit', $data);
+    }
+    public function cancelled_appointments_pending_review(Request $request){
+        $data = [];
+        return view('app.dna.cancelled_appointments_pending_review', $data);
+    }
+    public function cancelled_bills_pending_review(Request $request){
+        $data = [];
+        return view('app.dna.cancelled_bills_pending_review', $data);
+    }
+    public function cancelled_supply_orders_pending_review(Request $request){
+        $data = [];
+        return view('app.dna.cancelled_supply_orders_pending_review', $data);
+    }
+    public function erx_and_orders_pending_signature(Request $request){
+        $data = [];
+        return view('app.dna.erx_and_orders_pending_signature', $data);
+    }
+    public function supply_orders_pending_signature(Request $request){
+        $data = [];
+        return view('app.dna.supply_orders_pending_signature', $data);
+    }
+
+}

+ 45 - 64
app/Http/Controllers/HomeController.php

@@ -188,50 +188,32 @@ class HomeController extends Controller
         }
     }
 
-    public function dashboard(Request $request)
-    {
+    private function dashboard_MCP(Request $request){
+
+
+        $keyNumbers = [];
+
+        // Patients // SELECT * FROM client WHERE mcp_pro_id = :me.id;
+        // New Patients Awaiting Visit // SELECT * FROM client WHERE mcp_pro_id = :me.id AND hasMcpDoneOnboardingVisit != 'YES';
+        // Notes Pending Signature // SELECT * FROM note WHERE hcp_pro_id = :me.id AND is_cancelled IS NOT TRUE AND has_hcp_signed IS NOT TRUE;
+        // Notes Pending Billing // SELECT * FROM note WHERE hcp_pro_id = :me.id AND is_cancelled IS NOT TRUE AND has_hcp_signed IS TRUE AND is_billing_marked_done IS FALSE;
+        // Reports Pending Signature // SELECT * FROM incoming_report WHERE hcp_pro_id = :me.id AND isEntryError IS NOT TRUE AND hasHcpProSigned IS NOT TRUE;
+        // Patients w/o Appointments // SELECT * FROM client WHERE mcp_pro_id = :me.id AND client.next_mcp_appointment_date < today();
+        // Patients Overdue for Visit // SELECT * FROM client WHERE mcp_pro_id = :me.id AND client.next_expected_mcp_visit_date < today();
+        // Cancelled Appts. Pending Review // SELECT * FROM appointment WHERE hcp_pro_id = :me.id AND status = 'REJECTED' AND wasAcknowledgedByAppointmentPro IS NOT TRUE;
+        // Cancelled Bills Pending Review // SELECT * FROM bill WHERE bill_service_type = 'NOTE' AND is_cancelled IS TRUE AND isCancellationAcknowledged IS FALSE;
+        // Cancelled Supply Orders Pending Review // SELECT * FROM supply_order WHERE signed_by_pro_id = :me.id AND is_cancelled IS TRUE AND isCancellationAcknowledged IS NOT TRUE;
+        // ERx & Orders Pending Signature // SELECT * FROM erx WHERE hcp_pro_id = :me.id AND pro_declared_status <> 'CANCELLED' AND hasHcpProSigned IS NOT TRUE;
+        // Supply Orders Pending Signature // SELECT supply_order.id FROM supply_order WHERE signed_by_pro_id IS NOT TRUE AND is_cancelled IS NOT TRUE AND created_by_pro_id = :me.id;
 
-        //patients where performer is the mcp
         $performer = $this->performer();
+        $pro = $performer->pro;
         $performerProID = $performer->pro->id;
-        $isAdmin = ($performer->pro->pro_type === 'ADMIN');
 
         $keyNumbers  = [];
 
         $queryClients = $this->performer()->pro->getAccessibleClientsQuery();
 
-        $keyNumbers['totalPatients'] = $queryClients->count();
-
-        // patientNotSeenYet
-        $patientNotSeenYet = $queryClients
-            ->where(function ($query) use ($performer) {     // own patient and primary OB visit pending
-                $query->where('mcp_pro_id', $performer->pro->id)
-                    ->where('has_mcp_done_onboarding_visit', '!=', 'YES');
-            })
-//            ->orWhere(function ($query) {   // mcp of any client program and program OB pending
-//                $query->where(function ($_query) {
-//                    $_query->select(DB::raw('COUNT(id)'))
-//                        ->from('client_program')
-//                        ->whereColumn('client_id', 'client.id')
-//                        ->where('has_mcp_done_onboarding_visit', '!=', 'YES');
-//                }, '>=', 1);
-//            })
-            ->count();
-        $keyNumbers['patientsNotSeenYet'] = $patientNotSeenYet;
-
-        $pendingBillsToSign = Bill::where('bill_service_type', '<>', 'CARE_MONTH')->where(function ($query) use ($performerProID) {
-            $query->where('hcp_pro_id', $performerProID)->where('is_signed_by_hcp', false)->where('is_cancelled', false);
-        })
-            ->orWhere(function ($query) use ($performerProID) {
-                $query->where('cm_pro_id', $performerProID)->where('is_signed_by_cm', false)->where('is_cancelled', false);;
-            })->orWhere(function ($query) use ($performerProID) {
-                $query->where('rme_pro_id', $performerProID)->where('is_signed_by_rme', false)->where('is_cancelled', false);;
-            })->orWhere(function ($query) use ($performerProID) {
-                $query->where('rmm_pro_id', $performerProID)->where('is_signed_by_rmm', false)->where('is_cancelled', false);;
-            })->count();
-
-        $keyNumbers['pendingBillsToSign'] = $pendingBillsToSign;
-
         $pendingNotesToSign = Note
             ::where(function ($query) use ($performerProID) {
                 $query->where('hcp_pro_id', $performerProID)->where('is_signed_by_hcp', false)->where('is_cancelled', false);
@@ -464,32 +446,6 @@ ORDER BY cm.created_at DESC
             ")
         );
 
-        $naBillableSignedNotes = DB::select(DB::raw("
-SELECT count(note.id) as na_billable_notes
-FROM note
-WHERE
-        note.is_signed_by_hcp = TRUE AND
-        note.ally_pro_id = :pro_id AND
-        note.is_cancelled = FALSE AND
-        (
-            SELECT count(bill.id)
-            FROM bill
-            WHERE
-                  bill.is_cancelled = FALSE AND
-                  bill.generic_pro_id = :pro_id AND
-                  bill.note_id = note.id
-        ) = 0
-        "), ["pro_id" => $performerProID]);
-
-        if(!$naBillableSignedNotes || !count($naBillableSignedNotes)) {
-            $naBillableSignedNotes = 0;
-        }
-        else {
-            $naBillableSignedNotes = $naBillableSignedNotes[0]->na_billable_notes;
-        }
-
-        $keyNumbers['naBillableSignedNotes'] = $naBillableSignedNotes;
-
         $keyNumbers['rmBillsToSign'] = Bill
             ::where('is_cancelled', false)
             ->where('cm_or_rm', 'RM')
@@ -583,7 +539,7 @@ WHERE cl.shadow_pro_id IS NULL AND cl.latest_client_primary_coverage_id IS NULL
 SELECT count(DISTINCT (cl.id)) as cnt
 FROM client cl
          LEFT JOIN client_primary_coverage cpc ON cl.latest_client_primary_coverage_id = cpc.id
-WHERE cl.shadow_pro_id IS NULL 
+WHERE cl.shadow_pro_id IS NULL
     AND (cl.latest_client_primary_coverage_id IS NOT NULL -- coverage exists, but status is null or unknown
     AND (
                (cpc.plan_type = 'MEDICARE' AND (cpc.is_partbprimary = 'UNKNOWN' OR cpc.is_partbprimary IS NULL))
@@ -595,7 +551,7 @@ WHERE cl.shadow_pro_id IS NULL
 
         }
 
-        return view('app/dashboard', compact('keyNumbers', 'reimbursement', 'milliseconds',
+        return view('app/dashboard-mcp', compact('keyNumbers', 'reimbursement', 'milliseconds',
             'businessNumbers',
             'incomingReports', 'tickets', 'supplyOrders',
             'numERx', 'numLabs', 'numImaging', 'numSupplyOrders',
@@ -604,6 +560,29 @@ WHERE cl.shadow_pro_id IS NULL
             'proApptUpdates', 'naApptUpdates'));
     }
 
+    private function dashboard_DNA(Request $request){
+        $performer = $this->performer();
+        $pro = $performer->pro;
+    }
+
+    private function dashboard_ADMIN(Request $request){
+        $performer = $this->performer();
+        $pro = $performer->pro;
+    }
+
+    public function dashboard(Request $request)
+    {
+        $performer = $this->performer();
+        $pro = $performer->pro;
+        if($pro->is_enrolled_as_mcp){
+            return $this->dashboard_MCP($request);
+        }elseif($pro->pro_type === 'ADMIN'){
+            return $this->dashboard_ADMIN($request);
+        }else{
+            return $this->dashboard_DNA($request);
+        }
+    }
+
     public function dashboardMeasurementsTab(Request $request, $page = 1) {
 
         $performer = $this->performer();
@@ -755,6 +734,8 @@ WHERE measurement.label NOT IN ('SBP', 'DBP')
                 $appointment->client->age_in_years . ' y.o' .
                 ($appointment->client->sex ? ' ' . $appointment->client->sex : '') .
                 ')';
+            $appointment->clientAge = $appointment->client->age_in_years;
+            $appointment->clientSex = $appointment->client->sex;
 
             $appointment->started = false;
             $appointment->inHowManyHours = date_diff(date_create('now'), date_create($appointment->start_time), false)

+ 269 - 0
app/Http/Controllers/McpController.php

@@ -0,0 +1,269 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Models\Appointment;
+use App\Models\BDTDevice;
+use App\Models\CareMonth;
+use App\Models\Client;
+use App\Models\ClientBDTDevice;
+use App\Models\ClientInfoLine;
+use App\Models\Erx;
+use App\Models\Facility;
+use App\Models\Handout;
+use App\Models\IncomingReport;
+use App\Models\MBClaim;
+use App\Models\MBPayer;
+use App\Models\Note;
+use App\Models\NoteTemplate;
+use App\Models\Pro;
+use App\Models\Product;
+use App\Models\ProProAccess;
+use App\Models\SectionTemplate;
+use App\Models\Shipment;
+use App\Models\SupplyOrder;
+use App\Models\Ticket;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\File;
+use App\Models\Bill;
+use App\Models\ClientSMS;
+
+use Illuminate\Support\Facades\Http;
+use PDF;
+
+class McpController extends Controller
+{
+
+    public function patients(Request $request)
+    {
+        $filters = $request->all();
+        $patients = Client::whereNull('shadow_pro_id')->where('mcp_pro_id', $this->performer->pro->id);
+
+        // filters
+        /*
+        array:18 [▼
+          "age_category" => "LESS_THAN"
+          "age_value_1" => "34"
+          "age_value_2" => null
+          "sex" => "M"
+          "bmi_category" => "BETWEEN"
+          "bmi_value_1" => "20"
+          "bmi_value_2" => "25"
+          "last_visit_category" => "LESS_THAN"
+          "last_visit_value_1" => "2021-10-14"
+          "last_visit_value_2" => null
+          "next_appointment_category" => "LESS_THAN"
+          "next_appointment_value_1" => "2021-10-15"
+          "status" => "ACTIVE"
+          "last_weighed_in_category" => "EXACTLY"
+          "last_weighed_in_value_1" => "2021-10-07"
+          "last_bp_category" => "BETWEEN"
+          "last_bp_value_1" => "2021-10-01"
+          "last_bp_value_2" => "2021-10-31"
+        ]
+        */
+
+        $this->filterMultiQuery($request, $patients, 'age_in_years', 'age_category', 'age_value_1', 'age_value_2');
+        $this->filterSimpleQuery($request, $patients, 'sex', 'sex');
+        $this->filterMultiQuery($request, $patients, 'usual_bmi', 'bmi_category', 'bmi_value_1', 'bmi_value_2');
+        $this->filterMultiQuery($request, $patients, 'most_recent_weight_at', 'last_weighed_in_category', 'last_weighed_in_value_1', 'last_weighed_in_value_2');
+        $this->filterMultiQuery($request, $patients, 'most_recent_bp_at', 'last_bp_category', 'last_bp_value_1', 'last_bp_value_2');
+
+        switch($request->input('status')) {
+            case 'ACTIVE':
+                $patients->where('is_active', true)->where('has_mcp_done_onboarding_visit', true);
+                break;
+            case 'AWAITING_VISIT':
+                $patients->where('is_active', true)->where('has_mcp_done_onboarding_visit', false);
+                break;
+            case 'INACTIVE':
+                $patients->where('is_active', '<>', true);
+                break;
+        }
+
+        $patients = $patients->orderBy('created_at', 'DESC')->get();
+        return view('app.mcp.patients', compact('patients', 'filters'));
+    }
+
+    private function filterSimpleQuery(Request $request, $query, $columnName, $valueName) {
+        if($request->input($valueName)) {
+            $query->where($columnName, $request->input($valueName));
+        }
+    }
+    private function filterMultiQuery(Request $request, $query, $columnName, $keyName, $valueName1, $valueName2) {
+        switch($request->input($keyName)) {
+            case 'EXACTLY':
+                if($request->input($valueName1)) {
+                    $query->where($columnName, $request->input($valueName1));
+                }
+                break;
+            case 'LESS_THAN':
+                if($request->input($valueName1)) {
+                    $query->where($columnName, '<', $request->input($valueName1));
+                }
+                break;
+            case 'GREATER_THAN':
+                if($request->input($valueName1)) {
+                    $query->where($columnName, '>', $request->input($valueName1));
+                }
+                break;
+            case 'BETWEEN':
+                if($request->input($valueName1) && $request->input($valueName2)) {
+                    $query
+                        ->where($columnName, '>=', $request->input($valueName1))
+                        ->where($columnName, '<=', $request->input($valueName2));
+                }
+                break;
+            case 'NOT_BETWEEN':
+                if($request->input($valueName1) && $request->input($valueName2)) {
+                    $query
+                        ->where(function ($q) use ($request, $columnName, $valueName1, $valueName2) {
+                            $q->where($columnName, '<', $request->input($valueName1))
+                                ->orWhere($columnName, '>', $request->input($valueName2));
+                        });
+                }
+                break;
+        }
+    }
+
+    public function notes(Request $request)
+    {
+        $notes = Note::paginate(5);
+
+        // SELECT * FROM note WHERE client_id IN (SELECT id FROM client WHERE mcp_pro_id = :me.id);
+
+        return view('app.mcp.notes', compact('notes'));
+    }
+
+    public function appointments(Request $request)
+    {
+        $appointments = Appointment::paginate(5);
+        return view('app.mcp.appointments', compact('appointments'));
+    }
+
+    public function bills(Request $request)
+    {
+        $bills = Bill::paginate(5);
+        return view('app.mcp.bills', compact('bills'));
+    }
+
+    public function erx_and_orders(Request $request)
+    {
+        $erxAndOrders = Erx::paginate(5);
+        return view('app.mcp.erx_and_orders', compact('erxAndOrders'));
+    }
+
+    public function reports(Request $request)
+    {
+        $data = [];
+        return view('app.mcp.reports', $data);
+    }
+
+    public function supply_orders(Request $request)
+    {
+        $supplyOrders = SupplyOrder::paginate(5);
+        return view('app.mcp.supply_orders', compact('supplyOrders'));
+    }
+
+    public function client_messages(Request $request)
+    {
+        $clientMessages = ClientSMS::paginate(5);
+        return view('app.mcp.client_messages', compact('clientMessages'));
+    }
+
+    public function new_patients_awaiting_visit(Request $request){
+        $data = [
+            'records' => Client::where('mcp_pro_id', $this->performer->pro->id)
+                ->where('has_mcp_done_onboarding_visit', '!=', 'YES')
+                ->orderBy('created_at')
+                ->get()
+        ];
+        return view('app.mcp.new_patients_awaiting_visit', $data);
+    }
+    public function notes_pending_signature(Request $request){
+        $data = [
+            'records' => Note::where('hcp_pro_id', $this->performer->pro->id)
+                ->where('is_cancelled', '<>', true)
+                ->where('is_signed_by_hcp', '<>', true)
+                ->orderBy('created_at')
+                ->get()
+        ];
+        return view('app.mcp.notes_pending_signature', $data);
+    }
+    public function notes_pending_billing(Request $request){
+        $data = [
+            'records' => Note::where('hcp_pro_id', $this->performer->pro->id)
+                ->where('is_cancelled', '<>', true)
+                ->where('is_signed_by_hcp', true)
+                ->where('is_billing_marked_done', '<>', true)
+                ->orderBy('created_at')
+                ->get()
+        ];
+        return view('app.mcp.notes_pending_billing', $data);
+    }
+    public function reports_pending_signature(Request $request){
+        $data = [
+            'records' => IncomingReport::where('hcp_pro_id', $this->performer->pro->id)
+                ->where('has_hcp_pro_signed', '<>', true)
+                ->where('is_entry_error', '<>', true)
+                ->orderBy('created_at')
+                ->get()
+        ];
+        return view('app.mcp.reports_pending_signature', $data);
+    }
+    public function patients_without_appointments(Request $request){
+        $data = [];
+        return view('app.mcp.patients_without_appointments', $data);
+    }
+    public function patients_overdue_for_visit(Request $request){
+        $data = [];
+        return view('app.mcp.patients_overdue_for_visit', $data);
+    }
+    public function cancelled_appointments_pending_review(Request $request){
+        $data = [];
+        return view('app.mcp.cancelled_appointments_pending_review', $data);
+    }
+    public function cancelled_bills_pending_review(Request $request){
+        $data = [
+            'records' => Bill::where('hcp_pro_id', $this->performer->pro->id)
+                ->where('bill_service_type', 'NOTE')
+                ->where('is_cancelled', true)
+                ->where('is_cancellation_acknowledged', '<>', true)
+                ->orderBy('created_at')
+                ->get()
+        ];
+        return view('app.mcp.cancelled_bills_pending_review', $data);
+    }
+    public function cancelled_supply_orders_pending_review(Request $request){
+        $data = [
+            'records' => SupplyOrder::where('signed_by_pro_id', $this->performer->pro->id)
+                ->where('is_cancelled', true)
+                ->where('is_cancellation_acknowledged', '<>', true)
+                ->orderBy('created_at')
+                ->get()
+        ];
+        return view('app.mcp.cancelled_supply_orders_pending_review', $data);
+    }
+    public function erx_and_orders_pending_signature(Request $request){
+        $data = [
+            'records' => Erx::where('hcp_pro_id', $this->performer->pro->id)
+                ->where('pro_declared_status', '<>', 'CANCELLED')
+                ->where('has_hcp_pro_signed', '<>', true)
+                ->orderBy('created_at')
+                ->get()
+        ];
+        return view('app.mcp.erx_and_orders_pending_signature', $data);
+    }
+    public function supply_orders_pending_signature(Request $request){
+        $data = [
+            'records' => SupplyOrder::where('created_by_pro_id', $this->performer->pro->id)
+                ->whereNull('signed_by_pro_id')
+                ->where('is_cancelled', '<>', true)
+                ->orderBy('created_at')
+                ->get()
+        ];
+        return view('app.mcp.supply_orders_pending_signature', $data);
+    }
+
+}

+ 35 - 0
app/Models/Client.php

@@ -290,6 +290,29 @@ class Client extends Model
         return false;
     }
 
+    public function lastMcpAppointment()
+    {
+        if ($this->mcp) {
+            return Appointment::where('client_id', $this->id)
+                ->where('pro_id', $this->mcp->id)
+                ->where('start_time', '<', date('Y-m-d'))
+                ->orderBy('start_time', 'asc')
+                ->first();
+        }
+        return false;
+    }
+
+    public function lastMeasurementOfType($_type) {
+        return Measurement::where('client_id', $this->id)
+            ->whereNotNull('bdt_measurement_id')
+            ->whereNotNull('ts')
+            ->where('is_cellular_zero', false)
+            ->where('is_removed', false)
+            ->where('label', '=', $_type)
+            ->orderBy('ts', 'desc')
+            ->first();
+    }
+
     public function appointments()
     {
         return $this->hasMany(Appointment::class, 'client_id', 'id')
@@ -782,4 +805,16 @@ ORDER BY m.ts DESC
         if(!$coverage) return 'NO';
         return $coverage->getStatus();
     }
+
+    public function getMcpAssignedOn() {
+        $change = ClientProChange::where('client_id', $this->id)
+            ->where('new_pro_id', $this->mcp_pro_id)
+            ->where('responsibility_type', 'MCP')
+            ->orderBy('created_at', 'DESC')
+            ->first();
+        if(!!$change) {
+            return friendlier_date($change->created_at);
+        }
+        return '-';
+    }
 }

+ 12 - 0
app/Models/Note.php

@@ -44,6 +44,18 @@ class Note extends Model
             ->where('status', '<>', 'CANCELLED');
     }
 
+    // Signed/Billed/Verified/Processed/Cancelled
+    public function overallStatus()
+    {
+        $status = 'New';
+        if ($this->is_cancelled) $status = 'Cancelled';
+        else {
+            if ($this->is_billing_marked_done) $status = 'Billed';
+            else if ($this->is_signed_by_hcp) $status = 'Signed';
+        }
+        return $status . ' **';
+    }
+
     public function bills()
     {
         return $this->hasMany(Bill::class, 'note_id', 'id')

+ 160 - 1
app/Models/Pro.php

@@ -59,7 +59,6 @@ class Pro extends Model
         $numTeams = ProTeam::where('assistant_pro_id', $this->id)
             ->where('is_active', true)
             ->count();
-
         return !!$numTeams;
     }
 
@@ -332,6 +331,166 @@ class Pro extends Model
             ->get();
     }
 
+    function get_patients_count_as_mcp() {
+        $query = Client::whereNull('shadow_pro_id');
+        return $query->where('mcp_pro_id', $this->id)->count();
+    }
+
+    function get_new_patients_awaiting_visit_count_as_mcp() {
+        $query = Client::whereNull('shadow_pro_id');
+        return $query->where('mcp_pro_id', $this->id)
+            ->where('has_mcp_done_onboarding_visit', '!=', 'YES')
+            ->count();
+    }
+
+    function get_notes_pending_signature_count_as_mcp() {
+        return Note::where('hcp_pro_id', $this->id)
+            ->where('is_cancelled', '<>', true)
+            ->where('is_signed_by_hcp', '<>', true)
+            ->count();
+    }
+
+    function get_notes_pending_signature_count_as_dna() {
+        return;
+        $naBillableSignedNotes = DB::select(DB::raw("
+SELECT count(note.id) as na_billable_notes
+FROM note
+WHERE
+        note.is_signed_by_hcp = TRUE AND
+        note.ally_pro_id = :pro_id AND
+        note.is_cancelled = FALSE AND
+        (
+            SELECT count(bill.id)
+            FROM bill
+            WHERE
+                  bill.is_cancelled = FALSE AND
+                  bill.generic_pro_id = :pro_id AND
+                  bill.note_id = note.id
+        ) = 0
+        "), ["pro_id" => $performerProID]);
+
+        if(!$naBillableSignedNotes || !count($naBillableSignedNotes)) {
+            $naBillableSignedNotes = 0;
+        }
+        else {
+            $naBillableSignedNotes = $naBillableSignedNotes[0]->na_billable_notes;
+        }
+    }
+
+    function get_notes_pending_billing_count_as_mcp() {
+        return Note::where('hcp_pro_id', $this->id)
+            ->where('is_cancelled', '<>', true)
+            ->where('is_signed_by_hcp', true)
+            ->where('is_billing_marked_done', '<>', true)
+            ->count();
+    }
+
+    function get_bills_pending_signature_count_as_mcp(){
+        return;
+        $pendingBillsToSign = Bill::where('bill_service_type', '<>', 'CARE_MONTH')->where(function ($query) use ($performerProID) {
+            $query->where('hcp_pro_id', $performerProID)->where('is_signed_by_hcp', false)->where('is_cancelled', false);
+        })
+            ->orWhere(function ($query) use ($performerProID) {
+                $query->where('cm_pro_id', $performerProID)->where('is_signed_by_cm', false)->where('is_cancelled', false);;
+            })->orWhere(function ($query) use ($performerProID) {
+                $query->where('rme_pro_id', $performerProID)->where('is_signed_by_rme', false)->where('is_cancelled', false);;
+            })->orWhere(function ($query) use ($performerProID) {
+                $query->where('rmm_pro_id', $performerProID)->where('is_signed_by_rmm', false)->where('is_cancelled', false);;
+            })->count();
+
+        $keyNumbers['pendingBillsToSign'] = $pendingBillsToSign;
+    }
+
+    function get_measurements_awaiting_review_count_as_mcp() {
+        return;
+    }
+
+    function get_incoming_reports_pending_signature_count_as_mcp() {
+        return IncomingReport::where('hcp_pro_id', $this->id)
+            ->where('has_hcp_pro_signed', '<>', true)
+            ->where('is_entry_error', '<>', true)
+            ->count();
+    }
+
+    function get_patients_without_appointment_count_as_mcp() {
+        // SELECT * FROM client WHERE mcp_pro_id = :me.id AND client.next_mcp_appointment_date < today();
+        // TODO: once client.next_mcp_appointment_date is in place
+        return '**';
+    }
+
+    function get_patients_overdue_count_as_mcp() {
+        // SELECT * FROM client WHERE mcp_pro_id = :me.id AND client.next_expected_mcp_visit_date < today();
+        // TODO: once client.next_expected_mcp_visit_date is in place
+        return '**';
+    }
+
+    function get_patients_without_remote_measurement_in_48_hours_count_as_mcp() {
+    }
+
+    function get_cancelled_appointments_pending_acknowledgement_count_as_mcp() {
+        // SELECT * FROM appointment WHERE hcp_pro_id = :me.id AND status = 'REJECTED' AND wasAcknowledgedByAppointmentPro IS NOT TRUE;
+        /*return Appointment::where('pro_id', $this->id)
+            ->where('status', 'REJECTED')
+            ->where('was_acknowledged_by_appointment_pro', '<>', true)
+            ->count();*/
+        // TODO: once appointment.was_acknowledged_by_appointment_pro is in place
+        return '**';
+    }
+
+    function get_cancelled_bills_awaiting_review_count_as_mcp() {
+        // SELECT * FROM bill WHERE bill_service_type = 'NOTE' AND is_cancelled IS TRUE AND isCancellationAcknowledged IS FALSE;
+        return Bill::where('hcp_pro_id', $this->id)
+            ->where('bill_service_type', 'NOTE')
+            ->where('is_cancelled', true)
+            ->where('is_cancellation_acknowledged', '<>', true)
+            ->count();
+    }
+
+    function get_cancelled_supply_orders_awaiting_review_count_as_mcp() {
+        // SELECT * FROM supply_order WHERE signed_by_pro_id = :me.id AND is_cancelled IS TRUE AND isCancellationAcknowledged IS NOT TRUE;
+        return SupplyOrder::where('signed_by_pro_id', $this->id)
+            ->where('is_cancelled', true)
+            ->where('is_cancellation_acknowledged', '<>', true)
+            ->count();
+    }
+
+    function get_erx_and_orders_awaiting_signature_count_as_mcp() {
+        // SELECT * FROM erx WHERE hcp_pro_id = :me.id AND pro_declared_status <> 'CANCELLED' AND hasHcpProSigned IS NOT TRUE;
+        return Erx::where('hcp_pro_id', $this->id)
+            ->where('pro_declared_status', '<>', 'CANCELLED')
+            ->where('has_hcp_pro_signed', '<>', true)
+            ->count();
+    }
+
+    function get_supply_orders_awaiting_signature_count_as_mcp() {
+        // SELECT supply_order.id FROM supply_order WHERE signed_by_pro_id IS NOT TRUE AND is_cancelled IS NOT TRUE AND created_by_pro_id = :me.id;
+        return SupplyOrder::where('created_by_pro_id', $this->id)
+            ->whereNull('signed_by_pro_id')
+            ->where('is_cancelled', '<>', true)
+            ->count();
+    }
+
+    function get_birthdays_today_as_mcp(){
+        return;
+        $queryClients = $this->performer()->pro->getAccessibleClientsQuery();
+        $keyNumbers['patientsHavingBirthdayToday'] = $queryClients
+            ->whereRaw('EXTRACT(DAY from dob) = ?', [date('d')])
+            ->whereRaw('EXTRACT(MONTH from dob) = ?', [date('m')])
+            ->count();
+
+        $reimbursement = [];
+        $reimbursement["currentBalance"] =  $performer->pro->balance;
+        $reimbursement["nextPaymentDate"] = '--';
+        $lastPayment = ProTransaction::where('pro_id', $performerProID)->where('plus_or_minus', 'PLUS')->orderBy('created_at', 'DESC')->first();
+        if ($lastPayment) {
+            $reimbursement["lastPayment"] =  $lastPayment->amount;
+            $reimbursement["lastPaymentDate"] = $lastPayment->created_at;
+        } else {
+            $reimbursement["lastPayment"] = '--';
+            $reimbursement["lastPaymentDate"] = '--';
+        }
+    }
+
     public function getAccessibleClientsQuery($_search = false) {
         $proID = $this->id;
         $query = Client::whereNull('shadow_pro_id');

+ 62 - 0
config/constants.php

@@ -0,0 +1,62 @@
+<?php
+  return [
+      'medicaid_states' => [
+        "MEDICAID ALABAMA",
+        "MEDICAID ALASKA",
+        "MEDICAID ARIZONA",
+        "MEDICAID ARKANSAS",
+        "MEDICAID CALIFORNIA MEDI-CAL",
+        "MEDICAID COLORADO",
+        "MEDICAID CONNECTICUT",
+        "MEDICAID DELAWARE",
+        "MEDICAID DISTRICT OF COLUMBIA",
+        "MEDICAID FLORIDA",
+        "MEDICAID GEORGIA",
+        "MEDICAID HAWAII",
+        "MEDICAID IDAHO",
+        "MEDICAID ILLINOIS",
+        "MEDICAID INDIANA",
+        "MEDICAID IOWA",
+        "MEDICAID KANSAS",
+        "MEDICAID KENTUCKY",
+        "MEDICAID LOUISIANA",
+        "MEDICAID MAINE",
+        "MEDICAID MARYLAND",
+        "MEDICAID MARYLAND DHMH",
+        "MEDICAID MASSACHUSETTS",
+        "MEDICAID MICHIGAN",
+        "MEDICAID MINNESOTA",
+        "MEDICAID MISSISSIPPI",
+        "MEDICAID MISSISSIPPI",
+        "MEDICAID MISSOURI",
+        "MEDICAID MONTANA",
+        "MEDICAID NEBRASKA",
+        "MEDICAID NEVADA",
+        "MEDICAID NEW HAMPSHIRE",
+        "MEDICAID NEW JERSEY",
+        "MEDICAID NEW MEXICO",
+        "MEDICAID NEW YORK",
+        "MEDICAID NEW YORK",
+        "MEDICAID NORTH CAROLINA",
+        "MEDICAID NORTH DAKOTA",
+        "MEDICAID OHIO",
+        "MEDICAID OKLAHOMA",
+        "MEDICAID OREGON",
+        "MEDICAID OREGON (DHS OMAP)",
+        "MEDICAID PENNSYLVANIA",
+        "MEDICAID RHODE ISLAND",
+        "MEDICAID SOUTH CAROLINA",
+        "MEDICAID SOUTH DAKOTA",
+        "MEDICAID TENNESSEE",
+        "MEDICAID TEXAS",
+        "MEDICAID TEXAS AND TEXAS HEALTH STEPS",
+        "MEDICAID UTAH",
+        "MEDICAID VERMONT",
+        "MEDICAID VIRGINIA",
+        "MEDICAID WASHINGTON (PROVIDER ONE)",
+        "MEDICAID WEST VIRGINIA",
+        "MEDICAID WISCONSIN",
+        "MEDICAID WYOMING",
+      ]
+  ];
+?>

+ 0 - 1
public/css/style.css

@@ -1056,7 +1056,6 @@ body .node input[type="number"] {
     width: calc(100vw - 4rem);
 }
 .stag-popup.tall>form, .stag-popup.tall>.stag-popup-content {
-    height: 100%;
     min-height: 500px;
 }
 .stag-popup.narrow>form, .stag-popup.narrow>.stag-popup-content {

+ 5 - 0
resources/views/app/admin/appointments.blade.php

@@ -0,0 +1,5 @@
+@extends ('layouts/template')
+
+@section('content')
+    <h1>Hi</h1>
+@endsection

+ 5 - 0
resources/views/app/admin/bills.blade.php

@@ -0,0 +1,5 @@
+@extends ('layouts/template')
+
+@section('content')
+    <h1>Hi</h1>
+@endsection

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

@@ -0,0 +1 @@
+<h1>Phone Calls & Memos</h1>

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

@@ -0,0 +1 @@
+<h1>ERX & Orders</h1>

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

@@ -0,0 +1 @@
+<div id="measurements-tab">Loading...</div>

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

@@ -0,0 +1 @@
+<h1>Messages</h1>

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

@@ -0,0 +1 @@
+<h1>Notifications</h1>

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

@@ -0,0 +1 @@
+<h1>Supply Orders</h1>

+ 5 - 0
resources/views/app/admin/erx_and_orders.blade.php

@@ -0,0 +1,5 @@
+@extends ('layouts/template')
+
+@section('content')
+    <h1>Hi</h1>
+@endsection

+ 5 - 0
resources/views/app/admin/notes.blade.php

@@ -0,0 +1,5 @@
+@extends ('layouts/template')
+
+@section('content')
+    <h1>Hi</h1>
+@endsection

+ 6 - 0
resources/views/app/admin/patients.blade.php

@@ -0,0 +1,6 @@
+@extends ('layouts/template')
+
+@section('content')
+    <h1>Hi</h1>
+@endsection
+

+ 5 - 0
resources/views/app/admin/reports.blade.php

@@ -0,0 +1,5 @@
+@extends ('layouts/template')
+
+@section('content')
+    <h1>Hi</h1>
+@endsection

+ 5 - 0
resources/views/app/admin/supply_orders.blade.php

@@ -0,0 +1,5 @@
+@extends ('layouts/template')
+
+@section('content')
+    <h1>Hi</h1>
+@endsection

+ 977 - 0
resources/views/app/dashboard-admin.blade.php

@@ -0,0 +1,977 @@
+@extends ('layouts.template')
+
+@section('content')
+
+    <style>
+        tr.thin th, tr.thin td {
+            padding: 0.25em;
+        }
+    </style>
+
+    <div class="p-3">
+        <div class="">
+            <div class="row mcp-theme-1" id="pro-dashboard-container" v-cloak>
+                <div class="col-md-3 mcp-theme-1">
+                    <div class="mb-4" v-show="tab==='appointments'">
+                        <div class="pro-dashboard-inline-calendar"></div>
+                    </div>
+                    <div class="card mb-4">
+                        <div class="card-header pl-2">
+                            <strong>
+                                Key Numbers
+                            </strong>
+                        </div>
+                        <div class="card-body p-0">
+                            <table class="table mb-0 dashboard-stats-table">
+                                <tbody>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_patients_count_as_mcp()}}</th>
+                                    <th class="pl-2">Patients</th>
+                                </tr>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_new_patients_awaiting_visit_count_as_mcp()}}</th>
+                                    <th class="pl-2">New Patients Awaiting Visit</th>
+                                </tr>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_notes_pending_signature_count_as_mcp()}}</th>
+                                    <th class="pl-2">Notes Pending Signature</th>
+                                </tr>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_notes_pending_billing_count_as_mcp()}}</th>
+                                    <th class="pl-2">Notes Pending Billing</th>
+                                </tr>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_incoming_reports_pending_signature_count_as_mcp()}}</th>
+                                    <th class="pl-2">Reports Pending Signature</th>
+                                </tr>
+
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_patients_without_appointment_count_as_mcp()}}</th>
+                                    <th class="pl-2">Patients w/o Appointments</th>
+                                </tr>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_patients_not_seen_in_45_days_count_as_mcp()}}</th>
+                                    <th class="pl-2">Patients Not Seen in 45 Days</th>
+                                </tr>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_cancelled_appointments_pending_acknowledgement_count_as_mcp()}}</th>
+                                    <th class="pl-2">Cancelled Appts. Pending Review</th>
+                                </tr>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_cancelled_bills_awaiting_review_count_as_mcp()}}</th>
+                                    <th class="pl-2">Cancelled Bills Pending Review</th>
+                                </tr>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_cancelled_supply_orders_awaiting_review_count_as_mcp()}}</th>
+                                    <th class="pl-2">Cancelled Supply Orders Pending Review</th>
+                                </tr>
+
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_erx_and_orders_awaiting_signature_count_as_mcp()}}</th>
+                                    <th class="pl-2">ERx & Orders Pending Signature</th>
+                                </tr>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_supply_orders_awaiting_signature_count_as_mcp()}}</th>
+                                    <th class="pl-2">Supply Orders Pending Signature</th>
+                                </tr>
+                                </tbody>
+                            </table>
+                        </div>
+                    </div>
+                    <div class="card mb-4">
+                        <div class="card-header pl-2">
+                            <strong>
+                                Remote Monitoring: {{friendly_month(date('Y-m-d'))}}
+                            </strong>
+                        </div>
+                        <div class="card-body p-0">
+                            <table class="table mb-0 dashboard-stats-table">
+                                <tbody>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_measurements_awaiting_review_count_as_mcp() ?? '-'}}</th>
+                                    <th class="pl-2">Measurements Pending Review</th>
+                                </tr>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_patients_without_remote_measurement_in_48_hours_count_as_mcp() ?? '-'}}</th>
+                                    <th class="pl-2">Patients w/o Measurement in 48 hrs.</th>
+                                </tr>
+                                </tbody>
+                            </table>
+                        </div>
+                    </div>
+                    <div class="card mb-4">
+                        <div class="card-header pl-2">
+                            <strong>
+                                Practice Management
+                            </strong>
+                        </div>
+                        <div class="card-body p-0">
+                            <table class="table mb-0 dashboard-stats-table">
+                                <tbody>
+                                <tr>
+                                    <th colspan="2">Revenue Cycle Management</th>
+                                </tr>
+                                <tr class="thin">
+                                    <th class="font-weight-normal px-2 pl-4">
+                                        ${{friendly_money($reimbursement['currentBalance'])}}</th>
+                                    <th class="font-weight-normal pl-2 w-100"><a
+                                            href="/practice-management/financial-transactions">Current balance</a></th>
+                                </tr>
+                                <!-- <tr>
+                                    <th class="px-2">{{friendly_date_time($reimbursement['nextPaymentDate'], false)}}</th>
+                                    <th class="pl-2">Next Payment Date</th>
+                                </tr> -->
+                                <tr class="thin">
+                                    <th class="font-weight-normal px-2 pl-4">${{friendly_money($reimbursement['nextPaymentAmount'])}}</th>
+                                    <th class="font-weight-normal pl-2"><a
+                                            href="/practice-management/bills-under-processing">Processing</a></th>
+                                </tr>
+                                <tr class="thin">
+                                    <th class="font-weight-normal px-2 pl-5">${{friendly_money($reimbursement['nextPaymentAmount'])}}</th>
+                                    <th class="font-weight-normal pl-2"><a
+                                            href="/practice-management/bills-under-processing">Treatment Services</a></th>
+                                </tr>
+                                <tr class="thin">
+                                    <th class="font-weight-normal px-2 pl-5">${{friendly_money($reimbursement['nextPaymentAmount'])}}</th>
+                                    <th class="font-weight-normal pl-2"><a
+                                            href="/practice-management/bills-under-processing">Remote Monitoring</a></th>
+                                </tr>
+                                <tr class="thin">
+                                    <th class="font-weight-normal px-2 pl-5">${{friendly_money($reimbursement['nextPaymentAmount'])}}</th>
+                                    <th class="font-weight-normal pl-2"><a
+                                            href="/practice-management/bills-under-processing">Other Services</a></th>
+                                </tr>
+                                {{--
+                                <tr>
+                                    <th class="px-2">{{$reimbursement['lastPayment']}}</th>
+                                    <th class="pl-2"><a href="/practice-management/financial-transactions">Last payment</a></th>
+                                </tr>
+                                <tr>
+                                    <th class="px-2">{{friendly_date_time($reimbursement['lastPaymentDate'], false)}}</th>
+                                    <th class="pl-2"><a href="/practice-management/financial-transactions">Last payment date</a></th>
+                                </tr>
+                                --}}
+                                </tbody>
+                            </table>
+                        </div>
+                    </div>
+                    @if($pro->pro_type === 'ADMIN')
+                        <div class="card mb-4">
+                            <div class="card-header pl-2">
+                                <strong>
+                                    Bills &amp; Claims
+                                </strong>
+                            </div>
+                            <div class="card-body p-0">
+                                <table class="table mb-0 dashboard-stats-table">
+                                    <tbody>
+
+                                    <tr>
+                                        <th class="border-top-1 px-2 text-center">{{$businessNumbers['notesWithBillsToResolve']}}</th>
+                                        <th class="border-top-1 pl-2">
+                                            <a href="/practice-management/billing-manager">Notes with bills to
+                                                resolve</a>
+                                        </th>
+                                    </tr>
+                                    <tr>
+                                        <th class="border-top-1 px-2 text-center">{{$businessNumbers['notesPendingBillingClosure']}}</th>
+                                        <th class="border-top-1 pl-2">
+                                            <a href="/practice-management/billing-manager">Notes pending billing
+                                                closure</a>
+                                        </th>
+                                    </tr>
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div>
+                    @endif
+                </div>
+                <div class="col-md-9">
+
+                    <div class="row">
+                        <div class="col-6">
+
+                            <!-- Appointment Updates -->
+                            @if(count($proApptUpdates))
+                                <div class="mb-3 border rounded px-3 py-2 ack-container">
+                                    <p class="pt-1 mb-2"><b>Appointment Updates</b></p>
+                                    <table class="table table-sm table-hover table-bordered mb-0">
+                                        <thead>
+                                        <tr>
+                                            <th>Client</th>
+                                            <th>Appt. Date/Time</th>
+                                            <th>Status</th>
+                                            <th></th>
+                                        </tr>
+                                        </thead>
+                                        <tbody>
+                                        @foreach($proApptUpdates as $update)
+                                            <tr>
+                                                <td>{{$update->name_first}} {{$update->name_last}}</td>
+                                                <td>{{friendlier_date_time($update->start_time)}}</td>
+                                                <td>{{$update->status}}</td>
+                                                <td><a href="#" class="ack-pro-appt-update" data-uid="{{$update->uid}}">Acknowledge</a>
+                                                </td>
+                                            </tr>
+                                        @endforeach
+                                        </tbody>
+                                    </table>
+                                </div>
+                            @endif
+
+                            @if(count($naApptUpdates))
+                                <div class="mb-3 border rounded px-3 py-2 ack-container">
+                                    <p class="pt-1 mb-2"><b>Appointment Updates</b></p>
+                                    <table class="table table-sm table-hover table-bordered mb-0">
+                                        <thead>
+                                        <tr>
+                                            <th>Client</th>
+                                            <th>Pro</th>
+                                            <th>Appt. Date/Time</th>
+                                            <th>Status</th>
+                                            <th></th>
+                                        </tr>
+                                        </thead>
+                                        <tbody>
+                                        @foreach($naApptUpdates as $update)
+                                            <tr>
+                                                <td>{{$update->name_first}} {{$update->name_last}}</td>
+                                                <td>{{$update->pro_name_first}} {{$update->pro_name_last}}</td>
+                                                <td>{{friendlier_date_time($update->start_time)}}</td>
+                                                <td>{{$update->status}}</td>
+                                                <td><a href="#" class="ack-na-appt-update" data-uid="{{$update->uid}}">Acknowledge</a>
+                                                </td>
+                                            </tr>
+                                        @endforeach
+                                        </tbody>
+                                    </table>
+                                </div>
+                            @endif
+
+                        <!-- new associations -->
+                            @if(count($newMCPAssociations))
+                                <div class="mb-3 border rounded px-3 py-2 ack-container">
+                                    <p class="pt-1 mb-2"><b>New Patients</b></p>
+                                    @foreach($newMCPAssociations as $assoc)
+                                        <div class="d-flex align-items-start bg-light mb-2 px-2 py-1">
+                                            <div class="flex-grow-1">
+                                                You are now the MCP for
+                                                <a href="/patients/view/{{$assoc->patient->uid}}"
+                                                   class="">{{$assoc->patient->displayName()}}</a>
+                                                <?php $nextAppt = $assoc->patient->nextAppointment(); ?>
+                                                @if($nextAppt)
+                                                    <div class="font-size-11">
+                                                        <span class="text-secondary font-size-11">Appt.</span>
+                                                        {{$nextAppt->pro->displayName()}}
+                                                        <span class="text-secondary font-size-11">on</span>
+                                                        {{friendlier_date_time($nextAppt->raw_date . ' ' . $nextAppt->raw_start_time)}}
+                                                    </div>
+                                                    @if($nextAppt->status === 'CREATED')
+                                                        <div
+                                                            class="text-warning-mellow font-weight-bold font-size-11 mt-1">
+                                                            <i class="fa fa-exclamation-triangle"></i>
+                                                            Confirmation pending
+                                                        </div>
+                                                    @endif
+                                                    @if($nextAppt->status === 'CONFIRMED')
+                                                        <div class="text-success font-weight-bold font-size-11 mt-1">
+                                                            <i class="fa fa-check"></i>
+                                                            Confirmed by the patient
+                                                        </div>
+                                                    @endif
+                                                    @if($nextAppt->status === 'REJECTED')
+                                                        <div class="text-danger font-weight-bold font-size-11 mt-1">
+                                                            <i class="fa fa-stop"></i>
+                                                            Rejected by the patient
+                                                        </div>
+                                                    @endif
+                                                @endif
+                                            </div>
+                                            <a href="#" class="ack-client-pro-change ml-3" data-uid="{{$assoc->uid}}">Stamp</a>
+                                        </div>
+                                    @endforeach
+                                </div>
+                            @endif
+
+                            @if(count($newNAAssociations))
+                                <div class="mb-3 border rounded px-3 py-2 ack-container">
+                                    <p class="pt-1 mb-2"><b>New Patients</b></p>
+                                    @foreach($newNAAssociations as $assoc)
+                                        <div class="d-flex align-items-start bg-light mb-2 px-2 py-1">
+                                            <div class="flex-grow-1">
+                                                You are now the Care Coordinator for
+                                                <a href="/patients/view/{{$assoc->patient->uid}}"
+                                                   class="">{{$assoc->patient->displayName()}}</a>
+                                                <?php $nextAppt = $assoc->patient->nextAppointment(); ?>
+                                                @if($nextAppt)
+                                                    <div class="font-size-11">
+                                                        <span class="text-secondary font-size-11">Appt.</span>
+                                                        {{$nextAppt->pro->displayName()}}
+                                                        <span class="text-secondary font-size-11">on</span>
+                                                        {{friendlier_date_time($nextAppt->raw_date . ' ' . $nextAppt->raw_start_time)}}
+                                                    </div>
+                                                    @if($nextAppt->status === 'CREATED')
+                                                        <div
+                                                            class="text-warning-mellow font-weight-bold font-size-11 mt-1">
+                                                            <i class="fa fa-exclamation-triangle"></i>
+                                                            Confirmation pending
+                                                        </div>
+                                                    @endif
+                                                    @if($nextAppt->status === 'CONFIRMED')
+                                                        <div class="text-success font-weight-bold font-size-11 mt-1">
+                                                            <i class="fa fa-check"></i>
+                                                            Confirmed by the patient
+                                                        </div>
+                                                    @endif
+                                                    @if($nextAppt->status === 'REJECTED')
+                                                        <div class="text-danger font-weight-bold font-size-11 mt-1">
+                                                            <i class="fa fa-stop"></i>
+                                                            Rejected by the patient
+                                                        </div>
+                                                    @endif
+                                                @endif
+                                            </div>
+                                            <a href="#" class="ack-client-pro-change"
+                                               data-uid="{{$assoc->uid}}">Stamp</a>
+                                        </div>
+                                    @endforeach
+                                </div>
+                            @endif
+                        </div>
+                        <div class="col-6">
+                            @if(count($mcpClientMemos))
+                                <div class="mb-3 border rounded px-3 py-2 ack-container">
+                                    <p class="pt-1 mb-2"><b>New Patients Memos (MCP)</b></p>
+                                    <table class="table table-sm table-hover table-bordered">
+                                        <thead>
+                                        <tr>
+                                            <th>Patient</th>
+                                            <th>Memo</th>
+                                            <th>Created</th>
+                                            <th></th>
+                                        </tr>
+                                        </thead>
+                                        <tbody>
+                                        @foreach($mcpClientMemos as $memo)
+                                            <tr>
+                                                <td class="">
+                                                    <a href="/patients/view/{{$memo->client_uid}}">{{$memo->name_first}} {{$memo->name_last}}</a>
+                                                </td>
+                                                <td>{!! $memo->content !!}</td>
+                                                <td class="text-nowrap">{{friendlier_date_time($memo->created_at)}}</td>
+                                                <td><a href="#" class="ack-client-memo"
+                                                       data-uid="{{$memo->uid}}">Stamp</a></td>
+                                            </tr>
+                                        @endforeach
+                                        </tbody>
+                                    </table>
+                                </div>
+                            @endif
+                            @if(count($naClientMemos))
+                                <div class="mb-3 border rounded px-3 py-2 ack-container">
+                                    <p class="pt-1 mb-2"><b>New Patients Memos (NA)</b></p>
+                                    <table class="table table-sm table-hover table-bordered">
+                                        <thead>
+                                        <tr>
+                                            <th>Patient</th>
+                                            <th>Memo</th>
+                                            <th>Created</th>
+                                            <th></th>
+                                        </tr>
+                                        </thead>
+                                        <tbody>
+                                        @foreach($naClientMemos as $memo)
+                                            <tr>
+                                                <td class="">
+                                                    <a href="/patients/view/{{$memo->client_uid}}">{{$memo->name_first}} {{$memo->name_last}}</a>
+                                                </td>
+                                                <td>{!! $memo->content !!}</td>
+                                                <td class="text-nowrap">{{friendlier_date_time($memo->created_at)}}</td>
+                                                <td><a href="#" class="ack-client-memo"
+                                                       data-uid="{{$memo->uid}}">Stamp</a></td>
+                                            </tr>
+                                        @endforeach
+                                        </tbody>
+                                    </table>
+                                </div>
+                            @endif
+                        </div>
+                    </div>
+
+                    <ul class="nav nav-tabs">
+                        <li class="nav-item">
+                            <a native data-tab="appointments" class="nav-link"
+                               :class="tab == 'appointments' ? 'active' : ''" href="#"
+                               v-on:click.prevent="tab='appointments'; initLoadAppointments();">
+                                Appointments
+                            </a>
+                        </li>
+                        <li class="nav-item">
+                            <a native data-tab="measurements" class="nav-link"
+                               :class="tab == 'measurements' ? 'active' : ''" href="#"
+                               v-on:click.prevent="tab='measurements'; loadMeasurements();">
+                                Measurements
+                            </a>
+                        </li>
+                        <li class="nav-item">
+                            <a native data-tab="incoming_reports"
+                               class="nav-link {{count($incomingReports) ? 'text-danger font-weight-bold' : ''}}"
+                               :class="tab == 'incoming_reports' ? 'active' : ''" href="#"
+                               v-on:click.prevent="tab='incoming_reports'">
+                                Incoming Reports ({{count($incomingReports)}})
+                            </a>
+                        </li>
+                        <li class="nav-item">
+                            <a native data-tab="erx" class="nav-link {{$numERx ? 'text-danger font-weight-bold' : ''}}"
+                               :class="tab == 'erx' ? 'active' : ''" href="#"
+                               v-on:click.prevent="tab='erx'">
+                                ERx ({{$numERx}})
+                            </a>
+                        </li>
+                        <li class="nav-item">
+                            <a native data-tab="labs"
+                               class="nav-link {{$numLabs ? 'text-danger font-weight-bold' : ''}}"
+                               :class="tab == 'labs' ? 'active' : ''" href="#"
+                               v-on:click.prevent="tab='labs'">
+                                Labs ({{$numLabs}})
+                            </a>
+                        </li>
+                        <li class="nav-item">
+                            <a native data-tab="imaging"
+                               class="nav-link {{$numImaging ? 'text-danger font-weight-bold' : ''}}"
+                               :class="tab == 'imaging' ? 'active' : ''" href="#"
+                               v-on:click.prevent="tab='imaging'">
+                                Imaging ({{$numImaging}})
+                            </a>
+                        </li>
+                        <li class="nav-item">
+                            <a native data-tab="supply_orders"
+                               class="nav-link {{$numSupplyOrders ? 'text-danger font-weight-bold' : ''}}"
+                               :class="tab == 'supply_orders' ? 'active' : ''" href="#"
+                               v-on:click.prevent="tab='supply_orders'">
+                                Supply Orders ({{$numSupplyOrders}})
+                            </a>
+                        </li>
+                    </ul>
+
+                    <div class="border-left border-right border-bottom p-3">
+                        <div v-show="tab==='appointments'" class="appointments-tab">
+                            <div v-show="selectedDate">
+                                <div class="d-flex align-items-end mb-3">
+                                    <b class="large"><span class="text-secondary">Today:</span> @{{ selectedDate }}</b>
+                                    <div class="ml-auto d-inline-flex align-items-center">
+                                        <label class="text-secondary mr-2 my-0 text-nowrap">Filter by status:</label>
+                                        <select v-model="filterStatus"
+                                                class="form-control form-control-sm">
+                                            <option value="">All</option>
+                                            <option value="CREATED">Created</option>
+                                            <option value="CONFIRMED">Confirmed</option>
+                                            <option value="CANCELLED">Cancelled</option>
+                                            <option value="COMPLETED">Completed</option>
+                                            <option value="ABANDONED">Abandoned</option>
+                                        </select>
+                                    </div>
+                                </div>
+                                <div v-for="event in events" class="align-items-end p-3 border rounded mb-3"
+                                     :class="(event.dateYMD === selectedDate && (filterStatus === '' || filterStatus === event.status) ? 'd-flex' : 'd-none') + ' ' + (event.isClientShadowOfPro ? 'training-event' : '')">
+                                    <div class="patient-avatar mr-3 align-self-center">
+                                        <i v-if="event.isClientShadowOfPro" class="fa fa-graduation-cap training-icon"
+                                           :title="event.proInitials"></i>
+                                        <span v-else class="">@{{ event.proInitials }}</span>
+                                    </div>
+                                    <div>
+                                        <div class="pb-1">
+                                            <b class="text-info">@{{ event.proName }}</b>
+                                            &nbsp;/&nbsp;
+                                            @{{ event.friendlyStartTime }} - @{{ event.friendlyEndTime }} <span
+                                                class="text-secondary">@{{ event.timezone }}</span>
+                                            &nbsp;/&nbsp;
+                                            <span class="d-inline-block ml- 2 text-secondary font-weight-bold">@{{ event.title }}</span>
+                                        </div>
+                                        <div class="pb-1">
+                                            <a :href="'/patients/view/' + event.clientUid" class="font-weight-bold">@{{
+                                                event.clientName }}</a>
+                                            <span class="small d-inline-block pl-2 text-secondary font-weight-normal">@{{ event.clientSummary }}</span>
+                                        </div>
+                                        <div class="d-flex align-items-baseline">
+                                            <div v-if="event.status === 'CREATED'"
+                                                 class="text-warning-mellow font-weight-bold">
+                                                <i class="fa fa-exclamation-triangle"></i>
+                                                Confirmation pending
+                                            </div>
+                                            <div v-else-if="event.status === 'CONFIRMED'"
+                                                 class="text-success font-weight-bold">
+                                                <i class="fa fa-check"></i>
+                                                Confirmed by the patient
+                                            </div>
+                                            <div v-else-if="event.status === 'REJECTED'"
+                                                 class="text-danger font-weight-bold">
+                                                <i class="fa fa-stop"></i>
+                                                Rejected by the patient
+                                            </div>
+                                            <div v-else class="text-secondary">
+                                                Status: <b>@{{ event.status }}</b>
+                                            </div>
+                                            <span class="mx-2 text-secondary">|</span>
+                                            <a :href="'/patients/view/' + event.clientUid + '/calendar/' + event.uid">
+                                                <i class="fa fa-edit"></i>
+                                                Edit Appointment
+                                            </a>
+                                        </div>
+                                        <div class="mt-1"
+                                             :class="event.coverage !== 'YES' ? (event.coverage === 'NO' ? 'text-danger' : 'text-warning-mellow') : 'text-success'">
+                                            Coverage Status: <b>@{{ event.coverage }}</b>
+                                        </div>
+                                    </div>
+                                    <div class="ml-auto">
+                                        <select v-model="event.newStatus"
+                                                class="form-control form-control-sm bg-light"
+                                                v-on:change="updateStatus(event)">
+                                            <option value="CREATED">CREATED</option>
+                                            <option value="CONFIRMED">CONFIRMED</option>
+                                            <option value="CANCELLED">CANCELLED</option>
+                                            <option value="COMPLETED">COMPLETED</option>
+                                            <option value="ABANDONED">ABANDONED</option>
+                                        </select>
+                                        <div v-if="selectedDate === '{{ date('Y-m-d') }}'"
+                                             class="pt-1 text-right"
+                                             :class="event.started ? 'text-danger': 'text-secondary'">
+                                            @{{ event.inHowManyHours }}
+                                        </div>
+                                    </div>
+                                </div>
+                                <div v-if="numEventsForDate === 0" class="bg-light p-3 text-secondary border bounded">
+                                    <span
+                                        v-if="filterStatus === ''">You have no appointments on <b>@{{ selectedDate }}</b></span>
+                                    <span
+                                        v-if="filterStatus !== ''">You have no appointments on <b>@{{ selectedDate }}</b> with status <b>@{{ filterStatus }}</b></span>
+                                </div>
+                            </div>
+                            <div v-show="!selectedDate" class="bg-light p-3 text-secondary border bounded">
+                                Please select a date from the calendar on the left
+                            </div>
+                        </div>
+                        <div v-show="tab==='measurements'">
+                            <div id="measurements-tab">Loading...</div>
+                        </div>
+                        <div v-show="tab==='incoming_reports'">
+                            @include('app.dashboard.incoming_reports')
+                        </div>
+                        <div v-show="tab==='erx'">
+                            @include('app.dashboard.erx')
+                        </div>
+                        <div v-show="tab==='labs'">
+                            @include('app.dashboard.labs')
+                        </div>
+                        <div v-show="tab==='imaging'">
+                            @include('app.dashboard.imaging')
+                        </div>
+                        <div v-show="tab==='supply_orders'">
+                            @include('app.dashboard.supply_orders')
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <div class="stag-popup stag-popup-md ticket-popup mcp-theme-1" stag-popup-key="ticket-popup"></div>
+
+    <script>
+        (function () {
+            function init() {
+                window.apapp = new Vue({
+                    el: '#pro-dashboard-container',
+                    delimiters: ['@{{', '}}'],
+                    data: {
+                        tab: '{{ request()->input('tab') ? request()->input('tab') : 'measurements' }}',
+                        datesWithEvents: [],
+                        selectedDate: '{{ date('Y-m-d') }}',
+                        selectedStatus: 'CREATED',
+                        events: [],
+                        numEventsForDate: 0,
+                        filterStatus: '',
+                        calendarElem: null,
+                        currentMonth: null,
+                        currentYear: null,
+                        measurementFilterStatus: 'ALL',
+                        measurements: {!! $pro->pro_type === 'ADMIN' ? '[]' : json_encode($pro->getMeasurements()) !!},
+                        appointmentsLoaded: false,
+                    },
+                    methods: {
+                        formatDate: function (date) {
+                            let d = new Date(date),
+                                month = '' + (d.getMonth() + 1),
+                                day = '' + d.getDate(),
+                                year = d.getFullYear();
+
+                            if (month.length < 2)
+                                month = '0' + month;
+                            if (day.length < 2)
+                                day = '0' + day;
+
+                            return [year, month, day].join('-');
+                        },
+                        onDateChange: function (_newDate) {
+                            let self = this;
+                            window.setTimeout(() => {
+                                // let dayValue = $('.pro-dashboard-inline-calendar td.day.active').first().text();
+                                // if(dayValue.length === 1) dayValue = '0' + dayValue;
+                                // self.selectedDate = _newDate.substr(0, 8) + dayValue;
+                                self.selectedDate = _newDate;
+                                showMask();
+                                self.loadEvents(self.selectedDate, function () {
+                                    hideMask();
+                                    Vue.nextTick(() => {
+                                        // self.highlightDatesWithEvents(self.datesWithEvents);
+                                        initFastLoad($('.appointments-tab'));
+                                    });
+                                });
+                            }, 25);
+                        },
+                        selectToday: function () {
+                            $('.pro-dashboard-inline-calendar table td[data-date]').removeClass('active');
+                            $('.pro-dashboard-inline-calendar table td[data-date="{{ $milliseconds }}"]')
+                                .addClass('active');
+                            // this.onDateChange('{{ date('Y-m-d') }}');
+                        },
+                        highlightDatesWithEvents: function (_dates) {
+                            $('.pro-dashboard-inline-calendar table td[data-date]').removeAttr('has-events');
+                            for (let i = 0; i < _dates.length; i++) {
+                                $('.pro-dashboard-inline-calendar table td[data-date="' + _dates[i] + '"]')
+                                    .attr('has-events', 1);
+                            }
+                        },
+                        updateStatus: function (_event) {
+                            $.post('/api/appointment/updateStatus', {
+                                uid: _event.uid,
+                                status: _event.newStatus
+                            }, function (_data) {
+                                if (!_data) {
+                                    toastr.error('Unable to update appointment status!');
+                                } else {
+                                    if (!_data.success) {
+                                        toastr.error(_data.message);
+                                    } else {
+                                        _event.status = _event.newStatus;
+                                        toastr.success('The appointment has been updated');
+                                    }
+                                }
+                            }, 'json')
+                        },
+                        showEditForm: function (_trigger) {
+                            let form = $(_trigger).closest('[moe]').find('form').first();
+                            showMoeFormMask();
+                            form.show();
+                            setTimeout(function () {
+                                initPrimaryForm(form);
+                            }, 0);
+                        },
+                        submitEditForm: function (_trigger) {
+                            let form = $(_trigger).closest('[moe]').find('form').first();
+                            if (!form[0].checkValidity()) {
+                                form[0].reportValidity();
+                                return;
+                            }
+                            $.post(form.attr('url'), form.serialize(), function (_data) {
+                                if (_data && _data.success) {
+                                    fastReload();
+                                } else {
+                                    if (_data.message) {
+                                        toastr.error(_data.message);
+                                    } else {
+                                        toastr.error('Unable to update the appointment');
+                                    }
+                                }
+                            });
+                        },
+                        cancelEditForm: function (_trigger) {
+                            let form = $(_trigger).closest('[moe]').find('form').first();
+                            hideMoeFormMask();
+                            form.hide();
+                        },
+                        loadEventDates: function (_refDate = false) {
+                            let today = new Date(_refDate ? _refDate : '{{date('Y-m-d')}}'),
+                                firstOfMonth = new Date(today.getFullYear(), today.getMonth(), 1),
+                                lastOfMonth = new Date(today.getFullYear(), today.getMonth() + 1, 0);
+
+                            this.selectedDate = null;
+                            $('td.day.active').removeClass('active');
+
+                            $.get('/pro-dashboard-event-dates/' +
+                                this.formatDate(firstOfMonth) + '/' +
+                                this.formatDate(lastOfMonth), (_data) => {
+                                this.datesWithEvents = _data;
+                                console.log(this.datesWithEvents);
+                                this.calendarElem.datepicker('refresh');
+                                // this.highlightDatesWithEvents(this.datesWithEvents);
+
+                                this.currentMonth = firstOfMonth.getMonth();
+                                this.currentYear = firstOfMonth.getFullYear();
+
+                                if (!_refDate && $('td.day[data-date="{{$milliseconds}}"]:visible').length) {
+                                    $('td.day[data-date="{{$milliseconds}}"]:visible').first().click();
+                                }
+
+                                this.appointmentsLoaded = true;
+                            }, 'json');
+                        },
+                        loadEvents: function (_date, _callback) {
+                            let self = this;
+                            $.get('/pro-dashboard-events/' + _date + '/' + _date, function (_data) {
+                                self.events = _data;
+                                self.numEventsForDate = (_data && _data.length) ? 1 : 0;
+                                _callback.call(self);
+                            }, 'json');
+                        },
+                        updateMeasurements: function () {
+                            $.get('/pro-dashboard-measurements/' + this.measurementFilterStatus, (_data) => {
+                                this.measurements = _data;
+                                Vue.nextTick(() => {
+                                    // this.initCMRTE();
+                                    $('#pro-dashboard-container').find('[moe][initialized]').removeAttr('initialized');
+                                    initMoes();
+                                });
+                            }, 'json');
+                        },
+                        setMeasurementStatus: function (_uid, _status) {
+                            $.post('/api/measurement/updateStatus', {
+                                uid: _uid,
+                                status: _status
+                            }, (_data) => {
+                                this.updateMeasurements();
+                            }, 'json');
+                        },
+                        initCMRTE: function () {
+                            $('#pro-dashboard-container [cm-rte]').each(function () {
+
+                                $(this).wrap(
+                                    $('<div class="border-left border-right rte-holder"/>')
+                                        .attr('data-shortcuts', '')
+                                );
+
+                                // give a unique id to this editor instance
+                                var editorID = Math.ceil(Math.random() * 99999), fieldName = $(this).attr('data-name');
+
+                                var el = this;
+                                var existingContent = $(el).attr('data-content');
+                                var quill = new Quill(el, {
+                                    theme: 'snow',
+                                    modules: stagQuillConfig
+                                });
+
+                                var toolbar = $(quill.container).prev('.ql-toolbar');
+
+                                // add button for new shortcut
+                                var newSCButton = $('<button class="btn bg-white btn-sm btn-default text-primary w-auto px-2 border py-0 ' +
+                                    'text-sm add-shortcut" data-editor-id="' + editorID + '">+ Shortcut</button>');
+                                toolbar.append(newSCButton);
+
+                                quill.root.innerHTML = existingContent;
+
+                                $('<input type="hidden" name="' + fieldName + '">').val(existingContent).insertAfter(el);
+
+                                quill.on('text-change', function (delta, oldDelta, source) {
+                                    $(el).next('[name="' + fieldName + '"]').val(quill.root.innerHTML);
+                                });
+
+                                $(quill.container)
+                                    .find('.ql-editor[contenteditable]')
+                                    .attr('data-field', fieldName)
+                                    .attr('data-editor-id', editorID)
+                                    .attr('with-shortcuts', 1);
+
+                            })
+                        },
+                        initLoadAppointments: function () {
+                            if (this.appointmentsLoaded) return false;
+                            this.loadEventDates();
+                        },
+                        loadMeasurements: function () {
+                            $('#measurements-tab').load('/pro-dashboard-measurements-tab', () => {
+                                initMoes();
+                                initFastLoad($('#measurements-tab'));
+                            });
+                        }
+                    },
+                    mounted: function () {
+                        let self = this;
+                        this.calendarElem = $('.pro-dashboard-inline-calendar');
+                        this.calendarElem.datepicker({
+                            dateFormat: 'yy-mm-dd',
+                            onSelect: function (_date) {
+                                self.onDateChange(_date);
+                            },
+                            onChangeMonthYear: function (_year, _month) {
+                                let date = _year + '-' + (_month < 10 ? '0' : '') + _month + '-05';
+                                self.loadEventDates(date);
+                            },
+                            beforeShowDay: function (d) {
+                                if (self.datesWithEvents && self.datesWithEvents.indexOf(self.formatDate(d)) !== -1) {
+                                    return [true, 'has-events'];
+                                }
+                                return [true, 'no-events'];
+                            }
+                        });
+                        // this.calendarElem
+                        //     .on('changeDate', function () {
+                        //         self.onDateChange(self.calendarElem.datepicker('getFormattedDate'));
+                        //     })
+                        //     .on('changeMonth', function () {
+                        //         window.setTimeout(function() {
+                        //             let ts = $('td.day[data-date]').first().closest('tr').find('td.day[data-date]').last().attr('data-date');
+                        //             if(ts) {
+                        //                 self.loadEventDates(ts);
+                        //             }
+                        //         }, 10);
+                        //     });
+
+
+                        $('#pro-dashboard-container').find('[moe][initialized]').removeAttr('initialized');
+                        initMoes();
+
+                        // init fast load
+                        initFastLoad($('#pro-dashboard-container'));
+
+                        $(document)
+                            .off('click', '.dashboard-measurements.pagination a.page-link')
+                            .on('click', '.dashboard-measurements.pagination a.page-link', function () {
+                                $('#measurements-tab').text('Loading...').load('/pro-dashboard-measurements-tab/' + $(this).attr('data-target-page'), () => {
+                                    initMoes();
+                                    initFastLoad($('#measurements-tab'));
+                                });
+                                return false;
+                            });
+
+                        this.loadMeasurements();
+                    }
+                });
+                /*// refresh once ticket popup is closed
+                $('body').off('stag-popup-closed')
+                $('body').on('stag-popup-closed', function() {
+                    if($('#pro-dashboard-container').length) {
+                        let activeTab = $('.nav-link.active[data-tab]').attr('data-tab');
+                        if(activeTab) {
+                            fastLoad('/?tab=' + activeTab);
+                        }
+                    }
+                });*/
+                // ticket-popup
+                $(document)
+                    .off('click', '.ticket-popup-trigger')
+                    .on('click', '.ticket-popup-trigger', function () {
+                        showMask();
+                        window.noMc = true;
+                        $.get(this.href, (_data) => {
+                            $('.ticket-popup').html(_data);
+                            showStagPopup('ticket-popup');
+                            $('.ticket-popup .stag-popup.stag-slide').attr('close-all-with-self', 1);
+                            runMCInitializer('patient-tickets'); // run specific mc initer
+                            hideMask();
+                        });
+                        return false;
+                    });
+
+                $(document)
+                    .off('click', '.ack-client-pro-change')
+                    .on('click', '.ack-client-pro-change', function () {
+                        let trigger = $(this).text('…');
+                        $.post('/api/clientProChange/accept', {
+                            uid: $(this).attr('data-uid')
+                        }, _data => {
+                            if (!hasResponseError(_data)) {
+                                trigger.hide();
+                                let doneElem = $('<i class="text-success fa fa-check"></i>');
+                                doneElem.insertAfter(trigger);
+                                setTimeout(() => {
+                                    let ackContainer = trigger.closest('.ack-container');
+                                    trigger.closest('div').slideUp('fast', function () {
+                                        $(this).remove();
+                                        if (!ackContainer.find('>div').length) {
+                                            ackContainer.remove();
+                                        }
+                                    });
+                                }, 500);
+                            }
+                        }, 'json');
+                        return false;
+                    });
+
+                $(document)
+                    .off('click', '.ack-client-memo')
+                    .on('click', '.ack-client-memo', function () {
+                        let trigger = $(this).text('…');
+                        $.post('/api/clientMemo/stamp', {
+                            uid: $(this).attr('data-uid')
+                        }, _data => {
+                            if (!hasResponseError(_data)) {
+                                trigger.hide();
+                                let doneElem = $('<i class="text-success fa fa-check"></i>');
+                                doneElem.insertAfter(trigger);
+                                setTimeout(() => {
+                                    let tbody = trigger.closest('tbody');
+                                    trigger.closest('tr').remove();
+                                    if (!tbody.find('>tr').length) {
+                                        tbody.closest('.ack-container').remove();
+                                    }
+                                }, 500);
+                            }
+                        }, 'json');
+                        return false;
+                    });
+
+                $(document)
+                    .off('click', '.ack-pro-appt-update')
+                    .on('click', '.ack-pro-appt-update', function () {
+                        let trigger = $(this).text('…');
+                        $.post('/api/appointmentConfirmationDecision/acknowledgeAsAppointmentPro', {
+                            uid: $(this).attr('data-uid')
+                        }, _data => {
+                            if (!hasResponseError(_data)) {
+                                trigger.hide();
+                                let doneElem = $('<i class="text-success fa fa-check"></i>');
+                                doneElem.insertAfter(trigger);
+                                setTimeout(() => {
+                                    let ackContainer = trigger.closest('tbody');
+                                    trigger.closest('tr').slideUp('fast', function () {
+                                        $(this).remove();
+                                        if (!ackContainer.find('>tr').length) {
+                                            ackContainer.remove();
+                                        }
+                                    });
+                                }, 500);
+                            }
+                        }, 'json');
+                        return false;
+                    });
+
+                $(document)
+                    .off('click', '.ack-na-appt-update')
+                    .on('click', '.ack-na-appt-update', function () {
+                        let trigger = $(this).text('…');
+                        $.post('/api/appointmentConfirmationDecision/acknowledgeAsClientDefaultNa', {
+                            uid: $(this).attr('data-uid')
+                        }, _data => {
+                            if (!hasResponseError(_data)) {
+                                trigger.hide();
+                                let doneElem = $('<i class="text-success fa fa-check"></i>');
+                                doneElem.insertAfter(trigger);
+                                setTimeout(() => {
+                                    let ackContainer = trigger.closest('tbody');
+                                    trigger.closest('tr').slideUp('fast', function () {
+                                        $(this).remove();
+                                        if (!ackContainer.find('>tr').length) {
+                                            ackContainer.remove();
+                                        }
+                                    });
+                                }, 500);
+                            }
+                        }, 'json');
+                        return false;
+                    });
+            }
+
+            addMCInitializer('pro-dashboard', init, '#pro-dashboard-container');
+        })();
+    </script>
+@endsection

+ 977 - 0
resources/views/app/dashboard-dna.blade.php

@@ -0,0 +1,977 @@
+@extends ('layouts.template')
+
+@section('content')
+
+    <style>
+        tr.thin th, tr.thin td {
+            padding: 0.25em;
+        }
+    </style>
+
+    <div class="p-3">
+        <div class="">
+            <div class="row mcp-theme-1" id="pro-dashboard-container" v-cloak>
+                <div class="col-md-3 mcp-theme-1">
+                    <div class="mb-4" v-show="tab==='appointments'">
+                        <div class="pro-dashboard-inline-calendar"></div>
+                    </div>
+                    <div class="card mb-4">
+                        <div class="card-header pl-2">
+                            <strong>
+                                Key Numbers
+                            </strong>
+                        </div>
+                        <div class="card-body p-0">
+                            <table class="table mb-0 dashboard-stats-table">
+                                <tbody>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_patients_count_as_mcp()}}</th>
+                                    <th class="pl-2">Patients</th>
+                                </tr>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_new_patients_awaiting_visit_count_as_mcp()}}</th>
+                                    <th class="pl-2">New Patients Awaiting Visit</th>
+                                </tr>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_notes_pending_signature_count_as_mcp()}}</th>
+                                    <th class="pl-2">Notes Pending Signature</th>
+                                </tr>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_notes_pending_billing_count_as_mcp()}}</th>
+                                    <th class="pl-2">Notes Pending Billing</th>
+                                </tr>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_incoming_reports_pending_signature_count_as_mcp()}}</th>
+                                    <th class="pl-2">Reports Pending Signature</th>
+                                </tr>
+
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_patients_without_appointment_count_as_mcp()}}</th>
+                                    <th class="pl-2">Patients w/o Appointments</th>
+                                </tr>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_patients_not_seen_in_45_days_count_as_mcp()}}</th>
+                                    <th class="pl-2">Patients Not Seen in 45 Days</th>
+                                </tr>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_cancelled_appointments_pending_acknowledgement_count_as_mcp()}}</th>
+                                    <th class="pl-2">Cancelled Appts. Pending Review</th>
+                                </tr>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_cancelled_bills_awaiting_review_count_as_mcp()}}</th>
+                                    <th class="pl-2">Cancelled Bills Pending Review</th>
+                                </tr>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_cancelled_supply_orders_awaiting_review_count_as_mcp()}}</th>
+                                    <th class="pl-2">Cancelled Supply Orders Pending Review</th>
+                                </tr>
+
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_erx_and_orders_awaiting_signature_count_as_mcp()}}</th>
+                                    <th class="pl-2">ERx & Orders Pending Signature</th>
+                                </tr>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_supply_orders_awaiting_signature_count_as_mcp()}}</th>
+                                    <th class="pl-2">Supply Orders Pending Signature</th>
+                                </tr>
+                                </tbody>
+                            </table>
+                        </div>
+                    </div>
+                    <div class="card mb-4">
+                        <div class="card-header pl-2">
+                            <strong>
+                                Remote Monitoring: {{friendly_month(date('Y-m-d'))}}
+                            </strong>
+                        </div>
+                        <div class="card-body p-0">
+                            <table class="table mb-0 dashboard-stats-table">
+                                <tbody>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_measurements_awaiting_review_count_as_mcp() ?? '-'}}</th>
+                                    <th class="pl-2">Measurements Pending Review</th>
+                                </tr>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_patients_without_remote_measurement_in_48_hours_count_as_mcp() ?? '-'}}</th>
+                                    <th class="pl-2">Patients w/o Measurement in 48 hrs.</th>
+                                </tr>
+                                </tbody>
+                            </table>
+                        </div>
+                    </div>
+                    <div class="card mb-4">
+                        <div class="card-header pl-2">
+                            <strong>
+                                Practice Management
+                            </strong>
+                        </div>
+                        <div class="card-body p-0">
+                            <table class="table mb-0 dashboard-stats-table">
+                                <tbody>
+                                <tr>
+                                    <th colspan="2">Revenue Cycle Management</th>
+                                </tr>
+                                <tr class="thin">
+                                    <th class="font-weight-normal px-2 pl-4">
+                                        ${{friendly_money($reimbursement['currentBalance'])}}</th>
+                                    <th class="font-weight-normal pl-2 w-100"><a
+                                            href="/practice-management/financial-transactions">Current balance</a></th>
+                                </tr>
+                                <!-- <tr>
+                                    <th class="px-2">{{friendly_date_time($reimbursement['nextPaymentDate'], false)}}</th>
+                                    <th class="pl-2">Next Payment Date</th>
+                                </tr> -->
+                                <tr class="thin">
+                                    <th class="font-weight-normal px-2 pl-4">${{friendly_money($reimbursement['nextPaymentAmount'])}}</th>
+                                    <th class="font-weight-normal pl-2"><a
+                                            href="/practice-management/bills-under-processing">Processing</a></th>
+                                </tr>
+                                <tr class="thin">
+                                    <th class="font-weight-normal px-2 pl-5">${{friendly_money($reimbursement['nextPaymentAmount'])}}</th>
+                                    <th class="font-weight-normal pl-2"><a
+                                            href="/practice-management/bills-under-processing">Treatment Services</a></th>
+                                </tr>
+                                <tr class="thin">
+                                    <th class="font-weight-normal px-2 pl-5">${{friendly_money($reimbursement['nextPaymentAmount'])}}</th>
+                                    <th class="font-weight-normal pl-2"><a
+                                            href="/practice-management/bills-under-processing">Remote Monitoring</a></th>
+                                </tr>
+                                <tr class="thin">
+                                    <th class="font-weight-normal px-2 pl-5">${{friendly_money($reimbursement['nextPaymentAmount'])}}</th>
+                                    <th class="font-weight-normal pl-2"><a
+                                            href="/practice-management/bills-under-processing">Other Services</a></th>
+                                </tr>
+                                {{--
+                                <tr>
+                                    <th class="px-2">{{$reimbursement['lastPayment']}}</th>
+                                    <th class="pl-2"><a href="/practice-management/financial-transactions">Last payment</a></th>
+                                </tr>
+                                <tr>
+                                    <th class="px-2">{{friendly_date_time($reimbursement['lastPaymentDate'], false)}}</th>
+                                    <th class="pl-2"><a href="/practice-management/financial-transactions">Last payment date</a></th>
+                                </tr>
+                                --}}
+                                </tbody>
+                            </table>
+                        </div>
+                    </div>
+                    @if($pro->pro_type === 'ADMIN')
+                        <div class="card mb-4">
+                            <div class="card-header pl-2">
+                                <strong>
+                                    Bills &amp; Claims
+                                </strong>
+                            </div>
+                            <div class="card-body p-0">
+                                <table class="table mb-0 dashboard-stats-table">
+                                    <tbody>
+
+                                    <tr>
+                                        <th class="border-top-1 px-2 text-center">{{$businessNumbers['notesWithBillsToResolve']}}</th>
+                                        <th class="border-top-1 pl-2">
+                                            <a href="/practice-management/billing-manager">Notes with bills to
+                                                resolve</a>
+                                        </th>
+                                    </tr>
+                                    <tr>
+                                        <th class="border-top-1 px-2 text-center">{{$businessNumbers['notesPendingBillingClosure']}}</th>
+                                        <th class="border-top-1 pl-2">
+                                            <a href="/practice-management/billing-manager">Notes pending billing
+                                                closure</a>
+                                        </th>
+                                    </tr>
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div>
+                    @endif
+                </div>
+                <div class="col-md-9">
+
+                    <div class="row">
+                        <div class="col-6">
+
+                            <!-- Appointment Updates -->
+                            @if(count($proApptUpdates))
+                                <div class="mb-3 border rounded px-3 py-2 ack-container">
+                                    <p class="pt-1 mb-2"><b>Appointment Updates</b></p>
+                                    <table class="table table-sm table-hover table-bordered mb-0">
+                                        <thead>
+                                        <tr>
+                                            <th>Client</th>
+                                            <th>Appt. Date/Time</th>
+                                            <th>Status</th>
+                                            <th></th>
+                                        </tr>
+                                        </thead>
+                                        <tbody>
+                                        @foreach($proApptUpdates as $update)
+                                            <tr>
+                                                <td>{{$update->name_first}} {{$update->name_last}}</td>
+                                                <td>{{friendlier_date_time($update->start_time)}}</td>
+                                                <td>{{$update->status}}</td>
+                                                <td><a href="#" class="ack-pro-appt-update" data-uid="{{$update->uid}}">Acknowledge</a>
+                                                </td>
+                                            </tr>
+                                        @endforeach
+                                        </tbody>
+                                    </table>
+                                </div>
+                            @endif
+
+                            @if(count($naApptUpdates))
+                                <div class="mb-3 border rounded px-3 py-2 ack-container">
+                                    <p class="pt-1 mb-2"><b>Appointment Updates</b></p>
+                                    <table class="table table-sm table-hover table-bordered mb-0">
+                                        <thead>
+                                        <tr>
+                                            <th>Client</th>
+                                            <th>Pro</th>
+                                            <th>Appt. Date/Time</th>
+                                            <th>Status</th>
+                                            <th></th>
+                                        </tr>
+                                        </thead>
+                                        <tbody>
+                                        @foreach($naApptUpdates as $update)
+                                            <tr>
+                                                <td>{{$update->name_first}} {{$update->name_last}}</td>
+                                                <td>{{$update->pro_name_first}} {{$update->pro_name_last}}</td>
+                                                <td>{{friendlier_date_time($update->start_time)}}</td>
+                                                <td>{{$update->status}}</td>
+                                                <td><a href="#" class="ack-na-appt-update" data-uid="{{$update->uid}}">Acknowledge</a>
+                                                </td>
+                                            </tr>
+                                        @endforeach
+                                        </tbody>
+                                    </table>
+                                </div>
+                            @endif
+
+                        <!-- new associations -->
+                            @if(count($newMCPAssociations))
+                                <div class="mb-3 border rounded px-3 py-2 ack-container">
+                                    <p class="pt-1 mb-2"><b>New Patients</b></p>
+                                    @foreach($newMCPAssociations as $assoc)
+                                        <div class="d-flex align-items-start bg-light mb-2 px-2 py-1">
+                                            <div class="flex-grow-1">
+                                                You are now the MCP for
+                                                <a href="/patients/view/{{$assoc->patient->uid}}"
+                                                   class="">{{$assoc->patient->displayName()}}</a>
+                                                <?php $nextAppt = $assoc->patient->nextAppointment(); ?>
+                                                @if($nextAppt)
+                                                    <div class="font-size-11">
+                                                        <span class="text-secondary font-size-11">Appt.</span>
+                                                        {{$nextAppt->pro->displayName()}}
+                                                        <span class="text-secondary font-size-11">on</span>
+                                                        {{friendlier_date_time($nextAppt->raw_date . ' ' . $nextAppt->raw_start_time)}}
+                                                    </div>
+                                                    @if($nextAppt->status === 'CREATED')
+                                                        <div
+                                                            class="text-warning-mellow font-weight-bold font-size-11 mt-1">
+                                                            <i class="fa fa-exclamation-triangle"></i>
+                                                            Confirmation pending
+                                                        </div>
+                                                    @endif
+                                                    @if($nextAppt->status === 'CONFIRMED')
+                                                        <div class="text-success font-weight-bold font-size-11 mt-1">
+                                                            <i class="fa fa-check"></i>
+                                                            Confirmed by the patient
+                                                        </div>
+                                                    @endif
+                                                    @if($nextAppt->status === 'REJECTED')
+                                                        <div class="text-danger font-weight-bold font-size-11 mt-1">
+                                                            <i class="fa fa-stop"></i>
+                                                            Rejected by the patient
+                                                        </div>
+                                                    @endif
+                                                @endif
+                                            </div>
+                                            <a href="#" class="ack-client-pro-change ml-3" data-uid="{{$assoc->uid}}">Stamp</a>
+                                        </div>
+                                    @endforeach
+                                </div>
+                            @endif
+
+                            @if(count($newNAAssociations))
+                                <div class="mb-3 border rounded px-3 py-2 ack-container">
+                                    <p class="pt-1 mb-2"><b>New Patients</b></p>
+                                    @foreach($newNAAssociations as $assoc)
+                                        <div class="d-flex align-items-start bg-light mb-2 px-2 py-1">
+                                            <div class="flex-grow-1">
+                                                You are now the Care Coordinator for
+                                                <a href="/patients/view/{{$assoc->patient->uid}}"
+                                                   class="">{{$assoc->patient->displayName()}}</a>
+                                                <?php $nextAppt = $assoc->patient->nextAppointment(); ?>
+                                                @if($nextAppt)
+                                                    <div class="font-size-11">
+                                                        <span class="text-secondary font-size-11">Appt.</span>
+                                                        {{$nextAppt->pro->displayName()}}
+                                                        <span class="text-secondary font-size-11">on</span>
+                                                        {{friendlier_date_time($nextAppt->raw_date . ' ' . $nextAppt->raw_start_time)}}
+                                                    </div>
+                                                    @if($nextAppt->status === 'CREATED')
+                                                        <div
+                                                            class="text-warning-mellow font-weight-bold font-size-11 mt-1">
+                                                            <i class="fa fa-exclamation-triangle"></i>
+                                                            Confirmation pending
+                                                        </div>
+                                                    @endif
+                                                    @if($nextAppt->status === 'CONFIRMED')
+                                                        <div class="text-success font-weight-bold font-size-11 mt-1">
+                                                            <i class="fa fa-check"></i>
+                                                            Confirmed by the patient
+                                                        </div>
+                                                    @endif
+                                                    @if($nextAppt->status === 'REJECTED')
+                                                        <div class="text-danger font-weight-bold font-size-11 mt-1">
+                                                            <i class="fa fa-stop"></i>
+                                                            Rejected by the patient
+                                                        </div>
+                                                    @endif
+                                                @endif
+                                            </div>
+                                            <a href="#" class="ack-client-pro-change"
+                                               data-uid="{{$assoc->uid}}">Stamp</a>
+                                        </div>
+                                    @endforeach
+                                </div>
+                            @endif
+                        </div>
+                        <div class="col-6">
+                            @if(count($mcpClientMemos))
+                                <div class="mb-3 border rounded px-3 py-2 ack-container">
+                                    <p class="pt-1 mb-2"><b>New Patients Memos (MCP)</b></p>
+                                    <table class="table table-sm table-hover table-bordered">
+                                        <thead>
+                                        <tr>
+                                            <th>Patient</th>
+                                            <th>Memo</th>
+                                            <th>Created</th>
+                                            <th></th>
+                                        </tr>
+                                        </thead>
+                                        <tbody>
+                                        @foreach($mcpClientMemos as $memo)
+                                            <tr>
+                                                <td class="">
+                                                    <a href="/patients/view/{{$memo->client_uid}}">{{$memo->name_first}} {{$memo->name_last}}</a>
+                                                </td>
+                                                <td>{!! $memo->content !!}</td>
+                                                <td class="text-nowrap">{{friendlier_date_time($memo->created_at)}}</td>
+                                                <td><a href="#" class="ack-client-memo"
+                                                       data-uid="{{$memo->uid}}">Stamp</a></td>
+                                            </tr>
+                                        @endforeach
+                                        </tbody>
+                                    </table>
+                                </div>
+                            @endif
+                            @if(count($naClientMemos))
+                                <div class="mb-3 border rounded px-3 py-2 ack-container">
+                                    <p class="pt-1 mb-2"><b>New Patients Memos (NA)</b></p>
+                                    <table class="table table-sm table-hover table-bordered">
+                                        <thead>
+                                        <tr>
+                                            <th>Patient</th>
+                                            <th>Memo</th>
+                                            <th>Created</th>
+                                            <th></th>
+                                        </tr>
+                                        </thead>
+                                        <tbody>
+                                        @foreach($naClientMemos as $memo)
+                                            <tr>
+                                                <td class="">
+                                                    <a href="/patients/view/{{$memo->client_uid}}">{{$memo->name_first}} {{$memo->name_last}}</a>
+                                                </td>
+                                                <td>{!! $memo->content !!}</td>
+                                                <td class="text-nowrap">{{friendlier_date_time($memo->created_at)}}</td>
+                                                <td><a href="#" class="ack-client-memo"
+                                                       data-uid="{{$memo->uid}}">Stamp</a></td>
+                                            </tr>
+                                        @endforeach
+                                        </tbody>
+                                    </table>
+                                </div>
+                            @endif
+                        </div>
+                    </div>
+
+                    <ul class="nav nav-tabs">
+                        <li class="nav-item">
+                            <a native data-tab="appointments" class="nav-link"
+                               :class="tab == 'appointments' ? 'active' : ''" href="#"
+                               v-on:click.prevent="tab='appointments'; initLoadAppointments();">
+                                Appointments
+                            </a>
+                        </li>
+                        <li class="nav-item">
+                            <a native data-tab="measurements" class="nav-link"
+                               :class="tab == 'measurements' ? 'active' : ''" href="#"
+                               v-on:click.prevent="tab='measurements'; loadMeasurements();">
+                                Measurements
+                            </a>
+                        </li>
+                        <li class="nav-item">
+                            <a native data-tab="incoming_reports"
+                               class="nav-link {{count($incomingReports) ? 'text-danger font-weight-bold' : ''}}"
+                               :class="tab == 'incoming_reports' ? 'active' : ''" href="#"
+                               v-on:click.prevent="tab='incoming_reports'">
+                                Incoming Reports ({{count($incomingReports)}})
+                            </a>
+                        </li>
+                        <li class="nav-item">
+                            <a native data-tab="erx" class="nav-link {{$numERx ? 'text-danger font-weight-bold' : ''}}"
+                               :class="tab == 'erx' ? 'active' : ''" href="#"
+                               v-on:click.prevent="tab='erx'">
+                                ERx ({{$numERx}})
+                            </a>
+                        </li>
+                        <li class="nav-item">
+                            <a native data-tab="labs"
+                               class="nav-link {{$numLabs ? 'text-danger font-weight-bold' : ''}}"
+                               :class="tab == 'labs' ? 'active' : ''" href="#"
+                               v-on:click.prevent="tab='labs'">
+                                Labs ({{$numLabs}})
+                            </a>
+                        </li>
+                        <li class="nav-item">
+                            <a native data-tab="imaging"
+                               class="nav-link {{$numImaging ? 'text-danger font-weight-bold' : ''}}"
+                               :class="tab == 'imaging' ? 'active' : ''" href="#"
+                               v-on:click.prevent="tab='imaging'">
+                                Imaging ({{$numImaging}})
+                            </a>
+                        </li>
+                        <li class="nav-item">
+                            <a native data-tab="supply_orders"
+                               class="nav-link {{$numSupplyOrders ? 'text-danger font-weight-bold' : ''}}"
+                               :class="tab == 'supply_orders' ? 'active' : ''" href="#"
+                               v-on:click.prevent="tab='supply_orders'">
+                                Supply Orders ({{$numSupplyOrders}})
+                            </a>
+                        </li>
+                    </ul>
+
+                    <div class="border-left border-right border-bottom p-3">
+                        <div v-show="tab==='appointments'" class="appointments-tab">
+                            <div v-show="selectedDate">
+                                <div class="d-flex align-items-end mb-3">
+                                    <b class="large"><span class="text-secondary">Today:</span> @{{ selectedDate }}</b>
+                                    <div class="ml-auto d-inline-flex align-items-center">
+                                        <label class="text-secondary mr-2 my-0 text-nowrap">Filter by status:</label>
+                                        <select v-model="filterStatus"
+                                                class="form-control form-control-sm">
+                                            <option value="">All</option>
+                                            <option value="CREATED">Created</option>
+                                            <option value="CONFIRMED">Confirmed</option>
+                                            <option value="CANCELLED">Cancelled</option>
+                                            <option value="COMPLETED">Completed</option>
+                                            <option value="ABANDONED">Abandoned</option>
+                                        </select>
+                                    </div>
+                                </div>
+                                <div v-for="event in events" class="align-items-end p-3 border rounded mb-3"
+                                     :class="(event.dateYMD === selectedDate && (filterStatus === '' || filterStatus === event.status) ? 'd-flex' : 'd-none') + ' ' + (event.isClientShadowOfPro ? 'training-event' : '')">
+                                    <div class="patient-avatar mr-3 align-self-center">
+                                        <i v-if="event.isClientShadowOfPro" class="fa fa-graduation-cap training-icon"
+                                           :title="event.proInitials"></i>
+                                        <span v-else class="">@{{ event.proInitials }}</span>
+                                    </div>
+                                    <div>
+                                        <div class="pb-1">
+                                            <b class="text-info">@{{ event.proName }}</b>
+                                            &nbsp;/&nbsp;
+                                            @{{ event.friendlyStartTime }} - @{{ event.friendlyEndTime }} <span
+                                                class="text-secondary">@{{ event.timezone }}</span>
+                                            &nbsp;/&nbsp;
+                                            <span class="d-inline-block ml- 2 text-secondary font-weight-bold">@{{ event.title }}</span>
+                                        </div>
+                                        <div class="pb-1">
+                                            <a :href="'/patients/view/' + event.clientUid" class="font-weight-bold">@{{
+                                                event.clientName }}</a>
+                                            <span class="small d-inline-block pl-2 text-secondary font-weight-normal">@{{ event.clientSummary }}</span>
+                                        </div>
+                                        <div class="d-flex align-items-baseline">
+                                            <div v-if="event.status === 'CREATED'"
+                                                 class="text-warning-mellow font-weight-bold">
+                                                <i class="fa fa-exclamation-triangle"></i>
+                                                Confirmation pending
+                                            </div>
+                                            <div v-else-if="event.status === 'CONFIRMED'"
+                                                 class="text-success font-weight-bold">
+                                                <i class="fa fa-check"></i>
+                                                Confirmed by the patient
+                                            </div>
+                                            <div v-else-if="event.status === 'REJECTED'"
+                                                 class="text-danger font-weight-bold">
+                                                <i class="fa fa-stop"></i>
+                                                Rejected by the patient
+                                            </div>
+                                            <div v-else class="text-secondary">
+                                                Status: <b>@{{ event.status }}</b>
+                                            </div>
+                                            <span class="mx-2 text-secondary">|</span>
+                                            <a :href="'/patients/view/' + event.clientUid + '/calendar/' + event.uid">
+                                                <i class="fa fa-edit"></i>
+                                                Edit Appointment
+                                            </a>
+                                        </div>
+                                        <div class="mt-1"
+                                             :class="event.coverage !== 'YES' ? (event.coverage === 'NO' ? 'text-danger' : 'text-warning-mellow') : 'text-success'">
+                                            Coverage Status: <b>@{{ event.coverage }}</b>
+                                        </div>
+                                    </div>
+                                    <div class="ml-auto">
+                                        <select v-model="event.newStatus"
+                                                class="form-control form-control-sm bg-light"
+                                                v-on:change="updateStatus(event)">
+                                            <option value="CREATED">CREATED</option>
+                                            <option value="CONFIRMED">CONFIRMED</option>
+                                            <option value="CANCELLED">CANCELLED</option>
+                                            <option value="COMPLETED">COMPLETED</option>
+                                            <option value="ABANDONED">ABANDONED</option>
+                                        </select>
+                                        <div v-if="selectedDate === '{{ date('Y-m-d') }}'"
+                                             class="pt-1 text-right"
+                                             :class="event.started ? 'text-danger': 'text-secondary'">
+                                            @{{ event.inHowManyHours }}
+                                        </div>
+                                    </div>
+                                </div>
+                                <div v-if="numEventsForDate === 0" class="bg-light p-3 text-secondary border bounded">
+                                    <span
+                                        v-if="filterStatus === ''">You have no appointments on <b>@{{ selectedDate }}</b></span>
+                                    <span
+                                        v-if="filterStatus !== ''">You have no appointments on <b>@{{ selectedDate }}</b> with status <b>@{{ filterStatus }}</b></span>
+                                </div>
+                            </div>
+                            <div v-show="!selectedDate" class="bg-light p-3 text-secondary border bounded">
+                                Please select a date from the calendar on the left
+                            </div>
+                        </div>
+                        <div v-show="tab==='measurements'">
+                            <div id="measurements-tab">Loading...</div>
+                        </div>
+                        <div v-show="tab==='incoming_reports'">
+                            @include('app.dashboard.incoming_reports')
+                        </div>
+                        <div v-show="tab==='erx'">
+                            @include('app.dashboard.erx')
+                        </div>
+                        <div v-show="tab==='labs'">
+                            @include('app.dashboard.labs')
+                        </div>
+                        <div v-show="tab==='imaging'">
+                            @include('app.dashboard.imaging')
+                        </div>
+                        <div v-show="tab==='supply_orders'">
+                            @include('app.dashboard.supply_orders')
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <div class="stag-popup stag-popup-md ticket-popup mcp-theme-1" stag-popup-key="ticket-popup"></div>
+
+    <script>
+        (function () {
+            function init() {
+                window.apapp = new Vue({
+                    el: '#pro-dashboard-container',
+                    delimiters: ['@{{', '}}'],
+                    data: {
+                        tab: '{{ request()->input('tab') ? request()->input('tab') : 'measurements' }}',
+                        datesWithEvents: [],
+                        selectedDate: '{{ date('Y-m-d') }}',
+                        selectedStatus: 'CREATED',
+                        events: [],
+                        numEventsForDate: 0,
+                        filterStatus: '',
+                        calendarElem: null,
+                        currentMonth: null,
+                        currentYear: null,
+                        measurementFilterStatus: 'ALL',
+                        measurements: {!! $pro->pro_type === 'ADMIN' ? '[]' : json_encode($pro->getMeasurements()) !!},
+                        appointmentsLoaded: false,
+                    },
+                    methods: {
+                        formatDate: function (date) {
+                            let d = new Date(date),
+                                month = '' + (d.getMonth() + 1),
+                                day = '' + d.getDate(),
+                                year = d.getFullYear();
+
+                            if (month.length < 2)
+                                month = '0' + month;
+                            if (day.length < 2)
+                                day = '0' + day;
+
+                            return [year, month, day].join('-');
+                        },
+                        onDateChange: function (_newDate) {
+                            let self = this;
+                            window.setTimeout(() => {
+                                // let dayValue = $('.pro-dashboard-inline-calendar td.day.active').first().text();
+                                // if(dayValue.length === 1) dayValue = '0' + dayValue;
+                                // self.selectedDate = _newDate.substr(0, 8) + dayValue;
+                                self.selectedDate = _newDate;
+                                showMask();
+                                self.loadEvents(self.selectedDate, function () {
+                                    hideMask();
+                                    Vue.nextTick(() => {
+                                        // self.highlightDatesWithEvents(self.datesWithEvents);
+                                        initFastLoad($('.appointments-tab'));
+                                    });
+                                });
+                            }, 25);
+                        },
+                        selectToday: function () {
+                            $('.pro-dashboard-inline-calendar table td[data-date]').removeClass('active');
+                            $('.pro-dashboard-inline-calendar table td[data-date="{{ $milliseconds }}"]')
+                                .addClass('active');
+                            // this.onDateChange('{{ date('Y-m-d') }}');
+                        },
+                        highlightDatesWithEvents: function (_dates) {
+                            $('.pro-dashboard-inline-calendar table td[data-date]').removeAttr('has-events');
+                            for (let i = 0; i < _dates.length; i++) {
+                                $('.pro-dashboard-inline-calendar table td[data-date="' + _dates[i] + '"]')
+                                    .attr('has-events', 1);
+                            }
+                        },
+                        updateStatus: function (_event) {
+                            $.post('/api/appointment/updateStatus', {
+                                uid: _event.uid,
+                                status: _event.newStatus
+                            }, function (_data) {
+                                if (!_data) {
+                                    toastr.error('Unable to update appointment status!');
+                                } else {
+                                    if (!_data.success) {
+                                        toastr.error(_data.message);
+                                    } else {
+                                        _event.status = _event.newStatus;
+                                        toastr.success('The appointment has been updated');
+                                    }
+                                }
+                            }, 'json')
+                        },
+                        showEditForm: function (_trigger) {
+                            let form = $(_trigger).closest('[moe]').find('form').first();
+                            showMoeFormMask();
+                            form.show();
+                            setTimeout(function () {
+                                initPrimaryForm(form);
+                            }, 0);
+                        },
+                        submitEditForm: function (_trigger) {
+                            let form = $(_trigger).closest('[moe]').find('form').first();
+                            if (!form[0].checkValidity()) {
+                                form[0].reportValidity();
+                                return;
+                            }
+                            $.post(form.attr('url'), form.serialize(), function (_data) {
+                                if (_data && _data.success) {
+                                    fastReload();
+                                } else {
+                                    if (_data.message) {
+                                        toastr.error(_data.message);
+                                    } else {
+                                        toastr.error('Unable to update the appointment');
+                                    }
+                                }
+                            });
+                        },
+                        cancelEditForm: function (_trigger) {
+                            let form = $(_trigger).closest('[moe]').find('form').first();
+                            hideMoeFormMask();
+                            form.hide();
+                        },
+                        loadEventDates: function (_refDate = false) {
+                            let today = new Date(_refDate ? _refDate : '{{date('Y-m-d')}}'),
+                                firstOfMonth = new Date(today.getFullYear(), today.getMonth(), 1),
+                                lastOfMonth = new Date(today.getFullYear(), today.getMonth() + 1, 0);
+
+                            this.selectedDate = null;
+                            $('td.day.active').removeClass('active');
+
+                            $.get('/pro-dashboard-event-dates/' +
+                                this.formatDate(firstOfMonth) + '/' +
+                                this.formatDate(lastOfMonth), (_data) => {
+                                this.datesWithEvents = _data;
+                                console.log(this.datesWithEvents);
+                                this.calendarElem.datepicker('refresh');
+                                // this.highlightDatesWithEvents(this.datesWithEvents);
+
+                                this.currentMonth = firstOfMonth.getMonth();
+                                this.currentYear = firstOfMonth.getFullYear();
+
+                                if (!_refDate && $('td.day[data-date="{{$milliseconds}}"]:visible').length) {
+                                    $('td.day[data-date="{{$milliseconds}}"]:visible').first().click();
+                                }
+
+                                this.appointmentsLoaded = true;
+                            }, 'json');
+                        },
+                        loadEvents: function (_date, _callback) {
+                            let self = this;
+                            $.get('/pro-dashboard-events/' + _date + '/' + _date, function (_data) {
+                                self.events = _data;
+                                self.numEventsForDate = (_data && _data.length) ? 1 : 0;
+                                _callback.call(self);
+                            }, 'json');
+                        },
+                        updateMeasurements: function () {
+                            $.get('/pro-dashboard-measurements/' + this.measurementFilterStatus, (_data) => {
+                                this.measurements = _data;
+                                Vue.nextTick(() => {
+                                    // this.initCMRTE();
+                                    $('#pro-dashboard-container').find('[moe][initialized]').removeAttr('initialized');
+                                    initMoes();
+                                });
+                            }, 'json');
+                        },
+                        setMeasurementStatus: function (_uid, _status) {
+                            $.post('/api/measurement/updateStatus', {
+                                uid: _uid,
+                                status: _status
+                            }, (_data) => {
+                                this.updateMeasurements();
+                            }, 'json');
+                        },
+                        initCMRTE: function () {
+                            $('#pro-dashboard-container [cm-rte]').each(function () {
+
+                                $(this).wrap(
+                                    $('<div class="border-left border-right rte-holder"/>')
+                                        .attr('data-shortcuts', '')
+                                );
+
+                                // give a unique id to this editor instance
+                                var editorID = Math.ceil(Math.random() * 99999), fieldName = $(this).attr('data-name');
+
+                                var el = this;
+                                var existingContent = $(el).attr('data-content');
+                                var quill = new Quill(el, {
+                                    theme: 'snow',
+                                    modules: stagQuillConfig
+                                });
+
+                                var toolbar = $(quill.container).prev('.ql-toolbar');
+
+                                // add button for new shortcut
+                                var newSCButton = $('<button class="btn bg-white btn-sm btn-default text-primary w-auto px-2 border py-0 ' +
+                                    'text-sm add-shortcut" data-editor-id="' + editorID + '">+ Shortcut</button>');
+                                toolbar.append(newSCButton);
+
+                                quill.root.innerHTML = existingContent;
+
+                                $('<input type="hidden" name="' + fieldName + '">').val(existingContent).insertAfter(el);
+
+                                quill.on('text-change', function (delta, oldDelta, source) {
+                                    $(el).next('[name="' + fieldName + '"]').val(quill.root.innerHTML);
+                                });
+
+                                $(quill.container)
+                                    .find('.ql-editor[contenteditable]')
+                                    .attr('data-field', fieldName)
+                                    .attr('data-editor-id', editorID)
+                                    .attr('with-shortcuts', 1);
+
+                            })
+                        },
+                        initLoadAppointments: function () {
+                            if (this.appointmentsLoaded) return false;
+                            this.loadEventDates();
+                        },
+                        loadMeasurements: function () {
+                            $('#measurements-tab').load('/pro-dashboard-measurements-tab', () => {
+                                initMoes();
+                                initFastLoad($('#measurements-tab'));
+                            });
+                        }
+                    },
+                    mounted: function () {
+                        let self = this;
+                        this.calendarElem = $('.pro-dashboard-inline-calendar');
+                        this.calendarElem.datepicker({
+                            dateFormat: 'yy-mm-dd',
+                            onSelect: function (_date) {
+                                self.onDateChange(_date);
+                            },
+                            onChangeMonthYear: function (_year, _month) {
+                                let date = _year + '-' + (_month < 10 ? '0' : '') + _month + '-05';
+                                self.loadEventDates(date);
+                            },
+                            beforeShowDay: function (d) {
+                                if (self.datesWithEvents && self.datesWithEvents.indexOf(self.formatDate(d)) !== -1) {
+                                    return [true, 'has-events'];
+                                }
+                                return [true, 'no-events'];
+                            }
+                        });
+                        // this.calendarElem
+                        //     .on('changeDate', function () {
+                        //         self.onDateChange(self.calendarElem.datepicker('getFormattedDate'));
+                        //     })
+                        //     .on('changeMonth', function () {
+                        //         window.setTimeout(function() {
+                        //             let ts = $('td.day[data-date]').first().closest('tr').find('td.day[data-date]').last().attr('data-date');
+                        //             if(ts) {
+                        //                 self.loadEventDates(ts);
+                        //             }
+                        //         }, 10);
+                        //     });
+
+
+                        $('#pro-dashboard-container').find('[moe][initialized]').removeAttr('initialized');
+                        initMoes();
+
+                        // init fast load
+                        initFastLoad($('#pro-dashboard-container'));
+
+                        $(document)
+                            .off('click', '.dashboard-measurements.pagination a.page-link')
+                            .on('click', '.dashboard-measurements.pagination a.page-link', function () {
+                                $('#measurements-tab').text('Loading...').load('/pro-dashboard-measurements-tab/' + $(this).attr('data-target-page'), () => {
+                                    initMoes();
+                                    initFastLoad($('#measurements-tab'));
+                                });
+                                return false;
+                            });
+
+                        this.loadMeasurements();
+                    }
+                });
+                /*// refresh once ticket popup is closed
+                $('body').off('stag-popup-closed')
+                $('body').on('stag-popup-closed', function() {
+                    if($('#pro-dashboard-container').length) {
+                        let activeTab = $('.nav-link.active[data-tab]').attr('data-tab');
+                        if(activeTab) {
+                            fastLoad('/?tab=' + activeTab);
+                        }
+                    }
+                });*/
+                // ticket-popup
+                $(document)
+                    .off('click', '.ticket-popup-trigger')
+                    .on('click', '.ticket-popup-trigger', function () {
+                        showMask();
+                        window.noMc = true;
+                        $.get(this.href, (_data) => {
+                            $('.ticket-popup').html(_data);
+                            showStagPopup('ticket-popup');
+                            $('.ticket-popup .stag-popup.stag-slide').attr('close-all-with-self', 1);
+                            runMCInitializer('patient-tickets'); // run specific mc initer
+                            hideMask();
+                        });
+                        return false;
+                    });
+
+                $(document)
+                    .off('click', '.ack-client-pro-change')
+                    .on('click', '.ack-client-pro-change', function () {
+                        let trigger = $(this).text('…');
+                        $.post('/api/clientProChange/accept', {
+                            uid: $(this).attr('data-uid')
+                        }, _data => {
+                            if (!hasResponseError(_data)) {
+                                trigger.hide();
+                                let doneElem = $('<i class="text-success fa fa-check"></i>');
+                                doneElem.insertAfter(trigger);
+                                setTimeout(() => {
+                                    let ackContainer = trigger.closest('.ack-container');
+                                    trigger.closest('div').slideUp('fast', function () {
+                                        $(this).remove();
+                                        if (!ackContainer.find('>div').length) {
+                                            ackContainer.remove();
+                                        }
+                                    });
+                                }, 500);
+                            }
+                        }, 'json');
+                        return false;
+                    });
+
+                $(document)
+                    .off('click', '.ack-client-memo')
+                    .on('click', '.ack-client-memo', function () {
+                        let trigger = $(this).text('…');
+                        $.post('/api/clientMemo/stamp', {
+                            uid: $(this).attr('data-uid')
+                        }, _data => {
+                            if (!hasResponseError(_data)) {
+                                trigger.hide();
+                                let doneElem = $('<i class="text-success fa fa-check"></i>');
+                                doneElem.insertAfter(trigger);
+                                setTimeout(() => {
+                                    let tbody = trigger.closest('tbody');
+                                    trigger.closest('tr').remove();
+                                    if (!tbody.find('>tr').length) {
+                                        tbody.closest('.ack-container').remove();
+                                    }
+                                }, 500);
+                            }
+                        }, 'json');
+                        return false;
+                    });
+
+                $(document)
+                    .off('click', '.ack-pro-appt-update')
+                    .on('click', '.ack-pro-appt-update', function () {
+                        let trigger = $(this).text('…');
+                        $.post('/api/appointmentConfirmationDecision/acknowledgeAsAppointmentPro', {
+                            uid: $(this).attr('data-uid')
+                        }, _data => {
+                            if (!hasResponseError(_data)) {
+                                trigger.hide();
+                                let doneElem = $('<i class="text-success fa fa-check"></i>');
+                                doneElem.insertAfter(trigger);
+                                setTimeout(() => {
+                                    let ackContainer = trigger.closest('tbody');
+                                    trigger.closest('tr').slideUp('fast', function () {
+                                        $(this).remove();
+                                        if (!ackContainer.find('>tr').length) {
+                                            ackContainer.remove();
+                                        }
+                                    });
+                                }, 500);
+                            }
+                        }, 'json');
+                        return false;
+                    });
+
+                $(document)
+                    .off('click', '.ack-na-appt-update')
+                    .on('click', '.ack-na-appt-update', function () {
+                        let trigger = $(this).text('…');
+                        $.post('/api/appointmentConfirmationDecision/acknowledgeAsClientDefaultNa', {
+                            uid: $(this).attr('data-uid')
+                        }, _data => {
+                            if (!hasResponseError(_data)) {
+                                trigger.hide();
+                                let doneElem = $('<i class="text-success fa fa-check"></i>');
+                                doneElem.insertAfter(trigger);
+                                setTimeout(() => {
+                                    let ackContainer = trigger.closest('tbody');
+                                    trigger.closest('tr').slideUp('fast', function () {
+                                        $(this).remove();
+                                        if (!ackContainer.find('>tr').length) {
+                                            ackContainer.remove();
+                                        }
+                                    });
+                                }, 500);
+                            }
+                        }, 'json');
+                        return false;
+                    });
+            }
+
+            addMCInitializer('pro-dashboard', init, '#pro-dashboard-container');
+        })();
+    </script>
+@endsection

+ 746 - 0
resources/views/app/dashboard-mcp.blade.php

@@ -0,0 +1,746 @@
+@extends ('layouts.template')
+
+@section('content')
+
+    <style>
+        #dashboard-mcp tr.thin th,
+        #dashboard-mcp tr.thin td,
+        #dashboard-mcp .dashboard-stats-table tr td,
+        #dashboard-mcp .dashboard-stats-table tr th {
+            padding: 0.25em;
+            font-weight: normal;
+        }
+
+        #dashboard-mcp table.appointments tr td {
+            vertical-align: middle;
+        }
+    </style>
+
+    <div id="dashboard-mcp">
+    <div class="p-3">
+        <div class="">
+            <div class="row mcp-theme-1" id="pro-dashboard-container" v-cloak>
+                <div class="col-md-3 mcp-theme-1">
+                    <div class="mb-4">
+                        <div class="pro-dashboard-inline-calendar"></div>
+                    </div>
+                    <div class="card mb-4">
+                        <div class="card-header pl-2">
+                            <strong>
+                                Key Numbers
+                            </strong>
+                        </div>
+                        <div class="card-body p-0">
+                            <table class="table table-sm mb-0 dashboard-stats-table">
+                                <tbody>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_patients_count_as_mcp()}}</th>
+                                    <th class="pl-2">
+                                        <a href="{{ route('mcp.patients') }}">Patients</a>
+                                    </th>
+                                </tr>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_new_patients_awaiting_visit_count_as_mcp()}}</th>
+                                    <th class="pl-2">
+                                        <a href="{{ route('mcp.new_patients_awaiting_visit') }}"
+                                           native target="_blank"
+                                           open-in-stag-popup
+                                           popup-style="tall"
+                                           title="New Patients Awaiting Visit">
+                                            New Patients Awaiting Visit
+                                        </a>
+                                    </th>
+                                </tr>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_notes_pending_signature_count_as_mcp()}}</th>
+                                    <th class="pl-2">
+                                        <a href="{{ route('mcp.notes_pending_signature') }}"
+                                           native target="_blank"
+                                           open-in-stag-popup
+                                           popup-style="tall"
+                                           title="Notes Pending Signature">
+                                            Notes Pending Signature
+                                        </a>
+                                    </th>
+                                </tr>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_notes_pending_billing_count_as_mcp()}}</th>
+                                    <th class="pl-2">
+                                        <a href="{{ route('mcp.notes_pending_billing') }}"
+                                           native target="_blank"
+                                           open-in-stag-popup
+                                           popup-style="tall"
+                                           title="Notes Pending Billing">
+                                            Notes Pending Billing
+                                        </a>
+                                    </th>
+                                </tr>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_incoming_reports_pending_signature_count_as_mcp()}}</th>
+                                    <th class="pl-2">
+                                        <a href="{{ route('mcp.reports_pending_signature') }}"
+                                           native target="_blank"
+                                           open-in-stag-popup
+                                           popup-style="tall"
+                                           title="Reports Pending Signature">
+                                            Reports Pending Signature
+                                        </a>
+                                    </th>
+                                </tr>
+
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_patients_without_appointment_count_as_mcp()}}</th>
+                                    <th class="pl-2">
+                                        <a href="{{ route('mcp.patients_without_appointments') }}"
+                                           native target="_blank"
+                                           open-in-stag-popup
+                                           popup-style="tall"
+                                           title="Patients w/o Appointments">
+                                            Patients w/o Appointments
+                                        </a>
+                                    </th>
+                                </tr>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_patients_overdue_count_as_mcp()}}</th>
+                                    <th class="pl-2">
+                                        <a href="{{ route('mcp.patients_overdue_for_visit') }}"
+                                           native target="_blank"
+                                           open-in-stag-popup
+                                           popup-style="tall"
+                                           title="Patients Overdue for Visit">
+                                            Patients Overdue for Visit
+                                        </a>
+                                    </th>
+                                </tr>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_cancelled_appointments_pending_acknowledgement_count_as_mcp()}}</th>
+                                    <th class="pl-2">
+                                        <a href="{{ route('mcp.cancelled_appointments_pending_review') }}"
+                                           native target="_blank"
+                                           open-in-stag-popup
+                                           popup-style="tall"
+                                           title="Cancelled Appts. Pending Review">
+                                            Cancelled Appts. Pending Review
+                                        </a>
+                                    </th>
+                                </tr>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_cancelled_bills_awaiting_review_count_as_mcp()}}</th>
+                                    <th class="pl-2">
+                                        <a href="{{ route('mcp.cancelled_bills_pending_review') }}"
+                                           native target="_blank"
+                                           open-in-stag-popup
+                                           popup-style="tall"
+                                           title="Cancelled Bills Pending Review">
+                                            Cancelled Bills Pending Review
+                                        </a>
+                                    </th>
+                                </tr>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_cancelled_supply_orders_awaiting_review_count_as_mcp()}}</th>
+                                    <th class="pl-2">
+                                        <a href="{{ route('mcp.cancelled_supply_orders_pending_review') }}"
+                                           native target="_blank"
+                                           open-in-stag-popup
+                                           popup-style="tall"
+                                           title="Cancelled Supply Orders Pending Review">
+                                            Cancelled Supply Orders Pending Review
+                                        </a>
+                                    </th>
+                                </tr>
+
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_erx_and_orders_awaiting_signature_count_as_mcp()}}</th>
+                                    <th class="pl-2">
+                                        <a href="{{ route('mcp.erx_and_orders_pending_signature') }}"
+                                           native target="_blank"
+                                           open-in-stag-popup
+                                           popup-style="tall"
+                                           title="ERx & Orders Pending Signature">
+                                            ERx & Orders Pending Signature
+                                        </a>
+                                    </th>
+                                </tr>
+                                <tr>
+                                    <th class="px-2 text-center">{{$pro->get_supply_orders_awaiting_signature_count_as_mcp()}}</th>
+                                    <th class="pl-2">
+                                        <a href="{{ route('mcp.supply_orders_pending_signature') }}"
+                                           native target="_blank"
+                                           open-in-stag-popup
+                                           popup-style="tall"
+                                           title="Supply Orders Pending Signature">
+                                            Supply Orders Pending Signature
+                                        </a>
+                                    </th>
+                                </tr>
+                                </tbody>
+                            </table>
+                        </div>
+                    </div>
+                    <div class="card mb-4">
+                        <div class="card-header pl-2">
+                            <strong>
+                                Remote Monitoring: {{friendly_month(date('Y-m-d'))}}
+                            </strong>
+                        </div>
+                        <div class="card-body p-0">
+                            <table class="table mb-0 dashboard-stats-table">
+                                <tbody>
+                                <tr class="thin">
+                                    <th class="px-2 text-center">{{$pro->get_measurements_awaiting_review_count_as_mcp() ?? '-'}}</th>
+                                    <th class="pl-2">Measurements Pending Review</th>
+                                </tr>
+                                <tr class="thin">
+                                    <th class="px-2 text-center">{{$pro->get_patients_without_remote_measurement_in_48_hours_count_as_mcp() ?? '-'}}</th>
+                                    <th class="pl-2">Patients w/o Measurement in 48 hrs.</th>
+                                </tr>
+                                </tbody>
+                            </table>
+                        </div>
+                    </div>
+                    <div class="card mb-4">
+                        <div class="card-header pl-2">
+                            <strong>
+                                Practice Management
+                            </strong>
+                        </div>
+                        <div class="card-body p-0">
+                            <table class="table mb-0 dashboard-stats-table">
+                                <tbody>
+                                <tr class="thin">
+                                    <th colspan="2" class="font-weight-normal px-2 pl-2">Billing & Reimbursement</th>
+                                </tr>
+                                <tr class="thin">
+                                    <th class="font-weight-normal px-2 pl-4">{{friendly_date_time($reimbursement['nextPaymentDate'], false)}}</th>
+                                    <th class="font-weight-normal pl-2">Next Payment Date</th>
+                                </tr>
+                                <tr class="thin">
+                                    <th class="font-weight-normal px-2 pl-4">
+                                        ${{friendly_money($reimbursement['currentBalance'])}}</th>
+                                    <th class="font-weight-normal pl-2 w-100"><a
+                                            href="/practice-management/financial-transactions">Current balance</a></th>
+                                </tr>
+                                <tr class="thin">
+                                    <th class="font-weight-normal px-2 pl-4">
+                                        ${{friendly_money($reimbursement['nextPaymentAmount'])}}</th>
+                                    <th class="font-weight-normal pl-2"><a
+                                            href="/practice-management/bills-under-processing">Processing</a></th>
+                                </tr>
+                                <tr class="thin">
+                                    <th class="font-weight-normal px-2 pl-5">
+                                        ${{friendly_money($reimbursement['nextPaymentAmount'])}}</th>
+                                    <th class="font-weight-normal pl-2"><a
+                                            href="/practice-management/bills-under-processing">Treatment Services</a>
+                                    </th>
+                                </tr>
+                                <tr class="thin">
+                                    <th class="font-weight-normal px-2 pl-5">
+                                        ${{friendly_money($reimbursement['nextPaymentAmount'])}}</th>
+                                    <th class="font-weight-normal pl-2"><a
+                                            href="/practice-management/bills-under-processing">Remote Monitoring</a>
+                                    </th>
+                                </tr>
+                                <tr class="thin">
+                                    <th class="font-weight-normal px-2 pl-5">
+                                        ${{friendly_money($reimbursement['nextPaymentAmount'])}}</th>
+                                    <th class="font-weight-normal pl-2"><a
+                                            href="/practice-management/bills-under-processing">Other Services</a></th>
+                                </tr>
+                                {{--
+                                <tr>
+                                    <th class="px-2">{{$reimbursement['lastPayment']}}</th>
+                                    <th class="pl-2"><a href="/practice-management/financial-transactions">Last payment</a></th>
+                                </tr>
+                                <tr>
+                                    <th class="px-2">{{friendly_date_time($reimbursement['lastPaymentDate'], false)}}</th>
+                                    <th class="pl-2"><a href="/practice-management/financial-transactions">Last payment date</a></th>
+                                </tr>
+                                --}}
+                                </tbody>
+                            </table>
+                        </div>
+                    </div>
+                </div>
+                <div class="col-md-9">
+
+                    <div class="row mcp-theme-1" id="pro-dashboard-container" v-cloak>
+                        <div class="col-md-6 mcp-theme-1">
+                            <div class="card mb-4">
+                                <div class="card-header pl-2">
+                                    <strong>
+                                        Appointments @{{ formatSelectedDate(selectedDate) }}
+                                    </strong>
+                                </div>
+                                <div class="card-body p-0">
+                                    @include('app.mcp.dashboard.appointments')
+                                </div>
+                            </div>
+                            <div class="card mb-4">
+                                <div class="card-header pl-2">
+                                    <strong>
+                                        Measurements
+                                    </strong>
+                                </div>
+                                <div class="card-body">
+                                    @include('app.mcp.dashboard.measurements')
+                                </div>
+                            </div>
+                        </div>
+                        <div class="col-md-6 mcp-theme-1">
+                            <div class="card mb-4">
+                                <div class="card-header pl-2">
+                                    <strong>
+                                        Notifications
+                                    </strong>
+                                </div>
+                                <div class="card-body">
+                                    @include('app.mcp.dashboard.notifications')
+                                </div>
+                            </div>
+                            <div class="card mb-4">
+                                <div class="card-header pl-2">
+                                    <strong>
+                                        Messages
+                                    </strong>
+                                </div>
+                                <div class="card-body">
+                                    @include('app.mcp.dashboard.messages')
+                                </div>
+                            </div>
+                            <div class="card mb-4">
+                                <div class="card-header pl-2">
+                                    <strong>
+                                        Phone Calls & Memos
+                                    </strong>
+                                </div>
+                                <div class="card-body">
+                                    @include('app.mcp.dashboard.calls_memos')
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    </div>
+
+    <div class="stag-popup stag-popup-md ticket-popup mcp-theme-1" stag-popup-key="ticket-popup"></div>
+
+    <script>
+        (function () {
+            function init() {
+                window.apapp = new Vue({
+                    el: '#pro-dashboard-container',
+                    delimiters: ['@{{', '}}'],
+                    data: {
+                        tab: '{{ request()->input('tab') ? request()->input('tab') : 'measurements' }}',
+                        datesWithEvents: [],
+                        selectedDate: '{{ date('Y-m-d') }}',
+                        selectedStatus: 'CREATED',
+                        events: [],
+                        numEventsForDate: 0,
+                        filterStatus: '',
+                        calendarElem: null,
+                        currentMonth: null,
+                        currentYear: null,
+                        measurementFilterStatus: 'ALL',
+                        measurements: {!! $pro->pro_type === 'ADMIN' ? '[]' : json_encode($pro->getMeasurements()) !!},
+                        appointmentsLoaded: false,
+                    },
+                    methods: {
+                        formatDate: function (date) {
+                            let d = new Date(date),
+                                month = '' + (d.getMonth() + 1),
+                                day = '' + d.getDate(),
+                                year = d.getFullYear();
+
+                            if (month.length < 2)
+                                month = '0' + month;
+                            if (day.length < 2)
+                                day = '0' + day;
+
+                            return [year, month, day].join('-');
+                        },
+                        onDateChange: function (_newDate) {
+                            let self = this;
+                            window.setTimeout(() => {
+                                // let dayValue = $('.pro-dashboard-inline-calendar td.day.active').first().text();
+                                // if(dayValue.length === 1) dayValue = '0' + dayValue;
+                                // self.selectedDate = _newDate.substr(0, 8) + dayValue;
+                                self.selectedDate = _newDate;
+                                showMask();
+                                self.loadEvents(self.selectedDate, function () {
+                                    hideMask();
+                                    Vue.nextTick(() => {
+                                        // self.highlightDatesWithEvents(self.datesWithEvents);
+                                        initFastLoad($('.appointments-tab'));
+                                    });
+                                });
+                            }, 25);
+                        },
+                        selectToday: function () {
+                            $('.pro-dashboard-inline-calendar table td[data-date]').removeClass('active');
+                            $('.pro-dashboard-inline-calendar table td[data-date="{{ $milliseconds }}"]')
+                                .addClass('active');
+                            // this.onDateChange('{{ date('Y-m-d') }}');
+                        },
+                        highlightDatesWithEvents: function (_dates) {
+                            $('.pro-dashboard-inline-calendar table td[data-date]').removeAttr('has-events');
+                            for (let i = 0; i < _dates.length; i++) {
+                                $('.pro-dashboard-inline-calendar table td[data-date="' + _dates[i] + '"]')
+                                    .attr('has-events', 1);
+                            }
+                        },
+                        updateStatus: function (_event) {
+                            $.post('/api/appointment/updateStatus', {
+                                uid: _event.uid,
+                                status: _event.newStatus
+                            }, function (_data) {
+                                if (!_data) {
+                                    toastr.error('Unable to update appointment status!');
+                                } else {
+                                    if (!_data.success) {
+                                        toastr.error(_data.message);
+                                    } else {
+                                        _event.status = _event.newStatus;
+                                        toastr.success('The appointment has been updated');
+                                    }
+                                }
+                            }, 'json')
+                        },
+                        showEditForm: function (_trigger) {
+                            let form = $(_trigger).closest('[moe]').find('form').first();
+                            showMoeFormMask();
+                            form.show();
+                            setTimeout(function () {
+                                initPrimaryForm(form);
+                            }, 0);
+                        },
+                        submitEditForm: function (_trigger) {
+                            let form = $(_trigger).closest('[moe]').find('form').first();
+                            if (!form[0].checkValidity()) {
+                                form[0].reportValidity();
+                                return;
+                            }
+                            $.post(form.attr('url'), form.serialize(), function (_data) {
+                                if (_data && _data.success) {
+                                    fastReload();
+                                } else {
+                                    if (_data.message) {
+                                        toastr.error(_data.message);
+                                    } else {
+                                        toastr.error('Unable to update the appointment');
+                                    }
+                                }
+                            });
+                        },
+                        cancelEditForm: function (_trigger) {
+                            let form = $(_trigger).closest('[moe]').find('form').first();
+                            hideMoeFormMask();
+                            form.hide();
+                        },
+                        loadEventDates: function (_refDate = false) {
+                            let today = new Date(_refDate ? _refDate : '{{date('Y-m-d')}}'),
+                                firstOfMonth = new Date(today.getFullYear(), today.getMonth(), 1),
+                                lastOfMonth = new Date(today.getFullYear(), today.getMonth() + 1, 0);
+
+                            this.selectedDate = null;
+                            $('td.day.active').removeClass('active');
+
+                            $.get('/pro-dashboard-event-dates/' +
+                                this.formatDate(firstOfMonth) + '/' +
+                                this.formatDate(lastOfMonth), (_data) => {
+                                this.datesWithEvents = _data;
+                                console.log(this.datesWithEvents);
+                                this.calendarElem.datepicker('refresh');
+                                // this.highlightDatesWithEvents(this.datesWithEvents);
+
+                                this.currentMonth = firstOfMonth.getMonth();
+                                this.currentYear = firstOfMonth.getFullYear();
+
+                                if (!_refDate && $('td.day[data-date="{{$milliseconds}}"]:visible').length) {
+                                    $('td.day[data-date="{{$milliseconds}}"]:visible').first().click();
+                                }
+
+                                this.appointmentsLoaded = true;
+                            }, 'json');
+                        },
+                        loadEvents: function (_date, _callback) {
+                            let self = this;
+                            $.get('/pro-dashboard-events/' + _date + '/' + _date, function (_data) {
+                                self.events = _data;
+                                self.numEventsForDate = (_data && _data.length) ? 1 : 0;
+                                _callback.call(self);
+                            }, 'json');
+                        },
+                        updateMeasurements: function () {
+                            $.get('/pro-dashboard-measurements/' + this.measurementFilterStatus, (_data) => {
+                                this.measurements = _data;
+                                Vue.nextTick(() => {
+                                    // this.initCMRTE();
+                                    $('#pro-dashboard-container').find('[moe][initialized]').removeAttr('initialized');
+                                    initMoes();
+                                });
+                            }, 'json');
+                        },
+                        setMeasurementStatus: function (_uid, _status) {
+                            $.post('/api/measurement/updateStatus', {
+                                uid: _uid,
+                                status: _status
+                            }, (_data) => {
+                                this.updateMeasurements();
+                            }, 'json');
+                        },
+                        initCMRTE: function () {
+                            $('#pro-dashboard-container [cm-rte]').each(function () {
+
+                                $(this).wrap(
+                                    $('<div class="border-left border-right rte-holder"/>')
+                                        .attr('data-shortcuts', '')
+                                );
+
+                                // give a unique id to this editor instance
+                                var editorID = Math.ceil(Math.random() * 99999), fieldName = $(this).attr('data-name');
+
+                                var el = this;
+                                var existingContent = $(el).attr('data-content');
+                                var quill = new Quill(el, {
+                                    theme: 'snow',
+                                    modules: stagQuillConfig
+                                });
+
+                                var toolbar = $(quill.container).prev('.ql-toolbar');
+
+                                // add button for new shortcut
+                                var newSCButton = $('<button class="btn bg-white btn-sm btn-default text-primary w-auto px-2 border py-0 ' +
+                                    'text-sm add-shortcut" data-editor-id="' + editorID + '">+ Shortcut</button>');
+                                toolbar.append(newSCButton);
+
+                                quill.root.innerHTML = existingContent;
+
+                                $('<input type="hidden" name="' + fieldName + '">').val(existingContent).insertAfter(el);
+
+                                quill.on('text-change', function (delta, oldDelta, source) {
+                                    $(el).next('[name="' + fieldName + '"]').val(quill.root.innerHTML);
+                                });
+
+                                $(quill.container)
+                                    .find('.ql-editor[contenteditable]')
+                                    .attr('data-field', fieldName)
+                                    .attr('data-editor-id', editorID)
+                                    .attr('with-shortcuts', 1);
+
+                            })
+                        },
+                        initLoadAppointments: function () {
+                            if (this.appointmentsLoaded) return false;
+                            this.loadEventDates();
+                        },
+                        loadMeasurements: function () {
+                            $('#measurements-tab').load('/pro-dashboard-measurements-tab', () => {
+                                initMoes();
+                                initFastLoad($('#measurements-tab'));
+                            });
+                        },
+                        getFormattedCurrentDate: function () {
+                            let date = new Date();
+                            let day = date.getDate();
+                            day = day < 10 ? '0' + day : day;
+
+                            return date.getFullYear() + '-' + parseInt(date.getMonth() + 1) + '-' + day;
+                        },
+                        formatSelectedDate: function (_date, _format) {
+                            _format = _format || 'MM/DD/YYYY';
+                            if (_date) {
+                                return moment(_date).format(_format);
+                            }
+                        },
+                        formatTimeZone: function (_tz) {
+                            switch (_tz) {
+                                case 'EASTERN':
+                                    return 'EST'
+                                    break;
+                                case 'CENTRAL':
+                                    return 'CST'
+                                    break;
+                                case 'MOUNTAIN':
+                                    return 'MST'
+                                    break;
+                                case 'PACIFIC':
+                                    return 'PST'
+                                    break;
+                                case 'ALASKA':
+                                    return 'Alaska'
+                                    break;
+                                case 'HAWAII':
+                                    return 'Hawaii'
+                                    break;
+                                case 'PUERTO_RICO':
+                                    return 'Puerto Rico'
+                                    break;
+                                default:
+                                    return 'N/A';
+                            }
+                        }
+                    },
+                    mounted: function () {
+                        let self = this;
+                        this.calendarElem = $('.pro-dashboard-inline-calendar');
+                        this.calendarElem.datepicker({
+                            dateFormat: 'yy-mm-dd',
+                            onSelect: function (_date) {
+                                self.onDateChange(_date);
+                            },
+                            onChangeMonthYear: function (_year, _month) {
+                                let date = _year + '-' + (_month < 10 ? '0' : '') + _month + '-05';
+                                self.loadEventDates(date);
+                            },
+                            beforeShowDay: function (d) {
+                                if (self.datesWithEvents && self.datesWithEvents.indexOf(self.formatDate(d)) !== -1) {
+                                    return [true, 'has-events'];
+                                }
+                                return [true, 'no-events'];
+                            },
+                            defaultDate: 0
+                        });
+                        // this.calendarElem
+                        //     .on('changeDate', function () {
+                        //         self.onDateChange(self.calendarElem.datepicker('getFormattedDate'));
+                        //     })
+                        //     .on('changeMonth', function () {
+                        //         window.setTimeout(function() {
+                        //             let ts = $('td.day[data-date]').first().closest('tr').find('td.day[data-date]').last().attr('data-date');
+                        //             if(ts) {
+                        //                 self.loadEventDates(ts);
+                        //             }
+                        //         }, 10);
+                        //     });
+
+
+                        $('#pro-dashboard-container').find('[moe][initialized]').removeAttr('initialized');
+                        initMoes();
+
+                        // init fast load
+                        initFastLoad($('#pro-dashboard-container'));
+
+                        $(document)
+                            .off('click', '.dashboard-measurements.pagination a.page-link')
+                            .on('click', '.dashboard-measurements.pagination a.page-link', function () {
+                                $('#measurements-tab').text('Loading...').load('/pro-dashboard-measurements-tab/' + $(this).attr('data-target-page'), () => {
+                                    initMoes();
+                                    initFastLoad($('#measurements-tab'));
+                                });
+                                return false;
+                            });
+
+                        this.loadMeasurements();
+                        this.initLoadAppointments();
+                        this.onDateChange(this.getFormattedCurrentDate());
+                        this.selectedDate = this.getFormattedCurrentDate();
+                    }
+                });
+                /*// refresh once ticket popup is closed
+                $('body').off('stag-popup-closed')
+                $('body').on('stag-popup-closed', function() {
+                    if($('#pro-dashboard-container').length) {
+                        let activeTab = $('.nav-link.active[data-tab]').attr('data-tab');
+                        if(activeTab) {
+                            fastLoad('/?tab=' + activeTab);
+                        }
+                    }
+                });*/
+                // ticket-popup
+                $(document)
+                    .off('click', '.ticket-popup-trigger')
+                    .on('click', '.ticket-popup-trigger', function () {
+                        showMask();
+                        window.noMc = true;
+                        $.get(this.href, (_data) => {
+                            $('.ticket-popup').html(_data);
+                            showStagPopup('ticket-popup');
+                            $('.ticket-popup .stag-popup.stag-slide').attr('close-all-with-self', 1);
+                            runMCInitializer('patient-tickets'); // run specific mc initer
+                            hideMask();
+                        });
+                        return false;
+                    });
+
+                $(document)
+                    .off('click', '.ack-client-pro-change')
+                    .on('click', '.ack-client-pro-change', function () {
+                        let trigger = $(this).text('…');
+                        $.post('/api/clientProChange/accept', {
+                            uid: $(this).attr('data-uid')
+                        }, _data => {
+                            if (!hasResponseError(_data)) {
+                                trigger.hide();
+                                let doneElem = $('<i class="text-success fa fa-check"></i>');
+                                doneElem.insertAfter(trigger);
+                                setTimeout(() => {
+                                    let ackContainer = trigger.closest('.ack-container');
+                                    trigger.closest('div').slideUp('fast', function () {
+                                        $(this).remove();
+                                        if (!ackContainer.find('>div').length) {
+                                            ackContainer.remove();
+                                        }
+                                    });
+                                }, 500);
+                            }
+                        }, 'json');
+                        return false;
+                    });
+
+                $(document)
+                    .off('click', '.ack-client-memo')
+                    .on('click', '.ack-client-memo', function () {
+                        let trigger = $(this).text('…');
+                        $.post('/api/clientMemo/stamp', {
+                            uid: $(this).attr('data-uid')
+                        }, _data => {
+                            if (!hasResponseError(_data)) {
+                                trigger.hide();
+                                let doneElem = $('<i class="text-success fa fa-check"></i>');
+                                doneElem.insertAfter(trigger);
+                                setTimeout(() => {
+                                    let tbody = trigger.closest('tbody');
+                                    trigger.closest('tr').remove();
+                                    if (!tbody.find('>tr').length) {
+                                        tbody.closest('.ack-container').remove();
+                                    }
+                                }, 500);
+                            }
+                        }, 'json');
+                        return false;
+                    });
+
+                $(document)
+                    .off('click', '.ack-pro-appt-update')
+                    .on('click', '.ack-pro-appt-update', function () {
+                        let trigger = $(this).text('…');
+                        $.post('/api/appointmentConfirmationDecision/acknowledgeAsAppointmentPro', {
+                            uid: $(this).attr('data-uid')
+                        }, _data => {
+                            if (!hasResponseError(_data)) {
+                                trigger.hide();
+                                let doneElem = $('<i class="text-success fa fa-check"></i>');
+                                doneElem.insertAfter(trigger);
+                                setTimeout(() => {
+                                    let ackContainer = trigger.closest('tbody');
+                                    trigger.closest('tr').slideUp('fast', function () {
+                                        $(this).remove();
+                                        if (!ackContainer.find('>tr').length) {
+                                            ackContainer.remove();
+                                        }
+                                    });
+                                }, 500);
+                            }
+                        }, 'json');
+                        return false;
+                    });
+            }
+
+            addMCInitializer('pro-dashboard', init, '#pro-dashboard-container');
+        })();
+    </script>
+@endsection

+ 0 - 988
resources/views/app/dashboard.blade.php

@@ -1,988 +0,0 @@
-@extends ('layouts.template')
-
-@section('content')
-<div class="p-3">
-    <div class="">
-        <div class="row mcp-theme-1" id="pro-dashboard-container" v-cloak>
-            <div class="col-md-3 mcp-theme-1">
-                <div class="mb-4" v-show="tab==='appointments'">
-                    <div class="pro-dashboard-inline-calendar"></div>
-                </div>
-                <div class="card mb-4">
-                    <div class="card-header pl-2">
-                        <strong>
-                            Key Numbers
-                        </strong>
-                    </div>
-                    <div class="card-body p-0">
-                        <table class="table mb-0 dashboard-stats-table">
-                            <tbody>
-                                <tr>
-                                    <th class="border-top-0 px-2 text-center">{{$keyNumbers['totalPatients']}}</th>
-                                    <th class="border-top-0 pl-2"><a href="/patients">Total patients</a></th>
-                                </tr>
-                                <tr>
-                                    <th class="px-2 text-center">{{$keyNumbers['patientsNotSeenYet']}}</th>
-                                    <th class="pl-2"><a href="/patients/not-yet-seen">Patients I have not seen yet</a></th>
-                                </tr>
-                                <tr>
-                                    <th class="px-2 text-center">{{$keyNumbers['pendingBillsToSign']}}</th>
-                                    <th class="pl-2"><a href="/practice-management/bills/not-yet-signed">Pending bills to sign</a></th>
-                                </tr>
-                                <tr>
-                                    <th class="px-2 text-center">{{$keyNumbers['signedNotesWithoutBills']}}</th>
-                                    <th class="pl-2"><a href="/practice-management/notes/without-bills">Signed notes without bills</a></th>
-                                </tr>
-                                @if(!$pro->isDefaultNA())
-                                <tr>
-                                    <th class="px-2 text-center">{{$keyNumbers['pendingNotesToSign']}}</th>
-                                    <th class="pl-2"><a href="/practice-management/notes/not-yet-signed">Pending notes to sign</a></th>
-                                </tr>
-                                @else
-                                <tr>
-                                    <th class="px-2 text-center">{{$keyNumbers['$pendingNotesToSignMCP']}}</th>
-                                    <th class="pl-2"><a href="/practice-management/dna-notes-pending-mcp-sign">Pending notes to sign (MCP)</a></th>
-                                </tr>
-                                @endif
-                                @if(!!$keyNumbers['pendingNotesToSignAllySigned'])
-                                <tr>
-                                    <th class="px-2 text-center">{{$keyNumbers['pendingNotesToSignAllySigned']}}</th>
-                                    <th class="pl-2"><a href="/practice-management/notes/not-yet-signed-but-ally-signed">Pending notes to sign (ally signed)</a></th>
-                                </tr>
-                                @endif
-                               
-                                <tr>
-                                    <th class="px-2 text-center">{{$keyNumbers['numOpenTickets']}}</th>
-                                    <th class="pl-2"><a href="/practice-management/my-tickets/open">Open tickets</a></th>
-                                </tr>
-                                <tr>
-                                    <th class="px-2 text-center">{{$keyNumbers['unacknowledgedCancelledBills']}}</th>
-                                    <th class="pl-2">
-                                        <a href="/practice-management/unacknowledged-cancelled-bills">Unacknowledged Cancelled Bills</a>
-                                    </th>
-                                </tr>
-                                <tr>
-                                    <th class="px-2 text-center">{{$keyNumbers['unacknowledgedCancelledSupplyOrders']}}</th>
-                                    <th class="pl-2">
-                                        <a href="/practice-management/supply-orders/cancelled-but-unacknowledged">Unacknowledged Cancelled Supply Orders</a>
-                                    </th>
-                                </tr>
-                                <tr>
-                                    <th class="px-2 text-center">{{$keyNumbers['unsignedSupplyOrders']}}</th>
-                                    <th class="pl-2">
-                                        <a href="/practice-management/supply-orders/unsigned">Unsigned Supply Orders</a>
-                                    </th>
-                                </tr>
-                                <tr>
-                                    <th class="px-2 text-center">{{$keyNumbers['patientsHavingBirthdayToday']}}</th>
-                                    <th class="pl-2">
-                                        <a href="/patients/having-birthday-today">Patients having birthday today</a>
-                                    </th>
-                                </tr>
-                                @if(@$keyNumbers['naBillableSignedNotes'])
-                                    <tr>
-                                        <th class="px-2 text-center">{{$keyNumbers['naBillableSignedNotes']}}</th>
-                                        <th class="pl-2">
-                                            <a href="/practice-management/na-billable-signed-notes">Billable signed notes</a>
-                                        </th>
-                                    </tr>
-                                @endif
-                                <tr>
-                                    <th class="px-2 text-center">{{$keyNumbers['rmBillsToSign']}}</th>
-                                    <th class="pl-2">
-                                        <a href="/practice-management/rm-bills-to-sign">RM Bills to Sign</a>
-                                    </th>
-                                </tr>
-                                @if($pro->pro_type === 'ADMIN')
-                                    <tr>
-                                        <th class="px-2 text-center">{{$keyNumbers['patientsWithoutCoverageInformation']}}</th>
-                                        <th class="pl-2"><a href="/practice-management/patients-without-coverage/without-coverage-information">Without coverage information</a></th>
-                                    </tr>
-                                    <tr>
-                                        <th class="px-2 text-center">{{$keyNumbers['patientsPendingCoverageVerification']}}</th>
-                                        <th class="pl-2"><a href="/practice-management/patients-without-coverage/pending-coverage-verification">Pending coverage verification</a></th>
-                                    </tr>
-                                @endif
-                            </tbody>
-                        </table>
-                    </div>
-                </div>
-                <div class="card mb-4">
-                    <div class="card-header pl-2">
-                        <strong>
-                            Remote Monitoring: {{friendly_month(date('Y-m-d'))}}
-                        </strong>
-                    </div>
-                    <div class="card-body p-0">
-                        <table class="table mb-0 dashboard-stats-table">
-                            <tbody>
-                            <tr>
-                                <th class="px-2 text-center">{{$keyNumbers['rmPatientsWithLT16MD']}}</th>
-                                <th class="pl-2">
-                                    <b>Patients with < 16 meas. days</b>
-                                </th>
-                            </tr>
-                            <tr>
-                                <th class="px-2 text-center">{{$keyNumbers['rmPatientsWithGTE16MD']}}</th>
-                                <th class="pl-2">
-                                    <b>Patients with >= 16 meas. days</b>
-                                </th>
-                            </tr>
-                            @if(!$pro->is_hcp)
-                            <tr>
-                                <th class="px-2 text-center">{{$keyNumbers['rmPatientsWithWhomCommDone']}}</th>
-                                <th class="pl-2">
-                                    <b>Patients with whom comm. not done</b>
-                                </th>
-                            </tr>
-                            <tr>
-                                <th class="px-2 text-center">{{$keyNumbers['rmPatientsWithWhomCommNotDone']}}</th>
-                                <th class="pl-2">
-                                    <b>Patients with whom comm. done</b>
-                                </th>
-                            </tr>
-                            @endif
-                            <tr>
-                                <th class="px-2 text-center">{{$keyNumbers['measurementsToBeStamped']}}</th>
-                                <th class="pl-2">
-                                    <a href="{{route('practice-management.remote-monitoring')}}">Unstamped Measurements</a>
-                                </th>
-                            </tr>
-                            </tbody>
-                        </table>
-                    </div>
-                </div>
-                <div class="card mb-4">
-                    <div class="card-header pl-2">
-                        <strong>
-                            Reimbursement
-                        </strong>
-                    </div>
-                    <div class="card-body p-0">
-                        <table class="table mb-0 dashboard-stats-table">
-                            <tbody>
-                                <tr>
-                                    <th class="border-top-0 px-2">${{friendly_money($reimbursement['currentBalance'])}}</th>
-                                    <th class="border-top-0 pl-2 w-100"><a href="/practice-management/financial-transactions">Current balance</a></th>
-                                </tr>
-                                <!-- <tr>
-                                    <th class="px-2">{{friendly_date_time($reimbursement['nextPaymentDate'], false)}}</th>
-                                    <th class="pl-2">Next Payment Date</th>
-                                </tr> -->
-                                <tr>
-                                    <th class="px-2">${{friendly_money($reimbursement['nextPaymentAmount'])}}</th>
-                                    <th class="pl-2"><a href="/practice-management/bills-under-processing">Processing</a></th>
-                                </tr>
-                                {{--
-                                <tr>
-                                    <th class="px-2">{{$reimbursement['lastPayment']}}</th>
-                                    <th class="pl-2"><a href="/practice-management/financial-transactions">Last payment</a></th>
-                                </tr>
-                                <tr>
-                                    <th class="px-2">{{friendly_date_time($reimbursement['lastPaymentDate'], false)}}</th>
-                                    <th class="pl-2"><a href="/practice-management/financial-transactions">Last payment date</a></th>
-                                </tr>
-                                --}}
-                            </tbody>
-                        </table>
-                    </div>
-                </div>
-                @if($pro->pro_type === 'ADMIN')
-                <div class="card mb-4">
-                    <div class="card-header pl-2">
-                        <strong>
-                            Bills &amp; Claims
-                        </strong>
-                    </div>
-                    <div class="card-body p-0">
-                        <table class="table mb-0 dashboard-stats-table">
-                            <tbody>
-                            
-                            <tr>
-                                <th class="border-top-1 px-2 text-center">{{$businessNumbers['notesWithBillsToResolve']}}</th>
-                                <th class="border-top-1 pl-2">
-                                    <a href="/practice-management/billing-manager">Notes with bills to resolve</a>
-                                </th>
-                            </tr>
-                            <tr>
-                                <th class="border-top-1 px-2 text-center">{{$businessNumbers['notesPendingBillingClosure']}}</th>
-                                <th class="border-top-1 pl-2">
-                                    <a href="/practice-management/billing-manager">Notes pending billing closure</a>
-                                </th>
-                            </tr>
-                            </tbody>
-                        </table>
-                    </div>
-                </div>
-                @endif
-            </div>
-            <div class="col-md-9">
-
-                <div class="row">
-                    <div class="col-6">
-
-                        <!-- Appointment Updates -->
-                        @if(count($proApptUpdates))
-                            <div class="mb-3 border rounded px-3 py-2 ack-container">
-                                <p class="pt-1 mb-2"><b>Appointment Updates</b></p>
-                                <table class="table table-sm table-hover table-bordered mb-0">
-                                    <thead>
-                                    <tr>
-                                        <th>Client</th>
-                                        <th>Appt. Date/Time</th>
-                                        <th>Status</th>
-                                        <th></th>
-                                    </tr>
-                                    </thead>
-                                    <tbody>
-                                        @foreach($proApptUpdates as $update)
-                                            <tr>
-                                                <td>{{$update->name_first}} {{$update->name_last}}</td>
-                                                <td>{{friendlier_date_time($update->start_time)}}</td>
-                                                <td>{{$update->status}}</td>
-                                                <td><a href="#" class="ack-pro-appt-update" data-uid="{{$update->uid}}">Acknowledge</a></td>
-                                            </tr>
-                                        @endforeach
-                                    </tbody>
-                                </table>
-                            </div>
-                        @endif
-
-                        @if(count($naApptUpdates))
-                            <div class="mb-3 border rounded px-3 py-2 ack-container">
-                                <p class="pt-1 mb-2"><b>Appointment Updates</b></p>
-                                <table class="table table-sm table-hover table-bordered mb-0">
-                                    <thead>
-                                    <tr>
-                                        <th>Client</th>
-                                        <th>Pro</th>
-                                        <th>Appt. Date/Time</th>
-                                        <th>Status</th>
-                                        <th></th>
-                                    </tr>
-                                    </thead>
-                                    <tbody>
-                                    @foreach($naApptUpdates as $update)
-                                        <tr>
-                                            <td>{{$update->name_first}} {{$update->name_last}}</td>
-                                            <td>{{$update->pro_name_first}} {{$update->pro_name_last}}</td>
-                                            <td>{{friendlier_date_time($update->start_time)}}</td>
-                                            <td>{{$update->status}}</td>
-                                            <td><a href="#" class="ack-na-appt-update" data-uid="{{$update->uid}}">Acknowledge</a></td>
-                                        </tr>
-                                    @endforeach
-                                    </tbody>
-                                </table>
-                            </div>
-                        @endif
-
-                        <!-- new associations -->
-                        @if(count($newMCPAssociations))
-                            <div class="mb-3 border rounded px-3 py-2 ack-container">
-                                <p class="pt-1 mb-2"><b>New Patients</b></p>
-                                @foreach($newMCPAssociations as $assoc)
-                                    <div class="d-flex align-items-start bg-light mb-2 px-2 py-1">
-                                        <div class="flex-grow-1">
-                                            You are now the MCP for
-                                            <a href="/patients/view/{{$assoc->patient->uid}}" class="">{{$assoc->patient->displayName()}}</a>
-                                            <?php $nextAppt = $assoc->patient->nextAppointment(); ?>
-                                            @if($nextAppt)
-                                                <div class="font-size-11">
-                                                    <span class="text-secondary font-size-11">Appt.</span>
-                                                    {{$nextAppt->pro->displayName()}}
-                                                    <span class="text-secondary font-size-11">on</span>
-                                                    {{friendlier_date_time($nextAppt->raw_date . ' ' . $nextAppt->raw_start_time)}}
-                                                </div>
-                                                @if($nextAppt->status === 'CREATED')
-                                                    <div class="text-warning-mellow font-weight-bold font-size-11 mt-1">
-                                                        <i class="fa fa-exclamation-triangle"></i>
-                                                        Confirmation pending
-                                                    </div>
-                                                @endif
-                                                @if($nextAppt->status === 'CONFIRMED')
-                                                    <div class="text-success font-weight-bold font-size-11 mt-1">
-                                                        <i class="fa fa-check"></i>
-                                                        Confirmed by the patient
-                                                    </div>
-                                                @endif
-                                                @if($nextAppt->status === 'REJECTED')
-                                                    <div class="text-danger font-weight-bold font-size-11 mt-1">
-                                                        <i class="fa fa-stop"></i>
-                                                        Rejected by the patient
-                                                    </div>
-                                                @endif
-                                            @endif
-                                        </div>
-                                        <a href="#" class="ack-client-pro-change ml-3" data-uid="{{$assoc->uid}}">Stamp</a>
-                                    </div>
-                                @endforeach
-                            </div>
-                        @endif
-
-                        @if(count($newNAAssociations))
-                            <div class="mb-3 border rounded px-3 py-2 ack-container">
-                                <p class="pt-1 mb-2"><b>New Patients</b></p>
-                                @foreach($newNAAssociations as $assoc)
-                                    <div class="d-flex align-items-start bg-light mb-2 px-2 py-1">
-                                        <div class="flex-grow-1">
-                                            You are now the Care Coordinator for
-                                            <a href="/patients/view/{{$assoc->patient->uid}}" class="">{{$assoc->patient->displayName()}}</a>
-                                            <?php $nextAppt = $assoc->patient->nextAppointment(); ?>
-                                            @if($nextAppt)
-                                                <div class="font-size-11">
-                                                    <span class="text-secondary font-size-11">Appt.</span>
-                                                    {{$nextAppt->pro->displayName()}}
-                                                    <span class="text-secondary font-size-11">on</span>
-                                                    {{friendlier_date_time($nextAppt->raw_date . ' ' . $nextAppt->raw_start_time)}}
-                                                </div>
-                                                @if($nextAppt->status === 'CREATED')
-                                                    <div class="text-warning-mellow font-weight-bold font-size-11 mt-1">
-                                                        <i class="fa fa-exclamation-triangle"></i>
-                                                        Confirmation pending
-                                                    </div>
-                                                @endif
-                                                @if($nextAppt->status === 'CONFIRMED')
-                                                    <div class="text-success font-weight-bold font-size-11 mt-1">
-                                                        <i class="fa fa-check"></i>
-                                                        Confirmed by the patient
-                                                    </div>
-                                                @endif
-                                                @if($nextAppt->status === 'REJECTED')
-                                                    <div class="text-danger font-weight-bold font-size-11 mt-1">
-                                                        <i class="fa fa-stop"></i>
-                                                        Rejected by the patient
-                                                    </div>
-                                                @endif
-                                            @endif
-                                        </div>
-                                        <a href="#" class="ack-client-pro-change" data-uid="{{$assoc->uid}}">Stamp</a>
-                                    </div>
-                                @endforeach
-                            </div>
-                        @endif
-                    </div>
-                    <div class="col-6">
-                        @if(count($mcpClientMemos))
-                            <div class="mb-3 border rounded px-3 py-2 ack-container">
-                                <p class="pt-1 mb-2"><b>New Patients Memos (MCP)</b></p>
-                                <table class="table table-sm table-hover table-bordered">
-                                    <thead>
-                                    <tr>
-                                        <th>Patient</th>
-                                        <th>Memo</th>
-                                        <th>Created</th>
-                                        <th></th>
-                                    </tr>
-                                    </thead>
-                                    <tbody>
-                                    @foreach($mcpClientMemos as $memo)
-                                        <tr>
-                                            <td class="">
-                                                <a href="/patients/view/{{$memo->client_uid}}">{{$memo->name_first}} {{$memo->name_last}}</a>
-                                            </td>
-                                            <td>{!! $memo->content !!}</td>
-                                            <td class="text-nowrap">{{friendlier_date_time($memo->created_at)}}</td>
-                                            <td><a href="#" class="ack-client-memo" data-uid="{{$memo->uid}}">Stamp</a></td>
-                                        </tr>
-                                    @endforeach
-                                    </tbody>
-                                </table>
-                            </div>
-                        @endif
-                        @if(count($naClientMemos))
-                            <div class="mb-3 border rounded px-3 py-2 ack-container">
-                                <p class="pt-1 mb-2"><b>New Patients Memos (NA)</b></p>
-                                <table class="table table-sm table-hover table-bordered">
-                                    <thead>
-                                    <tr>
-                                        <th>Patient</th>
-                                        <th>Memo</th>
-                                        <th>Created</th>
-                                        <th></th>
-                                    </tr>
-                                    </thead>
-                                    <tbody>
-                                    @foreach($naClientMemos as $memo)
-                                        <tr>
-                                            <td class="">
-                                                <a href="/patients/view/{{$memo->client_uid}}">{{$memo->name_first}} {{$memo->name_last}}</a>
-                                            </td>
-                                            <td>{!! $memo->content !!}</td>
-                                            <td class="text-nowrap">{{friendlier_date_time($memo->created_at)}}</td>
-                                            <td><a href="#" class="ack-client-memo" data-uid="{{$memo->uid}}">Stamp</a></td>
-                                        </tr>
-                                    @endforeach
-                                    </tbody>
-                                </table>
-                            </div>
-                        @endif
-                    </div>
-                </div>
-
-                <ul class="nav nav-tabs">
-                    <li class="nav-item">
-                        <a native data-tab="appointments" class="nav-link"
-                           :class="tab == 'appointments' ? 'active' : ''" href="#"
-                           v-on:click.prevent="tab='appointments'; initLoadAppointments();">
-                            Appointments
-                        </a>
-                    </li>
-                    <li class="nav-item">
-                        <a native data-tab="measurements" class="nav-link"
-                           :class="tab == 'measurements' ? 'active' : ''" href="#"
-                           v-on:click.prevent="tab='measurements'; loadMeasurements();">
-                            Measurements
-                        </a>
-                    </li>
-                    <li class="nav-item">
-                        <a native data-tab="incoming_reports" class="nav-link {{count($incomingReports) ? 'text-danger font-weight-bold' : ''}}"
-                           :class="tab == 'incoming_reports' ? 'active' : ''" href="#"
-                           v-on:click.prevent="tab='incoming_reports'">
-                            Incoming Reports ({{count($incomingReports)}})
-                        </a>
-                    </li>
-                    <li class="nav-item">
-                        <a native data-tab="erx" class="nav-link {{$numERx ? 'text-danger font-weight-bold' : ''}}"
-                           :class="tab == 'erx' ? 'active' : ''" href="#"
-                           v-on:click.prevent="tab='erx'">
-                            ERx ({{$numERx}})
-                        </a>
-                    </li>
-                    <li class="nav-item">
-                        <a native data-tab="labs" class="nav-link {{$numLabs ? 'text-danger font-weight-bold' : ''}}"
-                           :class="tab == 'labs' ? 'active' : ''" href="#"
-                           v-on:click.prevent="tab='labs'">
-                            Labs ({{$numLabs}})
-                        </a>
-                    </li>
-                    <li class="nav-item">
-                        <a native data-tab="imaging" class="nav-link {{$numImaging ? 'text-danger font-weight-bold' : ''}}"
-                           :class="tab == 'imaging' ? 'active' : ''" href="#"
-                           v-on:click.prevent="tab='imaging'">
-                            Imaging ({{$numImaging}})
-                        </a>
-                    </li>
-                    <li class="nav-item">
-                        <a native data-tab="supply_orders" class="nav-link {{$numSupplyOrders ? 'text-danger font-weight-bold' : ''}}"
-                           :class="tab == 'supply_orders' ? 'active' : ''" href="#"
-                           v-on:click.prevent="tab='supply_orders'">
-                            Supply Orders ({{$numSupplyOrders}})
-                        </a>
-                    </li>
-                </ul>
-
-                <div class="border-left border-right border-bottom p-3">
-                    <div v-show="tab==='appointments'" class="appointments-tab">
-                        <div v-show="selectedDate">
-                            <div class="d-flex align-items-end mb-3">
-                                <b class="large"><span class="text-secondary">Today:</span> @{{ selectedDate }}</b>
-                                <div class="ml-auto d-inline-flex align-items-center">
-                                    <label class="text-secondary mr-2 my-0 text-nowrap">Filter by status:</label>
-                                    <select v-model="filterStatus"
-                                            class="form-control form-control-sm">
-                                        <option value="">All</option>
-                                        <option value="CREATED">Created</option>
-                                        <option value="CONFIRMED">Confirmed</option>
-                                        <option value="CANCELLED">Cancelled</option>
-                                        <option value="COMPLETED">Completed</option>
-                                        <option value="ABANDONED">Abandoned</option>
-                                    </select>
-                                </div>
-                            </div>
-                            <div v-for="event in events" class="align-items-end p-3 border rounded mb-3"
-                                 :class="(event.dateYMD === selectedDate && (filterStatus === '' || filterStatus === event.status) ? 'd-flex' : 'd-none') + ' ' + (event.isClientShadowOfPro ? 'training-event' : '')">
-                                <div class="patient-avatar mr-3 align-self-center">
-                                    <i v-if="event.isClientShadowOfPro" class="fa fa-graduation-cap training-icon" :title="event.proInitials"></i>
-                                    <span v-else class="">@{{ event.proInitials }}</span>
-                                </div>
-                                <div>
-                                    <div class="pb-1">
-                                        <b class="text-info">@{{ event.proName }}</b>
-                                        &nbsp;/&nbsp;
-                                        @{{ event.friendlyStartTime }} - @{{ event.friendlyEndTime }} <span class="text-secondary">@{{ event.timezone }}</span>
-                                        &nbsp;/&nbsp;
-                                        <span class="d-inline-block ml- 2 text-secondary font-weight-bold">@{{ event.title }}</span>
-                                    </div>
-                                    <div class="pb-1">
-                                        <a :href="'/patients/view/' + event.clientUid" class="font-weight-bold">@{{ event.clientName }}</a>
-                                        <span class="small d-inline-block pl-2 text-secondary font-weight-normal">@{{ event.clientSummary }}</span>
-                                    </div>
-                                    <div class="d-flex align-items-baseline">
-                                        <div v-if="event.status === 'CREATED'" class="text-warning-mellow font-weight-bold">
-                                            <i class="fa fa-exclamation-triangle"></i>
-                                            Confirmation pending
-                                        </div>
-                                        <div v-else-if="event.status === 'CONFIRMED'" class="text-success font-weight-bold">
-                                            <i class="fa fa-check"></i>
-                                            Confirmed by the patient
-                                        </div>
-                                        <div v-else-if="event.status === 'REJECTED'" class="text-danger font-weight-bold">
-                                            <i class="fa fa-stop"></i>
-                                            Rejected by the patient
-                                        </div>
-                                        <div v-else class="text-secondary">
-                                            Status: <b>@{{ event.status }}</b>
-                                        </div>
-                                        <span class="mx-2 text-secondary">|</span>
-                                        <a :href="'/patients/view/' + event.clientUid + '/calendar/' + event.uid">
-                                            <i class="fa fa-edit"></i>
-                                            Edit Appointment
-                                        </a>
-                                    </div>
-                                    <div class="mt-1" :class="event.coverage !== 'YES' ? (event.coverage === 'NO' ? 'text-danger' : 'text-warning-mellow') : 'text-success'">
-                                        Coverage Status: <b>@{{ event.coverage }}</b>
-                                    </div>
-                                </div>
-                                <div class="ml-auto">
-                                    <select v-model="event.newStatus"
-                                            class="form-control form-control-sm bg-light"
-                                            v-on:change="updateStatus(event)">
-                                        <option value="CREATED">CREATED</option>
-                                        <option value="CONFIRMED">CONFIRMED</option>
-                                        <option value="CANCELLED">CANCELLED</option>
-                                        <option value="COMPLETED">COMPLETED</option>
-                                        <option value="ABANDONED">ABANDONED</option>
-                                    </select>
-                                    <div v-if="selectedDate === '{{ date('Y-m-d') }}'"
-                                         class="pt-1 text-right" :class="event.started ? 'text-danger': 'text-secondary'">
-                                        @{{ event.inHowManyHours }}
-                                    </div>
-                                </div>
-                            </div>
-                            <div v-if="numEventsForDate === 0" class="bg-light p-3 text-secondary border bounded">
-                                <span v-if="filterStatus === ''">You have no appointments on <b>@{{ selectedDate }}</b></span>
-                                <span v-if="filterStatus !== ''">You have no appointments on <b>@{{ selectedDate }}</b> with status <b>@{{ filterStatus }}</b></span>
-                            </div>
-                        </div>
-                        <div v-show="!selectedDate" class="bg-light p-3 text-secondary border bounded">
-                            Please select a date from the calendar on the left
-                        </div>
-                    </div>
-                    <div v-show="tab==='measurements'">
-                        <div id="measurements-tab">Loading...</div>
-                    </div>
-                    <div v-show="tab==='incoming_reports'">
-                        @include('app.dashboard.incoming_reports')
-                    </div>
-                    <div v-show="tab==='erx'">
-                        @include('app.dashboard.erx')
-                    </div>
-                    <div v-show="tab==='labs'">
-                        @include('app.dashboard.labs')
-                    </div>
-                    <div v-show="tab==='imaging'">
-                        @include('app.dashboard.imaging')
-                    </div>
-                    <div v-show="tab==='supply_orders'">
-                        @include('app.dashboard.supply_orders')
-                    </div>
-                </div>
-            </div>
-        </div>
-    </div>
-</div>
-
-<div class="stag-popup stag-popup-md ticket-popup mcp-theme-1" stag-popup-key="ticket-popup"></div>
-
-<script>
-    (function() {
-        function init() {
-            window.apapp = new Vue({
-                el: '#pro-dashboard-container',
-                delimiters: ['@{{', '}}'],
-                data: {
-                    tab: '{{ request()->input('tab') ? request()->input('tab') : 'measurements' }}',
-                    datesWithEvents: [],
-                    selectedDate: '{{ date('Y-m-d') }}',
-                    selectedStatus: 'CREATED',
-                    events: [],
-                    numEventsForDate: 0,
-                    filterStatus: '',
-                    calendarElem: null,
-                    currentMonth: null,
-                    currentYear: null,
-                    measurementFilterStatus: 'ALL',
-                    measurements: {!! $pro->pro_type === 'ADMIN' ? '[]' : json_encode($pro->getMeasurements()) !!},
-                    appointmentsLoaded: false,
-                },
-                methods: {
-                    formatDate: function (date) {
-                        let d = new Date(date),
-                            month = '' + (d.getMonth() + 1),
-                            day = '' + d.getDate(),
-                            year = d.getFullYear();
-
-                        if (month.length < 2)
-                            month = '0' + month;
-                        if (day.length < 2)
-                            day = '0' + day;
-
-                        return [year, month, day].join('-');
-                    },
-                    onDateChange: function (_newDate) {
-                        let self = this;
-                        window.setTimeout(() => {
-                            // let dayValue = $('.pro-dashboard-inline-calendar td.day.active').first().text();
-                            // if(dayValue.length === 1) dayValue = '0' + dayValue;
-                            // self.selectedDate = _newDate.substr(0, 8) + dayValue;
-                            self.selectedDate = _newDate;
-                            showMask();
-                            self.loadEvents(self.selectedDate, function() {
-                                hideMask();
-                                Vue.nextTick(() => {
-                                    // self.highlightDatesWithEvents(self.datesWithEvents);
-                                    initFastLoad($('.appointments-tab'));
-                                });
-                            });
-                        }, 25);
-                    },
-                    selectToday: function () {
-                        $('.pro-dashboard-inline-calendar table td[data-date]').removeClass('active');
-                        $('.pro-dashboard-inline-calendar table td[data-date="{{ $milliseconds }}"]')
-                            .addClass('active');
-                        // this.onDateChange('{{ date('Y-m-d') }}');
-                    },
-                    highlightDatesWithEvents: function (_dates) {
-                        $('.pro-dashboard-inline-calendar table td[data-date]').removeAttr('has-events');
-                        for (let i = 0; i < _dates.length; i++) {
-                            $('.pro-dashboard-inline-calendar table td[data-date="' + _dates[i] + '"]')
-                                .attr('has-events', 1);
-                        }
-                    },
-                    updateStatus: function(_event) {
-                        $.post('/api/appointment/updateStatus', {
-                            uid: _event.uid,
-                            status: _event.newStatus
-                        }, function(_data) {
-                            if(!_data) {
-                                toastr.error('Unable to update appointment status!');
-                            }
-                            else {
-                                if(!_data.success) {
-                                    toastr.error(_data.message);
-                                }
-                                else {
-                                    _event.status = _event.newStatus;
-                                    toastr.success('The appointment has been updated');
-                                }
-                            }
-                        }, 'json')
-                    },
-                    showEditForm: function(_trigger) {
-                        let form = $(_trigger).closest('[moe]').find('form').first();
-                        showMoeFormMask();
-                        form.show();
-                        setTimeout(function() {
-                            initPrimaryForm(form);
-                        }, 0);
-                    },
-                    submitEditForm: function(_trigger) {
-                        let form = $(_trigger).closest('[moe]').find('form').first();
-                        if(!form[0].checkValidity()) {
-                            form[0].reportValidity();
-                            return;
-                        }
-                        $.post(form.attr('url'), form.serialize(), function(_data) {
-                            if(_data && _data.success) {
-                                fastReload();
-                            }
-                            else {
-                                if(_data.message) {
-                                    toastr.error(_data.message);
-                                }
-                                else {
-                                    toastr.error('Unable to update the appointment');
-                                }
-                            }
-                        });
-                    },
-                    cancelEditForm: function(_trigger) {
-                        let form = $(_trigger).closest('[moe]').find('form').first();
-                        hideMoeFormMask();
-                        form.hide();
-                    },
-                    loadEventDates: function(_refDate = false) {
-                        let today = new Date(_refDate ? _refDate : '{{date('Y-m-d')}}'),
-                            firstOfMonth = new Date(today.getFullYear(), today.getMonth(), 1),
-                            lastOfMonth = new Date(today.getFullYear(), today.getMonth() + 1, 0);
-
-                        this.selectedDate = null;
-                        $('td.day.active').removeClass('active');
-
-                        $.get('/pro-dashboard-event-dates/' +
-                            this.formatDate(firstOfMonth) + '/' +
-                            this.formatDate(lastOfMonth), (_data) => {
-                            this.datesWithEvents = _data;
-                            console.log(this.datesWithEvents);
-                            this.calendarElem.datepicker('refresh');
-                            // this.highlightDatesWithEvents(this.datesWithEvents);
-
-                            this.currentMonth = firstOfMonth.getMonth();
-                            this.currentYear = firstOfMonth.getFullYear();
-
-                            if(!_refDate && $('td.day[data-date="{{$milliseconds}}"]:visible').length) {
-                                $('td.day[data-date="{{$milliseconds}}"]:visible').first().click();
-                            }
-
-                            this.appointmentsLoaded = true;
-                        }, 'json');
-                    },
-                    loadEvents: function(_date, _callback) {
-                        let self = this;
-                        $.get('/pro-dashboard-events/' + _date + '/' + _date, function(_data) {
-                            self.events = _data;
-                            self.numEventsForDate = (_data && _data.length) ? 1 : 0;
-                            _callback.call(self);
-                        }, 'json');
-                    },
-                    updateMeasurements: function() {
-                        $.get('/pro-dashboard-measurements/' + this.measurementFilterStatus, (_data) => {
-                            this.measurements = _data;
-                            Vue.nextTick(() => {
-                                // this.initCMRTE();
-                                $('#pro-dashboard-container').find('[moe][initialized]').removeAttr('initialized');
-                                initMoes();
-                            });
-                        }, 'json');
-                    },
-                    setMeasurementStatus: function(_uid, _status) {
-                        $.post('/api/measurement/updateStatus', {
-                            uid: _uid,
-                            status: _status
-                        }, (_data) => {
-                            this.updateMeasurements();
-                        }, 'json');
-                    },
-                    initCMRTE: function() {
-                        $('#pro-dashboard-container [cm-rte]').each(function() {
-
-                            $(this).wrap(
-                                $('<div class="border-left border-right rte-holder"/>')
-                                    .attr('data-shortcuts', '')
-                            );
-
-                            // give a unique id to this editor instance
-                            var editorID = Math.ceil(Math.random() * 99999), fieldName = $(this).attr('data-name');
-
-                            var el = this;
-                            var existingContent = $(el).attr('data-content');
-                            var quill = new Quill(el, {
-                                theme: 'snow',
-                                modules: stagQuillConfig
-                            });
-
-                            var toolbar = $(quill.container).prev('.ql-toolbar');
-
-                            // add button for new shortcut
-                            var newSCButton = $('<button class="btn bg-white btn-sm btn-default text-primary w-auto px-2 border py-0 ' +
-                                'text-sm add-shortcut" data-editor-id="' + editorID + '">+ Shortcut</button>');
-                            toolbar.append(newSCButton);
-
-                            quill.root.innerHTML = existingContent;
-
-                            $('<input type="hidden" name="' + fieldName + '">').val(existingContent).insertAfter(el);
-
-                            quill.on('text-change', function(delta, oldDelta, source) {
-                                $(el).next('[name="' + fieldName + '"]').val(quill.root.innerHTML);
-                            });
-
-                            $(quill.container)
-                                .find('.ql-editor[contenteditable]')
-                                .attr('data-field', fieldName)
-                                .attr('data-editor-id', editorID)
-                                .attr('with-shortcuts', 1);
-
-                        })
-                    },
-                    initLoadAppointments: function() {
-                        if(this.appointmentsLoaded) return false;
-                        this.loadEventDates();
-                    },
-                    loadMeasurements: function() {
-                        $('#measurements-tab').load('/pro-dashboard-measurements-tab', () => {
-                            initMoes();
-                            initFastLoad($('#measurements-tab'));
-                        });
-                    }
-                },
-                mounted: function () {
-                    let self = this;
-                    this.calendarElem = $('.pro-dashboard-inline-calendar');
-                    this.calendarElem.datepicker({
-                        dateFormat: 'yy-mm-dd',
-                        onSelect: function(_date) {
-                            self.onDateChange(_date);
-                        },
-                        onChangeMonthYear: function(_year, _month) {
-                            let date = _year + '-' + (_month < 10 ? '0' : '') + _month + '-05';
-                            self.loadEventDates(date);
-                        },
-                        beforeShowDay: function(d) {
-                            if(self.datesWithEvents && self.datesWithEvents.indexOf(self.formatDate(d)) !== -1) {
-                                return [true, 'has-events'];
-                            }
-                            return [true, 'no-events'];
-                        }
-                    });
-                    // this.calendarElem
-                    //     .on('changeDate', function () {
-                    //         self.onDateChange(self.calendarElem.datepicker('getFormattedDate'));
-                    //     })
-                    //     .on('changeMonth', function () {
-                    //         window.setTimeout(function() {
-                    //             let ts = $('td.day[data-date]').first().closest('tr').find('td.day[data-date]').last().attr('data-date');
-                    //             if(ts) {
-                    //                 self.loadEventDates(ts);
-                    //             }
-                    //         }, 10);
-                    //     });
-
-
-
-                    $('#pro-dashboard-container').find('[moe][initialized]').removeAttr('initialized');
-                    initMoes();
-
-                    // init fast load
-                    initFastLoad($('#pro-dashboard-container'));
-
-                    $(document)
-                        .off('click', '.dashboard-measurements.pagination a.page-link')
-                        .on('click', '.dashboard-measurements.pagination a.page-link', function() {
-                            $('#measurements-tab').text('Loading...').load('/pro-dashboard-measurements-tab/' + $(this).attr('data-target-page'), () => {
-                                initMoes();
-                                initFastLoad($('#measurements-tab'));
-                            });
-                            return false;
-                        });
-
-                    this.loadMeasurements();
-                }
-            });
-            /*// refresh once ticket popup is closed
-            $('body').off('stag-popup-closed')
-            $('body').on('stag-popup-closed', function() {
-                if($('#pro-dashboard-container').length) {
-                    let activeTab = $('.nav-link.active[data-tab]').attr('data-tab');
-                    if(activeTab) {
-                        fastLoad('/?tab=' + activeTab);
-                    }
-                }
-            });*/
-            // ticket-popup
-            $(document)
-                .off('click', '.ticket-popup-trigger')
-                .on('click', '.ticket-popup-trigger', function() {
-                    showMask();
-                    window.noMc = true;
-                    $.get(this.href, (_data) => {
-                        $('.ticket-popup').html(_data);
-                        showStagPopup('ticket-popup');
-                        $('.ticket-popup .stag-popup.stag-slide').attr('close-all-with-self', 1);
-                        runMCInitializer('patient-tickets'); // run specific mc initer
-                        hideMask();
-                    });
-                    return false;
-                });
-
-            $(document)
-                .off('click', '.ack-client-pro-change')
-                .on('click', '.ack-client-pro-change', function() {
-                    let trigger = $(this).text('…');
-                    $.post('/api/clientProChange/accept', {
-                        uid: $(this).attr('data-uid')
-                    }, _data => {
-                        if(!hasResponseError(_data)) {
-                            trigger.hide();
-                            let doneElem = $('<i class="text-success fa fa-check"></i>');
-                            doneElem.insertAfter(trigger);
-                            setTimeout(() => {
-                                let ackContainer = trigger.closest('.ack-container');
-                                trigger.closest('div').slideUp('fast', function() {
-                                    $(this).remove();
-                                    if(!ackContainer.find('>div').length) {
-                                        ackContainer.remove();
-                                    }
-                                });
-                            }, 500);
-                        }
-                    }, 'json');
-                    return false;
-                });
-
-            $(document)
-                .off('click', '.ack-client-memo')
-                .on('click', '.ack-client-memo', function() {
-                    let trigger = $(this).text('…');
-                    $.post('/api/clientMemo/stamp', {
-                        uid: $(this).attr('data-uid')
-                    }, _data => {
-                        if(!hasResponseError(_data)) {
-                            trigger.hide();
-                            let doneElem = $('<i class="text-success fa fa-check"></i>');
-                            doneElem.insertAfter(trigger);
-                            setTimeout(() => {
-                                let tbody = trigger.closest('tbody');
-                                trigger.closest('tr').remove();
-                                if(!tbody.find('>tr').length) {
-                                    tbody.closest('.ack-container').remove();
-                                }
-                            }, 500);
-                        }
-                    }, 'json');
-                    return false;
-                });
-
-            $(document)
-                .off('click', '.ack-pro-appt-update')
-                .on('click', '.ack-pro-appt-update', function() {
-                    let trigger = $(this).text('…');
-                    $.post('/api/appointmentConfirmationDecision/acknowledgeAsAppointmentPro', {
-                        uid: $(this).attr('data-uid')
-                    }, _data => {
-                        if(!hasResponseError(_data)) {
-                            trigger.hide();
-                            let doneElem = $('<i class="text-success fa fa-check"></i>');
-                            doneElem.insertAfter(trigger);
-                            setTimeout(() => {
-                                let ackContainer = trigger.closest('tbody');
-                                trigger.closest('tr').slideUp('fast', function() {
-                                    $(this).remove();
-                                    if(!ackContainer.find('>tr').length) {
-                                        ackContainer.remove();
-                                    }
-                                });
-                            }, 500);
-                        }
-                    }, 'json');
-                    return false;
-                });
-
-            $(document)
-                .off('click', '.ack-na-appt-update')
-                .on('click', '.ack-na-appt-update', function() {
-                    let trigger = $(this).text('…');
-                    $.post('/api/appointmentConfirmationDecision/acknowledgeAsClientDefaultNa', {
-                        uid: $(this).attr('data-uid')
-                    }, _data => {
-                        if(!hasResponseError(_data)) {
-                            trigger.hide();
-                            let doneElem = $('<i class="text-success fa fa-check"></i>');
-                            doneElem.insertAfter(trigger);
-                            setTimeout(() => {
-                                let ackContainer = trigger.closest('tbody');
-                                trigger.closest('tr').slideUp('fast', function() {
-                                    $(this).remove();
-                                    if(!ackContainer.find('>tr').length) {
-                                        ackContainer.remove();
-                                    }
-                                });
-                            }, 500);
-                        }
-                    }, 'json');
-                    return false;
-                });
-        }
-        addMCInitializer('pro-dashboard', init, '#pro-dashboard-container');
-    })();
-</script>
-@endsection

+ 5 - 0
resources/views/app/dna/appointments.blade.php

@@ -0,0 +1,5 @@
+@extends ('layouts/template')
+
+@section('content')
+    <h1>Hi</h1>
+@endsection

+ 5 - 0
resources/views/app/dna/bills.blade.php

@@ -0,0 +1,5 @@
+@extends ('layouts/template')
+
+@section('content')
+    <h1>Hi</h1>
+@endsection

+ 0 - 0
resources/views/app/dna/cancelled_appointments_pending_review.blade.php


+ 0 - 0
resources/views/app/dna/cancelled_bills_pending_review.blade.php


+ 0 - 0
resources/views/app/dna/cancelled_supply_orders_pending_review.blade.php


+ 1 - 0
resources/views/app/dna/dashboard/calls_memos.blade.php

@@ -0,0 +1 @@
+<h1>Phone Calls & Memos</h1>

+ 1 - 0
resources/views/app/dna/dashboard/erx_orders.blade.php

@@ -0,0 +1 @@
+<h1>ERX & Orders</h1>

+ 1 - 0
resources/views/app/dna/dashboard/measurements.blade.php

@@ -0,0 +1 @@
+<div id="measurements-tab">Loading...</div>

+ 1 - 0
resources/views/app/dna/dashboard/messages.blade.php

@@ -0,0 +1 @@
+<h1>Messages</h1>

+ 1 - 0
resources/views/app/dna/dashboard/notifications.blade.php

@@ -0,0 +1 @@
+<h1>Notifications</h1>

+ 1 - 0
resources/views/app/dna/dashboard/supply_orders.blade.php

@@ -0,0 +1 @@
+<h1>Supply Orders</h1>

+ 5 - 0
resources/views/app/dna/erx_and_orders.blade.php

@@ -0,0 +1,5 @@
+@extends ('layouts/template')
+
+@section('content')
+    <h1>Hi</h1>
+@endsection

+ 0 - 0
resources/views/app/dna/erx_and_orders_pending_signature.blade.php


+ 0 - 0
resources/views/app/dna/new_patients_awaiting_visit.blade.php


+ 5 - 0
resources/views/app/dna/notes.blade.php

@@ -0,0 +1,5 @@
+@extends ('layouts/template')
+
+@section('content')
+    <h1>Hi</h1>
+@endsection

+ 0 - 0
resources/views/app/dna/notes_pending_billing.blade.php


+ 0 - 0
resources/views/app/dna/notes_pending_signature.blade.php


+ 6 - 0
resources/views/app/dna/patients.blade.php

@@ -0,0 +1,6 @@
+@extends ('layouts/template')
+
+@section('content')
+    <h1>Hi</h1>
+@endsection
+

+ 0 - 0
resources/views/app/dna/patients_overdue.blade.php


+ 0 - 0
resources/views/app/dna/patients_without_appointments.blade.php


+ 5 - 0
resources/views/app/dna/reports.blade.php

@@ -0,0 +1,5 @@
+@extends ('layouts/template')
+
+@section('content')
+    <h1>Hi</h1>
+@endsection

+ 0 - 0
resources/views/app/dna/reports_pending_signature.blade.php


+ 5 - 0
resources/views/app/dna/supply_orders.blade.php

@@ -0,0 +1,5 @@
+@extends ('layouts/template')
+
+@section('content')
+    <h1>Hi</h1>
+@endsection

+ 0 - 0
resources/views/app/dna/supply_orders_pending_signature.blade.php


+ 55 - 0
resources/views/app/mcp/appointments.blade.php

@@ -0,0 +1,55 @@
+@extends ('layouts/template')
+
+@section('content')
+<div class="p-3 mcp-theme-1" id="patients-list">
+    <div class="card">
+
+        <div class="card-header px-3 py-2 d-flex align-items-center">
+            <strong class="mr-4">
+                <i class="fas fa-calendar-alt"></i>
+                Appointments
+            </strong>
+        </div>
+
+        <div class="card-body p-0">
+            <div class="p-3">
+                @include('app.mcp.appointments_filters')
+            </div>
+            <table class="table table-condensed p-0 m-0">
+                <thead class="bg-light">
+                    <tr>
+                        <th class="px-3 border-0">Date</th>
+                        <th class="px-3 border-0">HCP</th>
+                        <th class="px-3 border-0">Patient</th>
+                        <th class="px-3 border-0">New or FU?</th>
+                        <th class="px-3 border-0">Status</th>
+                        <th class="px-3 border-0">Note</th>
+                    </tr>
+                </thead>
+                <tbody>
+                    @foreach($appointments as $appointment)
+                    <tr>
+                        <td>{{-- date --}} -</td>
+                        <td>{{-- hcp --}} -</td>
+                        <td>{{-- patient --}} - </td>
+                        <td>{{-- New or FU? --}} - </td>  
+                        <td>{{-- Status --}} - </td>  
+                        <td>{{-- Note --}} - </td>
+                    </tr>
+                    @endforeach
+
+                    @if(count($appointments) === 0)
+                    <tr>
+                        <td colspan="6">No records found!</td>
+                    </tr>
+                    @endif
+                </tbody>
+
+            </table>
+            <div class="ml-2 mt-2">
+                {{ $appointments->appends(request()->input())->links() }}
+            </div>
+        </div>
+    </div>
+</div>
+@endsection

+ 100 - 0
resources/views/app/mcp/appointments_filters.blade.php

@@ -0,0 +1,100 @@
+<style>
+	#mcp-appointments-filters label {
+		font-weight: bold;
+	}
+
+	#mcp-appointments-filters .mw-100px {
+		min-width: 100px;
+	}
+</style>
+<form id="mcp-appointments-filters" method="GET" action="{{ route('mcp.appointments') }}" class="row align-items-end" v-cloak>
+	   <!-- DATE -->
+	<div class="col-md-2">
+		<div class="form-group">
+			<label>Date:</label>
+			<select name="date_category" class="form-control input-sm" v-model="filters.date_category">
+				<option value="">All</option>
+				<option value="EXACTLY">Exactly</option>
+				<option value="LESS_THAN">Less Than</option>
+				<option value="GREATER_THAN">Greater Than</option>
+				<option value="BETWEEN">Between</option>
+				<option value="NOT_BETWEEN">Not Between</option>
+			</select>
+		</div>
+	</div>
+	<div v-if="filters.date_category" class="col-md-2">
+		<div class="form-group">
+			<label>&nbsp;</label>
+			<input name="date_value_1" value="{{ $date_value_1 ?? '' }}" type="date" class="form-control input-sm" :placeholder="(filters.date_category === 'BETWEEN' || filters.date_category === 'NOT_BETWEEN') ? 'From' : 'Date'" />
+		</div>
+	</div>
+	<div v-if="filters.date_category && (filters.date_category === 'BETWEEN' || filters.date_category === 'NOT_BETWEEN')" class="col-md-2">
+		<div class="form-group">
+			<label>&nbsp;</label>
+			<input name="date_value_2" value="{{ $date_value_2 ?? '' }}" type="date" class="form-control input-sm" placeholder="To" />
+		</div>
+	</div>
+	<!-- STATUS -->
+	<div class="col-md-2">
+		<div class="form-group">
+			<label>Status:</label>
+			<select name="status" class="form-control input-sm" v-model="filters.status">
+				<option value="ALL">All</option>
+				<option value="NEW">New</option>
+				<option value="SIGNED">Signed</option>
+				<option value="VERIFIED">Verified</option>
+				<option value="PROCESSED">Processed</option>
+				<option value="CANCELLED">Cancelled</option>
+			</select>
+		</div>
+	</div>
+	
+	<!-- NEW/FU -->
+	<div class="col-md-2">
+		<div class="form-group">
+			<label>New or FU:</label>
+			<select name="new_or_fu" class="form-control input-sm" v-model="filters.new_or_fu">
+				<option value="ALL">All</option>
+				<option value="NEW">New</option>
+				<option value="FU">FU</option>
+			</select>
+		</div>
+	</div>
+
+	<div class="col-md-2">
+		<div class="form-group d-flex">
+			<label>&nbsp;</label>
+			<button type="submit" class="btn btn-primary btn-sm mr-2 mw-100px">Apply Filters</button>
+			<a href="{{ route('mcp.patients') }}" class="btn btn-danger btn-sm text-white mw-100px">Clear Filters</a>
+		</div>
+	</div>
+</form>
+
+<script>
+	(function() {
+		function init() {
+			window.apapp = new Vue({
+				el: '#mcp-appointments-filters',
+				delimiters: ['@{{', '}}'],
+				data: {
+					filters: {
+						date_category: "<?= $date_category ?? '' ?>",
+						status: "<?= $status ?? '' ?>",
+						new_or_fu: "<?= $new_or_fu ?? '' ?>"
+					}
+				},
+				methods: {
+					init: function() {
+						
+					}
+				},
+				mounted: function() {
+					this.init();
+				},
+			});
+
+
+		}
+		addMCInitializer('mcp-appointments-filters', init, '#mcp-appointments-filters');
+	})();
+</script>

+ 53 - 0
resources/views/app/mcp/bills.blade.php

@@ -0,0 +1,53 @@
+@extends ('layouts/template')
+
+@section('content')
+<div class="p-3 mcp-theme-1" id="patients-list">
+    <div class="card">
+
+        <div class="card-header px-3 py-2 d-flex align-items-center">
+            <strong class="mr-4">
+                <i class="fas fa-file-invoice-dollar"></i>
+                Bills
+            </strong>
+        </div>
+
+        <div class="card-body p-0">
+            <div class="p-3">
+                @include('app.mcp.bills_filters')
+            </div>
+            <table class="table table-condensed p-0 m-0">
+                <thead class="bg-light">
+                    <tr>
+                        <th class="px-3 border-0">Date</th>
+                        <th class="px-3 border-0">Patient</th>
+                        <th class="px-3 border-0">Service</th>
+                        <th class="px-3 border-0">Amount</th>
+                        <th class="px-3 border-0">Status</th>
+                    </tr>
+                </thead>
+                <tbody>
+                    @foreach($bills as $bill)
+                    <tr>
+                        <td>{{-- date --}} -</td>
+                        <td>{{-- patient --}} -</td>
+                        <td>{{-- service --}} - </td>
+                        <td>{{-- amount --}} - </td>                        
+                        <td>{{-- status --}} - </td>
+                    </tr>
+                    @endforeach
+
+                    @if(count($bills) === 0)
+                    <tr>
+                        <td colspan="5">No records found!</td>
+                    </tr>
+                    @endif
+                </tbody>
+
+            </table>
+            <div class="ml-2 mt-2">
+                {{ $bills->appends(request()->input())->links() }}
+            </div>
+        </div>
+    </div>
+</div>
+@endsection

+ 87 - 0
resources/views/app/mcp/bills_filters.blade.php

@@ -0,0 +1,87 @@
+<style>
+	#mcp-bills-filters label {
+		font-weight: bold;
+	}
+
+	#mcp-bills-filters .mw-100px {
+		min-width: 100px;
+	}
+</style>
+<form id="mcp-bills-filters" method="GET" action="{{ route('mcp.notes') }}" class="row align-items-end" v-cloak>
+	<!-- DATE	 -->
+	<div class="col-md-2">
+		<div class="form-group">
+			<label>Date:</label>
+			<select name="date_category" class="form-control input-sm" v-model="filters.date_category">
+				<option value="">All</option>
+				<option value="EXACTLY">Exactly</option>
+				<option value="LESS_THAN">Less Than</option>
+				<option value="GREATER_THAN">Greater Than</option>
+				<option value="BETWEEN">Between</option>
+				<option value="NOT_BETWEEN">Not Between</option>
+			</select>
+		</div>
+	</div>
+	<div v-if="filters.date_category" class="col-md-2">
+		<div class="form-group">
+			<label>&nbsp;</label>
+			<input name="date_value_1" value="{{ $date_value_1 ?? '' }}" type="date" class="form-control input-sm" :placeholder="(filters.date_category === 'BETWEEN' || filters.date_category === 'NOT_BETWEEN') ? 'From' : 'Date'" />
+		</div>
+	</div>
+	<div v-if="filters.date_category && (filters.date_category === 'BETWEEN' || filters.date_category === 'NOT_BETWEEN')" class="col-md-2">
+		<div class="form-group">
+			<label>&nbsp;</label>
+			<input name="date_value_2" value="{{ $date_value_2 ?? '' }}" type="date" class="form-control input-sm" placeholder="To" />
+		</div>
+	</div>
+	<!-- STATUS -->
+	<div class="col-md-2">
+		<div class="form-group">
+			<label>Status:</label>
+			<select name="status" class="form-control input-sm" v-model="filters.status">
+				<option value="ALL">All</option>
+				<option value="NEW">New</option>
+				<option value="SIGNED">Signed</option>
+				<option value="VERIFIED">Verified</option>
+				<option value="PROCESSED">Processed</option>
+				<option value="CANCELLED">Cancelled</option>
+			</select>
+		</div>
+	</div>
+
+	<div class="col-md-2">
+		<div class="form-group d-flex">
+			<label>&nbsp;</label>
+			<button type="submit" class="btn btn-primary btn-sm mr-2 mw-100px">Apply Filters</button>
+			<a href="{{ route('mcp.patients') }}" class="btn btn-danger btn-sm text-white mw-100px">Clear Filters</a>
+		</div>
+	</div>
+</form>
+
+<script>
+	(function() {
+		function init() {
+			window.apapp = new Vue({
+				el: '#mcp-bills-filters',
+				delimiters: ['@{{', '}}'],
+				data: {
+					filters: {
+						date_category: "<?= $date_category ?? '' ?>",
+						status: "<?= $status ?? '' ?>"
+					}
+				},
+				methods: {
+					init: function() {
+
+					}
+				},
+				mounted: function() {
+					this.init();
+				},
+			});
+
+
+		}
+		addMCInitializer('mcp-bills-filters', init, '#mcp-bills-filters');
+	})();
+</script>

+ 19 - 0
resources/views/app/mcp/cancelled_appointments_pending_review.blade.php

@@ -0,0 +1,19 @@
+@extends ('layouts/template')
+
+@section('content')
+    <div class="p-3 mcp-theme-1" id="patients-list">
+        <div class="card">
+
+            <div class="card-header px-3 py-2 d-flex align-items-center">
+                <strong class="mr-4">
+                    <i class="fas fa-user-injured"></i>
+                    Cancelled Appointments Pending Review
+                </strong>
+            </div>
+
+            <div class="card-body p-0">
+
+            </div>
+        </div>
+    </div>
+@endsection

+ 44 - 0
resources/views/app/mcp/cancelled_bills_pending_review.blade.php

@@ -0,0 +1,44 @@
+<div class="p-3 mcp-theme-1">
+    <div class="card">
+
+        <div class="card-header px-3 py-2 d-flex align-items-center border-bottom-0">
+            <strong class="mr-4">
+                <i class="fas fa-user-injured"></i>
+                Cancelled Bills Pending Review
+            </strong>
+        </div>
+
+        <div class="card-body p-0 border-top-0 pb-0">
+
+
+            <table class="table table-sm table-striped mb-0">
+                <thead>
+                <tr>
+                    <th class="border-bottom-0">Date</th>
+                    <th class="border-bottom-0">Patient</th>
+                    <th class="border-bottom-0">Service</th>
+                    <th class="border-bottom-0">Amount</th>
+                    <th class="border-bottom-0">Status</th>
+                </tr>
+                </thead>
+                <tbody>
+                @foreach($records as $row)
+                    <tr>
+                        <td>{{ friendly_date_time($row->effective_date, false) }}</td>
+                        <td>
+                            <a target="_blank" native href="{{route('patients.view.dashboard', $row->client)}}">
+                                {{$row->client->displayName()}}
+                            </a>
+                        </td>
+                        <td>{{ $row->code }}</td>
+                        <td>{{ $row->hcp_expected_payment_amount }}</td>
+                        <td>Cancelled</td>
+                    </tr>
+                @endforeach
+                </tbody>
+            </table>
+        </div>
+    </div>
+</div>
+
+

+ 45 - 0
resources/views/app/mcp/cancelled_supply_orders_pending_review.blade.php

@@ -0,0 +1,45 @@
+<div class="p-3 mcp-theme-1">
+    <div class="card">
+
+        <div class="card-header px-3 py-2 d-flex align-items-center border-bottom-0">
+            <strong class="mr-4">
+                <i class="fas fa-user-injured"></i>
+                Cancelled Supply Orders Pending Review
+            </strong>
+        </div>
+
+        <div class="card-body p-0 border-top-0 pb-0">
+
+
+            <table class="table table-sm table-striped mb-0">
+                <thead>
+                <tr>
+                    <th class="border-bottom-0">Date</th>
+                    <th class="border-bottom-0">Patient</th>
+                    <th class="border-bottom-0">Product</th>
+                    <th class="border-bottom-0">Reason</th>
+                    <th class="border-bottom-0">Status</th>
+                </tr>
+                </thead>
+                <tbody>
+                @foreach($records as $row)
+                    <tr>
+                        <td>{{ friendly_date_time($row->created_at, false) }}</td>
+                        <td>
+                            <a target="_blank" native href="{{route('patients.view.dashboard', $row->client)}}">
+                                {{$row->client->displayName()}}
+                            </a>
+                        </td>
+                        <td>{{ $row->product->title }}</td>
+                        <td>{{ $row->reason ?: '-' }}</td>
+                        <td>Cancelled</td>
+                    </tr>
+                @endforeach
+                </tbody>
+            </table>
+        </div>
+    </div>
+</div>
+
+
+

+ 53 - 0
resources/views/app/mcp/client_messages.blade.php

@@ -0,0 +1,53 @@
+@extends ('layouts/template')
+
+@section('content')
+<div class="p-3 mcp-theme-1" id="patients-list">
+    <div class="card">
+
+        <div class="card-header px-3 py-2 d-flex align-items-center">
+            <strong class="mr-4">
+                <i class="far fa-comments"></i>
+                Client Messages
+            </strong>
+        </div>
+
+        <div class="card-body p-0">
+            <div class="p-3">
+                @include('app.mcp.client_messages_filters')
+            </div>
+            <table class="table table-condensed p-0 m-0">
+                <thead class="bg-light">
+                    <tr>
+                        <th class="px-3 border-0">Date</th>
+                        <th class="px-3 border-0">To</th>
+                        <th class="px-3 border-0">From</th>
+                        <th class="px-3 border-0">Message</th>
+                        <th class="px-3 border-0">Status</th>
+                    </tr>
+                </thead>
+                <tbody>
+                    @foreach($clientMessages as $clientMessage)
+                    <tr>
+                        <td>{{ $clientMessage->created_at }}</td>
+                        <td>{{$clientMessage->to}}</td>
+                        <td>{{$clientMessage->from}}</td>
+                        <td><?= nl2br($clientMessage->body) ?></td>                        
+                        <td>{{-- status --}} - </td>
+                    </tr>
+                    @endforeach
+
+                    @if(count($clientMessages) === 0)
+                    <tr>
+                        <td colspan="5">No records found!</td>
+                    </tr>
+                    @endif
+                </tbody>
+
+            </table>
+            <div class="ml-2 mt-2">
+                {{ $clientMessages->appends(request()->input())->links() }}
+            </div>
+        </div>
+    </div>
+</div>
+@endsection

+ 95 - 0
resources/views/app/mcp/client_messages_filters.blade.php

@@ -0,0 +1,95 @@
+<style>
+	#mcp-client-messages-filters label {
+		font-weight: bold;
+	}
+
+	#mcp-client-messages-filters .mw-100px {
+		min-width: 100px;
+	}
+</style>
+<form id="mcp-client-messages-filters" method="GET" action="{{ route('mcp.client_messages') }}" class="row align-items-end" v-cloak>
+	<!-- DATE	 -->
+	<div class="col-md-2">
+		<div class="form-group">
+			<label>Date:</label>
+			<select name="date_category" class="form-control input-sm" v-model="filters.date_category">
+				<option value="">All</option>
+				<option value="EXACTLY">Exactly</option>
+				<option value="LESS_THAN">Less Than</option>
+				<option value="GREATER_THAN">Greater Than</option>
+				<option value="BETWEEN">Between</option>
+				<option value="NOT_BETWEEN">Not Between</option>
+			</select>
+		</div>
+	</div>
+	<div v-if="filters.date_category" class="col-md-2">
+		<div class="form-group">
+			<label>&nbsp;</label>
+			<input name="date_value_1" value="{{ $date_value_1 ?? '' }}" type="date" class="form-control input-sm" :placeholder="(filters.date_category === 'BETWEEN' || filters.date_category === 'NOT_BETWEEN') ? 'From' : 'Date'" />
+		</div>
+	</div>
+	<div v-if="filters.date_category && (filters.date_category === 'BETWEEN' || filters.date_category === 'NOT_BETWEEN')" class="col-md-2">
+		<div class="form-group">
+			<label>&nbsp;</label>
+			<input name="date_value_2" value="{{ $date_value_2 ?? '' }}" type="date" class="form-control input-sm" placeholder="To" />
+		</div>
+	</div>
+	<!-- TO OR FROM ME -->
+	<div class="col-md-2">
+		<div class="form-group">
+			<label>To or From Me:</label>
+			<select name="to_or_from_me" class="form-control input-sm" v-model="filters.to_or_from_me">
+				<option value="ALL">All</option>
+				<option value="TO_ME">To me</option>
+				<option value="FROM_ME">From Me</option>
+			</select>
+		</div>
+	</div>
+	<!-- STATUS -->
+	<div class="col-md-2">
+		<div class="form-group">
+			<label>Status:</label>
+			<select name="status" class="form-control input-sm" v-model="filters.status">
+				<option value="ALL">All</option>
+				<option value="AWAITING_REPLY">AWaiting Reply</option>
+			</select>
+		</div>
+	</div>
+
+	<div class="col-md-2">
+		<div class="form-group d-flex">
+			<label>&nbsp;</label>
+			<button type="submit" class="btn btn-primary btn-sm mr-2 mw-100px">Apply Filters</button>
+			<a href="{{ route('mcp.patients') }}" class="btn btn-danger btn-sm text-white mw-100px">Clear Filters</a>
+		</div>
+	</div>
+</form>
+
+<script>
+	(function() {
+		function init() {
+			window.apapp = new Vue({
+				el: '#mcp-client-messages-filters',
+				delimiters: ['@{{', '}}'],
+				data: {
+					filters: {
+						date_category: "<?= $date_category ?? '' ?>",
+						to_or_from_me: "<?= $to_or_from_me ?? '' ?>",
+						status: "<?= $status ?? '' ?>"
+					}
+				},
+				methods: {
+					init: function() {
+
+					}
+				},
+				mounted: function() {
+					this.init();
+				},
+			});
+
+
+		}
+		addMCInitializer('mcp-client-messages-filters', init, '#mcp-client-messages-filters');
+	})();
+</script>

+ 71 - 0
resources/views/app/mcp/dashboard/appointments.blade.php

@@ -0,0 +1,71 @@
+<table v-if="events.length > 0"
+       class="mb-0 table table-sm table-bordered appointments">
+    <tr v-for="event in events" class="">
+        <td>
+            <a :href="'/patients/view/' + event.clientUid" class="font-weight-bold">@{{
+                event.clientName }}</a>
+        </td>
+        <td>
+            {{-- <span class="small d-inline-block text-secondary font-weight-normal"> (@{{ event.clientAge }} y.o. @{{event.clientSex}})</span>--}}
+            @{{ event.friendlyStartTime }} - @{{ event.friendlyEndTime }} <span
+                class="text-secondary">@{{ formatTimeZone(event.timezone) }}</span>
+            <span v-if="event.title"
+                  class="d-inline-block ml- 2 text-secondary font-weight-bold">
+                                                      &nbsp;/&nbsp;
+                                                  @{{ event.title }}
+                                                  </span>
+            <a :href="'/patients/view/' + event.clientUid + '/calendar/' + event.uid">
+                <i class="fa fa-edit"></i>
+            </a>
+        </td>
+        <td>
+            <div class="d-flex align-items-baseline">
+                <!-- <div v-if="event.status === 'CREATED'"
+                     class="text-warning-mellow font-weight-bold">
+                    <i class="fa fa-exclamation-triangle"></i>
+                    Confirmation pending
+                </div>
+                <div v-else-if="event.status === 'CONFIRMED'"
+                     class="text-success font-weight-bold">
+                    <i class="fa fa-check"></i>
+                    Confirmed by the patient
+                </div>
+                <div v-else-if="event.status === 'REJECTED'"
+                     class="text-danger font-weight-bold">
+                    <i class="fa fa-stop"></i>
+                    Rejected by the patient
+                </div> -->
+                <select v-model="event.newStatus"
+                        class="form-control input-sm bg-light"
+                        v-on:change="updateStatus(event)">
+                    <option value="CREATED">CREATED</option>
+                    <option value="CONFIRMED">CONFIRMED</option>
+                    <option value="CANCELLED">CANCELLED</option>
+                    <option value="COMPLETED">COMPLETED</option>
+                    <option value="ABANDONED">ABANDONED</option>
+                </select>
+                <div v-if="selectedDate === '{{ date('Y-m-d') }}'"
+                     class="pt-1 text-right"
+                     :class="event.started ? 'text-danger': 'text-secondary'">
+                    @{{ event.inHowManyHours }}
+                </div>
+            </div>
+        </td>
+        <td>
+            <div>
+                <b v-if="event.coverage == 'YES'" class="text-success">Covered</b>
+                <b v-else-if="event.coverage == 'NO'" class="text-danger">Not
+                    Covered</b>
+                <b v-else class="text-warning-mellow">Pending</b>
+            </div>
+        </td>
+    </tr>
+</table>
+<div v-if="numEventsForDate === 0 && selectedDate"
+     class="bg-light p-3 text-secondary border bounded">
+    <span v-if="filterStatus === ''">You have no appointments on <b>@{{ formatSelectedDate(selectedDate) }}</b></span>
+    <span v-if="filterStatus !== ''">You have no appointments on <b>@{{ formatSelectedDate(selectedDate) }}</b> with status <b>@{{ filterStatus }}</b></span>
+</div>
+<div v-show="!selectedDate" class="bg-light p-3 text-secondary border bounded">
+    Please select a date from the calendar on the left
+</div>

+ 1 - 0
resources/views/app/mcp/dashboard/calls_memos.blade.php

@@ -0,0 +1 @@
+<h1>Phone Calls & Memos</h1>

+ 1 - 0
resources/views/app/mcp/dashboard/erx_orders.blade.php

@@ -0,0 +1 @@
+<h1>ERX & Orders</h1>

+ 1 - 0
resources/views/app/mcp/dashboard/measurements.blade.php

@@ -0,0 +1 @@
+<div id="measurements-tab">Loading...</div>

+ 1 - 0
resources/views/app/mcp/dashboard/messages.blade.php

@@ -0,0 +1 @@
+<h1>Messages</h1>

+ 1 - 0
resources/views/app/mcp/dashboard/notifications.blade.php

@@ -0,0 +1 @@
+<h1>Notifications</h1>

+ 1 - 0
resources/views/app/mcp/dashboard/reports.blade.php

@@ -0,0 +1 @@
+<h1>Reports</h1>

+ 1 - 0
resources/views/app/mcp/dashboard/supply_orders.blade.php

@@ -0,0 +1 @@
+<h1>Supply Orders</h1>

+ 51 - 0
resources/views/app/mcp/erx_and_orders.blade.php

@@ -0,0 +1,51 @@
+@extends ('layouts/template')
+
+@section('content')
+<div class="p-3 mcp-theme-1" id="patients-list">
+    <div class="card">
+
+        <div class="card-header px-3 py-2 d-flex align-items-center">
+            <strong class="mr-4">
+                <i class="fas fa-file-prescription"></i>
+                ERx & Orders
+            </strong>
+        </div>
+
+        <div class="card-body p-0">
+            <div class="p-3">
+                @include('app.mcp.erx_and_orders_filters')
+            </div>
+            <table class="table table-condensed p-0 m-0">
+                <thead class="bg-light">
+                    <tr>
+                        <th class="px-3 border-0">Date</th>
+                        <th class="px-3 border-0">Patient</th>
+                        <th class="px-3 border-0">Content</th>
+                        <th class="px-3 border-0">Status</th>
+                    </tr>
+                </thead>
+                <tbody>
+                    @foreach($erxAndOrders as $erxAndOrder)
+                    <tr>
+                        <td>{{-- date --}} -</td>
+                        <td>{{-- patient --}} -</td>
+                        <td>{{-- content --}} - </td>
+                        <td>{{-- status --}} - </td>
+                    </tr>
+                    @endforeach
+
+                    @if(count($erxAndOrders) === 0)
+                    <tr>
+                        <td colspan="4">No records found!</td>
+                    </tr>
+                    @endif
+                </tbody>
+
+            </table>
+            <div class="ml-2 mt-2">
+                {{ $erxAndOrders->appends(request()->input())->links() }}
+            </div>
+        </div>
+    </div>
+</div>
+@endsection

+ 87 - 0
resources/views/app/mcp/erx_and_orders_filters.blade.php

@@ -0,0 +1,87 @@
+<style>
+	#mcp-erx-and-orders-filters label {
+		font-weight: bold;
+	}
+
+	#mcp-erx-and-orders-filters .mw-100px {
+		min-width: 100px;
+	}
+</style>
+<form id="mcp-erx-and-orders-filters" method="GET" action="{{ route('mcp.notes') }}" class="row align-items-end" v-cloak>
+	<!-- DATE	 -->
+	<div class="col-md-2">
+		<div class="form-group">
+			<label>Date:</label>
+			<select name="date_category" class="form-control input-sm" v-model="filters.date_category">
+				<option value="">All</option>
+				<option value="EXACTLY">Exactly</option>
+				<option value="LESS_THAN">Less Than</option>
+				<option value="GREATER_THAN">Greater Than</option>
+				<option value="BETWEEN">Between</option>
+				<option value="NOT_BETWEEN">Not Between</option>
+			</select>
+		</div>
+	</div>
+	<div v-if="filters.date_category" class="col-md-2">
+		<div class="form-group">
+			<label>&nbsp;</label>
+			<input name="date_value_1" value="{{ $date_value_1 ?? '' }}" type="date" class="form-control input-sm" :placeholder="(filters.date_category === 'BETWEEN' || filters.date_category === 'NOT_BETWEEN') ? 'From' : 'Date'" />
+		</div>
+	</div>
+	<div v-if="filters.date_category && (filters.date_category === 'BETWEEN' || filters.date_category === 'NOT_BETWEEN')" class="col-md-2">
+		<div class="form-group">
+			<label>&nbsp;</label>
+			<input name="date_value_2" value="{{ $date_value_2 ?? '' }}" type="date" class="form-control input-sm" placeholder="To" />
+		</div>
+	</div>
+	<!-- STATUS -->
+	<div class="col-md-2">
+		<div class="form-group">
+			<label>Status:</label>
+			<select name="status" class="form-control input-sm" v-model="filters.status">
+				<option value="ALL">All</option>
+				<option value="NEW">New</option>
+				<option value="SIGNED">Signed</option>
+				<option value="VERIFIED">Verified</option>
+				<option value="PROCESSED">Processed</option>
+				<option value="CANCELLED">Cancelled</option>
+			</select>
+		</div>
+	</div>
+
+	<div class="col-md-2">
+		<div class="form-group d-flex">
+			<label>&nbsp;</label>
+			<button type="submit" class="btn btn-primary btn-sm mr-2 mw-100px">Apply Filters</button>
+			<a href="{{ route('mcp.patients') }}" class="btn btn-danger btn-sm text-white mw-100px">Clear Filters</a>
+		</div>
+	</div>
+</form>
+
+<script>
+	(function() {
+		function init() {
+			window.apapp = new Vue({
+				el: '#mcp-erx-and-orders-filters',
+				delimiters: ['@{{', '}}'],
+				data: {
+					filters: {
+						date_category: "<?= $date_category ?? '' ?>",
+						status: "<?= $status ?? '' ?>"
+					}
+				},
+				methods: {
+					init: function() {
+
+					}
+				},
+				mounted: function() {
+					this.init();
+				},
+			});
+
+
+		}
+		addMCInitializer('mcp-erx-and-orders-filters', init, '#mcp-erx-and-orders-filters');
+	})();
+</script>

+ 76 - 0
resources/views/app/mcp/erx_and_orders_pending_signature.blade.php

@@ -0,0 +1,76 @@
+<div class="p-3 mcp-theme-1">
+    <div class="card">
+
+        <div class="card-header px-3 py-2 d-flex align-items-center border-bottom-0">
+            <strong class="mr-4">
+                <i class="fas fa-user-injured"></i>
+                ERx & Orders Pending Signature
+            </strong>
+        </div>
+
+        <div class="card-body p-0 border-top-0 pb-0">
+
+
+            <table class="table table-sm table-striped mb-0">
+                <thead>
+                <tr>
+                    <th class="border-bottom-0">Date</th>
+                    <th class="border-bottom-0">Patient</th>
+                    <th class="border-bottom-0">Category</th>
+                    <th class="border-bottom-0">Content</th>
+                    <th class="border-bottom-0">Status</th>
+                </tr>
+                </thead>
+                <tbody>
+                @foreach($records as $row)
+                    <tr>
+                        <td>{{ friendly_date_time($row->created_at, false) }}</td>
+                        <td>
+                            <a target="_blank" native href="{{route('patients.view.dashboard', $row->client)}}">
+                                {{$row->client->displayName()}}
+                            </a>
+                        </td>
+                        <td>{{ ucwords($row->erx_category) }}</td>
+                        <td>
+                            <?php $parsed = @$row->clinical_detail_json ? json_decode($row->clinical_detail_json) : false; ?>
+                            @if($row->erx_category === 'DRUG')
+                                <?php
+                                $drugs = ($parsed && @$parsed->items) ? $parsed->items : [];
+                                ?>
+                                @foreach($drugs as $drug)
+                                    <div class="d-flex align-items-baseline mb-1">
+                                        <b class="mr-2">{{$drug->medication ?? '-'}}</b>
+                                        <span class="text-secondary mr-1">{{$drug->frequency ?? ''}}</span>
+                                    </div>
+                                @endforeach
+                            @elseif($row->erx_category === 'LAB' || $row->erx_category === 'IMAGING')
+                                <?php
+                                $tests = ($parsed && @$parsed->tests) ? $parsed->tests : [];
+                                ?>
+                                @foreach($tests as $test)
+                                    <div class="d-flex align-items-baseline mb-1">
+                                        <b class="mr-2">{{$test ?? '-'}}</b>
+                                    </div>
+                                @endforeach
+                            @elseif($row->erx_category === 'REFERRAL')
+                                <b class="mr-2">{{@$parsed->to ?? '-'}}</b>
+                                <span class="text-secondary mr-1">{{@$parsed->memo ?? '-'}}</span>
+                            @elseif($row->erx_category === 'SUPPLY')
+                                <b class="mr-2">{{@$parsed->item ?? '-'}}</b>
+                                <span class="text-secondary mr-1">{{@$parsed->quantity ?? '-'}}</span>
+                            @elseif($row->erx_category === 'OTHER')
+                                <b class="mr-2">{{@$parsed->title ?? '-'}}</b>
+                                <span class="text-secondary mr-1">{{@$parsed->memo ?? '-'}}</span>
+                            @endif
+                        </td>
+                        <td>{{ $row->pro_declared_status ?: '-' }}</td>
+                    </tr>
+                @endforeach
+                </tbody>
+            </table>
+        </div>
+    </div>
+</div>
+
+
+

+ 79 - 0
resources/views/app/mcp/new_patients_awaiting_visit.blade.php

@@ -0,0 +1,79 @@
+    <div class="p-3 mcp-theme-1">
+        <div class="card">
+
+            <div class="card-header px-3 py-2 d-flex align-items-center border-bottom-0">
+                <strong class="mr-4">
+                    <i class="fas fa-user-injured"></i>
+                    New Patients Awaiting Visit
+                </strong>
+            </div>
+
+            <div class="card-body p-0 border-top-0 pb-0">
+                <table class="table table-sm table-striped mb-0">
+                    <thead>
+                    <tr>
+                        <th class="border-bottom-0">Chart #</th>
+                        <th class="border-bottom-0">Name (F.I. LAST)</th>
+                        <th class="border-bottom-0">DOB</th>
+                        <th class="border-bottom-0">Gender</th>
+                        <th class="border-bottom-0">BMI</th>
+                        <th class="border-bottom-0">Insurance</th>
+                        <th class="border-bottom-0">Last Visit</th>
+                        <th class="border-bottom-0">Next Appt.</th>
+                        <th class="border-bottom-0">Status</th>
+                        <th class="border-bottom-0">CCM</th>
+                        <th class="border-bottom-0">RPM</th>
+                        <th class="border-bottom-0">Last Weight-In</th>
+                        <th class="border-bottom-0">Last BP</th>
+                        <th class="border-bottom-0">Assigned On</th>
+                    </tr>
+                    </thead>
+                    <tbody>
+                    @foreach($records as $row)
+                        <tr>
+                            <td class="border-bottom-0">
+                                <a target="_blank" native href="{{route('patients.view.dashboard', $row)}}">
+                                    {{$row->chart_number}}
+                                </a>
+                            </td>
+                            <td class="border-bottom-0">{{implode(' ', [$row->name_first, $row->name_last])}}</td>
+                            <td class="border-bottom-0">{{$row->dob}}</td>
+                            <td class="border-bottom-0">{{$row->sex}}</td>
+                            <td class="border-bottom-0">{{$row->usual_bmi}}</td>
+                            <td class="border-bottom-0">
+                                <?php $coverageStatus = $row->getPrimaryCoverageStatus(); ?>
+                                @if($coverageStatus === 'YES')
+                                    <div class="text-nowrap">Covered <i class="fa fa-check-circle text-success"></i>
+                                    </div>
+                                @elseif($coverageStatus === 'NO')
+                                    <div class="text-nowrap">Not Covered <i class="fa fa-times text-danger"></i></div>
+                                @else
+                                    <div class="text-nowrap">Unknown <i
+                                                class="fa fa-exclamation-triangle text-warning-mellow"></i></div>
+                                @endif
+                                <?php $coverage = $row->getPrimaryCoverage(); ?>
+                                @if($coverage)
+                                    {{$coverage->toString()}}
+                                @endif
+                            </td>
+                            <td class="border-bottom-0">{{$row->lastMcpAppointment() ? $row->lastMcpAppointment()->start_date : '-'}}</td>
+                            <td class="border-bottom-0">{{$row->nextMcpAppointment() ? $row->nextMcpAppointment()->start_date : '-'}}</td>
+                            <td class="border-bottom-0">{{$row->nextMcpAppointment() ? $row->nextMcpAppointment()->status : '-'}}</td>
+                            <td class="border-bottom-0">{{$row->is_enrolled_in_cm ? 'Yes' : 'No'}}</td>
+                            <td class="border-bottom-0">{{$row->is_enrolled_in_rm ? 'Yes' : 'No'}}</td>
+                            <td class="border-bottom-0">
+                                <?php $m = $row->lastMeasurementOfType('Wt. (lbs.)'); ?>
+                                {{$m && $m->value ? round($m->value, 2) : '-'}}
+                            </td>
+                            <td class="border-bottom-0">
+                                <?php $m = $row->lastMeasurementOfType('BP'); ?>
+                                {{$m && $m->value ? $m->value : '-'}}
+                            </td>
+                            <td class="border-bottom-0">{{$row->getMcpAssignedOn()}}</td>
+                        </tr>
+                    @endforeach
+                    </tbody>
+                </table>
+            </div>
+        </div>
+    </div>

+ 51 - 0
resources/views/app/mcp/notes.blade.php

@@ -0,0 +1,51 @@
+@extends ('layouts/template')
+
+@section('content')
+<div class="p-3 mcp-theme-1" id="patients-list">
+    <div class="card">
+
+        <div class="card-header px-3 py-2 d-flex align-items-center">
+            <strong class="mr-4">
+                <i class="fas fa-notes-medical"></i>
+                Notes
+            </strong>
+        </div>
+
+        <div class="card-body p-0">
+            <div class="p-3">
+                @include('app.mcp.notes_filters')
+            </div>
+            <table class="table table-condensed p-0 m-0">
+                <thead class="bg-light">
+                    <tr>
+                        <th class="px-3 border-0">Date</th>
+                        <th class="px-3 border-0">Patient</th>
+                        <th class="px-3 border-0">ICD</th>
+                        <th class="px-3 border-0">Status</th>
+                    </tr>
+                </thead>
+                <tbody>
+                    @foreach($notes as $note)
+                    <tr>
+                        <td>{{-- date --}} -</td>
+                        <td>{{-- patient --}} - </td>
+                        <td>{{-- ICD --}} - </td>
+                        <td>{{-- Status --}} - </td>
+                    </tr>
+                    @endforeach
+
+                    @if(count($notes) === 0)
+                    <tr>
+                        <td colspan="5">No records found!</td>
+                    </tr>
+                    @endif
+                </tbody>
+
+            </table>
+            <div class="ml-2 mt-2">
+                {{ $notes->appends(request()->input())->links() }}
+            </div>
+        </div>
+    </div>
+</div>
+@endsection

+ 87 - 0
resources/views/app/mcp/notes_filters.blade.php

@@ -0,0 +1,87 @@
+<style>
+	#mcp-notes-filters label {
+		font-weight: bold;
+	}
+
+	#mcp-notes-filters .mw-100px {
+		min-width: 100px;
+	}
+</style>
+<form id="mcp-notes-filters" method="GET" action="{{ route('mcp.notes') }}" class="row align-items-end" v-cloak>
+	<!-- DATE	 -->
+	<div class="col-md-2">
+		<div class="form-group">
+			<label>Date:</label>
+			<select name="date_category" class="form-control input-sm" v-model="filters.date_category">
+				<option value="">All</option>
+				<option value="EXACTLY">Exactly</option>
+				<option value="LESS_THAN">Less Than</option>
+				<option value="GREATER_THAN">Greater Than</option>
+				<option value="BETWEEN">Between</option>
+				<option value="NOT_BETWEEN">Not Between</option>
+			</select>
+		</div>
+	</div>
+	<div v-if="filters.date_category" class="col-md-2">
+		<div class="form-group">
+			<label>&nbsp;</label>
+			<input name="date_value_1" value="{{ $date_value_1 ?? '' }}" type="date" class="form-control input-sm" :placeholder="(filters.date_category === 'BETWEEN' || filters.date_category === 'NOT_BETWEEN') ? 'From' : 'Date'" />
+		</div>
+	</div>
+	<div v-if="filters.date_category && (filters.date_category === 'BETWEEN' || filters.date_category === 'NOT_BETWEEN')" class="col-md-2">
+		<div class="form-group">
+			<label>&nbsp;</label>
+			<input name="date_value_2" value="{{ $date_value_2 ?? '' }}" type="date" class="form-control input-sm" placeholder="To" />
+		</div>
+	</div>
+	<!-- STATUS -->
+	<div class="col-md-2">
+		<div class="form-group">
+			<label>Status:</label>
+			<select name="status" class="form-control input-sm" v-model="filters.status">
+				<option value="ALL">All</option>
+				<option value="NEW">New</option>
+				<option value="SIGNED">Signed</option>
+				<option value="VERIFIED">Verified</option>
+				<option value="PROCESSED">Processed</option>
+				<option value="CANCELLED">Cancelled</option>
+			</select>
+		</div>
+	</div>	
+
+	<div class="col-md-2">
+		<div class="form-group d-flex">
+			<label>&nbsp;</label>
+			<button type="submit" class="btn btn-primary btn-sm mr-2 mw-100px">Apply Filters</button>
+			<a href="{{ route('mcp.patients') }}" class="btn btn-danger btn-sm text-white mw-100px">Clear Filters</a>
+		</div>
+	</div>
+</form>
+
+<script>
+	(function() {
+		function init() {
+			window.apapp = new Vue({
+				el: '#mcp-notes-filters',
+				delimiters: ['@{{', '}}'],
+				data: {
+					filters: {
+						date_category: "<?= $date_category ?? '' ?>",						
+						status: "<?= $status ?? '' ?>"
+					}
+				},
+				methods: {
+					init: function() {
+						
+					}
+				},
+				mounted: function() {
+					this.init();
+				},
+			});
+
+
+		}
+		addMCInitializer('mcp-notes-filters', init, '#mcp-notes-filters');
+	})();
+</script>

+ 48 - 0
resources/views/app/mcp/notes_pending_billing.blade.php

@@ -0,0 +1,48 @@
+<div class="p-3 mcp-theme-1">
+    <div class="card">
+
+        <div class="card-header px-3 py-2 d-flex align-items-center border-bottom-0">
+            <strong class="mr-4">
+                <i class="fas fa-user-injured"></i>
+                Notes Pending Billing
+            </strong>
+        </div>
+
+        <div class="card-body p-0 border-top-0 pb-0">
+            <table class="table table-sm table-striped mb-0">
+                <thead>
+                <tr>
+                    <th class="border-bottom-0">Date</th>
+                    <th class="border-bottom-0">Patient</th>
+                    <th class="border-bottom-0">ICD</th>
+                    <th class="border-bottom-0">Status</th>
+                </tr>
+                </thead>
+                <tbody>
+                @foreach($records as $row)
+                    <tr>
+                        <td class="border-bottom-0">
+                            <a native target="_blank" href="/patients/view/{{ $row->client->uid }}/notes/view/{{ $row->uid }}" class="font-weight-bold">
+                                {{ friendlier_date($row->effective_dateest) }}
+                            </a>
+                        </td>
+                        <td class="border-bottom-0">{{$row->client->displayName()}}</td>
+                        <td class="border-bottom-0">
+                            @foreach($row->reasons as $reason)
+                                <span class="pr-2">{{$reason->code}}</span>
+                            @endforeach
+                            @if(!$row->reasons || !count($row->reasons))
+                                -
+                            @endif
+                        </td>
+                        <td class="border-bottom-0">
+                            {{$row->overallStatus()}}
+                        </td>
+                    </tr>
+                @endforeach
+                </tbody>
+            </table>
+        </div>
+    </div>
+</div>
+

+ 48 - 0
resources/views/app/mcp/notes_pending_signature.blade.php

@@ -0,0 +1,48 @@
+<div class="p-3 mcp-theme-1">
+    <div class="card">
+
+        <div class="card-header px-3 py-2 d-flex align-items-center border-bottom-0">
+            <strong class="mr-4">
+                <i class="fas fa-user-injured"></i>
+                Notes Pending Signature
+            </strong>
+        </div>
+
+        <div class="card-body p-0 border-top-0 pb-0">
+            <table class="table table-sm table-striped mb-0">
+                <thead>
+                <tr>
+                    <th class="border-bottom-0">Date</th>
+                    <th class="border-bottom-0">Patient</th>
+                    <th class="border-bottom-0">ICD</th>
+                    <th class="border-bottom-0">Status</th>
+                </tr>
+                </thead>
+                <tbody>
+                @foreach($records as $row)
+                    <tr>
+                        <td class="border-bottom-0">
+                            <a native target="_blank" href="/patients/view/{{ $row->client->uid }}/notes/view/{{ $row->uid }}" class="font-weight-bold">
+                                {{ friendlier_date($row->effective_dateest) }}
+                            </a>
+                        </td>
+                        <td class="border-bottom-0">{{$row->client->displayName()}}</td>
+                        <td class="border-bottom-0">
+                            @foreach($row->reasons as $reason)
+                                <span class="pr-2">{{$reason->code}}</span>
+                            @endforeach
+                            @if(!$row->reasons || !count($row->reasons))
+                                -
+                            @endif
+                        </td>
+                        <td class="border-bottom-0">
+                            {{$row->overallStatus()}}
+                        </td>
+                    </tr>
+                @endforeach
+                </tbody>
+            </table>
+        </div>
+    </div>
+</div>
+

+ 93 - 0
resources/views/app/mcp/patients.blade.php

@@ -0,0 +1,93 @@
+@extends ('layouts/template')
+
+@section('content')
+<div class="p-3 mcp-theme-1" id="patients-list">
+    <div class="card">
+
+        <div class="card-header px-3 py-2 d-flex align-items-center">
+            <strong class="mr-4">
+                <i class="fas fa-user-injured"></i>
+                Patients
+            </strong>
+        </div>
+
+        <div class="card-body p-0">
+            <div class="p-3">
+                @include('app.mcp.patients_filters')
+            </div>
+            <table class="table table-condensed p-0 m-0">
+                <thead class="bg-light">
+                    <tr>
+                        <th class="px-3 border-0">Chart #</th>
+                        <th class="px-3 border-0">Name (F.I. LAST)</th>
+                        <th class="px-3 border-0">DOB</th>
+                        <th class="px-3 border-0">Gender</th>
+                        <th class="px-3 border-0">BMI</th>
+                        <th class="px-3 border-0">Insurance</th>
+                        <th class="px-3 border-0">Last Visit</th>
+                        <th class="px-3 border-0">Next Appt.</th>
+                        <th class="px-3 border-0">Status</th>
+                        <th class="px-3 border-0">CCM</th>
+                        <th class="px-3 border-0">RPM</th>
+                        <th class="px-3 border-0">Last Weight-In</th>
+                        <th class="px-3 border-0">Last BP</th>
+                        <th class="px-3 border-0">Assigned On</th>
+                    </tr>
+                </thead>
+                <tbody>
+                    @foreach($patients as $patient)
+                    <tr>
+                        <td class="px-3">
+                            <a href="{{route('patients.view.dashboard', $patient)}}">
+                                {{$patient->chart_number}}
+                            </a>
+                        </td>
+                        <td>{{$patient->displayName()}}</td>
+                        <td>{{ friendly_date_time($patient->dob, false) }} {{ $patient->age_in_years ? '(' . $patient->age_in_years . ' y.o)' : '(-)' }}</td>
+                        <td>{{ $patient->sex }}</td>
+                        <td>{{ $patient->usual_bmi }}</td>
+                        <td>
+                            <?php $coverageStatus = $patient->getPrimaryCoverageStatus(); ?>
+                            @if($coverageStatus === 'YES')
+                                <div class="text-nowrap">Covered <i class="fa fa-check-circle text-success"></i>
+                                </div>
+                            @elseif($coverageStatus === 'NO')
+                                <div class="text-nowrap">Not Covered <i class="fa fa-times text-danger"></i></div>
+                            @else
+                                <div class="text-nowrap">Unknown <i
+                                            class="fa fa-exclamation-triangle text-warning-mellow"></i></div>
+                            @endif
+                            <?php $coverage = $patient->getPrimaryCoverage(); ?>
+                            @if($coverage)
+                                {{$coverage->toString()}}
+                            @endif
+                        </td>
+                        <td>{{$patient->lastMcpAppointment() ? $patient->lastMcpAppointment()->start_date : '-'}}</td>
+                        <td>{{$patient->nextMcpAppointment() ? $patient->nextMcpAppointment()->start_date : '-'}}</td>
+                        <td>{{$patient->nextMcpAppointment() ? $patient->nextMcpAppointment()->status : '-'}}</td>
+                        <td>{{$patient->is_enrolled_in_cm ? 'Yes' : 'No'}}</td>
+                        <td>{{$patient->is_enrolled_in_rm ? 'Yes' : 'No'}}</td>
+                        <td>
+                            <?php $m = $patient->lastMeasurementOfType('Wt. (lbs.)'); ?>
+                            {{$m && $m->value ? round($m->value, 2) : '-'}}
+                        </td>
+                        <td>
+                            <?php $m = $patient->lastMeasurementOfType('BP'); ?>
+                            {{$m && $m->value ? $m->value : '-'}}
+                        </td>
+                        <td>{{$patient->getMcpAssignedOn()}}</td>
+                    </tr>
+                    @endforeach
+
+                    @if(count($patients) === 0)
+                    <tr>
+                        <td colspan="14">No records found!</td>
+                    </tr>
+                    @endif
+                </tbody>
+
+            </table>
+        </div>
+    </div>
+</div>
+@endsection

+ 261 - 0
resources/views/app/mcp/patients_filters.blade.php

@@ -0,0 +1,261 @@
+<style>
+	#mcp-patients-filters label {
+		font-weight: bold;
+	}
+
+	#mcp-patients-filters .mw-100px {
+		min-width: 100px;
+	}
+</style>
+<form id="mcp-patients-filters" method="GET" action="{{ route('mcp.patients') }}" class="row align-items-end" v-cloak>
+	<!-- AGE	 -->
+	<div class="col-md-2">
+		<div class="form-group">
+			<label>Age:</label>
+			<select name="age_category" class="form-control input-sm" v-model="filters.age_category">
+				<option value="">All</option>
+				<option value="EXACTLY">Exactly</option>
+				<option value="LESS_THAN">Less Than</option>
+				<option value="GREATER_THAN">Greater Than</option>
+				<option value="BETWEEN">Between</option>
+				<option value="NOT_BETWEEN">Not Between</option>
+			</select>
+		</div>
+	</div>
+	<div v-show="filters.age_category" class="col-md-2">
+		<div class="form-group">
+			<label>&nbsp;</label>
+			<input name="age_value_1" v-model="filters.age_value_1" type="number" class="form-control input-sm" :placeholder="(filters.age_category === 'BETWEEN' || filters.age_category === 'NOT_BETWEEN') ? 'From' : 'Age'" />
+		</div>
+	</div>
+	<div v-show="filters.age_category && (filters.age_category === 'BETWEEN' || filters.age_category === 'NOT_BETWEEN')" class="col-md-2">
+		<div class="form-group">
+			<label>&nbsp;</label>
+			<input name="age_value_2" v-model="filters.age_value_2" type="number" class="form-control input-sm" placeholder="To" />
+		</div>
+	</div>
+	<!-- SEX -->
+	<div class="col-md-2">
+		<div class="form-group">
+			<label>Sex:</label>
+			<select name="sex" class="form-control input-sm" v-model="filters.sex">
+				<option value="">All</option>
+				<option value="M">Male</option>
+				<option value="F">Female</option>
+			</select>
+		</div>
+	</div>
+	<!-- BMI -->
+	<div class="col-md-2">
+		<div class="form-group">
+			<label>BMI:</label>
+			<select name="bmi_category" class="form-control input-sm" v-model="filters.bmi_category">
+				<option value="">All</option>
+				<option value="EXACTLY">Exactly</option>
+				<option value="LESS_THAN">Less Than</option>
+				<option value="GREATER_THAN">Greater Than</option>
+				<option value="BETWEEN">Between</option>
+				<option value="NOT_BETWEEN">Not Between</option>
+			</select>
+		</div>
+	</div>
+	<div v-show="filters.bmi_category" class="col-md-2">
+		<div class="form-group">
+			<label>&nbsp;</label>
+			<input name="bmi_value_1" v-model="filters.bmi_value_1" type="number" class="form-control input-sm" :placeholder="(filters.bmi_category === 'BETWEEN' || filters.bmi_category === 'NOT_BETWEEN') ? 'From' : 'BMI'" />
+		</div>
+	</div>
+	<div v-show="filters.bmi_category && (filters.bmi_category === 'BETWEEN' || filters.bmi_category === 'NOT_BETWEEN')" class="col-md-2">
+		<div class="form-group">
+			<label>&nbsp;</label>
+			<input name="bmi_value_2" v-model="filters.bmi_value_2" type="number" class="form-control input-sm" placeholder="To" />
+		</div>
+	</div>
+
+	<!-- LAST VISIT -->
+	<div class="col-md-2">
+		<div class="form-group">
+			<label>Last Visit **:</label>
+			<select name="last_visit_category" class="form-control input-sm" v-model="filters.last_visit_category">
+				<option value="">All</option>
+				<option value="EXACTLY">Exactly</option>
+				<option value="LESS_THAN">Less Than</option>
+				<option value="GREATER_THAN">Greater Than</option>
+				<option value="BETWEEN">Between</option>
+				<option value="NOT_BETWEEN">Not Between</option>
+			</select>
+		</div>
+	</div>
+	<div v-show="filters.last_visit_category" class="col-md-2">
+		<div class="form-group">
+			<label>&nbsp;</label>
+			<input name="last_visit_value_1" v-model="filters.last_visit_value_1" type="date" class="form-control input-sm" :placeholder="(filters.last_visit_category === 'BETWEEN' || filters.last_visit_category === 'NOT_BETWEEN') ? 'From' : 'Last Visit'" />
+		</div>
+	</div>
+	<div v-show="filters.last_visit_category && (filters.last_visit_category === 'BETWEEN' || filters.last_visit_category === 'NOT_BETWEEN')" class="col-md-2">
+		<div class="form-group">
+			<label>&nbsp;</label>
+			<input name="last_visit_value_2" v-model="filters.last_visit_value_2" type="date" class="form-control input-sm" placeholder="To" />
+		</div>
+	</div>
+
+	<!-- NEXT APPOINTMENT -->
+	<div class="col-md-2">
+		<div class="form-group">
+			<label>Next Appointment **:</label>
+			<select name="next_appointment_category" class="form-control input-sm" v-model="filters.next_appointment_category">
+				<option value="">All</option>
+				<option value="EXACTLY">Exactly</option>
+				<option value="LESS_THAN">Less Than</option>
+				<option value="GREATER_THAN">Greater Than</option>
+				<option value="BETWEEN">Between</option>
+				<option value="NOT_BETWEEN">Not Between</option>
+			</select>
+		</div>
+	</div>
+	<div v-if="filters.next_appointment_category" class="col-md-2">
+		<div class="form-group">
+			<label>&nbsp;</label>
+			<input name="next_appointment_value_1" v-model="filters.next_appointment_value_1" type="date" class="form-control input-sm" :placeholder="(filters.next_appointment_category === 'BETWEEN' || filters.next_appointment_category === 'NOT_BETWEEN') ? 'From' : 'Next Appointment'" />
+		</div>
+	</div>
+	<div v-if="filters.next_appointment_category && (filters.next_appointment_category === 'BETWEEN' || filters.next_appointment_category === 'NOT_BETWEEN')" class="col-md-2">
+		<div class="form-group">
+			<label>&nbsp;</label>
+			<input name="next_appointment_value_2" v-model="filters.next_appointment_value_2" type="date" class="form-control input-sm" placeholder="To" />
+		</div>
+	</div>
+
+	<!-- STATUS -->
+	<div class="col-md-2">
+		<div class="form-group">
+			<label>Status:</label>
+			<select name="status" class="form-control input-sm" v-model="filters.status">
+				<option value="">All</option>
+				<option value="ACTIVE">Active</option>
+				<option value="AWAITING_VISIT">Awaiting Visit</option>
+				<option value="INACTIVE">Inactive</option>
+			</select>
+		</div>
+	</div>
+
+	<!-- LAST WEIGHED-IN -->
+	<div class="col-md-2">
+		<div class="form-group">
+			<label>Last Weighed-In:</label>
+			<select name="last_weighed_in_category" class="form-control input-sm" v-model="filters.last_weighed_in_category">
+				<option value="">All</option>
+				<option value="EXACTLY">Exactly</option>
+				<option value="LESS_THAN">Less Than</option>
+				<option value="GREATER_THAN">Greater Than</option>
+				<option value="BETWEEN">Between</option>
+				<option value="NOT_BETWEEN">Not Between</option>
+			</select>
+		</div>
+	</div>
+	<div v-if="filters.last_weighed_in_category" class="col-md-2">
+		<div class="form-group">
+			<label>&nbsp;</label>
+			<input name="last_weighed_in_value_1" v-model="filters.last_weighed_in_value_1" type="date" class="form-control input-sm" :placeholder="(filters.last_weighed_in_category === 'BETWEEN' || filters.last_weighed_in_category === 'NOT_BETWEEN') ? 'From' : 'Enter Date'" />
+		</div>
+	</div>
+	<div v-if="filters.last_weighed_in_category && (filters.last_weighed_in_category === 'BETWEEN' || filters.last_weighed_in_category === 'NOT_BETWEEN')" class="col-md-2">
+		<div class="form-group">
+			<label>&nbsp;</label>
+			<input name="last_weighed_in_value_2" v-model="filters.last_weighed_in_value_2" type="date" class="form-control input-sm" placeholder="To" />
+		</div>
+	</div>
+
+	<!-- LAST BP -->
+	<div class="col-md-2">
+		<div class="form-group">
+			<label>Last BP:</label>
+			<select name="last_bp_category" class="form-control input-sm" v-model="filters.last_bp_category">
+				<option value="">All</option>
+				<option value="EXACTLY">Exactly</option>
+				<option value="LESS_THAN">Less Than</option>
+				<option value="GREATER_THAN">Greater Than</option>
+				<option value="BETWEEN">Between</option>
+				<option value="NOT_BETWEEN">Not Between</option>
+			</select>
+		</div>
+	</div>
+	<div v-if="filters.last_bp_category" class="col-md-2">
+		<div class="form-group">
+			<label>&nbsp;</label>
+			<input name="last_bp_value_1" v-model="filters.last_bp_value_1" type="date" class="form-control input-sm" :placeholder="(filters.last_bp_category === 'BETWEEN' || filters.last_bp_category === 'NOT_BETWEEN') ? 'From' : 'Enter Date'" />
+		</div>
+	</div>
+	<div v-if="filters.last_bp_category && (filters.last_bp_category === 'BETWEEN' || filters.last_bp_category === 'NOT_BETWEEN')" class="col-md-2">
+		<div class="form-group">
+			<label>&nbsp;</label>
+			<input name="last_bp_value_2" v-model="filters.last_bp_value_2" type="date" class="form-control input-sm" placeholder="To" />
+		</div>
+	</div>
+
+	<div class="col-md-2">
+		<div class="form-group d-flex">
+			<label>&nbsp;</label>
+			<button type="button" v-on:click.prevent="doSubmit()" class="btn btn-primary btn-sm mr-2 mw-100px">Apply Filters</button>
+			<a href="{{ route('mcp.patients') }}" class="btn btn-danger btn-sm text-white mw-100px">Clear Filters</a>
+		</div>
+	</div>
+</form>
+
+<?php
+$loadedFilters = $filters;
+$allFilterKeys = [
+	'age_category',
+	'age_value_1',
+	'age_value_2',
+	'bmi_category',
+	'bmi_value_1',
+	'bmi_value_2',
+	'last_bp_category',
+	'last_bp_value_1',
+	'last_bp_value_2',
+	'last_visit_category',
+	'last_visit_value_1',
+	'last_visit_value_2',
+	'last_weighed_in_category',
+	'last_weighed_in_value_1',
+	'next_appointment_category',
+	'next_appointment_value_1',
+	'sex',
+	'status',
+];
+for ($i=0; $i < count($allFilterKeys); $i++) {
+	if (!isset($loadedFilters[$allFilterKeys[$i]]) || !$loadedFilters[$allFilterKeys[$i]]) {
+		$loadedFilters[$allFilterKeys[$i]] = '';
+	}
+}
+?>
+<script>
+	(function() {
+		function init() {
+			new Vue({
+				el: '#mcp-patients-filters',
+				delimiters: ['@{{', '}}'],
+				data: {
+					filters: <?= json_encode($loadedFilters) ?>
+				},
+				methods: {
+					init: function() {
+						
+					},
+					doSubmit: function() {
+						fastLoad('{{ route('mcp.patients') }}?' + $('#mcp-patients-filters').serialize());
+						return false;
+					}
+				},
+				mounted: function() {
+					console.log(this.filters);
+					this.init();
+				},
+			});
+
+
+		}
+		addMCInitializer('mcp-patients-filters', init, '#mcp-patients-filters');
+	})();
+</script>

+ 19 - 0
resources/views/app/mcp/patients_overdue_for_visit.blade.php

@@ -0,0 +1,19 @@
+@extends ('layouts/template')
+
+@section('content')
+    <div class="p-3 mcp-theme-1" id="patients-list">
+        <div class="card">
+
+            <div class="card-header px-3 py-2 d-flex align-items-center">
+                <strong class="mr-4">
+                    <i class="fas fa-user-injured"></i>
+                    Patients Overdue for Visit
+                </strong>
+            </div>
+
+            <div class="card-body p-0">
+
+            </div>
+        </div>
+    </div>
+@endsection

+ 19 - 0
resources/views/app/mcp/patients_without_appointments.blade.php

@@ -0,0 +1,19 @@
+@extends ('layouts/template')
+
+@section('content')
+    <div class="p-3 mcp-theme-1" id="patients-list">
+        <div class="card">
+
+            <div class="card-header px-3 py-2 d-flex align-items-center">
+                <strong class="mr-4">
+                    <i class="fas fa-user-injured"></i>
+                    Patients w/o Appointments
+                </strong>
+            </div>
+
+            <div class="card-body p-0">
+
+            </div>
+        </div>
+    </div>
+@endsection

+ 5 - 0
resources/views/app/mcp/reports.blade.php

@@ -0,0 +1,5 @@
+@extends ('layouts/template')
+
+@section('content')
+    <h1>Hi</h1>
+@endsection

+ 60 - 0
resources/views/app/mcp/reports_pending_signature.blade.php

@@ -0,0 +1,60 @@
+<div class="p-3 mcp-theme-1">
+    <div class="card">
+
+        <div class="card-header px-3 py-2 d-flex align-items-center border-bottom-0">
+            <strong class="mr-4">
+                <i class="fas fa-user-injured"></i>
+                Reports Pending Signature
+            </strong>
+        </div>
+
+        <div class="card-body p-0 border-top-0 pb-0">
+
+
+            <table class="table table-sm table-striped mb-0">
+                <thead>
+                <tr>
+                    <th class="border-bottom-0">Patient</th>
+                    <th class="border-bottom-0">Title</th>
+                    <th class="border-bottom-0">Category</th>
+                    <th class="border-bottom-0">Report Date</th>
+                    <th class="border-bottom-0">Sign</th>
+                </tr>
+                </thead>
+                <tbody>
+                @foreach($records as $document)
+                    <tr class="{{$document->is_entry_error ? 'entry-error' : ''}} {{@$currentReport->uid === $document->uid ? 'bg-aliceblue' : ''}}">
+                        <td class="border-bottom-0">{{$document->client->displayName()}}</td>
+                        <td>
+                            <a native target="_blank" href="{{route('patients.view.incoming-reports', ['patient' => $document->client, 'currentReport' => $document])}}"
+                               class="{{@$currentReport->uid === $document->uid ? 'font-weight-bold' : ''}}">
+                                {{ $document->title ? $document->title : '(not set)' }}
+                            </a>
+                        </td>
+                        <td>{{ $document->category }}{{ $document->subcategory ? ' / ' . $document->subcategory : '' }}</td>
+                        <td>{{ friendly_date_time($document->report_date, false) }}</td>
+                        <td>
+                            @if(!$document->has_hcp_pro_signed)
+                                -
+                            @else
+                                <div class="text-success mb-1">
+                                    <i class="fa fa-check"></i>
+                                    Signed
+                                </div>
+                                @if($document->hcp)
+                                    <div class="text-secondary">
+                                        <div class="text-sm font-weight-bold">{{$document->hcp->displayName()}}</div>
+                                        <div class="text-sm">{{friendlier_date_time($document->hcp_pro_signed_at)}}</div>
+                                    </div>
+                                @endif
+                            @endif
+                        </td>
+                    </tr>
+                @endforeach
+                </tbody>
+            </table>
+        </div>
+    </div>
+</div>
+
+

+ 53 - 0
resources/views/app/mcp/supply_orders.blade.php

@@ -0,0 +1,53 @@
+@extends ('layouts/template')
+
+@section('content')
+<div class="p-3 mcp-theme-1" id="patients-list">
+    <div class="card">
+
+        <div class="card-header px-3 py-2 d-flex align-items-center">
+            <strong class="mr-4">
+                <i class="fas fa-file-invoice-dollar"></i>
+                Supply Orders
+            </strong>
+        </div>
+
+        <div class="card-body p-0">
+            <div class="p-3">
+                @include('app.mcp.supply_orders_filters')
+            </div>
+            <table class="table table-condensed p-0 m-0">
+                <thead class="bg-light">
+                    <tr>
+                        <th class="px-3 border-0">Date</th>
+                        <th class="px-3 border-0">Patient</th>
+                        <th class="px-3 border-0">Product</th>
+                        <th class="px-3 border-0">Reason</th>
+                        <th class="px-3 border-0">Status</th>
+                    </tr>
+                </thead>
+                <tbody>
+                    @foreach($supplyOrders as $supplyOrder)
+                    <tr>
+                        <td>{{-- date --}} -</td>
+                        <td>{{-- patient --}} -</td>
+                        <td>{{-- service --}} - </td>
+                        <td>{{-- amount --}} - </td>
+                        <td>{{-- status --}} - </td>
+                    </tr>
+                    @endforeach
+
+                    @if(count($supplyOrders) === 0)
+                    <tr>
+                        <td colspan="5">No records found!</td>
+                    </tr>
+                    @endif
+                </tbody>
+
+            </table>
+            <div class="ml-2 mt-2">
+                {{ $supplyOrders->appends(request()->input())->links() }}
+            </div>
+        </div>
+    </div>
+</div>
+@endsection

+ 87 - 0
resources/views/app/mcp/supply_orders_filters.blade.php

@@ -0,0 +1,87 @@
+<style>
+	#mcp-supply-orders-filters label {
+		font-weight: bold;
+	}
+
+	#mcp-supply-orders-filters .mw-100px {
+		min-width: 100px;
+	}
+</style>
+<form id="mcp-supply-orders-filters" method="GET" action="{{ route('mcp.notes') }}" class="row align-items-end" v-cloak>
+	<!-- DATE	 -->
+	<div class="col-md-2">
+		<div class="form-group">
+			<label>Date:</label>
+			<select name="date_category" class="form-control input-sm" v-model="filters.date_category">
+				<option value="">All</option>
+				<option value="EXACTLY">Exactly</option>
+				<option value="LESS_THAN">Less Than</option>
+				<option value="GREATER_THAN">Greater Than</option>
+				<option value="BETWEEN">Between</option>
+				<option value="NOT_BETWEEN">Not Between</option>
+			</select>
+		</div>
+	</div>
+	<div v-if="filters.date_category" class="col-md-2">
+		<div class="form-group">
+			<label>&nbsp;</label>
+			<input name="date_value_1" value="{{ $date_value_1 ?? '' }}" type="date" class="form-control input-sm" :placeholder="(filters.date_category === 'BETWEEN' || filters.date_category === 'NOT_BETWEEN') ? 'From' : 'Date'" />
+		</div>
+	</div>
+	<div v-if="filters.date_category && (filters.date_category === 'BETWEEN' || filters.date_category === 'NOT_BETWEEN')" class="col-md-2">
+		<div class="form-group">
+			<label>&nbsp;</label>
+			<input name="date_value_2" value="{{ $date_value_2 ?? '' }}" type="date" class="form-control input-sm" placeholder="To" />
+		</div>
+	</div>
+	<!-- STATUS -->
+	<div class="col-md-2">
+		<div class="form-group">
+			<label>Status:</label>
+			<select name="status" class="form-control input-sm" v-model="filters.status">
+				<option value="ALL">All</option>
+				<option value="NEW">New</option>
+				<option value="SIGNED">Signed</option>
+				<option value="VERIFIED">Verified</option>
+				<option value="PROCESSED">Processed</option>
+				<option value="CANCELLED">Cancelled</option>
+			</select>
+		</div>
+	</div>
+
+	<div class="col-md-2">
+		<div class="form-group d-flex">
+			<label>&nbsp;</label>
+			<button type="submit" class="btn btn-primary btn-sm mr-2 mw-100px">Apply Filters</button>
+			<a href="{{ route('mcp.patients') }}" class="btn btn-danger btn-sm text-white mw-100px">Clear Filters</a>
+		</div>
+	</div>
+</form>
+
+<script>
+	(function() {
+		function init() {
+			window.apapp = new Vue({
+				el: '#mcp-supply-orders-filters',
+				delimiters: ['@{{', '}}'],
+				data: {
+					filters: {
+						date_category: "<?= $date_category ?? '' ?>",
+						status: "<?= $status ?? '' ?>"
+					}
+				},
+				methods: {
+					init: function() {
+
+					}
+				},
+				mounted: function() {
+					this.init();
+				},
+			});
+
+
+		}
+		addMCInitializer('mcp-supply-orders-filters', init, '#mcp-supply-orders-filters');
+	})();
+</script>

+ 45 - 0
resources/views/app/mcp/supply_orders_pending_signature.blade.php

@@ -0,0 +1,45 @@
+<div class="p-3 mcp-theme-1">
+    <div class="card">
+
+        <div class="card-header px-3 py-2 d-flex align-items-center border-bottom-0">
+            <strong class="mr-4">
+                <i class="fas fa-user-injured"></i>
+                Supply Orders Pending Signature
+            </strong>
+        </div>
+
+        <div class="card-body p-0 border-top-0 pb-0">
+
+
+            <table class="table table-sm table-striped mb-0">
+                <thead>
+                <tr>
+                    <th class="border-bottom-0">Date</th>
+                    <th class="border-bottom-0">Patient</th>
+                    <th class="border-bottom-0">Product</th>
+                    <th class="border-bottom-0">Reason</th>
+                    <th class="border-bottom-0">Status</th>
+                </tr>
+                </thead>
+                <tbody>
+                @foreach($records as $row)
+                    <tr>
+                        <td>{{ friendly_date_time($row->created_at, false) }}</td>
+                        <td>
+                            <a target="_blank" native href="{{route('patients.view.dashboard', $row->client)}}">
+                                {{$row->client->displayName()}}
+                            </a>
+                        </td>
+                        <td>{{ $row->product->title }}</td>
+                        <td>{{ $row->reason ?: '-' }}</td>
+                        <td>**</td>
+                    </tr>
+                @endforeach
+                </tbody>
+            </table>
+        </div>
+    </div>
+</div>
+
+
+

+ 4 - 1
resources/views/app/new-patient.blade.php

@@ -2,7 +2,10 @@
 
 @section('content')
 
-    <?php $patients = [1,2,3,4]; ?>
+    <?php
+    $patients = [1,2,3,4]; 
+    $medicaidStates = Config::get('constants.medicaid_states');
+    ?>
 
     <div class="p-3 mcp-theme-1" id="newPatientContainer" v-cloak>
         <div class="col-12 col-lg-6 px-0">

+ 0 - 12
resources/views/app/patients.blade.php

@@ -2,12 +2,6 @@
 
 @section('content')
 
-    @if($pro->id === 1 || $pro->id === 16)
-    <link href="/c3/c3.min.css" rel="stylesheet">
-    <script src="/c3/d3.v5.min.js" charset="utf-8"></script>
-    <script src="/c3/c3.min.js"></script>
-    @endif
-
     <?php
     $showProgramsColumn = false;
     foreach($patients as $patient) {
@@ -51,12 +45,6 @@
             </div>
         </div>
 
-        @if($pro->id === 1 || $pro->id === 16)
-        <div class="card-header px-3 py-4 d-flex align-items-center bg-white justify-content-center">
-            <div id="patientAcquisitionChart" class="w-75"></div>
-        </div>
-        @endif
-
         <div class="card-body p-0">
             <table class="table table-condensed p-0 m-0">
                 <thead class="bg-light">

+ 21 - 19
resources/views/app/practice-management/financial-transactions.blade.php

@@ -23,13 +23,6 @@
             </div>
             <div class="card-header p-3">
                 <div class="d-flex align-items-center">
-                    <div class="width-200px">
-                        <select provider-search data-pro-uid="{{ request()->input('p') ? request()->input('p') : '' }}"
-                                name="proUid" class="form-control form-control-sm mr-auto width-200px min-width-unset"
-                                onchange="return transactionsFilter('p', this.value)">
-                            <option value="" {{!request()->input('p') ? 'selected' : ''}}>All Pros</option>
-                        </select>
-                    </div>
                     <select name="filter" class="form-control form-control-sm width-200px ml-2"
                             onchange="return transactionsFilter('t', this.value)">
                         <option {{request()->input('t') === '' ? 'selected' : ''}} value="">All Transactions</option>
@@ -38,16 +31,25 @@
                         <option {{request()->input('t') === 'MINUS' ? 'selected' : ''}} value="MINUS">Debits
                         </option>
                     </select>
-                    <select name="filter" class="form-control form-control-sm width-200px ml-2"
-                            onchange="return transactionsFilter('c', this.value)">
-                        <option {{!request()->input('c') ? 'selected' : ''}} value="">All Companies</option>
-                        @foreach($companies as $company)
-                            <option {{request()->input('c') == $company->id ? 'selected' : ''}}
-                                    value="{{$company->id}}">
-                                {{$company->name}}
-                            </option>
-                        @endforeach
-                    </select>
+                    @if($pro->pro_type == 'ADMIN')
+                        <select name="filter" class="form-control form-control-sm width-200px ml-2"
+                                onchange="return transactionsFilter('c', this.value)">
+                            <option {{!request()->input('c') ? 'selected' : ''}} value="">All Companies</option>
+                            @foreach($companies as $company)
+                                <option {{request()->input('c') == $company->id ? 'selected' : ''}}
+                                        value="{{$company->id}}">
+                                    {{$company->name}}
+                                </option>
+                            @endforeach
+                        </select>
+                        <div class="width-200px">
+                            <select provider-search data-pro-uid="{{ request()->input('p') ? request()->input('p') : '' }}"
+                                    name="proUid" class="form-control form-control-sm mr-auto width-200px min-width-unset"
+                                    onchange="return transactionsFilter('p', this.value)">
+                                <option value="" {{!request()->input('p') ? 'selected' : ''}}>All Pros</option>
+                            </select>
+                        </div>
+                    @endif
                     <div class="ml-4 d-inline-flex align-items-center">
                         <span class="mr-2">Date</span>
                         <input type="date"
@@ -76,7 +78,7 @@
                                 <th class="border-0">Pro</th>
                                 <th class="border-0">Company</th>
                             @endif
-                            
+
                             <th class="border-0">Context</th>
                             <th class="border-0">Amount</th>
                             <th class="border-0">Balance</th>
@@ -108,7 +110,7 @@
                                         {{$transaction->company ? $transaction->company->name : ''}}
                                     </td>
                                 @endif
-                               
+
                                 <td class="text-nowrap">
                                     @if($transaction->bill && $transaction->bill->note)
                                         <a href="{{route('patients.view.notes.view.dashboard', ['patient'=>$transaction->client, 'note'=>$transaction->bill->note])}}">

+ 4 - 2
resources/views/layouts/patient.blade.php

@@ -96,7 +96,7 @@
 						</li> */ ?>
 						<li class="nav-item">
 							<a class="nav-link {{ strpos($routeName, 'patients.view.patient-prescriptions') === 0 ? 'active' : '' }}"
-							   href="{{ route('patients.view.patient-prescriptions', ['patient' => $patient]) }}">Prescriptions</a>
+							   href="{{ route('patients.view.patient-prescriptions', ['patient' => $patient]) }}">ERx &amp; Orders</a>
 							<?php /*
 							<ul class="m-0 p-0 nav-child-list">
 								<li class="nav-item">
@@ -132,7 +132,9 @@
 						</li>
 						<li class="nav-item">
 							<a class="nav-link {{ strpos($routeName, 'patients.view.patient-tickets') === 0 ? 'active' : '' }}"
-							   href="{{ route('patients.view.patient-tickets', ['patient' => $patient]) }}">ERx / Orders</a>
+							   href="{{ route('patients.view.patient-tickets', ['patient' => $patient]) }}" title="Deprecated">ERx / Orders
+								<span class="text-secondary text-sm pl-2">(dep)</span>
+							</a>
 							<ul class="m-0 p-0 nav-child-list">
 								<li class="nav-item">
 									<a class="nav-link {{ strpos($routeName, 'patients.view.patient-tickets') === 0 && @$type === '' ? 'active' : '' }}"

+ 79 - 34
resources/views/layouts/template.blade.php

@@ -72,6 +72,8 @@
             integrity="sha512-iKDtgDyTHjAitUDdLljGhenhPwrbBfqTKWO1mkhSFH3A7blITC9MhYon6SjnMhp4o0rADGw9yAC6EW4t5a4K3g=="
             crossorigin="anonymous"></script>
 
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
+
     @yield('head')
 </head>
 
@@ -93,45 +95,65 @@
 
         <div class="collapse navbar-collapse" id="navBar">
             <ul class="navbar-nav mr-auto">
+
                 <li class="nav-item"><a class="nav-link" href="{{ route('dashboard') }}"><i class="mr-1 fas fa-home"></i> Home</a> </li>
-                <li class="nav-item"><a class="nav-link" href="{{ route('patients') }}"><i class="mr-1 fas fa-user-injured"></i> Patients</a> </li>
+
+                @if($pro)
+                    @if($pro->is_enrolled_as_mcp)
+                    <li class="nav-item"><a class="nav-link" href="{{ route('mcp.patients') }}"><i class="mr-1 fas fa-user-injured"></i> Patients</a> </li>
+                    @elseif($pro->pro_type == 'ADMIN')
+                    <li class="nav-item"><a class="nav-link" href="{{ route('admin.patients') }}"><i class="mr-1 fas fa-user-injured"></i> Patients</a> </li>
+                    @else
+                    <li class="nav-item"><a class="nav-link" href="{{ route('dna.patients') }}"><i class="mr-1 fas fa-user-injured"></i> Patients</a> </li>
+                    @endif
+                @endif
+
                 @if($pro && ($pro->can_add_patients || $pro->pro_type== 'ADMIN'))
-                <li class="nav-item"><a class="nav-link" href="{{ route('new-patient') }}"><i class="mr-1 fas fa-user-plus"></i> New Patient</a> </li>
-<!--                <li class="nav-item"><a class="nav-link" href="{{ route('new-non-mcn-patient') }}"><i class="mr-1 fas fa-user-plus"></i> New Non Medicare Patient</a> </li>-->
+                  <li class="nav-item"><a class="nav-link" href="{{ route('new-patient') }}"><i class="mr-1 fas fa-user-plus"></i> New Patient</a> </li>
                 @endif
+
+                @if($pro->is_enrolled_as_mcp)
+
+{{--                    <li class="nav-item"><a class="nav-link" href="{{ route('mcp.erx_and_orders') }}">--}}
+{{--                            <i class="mr-1 fas fa-file-prescription"></i> ERx & Orders--}}
+{{--                        </a>--}}
+{{--                    </li>--}}
+
+                    <li class="nav-item"><a class="nav-link" href="{{ route('mcp.appointments') }}">
+                            <i class="mr-1 fas fa-calendar-alt"></i> Appointments
+                        </a>
+                    </li>
+
+                @endif
+
                 <li class="nav-item dropdown">
-                    <a class="nav-link dropdown-toggle" href="#" id="practice-management" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="mr-1 fas fa-tasks"></i> Practice</a>
+                    <a class="nav-link dropdown-toggle" href="#" id="practice-management" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                        <i class="mr-1 fas fa-tasks"></i> Practice
+                    </a>
                     <div class="dropdown-menu mcp-theme-1 no-overflow-menu p-0" aria-labelledby="practice-management">
 
-                        @if($pro->isDefaultNA())
-                            <a class="dropdown-item" href="/practice-management/my-teams">My Teams</a>
-                        @endif
+                        @if($pro->pro_type == 'ADMIN')
+
+                            {{--<a class="dropdown-item" href="{{ route('practice-management.previousBills') }}">Previous Bills</a>--}}
+                            <a class="dropdown-item" href="{{ route('practice-management.financialTransactions') }}">Financial Transactions</a>
+                            <a class="dropdown-item" href="/practice-management/bills/not-yet-signed">Pending Bills to Sign</a>
+                            <a class="dropdown-item" href="/practice-management/notes/not-yet-signed">Pending Notes to Sign</a>
+                            <a class="dropdown-item" href="/practice-management/notes/not-yet-signed-but-ally-signed">Pending Notes to Sign (Ally Signed)</a>
+                            <a class="dropdown-item" href="{{ route('practice-management.remote-monitoring') }}">Remote Monitoring</a>
+                            <a class="dropdown-item" href="{{ route('pro-care-month-report') }}">Care Month Report</a>
+                            <a class="dropdown-item" href="{{ route('practice-management.rm-bills-to-sign') }}">RM Bills to Sign</a>
+                            <a class="dropdown-item" href="{{ route('unmapped-sms') }}">Unmapped SMS</a>
+                            <a class="dropdown-item" href="{{ route('practice-management.myTickets') }}">My Tickets</a>
+                            <a class="dropdown-item" href="{{ route('practice-management.myTextShortcuts') }}">My Text Shortcuts</a>
+                            <a class="dropdown-item" href="{{ route('practice-management.myFavorites') }}">My Favorites</a>
+                            <a class="dropdown-item" href="{{ route('practice-management.proAvailability') }}">Pro Availability</a>
+                            <a class="dropdown-item" href="{{ route('practice-management.proCalendar') }}">Pro Calendar</a>
+                            <a class="dropdown-item" href="{{ route('practice-management.remoteMonitoringReport') }}">Remote Monitoring Report</a>
+                            <a class="dropdown-item" href="{{ route('practice-management.rm-launch-and-clean') }}">RM: Launch &amp; Clean</a>
+
+                            <a class="dropdown-item" href="{{ route('practice-management.billingManager') }}">Billing Manager</a>
+                            <a class="dropdown-item" href="{{ route('practice-management.billing-report') }}">Billing Report</a>
 
-                        {{--<a class="dropdown-item" href="{{ route('practice-management.dashboard') }}">Dashboard</a>--}}
-                        @if($pro && $pro->pro_type == 'ADMIN')
-                            <a class="dropdown-item" href="/practice-management/rates/all">Payment Rates</a>
-                        @endif
-                        {{--<a class="dropdown-item" href="{{ route('practice-management.previousBills') }}">Previous Bills</a>--}}
-                        <a class="dropdown-item" href="{{ route('practice-management.financialTransactions') }}">Financial Transactions</a>
-                        <a class="dropdown-item" href="/practice-management/bills/not-yet-signed">Pending Bills to Sign</a>
-                        <a class="dropdown-item" href="/practice-management/notes/not-yet-signed">Pending Notes to Sign</a>
-                        <a class="dropdown-item" href="/practice-management/notes/not-yet-signed-but-ally-signed">Pending Notes to Sign (Ally Signed)</a>
-                        <a class="dropdown-item" href="{{ route('practice-management.remote-monitoring') }}">Remote Monitoring</a>
-                        <a class="dropdown-item" href="{{ route('pro-care-month-report') }}">Care Month Report</a>
-                        <a class="dropdown-item" href="{{ route('practice-management.rm-bills-to-sign') }}">RM Bills to Sign</a>
-                        <a class="dropdown-item" href="{{ route('unmapped-sms') }}">Unmapped SMS</a>
-                        <a class="dropdown-item" href="{{ route('practice-management.myTickets') }}">My Tickets</a>
-                        <a class="dropdown-item" href="{{ route('practice-management.myTextShortcuts') }}">My Text Shortcuts</a>
-                        <a class="dropdown-item" href="{{ route('practice-management.myFavorites') }}">My Favorites</a>
-                        <a class="dropdown-item" href="{{ route('practice-management.proAvailability') }}">Pro Availability</a>
-                        <a class="dropdown-item" href="{{ route('practice-management.proCalendar') }}">Pro Calendar</a>
-                        <a class="dropdown-item" href="{{ route('practice-management.remoteMonitoringReport') }}">Remote Monitoring Report</a>
-                        <a class="dropdown-item" href="{{ route('practice-management.rm-launch-and-clean') }}">RM: Launch &amp; Clean</a>
-
-                        <a class="dropdown-item" href="{{ route('practice-management.billingManager') }}">Billing Manager</a>
-                        <a class="dropdown-item" href="{{ route('practice-management.billing-report') }}">Billing Report</a>
-
-                        @if($pro && $pro->pro_type == 'ADMIN')
                             <a class="dropdown-item" href="{{ route('practice-management.processingBillMatrix') }}">Processing Bills</a>
                             <a class="dropdown-item" href="{{ route('practice-management.pro-financials') }}">Pro Financials</a>
                             <a class="dropdown-item" href="{{ route('practice-management.cellularMeasurements') }}">Cellular Measurements</a>
@@ -142,8 +164,7 @@
                             <a class="dropdown-item" href="{{ route('practice-management.process-claims') }}">Process Claims</a>
                             <a class="dropdown-item" href="{{ route('practice-management.process-notes') }}">Process Notes</a>
                             <a class="dropdown-item" href="{{ route('practice-management.notes-processing-center') }}">Notes Processing Center</a>
-{{--                            <a class="dropdown-item" href="{{ route('practice-management.hcpBillMatrix') }}">HCP Bill Matrix</a>--}}
-                            @if(false)
+                            @if($pro->id == '1' || $pro->id == '16')
                                 <a class="dropdown-item" href="{{ route('practice-management.treatmentServiceUtil') }}">Treatment Service Util.</a>
                             @endif
                             <a class="dropdown-item" href="{{ route('practice-management.tickets') }}">Tickets</a>
@@ -155,7 +176,31 @@
                             <a class="dropdown-item" href="{{ route('practice-management.mc-code-checks') }}">MC Code Checks</a>
                             <a class="dropdown-item" href="{{ route('practice-management.clauses.list') }}">Clauses</a>
                             <a class="dropdown-item" href="{{ route('practice-management.statTrees.list') }}">Stat Trees</a>
+
+                            <a class="dropdown-item" href="/practice-management/rates/all">Payment Rates</a>
+
+                        @elseif($pro->is_enrolled_as_mcp)
+
+                            <a class="dropdown-item" href="{{ route('practice-management.financialTransactions') }}">Financial Transactions</a>
+                            <a class="dropdown-item" href="{{ route('practice-management.myTextShortcuts') }}">Text Shortcuts</a>
+                            <a class="dropdown-item" href="{{ route('practice-management.myFavorites') }}">Favorites</a>
+                            <a class="dropdown-item" href="{{ route('practice-management.proAvailability') }}">Availability</a>
+                            <a class="dropdown-item" href="{{ route('practice-management.proCalendar') }}">Calendar</a>
+
+                            <a class="dropdown-item" href="{{ route('mcp.notes') }}">Notes</a>
+                            <a class="dropdown-item" href="{{ route('mcp.appointments') }}">Appointments</a>
+                            <a class="dropdown-item" href="{{ route('mcp.bills') }}">Bills</a>
+                            <a class="dropdown-item" href="{{ route('mcp.erx_and_orders') }}">ERx & Orders</a>
+                            <a class="dropdown-item" href="{{ route('mcp.reports') }}">Reports</a>
+                            <a class="dropdown-item" href="{{ route('mcp.supply_orders') }}">Supply Orders</a>
+                            <a class="dropdown-item" href="{{ route('mcp.client_messages') }}">Messages</a>
+
+                        @elseif($pro && $pro->isDefaultNA())
+
+                            <a class="dropdown-item" href="/practice-management/my-teams">My Teams</a>
+
                         @endif
+
                     </div>
                 </li>
             </ul>

+ 62 - 3
routes/web.php

@@ -73,6 +73,65 @@ Route::middleware('pro.auth')->group(function () {
 
     Route::get('/can-access-patient/{uid}', 'HomeController@canAccessPatient')->name('can-access-patient');
 
+    Route::name('mcp.')->prefix('m')->group(function () {
+
+        Route::get('patients', 'McpController@patients')->name('patients');
+        Route::get('notes', 'McpController@notes')->name('notes');
+        Route::get('appointments', 'McpController@appointments')->name('appointments');
+        Route::get('bills', 'McpController@bills')->name('bills');
+        Route::get('erx-and-orders', 'McpController@erx_and_orders')->name('erx_and_orders');
+        Route::get('reports', 'McpController@reports')->name('reports');
+        Route::get('supply-orders', 'McpController@supply_orders')->name('supply_orders');
+        Route::get('client-messages', 'McpController@client_messages')->name('client_messages');
+
+        Route::get('new-patients-awaiting-visit', 'McpController@new_patients_awaiting_visit')->name('new_patients_awaiting_visit');
+        Route::get('notes-pending-signature', 'McpController@notes_pending_signature')->name('notes_pending_signature');
+        Route::get('notes-pending-billing', 'McpController@notes_pending_billing')->name('notes_pending_billing');
+        Route::get('reports-pending-signature', 'McpController@reports_pending_signature')->name('reports_pending_signature');
+        Route::get('patients-without-appointments', 'McpController@patients_without_appointments')->name('patients_without_appointments');
+        Route::get('patients-overdue-for-visit', 'McpController@patients_overdue_for_visit')->name('patients_overdue_for_visit');
+        Route::get('cancelled-appointments-pending-review', 'McpController@cancelled_appointments_pending_review')->name('cancelled_appointments_pending_review');
+        Route::get('cancelled-bills-pending-review', 'McpController@cancelled_bills_pending_review')->name('cancelled_bills_pending_review');
+        Route::get('cancelled-supply-orders-pending-review', 'McpController@cancelled_supply_orders_pending_review')->name('cancelled_supply_orders_pending_review');
+        Route::get('erx-and-orders-pending-signature', 'McpController@erx_and_orders_pending_signature')->name('erx_and_orders_pending_signature');
+        Route::get('supply-orders-pending-signature', 'McpController@supply_orders_pending_signature')->name('supply_orders_pending_signature');
+
+    });
+
+    Route::name('dna.')->prefix('n')->group(function () {
+
+        Route::get('patients', 'DnaController@patients')->name('patients');
+        Route::get('notes', 'DnaController@notes')->name('notes');
+        Route::get('appointments', 'DnaController@appointments')->name('appointments');
+        Route::get('bills', 'DnaController@bills')->name('bills');
+        Route::get('erx-and-orders', 'DnaController@erx_and_orders')->name('erx_and_orders');
+        Route::get('reports', 'DnaController@reports')->name('reports');
+        Route::get('supply-orders', 'DnaController@supply_orders')->name('supply_orders');
+
+        Route::get('new_patients_awaiting_visit', 'DnaController@new_patients_awaiting_visit')->name('new_patients_awaiting_visit');
+        Route::get('notes_pending_signature', 'DnaController@notes_pending_signature')->name('notes_pending_signature');
+        Route::get('notes_pending_billing', 'DnaController@notes_pending_billing')->name('notes_pending_billing');
+        Route::get('reports_pending_signature', 'DnaController@reports_pending_signature')->name('reports_pending_signature');
+        Route::get('patients_without_appointments', 'DnaController@patients_without_appointments')->name('patients_without_appointments');
+        Route::get('patients_overdue_for_visit', 'DnaController@patients_overdue_for_visit')->name('patients_overdue_for_visit');
+        Route::get('cancelled_appointments_pending_review', 'DnaController@cancelled_appointments_pending_review')->name('cancelled_appointments_pending_review');
+        Route::get('cancelled_bills_pending_review', 'DnaController@cancelled_bills_pending_review')->name('cancelled_bills_pending_review');
+        Route::get('cancelled_supply_orders_pending_review', 'DnaController@cancelled_supply_orders_pending_review')->name('cancelled_supply_orders_pending_review');
+        Route::get('erx_and_orders_pending_signature', 'DnaController@erx_and_orders_pending_signature')->name('erx_and_orders_pending_signature');
+        Route::get('supply_orders_pending_signature', 'DnaController@supply_orders_pending_signature')->name('supply_orders_pending_signature');
+
+    });
+
+    Route::name('admin.')->prefix('a')->group(function () {
+        // TODO
+        Route::get('patients', 'AdminController@patients')->name('patients');
+        Route::get('notes', 'AdminController@notes')->name('notes');
+        Route::get('appointments', 'AdminController@appointments')->name('appointments');
+        Route::get('bills', 'AdminController@bills')->name('bills');
+        Route::get('erx-and-orders', 'AdminController@erx_and_orders')->name('erx_and_orders');
+        Route::get('reports', 'AdminController@reports')->name('reports');
+        Route::get('supply-orders', 'AdminController@supply_orders')->name('supply_orders');
+    });
 
     Route::name('practice-management.')->prefix('practice-management')->group(function () {
         Route::get('remote-monitoring-report', 'PracticeManagementController@remoteMonitoringReport')->name('remoteMonitoringReport');
@@ -114,7 +173,7 @@ Route::middleware('pro.auth')->group(function () {
 
         Route::get('my-teams', 'PracticeManagementController@myTeams')->name('my-teams');
 
-        Route::middleware('pro.auth.admin')->group(function(){
+        Route::middleware('pro.auth.admin')->group(function () {
 
             // BILLING REPORT
             Route::get('billing-report', 'PracticeManagementController@billingReport')->name('billing-report');
@@ -212,7 +271,7 @@ Route::middleware('pro.auth')->group(function () {
 
     });
 
-    Route::middleware('pro.auth.admin')->group(function(){
+    Route::middleware('pro.auth.admin')->group(function () {
         Route::get('patients/view/mcp-requests/{patient?}', 'PatientController@mcpRequests')->name('patients.view.mcp-requests');
         Route::get('patients/view/eligible-refreshes/{patient}', 'PatientController@eligibleRefreshes')->name('patients.view.eligible-refreshes');
         Route::get('patients/view/insurance-coverage/{patient}', 'PatientController@insuranceCoverage')->name('patients.view.insurance-coverage');
@@ -224,7 +283,7 @@ Route::middleware('pro.auth')->group(function () {
 
     Route::name('patients.view.')->prefix('patients/view/{patient}')->group(function () {
 
-        Route::middleware('pro.auth.can-access-patient')->group(function() {
+        Route::middleware('pro.auth.can-access-patient')->group(function () {
 
             Route::get('intake', 'PatientController@intake')->name('intake');
             Route::get('', 'PatientController@dashboard')->name('dashboard');

+ 103 - 0
spec/10-03-2021.txt

@@ -0,0 +1,103 @@
+Patients
+
+	Age: [all, exactly, less-than, greater-than, between, not-between[ [_1_] [_2_]
+  Sex: [all, M, F]
+  BMI: [all, exactly, less-than, greater-than, between, not-between[ [_1_] [_2_]
+  Last Visit: [all, exactly, before, after, between, not-between] [_1_] [_2_]
+  Next Appt.: [all, exactly, before, after, between, not-between] [_1_] [_2_]
+  Status: [all, Active, Awaiting Visit, Inactive] -> single select
+  Last Weigh-In: [all, exactly, before, after, between, not-between] [_1_] [_2_]
+  Last BP: [all, exactly, before, after, between, not-between] [_1_] [_2_]
+
+    [Filter]
+
+  Columns:
+
+		Chart #
+		Name (F.I. LAST)
+		DOB
+		Gender
+		BMI
+		Insurance
+		Last Visit
+		Next Appt.
+		Status
+		CCM
+		RPM
+		Last Weight-In
+		Last BP
+		Assigned On
+
+Notes
+
+	Date: [all, exactly, before, after, between, not-between] [_1_] [_2_]
+  Status: (All/New/Signed/Billed/Verified/Processed/Cancelled)
+
+		Date
+		HCP
+		Patient
+		ICD
+		Status (New/Signed/Billed/Verified/Processed/Cancelled)
+
+Appointments
+
+	Date: [all, exactly, before, after, between, not-between] [_1_] [_2_]
+  New or FU: [New/FU]
+  Status: (All/...)
+
+		Date
+		HCP
+		Patient
+		New or FU?
+		Status
+		Note
+
+Bills
+
+	Date: [all, exactly, before, after, between, not-between] [_1_] [_2_]
+  Status: (All/...)
+
+		Date
+		Patient
+		Service
+		Amount
+		Status
+
+ERx & Orders
+
+	Date: [all, exactly, before, after, between, not-between] [_1_] [_2_]
+  Status:
+
+		Date
+		Patient
+		Content
+		Status
+
+Supply Orders
+
+	Date: [all, exactly, before, after, between, not-between] [_1_] [_2_]
+  Status:
+
+		Date
+		Patient
+		Product
+		Reason
+		Status
+
+Text Messages
+
+	Date: [all, exactly, before, after, between, not-between] [_1_] [_2_]
+  To or From Me: (All / To Me / From Me)
+  Status: (All/Awaiting Reply)
+
+		Date
+		To
+		From
+		Message
+		Status
+
+    Last Visit: [Between] [D1] [D2]
+
+      last_visit_category: 'NOT_BETWEEN'
+      last_visit_d1:
+      last_visit_d2: