From 0e7469f1cd133cc723385b1682f3d87e8817e966 Mon Sep 17 00:00:00 2001 From: omair saleh Date: Tue, 29 Mar 2022 23:15:42 +0800 Subject: [PATCH 01/15] new registration ui flow --- resources/assets/images/cief-logo-white.png | Bin 0 -> 3376 bytes .../CompleteRegistrationFormComponent.vue | 218 ++++++++++++++++++ .../forms/RegistrationFormComponent.vue | 28 +-- .../CustomerProfileSectionComponent.vue | 6 +- .../sections/OnBoardingSectionComponent.vue | 105 ++++++++- .../orders/forms/OrderFormComponent.vue | 19 +- resources/assets/vue/general/mixins/guards.js | 2 +- .../views/pages/accounts/signup.blade.php | 67 ++++++ routes/web.php | 4 + 9 files changed, 421 insertions(+), 28 deletions(-) create mode 100644 resources/assets/images/cief-logo-white.png create mode 100644 resources/assets/vue/components/accounts/forms/CompleteRegistrationFormComponent.vue create mode 100644 resources/views/pages/accounts/signup.blade.php diff --git a/resources/assets/images/cief-logo-white.png b/resources/assets/images/cief-logo-white.png new file mode 100644 index 0000000000000000000000000000000000000000..12dd6440f4afff6f428de0405bb16ab7b82f5248 GIT binary patch literal 3376 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 G*nb1}T~9>- literal 0 HcmV?d00001 diff --git a/resources/assets/vue/components/accounts/forms/CompleteRegistrationFormComponent.vue b/resources/assets/vue/components/accounts/forms/CompleteRegistrationFormComponent.vue new file mode 100644 index 00000000..1ea8a1b2 --- /dev/null +++ b/resources/assets/vue/components/accounts/forms/CompleteRegistrationFormComponent.vue @@ -0,0 +1,218 @@ + + diff --git a/resources/assets/vue/components/accounts/forms/RegistrationFormComponent.vue b/resources/assets/vue/components/accounts/forms/RegistrationFormComponent.vue index 52535ad1..db6d8315 100644 --- a/resources/assets/vue/components/accounts/forms/RegistrationFormComponent.vue +++ b/resources/assets/vue/components/accounts/forms/RegistrationFormComponent.vue @@ -6,7 +6,7 @@
-
+
@@ -180,13 +180,8 @@
-
+
-
-
-

Personal Information

-
-
@@ -202,18 +197,12 @@
-
+
-
- - - - -
@@ -230,9 +219,10 @@
-
-
-
-
- +
+
diff --git a/resources/assets/vue/components/companies/sections/CustomerProfileSectionComponent.vue b/resources/assets/vue/components/companies/sections/CustomerProfileSectionComponent.vue index 749e7ef8..1a148c73 100644 --- a/resources/assets/vue/components/companies/sections/CustomerProfileSectionComponent.vue +++ b/resources/assets/vue/components/companies/sections/CustomerProfileSectionComponent.vue @@ -8,8 +8,8 @@
- -
+ +
@@ -67,7 +67,7 @@
- +
diff --git a/resources/assets/vue/components/companies/sections/OnBoardingSectionComponent.vue b/resources/assets/vue/components/companies/sections/OnBoardingSectionComponent.vue index c7b5b154..2e4a9cec 100644 --- a/resources/assets/vue/components/companies/sections/OnBoardingSectionComponent.vue +++ b/resources/assets/vue/components/companies/sections/OnBoardingSectionComponent.vue @@ -1,7 +1,7 @@ \ No newline at end of file diff --git a/resources/assets/vue/components/orders/forms/OrderFormComponent.vue b/resources/assets/vue/components/orders/forms/OrderFormComponent.vue index 9b0020c9..62feec75 100644 --- a/resources/assets/vue/components/orders/forms/OrderFormComponent.vue +++ b/resources/assets/vue/components/orders/forms/OrderFormComponent.vue @@ -133,9 +133,15 @@
-
+
-

We are generating the QR code that you need to send to your supplier to print to stick to your packages, this QR code is required for us to identify your packages when they arrives at our warehouse!

+

We are generating your first QR code

+

Please wait...

+
+
+
+
+

We are generating the QR code for you to send to your supplier to print and stick to your packages, this QR code is required for us to identify your packages when they arrives at our warehouse!

Please wait...

@@ -176,7 +182,7 @@ methods:{ createOrder(){ this.step++; - this.submit((this.route('api.order.create')), 'post', 'orderListSection', true, false) + this.submit((this.route('api.order.create')), 'post', 'orderListSection', false, false) }, cancelOrder(){ this.parameters.warehouse_id = ''; @@ -184,13 +190,18 @@ this.$store.dispatch('toggleSection', {name: this.section, status: false}) }, successHandler(response){ - let vm = this; + if(!this.company.last_order) { + window.location.reload(); + return; + } + setTimeout(function(){ window.location.href = this.route('order.show', response.payload.data.reference) }, 5000); }, errorHandler(response){ + alert(response.message) this.error = response.message; this.step--; } diff --git a/resources/assets/vue/general/mixins/guards.js b/resources/assets/vue/general/mixins/guards.js index ffa96e7d..cd61d755 100644 --- a/resources/assets/vue/general/mixins/guards.js +++ b/resources/assets/vue/general/mixins/guards.js @@ -5,7 +5,7 @@ export default { (this.$store.getters.isAuthenticated && !this.isProtectedRoute()&& this.isWithTokenRoute()) ? window.location.href = this.route('dashboard') : ''; }, isProtectedRoute(){ - const unprotectedRoutes = [this.route('login'), this.route('account.email.verification'), this.route('company.claim')]; + const unprotectedRoutes = [this.route('login'), this.route('account.email.verification'), this.route('company.claim'), this.route('signup')]; if(window.location.href.indexOf(this.route('company.claim')) === 0) { return false; } diff --git a/resources/views/pages/accounts/signup.blade.php b/resources/views/pages/accounts/signup.blade.php new file mode 100644 index 00000000..226cd994 --- /dev/null +++ b/resources/views/pages/accounts/signup.blade.php @@ -0,0 +1,67 @@ +@extends('layouts.base') +@section('content') +
+
+
+
+
+
+
+ +
+
+
+
+

Spend less time managing your logistics and more time optimizing your operations.

+
+
+
+
+

You know how to run your operations, let us help you streamline your logistic supply chain management.

+
+
+
+
+

Sign-up today and get access to:

+
An intuitive and easy to use order process
+
Service customization to keep you in control
+
Follow-up action to keep you on track
+
Personalized customer support
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@endsection \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 31c961b1..b99ae38f 100644 --- a/routes/web.php +++ b/routes/web.php @@ -31,6 +31,10 @@ Route::get('', function () { return view('pages.accounts.login'); })->name('login'); +Route::get('/signup', function () { + return view('pages.accounts.signup'); +})->name('signup'); + Route::group(['prefix' => 'swagger'], function () { Route::get('/', function () { return view('swagger.index'); From d96a35a49f4c4a2513a5f8f921c79789f6eb8cf5 Mon Sep 17 00:00:00 2001 From: edmondlang Date: Wed, 30 Mar 2022 20:01:45 +0800 Subject: [PATCH 02/15] revert RegistrationFormComponent --- .../forms/RegistrationFormComponent.vue | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/resources/assets/vue/components/accounts/forms/RegistrationFormComponent.vue b/resources/assets/vue/components/accounts/forms/RegistrationFormComponent.vue index db6d8315..ed7656a4 100644 --- a/resources/assets/vue/components/accounts/forms/RegistrationFormComponent.vue +++ b/resources/assets/vue/components/accounts/forms/RegistrationFormComponent.vue @@ -6,7 +6,7 @@
-
+
@@ -180,8 +180,13 @@
-
+
+
+
+

Personal Information

+
+
@@ -197,12 +202,18 @@
-
+
+
+ + + + +
@@ -219,10 +230,9 @@
-
-
-

Sign in instead

-
-
- +
+
@@ -294,4 +304,4 @@ }, mixins: [registrationFormValidation] } - + \ No newline at end of file From 745655dbfa46187d2f1498078b0d11e837f7b8f3 Mon Sep 17 00:00:00 2001 From: edmondlang Date: Sat, 2 Apr 2022 15:21:14 +0800 Subject: [PATCH 03/15] last mile intergration --- .../ControllersLogic/CreateCustomerLogic.php | 4 +- .../Services/AuthenticationRedirect.php | 4 + .../CompanyConnectionObject.php | 15 +- .../Services/CreatesCompanyConnection.php | 4 +- .../CreateDeliveryCustomerLogic.php | 149 +++++++++++ .../ValueObjects/Constants/BusinessType.php | 3 + .../CreateDeliveryCustomerController.php | 20 ++ .../forms/NewRegistrationFormComponent.vue | 102 ++++++++ .../CreateDeliveryOrderFormComponent.vue | 238 ++++++++++++++++++ .../newRegistrationFormValidation.js | 27 ++ .../views/pages/accounts/signup.blade.php | 52 +++- .../views/pages/delivery/admin.blade.php | 43 ++++ .../views/pages/delivery/customers.blade.php | 16 ++ .../views/pages/delivery/dashboard.blade.php | 5 + routes/api.php | 2 + routes/delivery.php | 7 + routes/web.php | 6 +- 17 files changed, 689 insertions(+), 8 deletions(-) create mode 100644 app/Classes/Modules/Delivery/ControllersLogic/CreateDeliveryCustomerLogic.php create mode 100644 app/Http/Controllers/Delivery/CreateDeliveryCustomerController.php create mode 100644 resources/assets/vue/components/accounts/forms/NewRegistrationFormComponent.vue create mode 100644 resources/assets/vue/components/containers/forms/CreateDeliveryOrderFormComponent.vue create mode 100644 resources/assets/vue/general/mixins/accounts/validation/newRegistrationFormValidation.js create mode 100644 resources/views/pages/delivery/admin.blade.php create mode 100644 resources/views/pages/delivery/customers.blade.php create mode 100644 resources/views/pages/delivery/dashboard.blade.php create mode 100644 routes/delivery.php diff --git a/app/Classes/Modules/Accounts/ControllersLogic/CreateCustomerLogic.php b/app/Classes/Modules/Accounts/ControllersLogic/CreateCustomerLogic.php index 9cb48b0f..7762dffa 100644 --- a/app/Classes/Modules/Accounts/ControllersLogic/CreateCustomerLogic.php +++ b/app/Classes/Modules/Accounts/ControllersLogic/CreateCustomerLogic.php @@ -126,7 +126,9 @@ class CreateCustomerLogic extends AbstractControllerLogic /** @var CompanyModule $companyModule */ $companyModule = $this->createCompanyModuleProcessor->execute($company, BusinessType::IMPORTER); - $connectionObject = new CompanyConnectionObject($companyModule, 'CIEF', mt_rand(1000, 9999).(new GeneratesInitials())->name($company->name)->length(3)->generate()); + $inviter = $this->fetchesCompanyModule->execute(['reference'=>'CIEF']); + + $connectionObject = new CompanyConnectionObject($companyModule, $inviter, 'CIEF', mt_rand(1000, 9999).(new GeneratesInitials())->name($company->name)->length(3)->generate()); $connection = $this->createsCompanyConnection->execute($connectionObject); diff --git a/app/Classes/Modules/Accounts/Services/AuthenticationRedirect.php b/app/Classes/Modules/Accounts/Services/AuthenticationRedirect.php index b359108d..1d08a191 100644 --- a/app/Classes/Modules/Accounts/Services/AuthenticationRedirect.php +++ b/app/Classes/Modules/Accounts/Services/AuthenticationRedirect.php @@ -2,6 +2,7 @@ namespace App\Classes\Modules\Accounts\Services; +use App\Classes\ValueObjects\Constants\BusinessType; use App\Classes\ValueObjects\Constants\RoleTypes; use App\Models\User; @@ -11,6 +12,9 @@ class AuthenticationRedirect public function url(User $user){ if($user->type === RoleTypes::USER){ + if ($user->companyModule()->first()->type === BusinessType::ONLINE_SELLER) { + return route('delivery.dashboard'); + } return route('dashboard'); } diff --git a/app/Classes/Modules/Companies/DataTransferObjects/CompanyConnectionObject.php b/app/Classes/Modules/Companies/DataTransferObjects/CompanyConnectionObject.php index 300d76c5..d74a64c8 100644 --- a/app/Classes/Modules/Companies/DataTransferObjects/CompanyConnectionObject.php +++ b/app/Classes/Modules/Companies/DataTransferObjects/CompanyConnectionObject.php @@ -10,6 +10,9 @@ class CompanyConnectionObject implements DataTransferObject /** @var CompanyModule */ private $invitee; + + /** @var CompanyModule */ + private $inviter; /** @var string */ private $inviterReference; @@ -20,12 +23,14 @@ class CompanyConnectionObject implements DataTransferObject /** * CompanyConnectionObject constructor. * @param CompanyModule $invitee + * @param CompanyModule $inviter * @param string $inviterReference * @param string $inviteeReference */ - public function __construct(CompanyModule $invitee, string $inviterReference, string $inviteeReference) + public function __construct(CompanyModule $invitee, CompanyModule $inviter, string $inviteeReference, string $inviterReference) { $this->invitee = $invitee; + $this->inviter = $inviter; $this->inviterReference = $inviterReference; $this->inviteeReference = $inviteeReference; } @@ -38,6 +43,14 @@ class CompanyConnectionObject implements DataTransferObject return $this->invitee; } + /** + * @return CompanyModule + */ + public function getInviter(): CompanyModule + { + return $this->inviter; + } + /** * @return string */ diff --git a/app/Classes/Modules/Companies/Services/CreatesCompanyConnection.php b/app/Classes/Modules/Companies/Services/CreatesCompanyConnection.php index d5d11ecc..6095da18 100644 --- a/app/Classes/Modules/Companies/Services/CreatesCompanyConnection.php +++ b/app/Classes/Modules/Companies/Services/CreatesCompanyConnection.php @@ -30,10 +30,8 @@ class CreatesCompanyConnection extends AbstractUpdateRecord public function execute(CompanyConnectionObject $object) { - $companyModule = $this->fetchesCompany->execute(['id', 1])->companyModules()->first(); - $connection = new CompanyConnection(); - $connection->inviter_id = $companyModule->id; + $connection->inviter_id = $object->getInviter()->id; $connection->invitee_id = $object->getInvitee()->id; $connection->inviter_reference = $object->getInviterReference(); $connection->invitee_reference = $object->getInviteeReference(); diff --git a/app/Classes/Modules/Delivery/ControllersLogic/CreateDeliveryCustomerLogic.php b/app/Classes/Modules/Delivery/ControllersLogic/CreateDeliveryCustomerLogic.php new file mode 100644 index 00000000..c7368439 --- /dev/null +++ b/app/Classes/Modules/Delivery/ControllersLogic/CreateDeliveryCustomerLogic.php @@ -0,0 +1,149 @@ + 'Created User', + 'message' => 'You have successfully created a new User' + ]; + } + + /** @var CreateUserProcessor */ + private $createUserProcessor; + + /** @var CreateCompanyProcessor */ + private $createCompanyProcessor; + + /** @var CreateCompanyModuleProcessor */ + private $createCompanyModuleProcessor; + + /** @var CreateContactProcessor */ + private $createContactProcessor; + + /** @var CreatesCompanyConnection */ + private $createsCompanyConnection; + + /** @var ApprovesCompanyConnection */ + private $approvesCompanyConnection; + + /** @var AssignEmployeeProcessor */ + private $assignEmployeeProcessor; + + /** @var UploadIdentityDocumentProcessor */ + private $uploadIdentityDocumentProcessor; + + /** @var AuthenticationProcessor */ + private $authenticationProcessor; + + /** @var GenerateEmailVerificationAttemptProcessor */ + private $generateEmailVerificationAttemptProcessor; + + /** @var FetchesCompanyModule */ + private $fetchesCompanyModule; + + /** + * CreateDeliveryCustomerLogic constructor. + * @param CreateUserProcessor $createUserProcessor + * @param CreateCompanyProcessor $createCompanyProcessor + * @param CreateCompanyModuleProcessor $createCompanyModuleProcessor + * @param CreateContactProcessor $createContactProcessor + * @param CreatesCompanyConnection $createsCompanyConnection + * @param ApprovesCompanyConnection $approvesCompanyConnection + * @param AssignEmployeeProcessor $assignEmployeeProcessor + * @param UploadIdentityDocumentProcessor $uploadIdentityDocumentProcessor + * @param AuthenticationProcessor $authenticationProcessor + * @param GenerateEmailVerificationAttemptProcessor $generateEmailVerificationAttemptProcessor + * @param FetchesCompanyModule $fetchesCompanyModule + */ + public function __construct(CreateUserProcessor $createUserProcessor, CreateCompanyProcessor $createCompanyProcessor, CreateCompanyModuleProcessor $createCompanyModuleProcessor, CreateContactProcessor $createContactProcessor, CreatesCompanyConnection $createsCompanyConnection, ApprovesCompanyConnection $approvesCompanyConnection, AssignEmployeeProcessor $assignEmployeeProcessor, UploadIdentityDocumentProcessor $uploadIdentityDocumentProcessor, AuthenticationProcessor $authenticationProcessor, GenerateEmailVerificationAttemptProcessor $generateEmailVerificationAttemptProcessor, FetchesCompanyModule $fetchesCompanyModule) + { + $this->createUserProcessor = $createUserProcessor; + $this->createCompanyProcessor = $createCompanyProcessor; + $this->createCompanyModuleProcessor = $createCompanyModuleProcessor; + $this->createContactProcessor = $createContactProcessor; + $this->createsCompanyConnection = $createsCompanyConnection; + $this->approvesCompanyConnection = $approvesCompanyConnection; + $this->assignEmployeeProcessor = $assignEmployeeProcessor; + $this->uploadIdentityDocumentProcessor = $uploadIdentityDocumentProcessor; + $this->authenticationProcessor = $authenticationProcessor; + $this->generateEmailVerificationAttemptProcessor = $generateEmailVerificationAttemptProcessor; + $this->fetchesCompanyModule = $fetchesCompanyModule; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws \App\Classes\Exceptions\AccessForbiddenException + * @throws \App\Classes\Exceptions\AccessUnauthorisedException + * @throws \App\Classes\Exceptions\MalformedRequestException + * @throws \App\Classes\Exceptions\RequestValidationException + */ + public function logic(Request $request): JsonResponse + { + /** @var User $user */ + $user = $this->createUserProcessor->execute($request, RoleTypes::USER, !App::environment(['production']) ? ApprovalStatus::APPROVED : ApprovalStatus::PENDING_VERIFICATION); + + /** @var Company $company */ + $company = $this->createCompanyProcessor->execute($request->input('name'), CompanyType::PERSONAL_BUSINESS, ApprovalStatus::PENDING_SUBMISSION); + + $contactObject = new ContactObject($request->input('name'), $request->input('phone'), $request->input('contact_email'), $request->input('wechat_id')); + + $this->createContactProcessor->execute($contactObject, $company); + + /** @var CompanyModule $companyModule */ + $companyModule = $this->createCompanyModuleProcessor->execute($company, BusinessType::ONLINE_SELLER); + + $inviter = $this->fetchesCompanyModule->execute(['reference'=>'EXP']); + + $connectionObject = new CompanyConnectionObject($companyModule, $inviter, 'EXP', mt_rand(1000, 9999).(new GeneratesInitials())->name($company->name)->length(3)->generate()); + + $connection = $this->createsCompanyConnection->execute($connectionObject); + + $this->approvesCompanyConnection->execute($connection); + + $Object = new EmploymentObject($companyModule, $user); + + $this->assignEmployeeProcessor->execute($Object); + + return $this->response($this->authenticationProcessor->execute($request)); + } +} diff --git a/app/Classes/ValueObjects/Constants/BusinessType.php b/app/Classes/ValueObjects/Constants/BusinessType.php index 41c673c6..ec38450f 100644 --- a/app/Classes/ValueObjects/Constants/BusinessType.php +++ b/app/Classes/ValueObjects/Constants/BusinessType.php @@ -18,4 +18,7 @@ final class BusinessType { public const CURRENCY_VENDOR = 6; + public const ONLINE_SELLER = 7; + + public const LAST_MILE_DELIVERY_AGENT = 8; } diff --git a/app/Http/Controllers/Delivery/CreateDeliveryCustomerController.php b/app/Http/Controllers/Delivery/CreateDeliveryCustomerController.php new file mode 100644 index 00000000..6321d758 --- /dev/null +++ b/app/Http/Controllers/Delivery/CreateDeliveryCustomerController.php @@ -0,0 +1,20 @@ +execute($request); + } +} \ No newline at end of file diff --git a/resources/assets/vue/components/accounts/forms/NewRegistrationFormComponent.vue b/resources/assets/vue/components/accounts/forms/NewRegistrationFormComponent.vue new file mode 100644 index 00000000..abca50db --- /dev/null +++ b/resources/assets/vue/components/accounts/forms/NewRegistrationFormComponent.vue @@ -0,0 +1,102 @@ + + diff --git a/resources/assets/vue/components/containers/forms/CreateDeliveryOrderFormComponent.vue b/resources/assets/vue/components/containers/forms/CreateDeliveryOrderFormComponent.vue new file mode 100644 index 00000000..068f7404 --- /dev/null +++ b/resources/assets/vue/components/containers/forms/CreateDeliveryOrderFormComponent.vue @@ -0,0 +1,238 @@ + + \ No newline at end of file diff --git a/resources/assets/vue/general/mixins/accounts/validation/newRegistrationFormValidation.js b/resources/assets/vue/general/mixins/accounts/validation/newRegistrationFormValidation.js new file mode 100644 index 00000000..b311215a --- /dev/null +++ b/resources/assets/vue/general/mixins/accounts/validation/newRegistrationFormValidation.js @@ -0,0 +1,27 @@ +import { required, email, numeric, sameAs, requiredUnless, requiredIf } from "vuelidate/lib/validators"; +import authenticationHandler from '../authenticationHandler' +export default { + validations: { + parameters: { + name: { + required + }, + email: { + required, + email + }, + phone: { + required, + numeric + }, + password: { + required + }, + password_confirmation: { + required, + sameAs: sameAs('password') + }, + } + }, + mixins: [authenticationHandler] +} \ No newline at end of file diff --git a/resources/views/pages/accounts/signup.blade.php b/resources/views/pages/accounts/signup.blade.php index 226cd994..a8f49cf8 100644 --- a/resources/views/pages/accounts/signup.blade.php +++ b/resources/views/pages/accounts/signup.blade.php @@ -42,12 +42,60 @@
-
+
+
+
+
+ +
+
+
+
+
+
Sign In
+

To keep using the service please sign in with your personal info

+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
Forget Password
+

Enter your registered email below to receive the password reset instruction

+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
- +
diff --git a/resources/views/pages/delivery/admin.blade.php b/resources/views/pages/delivery/admin.blade.php new file mode 100644 index 00000000..b435a520 --- /dev/null +++ b/resources/views/pages/delivery/admin.blade.php @@ -0,0 +1,43 @@ +
+
+
+
+
+
+
Orders List
+
+
+
+
+ + + + + + +
+
+
+
+
+
+
Customers List
+
+
+
+
+ + + +
+
+
+
+
+
\ No newline at end of file diff --git a/resources/views/pages/delivery/customers.blade.php b/resources/views/pages/delivery/customers.blade.php new file mode 100644 index 00000000..1cf41bb6 --- /dev/null +++ b/resources/views/pages/delivery/customers.blade.php @@ -0,0 +1,16 @@ +
+
+
+
+
+
+
Create Order
+
+
+ +
+
+ +

orders list

+
+
\ No newline at end of file diff --git a/resources/views/pages/delivery/dashboard.blade.php b/resources/views/pages/delivery/dashboard.blade.php new file mode 100644 index 00000000..c4a2362c --- /dev/null +++ b/resources/views/pages/delivery/dashboard.blade.php @@ -0,0 +1,5 @@ +@extends('layouts.base_portal') +@section('inner_content') + @include('pages.delivery.customers') + @include('pages.delivery.admin') +@endsection \ No newline at end of file diff --git a/routes/api.php b/routes/api.php index a9383a2b..04094f78 100644 --- a/routes/api.php +++ b/routes/api.php @@ -22,6 +22,8 @@ Route::group(['middleware' => 'api', 'prefix' => 'v1', 'as' => 'api.'], function require __DIR__ . '/account.php'; + require __DIR__ . '/delivery.php'; + Route::group(['middleware' => 'valid.token'], function () { Route::get('/storage/{fileName}/fetch', 'Documents\RenderDocumentController@fileStorageServe')->where(['fileName' => '.*'])->name('storage.document.file'); diff --git a/routes/delivery.php b/routes/delivery.php new file mode 100644 index 00000000..7370f146 --- /dev/null +++ b/routes/delivery.php @@ -0,0 +1,7 @@ + 'delivery', 'namespace' => 'Delivery', 'as' => 'delivery.'], function () { + Route::post('/delivery/registration', 'CreateDeliveryCustomerController@create')->name('account.registration.register'); +}); diff --git a/routes/web.php b/routes/web.php index b99ae38f..8a727a21 100644 --- a/routes/web.php +++ b/routes/web.php @@ -31,10 +31,14 @@ Route::get('', function () { return view('pages.accounts.login'); })->name('login'); -Route::get('/signup', function () { +Route::get('/delivery', function () { return view('pages.accounts.signup'); })->name('signup'); +Route::get('/delivery/dashboard', function () { + return view('pages.delivery.dashboard'); +})->name('delivery.dashboard'); + Route::group(['prefix' => 'swagger'], function () { Route::get('/', function () { return view('swagger.index'); From c69c04357692a7002d947571bcb92379afd244fd Mon Sep 17 00:00:00 2001 From: omair saleh Date: Sun, 3 Apr 2022 19:10:06 +0800 Subject: [PATCH 04/15] fix the user ui, create delivery order, delivery customer dashboard --- .../General/Eloquent/Filters/TypeIn.php | 20 + .../ControllersLogic/CreateCustomerLogic.php | 10 +- .../Services/AuthenticationRedirect.php | 6 +- .../Services/GeneratesAuthenticationToken.php | 4 +- .../ControllersLogic/CreateAddressLogic.php | 3 +- .../ControllersLogic/UpdateAddressLogic.php | 4 +- .../DataTransferObjects/AddressObject.php | 27 +- .../Addresses/Services/CleansOldAddress.php | 4 +- .../Addresses/Services/CreatesAddress.php | 1 + .../CreateDeliveryCustomerLogic.php | 4 +- .../CreateDeliveryOrderLogic.php | 178 +++++++++ .../ControllersLogic/ListOrdersLogic.php | 57 +++ .../Services/ExportsDeliveryOrders.php | 109 ++++++ .../ControllersLogic/ListOrdersLogic.php | 3 +- .../Processors/CreateOrderProcessor.php | 2 +- .../RequestChangeOrderAddressProcessor.php | 3 +- .../ValueObjects/Constants/AddressType.php | 2 + .../ValueObjects/Constants/OrderType.php | 2 + .../ValueObjects/Constants/PackageType.php | 2 + .../CreateDeliveryOrderController.php | 20 + .../ExportDeliveryOrdersToExcelController.php | 33 ++ .../Delivery/ListOrdersController.php | 22 ++ app/Http/Resources/CompanyResource.php | 6 +- app/Http/Resources/DeliveryOrderResource.php | 33 ++ .../Resources/DeliveryPackingListResource.php | 36 ++ app/Models/Addon.php | 36 ++ app/Models/Order.php | 8 + app/Models/PackingList.php | 8 + .../2022_03_14_133555_create_addons_table.php | 37 ++ database/seeders/CompaniesTableSeeder.php | 15 +- .../seeders/LastMileDeliveryTableSeeder.php | 123 ++++++ .../seeders/ModernWarehouseTableSeeder.php | 3 +- resources/assets/images/lineclear.png | Bin 0 -> 8339 bytes resources/assets/vue/app.js | 4 + .../accounts/elements/LogoutComponent.vue | 4 +- .../accounts/forms/LoginFormComponent.vue | 5 +- .../forms/NewRegistrationFormComponent.vue | 3 +- .../elements/SelectAddressComponent.vue | 8 +- .../addresses/forms/AddressFormComponent.vue | 8 +- .../AddressProfileSectionComponent.vue | 19 + ...eliveryCustomerProfileSectionComponent.vue | 111 ++++++ .../CreateDeliveryOrderFormComponent.vue | 238 ------------ ...CreateDeliveryPackinglistFormComponent.vue | 244 ------------ .../forms/ValidationWrapperComponent.vue | 4 +- .../forms/DeliveryOrderFormComponent.vue | 366 ++++++++++++++++++ .../DeliveryOrdersTableSectionComponent.vue | 176 +++++++++ .../ProfitModelReportSectionComponent.vue | 2 +- .../forms/SegmentServiceFormComponent.vue | 4 +- .../settings/forms/ServiceFormComponent.vue | 2 +- .../validation/addressFormValidation.js | 4 +- .../assets/vue/general/mixins/formHandler.js | 1 + resources/assets/vue/general/mixins/guards.js | 2 +- .../assets/vue/vuex/modules/authentication.js | 1 + resources/views/layouts/base_portal.blade.php | 2 +- .../views/pages/accounts/signup.blade.php | 4 +- .../views/pages/delivery/customers.blade.php | 13 +- resources/views/partials/header.blade.php | 4 +- resources/views/partials/menu.blade.php | 8 +- routes/delivery.php | 5 +- routes/web.php | 21 +- 60 files changed, 1528 insertions(+), 556 deletions(-) create mode 100644 app/Classes/General/Eloquent/Filters/TypeIn.php create mode 100644 app/Classes/Modules/Delivery/ControllersLogic/CreateDeliveryOrderLogic.php create mode 100644 app/Classes/Modules/Delivery/ControllersLogic/ListOrdersLogic.php create mode 100644 app/Classes/Modules/Exports/Services/ExportsDeliveryOrders.php create mode 100644 app/Http/Controllers/Delivery/CreateDeliveryOrderController.php create mode 100644 app/Http/Controllers/Delivery/ExportDeliveryOrdersToExcelController.php create mode 100644 app/Http/Controllers/Delivery/ListOrdersController.php create mode 100644 app/Http/Resources/DeliveryOrderResource.php create mode 100644 app/Http/Resources/DeliveryPackingListResource.php create mode 100644 app/Models/Addon.php create mode 100644 database/migrations/2022_03_14_133555_create_addons_table.php create mode 100644 database/seeders/LastMileDeliveryTableSeeder.php create mode 100644 resources/assets/images/lineclear.png create mode 100644 resources/assets/vue/components/addresses/sections/AddressProfileSectionComponent.vue create mode 100644 resources/assets/vue/components/companies/sections/DeliveryCustomerProfileSectionComponent.vue delete mode 100644 resources/assets/vue/components/containers/forms/CreateDeliveryOrderFormComponent.vue delete mode 100644 resources/assets/vue/components/containers/forms/CreateDeliveryPackinglistFormComponent.vue create mode 100644 resources/assets/vue/components/orders/forms/DeliveryOrderFormComponent.vue create mode 100644 resources/assets/vue/components/orders/sections/DeliveryOrdersTableSectionComponent.vue diff --git a/app/Classes/General/Eloquent/Filters/TypeIn.php b/app/Classes/General/Eloquent/Filters/TypeIn.php new file mode 100644 index 00000000..3a064f7a --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/TypeIn.php @@ -0,0 +1,20 @@ +whereIn('type', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/Accounts/ControllersLogic/CreateCustomerLogic.php b/app/Classes/Modules/Accounts/ControllersLogic/CreateCustomerLogic.php index 7762dffa..327a3666 100644 --- a/app/Classes/Modules/Accounts/ControllersLogic/CreateCustomerLogic.php +++ b/app/Classes/Modules/Accounts/ControllersLogic/CreateCustomerLogic.php @@ -15,6 +15,7 @@ use App\Classes\Modules\Companies\Processors\CreateCompanyModuleProcessor; use App\Classes\Modules\Companies\DataTransferObjects\EmploymentObject; use App\Classes\Modules\Companies\Services\ApprovesCompanyConnection; use App\Classes\Modules\Companies\Services\CreatesCompanyConnection; +use App\Classes\Modules\Companies\Services\FetchesCompanyModule; use App\Classes\Modules\Contacts\DataTransferObjects\ContactObject; use App\Classes\Modules\Contacts\Processors\CreateContactProcessor; use App\Classes\Modules\Documents\Processors\UploadIdentityDocumentProcessor; @@ -76,6 +77,9 @@ class CreateCustomerLogic extends AbstractControllerLogic /** @var GenerateEmailVerificationAttemptProcessor */ private $generateEmailVerificationAttemptProcessor; + /** @var FetchesCompanyModule */ + private $fetchesCompanyModule; + /** * CreateCustomerLogic constructor. * @param CreateUserProcessor $createUserProcessor @@ -88,8 +92,9 @@ class CreateCustomerLogic extends AbstractControllerLogic * @param UploadIdentityDocumentProcessor $uploadIdentityDocumentProcessor * @param AuthenticationProcessor $authenticationProcessor * @param GenerateEmailVerificationAttemptProcessor $generateEmailVerificationAttemptProcessor + * @param FetchesCompanyModule $fetchesCompanyModule */ - public function __construct(CreateUserProcessor $createUserProcessor, CreateCompanyProcessor $createCompanyProcessor, CreateCompanyModuleProcessor $createCompanyModuleProcessor, CreateContactProcessor $createContactProcessor, CreatesCompanyConnection $createsCompanyConnection, ApprovesCompanyConnection $approvesCompanyConnection, AssignEmployeeProcessor $assignEmployeeProcessor, UploadIdentityDocumentProcessor $uploadIdentityDocumentProcessor, AuthenticationProcessor $authenticationProcessor, GenerateEmailVerificationAttemptProcessor $generateEmailVerificationAttemptProcessor) + public function __construct(CreateUserProcessor $createUserProcessor, CreateCompanyProcessor $createCompanyProcessor, CreateCompanyModuleProcessor $createCompanyModuleProcessor, CreateContactProcessor $createContactProcessor, CreatesCompanyConnection $createsCompanyConnection, ApprovesCompanyConnection $approvesCompanyConnection, AssignEmployeeProcessor $assignEmployeeProcessor, UploadIdentityDocumentProcessor $uploadIdentityDocumentProcessor, AuthenticationProcessor $authenticationProcessor, GenerateEmailVerificationAttemptProcessor $generateEmailVerificationAttemptProcessor, FetchesCompanyModule $fetchesCompanyModule) { $this->createUserProcessor = $createUserProcessor; $this->createCompanyProcessor = $createCompanyProcessor; @@ -101,6 +106,7 @@ class CreateCustomerLogic extends AbstractControllerLogic $this->uploadIdentityDocumentProcessor = $uploadIdentityDocumentProcessor; $this->authenticationProcessor = $authenticationProcessor; $this->generateEmailVerificationAttemptProcessor = $generateEmailVerificationAttemptProcessor; + $this->fetchesCompanyModule = $fetchesCompanyModule; } /** @@ -128,7 +134,7 @@ class CreateCustomerLogic extends AbstractControllerLogic $inviter = $this->fetchesCompanyModule->execute(['reference'=>'CIEF']); - $connectionObject = new CompanyConnectionObject($companyModule, $inviter, 'CIEF', mt_rand(1000, 9999).(new GeneratesInitials())->name($company->name)->length(3)->generate()); + $connectionObject = new CompanyConnectionObject($companyModule, $inviter, mt_rand(1000, 9999).(new GeneratesInitials())->name($company->name)->length(3)->generate(), 'CIEF'); $connection = $this->createsCompanyConnection->execute($connectionObject); diff --git a/app/Classes/Modules/Accounts/Services/AuthenticationRedirect.php b/app/Classes/Modules/Accounts/Services/AuthenticationRedirect.php index 1d08a191..4222aaf8 100644 --- a/app/Classes/Modules/Accounts/Services/AuthenticationRedirect.php +++ b/app/Classes/Modules/Accounts/Services/AuthenticationRedirect.php @@ -12,9 +12,11 @@ class AuthenticationRedirect public function url(User $user){ if($user->type === RoleTypes::USER){ - if ($user->companyModule()->first()->type === BusinessType::ONLINE_SELLER) { - return route('delivery.dashboard'); + + if (in_array($user->companyModule()->first()->type, [BusinessType::ONLINE_SELLER, BusinessType::LAST_MILE_DELIVERY_AGENT])) { + return route('last_mile_delivery.dashboard'); } + return route('dashboard'); } diff --git a/app/Classes/Modules/Accounts/Services/GeneratesAuthenticationToken.php b/app/Classes/Modules/Accounts/Services/GeneratesAuthenticationToken.php index b327e175..88645795 100644 --- a/app/Classes/Modules/Accounts/Services/GeneratesAuthenticationToken.php +++ b/app/Classes/Modules/Accounts/Services/GeneratesAuthenticationToken.php @@ -68,7 +68,9 @@ class GeneratesAuthenticationToken { $companyModule = $user->companyModule()->first(); $claims = array_merge($claims, [ - 'company_id' => $companyModule->company_id + 'company_id' => $companyModule->company_id, + 'company_module_id' => $companyModule->id, + 'company_module_type' => $companyModule->type ]); } diff --git a/app/Classes/Modules/Addresses/ControllersLogic/CreateAddressLogic.php b/app/Classes/Modules/Addresses/ControllersLogic/CreateAddressLogic.php index 91f5c42e..f019bab3 100644 --- a/app/Classes/Modules/Addresses/ControllersLogic/CreateAddressLogic.php +++ b/app/Classes/Modules/Addresses/ControllersLogic/CreateAddressLogic.php @@ -14,6 +14,7 @@ use App\Classes\Modules\Contacts\DataTransferObjects\ContactObject; use App\Classes\Modules\Contacts\Processors\CreateContactProcessor; use App\Classes\Modules\Remarks\DataTransferObjects\RemarkObject; use App\Classes\Modules\Remarks\Processors\CreateRemarkProcessor; +use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Http\Resources\AddressResource; use App\Models\Address; use ErrorException; @@ -82,7 +83,7 @@ class CreateAddressLogic extends AbstractControllerLogic $district = $this->fetchesDistrict->execute(['id' => $request->input('district_id')]); - $object = new AddressObject($request->input('street_one'), $request->input('street_two'), $district->country_id, $district->state_id, $district->id, $request->input('post_code'), $request->input('reference')); + $object = new AddressObject($request->input('street_one'), $request->input('street_two'), $district->country_id, $district->state_id, $district->id, $request->input('post_code'), $request->input('type'), ApprovalStatus::APPROVED, $request->input('reference')); $this->canCreateAddress->passes($object); diff --git a/app/Classes/Modules/Addresses/ControllersLogic/UpdateAddressLogic.php b/app/Classes/Modules/Addresses/ControllersLogic/UpdateAddressLogic.php index 95b8bf64..94d960f6 100644 --- a/app/Classes/Modules/Addresses/ControllersLogic/UpdateAddressLogic.php +++ b/app/Classes/Modules/Addresses/ControllersLogic/UpdateAddressLogic.php @@ -13,6 +13,8 @@ use App\Classes\Modules\Contacts\DataTransferObjects\ContactObject; use App\Classes\Modules\Contacts\Processors\CreateContactProcessor; use App\Classes\Modules\Remarks\DataTransferObjects\RemarkObject; use App\Classes\Modules\Remarks\Processors\CreateRemarkProcessor; +use App\Classes\ValueObjects\Constants\AddressType; +use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Http\Resources\AddressResource; use App\Models\Address; use Illuminate\Http\JsonResponse; @@ -79,7 +81,7 @@ class UpdateAddressLogic extends AbstractControllerLogic { $district = $this->fetchesDistrict->execute(['id' => $request->input('district_id')]); - $object = new AddressObject($request->input('street_one'), $request->input('street_two'), $district->country_id, $district->state_id, $district->id, $request->input('post_code'), $request->input('reference')); + $object = new AddressObject($request->input('street_one'), $request->input('street_two'), $district->country_id, $district->state_id, $district->id, $request->input('post_code'), AddressType::DELIVERY, ApprovalStatus::APPROVED, $request->input('reference')); $this->canUpdateAddress->passes($object); diff --git a/app/Classes/Modules/Addresses/DataTransferObjects/AddressObject.php b/app/Classes/Modules/Addresses/DataTransferObjects/AddressObject.php index b4453c3a..f1d79e53 100644 --- a/app/Classes/Modules/Addresses/DataTransferObjects/AddressObject.php +++ b/app/Classes/Modules/Addresses/DataTransferObjects/AddressObject.php @@ -26,6 +26,12 @@ class AddressObject implements DataTransferObject /** @var int */ private $postCode; + /** @var int */ + private $type; + + /** @var int */ + private $status; + /** @var string|null */ private $reference; @@ -37,9 +43,11 @@ class AddressObject implements DataTransferObject * @param int $stateId * @param int $districtId * @param int $postCode + * @param int $type + * @param int $status * @param null|string $reference */ - public function __construct(string $streetOne, ?string $streetTwo, int $countryId, int $stateId, int $districtId, int $postCode, ?string $reference = null, ?int $status = ApprovalStatus::APPROVED) + public function __construct(string $streetOne, ?string $streetTwo, int $countryId, int $stateId, int $districtId, int $postCode, int $type, int $status, ?string $reference = null) { $this->streetOne = $streetOne; $this->streetTwo = $streetTwo; @@ -47,8 +55,9 @@ class AddressObject implements DataTransferObject $this->stateId = $stateId; $this->districtId = $districtId; $this->postCode = $postCode; - $this->reference = $reference; + $this->type = $type; $this->status = $status; + $this->reference = $reference; } /** @@ -100,11 +109,11 @@ class AddressObject implements DataTransferObject } /** - * @return null|string + * @return int */ - public function getReference(): ?string + public function getType(): int { - return $this->reference; + return $this->type; } /** @@ -115,5 +124,13 @@ class AddressObject implements DataTransferObject return $this->status; } + /** + * @return null|string + */ + public function getReference(): ?string + { + return $this->reference; + } + } \ No newline at end of file diff --git a/app/Classes/Modules/Addresses/Services/CleansOldAddress.php b/app/Classes/Modules/Addresses/Services/CleansOldAddress.php index 90fad41c..59463ad9 100644 --- a/app/Classes/Modules/Addresses/Services/CleansOldAddress.php +++ b/app/Classes/Modules/Addresses/Services/CleansOldAddress.php @@ -10,6 +10,8 @@ namespace App\Classes\Modules\Addresses\Services; use App\Classes\Modules\Addresses\DataTransferObjects\AddressObject; +use App\Classes\ValueObjects\Constants\AddressType; +use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Models\District; use App\Models\OldAddress; @@ -31,7 +33,7 @@ class CleansOldAddress return null; } - return new AddressObject($this->cleanAddress($address->street_one, $district, $address->post_code), $this->cleanAddress($address->street_two, $district, $address->post_code), $district->country_id, $district->state_id, $district->id, $address->post_code, 'Delivery Address'); + return new AddressObject($this->cleanAddress($address->street_one, $district, $address->post_code), $this->cleanAddress($address->street_two, $district, $address->post_code), $district->country_id, $district->state_id, $district->id, $address->post_code, AddressType::DELIVERY, ApprovalStatus::APPROVED, 'Delivery Address'); } diff --git a/app/Classes/Modules/Addresses/Services/CreatesAddress.php b/app/Classes/Modules/Addresses/Services/CreatesAddress.php index b9f2716c..522b5d82 100644 --- a/app/Classes/Modules/Addresses/Services/CreatesAddress.php +++ b/app/Classes/Modules/Addresses/Services/CreatesAddress.php @@ -29,6 +29,7 @@ class CreatesAddress extends AbstractUpdateRelationshipRecord $model->district_id = $object->getDistrictId(); $model->postcode = $object->getPostCode(); $model->status = $object->getStatus(); + $model->type = $object->getType(); return $this->handler($addressable->addresses(), $model); diff --git a/app/Classes/Modules/Delivery/ControllersLogic/CreateDeliveryCustomerLogic.php b/app/Classes/Modules/Delivery/ControllersLogic/CreateDeliveryCustomerLogic.php index c7368439..521d88c5 100644 --- a/app/Classes/Modules/Delivery/ControllersLogic/CreateDeliveryCustomerLogic.php +++ b/app/Classes/Modules/Delivery/ControllersLogic/CreateDeliveryCustomerLogic.php @@ -132,9 +132,9 @@ class CreateDeliveryCustomerLogic extends AbstractControllerLogic /** @var CompanyModule $companyModule */ $companyModule = $this->createCompanyModuleProcessor->execute($company, BusinessType::ONLINE_SELLER); - $inviter = $this->fetchesCompanyModule->execute(['reference'=>'EXP']); + $inviter = $this->fetchesCompanyModule->execute(['reference'=>'LMD']); - $connectionObject = new CompanyConnectionObject($companyModule, $inviter, 'EXP', mt_rand(1000, 9999).(new GeneratesInitials())->name($company->name)->length(3)->generate()); + $connectionObject = new CompanyConnectionObject($companyModule, $inviter, mt_rand(1000, 9999).(new GeneratesInitials())->name($company->name)->length(3)->generate(), 'LMD'); $connection = $this->createsCompanyConnection->execute($connectionObject); diff --git a/app/Classes/Modules/Delivery/ControllersLogic/CreateDeliveryOrderLogic.php b/app/Classes/Modules/Delivery/ControllersLogic/CreateDeliveryOrderLogic.php new file mode 100644 index 00000000..0c5af797 --- /dev/null +++ b/app/Classes/Modules/Delivery/ControllersLogic/CreateDeliveryOrderLogic.php @@ -0,0 +1,178 @@ + 'Created Order', + 'message' => 'You have successfully created a new Order' + ]; + } + + /** @var FetchesCompany */ + private $fetchesCompany; + + /** @var fetchesAddress */ + private $fetchesAddress; + + /** @var CanCreateOrder */ + private $canCreateOrder; + + /** @var CreatesOrder */ + private $createsOrder; + + /** @var CreatesAddress */ + private $createAddress; + + /** @var CreateContactProcessor */ + private $createContactProcessor; + + /** @var CreateRemarkProcessor */ + private $createRemarkProcessor; + + /** @var GeneratesOrderNumber */ + private $generatesOrderNumber; + + /** @var CreatesPackingList */ + private $createsPackingList; + + /** @var CreatesPackage */ + private $createsPackage; + + + /** + * CreateDeliveryOrderLogic constructor. + * @param FetchesCompany $fetchesCompany + * @param FetchesAddress $fetchesAddress + * @param CanCreateOrder $canCreateOrder + * @param CreatesOrder $createsOrder + * @param CreatesAddress $createAddress + * @param CreateContactProcessor $createContactProcessor + * @param CreateRemarkProcessor $createRemarkProcessor + * @param GeneratesOrderNumber $generatesOrderNumber + * @param CreatesPackingList $createsPackingList + * @param CreatesPackage $createPackage + */ + public function __construct(FetchesCompany $fetchesCompany, FetchesAddress $fetchesAddress, CanCreateOrder $canCreateOrder, CreatesOrder $createsOrder, CreatesAddress $createAddress, CreateContactProcessor $createContactProcessor, CreateRemarkProcessor $createRemarkProcessor, GeneratesOrderNumber $generatesOrderNumber, CreatesPackingList $createsPackingList, CreatesPackage $createsPackage) + { + $this->fetchesCompany = $fetchesCompany; + $this->fetchesAddress = $fetchesAddress; + $this->canCreateOrder = $canCreateOrder; + $this->createsOrder = $createsOrder; + $this->createAddress = $createAddress; + $this->createContactProcessor = $createContactProcessor; + $this->createRemarkProcessor = $createRemarkProcessor; + $this->generatesOrderNumber = $generatesOrderNumber; + $this->createsPackingList = $createsPackingList; + $this->createsPackage = $createsPackage; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws \App\Classes\Exceptions\AccessForbiddenException + * @throws \App\Classes\Exceptions\MalformedRequestException + * @throws \App\Classes\Exceptions\RequestValidationException + */ + public function logic(Request $request): JsonResponse + { + $company = $this->fetchesCompany->execute(['id' => $request->input('company_id')]); + + $senderAddress = $this->fetchesAddress->execute(['id' => $request->input('sender_address_id')]); + $deliveryAddress = $this->fetchesAddress->execute(['id' => $request->input('delivery_address_id')]); + + /** @var CompanyModule $companyModule */ + $companyModule = $company->companyModules()->where('type', BusinessType::ONLINE_SELLER)->first(); + + $orderObject = new OrderObject($this->generatesOrderNumber->execute(), OrderType::LAST_MILE_DELIVERY, ApprovalStatus::APPROVED); + + $this->canCreateOrder->passes($orderObject); + + /** @var Order $order */ + $order = $this->createsOrder->execute($companyModule, $orderObject); + + $senderAddressObject = new AddressObject($senderAddress->street_one, $senderAddress->street_two, $senderAddress->country_id, $senderAddress->state_id, $senderAddress->district_id, $senderAddress->postcode, $senderAddress->type, ApprovalStatus::APPROVED, $senderAddress->reference); + $deliveryAddressObject = new AddressObject($deliveryAddress->street_one, $deliveryAddress->street_two, $deliveryAddress->country_id, $deliveryAddress->state_id, $deliveryAddress->district_id, $deliveryAddress->postcode, $deliveryAddress->type, ApprovalStatus::APPROVED, $senderAddress->reference); + + /** @var Address $orderSenderAddress */ + $orderSenderAddress = $this->createAddress->execute($order, $senderAddressObject); + /** @var Address $orderDeliveryAddress */ + $orderDeliveryAddress = $this->createAddress->execute($order, $deliveryAddressObject); + + $senderContact = $senderAddress->contacts()->first(); + $deliveryContact = $deliveryAddress->contacts()->first(); + + $contactObject = new ContactObject($senderContact->reference, $senderContact->phone, '',''); + $this->createContactProcessor->execute($contactObject, $orderSenderAddress); + + $contactObject = new ContactObject($deliveryContact->reference, $deliveryContact->phone, '',''); + $this->createContactProcessor->execute($contactObject, $orderDeliveryAddress); + + $senderRemark = $senderAddress->remarks()->first(); + $deliveryRemark = $deliveryAddress->remarks()->first(); + + if ($senderRemark){ + $remarkObject = new RemarkObject($senderRemark->content, Auth()->user()->id); + + if($remarkObject->getContent()){ + $this->createRemarkProcessor->execute($orderSenderAddress, $remarkObject); + } + } + + if ($deliveryRemark){ + $remarkObject = new RemarkObject($deliveryRemark->content, Auth()->user()->id); + + if($remarkObject->getContent()){ + $this->createRemarkProcessor->execute($orderDeliveryAddress, $remarkObject); + } + } + + $packingListObject = new PackingListObject($order->reference, $companyModule->id, PackingListType::DELIVERY_PACKING_LIST, ApprovalStatus::PENDING_VERIFICATION); + + /** @var PackingList $packingList */ + $packingList = $this->createsPackingList->execute($packingListObject, $order); + + $packageObject = new PackageObject($request->input('packing_list.type'), $request->input('packing_list.description'), (float) 1, (float) 1, (float) 1, $request->input('packing_list.weight'), (float) $request->input('packing_list.quantity'), ApprovalStatus::APPROVED); + $this->createsPackage->execute($packageObject, $packingList); + + return $this->resourceResponse(new DeliveryOrderResource($order)); + + } +} diff --git a/app/Classes/Modules/Delivery/ControllersLogic/ListOrdersLogic.php b/app/Classes/Modules/Delivery/ControllersLogic/ListOrdersLogic.php new file mode 100644 index 00000000..ae51f1b2 --- /dev/null +++ b/app/Classes/Modules/Delivery/ControllersLogic/ListOrdersLogic.php @@ -0,0 +1,57 @@ + 'Retrieved Orders', + 'message' => 'You have successfully retrieved a list of Orders' + ]; + } + + /** @var CanListOrders */ + private $canListOrders; + + /** @var ListsOrders */ + private $listsOrders; + + /** + * ListOrdersLogic constructor. + * @param CanListOrders $canListOrders + * @param ListsOrders $listsOrders + */ + public function __construct(CanListOrders $canListOrders, ListsOrders $listsOrders) + { + $this->canListOrders = $canListOrders; + $this->listsOrders = $listsOrders; + } + + public function logic(Request $request) : JsonResponse + { + $this->canListOrders->passes(); + + $query = $this->listsOrders->execute(array_merge($this->listsOrders->deserializeFilters($request->input('filters')), ['with_parcels' => true, 'type_in' => [OrderType::LAST_MILE_DELIVERY]])); + + return $this->collectionResponse(DeliveryOrderResource::collection($query)); + + } + + + +} diff --git a/app/Classes/Modules/Exports/Services/ExportsDeliveryOrders.php b/app/Classes/Modules/Exports/Services/ExportsDeliveryOrders.php new file mode 100644 index 00000000..03525eeb --- /dev/null +++ b/app/Classes/Modules/Exports/Services/ExportsDeliveryOrders.php @@ -0,0 +1,109 @@ +request = $request; + } + + public function headings(): array + { + return [ + 'Types_Of_Services', + 'Service_Type', + 'Sender_Name', + 'Sender_Company_Name', + 'Sender_Building_Unit', + 'Sender_Address', + 'Sender_Address_2', + 'Sender_Postal_Code', + 'Sender_Phone_Number', + 'Delivery_Name', + 'Delivery Company Name', + 'Delivery_Building_Unit', + 'Delivery_Address', + 'Delivery_Address_2', + 'Delivery_Postal_Code', + 'Delivery_Phone_Number', + 'Shipment_Type', + 'Mode', + 'Pickup_Address_Type', + 'Reference_Number', + 'Quantity', + 'Weight', + 'Length', + 'Width', + 'Height', + 'COD_Amount', + 'DO_Numbers' + ]; + } + + /** + * @return \Illuminate\Support\Collection|mixed + */ + public function query() + { + return Order::where('type', OrderType::LAST_MILE_DELIVERY); + } + + /** + * @param Order $order + * + * @return array + */ + public function map($order): array + { + $senderAddress = $order->addresses()->where('type', AddressType::PICK_UP)->first(); + $deliveryAddress = $order->addresses()->where('type', AddressType::DELIVERY)->first(); + $package = $order->packingLists()->first()->packages()->first(); + return [ + 'Standard Delivery', + 'ST00000003', + $senderAddress->contacts()->first()->reference, + '', + '*', + $senderAddress->street_one.', '.$senderAddress->street_two.' '.$senderAddress->district->name.' '.$senderAddress->postcode.' '.$senderAddress->state->name.' '.$senderAddress->country->name, + '', + $senderAddress->postcode, + $senderAddress->contacts()->first()->phone, + $deliveryAddress->contacts()->first()->reference, + '', + '*', + $deliveryAddress->street_one.', '.$deliveryAddress->street_two.' '.$deliveryAddress->district->name.' '.$deliveryAddress->postcode.' '.$deliveryAddress->state->name.' '.$deliveryAddress->country->name, + '', + $deliveryAddress->postcode, + $deliveryAddress->contacts()->first()->phone, + $package->type === PackageType::CARTON ? 'Package' : ($package->type === PackageType::PALLET ? 'Pallet' : 'Documents'), + 'Lodge In / Walk In', + 'Sender', + $order->reference, + $package->quantity, + $package->weight, + 1, + 1, + 1, + '', + '' + ]; + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Orders/ControllersLogic/ListOrdersLogic.php b/app/Classes/Modules/Orders/ControllersLogic/ListOrdersLogic.php index da0eb033..3096de9d 100644 --- a/app/Classes/Modules/Orders/ControllersLogic/ListOrdersLogic.php +++ b/app/Classes/Modules/Orders/ControllersLogic/ListOrdersLogic.php @@ -6,6 +6,7 @@ namespace App\Classes\Modules\Orders\ControllersLogic; use App\Classes\General\Abstracts\AbstractControllerLogic; use App\Classes\Modules\Orders\Services\ListsOrders; use App\Classes\Modules\Orders\Standards\Rules\CanListOrders; +use App\Classes\ValueObjects\Constants\OrderType; use App\Http\Resources\OrderResource; use ErrorException; use Illuminate\Http\JsonResponse; @@ -44,7 +45,7 @@ class ListOrdersLogic extends AbstractControllerLogic { $this->canListOrders->passes(); - $query = $this->listsOrders->execute(array_merge($this->listsOrders->deserializeFilters($request->input('filters')), ['with_parcels' => true])); + $query = $this->listsOrders->execute(array_merge($this->listsOrders->deserializeFilters($request->input('filters')), ['with_parcels' => true, 'type_in' => [OrderType::SHARED_CONTAINER, OrderType::DEDICATED_CONTAINER]])); return $this->collectionResponse(OrderResource::collection($query)); diff --git a/app/Classes/Modules/Orders/Processors/CreateOrderProcessor.php b/app/Classes/Modules/Orders/Processors/CreateOrderProcessor.php index 5a7c22eb..c427a20f 100644 --- a/app/Classes/Modules/Orders/Processors/CreateOrderProcessor.php +++ b/app/Classes/Modules/Orders/Processors/CreateOrderProcessor.php @@ -84,7 +84,7 @@ class CreateOrderProcessor /** @var Order $order */ $order = $this->createsOrder->execute($importer, $orderObject); - $addressObject = new AddressObject($address->street_one, $address->street_two, $address->country_id, $address->state_id, $address->district_id, $address->postcode,$address->reference); + $addressObject = new AddressObject($address->street_one, $address->street_two, $address->country_id, $address->state_id, $address->district_id, $address->postcode, $address->type, ApprovalStatus::APPROVED, $address->reference); /** @var Address $order_address */ $order_address = $this->createAddress->execute($order, $addressObject); diff --git a/app/Classes/Modules/Orders/Processors/RequestChangeOrderAddressProcessor.php b/app/Classes/Modules/Orders/Processors/RequestChangeOrderAddressProcessor.php index 81b31026..514aafca 100644 --- a/app/Classes/Modules/Orders/Processors/RequestChangeOrderAddressProcessor.php +++ b/app/Classes/Modules/Orders/Processors/RequestChangeOrderAddressProcessor.php @@ -8,6 +8,7 @@ use App\Classes\Modules\Addresses\Services\CreatesAddress; use App\Classes\Modules\Addresses\Services\FetchesAddress; use App\Classes\Modules\Addresses\Services\DeletesAddress; use App\Classes\Modules\Addresses\DataTransferObjects\AddressObject; +use App\Classes\ValueObjects\Constants\AddressType; use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Classes\Modules\Contacts\DataTransferObjects\ContactObject; use App\Classes\Modules\Remarks\DataTransferObjects\RemarkObject; @@ -76,7 +77,7 @@ class RequestChangeOrderAddressProcessor } $address = $this->fetchesAddress->execute(['id' => $request->get('address_id')]); - $addressObject = new AddressObject($address->street_one, $address->street_two, $address->country_id, $address->state_id, $address->district_id, $address->postcode, $address->reference, ApprovalStatus::PENDING_VERIFICATION); + $addressObject = new AddressObject($address->street_one, $address->street_two, $address->country_id, $address->state_id, $address->district_id, $address->postcode, AddressType::DELIVERY, ApprovalStatus::PENDING_VERIFICATION, $address->reference); $order_address = $this->createsAddress->execute($order, $addressObject); $contact = $address->contacts()->first(); diff --git a/app/Classes/ValueObjects/Constants/AddressType.php b/app/Classes/ValueObjects/Constants/AddressType.php index 4fdc3a29..614b9774 100644 --- a/app/Classes/ValueObjects/Constants/AddressType.php +++ b/app/Classes/ValueObjects/Constants/AddressType.php @@ -8,4 +8,6 @@ final class AddressType { public const DELIVERY = 2; + public const PICK_UP = 3; + } diff --git a/app/Classes/ValueObjects/Constants/OrderType.php b/app/Classes/ValueObjects/Constants/OrderType.php index ca203697..6558edd1 100644 --- a/app/Classes/ValueObjects/Constants/OrderType.php +++ b/app/Classes/ValueObjects/Constants/OrderType.php @@ -8,4 +8,6 @@ final class OrderType { public const DEDICATED_CONTAINER = 1; + public const LAST_MILE_DELIVERY = 2; + } diff --git a/app/Classes/ValueObjects/Constants/PackageType.php b/app/Classes/ValueObjects/Constants/PackageType.php index c38ad962..7865473a 100644 --- a/app/Classes/ValueObjects/Constants/PackageType.php +++ b/app/Classes/ValueObjects/Constants/PackageType.php @@ -10,4 +10,6 @@ final class PackageType { public const OVER_WEIGHT = 2; + public const DOCUMENT = 3; + } diff --git a/app/Http/Controllers/Delivery/CreateDeliveryOrderController.php b/app/Http/Controllers/Delivery/CreateDeliveryOrderController.php new file mode 100644 index 00000000..c6ab0ba2 --- /dev/null +++ b/app/Http/Controllers/Delivery/CreateDeliveryOrderController.php @@ -0,0 +1,20 @@ +execute($request); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Delivery/ExportDeliveryOrdersToExcelController.php b/app/Http/Controllers/Delivery/ExportDeliveryOrdersToExcelController.php new file mode 100644 index 00000000..9121fe00 --- /dev/null +++ b/app/Http/Controllers/Delivery/ExportDeliveryOrdersToExcelController.php @@ -0,0 +1,33 @@ +headers->set('Authorization', 'Bearer '.$token); + } + + public function lineClear(Request $request){ + $exportsTransactions = new ExportsDeliveryOrders($request); + $response = $exportsTransactions->download('line-clear-export.xls', Excel::XLS, ['Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet']); + ob_end_clean(); + return $response; + } + +} \ No newline at end of file diff --git a/app/Http/Controllers/Delivery/ListOrdersController.php b/app/Http/Controllers/Delivery/ListOrdersController.php new file mode 100644 index 00000000..6106eb7e --- /dev/null +++ b/app/Http/Controllers/Delivery/ListOrdersController.php @@ -0,0 +1,22 @@ +execute($request); + } +} diff --git a/app/Http/Resources/CompanyResource.php b/app/Http/Resources/CompanyResource.php index 38459a35..8e27ab73 100644 --- a/app/Http/Resources/CompanyResource.php +++ b/app/Http/Resources/CompanyResource.php @@ -18,7 +18,7 @@ class CompanyResource extends JsonResource */ public function toArray($request) { - $companyModule = $this->companyModules()->where('type', '=', BusinessType::IMPORTER)->first(); + $companyModule = $this->companyModules()->first(); return [ 'id' => $this->id, 'hash_id' => Crypt::encryptString($this->id), @@ -30,8 +30,8 @@ class CompanyResource extends JsonResource 'contact' => new ContactResource ($this->when($this->has('contacts'), $this->contacts->first())), 'employee' => new UserResource($companyModule->employees()->first()), 'company_module' => new CompanyModuleResource($companyModule), - 'last_order' => new OrderResource($companyModule ? $companyModule->orders()->orderBy('id', 'DESC')->first(): null), - 'order_count' => $this->orders()->count(), + 'last_order' => $companyModule->type === 7 ? new DeliveryOrderResource($companyModule->orders()->orderBy('id', 'DESC')->first()) : new OrderResource($companyModule->orders()->orderBy('id', 'DESC')->first()), + 'order_count' => $companyModule->orders()->count(), 'identification' => new DocumentResource($this->documents->whereIn('document_type', DocumentType::IDENTIFICATION_DOCUMENTS)->whereIn('status', [ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::APPROVED])->first()), 'created_at' => $this->created_at->format('d-m-Y') diff --git a/app/Http/Resources/DeliveryOrderResource.php b/app/Http/Resources/DeliveryOrderResource.php new file mode 100644 index 00000000..cc81bfad --- /dev/null +++ b/app/Http/Resources/DeliveryOrderResource.php @@ -0,0 +1,33 @@ + $this->id, + 'reference' => $this->reference, + 'type' => (int) $this->type, + 'status' => (int) $this->status, + 'company_module' => new CompanyModuleResource($this->companyModule), + 'sender_address' => new AddressResource($this->addresses()->where('status', '=', ApprovalStatus::APPROVED)->where('type', AddressType::PICK_UP)->first()), + 'delivery_address' => new AddressResource($this->addresses()->where('status', '=', ApprovalStatus::APPROVED)->where('type', AddressType::DELIVERY)->first()), + 'packingList' => new DeliveryPackingListResource($this->packingLists()->first()), + 'remarks' => RemarkResource::collection($this->remarks), + 'created_at' => $this->created_at->format('d-m-Y') + ]; + + } +} diff --git a/app/Http/Resources/DeliveryPackingListResource.php b/app/Http/Resources/DeliveryPackingListResource.php new file mode 100644 index 00000000..16e71caf --- /dev/null +++ b/app/Http/Resources/DeliveryPackingListResource.php @@ -0,0 +1,36 @@ +packages()->first(); + + return [ + 'id' => $this->id, + 'claimant_id' => $this->claimant_id, + 'reference' => $this->reference, + 'status' => $this->status, + 'transport' => new TransportResource($this->transports()->first()), + 'type' => $package->type, + 'description' => $package->description, + 'weight' => (float) $package->weight, + 'quantity' => (float) $package->quantity, + ]; + } +} diff --git a/app/Models/Addon.php b/app/Models/Addon.php new file mode 100644 index 00000000..68118643 --- /dev/null +++ b/app/Models/Addon.php @@ -0,0 +1,36 @@ +morphTo(); + } +} diff --git a/app/Models/Order.php b/app/Models/Order.php index 5011fd36..352f46fb 100644 --- a/app/Models/Order.php +++ b/app/Models/Order.php @@ -58,6 +58,14 @@ class Order extends AbstractModel implements Addressable, Packable, Remarkable, return $this->morphMany(PackingList::class, 'owner'); } + /** + * @return MorphMany + */ + public function addons(): morphMany + { + return $this->morphMany(Addon::class, 'owner'); + } + /** * @return MorphMany */ diff --git a/app/Models/PackingList.php b/app/Models/PackingList.php index a6fd95e5..1ca19f1d 100644 --- a/app/Models/PackingList.php +++ b/app/Models/PackingList.php @@ -36,6 +36,14 @@ class PackingList extends AbstractModel implements Transportable, Steppable, Pac return $this->morphTo(); } + /** + * @return MorphMany + */ + public function addons(): morphMany + { + return $this->morphMany(Addon::class, 'owner'); + } + public function containers(): BelongsToMany { return $this->BelongsToMany(Container::class, ContainerPackingList::class); diff --git a/database/migrations/2022_03_14_133555_create_addons_table.php b/database/migrations/2022_03_14_133555_create_addons_table.php new file mode 100644 index 00000000..4b58535c --- /dev/null +++ b/database/migrations/2022_03_14_133555_create_addons_table.php @@ -0,0 +1,37 @@ +id(); + $table->morphs('owner'); + $table->string('reference',200); + $table->integer('type')->default(0); + $table->integer('quantity')->default(1); + $table->integer('status')->default(0); + $table->softDeletes(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('order_addons'); + } +} diff --git a/database/seeders/CompaniesTableSeeder.php b/database/seeders/CompaniesTableSeeder.php index da6c1061..bcabe9a0 100644 --- a/database/seeders/CompaniesTableSeeder.php +++ b/database/seeders/CompaniesTableSeeder.php @@ -16,6 +16,7 @@ use App\Classes\Modules\Companies\Services\UpdatesCompanyStatus; use App\Classes\Modules\Contacts\DataTransferObjects\ContactObject; use App\Classes\Modules\Contacts\Processors\CreateContactProcessor; use App\Classes\Modules\Contacts\Services\CreatesContact; +use App\Classes\ValueObjects\Constants\AddressType; use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Classes\ValueObjects\Constants\CompanyType; use App\Classes\ValueObjects\Constants\BusinessType; @@ -112,7 +113,7 @@ class CompaniesTableSeeder extends Seeder /** @var CompanyModule $companyModule */ $companyModule = $this->createCompanyModuleProcessor->execute($company, BusinessType::FREIGHT_FORWARDER); - $address = new AddressObject('Malaysian Global Innovation & Creativity Center Level 1 CWS', 'Block 3730,Persiaran APEC', 1, 15, 402, 63000); + $address = new AddressObject('Malaysian Global Innovation & Creativity Center Level 1 CWS', 'Block 3730,Persiaran APEC', 1, 15, 402, 63000, AddressType::BILLING, ApprovalStatus::APPROVED); $this->createsAddress->execute($companyModule, $address); $contact = new ContactObject('Office Number', '0182909252', '', ''); @@ -131,22 +132,22 @@ class CompaniesTableSeeder extends Seeder if ($name === 'Guangzhou'){ $companyModule->update(['name' => $name, 'reference' => 'GZ-V01']); - $address = new AddressObject('白云区,大朗南路 白云湖大道自编13号 7号仓库', '高德地图导航:广州市世通行', 2, 35, 633, 510450); + $address = new AddressObject('白云区,大朗南路 白云湖大道自编13号 7号仓库', '高德地图导航:广州市世通行', 2, 35, 633, 510450, AddressType::DELIVERY, ApprovalStatus::APPROVED); $contact = new ContactObject('杨维民', '13600055019', '', ''); } elseif ($name === 'Yiwu') { $companyModule->update(['name' => $name, 'reference' => 'YW-V01']); - $address = new AddressObject('义乌市诚信大道义乌港A区2楼194号', '', 2, 27, 532, 322000); + $address = new AddressObject('义乌市诚信大道义乌港A区2楼194号', '', 2, 27, 532, 322000, AddressType::DELIVERY, ApprovalStatus::APPROVED); $contact = new ContactObject('小曾', '13575982901', '', ''); } elseif ($name === 'Klang') { $companyModule->update(['name' => $name, 'reference' => 'KL-V01']); - $address = new AddressObject('LOT 1357 A, JALAN TANJUNG SHAWAL', 'KAMPUNG SUNGAI PINANG', 1, 15, 412, 41400); + $address = new AddressObject('LOT 1357 A, JALAN TANJUNG SHAWAL', 'KAMPUNG SUNGAI PINANG', 1, 15, 412, 41400, AddressType::DELIVERY, ApprovalStatus::APPROVED); $contact = new ContactObject('Mr. Yang', '0162237680', '', ''); } elseif ($name === 'Sabah') { $companyModule->update(['name' => $name, 'reference' => 'SB-V01']); - $address = new AddressObject('Warehouse A & B, No. 2, Lorong Kacang Tanah 1', 'Jalan Kolombong, Kolombong', 1, 13, 316, 88450); + $address = new AddressObject('Warehouse A & B, No. 2, Lorong Kacang Tanah 1', 'Jalan Kolombong, Kolombong', 1, 13, 316, 88450, AddressType::DELIVERY, ApprovalStatus::APPROVED); } elseif ($name === 'Sarawak') { $companyModule->update(['name' => $name, 'reference' => 'SRW-V01']); - $address = new AddressObject('OPPOSITE HT POLE 51, LT 664 JALAN SUNGAI SALIM', '', 1, 14, 381, 96000); + $address = new AddressObject('OPPOSITE HT POLE 51, LT 664 JALAN SUNGAI SALIM', '', 1, 14, 381, 96000, AddressType::DELIVERY, ApprovalStatus::APPROVED); } @@ -161,7 +162,7 @@ class CompaniesTableSeeder extends Seeder /** @var CompanyModule $companyModule */ $companyModule = $this->createCompanyModuleProcessor->execute($company, $businessType); - $address = new AddressObject('2, Jalan TSB 6, Taman Industri Sungai Buloh', '', 1, 15, 419, 47000); + $address = new AddressObject('2, Jalan TSB 6, Taman Industri Sungai Buloh', '', 1, 15, 419, 47000, AddressType::BILLING, ApprovalStatus::APPROVED); $this->createsAddress->execute($companyModule, $address); $contact = new ContactObject('Office Number', '036148 8108', '', ''); diff --git a/database/seeders/LastMileDeliveryTableSeeder.php b/database/seeders/LastMileDeliveryTableSeeder.php new file mode 100644 index 00000000..e56a1ea8 --- /dev/null +++ b/database/seeders/LastMileDeliveryTableSeeder.php @@ -0,0 +1,123 @@ +createCompanyProcessor = $createCompanyProcessor; + $this->updatesCompanyStatus = $updatesCompanyStatus; + $this->createCompanyModuleProcessor = $createCompanyModuleProcessor; + $this->createContactProcessor = $createContactProcessor; + $this->createsCompanyConnection = $createsCompanyConnection; + $this->approvesCompanyConnection = $approvesCompanyConnection; + $this->createAddressFromOldAddressProcessor = $createAddressFromOldAddressProcessor; + $this->createsAddress = $createsAddress; + $this->createsCompany = $createsCompany; + $this->createsContact = $createsContact; + } + + + /** + * Run the database seeds. + * + * @return void + * @throws \App\Classes\Exceptions\AccessForbiddenException + * @throws \App\Classes\Exceptions\MalformedRequestException + * @throws \App\Classes\Exceptions\RequestValidationException + */ + public function run() + { + + $companies = [ + new CompanyObject('Last Mile Delivery', 'LMD', CompanyType::COMPANY_BUSINESS, ApprovalStatus::APPROVED), + ]; + + + foreach ($companies as $companyObject) { + + /** @var Company $company */ + $company = $this->createsCompany->execute($companyObject); + + /** @var CompanyModule $companyModule */ + $companyModule = $this->createCompanyModuleProcessor->execute($company, BusinessType::LAST_MILE_DELIVERY_AGENT); + + $address = new AddressObject('Malaysian Global Innovation & Creativity Center Level 1 CWS', 'Block 3730,Persiaran APEC', 1, 15, 402, 63000, AddressType::BILLING, ApprovalStatus::APPROVED); + $this->createsAddress->execute($companyModule, $address); + + $contact = new ContactObject('Office Number', '0182909252', '', ''); + $this->createsContact->execute($companyModule, $contact); + + continue; + + } + } +} diff --git a/database/seeders/ModernWarehouseTableSeeder.php b/database/seeders/ModernWarehouseTableSeeder.php index 7f76fd2e..2d97241d 100644 --- a/database/seeders/ModernWarehouseTableSeeder.php +++ b/database/seeders/ModernWarehouseTableSeeder.php @@ -17,6 +17,7 @@ use App\Classes\Modules\Companies\Services\UpdatesCompanyStatus; use App\Classes\Modules\Contacts\DataTransferObjects\ContactObject; use App\Classes\Modules\Contacts\Processors\CreateContactProcessor; use App\Classes\Modules\Contacts\Services\CreatesContact; +use App\Classes\ValueObjects\Constants\AddressType; use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Classes\ValueObjects\Constants\CompanyType; use App\Classes\ValueObjects\Constants\BusinessType; @@ -106,7 +107,7 @@ class ModernWarehouseTableSeeder extends Seeder $companyModule = $this->createCompanyModuleProcessor->execute($company, BusinessType::WAREHOUSE); $companyModule->update(['name' => 'Yiwu', 'reference' => 'YW-V02']); - $address = new AddressObject('义乌市 后宅街道 起航路233号百汇科创园园区里面', '(进口处进来第一个路口左转至出口处右手边国际物流仓库)', 2, 27, 532, 322000); + $address = new AddressObject('义乌市 后宅街道 起航路233号百汇科创园园区里面', '(进口处进来第一个路口左转至出口处右手边国际物流仓库)', 2, 27, 532, 322000, AddressType::BILLING, ApprovalStatus::APPROVED); $contact = new ContactObject('韩成名', '18058489899 / 18058929899', '', ''); $this->createsAddress->execute($companyModule, $address); diff --git a/resources/assets/images/lineclear.png b/resources/assets/images/lineclear.png new file mode 100644 index 0000000000000000000000000000000000000000..3a71fc9fd07893ae07163923ecf3d695badf924e GIT binary patch literal 8339 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 RfB!u!Bc&i&AYthBzW~*qhwcCX literal 0 HcmV?d00001 diff --git a/resources/assets/vue/app.js b/resources/assets/vue/app.js index b81feb10..5195d9c8 100644 --- a/resources/assets/vue/app.js +++ b/resources/assets/vue/app.js @@ -14,6 +14,10 @@ import vuelidate from 'vuelidate'; /** Input Mask **/ import VueTheMask from 'vue-the-mask'; +import VueEasytable from "vue-easytable"; // import library + +Vue.use(VueEasytable); + /** Mixins */ import request from './general/mixins/request'; diff --git a/resources/assets/vue/components/accounts/elements/LogoutComponent.vue b/resources/assets/vue/components/accounts/elements/LogoutComponent.vue index a3d65272..1236d117 100644 --- a/resources/assets/vue/components/accounts/elements/LogoutComponent.vue +++ b/resources/assets/vue/components/accounts/elements/LogoutComponent.vue @@ -67,11 +67,11 @@ this.submit(this.route('api.account.authentication.logout'), 'get', this.section, false, false) }, successHandler(){ - this.$store.dispatch('userAuthentication', {access_token: '', redirect_url: this.route('login')}); + this.$store.dispatch('userAuthentication', {access_token: '', redirect_url: [7, 8].includes(this.$store.getters.getCompanyModuleType) ? this.route('last_mile_delivery.login') : this.route('login') }); this.$store.dispatch('updateIfCreateNewOrder',''); }, errorHandler(){ - this.$store.dispatch('userAuthentication', {access_token: '', redirect_url: this.route('login')}); + this.$store.dispatch('userAuthentication', {access_token: '', redirect_url: [7, 8].includes(this.$store.getters.getCompanyModuleType) ? this.route('last_mile_delivery.login') : this.route('login') }); } } } diff --git a/resources/assets/vue/components/accounts/forms/LoginFormComponent.vue b/resources/assets/vue/components/accounts/forms/LoginFormComponent.vue index a88815cf..8db903db 100644 --- a/resources/assets/vue/components/accounts/forms/LoginFormComponent.vue +++ b/resources/assets/vue/components/accounts/forms/LoginFormComponent.vue @@ -25,7 +25,7 @@
-
Sign In
+
Sign In
@@ -55,7 +55,8 @@ parameters: { email: this.email, password: '' - } + }, + currentUrl: window.location.href, }; }, methods: { diff --git a/resources/assets/vue/components/accounts/forms/NewRegistrationFormComponent.vue b/resources/assets/vue/components/accounts/forms/NewRegistrationFormComponent.vue index abca50db..60e20b01 100644 --- a/resources/assets/vue/components/accounts/forms/NewRegistrationFormComponent.vue +++ b/resources/assets/vue/components/accounts/forms/NewRegistrationFormComponent.vue @@ -55,7 +55,7 @@
-
- + - +
@@ -51,7 +51,11 @@ props: { value: { required: false + }, + 'section': { + type: String, } + }, data(){ return { diff --git a/resources/assets/vue/components/addresses/forms/AddressFormComponent.vue b/resources/assets/vue/components/addresses/forms/AddressFormComponent.vue index 0b6edc6b..5aaf56d0 100644 --- a/resources/assets/vue/components/addresses/forms/AddressFormComponent.vue +++ b/resources/assets/vue/components/addresses/forms/AddressFormComponent.vue @@ -29,7 +29,7 @@
- + @@ -93,6 +93,10 @@ id: { type: Number, required: true + }, + type: { + type: Number, + default: 2 } }, data() { @@ -104,6 +108,7 @@ street_two: '', district_id: '', post_code: '', + type: this.type, remark: '', phone: '', person_in_charge: '', @@ -118,6 +123,7 @@ this.parameters.street_two = this.data.street_two; this.parameters.district_id = this.data.district.id; this.parameters.post_code = this.data.post_code; + this.parameters.type = this.data.type; this.parameters.phone = this.data.contact ? this.data.contact.phone : ''; this.parameters.person_in_charge = this.data.contact ? this.data.contact.reference : ''; this.parameters.remark = this.data.remark ? this.data.remark.content : ''; diff --git a/resources/assets/vue/components/addresses/sections/AddressProfileSectionComponent.vue b/resources/assets/vue/components/addresses/sections/AddressProfileSectionComponent.vue new file mode 100644 index 00000000..2466a05d --- /dev/null +++ b/resources/assets/vue/components/addresses/sections/AddressProfileSectionComponent.vue @@ -0,0 +1,19 @@ + + \ No newline at end of file diff --git a/resources/assets/vue/components/companies/sections/DeliveryCustomerProfileSectionComponent.vue b/resources/assets/vue/components/companies/sections/DeliveryCustomerProfileSectionComponent.vue new file mode 100644 index 00000000..520cf795 --- /dev/null +++ b/resources/assets/vue/components/companies/sections/DeliveryCustomerProfileSectionComponent.vue @@ -0,0 +1,111 @@ + + \ No newline at end of file diff --git a/resources/assets/vue/components/containers/forms/CreateDeliveryOrderFormComponent.vue b/resources/assets/vue/components/containers/forms/CreateDeliveryOrderFormComponent.vue deleted file mode 100644 index 068f7404..00000000 --- a/resources/assets/vue/components/containers/forms/CreateDeliveryOrderFormComponent.vue +++ /dev/null @@ -1,238 +0,0 @@ - - \ No newline at end of file diff --git a/resources/assets/vue/components/containers/forms/CreateDeliveryPackinglistFormComponent.vue b/resources/assets/vue/components/containers/forms/CreateDeliveryPackinglistFormComponent.vue deleted file mode 100644 index 79aecce6..00000000 --- a/resources/assets/vue/components/containers/forms/CreateDeliveryPackinglistFormComponent.vue +++ /dev/null @@ -1,244 +0,0 @@ - - \ No newline at end of file diff --git a/resources/assets/vue/components/general/forms/ValidationWrapperComponent.vue b/resources/assets/vue/components/general/forms/ValidationWrapperComponent.vue index d30fdbaf..285c19ff 100644 --- a/resources/assets/vue/components/general/forms/ValidationWrapperComponent.vue +++ b/resources/assets/vue/components/general/forms/ValidationWrapperComponent.vue @@ -2,7 +2,7 @@
-
+
@@ -21,7 +21,7 @@ validator: { required: true }, - selecatable: { + selectable: { type: Boolean, default: false } diff --git a/resources/assets/vue/components/orders/forms/DeliveryOrderFormComponent.vue b/resources/assets/vue/components/orders/forms/DeliveryOrderFormComponent.vue new file mode 100644 index 00000000..99d9778f --- /dev/null +++ b/resources/assets/vue/components/orders/forms/DeliveryOrderFormComponent.vue @@ -0,0 +1,366 @@ + + \ No newline at end of file diff --git a/resources/assets/vue/components/orders/sections/DeliveryOrdersTableSectionComponent.vue b/resources/assets/vue/components/orders/sections/DeliveryOrdersTableSectionComponent.vue new file mode 100644 index 00000000..5cef518d --- /dev/null +++ b/resources/assets/vue/components/orders/sections/DeliveryOrdersTableSectionComponent.vue @@ -0,0 +1,176 @@ + + diff --git a/resources/assets/vue/components/reports/sections/ProfitModelReportSectionComponent.vue b/resources/assets/vue/components/reports/sections/ProfitModelReportSectionComponent.vue index f7405ba3..bf2a8dc2 100644 --- a/resources/assets/vue/components/reports/sections/ProfitModelReportSectionComponent.vue +++ b/resources/assets/vue/components/reports/sections/ProfitModelReportSectionComponent.vue @@ -26,7 +26,7 @@
- + diff --git a/resources/assets/vue/components/settings/forms/SegmentServiceFormComponent.vue b/resources/assets/vue/components/settings/forms/SegmentServiceFormComponent.vue index 5405ae6e..a3ece6fa 100644 --- a/resources/assets/vue/components/settings/forms/SegmentServiceFormComponent.vue +++ b/resources/assets/vue/components/settings/forms/SegmentServiceFormComponent.vue @@ -43,7 +43,7 @@
- + @@ -115,7 +115,7 @@
- +
diff --git a/resources/assets/vue/components/settings/forms/ServiceFormComponent.vue b/resources/assets/vue/components/settings/forms/ServiceFormComponent.vue index eac2a388..5ea960dd 100644 --- a/resources/assets/vue/components/settings/forms/ServiceFormComponent.vue +++ b/resources/assets/vue/components/settings/forms/ServiceFormComponent.vue @@ -103,7 +103,7 @@
- + diff --git a/resources/assets/vue/general/mixins/addresses/validation/addressFormValidation.js b/resources/assets/vue/general/mixins/addresses/validation/addressFormValidation.js index 98d57e59..19734539 100644 --- a/resources/assets/vue/general/mixins/addresses/validation/addressFormValidation.js +++ b/resources/assets/vue/general/mixins/addresses/validation/addressFormValidation.js @@ -9,8 +9,8 @@ export default { district_id: { required }, post_code: { required }, remark: {}, - phone: {numeric}, - person_in_charge: {}, + phone: {required, numeric}, + person_in_charge: { required }, } }, mixins: [addressFormHandler] diff --git a/resources/assets/vue/general/mixins/formHandler.js b/resources/assets/vue/general/mixins/formHandler.js index 0ffe3c71..ed1d39a6 100644 --- a/resources/assets/vue/general/mixins/formHandler.js +++ b/resources/assets/vue/general/mixins/formHandler.js @@ -17,6 +17,7 @@ export default { isLoading: false, error: '', money: {decimal: '.',thousands: ',', precision: 2}, + weight: {decimal: '.',thousands: ',', precision: 1}, productPrice: {decimal: '.',thousands: ',', precision: 3}, exchangeRate: {decimal: '.', thousands: '', precision: 5}, percentage: {decimal: '.', thousands: '', precision: 2, suffix: '%'}, diff --git a/resources/assets/vue/general/mixins/guards.js b/resources/assets/vue/general/mixins/guards.js index cd61d755..14265d6c 100644 --- a/resources/assets/vue/general/mixins/guards.js +++ b/resources/assets/vue/general/mixins/guards.js @@ -5,7 +5,7 @@ export default { (this.$store.getters.isAuthenticated && !this.isProtectedRoute()&& this.isWithTokenRoute()) ? window.location.href = this.route('dashboard') : ''; }, isProtectedRoute(){ - const unprotectedRoutes = [this.route('login'), this.route('account.email.verification'), this.route('company.claim'), this.route('signup')]; + const unprotectedRoutes = [this.route('login'), this.route('account.email.verification'), this.route('company.claim'), this.route('last_mile_delivery.login')]; if(window.location.href.indexOf(this.route('company.claim')) === 0) { return false; } diff --git a/resources/assets/vue/vuex/modules/authentication.js b/resources/assets/vue/vuex/modules/authentication.js index 462cbd37..bd12ef34 100644 --- a/resources/assets/vue/vuex/modules/authentication.js +++ b/resources/assets/vue/vuex/modules/authentication.js @@ -17,6 +17,7 @@ export default { getUserEmail: (state, getters) => getters.getDecodedAccessToken.user.email, getCompanyId: (state, getters) => getters.getDecodedAccessToken.user.company_id, getCompanyModuleId: (state, getters) => getters.getDecodedAccessToken.user.company_module_id, + getCompanyModuleType: (state, getters) => getters.getDecodedAccessToken.user.company_module_type, getOrder: (state, getters) => getters.getDecodedAccessToken.user.order, getDecodedAccessToken(state) { diff --git a/resources/views/layouts/base_portal.blade.php b/resources/views/layouts/base_portal.blade.php index a86334db..11f35e01 100644 --- a/resources/views/layouts/base_portal.blade.php +++ b/resources/views/layouts/base_portal.blade.php @@ -14,7 +14,7 @@
@include('partials.menu')
-
+
@include('partials.header')
diff --git a/resources/views/pages/accounts/signup.blade.php b/resources/views/pages/accounts/signup.blade.php index a8f49cf8..0e7c8b67 100644 --- a/resources/views/pages/accounts/signup.blade.php +++ b/resources/views/pages/accounts/signup.blade.php @@ -12,12 +12,12 @@
-

Spend less time managing your logistics and more time optimizing your operations.

+

Spend less time managing your delivery and more time optimizing your operations.

-

You know how to run your operations, let us help you streamline your logistic supply chain management.

+

You know how to run your operations, let us help you streamline your delivery management.

diff --git a/resources/views/pages/delivery/customers.blade.php b/resources/views/pages/delivery/customers.blade.php index 1cf41bb6..6deabe2f 100644 --- a/resources/views/pages/delivery/customers.blade.php +++ b/resources/views/pages/delivery/customers.blade.php @@ -1,16 +1,5 @@
-
-
-
-
-
Create Order
-
-
- -
-
- -

orders list

+
\ No newline at end of file diff --git a/resources/views/partials/header.blade.php b/resources/views/partials/header.blade.php index 685d3f27..b7623510 100644 --- a/resources/views/partials/header.blade.php +++ b/resources/views/partials/header.blade.php @@ -4,8 +4,8 @@
diff --git a/resources/views/partials/menu.blade.php b/resources/views/partials/menu.blade.php index cd578001..9d932c84 100644 --- a/resources/views/partials/menu.blade.php +++ b/resources/views/partials/menu.blade.php @@ -2,8 +2,8 @@
@@ -27,7 +27,7 @@ style=" fill:#000000;">
@@ -155,7 +155,7 @@
-
+
diff --git a/routes/delivery.php b/routes/delivery.php index 7370f146..da4732e3 100644 --- a/routes/delivery.php +++ b/routes/delivery.php @@ -3,5 +3,8 @@ use Illuminate\Support\Facades\Route; Route::group(['prefix' => 'delivery', 'namespace' => 'Delivery', 'as' => 'delivery.'], function () { - Route::post('/delivery/registration', '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'); + }); diff --git a/routes/web.php b/routes/web.php index 8a727a21..273eda25 100644 --- a/routes/web.php +++ b/routes/web.php @@ -31,13 +31,22 @@ Route::get('', function () { return view('pages.accounts.login'); })->name('login'); -Route::get('/delivery', function () { - return view('pages.accounts.signup'); -})->name('signup'); -Route::get('/delivery/dashboard', function () { - return view('pages.delivery.dashboard'); -})->name('delivery.dashboard'); +Route::group(['prefix' => 'last_mile_delivery', 'as' => 'last_mile_delivery.'], function () { + Route::get('/', function () { + return view('pages.accounts.signup'); + })->name('login'); + + Route::get('/dashboard', function () { + return view('pages.delivery.dashboard'); + })->name('dashboard'); + + Route::get('/orders/export', 'Delivery\ExportDeliveryOrdersToExcelController@lineClear')->name('order.export'); + + +}); + + Route::group(['prefix' => 'swagger'], function () { Route::get('/', function () { From 9c7d07f6036992cd40b6d162df45e1296bfb90cf Mon Sep 17 00:00:00 2001 From: edmondlang Date: Sun, 3 Apr 2022 20:20:09 +0800 Subject: [PATCH 05/15] remove imports that are not using --- resources/assets/vue/app.js | 4 ---- .../sections/DeliveryCustomerProfileSectionComponent.vue | 1 - 2 files changed, 5 deletions(-) diff --git a/resources/assets/vue/app.js b/resources/assets/vue/app.js index 5195d9c8..b81feb10 100644 --- a/resources/assets/vue/app.js +++ b/resources/assets/vue/app.js @@ -14,10 +14,6 @@ import vuelidate from 'vuelidate'; /** Input Mask **/ import VueTheMask from 'vue-the-mask'; -import VueEasytable from "vue-easytable"; // import library - -Vue.use(VueEasytable); - /** Mixins */ import request from './general/mixins/request'; diff --git a/resources/assets/vue/components/companies/sections/DeliveryCustomerProfileSectionComponent.vue b/resources/assets/vue/components/companies/sections/DeliveryCustomerProfileSectionComponent.vue index 520cf795..78385068 100644 --- a/resources/assets/vue/components/companies/sections/DeliveryCustomerProfileSectionComponent.vue +++ b/resources/assets/vue/components/companies/sections/DeliveryCustomerProfileSectionComponent.vue @@ -63,7 +63,6 @@
diff --git a/resources/assets/vue/general/mixins/guards.js b/resources/assets/vue/general/mixins/guards.js index 14265d6c..64602155 100644 --- a/resources/assets/vue/general/mixins/guards.js +++ b/resources/assets/vue/general/mixins/guards.js @@ -1,8 +1,8 @@ export default { methods: { routesGuard(){ - (!this.$store.getters.isAuthenticated && this.isProtectedRoute()&& this.isWithTokenRoute()) ? window.location.href = this.route('login') : ''; - (this.$store.getters.isAuthenticated && !this.isProtectedRoute()&& this.isWithTokenRoute()) ? window.location.href = this.route('dashboard') : ''; + (!this.$store.getters.isAuthenticated && this.isProtectedRoute()&& this.isWithTokenRoute()) ? window.location.href = window.location.href.indexOf(this.route('last_mile_delivery.login')) === 0 ? this.route('last_mile_delivery.login') : this.route('login') : ''; + (this.$store.getters.isAuthenticated && !this.isProtectedRoute()&& this.isWithTokenRoute()) ? window.location.href = [7, 8].includes(this.$store.getters.getCompanyModuleType) ? this.route('last_mile_delivery.dashboard') : this.route('dashboard') : ''; }, isProtectedRoute(){ const unprotectedRoutes = [this.route('login'), this.route('account.email.verification'), this.route('company.claim'), this.route('last_mile_delivery.login')]; diff --git a/resources/assets/vue/vuex/modules/crudRequest.js b/resources/assets/vue/vuex/modules/crudRequest.js index f4f6c37f..758b28d9 100644 --- a/resources/assets/vue/vuex/modules/crudRequest.js +++ b/resources/assets/vue/vuex/modules/crudRequest.js @@ -10,9 +10,8 @@ export default { 'Authorization': 'Bearer '+getters.getAccessToken } }).then(response => { - - if(response.status === 401 && window.location.href !== route('login')){ - dispatch('userAuthentication', {access_token: '', redirect_url: '/'}); + if(response.status === 401 && (window.location.href !== route('login') || window.location.href.indexOf(this.route('last_mile_delivery.login')) <= -1)){ + dispatch('userAuthentication', {access_token: '', redirect_url: [7, 8].includes(getters.getCompanyModuleType) ? route('last_mile_delivery.login') : route('login')}); } return response; diff --git a/resources/views/pages/delivery/admin.blade.php b/resources/views/pages/delivery/admin.blade.php index b435a520..2d508d08 100644 --- a/resources/views/pages/delivery/admin.blade.php +++ b/resources/views/pages/delivery/admin.blade.php @@ -1,42 +1,8 @@ -
+
-
-
-
-
Orders List
-
-
-
-
- - - - - - -
-
-
-
-
-
-
Customers List
-
-
-
-
- - - -
-
+
+
diff --git a/resources/views/pages/delivery/customers.blade.php b/resources/views/pages/delivery/customer.blade.php similarity index 56% rename from resources/views/pages/delivery/customers.blade.php rename to resources/views/pages/delivery/customer.blade.php index 6deabe2f..13905ecc 100644 --- a/resources/views/pages/delivery/customers.blade.php +++ b/resources/views/pages/delivery/customer.blade.php @@ -1,4 +1,4 @@ -
+
diff --git a/resources/views/pages/delivery/dashboard.blade.php b/resources/views/pages/delivery/dashboard.blade.php index c4a2362c..b8c64015 100644 --- a/resources/views/pages/delivery/dashboard.blade.php +++ b/resources/views/pages/delivery/dashboard.blade.php @@ -1,5 +1,5 @@ @extends('layouts.base_portal') @section('inner_content') - @include('pages.delivery.customers') + @include('pages.delivery.customer') @include('pages.delivery.admin') @endsection \ No newline at end of file From 4e53e1b48accf8fdb18cd34d16cd256214c82a30 Mon Sep 17 00:00:00 2001 From: edmondlang Date: Tue, 5 Apr 2022 10:45:30 +0800 Subject: [PATCH 11/15] 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 --- .../CancelDeliveryOrderLogic.php | 58 +++++++++++++++++++ .../Services/ExportsDeliveryOrders.php | 8 ++- .../CancelDeliveryOrderController.php | 20 +++++++ .../CancelDeliveryOrderFormComponent.vue | 39 +++++++++++++ .../forms/DeliveryOrderFormComponent.vue | 2 +- .../DeliveryOrdersTableSectionComponent.vue | 43 ++++++++++++-- .../views/pages/delivery/admin.blade.php | 6 +- routes/delivery.php | 8 ++- 8 files changed, 169 insertions(+), 15 deletions(-) create mode 100644 app/Classes/Modules/Delivery/ControllersLogic/CancelDeliveryOrderLogic.php create mode 100644 app/Http/Controllers/Delivery/CancelDeliveryOrderController.php create mode 100644 resources/assets/vue/components/orders/forms/CancelDeliveryOrderFormComponent.vue diff --git a/app/Classes/Modules/Delivery/ControllersLogic/CancelDeliveryOrderLogic.php b/app/Classes/Modules/Delivery/ControllersLogic/CancelDeliveryOrderLogic.php new file mode 100644 index 00000000..e52c966b --- /dev/null +++ b/app/Classes/Modules/Delivery/ControllersLogic/CancelDeliveryOrderLogic.php @@ -0,0 +1,58 @@ + '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))); + + } +} diff --git a/app/Classes/Modules/Exports/Services/ExportsDeliveryOrders.php b/app/Classes/Modules/Exports/Services/ExportsDeliveryOrders.php index 03525eeb..2297811f 100644 --- a/app/Classes/Modules/Exports/Services/ExportsDeliveryOrders.php +++ b/app/Classes/Modules/Exports/Services/ExportsDeliveryOrders.php @@ -63,7 +63,11 @@ class ExportsDeliveryOrders implements FromQuery, WithHeadings, WithHeadingRow, */ 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', $order->reference, $package->quantity, - $package->weight, + $package->weight * $package->quantity, 1, 1, 1, diff --git a/app/Http/Controllers/Delivery/CancelDeliveryOrderController.php b/app/Http/Controllers/Delivery/CancelDeliveryOrderController.php new file mode 100644 index 00000000..6dd69aa6 --- /dev/null +++ b/app/Http/Controllers/Delivery/CancelDeliveryOrderController.php @@ -0,0 +1,20 @@ +execute($request); + } +} \ No newline at end of file diff --git a/resources/assets/vue/components/orders/forms/CancelDeliveryOrderFormComponent.vue b/resources/assets/vue/components/orders/forms/CancelDeliveryOrderFormComponent.vue new file mode 100644 index 00000000..3dda284b --- /dev/null +++ b/resources/assets/vue/components/orders/forms/CancelDeliveryOrderFormComponent.vue @@ -0,0 +1,39 @@ + + \ No newline at end of file diff --git a/resources/assets/vue/components/orders/forms/DeliveryOrderFormComponent.vue b/resources/assets/vue/components/orders/forms/DeliveryOrderFormComponent.vue index 565cd7c7..96351c90 100644 --- a/resources/assets/vue/components/orders/forms/DeliveryOrderFormComponent.vue +++ b/resources/assets/vue/components/orders/forms/DeliveryOrderFormComponent.vue @@ -263,7 +263,7 @@
Total Weight
-
{{parameters.packing_list.weight}}KG
+
{{(Math.round((parseFloat(parameters.packing_list.weight.toString().replace(",", "")) * parameters.packing_list.quantity + Number.EPSILON) * 10) / 10).toFixed(1)}}KG
diff --git a/resources/assets/vue/components/orders/sections/DeliveryOrdersTableSectionComponent.vue b/resources/assets/vue/components/orders/sections/DeliveryOrdersTableSectionComponent.vue index 205a14cd..9b74b89a 100644 --- a/resources/assets/vue/components/orders/sections/DeliveryOrdersTableSectionComponent.vue +++ b/resources/assets/vue/components/orders/sections/DeliveryOrdersTableSectionComponent.vue @@ -4,9 +4,9 @@
-
+
- +