diff --git a/app/Classes/Modules/Accounts/ControllersLogic/CreateInvitedCustomerLogic.php b/app/Classes/Modules/Accounts/ControllersLogic/CreateInvitedCustomerLogic.php
new file mode 100644
index 00000000..ebd4587e
--- /dev/null
+++ b/app/Classes/Modules/Accounts/ControllersLogic/CreateInvitedCustomerLogic.php
@@ -0,0 +1,105 @@
+ 'Created User',
+ 'message' => 'You have successfully created a new User'
+ ];
+ }
+
+ /** @var CreateUserProcessor */
+ private $createUserProcessor;
+
+ /** @var CreateContactProcessor */
+ private $createContactProcessor;
+
+ /** @var FetchesCompany */
+ private $fetchesCompany;
+
+ /** @var AssignEmployeeProcessor */
+ private $assignEmployeeProcessor;
+
+ /** @var AuthenticationProcessor */
+ private $authenticationProcessor;
+
+
+ /**
+ * CreateInvitedCustomerLogic constructor.
+ * @param CreateUserProcessor $createUserProcessor
+ * @param CreateContactProcessor $createContactProcessor
+ * @param FetchesCompany $fetchesCompany
+ * @param AssignEmployeeProcessor $assignEmployeeProcessor
+ * @param AuthenticationProcessor $authenticationProcessor
+ */
+ public function __construct(CreateUserProcessor $createUserProcessor, CreateContactProcessor $createContactProcessor, FetchesCompany $fetchesCompany, AssignEmployeeProcessor $assignEmployeeProcessor, AuthenticationProcessor $authenticationProcessor)
+ {
+ $this->createUserProcessor = $createUserProcessor;
+ $this->createContactProcessor = $createContactProcessor;
+ $this->fetchesCompany = $fetchesCompany;
+ $this->assignEmployeeProcessor = $assignEmployeeProcessor;
+ $this->authenticationProcessor = $authenticationProcessor;
+ }
+
+ /**
+ * @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 Company $company */
+ $company = $this->fetchesCompany->execute(['id' => $request->input('company_id')]);
+
+ /** @var CompanyModule $companyModule */
+ $companyModule = $company->companyModules()->first();
+
+ if($companyModule->employees()->exists()){
+ throw new AccessForbiddenException('This company\'s account has been claimed by another user already!');
+ }
+
+ /** @var User $user */
+ $user = $this->createUserProcessor->execute($request, RoleTypes::USER, !App::environment(['production']) ? ApprovalStatus::APPROVED : ApprovalStatus::PENDING_VERIFICATION);
+
+ $contactObject = new ContactObject($request->input('name'), $request->input('phone'), $request->input('contact_email'), $request->input('wechat_id'));
+
+ $this->createContactProcessor->execute($contactObject, $company);
+
+ $Object = new EmploymentObject($companyModule, $user);
+
+ $this->assignEmployeeProcessor->execute($Object);
+
+ return $this->response($this->authenticationProcessor->execute($request));
+ }
+}
diff --git a/app/Http/Controllers/Accounts/CreateInvitedCustomerController.php b/app/Http/Controllers/Accounts/CreateInvitedCustomerController.php
new file mode 100644
index 00000000..dce70e1e
--- /dev/null
+++ b/app/Http/Controllers/Accounts/CreateInvitedCustomerController.php
@@ -0,0 +1,20 @@
+execute($request);
+ }
+}
\ No newline at end of file
diff --git a/app/Http/Resources/CompanyResource.php b/app/Http/Resources/CompanyResource.php
index 702319aa..cae286b9 100644
--- a/app/Http/Resources/CompanyResource.php
+++ b/app/Http/Resources/CompanyResource.php
@@ -11,6 +11,7 @@ use App\Models\CompanyModule;
use App\Models\Currency;
use App\Models\SegmentConstant;
use Illuminate\Http\Resources\Json\JsonResource;
+use Illuminate\Support\Facades\Crypt;
class CompanyResource extends JsonResource
{
@@ -25,6 +26,7 @@ class CompanyResource extends JsonResource
$companyModule = $this->companyModules()->where('type', '=', BusinessType::IMPORTER)->first();
return [
'id' => $this->id,
+ 'hash_id' => Crypt::encryptString($this->id),
'name' => $this->name,
'reference' => $this->reference,
'type' => (int) $this->type,
diff --git a/resources/assets/vue/components/accounts/forms/InviteRegistrationFormComponent.vue b/resources/assets/vue/components/accounts/forms/InviteRegistrationFormComponent.vue
new file mode 100644
index 00000000..9b8af5ea
--- /dev/null
+++ b/resources/assets/vue/components/accounts/forms/InviteRegistrationFormComponent.vue
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/assets/vue/components/accounts/forms/RegistrationCheckEmailFormComponent.vue b/resources/assets/vue/components/accounts/forms/RegistrationCheckEmailFormComponent.vue
index e96c3f46..04a74241 100644
--- a/resources/assets/vue/components/accounts/forms/RegistrationCheckEmailFormComponent.vue
+++ b/resources/assets/vue/components/accounts/forms/RegistrationCheckEmailFormComponent.vue
@@ -38,7 +38,6 @@
\ No newline at end of file
diff --git a/resources/assets/vue/general/mixins/accounts/validation/inviteRegistrationFormValidation.js b/resources/assets/vue/general/mixins/accounts/validation/inviteRegistrationFormValidation.js
new file mode 100644
index 00000000..7879ff6d
--- /dev/null
+++ b/resources/assets/vue/general/mixins/accounts/validation/inviteRegistrationFormValidation.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: required
+ },
+ email: {
+ required: required,
+ email
+ },
+ phone: {
+ required: required,
+ numeric
+ },
+ password: {
+ required: required,
+ },
+ password_confirmation: {
+ required: required,
+ sameAs: sameAs('password')
+ }
+ }
+ },
+ mixins: [authenticationHandler]
+}
\ No newline at end of file
diff --git a/resources/assets/vue/general/mixins/guards.js b/resources/assets/vue/general/mixins/guards.js
index 18681e5d..ffa96e7d 100644
--- a/resources/assets/vue/general/mixins/guards.js
+++ b/resources/assets/vue/general/mixins/guards.js
@@ -5,7 +5,10 @@ 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')];
+ const unprotectedRoutes = [this.route('login'), this.route('account.email.verification'), this.route('company.claim')];
+ if(window.location.href.indexOf(this.route('company.claim')) === 0) {
+ return false;
+ }
return !unprotectedRoutes.includes(window.location.href);
},
isWithTokenRoute(){
diff --git a/resources/assets/vue/general/mixins/stepNavi.js b/resources/assets/vue/general/mixins/stepNavi.js
deleted file mode 100644
index a3c05a0d..00000000
--- a/resources/assets/vue/general/mixins/stepNavi.js
+++ /dev/null
@@ -1,22 +0,0 @@
-export default {
- methods: {
- changeStep(direction) {
- this.status.direction = direction;
-
- if (direction === 'next') {
-
- if (this.validate()) {
- //this.step += 1;
- this.status.email = this.parameters.email;
- this.$emit('updateStatus', this.status);
- }
- return;
- }
- this.$emit('updateStatus', this.status);
- this.$v.$reset();
- },
- },
- beforeDestroy: function (event) {
- },
-
-}
\ No newline at end of file
diff --git a/resources/views/pages/accounts/claim_business.blade.php b/resources/views/pages/accounts/claim_business.blade.php
new file mode 100644
index 00000000..645b8e5f
--- /dev/null
+++ b/resources/views/pages/accounts/claim_business.blade.php
@@ -0,0 +1,23 @@
+@extends('layouts.base_login')
+
+@section('inner_content')
+
+
+
+
+
}})
+
+
+
+
+
+@endsection
\ No newline at end of file
diff --git a/routes/account.php b/routes/account.php
index 7a9e08df..ff6a9960 100644
--- a/routes/account.php
+++ b/routes/account.php
@@ -5,6 +5,7 @@ use Illuminate\Support\Facades\Route;
Route::group(['prefix' => 'account', 'namespace' => 'Accounts', 'as' => 'account.'], function () {
Route::post('/registration', 'CreateCustomerController@create')->name('registration.register');
+ Route::post('/invite/registration', 'CreateInvitedCustomerController@create')->name('registration.invite.register');
Route::group(['prefix' => 'authentication', 'as' => 'authentication.'], function () {
Route::group(['prefix' => 'login', 'as' => 'authenticate.'], function () {
diff --git a/routes/web.php b/routes/web.php
index 2eb2bcbb..0e1b6593 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -6,6 +6,7 @@ use App\Classes\Jobs\FetchLoadedContainersFromVTPortalJob;
use App\Classes\Jobs\FetchPackingListFromVTPortalJob;
use App\Classes\Jobs\FetchWarehouseReceiveListFromVTPortalJob;
use App\Models\CompanyConnection;
+use Illuminate\Support\Facades\Crypt;
use Illuminate\Support\Facades\Route;
/*
@@ -21,9 +22,9 @@ use Illuminate\Support\Facades\Route;
require __DIR__ . '/template.php';
-Route::get('/', function () {
- return view('welcome');
-});
+Route::get('', function () {
+ return view('pages.accounts.login');
+})->name('login');
Route::group(['prefix' => 'swagger'], function () {
Route::get('/', function () {
@@ -34,9 +35,9 @@ Route::group(['prefix' => 'swagger'], function () {
});
});
-Route::get('', function () {
- return view('pages.accounts.login');//temporary showing welcome page.
-})->name('login');
+Route::get('/business/claim/{hash}', function ($hash) {
+ return view('pages.accounts.claim_business', ['id' => Crypt::decryptString($hash)]);
+})->name('company.claim');
Route::get('/account/email/verification/{token}', function ($token) {
return view('pages.accounts.email_verified', ['token' => $token]);