소스 검색

Supply-orders and shipments (wip)

Vijayakrishnan 4 년 전
부모
커밋
9ef1e75000

+ 14 - 0
app/Helpers/helpers.php

@@ -28,6 +28,20 @@ if(!function_exists('friendly_date_time')) {
     }
 }
 
+if(!function_exists('friendlier_date_time')) {
+    function friendlier_date_time($value, $includeTime = true, $default = '-') {
+        if(!$value || empty($value)) return $default;
+        try {
+            $result = strtotime($value);
+            $result = date("j M" . ($includeTime ? ", h:i a" : ""), $result);
+            return $result;
+        }
+        catch (Exception $e) {
+            return $value;
+        }
+    }
+}
+
 if(!function_exists('friendly_date_time_short')) {
     function friendly_date_time_short($value, $includeTime = true, $default = '-') {
         if(!$value || empty($value)) return $default;

+ 14 - 0
app/Http/Controllers/PatientController.php

@@ -12,8 +12,11 @@ use App\Models\Facility;
 use App\Models\Handout;
 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\File;
@@ -343,6 +346,17 @@ class PatientController extends Controller
         return view('app.patient.tickets', compact('patient', 'pros', 'allPros', 'type'));
     }
 
+    public function supplyOrders(Request $request, Client $patient, SupplyOrder $supplyOrder = null)
+    {
+        $products = Product::where('is_active', true)->orderBy('title')->get();
+        return view('app.patient.supply-orders', compact('patient', 'supplyOrder', 'products'));
+    }
+
+    public function shipments(Request $request, Client $patient, Shipment $shipment)
+    {
+        return view('app.patient.shipments', compact('patient', 'shipment'));
+    }
+
     public function appointments(Request $request, Client $patient, $forPro = 'all', $status = 'all') {
         $pros = $this->pros;
         $appointments = $patient->appointmentsForProByStatus('all', 'ALL');

+ 13 - 0
app/Models/Client.php

@@ -397,4 +397,17 @@ class Client extends Model
             ->orderBy('created_at', 'desc');
     }
 
+    public function supplyOrders()
+    {
+        return $this->hasMany(SupplyOrder::class, 'client_id', 'id')
+            ->orderBy('created_at', 'desc');
+    }
+
+    public function unshippedSupplyOrders()
+    {
+        return $this->hasMany(SupplyOrder::class, 'client_id', 'id')
+            ->whereNull('shipment_id')
+            ->orderBy('created_at', 'desc');
+    }
+
 }

+ 10 - 0
app/Models/Product.php

@@ -0,0 +1,10 @@
+<?php
+
+namespace App\Models;
+
+# use Illuminate\Database\Eloquent\Model;
+
+class Product extends Model
+{
+    protected $table = 'product';
+}

+ 10 - 0
app/Models/Shipment.php

@@ -0,0 +1,10 @@
+<?php
+
+namespace App\Models;
+
+# use Illuminate\Database\Eloquent\Model;
+
+class Shipment extends Model
+{
+    protected $table = 'shipment';
+}

+ 32 - 0
app/Models/SupplyOrder.php

@@ -0,0 +1,32 @@
+<?php
+
+namespace App\Models;
+
+# use Illuminate\Database\Eloquent\Model;
+
+class SupplyOrder extends Model
+{
+    protected $table = 'supply_order';
+
+    public function product()
+    {
+        return $this->hasOne(Product::class, 'id', 'product_id');
+    }
+
+    public function shipment()
+    {
+        return $this->hasOne(Shipment::class, 'id', 'shipment_id');
+    }
+
+    public function signedPro() {
+        return $this->hasOne(Pro::class, 'id', 'signed_by_pro_id');
+    }
+
+    public function waiverPro() {
+        return $this->hasOne(Pro::class, 'id', 'client_signature_waived_by_pro_id');
+    }
+
+    public function clearedForShipmentPro() {
+        return $this->hasOne(Pro::class, 'id', 'cleared_for_shipment_by_pro_id');
+    }
+}

+ 6 - 0
public/css/style.css

@@ -289,6 +289,9 @@ body>nav.navbar {
 .mcp-theme-1 .min-width-300px {
     min-width: 300px;
 }
+.mcp-theme-1 .min-width-500px {
+    min-width: 500px !important;
+}
 .mcp-theme-1 .width-100px {
     width: 100px;
     min-width: unset !important;
@@ -1458,3 +1461,6 @@ canvas.pdf-viewer-page.pdf-preview-page {
 .back-to-admin-button:hover {
     text-decoration: underline;
 }
+.bg-aliceblue {
+    background: aliceblue !important;
+}

+ 33 - 0
resources/views/app/patient/shipments.blade.php

@@ -0,0 +1,33 @@
+@extends ('layouts.patient')
+@section('inner-content')
+    <div class="">
+        <div class="d-flex align-items-center pb-2">
+            <h4 class="font-weight-bold m-0">Shipments</h4>
+            <span class="mx-2 text-secondary">|</span>
+            <div moe>
+                <a start show href="#">Add</a>
+                <form url="/api/shipment/create">
+                    <input type="hidden" name="clientUid" value="{{ $patient->uid }}">
+                    <label class="text-secondary font-weight-bold">Field</label>
+                    <div class="mb-2">
+                        TODO
+                    </div>
+                    <div class="d-flex align-items-center">
+                        <button class="btn btn-sm btn-primary mr-2" type="button" submit>Save</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+        <table class="table table-striped table-sm table-bordered mb-0">
+            @if($patient->shipments && count($patient->shipments))
+
+            @else
+                <tbody>
+                    <tr>
+                        <td class="text-secondary p-3">No shipments have been created for this patient</td>
+                    </tr>
+                </tbody>
+            @endif
+        </table>
+    </div>
+@endsection

+ 289 - 0
resources/views/app/patient/supply-orders.blade.php

@@ -0,0 +1,289 @@
+@extends ('layouts.patient')
+@section('inner-content')
+    <div class="">
+        <div class="d-flex align-items-center pb-2">
+            <h4 class="font-weight-bold m-0">Supply Orders</h4>
+            <span class="mx-2 text-secondary">|</span>
+            <div moe>
+                <a start show href="#">Add</a>
+                <form url="/api/supplyOrder/create">
+                    <input type="hidden" name="clientUid" value="{{ $patient->uid }}">
+                    <label class="text-secondary font-weight-bold">Add Supply Order</label>
+                    <div class="mb-2">
+                        <label class="text-secondary text-sm">Product</label>
+                        <select name="productUid" class="form-control form-control-sm">
+                            <option value=""> --select--</option>
+                            @foreach($products as $product)
+                                <option
+                                    value="{{$product->uid}}">{{$product->title}}</option>
+                            @endforeach
+                        </select>
+                    </div>
+                    <div class="mb-2">
+                        <label class="text-secondary text-sm">Reason</label>
+                        <input type="text" class="form-control form-control-sm" name="reason">
+                    </div>
+                    <div class="mb-2">
+                        <label class="text-secondary text-sm">Client Understanding Memo</label>
+                        <input type="text" class="form-control form-control-sm" name="clientUnderstandingMemo">
+                    </div>
+                    <div class="d-flex align-items-center">
+                        <button class="btn btn-sm btn-primary mr-2" type="button" submit>Save</button>
+                    </div>
+                </form>
+            </div>
+        </div>
+        <div class="d-flex align-items-start h-100">
+            <div class="flex-grow-1">
+                <table class="table table-sm table-bordered mb-0">
+                    @if($patient->supplyOrders && count($patient->supplyOrders))
+                        <thead>
+                        <tr class="bg-light">
+                            <th class="px-2 text-nowrap text-secondary border-bottom-0">Title</th>
+                            <th class="px-2 text-nowrap text-secondary border-bottom-0">Reason</th>
+                            @if(!$supplyOrder)
+                                <th class="px-2 text-nowrap text-secondary border-bottom-0">Created At</th>
+                                <th class="px-2 text-nowrap text-secondary border-bottom-0">Pro Signed?</th>
+                                <th class="px-2 text-nowrap text-secondary border-bottom-0">Cancelled?</th>
+                                <th class="px-2 text-nowrap text-secondary border-bottom-0">Shipment</th>
+                            @endif
+                        </tr>
+                        </thead>
+                        <tbody>
+                        @foreach($patient->supplyOrders as $iSupplyOrder)
+                            <tr class="{{@$supplyOrder && @$supplyOrder->uid === $iSupplyOrder->uid ? 'bg-aliceblue' : ''}}">
+                                <td class="px-2">
+                                    <a href="{{route('patients.view.supply-orders', ['patient' => $patient, 'supplyOrder' => $iSupplyOrder])}}">
+                                        {{ $iSupplyOrder->product->title }}
+                                    </a>
+                                </td>
+                                <td class="px-2">{{ $iSupplyOrder->reason }}</td>
+                                @if(!$supplyOrder)
+                                    <td class="px-2">{{ friendlier_date_time($iSupplyOrder->created_at) }}</td>
+                                    <td class="px-2">{{ $iSupplyOrder->is_signed_by_pro ? $iSupplyOrder->signedPro->displayName() : '-' }}</td>
+                                    <td class="px-2">{{ $iSupplyOrder->is_cancelled ? 'Yes' : 'No' }}</td>
+                                    <td class="px-2">{{ $iSupplyOrder->shipment_id ? $iSupplyOrder->shipment->status : '-' }}</td>
+                                @endif
+                            </tr>
+                        @endforeach
+                        </tbody>
+                    @else
+                        <tbody>
+                        <tr>
+                            <td class="text-secondary p-3">No supply orders have been created for this patient</td>
+                        </tr>
+                        </tbody>
+                    @endif
+                </table>
+            </div>
+            @if($supplyOrder)
+                <div class="min-width-500px ml-2 border align-self-stretch p-3">
+                    <div class="d-flex align-items-center">
+                        <h3 class="font-size-16 m-0">{{$supplyOrder->product->title}}</h3>
+                        <a class="ml-auto" href="{{route('patients.view.supply-orders', ['patient' => $patient])}}">
+                            <i class="fa fa-times-circle on-hover-opaque"></i>
+                        </a>
+                    </div>
+                    <hr class="my-3">
+                    <div class="mb-3">
+                        <label class="text-secondary text-sm mb-1">Reason</label>
+                        <div moe class="d-block">
+                            <a start show>{{$supplyOrder->reason}}</a>
+                            <form url="/api/supplyOrder/updateReason">
+                                <input type="hidden" name="uid" value="{{ $supplyOrder->uid }}">
+                                <div class="mb-2">
+                                    <label class="text-secondary mb-1 text-sm">Reason *</label>
+                                    <input type="text" class="form-control form-control-sm" required
+                                           name="reason" value="{{$supplyOrder->reason}}">
+                                </div>
+                                <div class="d-flex align-items-center">
+                                    <button class="btn btn-sm btn-primary mr-2" submit>Save</button>
+                                    <button class="btn btn-sm btn-default mr-2 border" cancel>Cancel</button>
+                                </div>
+                            </form>
+                        </div>
+                    </div>
+                    <div class="mb-3">
+                        <label class="text-secondary text-sm mb-1">Client Understanding Memo</label>
+                        <div moe class="d-block">
+                            @if($supplyOrder->client_understanding_memo)
+                                <a start show>{{$supplyOrder->client_understanding_memo}}</a>
+                            @else
+                                <a start show>(not set)</a>
+                            @endif
+                            <form url="/api/supplyOrder/updateClientUnderstandingMemo">
+                                <input type="hidden" name="uid" value="{{ $supplyOrder->uid }}">
+                                <div class="mb-2">
+                                    <label class="text-secondary mb-1 text-sm">Client Understanding Memo</label>
+                                    <input type="text" class="form-control form-control-sm"
+                                           name="clientUnderstandingMemo" value="{{$supplyOrder->client_understanding_memo}}">
+                                </div>
+                                <div class="d-flex align-items-center">
+                                    <button class="btn btn-sm btn-primary mr-2" submit>Save</button>
+                                    <button class="btn btn-sm btn-default mr-2 border" cancel>Cancel</button>
+                                </div>
+                            </form>
+                        </div>
+
+                    </div>
+                    <div class="mb-3">
+                        <label class="text-secondary text-sm mb-1">Pro Signature</label>
+                        <div class="d-flex align-items-center">
+                            @if($supplyOrder->is_signed_by_pro)
+                                <div class="text-info">
+                                    Signed by <b>{{$supplyOrder->signedPro->displayName()}}</b>
+                                    on {{friendlier_date_time($supplyOrder->pro_signed_at)}}
+                                </div>
+                            @else
+                                <div class="text-warning-mellow font-weight-bold">Not Signed</div>
+                                <div class="ml-3">
+                                    <div moe>
+                                        <a start show class="py-0">Sign</a>
+                                        <form url="/api/supplyOrder/signAsPro">
+                                            <input type="hidden" name="uid" value="{{ $supplyOrder->uid }}">
+                                            <p class="small">Sign this supply order?</p>
+                                            <div class="d-flex align-items-center">
+                                                <button class="btn btn-sm btn-success mr-2" submit>Sign</button>
+                                                <button class="btn btn-sm btn-default mr-2 border" cancel>Cancel</button>
+                                            </div>
+                                        </form>
+                                    </div>
+                                </div>
+                            @endif
+                        </div>
+                    </div>
+                    <div class="mb-3">
+                        <label class="text-secondary text-sm mb-1">Patient Signature</label>
+                        <div class="d-flex align-items-center">
+                            @if($supplyOrder->is_signed_by_client)
+                                <div class="text-info">
+                                    Signed by <b>{{$patient->displayName()}}</b>
+                                    on {{friendlier_date_time($supplyOrder->client_signed_at)}}
+                                </div>
+                            @elseif($supplyOrder->is_client_signature_waived)
+                                <div class="text-info">
+                                    Waived by <b>{{$supplyOrder->waiverPro->displayName()}}</b>
+                                    on {{friendlier_date_time($supplyOrder->client_signature_waived_at)}}
+                                </div>
+                                <div class="ml-3">
+                                    <div moe bottom relative="">
+                                        <a start show class="py-0">Undo</a>
+                                        <form url="/api/supplyOrder/undoWaiveClientSignature" right>
+                                            <input type="hidden" name="uid" value="{{ $supplyOrder->uid }}">
+                                            <p class="small">Undo waiving patient signature?</p>
+                                            <div class="d-flex align-items-center">
+                                                <button class="btn btn-sm btn-primary mr-2" submit>Yes</button>
+                                                <button class="btn btn-sm btn-default mr-2 border" cancel>No</button>
+                                            </div>
+                                        </form>
+                                    </div>
+                                </div>
+                            @else
+                                <div class="text-warning-mellow font-weight-bold">Not Signed</div>
+                                <div class="ml-3">
+                                    <div moe bottom relative="">
+                                        <a start show class="py-0">Email</a>
+                                        <form url="/api/supplyOrder/sendClientSignatureRequestByEmail">
+                                            <input type="hidden" name="uid" value="{{ $supplyOrder->uid }}">
+                                            <p class="small">Request patient signature via email?</p>
+                                            <div class="d-flex align-items-center">
+                                                <button class="btn btn-sm btn-primary mr-2" submit>Submit</button>
+                                                <button class="btn btn-sm btn-default mr-2 border" cancel>Cancel</button>
+                                            </div>
+                                        </form>
+                                    </div>
+                                </div>
+                                <span class="mx-2 text-secondary">|</span>
+                                <div class="">
+                                    <div moe bottom relative="">
+                                        <a start show class="py-0">SMS</a>
+                                        <form url="/api/supplyOrder/sendClientSignatureRequestBySms">
+                                            <input type="hidden" name="uid" value="{{ $supplyOrder->uid }}">
+                                            <p class="small">Request patient signature via SMS?</p>
+                                            <div class="d-flex align-items-center">
+                                                <button class="btn btn-sm btn-primary mr-2" submit>Submit</button>
+                                                <button class="btn btn-sm btn-default mr-2 border" cancel>Cancel</button>
+                                            </div>
+                                        </form>
+                                    </div>
+                                </div>
+                                <span class="mx-2 text-secondary">|</span>
+                                <div class="">
+                                    <a href="#" class="text-secondary on-hover-opaque">Problem Signing</a>
+                                </div>
+                                <span class="mx-2 text-secondary">|</span>
+                                <div class="">
+                                    <div moe bottom relative="">
+                                        <a start show class="py-0">Waive</a>
+                                        <form url="/api/supplyOrder/waiveClientSignature" right>
+                                            <input type="hidden" name="uid" value="{{ $supplyOrder->uid }}">
+                                            <p class="small mb-2">Waive patient signature?</p>
+                                            <div class="mb-2">
+                                                <label class="text-secondary mb-1 text-sm">Memo</label>
+                                                <input type="text" class="form-control form-control-sm"
+                                                       name="memo" value="{{$supplyOrder->client_signature_waiver_memo}}">
+                                            </div>
+                                            <div class="d-flex align-items-center">
+                                                <button class="btn btn-sm btn-primary mr-2" submit>Submit</button>
+                                                <button class="btn btn-sm btn-default mr-2 border" cancel>Cancel</button>
+                                            </div>
+                                        </form>
+                                    </div>
+                                </div>
+                            @endif
+                        </div>
+                        @if($supplyOrder->client_signature_last_requested_at &&
+                            !$supplyOrder->is_signed_by_client &&
+                            !$supplyOrder->is_client_signature_waived)
+                            <div class="text-sm my-1 text-info">Client signature last requested on {{friendlier_date_time($iSupplyOrder->client_signature_last_requested_at)}}</div>
+                        @endif
+                        @if($supplyOrder->does_client_have_problem_signing &&
+                            !$supplyOrder->is_signed_by_client &&
+                            !$supplyOrder->is_client_signature_waived)
+                            <div class="text-sm my-1 text-warning-mellow">
+                                Client has problem signing
+                                @if($supplyOrder->client_problem_signing)
+                                    <i class="text-sm">{{$supplyOrder->client_problem_signing}}</i></div>
+                                @endif
+                            </div>
+                        @endif
+                    </div>
+                    <hr class="my-3">
+                    <div class="d-flex align-items-center mb-2">
+                        @if($supplyOrder->is_cleared_for_shipment)
+                            <div class="text-info">
+                                <i class="fa fa-check"></i> Cleared for shipment by <b>{{$supplyOrder->clearedForShipmentPro->displayName()}}</b>
+                                on {{friendlier_date_time($supplyOrder->cleared_for_shipment_at)}}
+                            </div>
+                        @else
+                            <div moe bottom relative="">
+                                <a start show class="py-0 text-success font-weight-bold">Clear for Shipment</a>
+                                <form url="/api/supplyOrder/clearForShipment">
+                                    <input type="hidden" name="uid" value="{{ $supplyOrder->uid }}">
+                                    <p class="small mb-2">Clear this supply order for shipment?</p>
+                                    <div class="d-flex align-items-center">
+                                        <button class="btn btn-sm btn-primary mr-2" submit>Submit</button>
+                                        <button class="btn btn-sm btn-default mr-2 border" cancel>Cancel</button>
+                                    </div>
+                                </form>
+                            </div>
+                        @endif
+                    </div>
+                    <div class="d-flex align-items-center">
+                        <div moe bottom relative="">
+                            <a start show class="py-0 text-danger">Cancel Supply Order</a>
+                            <form url="/api/supplyOrder/cancel">
+                                <input type="hidden" name="uid" value="{{ $supplyOrder->uid }}">
+                                <p class="small text-nowrap mb-2">Cancel this supply order?</p>
+                                <div class="d-flex align-items-center">
+                                    <button class="btn btn-sm btn-primary mr-2" submit>Yes</button>
+                                    <button class="btn btn-sm btn-default mr-2 border" cancel>No</button>
+                                </div>
+                            </form>
+                        </div>
+                    </div>
+                </div>
+            @endif
+        </div>
+    </div>
+@endsection

+ 8 - 0
resources/views/layouts/patient.blade.php

@@ -103,6 +103,14 @@
                                 </li>
                             </ul>
                         </li>
+                        <li class="nav-item">
+                            <a class="nav-link {{ strpos($routeName, 'patients.view.supply-orders') === 0 ? 'active' : '' }}"
+                               href="{{ route('patients.view.supply-orders', ['patient' => $patient]) }}">Supply Orders</a>
+                        </li>
+                        <li class="nav-item">
+                            <a class="nav-link {{ strpos($routeName, 'patients.view.shipments') === 0 ? 'active' : '' }}"
+                               href="{{ route('patients.view.shipments', ['patient' => $patient]) }}">Shipments</a>
+                        </li>
                         <li class="nav-item">
                             <a class="nav-link {{ strpos($routeName, 'patients.view.incoming-reports') === 0 ? 'active' : '' }}"
                                href="{{ route('patients.view.incoming-reports', ['patient' => $patient]) }}">Incoming Reports</a>

+ 5 - 0
routes/web.php

@@ -178,6 +178,11 @@ Route::middleware('pro.auth')->group(function () {
 
         // appointments
         Route::get('appointments/{forPro}/{status}', 'PatientController@appointments')->name('appointments');
+
+        Route::get('supply-orders/{supplyOrder?}', 'PatientController@supplyOrders')->name('supply-orders');
+        Route::get('shipments/{shipment?}', 'PatientController@shipments')->name('shipments');
+
+
     });
 
     // pro dashboard events (ajax)