mirror of
https://gitlab.com/CIEFWorldwideSdnBhd/shipping-portal.git
synced 2026-08-19 04:24:12 +00:00
updates last mile intergration - add functions
- admin cancel order
- add filter to display only active orders
- hide customer page
- show parcel weight as total weight (quantity * weight per quantity)
- in create order form
- order table
- export excel
- update export excel, only include the data of the selected Ids
This commit is contained in:
@@ -0,0 +1,58 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Classes\Modules\Delivery\ControllersLogic;
|
||||||
|
|
||||||
|
use App\Classes\General\Abstracts\AbstractControllerLogic;
|
||||||
|
use App\Classes\Modules\Orders\Services\CancelsOrder;
|
||||||
|
use App\Classes\Modules\Orders\Services\FetchesOrder;
|
||||||
|
use App\Http\Resources\DeliveryOrderResource;
|
||||||
|
use App\Models\Order;
|
||||||
|
use Illuminate\Http\JsonResponse;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
|
class CancelDeliveryOrderLogic extends AbstractControllerLogic
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
protected function notification(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'title' => 'Cancelled Order',
|
||||||
|
'message' => 'You have successfully cancelled an order'
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @var CancelsOrder */
|
||||||
|
private $cancelsOrder;
|
||||||
|
|
||||||
|
/** @var FetchesOrder */
|
||||||
|
private $fetchesOrder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CancelDeliveryOrderLogic constructor.
|
||||||
|
* @param CancelsOrder $cancelsOrder
|
||||||
|
* @param FetchesOrder $fetchesOrder
|
||||||
|
*/
|
||||||
|
public function __construct(CancelsOrder $cancelsOrder, FetchesOrder $fetchesOrder)
|
||||||
|
{
|
||||||
|
$this->cancelsOrder = $cancelsOrder;
|
||||||
|
$this->fetchesOrder = $fetchesOrder;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Request $request
|
||||||
|
* @return JsonResponse
|
||||||
|
* @throws \App\Classes\Exceptions\MalformedRequestException
|
||||||
|
*/
|
||||||
|
public function logic(Request $request): JsonResponse
|
||||||
|
{
|
||||||
|
|
||||||
|
/** @var Order $order */
|
||||||
|
$order = $this->fetchesOrder->execute(['id' => $request->route('id')]);
|
||||||
|
|
||||||
|
return $this->resourceResponse(new DeliveryOrderResource($this->cancelsOrder->execute($order)));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -63,7 +63,11 @@ class ExportsDeliveryOrders implements FromQuery, WithHeadings, WithHeadingRow,
|
|||||||
*/
|
*/
|
||||||
public function query()
|
public function query()
|
||||||
{
|
{
|
||||||
return Order::where('type', OrderType::LAST_MILE_DELIVERY);
|
$selectedIds = array_map(function($value){
|
||||||
|
return ['id' => $value];
|
||||||
|
}, json_decode($this->request->input('ids')));
|
||||||
|
|
||||||
|
return Order::where('type', OrderType::LAST_MILE_DELIVERY)->whereIn('id', $selectedIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -98,7 +102,7 @@ class ExportsDeliveryOrders implements FromQuery, WithHeadings, WithHeadingRow,
|
|||||||
'Sender',
|
'Sender',
|
||||||
$order->reference,
|
$order->reference,
|
||||||
$package->quantity,
|
$package->quantity,
|
||||||
$package->weight,
|
$package->weight * $package->quantity,
|
||||||
1,
|
1,
|
||||||
1,
|
1,
|
||||||
1,
|
1,
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Delivery;
|
||||||
|
|
||||||
|
use App\Classes\Modules\Delivery\ControllersLogic\CancelDeliveryOrderLogic;
|
||||||
|
use Illuminate\Http\JsonResponse;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
|
class CancelDeliveryOrderController
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @param Request $request
|
||||||
|
* @param CancelOrderLogic $logic
|
||||||
|
* @return JsonResponse
|
||||||
|
*/
|
||||||
|
public function cancel(Request $request, CancelDeliveryOrderLogic $logic): JsonResponse
|
||||||
|
{
|
||||||
|
return $logic->execute($request);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
<template>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col">
|
||||||
|
<loading-component style="height: 300px; top: 0;" key="1" color="success" v-show="isLoading" ></loading-component>
|
||||||
|
<div class="row justify-content-center" v-show="!isLoading">
|
||||||
|
<div class="col">
|
||||||
|
<div class="row m-b-20">
|
||||||
|
<div class="col">
|
||||||
|
<h3 class="all-caps">Are you Sure?</h3>
|
||||||
|
<div class="fs-11">Are you sure you want to cancel this order?</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col p-r-5">
|
||||||
|
<div class="btn btn-sm btn-success btn-block b-rad-none" data-dismiss="modal">Cancel</div>
|
||||||
|
</div>
|
||||||
|
<div class="col p-l-5">
|
||||||
|
<div class="btn btn-sm btn-danger btn-block b-rad-none" @click="submit(route('api.delivery.order.cancel', item.id), 'put', section, true, true)">Confirm</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import componentHandler from '../../../general/mixins/componentHandler';
|
||||||
|
import ModalFormHandler from '../../../general/mixins/modalFormHandler';
|
||||||
|
export default {
|
||||||
|
mixins: [componentHandler, ModalFormHandler],
|
||||||
|
methods: {
|
||||||
|
successHandler(){
|
||||||
|
this.closeModal();
|
||||||
|
this.$store.dispatch('reloadList', {'name': 'ListOrderTableSection'});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
</script>
|
||||||
@@ -263,7 +263,7 @@
|
|||||||
<h6 class="bold no-margin">Total Weight</h6>
|
<h6 class="bold no-margin">Total Weight</h6>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-auto">
|
<div class="col-auto">
|
||||||
<h6 class="bold no-margin">{{parameters.packing_list.weight}}KG</h6>
|
<h6 class="bold no-margin">{{(Math.round((parseFloat(parameters.packing_list.weight.toString().replace(",", "")) * parameters.packing_list.quantity + Number.EPSILON) * 10) / 10).toFixed(1)}}KG</h6>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row m-b-5">
|
<div class="row m-b-5">
|
||||||
|
|||||||
+37
-6
@@ -4,9 +4,9 @@
|
|||||||
<loading-component style="height: 200px; top: 0;" key="1" color="success" v-show="$store.getters.isLoading(section)"></loading-component>
|
<loading-component style="height: 200px; top: 0;" key="1" color="success" v-show="$store.getters.isLoading(section)"></loading-component>
|
||||||
<div class="row" v-show="!$store.getters.isLoading(section)">
|
<div class="row" v-show="!$store.getters.isLoading(section)">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<div class="row m-b-15" v-if="$store.getters.getCompanyModuleType === 8">
|
<div class="row m-b-15" v-if="$store.getters.isAdmin || $store.getters.getCompanyModuleType === 8">
|
||||||
<div class="col-auto p-r-5">
|
<div class="col-auto p-r-5">
|
||||||
<a :href="route('last_mile_delivery.order.export')" target="_blank">
|
<a :href="route('last_mile_delivery.order.export') + '?ids=' + JSON.stringify(selectedOrderId)" target="_blank">
|
||||||
<button type="button" class="btn btn-sm btn-block p-t-10 p-b-10 p-r-35 p-l-35 btn-complete b-rad-none">
|
<button type="button" class="btn btn-sm btn-block p-t-10 p-b-10 p-r-35 p-l-35 btn-complete b-rad-none">
|
||||||
<div class="row align-items-center">
|
<div class="row align-items-center">
|
||||||
<div class="col-auto p-r-0 p-l-0">
|
<div class="col-auto p-r-0 p-l-0">
|
||||||
@@ -27,7 +27,9 @@
|
|||||||
<table class="table" style="width: 2500px">
|
<table class="table" style="width: 2500px">
|
||||||
<thead class="thead-dark">
|
<thead class="thead-dark">
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="col"><input type="checkbox" /></th>
|
<th class="col-auto pointer align-items-center" @click="chooseAllOrder()">
|
||||||
|
<i class="fa fs-30 fa-fw" :class="{'fa-square-o': !selectAllOrder, 'fa-check-square': selectAllOrder}" ></i>
|
||||||
|
</th>
|
||||||
<th scope="col">Order Number</th>
|
<th scope="col">Order Number</th>
|
||||||
<th scope="col">Marking</th>
|
<th scope="col">Marking</th>
|
||||||
<th scope="col">Service Type</th>
|
<th scope="col">Service Type</th>
|
||||||
@@ -45,14 +47,23 @@
|
|||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr v-for="data in $store.getters.getListData(section)">
|
<tr v-for="data in $store.getters.getListData(section)">
|
||||||
<th scope="col"><input type="checkbox" /></th>
|
<td class="col-auto pointer align-items-center" @click="selectOrder(data.id)">
|
||||||
<td>{{data.reference}}<a :href="'https://www.tracking.my/lineclear/'+data.reference" target="_blank"><div class="btn btn-xs btn-success m-l-10">Track <i class="fa fa-angle-right m-l-5"></i></div></a></td>
|
<i class="fa fs-30 fa-fw" :class="{'fa-square-o': !selectedOrderId.includes(data.id), 'fa-check-square': selectedOrderId.includes(data.id), 'text-complete': selectedOrderId.includes(data.id)}" ></i>
|
||||||
|
</td>
|
||||||
|
<td class="parentContainer">
|
||||||
|
{{data.reference}}
|
||||||
|
<a :href="'https://www.tracking.my/lineclear/'+data.reference" target="_blank"><div class="btn btn-xs btn-success m-l-10">Track <i class="fa fa-angle-right m-l-5"></i></div></a>
|
||||||
|
<div class="btn btn-xs btn-danger m-l-10 requestModal" v-if="$store.getters.isAdmin || $store.getters.getCompanyModuleType === 8" data-type="cancelOrder">Cancel <i class="fa fa-times m-l-5"></i></div>
|
||||||
|
<modal-component class="animate__animated animate__fast animate__fadeIn" type="cancelOrder">
|
||||||
|
<cancel-delivery-order-form-component :data="data" :section="section" class="text-center"></cancel-delivery-order-form-component>
|
||||||
|
</modal-component>
|
||||||
|
</td>
|
||||||
<td>{{data.company_module.marking}}</td>
|
<td>{{data.company_module.marking}}</td>
|
||||||
<td>Walk In</td>
|
<td>Walk In</td>
|
||||||
<td>{{data.packingList.type === 0 ? 'Package' : data.packingList.type === 1 ? 'Pallet' : 'Documents'}}</td>
|
<td>{{data.packingList.type === 0 ? 'Package' : data.packingList.type === 1 ? 'Pallet' : 'Documents'}}</td>
|
||||||
<td>{{data.packingList.description}}</td>
|
<td>{{data.packingList.description}}</td>
|
||||||
<td>{{data.packingList.quantity}}</td>
|
<td>{{data.packingList.quantity}}</td>
|
||||||
<td>{{(Math.ceil(parseFloat((data.packingList.weight * 10))) / 10).toFixed(1)}}KG</td>
|
<td>{{(Math.round((parseFloat(data.packingList.weight.toString().replace(",", "")) * data.packingList.quantity + Number.EPSILON) * 10) / 10).toFixed(1)}}KG</td>
|
||||||
<td>{{data.sender_address.contact.reference}}</td>
|
<td>{{data.sender_address.contact.reference}}</td>
|
||||||
<td>{{data.sender_address.street_one+' '+(data.sender_address.street_two ? data.sender_address.street_two : '')+', '+ data.sender_address.district.name+', '+data.sender_address.post_code+' '+data.sender_address.state.name+', '+data.sender_address.country.name}}</td>
|
<td>{{data.sender_address.street_one+' '+(data.sender_address.street_two ? data.sender_address.street_two : '')+', '+ data.sender_address.district.name+', '+data.sender_address.post_code+' '+data.sender_address.state.name+', '+data.sender_address.country.name}}</td>
|
||||||
<td>{{data.sender_address.contact.phone}}</td>
|
<td>{{data.sender_address.contact.phone}}</td>
|
||||||
@@ -60,6 +71,9 @@
|
|||||||
<td>{{data.delivery_address.street_one+' '+(data.delivery_address.street_two ? data.delivery_address.street_two : '')+', '+ data.delivery_address.district.name+', '+data.delivery_address.post_code+' '+data.delivery_address.state.name+', '+data.delivery_address.country.name}}</td>
|
<td>{{data.delivery_address.street_one+' '+(data.delivery_address.street_two ? data.delivery_address.street_two : '')+', '+ data.delivery_address.district.name+', '+data.delivery_address.post_code+' '+data.delivery_address.state.name+', '+data.delivery_address.country.name}}</td>
|
||||||
<td>{{data.delivery_address.contact.phone}}</td>
|
<td>{{data.delivery_address.contact.phone}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr v-if="$store.getters.getListData(section).length === 0">
|
||||||
|
<td colspan="100%" class="text-center">No data available in table</td>
|
||||||
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
@@ -85,16 +99,20 @@
|
|||||||
data(){
|
data(){
|
||||||
return {
|
return {
|
||||||
section: 'ListOrderTableSection',
|
section: 'ListOrderTableSection',
|
||||||
|
selectAllOrder: false,
|
||||||
|
selectedOrderId: [],
|
||||||
emptyListSection: false,
|
emptyListSection: false,
|
||||||
filters: this.data ? {
|
filters: this.data ? {
|
||||||
company_module_id: this.data.company_module.id,
|
company_module_id: this.data.company_module.id,
|
||||||
per_page: 20,
|
per_page: 20,
|
||||||
|
status_in: [2],
|
||||||
order_by: {
|
order_by: {
|
||||||
column: 'id',
|
column: 'id',
|
||||||
DESC: true,
|
DESC: true,
|
||||||
},
|
},
|
||||||
} : {
|
} : {
|
||||||
per_page: 100,
|
per_page: 100,
|
||||||
|
status_in: [2],
|
||||||
order_by: {
|
order_by: {
|
||||||
column: 'id',
|
column: 'id',
|
||||||
DESC: true,
|
DESC: true,
|
||||||
@@ -133,6 +151,19 @@
|
|||||||
this.$store.dispatch('completeList', {'name': this.section, 'data': response.payload.data});
|
this.$store.dispatch('completeList', {'name': this.section, 'data': response.payload.data});
|
||||||
this.$refs.pagination.makePagination(response.payload.meta, response.payload.links);
|
this.$refs.pagination.makePagination(response.payload.meta, response.payload.links);
|
||||||
this.metaData = response.payload.meta;
|
this.metaData = response.payload.meta;
|
||||||
|
},
|
||||||
|
chooseAllOrder(){
|
||||||
|
this.selectAllOrder = !this.selectAllOrder;
|
||||||
|
this.selectedOrderId = [];
|
||||||
|
if (this.selectAllOrder) {
|
||||||
|
this.$store.getters.getListData(this.section).forEach((value, index) => {
|
||||||
|
this.selectedOrderId.push(value.id);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
selectOrder(orderId){
|
||||||
|
this.selectedOrderId.includes(orderId) ? this.selectedOrderId.splice(this.selectedOrderId.indexOf(orderId), 1) : this.selectedOrderId.push(orderId);
|
||||||
|
this.selectedOrderId.length === this.$store.getters.getListData(this.section).length ? this.selectAllOrder = true : this.selectAllOrder = false;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mixins: [componentHandler]
|
mixins: [componentHandler]
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
<div class="row d-none" :class="[{'d-flex': $store.getters.isAdmin}]" v-if="$store.getters.isAdmin">
|
<div class="row d-none" :class="[{'d-flex': $store.getters.isAdmin || $store.getters.getCompanyModuleType === 8}]" v-if="$store.getters.isAdmin || $store.getters.getCompanyModuleType === 8">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col">
|
|
||||||
<delivery-orders-table-section-component></delivery-orders-table-section-component>
|
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<div class="row p-b-5 b-b b-grey m-b-10 m-l-0 m-r-0">
|
<div class="row p-b-5 b-b b-grey m-b-10 m-l-0 m-r-0">
|
||||||
<div class="col no-padding">
|
<div class="col no-padding">
|
||||||
@@ -15,7 +13,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-6">
|
<div class="col-12 col-md-6" v-if="false">
|
||||||
<div class="row p-b-5 b-b b-grey m-b-10 m-l-0 m-r-0">
|
<div class="row p-b-5 b-b b-grey m-b-10 m-l-0 m-r-0">
|
||||||
<div class="col no-padding">
|
<div class="col no-padding">
|
||||||
<h6>Customers List</h6>
|
<h6>Customers List</h6>
|
||||||
|
|||||||
+6
-2
@@ -4,7 +4,11 @@ use Illuminate\Support\Facades\Route;
|
|||||||
|
|
||||||
Route::group(['prefix' => 'delivery', 'namespace' => 'Delivery', 'as' => 'delivery.'], function () {
|
Route::group(['prefix' => 'delivery', 'namespace' => 'Delivery', 'as' => 'delivery.'], function () {
|
||||||
Route::post('/signup', 'CreateDeliveryCustomerController@create')->name('account.registration.register');
|
Route::post('/signup', 'CreateDeliveryCustomerController@create')->name('account.registration.register');
|
||||||
Route::post('/order/create', 'CreateDeliveryOrderController@create')->name('order.create');
|
|
||||||
Route::get('/orders/list', 'ListOrdersController@list')->name('order.list');
|
Route::group(['prefix' => 'order', 'as' => 'order.'], function () {
|
||||||
|
Route::post('/create', 'CreateDeliveryOrderController@create')->name('create');
|
||||||
|
Route::get('/list', 'ListOrdersController@list')->name('list');
|
||||||
|
Route::put('/cancel/{id}', 'CancelDeliveryOrderController@cancel')->name('cancel');
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user