Browse Source

Shipment batch print pick list

Vijayakrishnan 4 năm trước cách đây
mục cha
commit
a1d1df0f4a

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

@@ -809,4 +809,12 @@ class PracticeManagementController extends Controller
         return view('app.practice-management.shipment', compact('shipment'));
     }
 
+    public function shipmentsMultiPrint(Request $request, $ids) {
+        $ids = array_map(function($_x) {
+            return intval($_x);
+        }, explode("|", $ids));
+        $shipments = Shipment::whereIn('id', $ids)->get();
+        return view('app.practice-management.shipments-multi-print', compact('shipments'));
+    }
+
 }

+ 304 - 0
resources/views/app/practice-management/shipments-multi-print.blade.php

@@ -0,0 +1,304 @@
+@extends ('layouts/template-no-mc')
+@section('content')
+
+    <?php
+    function cleanStatus($_status)
+    {
+        return ucwords(strtolower(str_replace("_", " ", $_status)));
+    }
+    ?>
+
+    @foreach($shipments as $shipment)
+    <div style="page-break-after: always">
+    <div id="practice-shipment" class="p-3 mcp-theme-1">
+        <div class="card">
+            <div class="card-header px-3 py-3 d-flex align-items-center bg-white">
+                <strong class="font-size-14">
+                    Shipment
+                </strong>
+                <span class="text-sm text-secondary ml-2">
+                    (Created: {{friendlier_date_time($shipment->created_at)}})
+                </span>
+                @if($shipment->status === 'CANCELLED')
+                    <div class="ml-5 font-weight-bold text-danger on-hover-opaque">-- CANCELLED --</div>
+                @endif
+                <div class="ml-auto d-inline-flex align-items-center only-screen">
+                    <button id="print-shipment" class="btn btn-sm btn-info">Generate PDF</button>
+                    <div moe relative class="d-block ml-3">
+                        <a start show class="btn btn-default border btn-sm text-secondary">Cancel Shipment</a>
+                        <form url="/api/shipment/setStatus" right>
+                            <input type="hidden" name="uid" value="{{ $shipment->uid }}">
+                            <input type="hidden" name="status" value="CANCELLED">
+                            <p>Cancel this 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>
+                </div>
+            </div>
+            <div class="only-screen">
+                <div class="card-header px-3 py-3 d-flex align-items-center bg-light">
+                    <span class="mr-3">Status:</span>
+                    <?php $statuses = ['CREATED', 'PRINTED', 'BEING_PICKED', 'PICKED', 'READY_FOR_FULFILMENT', 'READY_FOR_DISPATCH', 'DISPATCHED']; ?>
+                    @foreach($statuses as $status)
+                        <button class="btn btn-sm {{ $shipment->status === $status ? 'btn-info font-weight-bold' : 'btn-outline-info change-status bg-white' }}"
+                                data-status="{{$status}}">
+                            {{cleanStatus($status)}}
+                        </button>
+                        @if($status !== 'DISPATCHED')
+                            <span class="text-secondary text-sm mx-2"><i class="fa fa-chevron-right on-hover-opaque"></i></span>
+                        @endif
+                    @endforeach
+                </div>
+            </div>
+
+            <div class="card-header p-3 only-print bg-white">
+                <div class="d-flex justify-content-center">
+                    <div>
+                        <?php
+                        $generator = new Picqer\Barcode\BarcodeGeneratorPNG();
+                        echo '<img src="data:image/png;base64,' . base64_encode($generator->getBarcode($shipment->uid, $generator::TYPE_CODE_128, 1, 60)) . '">';
+                        ?>
+                        <div class="text-center text-secondary text-sm mt-1">{{$shipment->uid}}</div>
+                    </div>
+                </div>
+
+            </div>
+
+            <div class="card-body p-3 border-0">
+
+                <div class="mb-3 d-flex align-items-center">
+                    <span class="text-secondary">Patient: </span>
+                    <a href="{{route('patients.view.dashboard', $shipment->client->uid)}}">
+                        <span class="font-size-14">{{$shipment->client->displayName()}}</span>
+                    </a>
+                    <span class="text-secondary ml-auto">Address: </span>
+                    <span class="font-size-14">{!! $shipment->mailing_address_full ? implode(" ", [$shipment->mailing_address_line1 . ' ' . $shipment->mailing_address_line2, $shipment->mailing_address_city . ' ' . $shipment->mailing_address_state . ' ' . $shipment->mailing_address_zip]) : '-'  !!}</span>
+                </div>
+
+                <div class="mb-3">
+                    <table class="table table-sm table-striped table-bordered mb-0 bg-white">
+                        @if($shipment->supplyOrders && count($shipment->supplyOrders))
+                            <thead>
+                            <tr class="">
+                                <th class="px-2 text-nowrap text-secondary border-bottom-0 only-print">Picked</th>
+                                <th class="px-2 text-nowrap text-secondary border-bottom-0">Item</th>
+                                <th class="px-2 text-nowrap text-secondary border-bottom-0">IMEI</th>
+                                <th class="px-2 text-nowrap text-secondary border-bottom-0">Lot #</th>
+                                <th class="px-2 text-nowrap text-secondary border-bottom-0 only-screen">&nbsp;</th>
+                            </tr>
+                            </thead>
+                            <tbody>
+                            @foreach($shipment->supplyOrders as $iSupplyOrder)
+                                <tr class="">
+                                    <td class="px-2 only-print">&nbsp;</td>
+                                    <td class="px-2">{{ $iSupplyOrder->product->title }}
+                                        <span class="text-sm text-secondary ml-2">
+                                            (Created: {{friendlier_date_time($iSupplyOrder->created_at)}})
+                                        </span>
+                                    </td>
+                                    <td class="px-2">
+                                        <div class="only-screen">
+                                        <div moe relative class="d-block">
+                                            <a start
+                                               show>{{ $iSupplyOrder->imei ? $iSupplyOrder->imei : '(not set)' }}</a>
+                                            <form url="/api/supplyOrder/associateImei" right>
+                                                <input type="hidden" name="uid" value="{{ $iSupplyOrder->uid }}">
+                                                <div class="mb-2">
+                                                    <label class="text-secondary mb-1 text-sm">IMEI *</label>
+                                                    <input type="text" class="form-control form-control-sm" required
+                                                           name="imei" value="{{ $iSupplyOrder->imei }}">
+                                                </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>
+                                        &nbsp;
+                                    </td>
+                                    <td class="px-2">
+                                        <div moe relative class="d-block">
+                                            <div class="only-screen">
+                                            @if($iSupplyOrder->product->has_lot)
+                                                <a start
+                                                   show>{{ $iSupplyOrder->lot_number ? $iSupplyOrder->lot_number : '(not set)' }}</a>
+                                                <form url="/api/supplyOrder/updateLotNumber" right>
+                                                    <input type="hidden" name="uid" value="{{ $iSupplyOrder->uid }}">
+                                                    <div class="mb-2">
+                                                        <label class="text-secondary mb-1 text-sm">Lot # *</label>
+                                                        <input type="text" class="form-control form-control-sm" required
+                                                               name="lotNumber" value="{{ $iSupplyOrder->lot_number }}">
+                                                    </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>
+                                            @else
+                                                <span class="text-secondary">N/A</span>
+                                            @endif
+                                            </div>
+                                            &nbsp;
+                                        </div>
+                                    </td>
+                                    <td class="px-2 only-screen">
+                                        <div moe relative>
+                                            <a start show class="py-0 text-danger">Remove</a>
+                                            <form url="/api/supplyOrder/removeFromShipment" right>
+                                                <input type="hidden" name="uid" value="{{ $iSupplyOrder->uid }}">
+                                                <p class="small">Remove this supply order?</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>
+                                    </td>
+                                </tr>
+                            @endforeach
+                            </tbody>
+                        @else
+                            <tbody>
+                            <tr>
+                                <td class="text-secondary px-3 py-2">No items in this shipment!</td>
+                            </tr>
+                            </tbody>
+                        @endif
+                    </table>
+                </div>
+
+                <div class="bg-light border px-2 pt-2">
+
+                    <div class="mb-2 d-flex align-items-baseline">
+                        <label class="text-secondary mb-0 width-90px mr-2">Ship Date</label>
+                        <div moe bottom relative class="d-block">
+                            <a start
+                               show>{{$shipment->ship_date ? friendlier_date($shipment->ship_date) : '(not set)'}}</a>
+                            <form url="/api/shipment/setShipDate">
+                                <input type="hidden" name="uid" value="{{ $shipment->uid }}">
+                                <div class="mb-2">
+                                    <label class="text-secondary mb-1 text-sm">Ship Date *</label>
+                                    <input type="date" class="form-control form-control-sm" required
+                                           name="shipDate" value="{{$shipment->ship_date}}">
+                                </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-2 d-flex align-items-baseline">
+                        <label class="text-secondary mb-0 width-90px mr-2">Courier</label>
+                        <div moe bottom relative class="d-block">
+                            <a start show>{{$shipment->courier ? $shipment->courier : '(not set)'}}</a>
+                            <form url="/api/shipment/setCourier">
+                                <input type="hidden" name="uid" value="{{ $shipment->uid }}">
+                                <div class="mb-2">
+                                    <label class="text-secondary mb-1 text-sm">Courier</label>
+                                    <input type="text" class="form-control form-control-sm"
+                                           name="courier" value="{{$shipment->courier}}">
+                                </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-2 d-flex align-items-baseline">
+                        <label class="text-secondary mb-0 width-90px mr-2">Label File</label>
+                        @if($shipment->label_system_file_id)
+                            <a class="pdf-viewer-trigger" native target="_blank"
+                               href="/api/shipment/downloadLabel/{{ $shipment->uid }}"
+                               title="View">
+                                <i class="fa fa-file-pdf text-danger on-hover-opaque"></i>
+                                View
+                                {{--{{ $shipment->labelFile->file_name }}--}}
+                            </a>
+                            <span class="mx-2 text-secondary">|</span>
+                        @endif
+                        <div moe bottom relative class="d-block">
+                            <a start show>Upload</a>
+                            <form url="/api/shipment/setLabelSystemFile">
+                                <input type="hidden" name="uid" value="{{ $shipment->uid }}">
+                                <div class="mb-2">
+                                    <label class="text-secondary mb-1 text-sm">Label File</label>
+                                    <input type="file" class="form-control form-control-sm"
+                                           name="labelSystemFile">
+                                </div>
+                                <div class="d-flex align-items-center">
+                                    <button class="btn btn-sm btn-primary mr-2" submit>Upload</button>
+                                    <button class="btn btn-sm btn-default mr-2 border" cancel>Cancel</button>
+                                </div>
+                            </form>
+                        </div>
+                    </div>
+
+                    <div class="mb-2 d-flex align-items-baseline">
+                        <label class="text-secondary mb-0 width-90px mr-2">Tracking #</label>
+                        <div moe bottom relative class="d-block">
+                            <a start show>{{$shipment->tracking_number ? $shipment->tracking_number : '(not set)'}}</a>
+                            <form url="/api/shipment/setTrackingNumber">
+                                <input type="hidden" name="uid" value="{{ $shipment->uid }}">
+                                <div class="mb-2">
+                                    <label class="text-secondary mb-1 text-sm">Tracking #</label>
+                                    <input type="text" class="form-control form-control-sm"
+                                           name="trackingNumber" value="{{$shipment->tracking_number}}">
+                                </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-2 d-flex align-items-baseline">
+                        <label class="text-secondary mb-0 width-90px mr-2">Status</label>
+                        <span>{{cleanStatus($shipment->status)}}</span>
+                    </div>
+
+                    @if($shipment->status === 'DELIVERED')
+                        <div class="mb-2 d-flex align-items-baseline">
+                            <label class="text-secondary mb-0 width-90px mr-2">Delivered Date</label>
+                            <div moe bottom relative class="d-block">
+                                <a start
+                                   show>{{$shipment->delivered_date ? friendlier_date($shipment->delivered_date) : '(not set)'}}</a>
+                                <form url="/api/shipment/setDeliveredDate">
+                                    <input type="hidden" name="uid" value="{{ $shipment->uid }}">
+                                    <div class="mb-2">
+                                        <label class="text-secondary mb-1 text-sm">Delivered Date</label>
+                                        <input type="date" class="form-control form-control-sm"
+                                               name="deliveredDate" value="{{$shipment->delivered_date}}">
+                                    </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>
+                    @endif
+
+                </div>
+
+            </div>
+        </div>
+    </div>
+    </div>
+    @endforeach
+
+
+@endsection

+ 16 - 4
resources/views/app/practice-management/shipments-ready-to-print.blade.php

@@ -2,7 +2,7 @@
 
 @section('content')
 
-    <div id="practice-shipments-ready-to-print" class="p-3 mcp-theme-1">
+    <div id="practice-shipments-ready-to-print" class="p-3 mcp-theme-1 only-screen">
     <div class="card border-bottom-0">
         <div class="card-header px-3 py-3 d-flex align-items-center bg-white">
             <strong class="font-size-14">
@@ -16,7 +16,7 @@
 
         <div class="card-header px-3 py-1 d-flex align-items-center bg-white">
             <span id="num-selected" class="font-weight-bold text-secondary py-2">0 shipments selected.</span>
-            <button id="print-selected" class="btn btn-sm btn-info ml-3 d-none">Generate PDF &amp; mark PRINTED for all selected shipments</button>
+            <button id="print-selected" class="btn btn-sm btn-info ml-3 d-none" type="button">Generate PDF &amp; mark PRINTED for all selected shipments</button>
         </div>
 
         <div class="card-body p-0 border-0">
@@ -39,6 +39,7 @@
                 <tbody>
                 @foreach ($shipments as $shipment)
                     <tr data-shipment-uid="{{$shipment->uid}}"
+                        data-shipment-id="{{$shipment->id}}"
                         class="{{$shipment->is_cancelled ? 'bg-light' : ''}}">
                         <th class="border-right border-left-0">
                             <label class="d-flex align-items-center m-0">
@@ -79,6 +80,8 @@
     </div>
     </div>
 
+    <div id="print-view" class="only-print"></div>
+
     <script>
         (function() {
 
@@ -141,10 +144,19 @@
                             status: 'PRINTED'
                         }, (_data) => {
                             if(!hasError(_data)) {
-                                fastReload();
+                                let ids = [];
+                                $('.row-select:checked').each(function() {
+                                    ids.push($(this).closest('tr').attr('data-shipment-id'));
+                                });
+                                $('#print-view').load('/practice-management/shipments-multi-print/' + ids.join('|'), (_data) => {
+                                    window.setTimeout(() => {
+                                        window.print();
+                                        fastReload();
+                                    }, 1500);
+                                });
                             }
                         }, 'json');
-                        // TODO: generate PDF
+                        return false;
                     });
             }
 

+ 347 - 0
resources/views/layouts/template-no-mc.blade.php

@@ -0,0 +1,347 @@
+<!DOCTYPE html>
+<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
+
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+
+    <title>{{ config('app.name') }}</title>
+
+    <!-- Fonts -->
+    <link href="https://fonts.googleapis.com/css?family=Nunito:200,600" rel="stylesheet">
+
+    {{-- mc initializers --}}
+    <script src="/js/mc-init.js?_=2"></script>
+
+    {{-- vue --}}
+    <script src="/js/vue.js"></script>
+
+    {{-- Quill RTE --}}
+    <script>
+        window.stagQuillConfig = {
+            toolbar: ['bold', 'italic', 'underline', { 'list': 'ordered'}, { 'list': 'bullet' }],
+            keyboard: {
+                bindings: {
+                    handleEnter: {
+                        key: 13,
+                        handler: function() {
+                            if(!$('.stag-shortcuts:visible').length) return true;
+                        }
+                    }
+                }
+            }
+        };
+    </script>
+    <link href="/quill/quill.snow.css" rel="stylesheet">
+    <script src="/quill/quill.js"></script>
+
+    <!-- <link href="{{ asset('bootstrap-4.5.0/css/bootstrap.css') }}" rel="stylesheet"> -->
+    <link rel="stylesheet" href="/fontawesome-free-5.13.1-web/css/all.min.css">
+    <link href="{{ asset('/css/app.css') }}" rel="stylesheet">
+    <link href="{{ asset('/css/style.css') }}" rel="stylesheet">
+    <link href="{{ asset('/css/yemi.css') }}" rel="stylesheet">
+    <link rel="stylesheet" href="{{ asset('/css/toastr.min.css') }}">
+    <link href="{{asset('/css/z.css')}}" rel=stylesheet>
+    <!-- Styles -->
+
+    <script src="{{ asset('js/app.js') }}" type="application/javascript"></script>
+    <script src="/js/jquery-3.5.1.min.js"></script>
+    <script src="/js/jquery.form.min.js"></script>
+    <script src="{{ asset('js/toastr.min.js') }}" type="application/javascript"></script>
+    <script src="/js/yemi.js?_=7" type="application/javascript"></script>
+
+    {{-- med ac --}}
+    <link href='/css/autocomplete-lhc.min.css' rel="stylesheet">
+    <script src='/js/autocomplete-lhc.js'></script>
+
+    {{-- inline bootstrap datepicker --}}
+    <link href='/bootstrap-datepicker/css/bootstrap-datepicker.standalone.min.css' rel="stylesheet">
+    <script src='/bootstrap-datepicker/js/bootstrap-datepicker.min.js'></script>
+
+    {{-- pdfjs --}}
+    <script src="https://mozilla.github.io/pdf.js/build/pdf.js"></script>
+
+    {{-- WebSockets --}}
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/sockjs-client/1.5.0/sockjs.min.js"
+            integrity="sha512-5yJ548VSnLflcRxWNqVWYeQZnby8D8fJTmYRLyvs445j1XmzR8cnWi85lcHx3CUEeAX+GrK3TqTfzOO6LKDpdw=="
+            crossorigin="anonymous"></script>
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/stomp.js/2.3.3/stomp.min.js"
+            integrity="sha512-iKDtgDyTHjAitUDdLljGhenhPwrbBfqTKWO1mkhSFH3A7blITC9MhYon6SjnMhp4o0rADGw9yAC6EW4t5a4K3g=="
+            crossorigin="anonymous"></script>
+
+    @yield('head')
+</head>
+
+<body>
+    <div id="mask" style="background: rgba(0, 0, 0, 0) url(&quot;/vanillaspin.gif&quot;) no-repeat scroll center center; position: fixed; top: 0px; left: 0px; z-index: 9999; width: 100%; height: 100%; display: none;">
+    </div>
+    <div id="moe-form-mask" style="background: rgba(0, 0, 0, .1) no-repeat scroll center center; position: fixed; top: 0px; left: 0px; z-index: 97; width: 100%; height: 100%; display: none;">
+    </div>
+
+
+
+    <nav class="navbar navbar-expand-md navbar-dark stag-primary-bg py-1 mcp-theme-1 px-2">
+        <a class="navbar-brand" href="{{ route('dashboard') }}">
+            <img src="/img/logo_white.svg" alt="Leadership Health">
+        </a>
+        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navBar" aria-controls="navBar" aria-expanded="false" aria-label="Toggle navigation">
+            <span class="navbar-toggler-icon"></span>
+        </button>
+
+        <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 && ($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>-->
+                @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>
+                    <div class="dropdown-menu mcp-theme-1" aria-labelledby="practice-management">
+                        {{--<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="{{ 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.billingManager') }}">Billing Manager</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.cellularMeasurements') }}">Cellular Measurements</a>
+                            <a class="dropdown-item" href="{{ route('practice-management.cellularDeviceManager') }}">Cellular Device Manager</a>
+                            <a class="dropdown-item" href="{{ route('practice-management.claims') }}">Claims</a>
+                            <a class="dropdown-item" href="{{ route('practice-management.hcpBillMatrix') }}">HCP Bill Matrix</a>
+                            <a class="dropdown-item" href="{{ route('practice-management.treatmentServiceUtil') }}">Treatment Service Util.</a>
+                            <a class="dropdown-item" href="{{ route('practice-management.tickets') }}">Tickets</a>
+                            <a class="dropdown-item" href="{{ route('practice-management.supply-orders') }}">Supply Orders</a>
+                            <a class="dropdown-item" href="{{ route('practice-management.shipments') }}">Shipments</a>
+                        @endif
+                    </div>
+                </li>
+            </ul>
+            {{-- if pro is working on a client and is not in tht client --}}
+            <div class="current-work mr-2">
+                @include('app/current-work')
+            </div>
+            <a href="#" class="mr-2 text-white small" onclick="return fastReload()"><i class="fa fa-sync"></i></a>
+            <div class="d-inline-flex pr-2 mcp-theme-1 position-relative">
+                <input id="patient-search" type="search" class="form-control form-control-sm outline-0" autocomplete="off" placeholder="Search Patients">
+                <div class="suggestions-outer position-absolute d-none">
+
+                </div>
+            </div>
+            <div class="d-flex align-items-center">
+
+                <div class="dropdown">
+                    <a class="nav-link dropdown-toggle text-white pl-1 pr-0" href="#" id="account-menu" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                        <span class="text-white my-0 small">Hi, <b title="Cell# {{$pro->cell_number}}">{{ $pro->name_first }}!</b></span>
+                    </a>
+                    <div class="dropdown-menu dropdown-menu-right mcp-theme-1 pt-0 pb-1" aria-labelledby="account-menu">
+                        @if($performer->logged_in_as_pro_from_admin_pro_app_session_id)
+                            <form action="{{route('back-to-admin-pro')}}" method="post" target="_top" class="d-block pt-1">
+                                @csrf
+                                <button class="d-block ml-2 back-to-admin-button">
+                                    Back to Admin
+                                </button>
+                            </form>
+                        @endif
+                        @if($pro->pro_type == 'ADMIN')
+                            <a href="{{route('log-in-as')}}" native target="_top" class="d-block ml-2 pt-1">Log In As</a>
+                        @endif
+                        @if($pro->pro_type == 'ADMIN')
+                            <a native target="_top" class="d-block ml-2 pt-1"
+                               href="{{config('stag.adminPortalUrl')}}/pro_log_in_with_session_key/{{$performer->session_key}}" title="">
+                                Admin
+                            </a>
+                        @endif
+                        <a native target="_top" class="d-block ml-2 pt-1" href="{{config('stag.authUrl')}}" title="">
+                            Exit
+                        </a>
+                        <a native target="_top" href="{{route('logout')}}" class="d-block ml-2 pt-1">
+                            Sign Out
+                        </a>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <a href="#" class="stag_rhs_toggle d-none d-md-block text-white" title="Toggle Video Pane">
+            <i class="fa fa-arrow-right"></i>
+        </a>
+    </nav>
+
+    <main role="main" class="stag-content px-0">
+
+        @yield('content')
+
+    </main><!-- /.container -->
+
+    <!-- shortcut/suggest component -->
+    <link href="/css/shortcut.css" rel=stylesheet>
+    <script src="/js/shortcut.js" type="application/javascript"></script>
+
+    <!-- pro suggest component -->
+    <script src="/js/pro-suggest.js" type="application/javascript"></script>
+
+    <!-- script to handle history/back/forward for mc/xxx pages
+    + all other JS initialization needed in fastLoaded pages  -->
+    <script src="/js/find-event-handlers.js" type="application/javascript"></script>
+
+    <script>
+        window.noMc = true;
+    </script>
+    <script src="/js/mc.js?_=4" type="application/javascript"></script>
+
+    <form url="/api/proTextShortcut/create" id="create-shortcut-form" class="mcp-theme-1">
+        <input type="hidden" name="proUid" value="{{ $pro->uid  }}">
+        <div class="mb-2">
+            <input type="text" class="form-control form-control-sm" name="shortcut" value="" placeholder="Shortcut Name" required>
+        </div>
+        <div class="mb-2">
+            <textarea name="text" class="form-control form-control-sm" rows="3" id="selected-sc-text" placeholder="Content" required></textarea>
+        </div>
+        <div class="mb-0">
+            <button class="btn btn-primary btn-sm" type="submit">Save</button>
+            <button class="btn btn-default border btn-sm ml-1" type="reset">Cancel</button>
+        </div>
+    </form>
+
+    <script>
+        $(document).ready(function() {
+            window.toggleChildLinks = function(_element) {
+                $(_element).closest('.nav-item').toggleClass('nav-child-collapsed');
+                return false;
+            }
+            const debounce = (func, wait) => {
+                let timeout;
+                return function executedFunction(...args) {
+                    const later = () => {
+                        clearTimeout(timeout);
+                        func(...args);
+                    };
+                    clearTimeout(timeout);
+                    timeout = setTimeout(later, wait);
+                };
+            };
+            var lastTerm = '';
+            var returnedFunction = debounce(function() {
+                var term = $.trim($('#patient-search').val());
+                if (!!term && lastTerm !== term) {
+                    $.get('/patients-suggest?term=' + term, function(_data) {
+                        $('.suggestions-outer').html(_data).removeClass('d-none');
+                    });
+                    lastTerm = term;
+                } else {
+                    $('.suggestions-outer').addClass('d-none');
+                }
+            }, 250);
+            $('#patient-search')
+                .on('keydown', function(e) {
+                    var activeItem = $('.suggestions-outer .suggest-item.active');
+                    switch (e.which) {
+                        case 27:
+                            $('.suggestions-outer').addClass('d-none');
+                            return false;
+                        case 38:
+                            if (activeItem.prev().length) {
+                                activeItem.prev()
+                                    .addClass('active')
+                                    .siblings().removeClass('active');
+                                activeItem = $('.suggestions-outer .suggest-item.active');
+                                if (activeItem.length) {
+                                    activeItem[0].scrollIntoView();
+                                }
+                            }
+                            return false;
+                        case 40:
+                            if (activeItem.next().length) {
+                                activeItem.next()
+                                    .addClass('active')
+                                    .siblings().removeClass('active');
+                                activeItem = $('.suggestions-outer .suggest-item.active');
+                                if (activeItem.length) {
+                                    activeItem[0].scrollIntoView();
+                                }
+                            }
+                            return false;
+                        case 13:
+                            if (activeItem.length) {
+                                activeItem.first().click();
+                            }
+                            return false;
+                        default:
+                            window.setTimeout(onQueryChange, 50);
+                            break;
+                    }
+                })
+                .on('keypress paste', function(e) {
+                    window.setTimeout(onQueryChange, 50);
+                });
+            function onQueryChange() {
+                var term = $.trim($('#patient-search').val());
+                if (!!term) {
+                    $('.suggestions-outer')
+                        .html('<span class="d-block no-suggest-items">Searching...</span>')
+                        .removeClass('d-none');
+                    returnedFunction();
+                } else {
+                    $('.suggestions-outer').addClass('d-none');
+                }
+            }
+            $(document).on('click', '.suggest-item.patient-suggest[data-target-uid]', function() {
+                $('#patient-search').val('');
+                $('.suggestions-outer').addClass('d-none');
+                fastLoad('/patients/view/' + $(this).attr('data-target-uid'), true, false, false);
+                return false;
+            });
+        });
+    </script>
+    <script src="/js/stag-popup.js"></script>
+    <script src="/js/option-list.js"></script>
+    @include('app/pdf/viewer')
+    <script>
+        window.socketClient = Stomp.over(new SockJS("{{ config('app.backend_ws_url') }}"));
+        window.socketClient.connect({}, (frame) => {
+
+            window.socketClient.send("/app/register", {},     // register self
+                JSON.stringify({
+                    sessionKey: '{{$performer->session_key}}'
+                })
+            );
+
+            window.socketClient.subscribe("/user/topic/myCurrentProClientWork", function(message) {
+                console.log("You have a client pro work: ", message);
+                $.get('/current-work', function(_data) {
+                    $('.current-work').html(_data);
+                    //initFastLoad($('.current-work'));
+                    fastReload();
+                });
+            });
+
+            window.socketClient.subscribe("/user/topic/killMyCurrentProClientWork", function(message) {
+                console.log("You have killed your current pro client work: ", message);
+                $.get('/current-work', function(_data) {
+                    $('.current-work').html(_data);
+                    //initFastLoad($('.current-work'));
+                    fastReload();
+                });
+            });
+
+
+
+        });
+    </script>
+</body>
+
+</html>

+ 1 - 1
routes/web.php

@@ -120,7 +120,7 @@ Route::middleware('pro.auth')->group(function () {
             Route::get('shipments/ready-to-print', 'PracticeManagementController@shipmentsReadyToPrint')->name('shipments-ready-to-print');
             Route::get('shipments/waiting-for-picker', 'PracticeManagementController@shipmentsShipmentUnderway')->name('shipments-waiting-for-picker');
             Route::get('shipments/view/{shipment}', 'PracticeManagementController@shipment')->name('shipment');
-
+            Route::get('shipments-multi-print/{ids?}', 'PracticeManagementController@shipmentsMultiPrint')->name('shipments-multi-print');
         });
     });