Explorar o código

fixed client bdt devices

= %!s(int64=3) %!d(string=hai) anos
pai
achega
4e7d543cf8

+ 84 - 3
app/Http/Controllers/PracticeManagementController.php

@@ -2338,20 +2338,101 @@ ORDER BY c.name_last, c.name_first
     public function clientsBdtDevices(Request $request){
         $filters = $request->all();
 
-        $devices = ClientBDTDevice::select('client_bdt_device.*')
+        $devices = ClientBDTDevice::select(
+            'client_bdt_device.*',
+            DB::raw('(SELECT COUNT(*) FROM bdt_measurement WHERE bdt_measurement.bdt_device_id = client_bdt_device.device_id AND is_cellular_zero IS FALSE) as num_of_measurements'))
+           // DB::raw('(SELECT ts_date_time FROM bdt_measurement WHERE bdt_measurement.bdt_device_id = client_bdt_device.device_id AND is_cellular_zero IS FALSE ORDER BY ts_date_time DESC LIMIT 1) as most_recent_none_zero_measurement_at'))
         ->join('client', 'client.id', '=', 'client_bdt_device.client_id');
 
         if($this->performer->pro->pro_type !== 'ADMIN'){
             $devices = $devices->where('client.mcp_pro_id', $this->performer->pro->id);
         }
 
-        $this->filterMultiQuery($request, $devices, 'client_bdt_device.created_at', 'date_category', 'date_value_1', 'date_value_2');
+        $this->filterMultiQuery($request, $devices, 'client_bdt_device.most_recent_measurement_at', 'date_category', 'date_value_1', 'date_value_2');
+        
+        // $dateKeyName = $request->get('date_category');
+        // $date1 = $request->get('date_value_1');
+        // $date2 = $request->get('date_value_2');
+        // $dateColumnName = "(SELECT (MAX(ts_date_time))::DATE FROM bdt_measurement WHERE bdt_measurement.bdt_device_id = client_bdt_device.device_id AND is_cellular_zero IS FALSE)";
+        // switch($dateKeyName) {
+        //     case 'EXACTLY':
+        //         if($date1) {
+        //             $devices->whereRaw($dateColumnName." = '$date1'::DATE");
+        //         }
+        //         break;
+        //     case 'LESS_THAN':
+        //         if($date1) {
+        //             $devices->whereRaw($dateColumnName. "< '$date1'::DATE" );
+        //         }
+        //         break;
+        //     case 'GREATER_THAN':
+        //         if($date1) {
+        //             $devices->whereRaw($dateColumnName. "> '$date1'::DATE");
+        //         }
+        //         break;
+        //     case 'BETWEEN':
+        //         if($date1 && $date2) {
+        //             $devices
+        //                 ->whereRaw($dateColumnName. ">= '$date1'::DATE")
+        //                 ->whereRaw($dateColumnName. "<= '$date2'::DATE");
+        //         }
+        //         break;
+        //     case 'NOT_BETWEEN':
+        //         if($date2 && $date1) {
+        //             $devices
+        //                 ->where(function ($q) use ($request, $dateColumnName, $date1, $date2) {
+        //                     $q->whereRaw($dateColumnName. "< '$date1'::DATE")
+        //                         ->orWhereRaw($dateColumnName. "> '$date2'::DATE");
+        //                 });
+        //         }
+        //         break;
+        // }
+
+        $keyName = $request->get('measurement_count_category');
+        $value1 = $request->get('measurement_count_value_1');
+        $value2 = $request->get('measurement_count_value_2');
+        $columnName = "(SELECT COUNT(*) FROM bdt_measurement WHERE bdt_measurement.bdt_device_id = client_bdt_device.device_id AND is_cellular_zero IS FALSE)";
+        switch($keyName) {
+            case 'EXACTLY':
+                if($value1) {
+                    $devices->whereRaw($columnName.'='.$value1);
+                }
+                break;
+            case 'LESS_THAN':
+                if($value1) {
+                    $devices->whereRaw($columnName. '<' .$value1);
+                }
+                break;
+            case 'GREATER_THAN':
+                if($value1) {
+                    $devices->whereRaw($columnName. '>'. $value1);
+                }
+                break;
+            case 'BETWEEN':
+                if($value1 && $value2) {
+                    $devices
+                        ->whereRaw($columnName. '>=' . $value1)
+                        ->whereRaw($columnName. '<=' . $value1);
+                }
+                break;
+            case 'NOT_BETWEEN':
+                if($value1 && $value2) {
+                    $devices
+                        ->where(function ($q) use ($request, $columnName, $value1, $value2) {
+                            $q->whereRaw($columnName. '<'. $value1)
+                                ->orWhereRaw($columnName. '>'.$value2);
+                        });
+                }
+                break;
+        }
+        
         $status = $request->get('status');
         if($status){
             if($status === 'ACTIVE') $devices = $devices->where('client_bdt_device.is_active', true);
             if($status === 'DEACTIVATED') $devices = $devices->where('client_bdt_device.is_active', false);
         }
-        $devices = $devices->orderBy('created_at', 'DESC')->paginate(20);
+
+        $devices = $devices->orderBy('num_of_measurements', 'DESC')->paginate(20);
         return view('app.practice-management.clients_bdt_devices', compact('devices','filters'));
     }
 

+ 5 - 0
app/Models/ClientBDTDevice.php

@@ -14,6 +14,11 @@ class ClientBDTDevice extends Model
         return $this->hasOne(Client::class, 'id', 'client_id');
     }
 
+    public function mostRecentMeasurement() {
+        return $this->hasOne(ClientBDTMeasurement::class, 'id', 'most_recent_client_bdt_measurement_id');
+    }
+
+
     public function lastDeviceMeasurement() {
         return BDTMeasurement::select('bdt_measurement.created_at', 'measurement.label', 'measurement.sbp_mm_hg', 'measurement.dbp_mm_hg', 'measurement.numeric_value')
             ->join('client_bdt_measurement', 'client_bdt_measurement.bdt_measurement_id', '=', 'bdt_measurement.id')

+ 1 - 1
app/Models/ClientBDTMeasurement.php

@@ -7,7 +7,7 @@ class ClientBDTMeasurement extends Model
     protected $table = 'client_bdt_measurement';
 
     public function measurement() {
-        return $this->hasOne(BDTMeasurement::class, 'id', 'bdt_measurement_id');
+        return $this->hasOne(Measurement::class, 'id', 'measurement_id');
     }
 
     public function client() {

+ 29 - 22
resources/views/app/practice-management/clients_bdt_devices.blade.php

@@ -18,13 +18,16 @@
             <table class="table table-sm table-striped border-top p-0 m-0">
                 <thead class="bg-light">
                     <tr>
-                        <th class="px-3 border-0">IMEI</th>
-                        <th class="px-3 border-0">Client</th>
-                        <th class="px-3 border-0">MCP</th>
-                        <th class="px-3 border-0">Created</th>
-                        <th class="px-3 border-0">Category</th>
-                        <th class="px-3 border-0">Last Measurement</th>
-                        <th class="px-3 border-0">Status</th>
+                        <th class="px-2 border-0">IMEI</th>
+                        <th class="px-2 border-0">Client</th>
+                        <th class="px-2 border-0">MCP</th>
+                        <th class="px-2 border-0">Created</th>
+                        <th class="px-2 border-0">Category</th>
+                        <th class="px-2 border-0"># of Non-zero Measurements</th>
+                        <!-- <th class="px-2 border-0">Most Recent Non-zero Measurement At</th> -->
+                        <th class="px-2 border-0">Most Recent Measurement At</th>
+                        <th class="px-2 border-0">Most Recent Measurement</th>
+                        <th class="px-2 border-0">Status</th>
                     </tr>
                 </thead>
                 <tbody>
@@ -44,23 +47,27 @@
                         <td>{{ $mcpName }}</td>
                         <td class="px-2 text-nowrap">{{ friendly_date_time($device->device->created_at) }}</td>
                         <td class="px-2">{{ $device->device->category }}</td>
+                        <td class="px-2">{{ $device->num_of_measurements}}</td>
+                        <!-- <td class="px-2">{{ friendly_date_time($device->most_recent_none_zero_measurement_at)}}</td> -->
+                        <td class="px-2">{{ friendly_date_time($device->most_recent_measurement_at)}}</td>
                         <td class="px-2 d-flex align-items-center">
-                            <?php $lastMeasurement = $device->lastDeviceMeasurement(); ?>
-                            @if($lastMeasurement)
-                            @if($lastMeasurement->is_cellular_zero)
-                            <i class="font-size-11 fa fa-rss"></i>
-                            @elseif($lastMeasurement->label === 'BP')
-                            {{ $lastMeasurement->sbp_mm_hg }} / {{ $lastMeasurement->dbp_mm_hg }}
-                            @elseif($lastMeasurement->label === 'Wt. (lbs.)')
-                            {{ round($lastMeasurement->numeric_value, 2) }} lbs
+                            <?php $lastMeasurement = $device->mostRecentMeasurement; ?>
+                            @if($lastMeasurement && $lastMeasurement->measurement)
+                                @if($lastMeasurement->measurement->is_cellular_zero)
+                                    <i class="font-size-11 fa fa-rss"></i>
+                                @elseif($device->device->category === 'BP')
+                                    {{ $lastMeasurement->measurement->sbp_mm_hg }} / {{ $lastMeasurement->measurement->dbp_mm_hg }}
+                                @elseif($device->device->category === 'WEIGHT')
+                                    {{ round($lastMeasurement->measurement->numeric_value, 2) }} lbs
+                                @else
+                                    {{ $lastMeasurement->measurement->value }}
+                                @endif
+                                <div class="ml-2">
+                                    <i class="far fa-calendar-check"></i> <span class="text-secondary">{{ friendly_date_time($lastMeasurement->ts_date_time) }}</span>
+                                </div>
                             @else
-                            {{ $lastMeasurement->value }}
-                            @endif
-                            <div class="ml-2">
-                                <i class="far fa-calendar-check"></i> <span class="text-secondary">{{ friendly_date_time($lastMeasurement->created_at) }}</span>
-                            </div>
-                            @else
-                            <small class="text-muted">-</small>
+                                <h1>No measurement</h1>
+                                <small class="text-muted">-</small>
                             @endif
                         </td>
                         <td>

+ 25 - 1
resources/views/app/practice-management/clients_bdt_devices_filters.blade.php

@@ -22,7 +22,7 @@
 	<!-- DATE	 -->
 	<div>
 		<div class="form-group">
-			<label>Date:</label>
+			<label>Most Recent Measurement 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>
@@ -41,6 +41,27 @@
 			</div>
 		</div>
 	</div>
+	<div>
+		<div class="form-group">
+			<label># of Non-zero Measurements:</label>
+			<select name="measurement_count_category" class="form-control input-sm" v-model="filters.measurement_count_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 v-show="filters.measurement_count_category" class="mt-2">
+				<div>
+					<input name="measurement_count_value_1" v-model="filters.measurement_count_value_1" type="number" class="form-control input-sm"/>
+				</div>
+				<div v-show="filters.measurement_count_category === 'BETWEEN' || filters.measurement_count_category === 'NOT_BETWEEN'" class="mt-2">
+					<input name="measurement_count_value_2" v-model="filters.measurement_count_value_2" type="number" class="form-control input-sm"/>
+				</div>
+			</div>
+		</div>
+	</div>
 	<!-- STATUS -->
 	<div>
 		<div class="form-group">
@@ -69,6 +90,9 @@ $allFilterKeys = [
 	'date_category',
 	'date_value_1',
 	'date_value_2',
+	'measurement_count_category',
+	'measurement_count_value_1',
+	'measurement_count_value_2',
 	'status'
 ];
 for ($i = 0; $i < count($allFilterKeys); $i++) {