瀏覽代碼

Shipment single v2 UI (wip)

Vijayakrishnan 4 年之前
父節點
當前提交
610cffda6a

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

@@ -804,5 +804,9 @@ class PracticeManagementController extends Controller
                 ->count()
         ];
     }
+    
+    public function shipment(Request $request, Shipment $shipment) {
+        return view('app.practice-management.shipment', compact('shipment'));
+    }
 
 }

+ 327 - 0
resources/views/app/practice-management/shipment.blade.php

@@ -0,0 +1,327 @@
+@extends ('layouts/template')
+@section('content')
+
+    <?php
+    function cleanStatus($_status)
+    {
+        return ucwords(strtolower(str_replace("_", " ", $_status)));
+    }
+    ?>
+
+    <div id="practice-shipment" class="p-3 mcp-theme-1">
+        <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">
+                    Shipment
+                </strong>
+                <span class="text-sm text-secondary ml-2">
+                    (Created: {{friendlier_date_time($shipment->created_at)}})
+                </span>
+                <button id="print-shipment" class="btn btn-sm btn-info ml-auto">Generate PDF &amp; mark PRINTED</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/cancel" right>
+                        <input type="hidden" name="uid" value="{{ $shipment->uid }}">
+                        <p>Cancel this shipment?</p>
+                        <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="card-header px-3 py-2 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 class="card-body p-3 border-0">
+
+                <div class="mb-3">
+                    <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-3">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">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">&nbsp;</th>
+                            </tr>
+                            </thead>
+                            <tbody>
+                            @foreach($shipment->supplyOrders as $iSupplyOrder)
+                                <tr class="">
+                                    <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 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>
+                                    </td>
+                                    <td class="px-2">
+                                        <div moe relative class="d-block">
+                                            @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>
+                                    </td>
+                                    <td class="px-2">
+                                        <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>
+
+    <script>
+        (function () {
+
+            function updatePrintButton() {
+                let num = $('.row-select:checked').length;
+                $('#num-selected').text(num + ' shipment' + (num === 1 ? '' : 's') + ' selected');
+                if (num) {
+                    $('#print-selected').removeClass('d-none');
+                } else {
+                    $('#print-selected').addClass('d-none');
+                }
+            }
+
+            function hasError(_data) {
+                let msg = 'Unknown error!';
+                if (_data) {
+                    if (_data.success) return false;
+                    else if (_data.message) msg = _data.message;
+                }
+                toastr.error(msg);
+                return true;
+            }
+
+            function init() {
+                $('.change-status')
+                    .off('click')
+                    .on('click', function () {
+                        $.post('/api/shipment/setStatus', {
+                            uid: '{{$shipment->uid}}',
+                            status: $(this).attr('data-status')
+                        }, (_data) => {
+                            if (!hasError(_data)) {
+                                fastReload();
+                            }
+                        }, 'json');
+                    });
+                $('#print-shipment')
+                    .off('click')
+                    .on('click', function () {
+                        $.post('/api/shipment/setStatus', {
+                            uid: '{{$shipment->uid}}',
+                            status: 'PRINTED'
+                        }, (_data) => {
+                            if (!hasError(_data)) {
+                                fastReload();
+                            }
+                        }, 'json');
+                        // TODO: generate PDF
+                    });
+            }
+
+            addMCInitializer('practice-shipment', init, '#practice-shipment')
+
+        }).call(window);
+    </script>
+
+
+@endsection

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

@@ -45,7 +45,7 @@
                                 <input type="checkbox" class="my-0 mr-1 row-select">
                             </label>
                         </th>
-                        <td class="border-right"><a href="">Open</a></td>
+                        <td class="border-right"><a href="{{route('practice-management.shipment', $shipment->uid)}}">Open</a></td>
                         <td>{{$shipment->client->displayName()}}</td>
                         <td>
                             {!! $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]) : '-'  !!}

+ 1 - 1
resources/views/app/practice-management/shipments-waiting-for-picker.blade.php

@@ -44,7 +44,7 @@
                                 <input type="checkbox" class="my-0 mr-1 row-select">
                             </label>
                         </th>
-                        <td class="border-right"><a href="">Open</a></td>
+                        <td class="border-right"><a href="{{route('practice-management.shipment', $shipment->uid)}}">Open</a></td>
                         <td>{{$shipment->client->displayName()}}</td>
                         <td>
                             {!! $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]) : '-'  !!}

+ 12 - 6
resources/views/app/practice-management/shipments.blade.php

@@ -2,6 +2,13 @@
 
 @section('content')
 
+    <?php
+    function cleanStatus($_status)
+    {
+        return ucwords(strtolower(str_replace("_", " ", $_status)));
+    }
+    ?>
+
     <div id="practice-shipments" class="p-3 mcp-theme-1">
     <div class="card">
         <div class="card-header px-3 py-3 d-flex align-items-center bg-white">
@@ -66,11 +73,10 @@
                         <select class="form-control form-control-sm bg-aliceblue min-width-unset rounded-0 shadow-none border-0"
                                 data-filter="status">
                             <option value="">All</option>
-                            <option {{$filters['status'] == 'CREATED' ? 'selected' : ''}} value="CREATED">Created</option>
-                            <option {{$filters['status'] == 'SHIPPED' ? 'selected' : ''}} value="SHIPPED">Shipped</option>
-                            <option {{$filters['status'] == 'DELIVERED' ? 'selected' : ''}} value="DELIVERED">Delivered</option>
-                            <option {{$filters['status'] == 'RETURNED_TO_SENDER' ? 'selected' : ''}} value="RETURNED_TO_SENDER">Returned to Sender</option>
-                            <option {{$filters['status'] == 'CANCELLED' ? 'selected' : ''}} value="CANCELLED">Cancelled</option>
+                            <?php $statuses = ['CREATED', 'PRINTED', 'BEING_PICKED', 'PICKED', 'READY_FOR_FULFILMENT', 'READY_FOR_DISPATCH', 'DISPATCHED']; ?>
+                            @foreach($statuses as $iStatus)
+                                <option {{$filters['status'] == $iStatus ? 'selected' : ''}} value="{{$iStatus}}">{{cleanStatus($iStatus)}}</option>
+                            @endforeach
                         </select>
                     </th>
                     <th class="p-0 border-bottom-0 border-right"></th>
@@ -87,7 +93,7 @@
                 <tbody>
                 @foreach ($shipments as $shipment)
                     <tr class="{{$shipment->is_cancelled ? 'bg-light' : ''}}">
-                        <td class="border-right"><a href="">Open</a></td>
+                        <td class="border-right"><a href="{{route('practice-management.shipment', $shipment->uid)}}">Open</a></td>
                         <td>{{$shipment->client->displayName()}}</a></td>
                         <td>
                             @if($shipment->supplyOrders && count($shipment->supplyOrders))

+ 1 - 1
routes/web.php

@@ -119,7 +119,7 @@ Route::middleware('pro.auth')->group(function () {
             Route::get('shipments', 'PracticeManagementController@shipments')->name('shipments');
             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');
 
         });
     });