From 055e720e9fbadefa214f7399544f2f7cdbc741fc Mon Sep 17 00:00:00 2001 From: Dillon Ngo Date: Thu, 3 Apr 2025 07:18:31 +0800 Subject: [PATCH] New UI to show YD Order Tracking infomation --- .../FetchOrderPackagesLogic.php | 4 + .../FetchOrderPackagesV2Logic.php | 59 ++++++++++ .../Orders/FetchOrderPackagesController.php | 4 + .../Orders/FetchOrderPackagesV2Controller.php | 20 ++++ .../Resources/OrderPackagesBaseResource.php | 4 + .../OrderPackagesReceivedResource.php | 31 +++++ ...PackingListForPackagesReceivedResource.php | 50 ++++++++ .../elements/OrderPackagesComponent.vue | 110 ++++++++++++++++++ .../orders/elements/PackageComponent.vue | 12 +- .../orders/elements/PackageV2Component.vue | 94 +++++++++++++++ .../OrderPackageReceivedSectionComponent.vue | 50 ++++++++ .../OrderProfileV2SectionComponent.vue | 14 ++- .../CustomerPaymentsBillingComponent.vue | 2 +- .../sections/TrackingSectionComponent.vue | 3 +- .../views/pages/orders/profile_v2.blade.php | 4 +- resources/views/partials/menu.blade.php | 14 +-- routes/order.php | 1 + routes/web.php | 22 ++-- 18 files changed, 469 insertions(+), 29 deletions(-) create mode 100644 app/Classes/Modules/Orders/ControllersLogic/FetchOrderPackagesV2Logic.php create mode 100644 app/Http/Controllers/Orders/FetchOrderPackagesV2Controller.php create mode 100644 app/Http/Resources/OrderPackagesReceivedResource.php create mode 100644 app/Http/Resources/PackingListForPackagesReceivedResource.php create mode 100644 resources/assets/vue/components/orders/elements/OrderPackagesComponent.vue create mode 100644 resources/assets/vue/components/orders/elements/PackageV2Component.vue create mode 100644 resources/assets/vue/components/orders/sections/OrderPackageReceivedSectionComponent.vue diff --git a/app/Classes/Modules/Orders/ControllersLogic/FetchOrderPackagesLogic.php b/app/Classes/Modules/Orders/ControllersLogic/FetchOrderPackagesLogic.php index 7ae9e6ff..487f3861 100644 --- a/app/Classes/Modules/Orders/ControllersLogic/FetchOrderPackagesLogic.php +++ b/app/Classes/Modules/Orders/ControllersLogic/FetchOrderPackagesLogic.php @@ -10,6 +10,10 @@ use App\Http\Resources\OrderPackagesBaseResource; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +/** + * @deprecated This class is deprecated and should not be used. + * Use `FetchOrderPackagesV2Logic` instead or write a new one based on FetchOrderPackagesV2Logic + */ class FetchOrderPackagesLogic extends AbstractControllerLogic { diff --git a/app/Classes/Modules/Orders/ControllersLogic/FetchOrderPackagesV2Logic.php b/app/Classes/Modules/Orders/ControllersLogic/FetchOrderPackagesV2Logic.php new file mode 100644 index 00000000..61c8f6b4 --- /dev/null +++ b/app/Classes/Modules/Orders/ControllersLogic/FetchOrderPackagesV2Logic.php @@ -0,0 +1,59 @@ + 'Retrieved Order Packages', + 'message' => 'You have successfully retrieved an order packages' + ]; + } + + /** @var CanFetchOrder */ + private $canFetchOrder; + + /** @var FetchesOrder */ + private $fetchesOrder; + + /** + * FetchOrderPackagesV2Logic constructor. + * @param CanFetchOrder $canFetchOrder + * @param FetchesOrder $fetchesOrder + */ + public function __construct(CanFetchOrder $canFetchOrder, FetchesOrder $fetchesOrder) + { + $this->canFetchOrder = $canFetchOrder; + $this->fetchesOrder = $fetchesOrder; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws \App\Classes\Exceptions\AccessForbiddenException + * @throws \App\Classes\Exceptions\RequestValidationException + */ + public function logic(Request $request) : JsonResponse + { + $this->canFetchOrder->passes(); + + $query = $this->fetchesOrder->execute(['reference' => $request->route('id'), 'with_packing_lists' => true]); + + //Can refer FetchOrderPackagesLogic for different type of OrderPackages Resources + return $this->resourceResponse(new OrderPackagesReceivedResource($query)); + } + +} diff --git a/app/Http/Controllers/Orders/FetchOrderPackagesController.php b/app/Http/Controllers/Orders/FetchOrderPackagesController.php index 2902887b..2d6193d3 100644 --- a/app/Http/Controllers/Orders/FetchOrderPackagesController.php +++ b/app/Http/Controllers/Orders/FetchOrderPackagesController.php @@ -6,6 +6,10 @@ use App\Classes\Modules\Orders\ControllersLogic\FetchOrderPackagesLogic; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +/** + * @deprecated This class is deprecated and should not be used. + * Use `FetchOrderPackagesV2Controller` instead or write a new one based on FetchOrderPackagesV2Controller + */ class FetchOrderPackagesController { /** diff --git a/app/Http/Controllers/Orders/FetchOrderPackagesV2Controller.php b/app/Http/Controllers/Orders/FetchOrderPackagesV2Controller.php new file mode 100644 index 00000000..03452b37 --- /dev/null +++ b/app/Http/Controllers/Orders/FetchOrderPackagesV2Controller.php @@ -0,0 +1,20 @@ +execute($request); + } +} diff --git a/app/Http/Resources/OrderPackagesBaseResource.php b/app/Http/Resources/OrderPackagesBaseResource.php index a72eab31..c31177e6 100644 --- a/app/Http/Resources/OrderPackagesBaseResource.php +++ b/app/Http/Resources/OrderPackagesBaseResource.php @@ -11,6 +11,10 @@ use App\Models\Transaction; use Carbon\Carbon; use Illuminate\Http\Resources\Json\JsonResource; +/** + * @deprecated This class is deprecated and should not be used. + * Use `OrderPackagesReceivedResource` instead or write a new one based on OrderPackagesReceivedResource + */ class OrderPackagesBaseResource extends JsonResource { /** diff --git a/app/Http/Resources/OrderPackagesReceivedResource.php b/app/Http/Resources/OrderPackagesReceivedResource.php new file mode 100644 index 00000000..a5667c9d --- /dev/null +++ b/app/Http/Resources/OrderPackagesReceivedResource.php @@ -0,0 +1,31 @@ +packingLists()->where('type', PackingListType::WAREHOUSE_RECEIVE_LIST)->whereHas('packages')->get(); + + return [ + 'id' => $this->id, + 'reference' => $this->reference, + 'reference_contract' => (int) $this->type, + 'type' => (int) $this->type, + 'status' => (int) $this->status, + 'received_packages' => PackingListForPackagesReceivedResource::collection($received_packages), + 'created_at' => $this->created_at->format('d-m-Y') + ]; + } +} diff --git a/app/Http/Resources/PackingListForPackagesReceivedResource.php b/app/Http/Resources/PackingListForPackagesReceivedResource.php new file mode 100644 index 00000000..f54a3766 --- /dev/null +++ b/app/Http/Resources/PackingListForPackagesReceivedResource.php @@ -0,0 +1,50 @@ +user()->type, [RoleTypes::SHADOW_ADMIN, RoleTypes::SUPER_ADMIN]); + + $data = [ + 'id' => $this->id, + 'claimant_id' => $this->claimant_id, + 'reference' => $this->reference, + 'status' => $this->status, + 'transport' => new TransportResource($this->transports()->first()), + 'type' => $this->type, + 'container' => new ContainerResource($this->containers->first()), + $this->mergeWhen($this->owner instanceof Order, [ + 'order' => New OrderResource($this->owner) + ]), + ]; + + + $packages = !$this->packingLists()->exists() || $exceptionUsers ? $this->packages : $this->packingLists->first()->packages; + foreach ($packages as $item) { + $item['include_order'] = true; + $item['include_transport'] = true; + $item['include_container'] = false; + $item['include_packing_list_reference'] = true; + } + $data['packages'] = PackageBaseResource::collection($packages); + + return $data; + } +} diff --git a/resources/assets/vue/components/orders/elements/OrderPackagesComponent.vue b/resources/assets/vue/components/orders/elements/OrderPackagesComponent.vue new file mode 100644 index 00000000..ce49fbac --- /dev/null +++ b/resources/assets/vue/components/orders/elements/OrderPackagesComponent.vue @@ -0,0 +1,110 @@ + + diff --git a/resources/assets/vue/components/orders/elements/PackageComponent.vue b/resources/assets/vue/components/orders/elements/PackageComponent.vue index 96ecf9e5..3cc62ff4 100644 --- a/resources/assets/vue/components/orders/elements/PackageComponent.vue +++ b/resources/assets/vue/components/orders/elements/PackageComponent.vue @@ -23,7 +23,7 @@

Reference

- + {{ item.reference }}

@@ -197,7 +197,7 @@

- + Tracking Details

@@ -222,10 +222,10 @@ import componentHandler from '../../../general/mixins/componentHandler'; export default { props: { - status: { - required: true, - type: String - } + status: { + required: true, + type: String + }, }, created(){ $('[data-toggle="tooltip"]').tooltip() diff --git a/resources/assets/vue/components/orders/elements/PackageV2Component.vue b/resources/assets/vue/components/orders/elements/PackageV2Component.vue new file mode 100644 index 00000000..4374ba26 --- /dev/null +++ b/resources/assets/vue/components/orders/elements/PackageV2Component.vue @@ -0,0 +1,94 @@ + + + diff --git a/resources/assets/vue/components/orders/sections/OrderPackageReceivedSectionComponent.vue b/resources/assets/vue/components/orders/sections/OrderPackageReceivedSectionComponent.vue new file mode 100644 index 00000000..e97ab822 --- /dev/null +++ b/resources/assets/vue/components/orders/sections/OrderPackageReceivedSectionComponent.vue @@ -0,0 +1,50 @@ + + diff --git a/resources/assets/vue/components/orders/sections/OrderProfileV2SectionComponent.vue b/resources/assets/vue/components/orders/sections/OrderProfileV2SectionComponent.vue index 6db2c0a3..bd0c896d 100644 --- a/resources/assets/vue/components/orders/sections/OrderProfileV2SectionComponent.vue +++ b/resources/assets/vue/components/orders/sections/OrderProfileV2SectionComponent.vue @@ -170,7 +170,15 @@
- + + + + +
@@ -180,6 +188,10 @@ order_number: { type: Number, required: true, + }, + showOld: { + type: Boolean, + default: false } }, data(){ diff --git a/resources/assets/vue/components/paymentsBilling/elements/CustomerPaymentsBillingComponent.vue b/resources/assets/vue/components/paymentsBilling/elements/CustomerPaymentsBillingComponent.vue index dd3122a5..4cee02ad 100644 --- a/resources/assets/vue/components/paymentsBilling/elements/CustomerPaymentsBillingComponent.vue +++ b/resources/assets/vue/components/paymentsBilling/elements/CustomerPaymentsBillingComponent.vue @@ -99,7 +99,7 @@

Packinglist Reference

- + {{ item.packing_list_reference }}
diff --git a/resources/assets/vue/components/tracking/sections/TrackingSectionComponent.vue b/resources/assets/vue/components/tracking/sections/TrackingSectionComponent.vue index ea4c34c8..f7c6f355 100644 --- a/resources/assets/vue/components/tracking/sections/TrackingSectionComponent.vue +++ b/resources/assets/vue/components/tracking/sections/TrackingSectionComponent.vue @@ -82,10 +82,11 @@ }, reset() { this.trackingNo = ''; + this.searchString = ''; delete(this.options['tracking_no']); this.currentKey+=1; this.showList = false; - window.history.replaceState({}, '', '/tracking'); + window.history.replaceState({}, '', '/order/tracking'); }, }, mixins: [componentHandler] diff --git a/resources/views/pages/orders/profile_v2.blade.php b/resources/views/pages/orders/profile_v2.blade.php index 7ffef202..f027b531 100644 --- a/resources/views/pages/orders/profile_v2.blade.php +++ b/resources/views/pages/orders/profile_v2.blade.php @@ -1,4 +1,4 @@ @extends('layouts.base_portal') @section('inner_content') - -@endsection \ No newline at end of file + +@endsection diff --git a/resources/views/partials/menu.blade.php b/resources/views/partials/menu.blade.php index 87153ba8..e50a6d15 100644 --- a/resources/views/partials/menu.blade.php +++ b/resources/views/partials/menu.blade.php @@ -125,7 +125,7 @@
Payments & Billing
-
+
-
Tracking
+
Tracking
@@ -149,10 +149,7 @@
- +
Payment And Billing
@@ -160,10 +157,7 @@
- +
Payment And Billing
diff --git a/routes/order.php b/routes/order.php index af7a4620..cb142a63 100644 --- a/routes/order.php +++ b/routes/order.php @@ -22,6 +22,7 @@ Route::group(['prefix' => 'order', 'as' => 'order.', 'namespace' => 'Orders'], f Route::put('/assign-remark/{id}', 'AssignOrderRemarkController@create')->name('assign.remark'); Route::get('/{id}/shipping-cost', 'ShippingCostController@calculate')->name('shipping.cost'); Route::get('/packages/{id}', 'FetchOrderPackagesController@fetch')->name('packages'); + Route::get('/v2/packages/{id}', 'FetchOrderPackagesV2Controller@fetch')->name('packages.v2'); Route::post('/{id}/supplier-tax-rebate/create', 'CreateSupplierTaxRebateController@create')->name('tax_rebate.create'); Route::post('/supplier-tax-rebate/{id}/delete', 'DeleteSupplierTaxRebateController@delete')->name('tax_rebate.delete'); diff --git a/routes/web.php b/routes/web.php index 4232a731..43737028 100644 --- a/routes/web.php +++ b/routes/web.php @@ -211,13 +211,19 @@ Route::get('/orders-table', function () { return view('pages.orders.table'); })->name('ordersTable'); -Route::get('/order/show/{order_number}', function ($orderNumber) { +Route::get('/order/show/{order_number}', function (Illuminate\Http\Request $request, $orderNumber) { // return view('pages.orders.profile', ['id' => $orderNumber]); - return view('pages.orders.profile_v2', ['id' => $orderNumber]); + return view('pages.orders.profile_v2', [ + 'id' => $orderNumber, + 'q' => $request->query('q', null) + ]); })->name('order.show'); -Route::get('/order/v2/show/{order_number}', function ($orderNumber) { - return view('pages.orders.profile_v2', ['id' => $orderNumber]); +Route::get('/order/v2/show/{order_number}', function (Illuminate\Http\Request $request, $orderNumber) { + return view('pages.orders.profile_v2', [ + 'id' => $orderNumber, + 'q' => $request->query('q', null) +]); })->name('order.v2.show'); Route::get('/address', function () { @@ -637,6 +643,10 @@ Route::get('/customers/active/{active_start}/{active_end}/{inactive_start?}/{ina Route::get('/online_payment/redirect', 'Billplz\CallbackBillplzController@callback')->name('online_payment.redirect'); +Route::get('/order/tracking/{tracking_no?}', function ($tracking_no = null) { + return view('pages.tracking.search', ['tracking_no' => $tracking_no]); +})->name('order.tracking'); + Route::get('/order/{id}', function ($id) { return view('pages.orders.profile', ['id' => $id]); })->name('order.details'); @@ -1438,7 +1448,3 @@ Route::get('/group-transaction-with-completed-payments', function () { Route::get('/downloads', function () { return view('pages.downloads.index'); })->name('admin.downloads'); - -Route::get('/tracking/{tracking_no?}', function ($tracking_no = null) { - return view('pages.tracking.search', ['tracking_no' => $tracking_no]); -})->name('tracking');