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/app/Models/Exchange/Company.php b/app/Models/Exchange/Company.php
new file mode 100644
index 00000000..fc85080c
--- /dev/null
+++ b/app/Models/Exchange/Company.php
@@ -0,0 +1,36 @@
+belongsToMany(User::class, (new Employee())->getTable(), 'company_id','user_id');
+ }
+
+}
+
+
+
diff --git a/app/Models/Exchange/Employee.php b/app/Models/Exchange/Employee.php
new file mode 100644
index 00000000..b310f078
--- /dev/null
+++ b/app/Models/Exchange/Employee.php
@@ -0,0 +1,37 @@
+HasMany(Company::class, 'company_id', 'id');
+ }
+
+ /**
+ * @return \Illuminate\Database\Eloquent\Relations\HasOne
+ **/
+ public function user(): HasOne
+ {
+ return $this->hasOne(User::class, 'user_id', 'id');
+ }
+}
diff --git a/app/Models/Exchange/User.php b/app/Models/Exchange/User.php
new file mode 100644
index 00000000..cc102ba2
--- /dev/null
+++ b/app/Models/Exchange/User.php
@@ -0,0 +1,19 @@
+belongsToMany(Company::class, (new Employee())->getTable(), 'user_id', 'company_id');
+ }
+}
diff --git a/config/database.php b/config/database.php
index 4e8bc250..8b5c199f 100644
--- a/config/database.php
+++ b/config/database.php
@@ -82,7 +82,25 @@ return [
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
-
+ 'exchange_db' => [
+ 'driver' => 'mysql',
+ 'url' => env('DATABASE_URL'),
+ 'host' => env('DB_HOST', '127.0.0.1'),
+ 'port' => env('DB_PORT', '3306'),
+ 'database' => env('DB_DATABASE_EXCHANGE', 'forge'),
+ 'username' => env('DB_USERNAME', 'forge'),
+ 'password' => env('DB_PASSWORD', ''),
+ 'unix_socket' => env('DB_SOCKET_IZYIM', ''),
+ 'charset' => 'utf8mb4',
+ 'collation' => 'utf8mb4_unicode_ci',
+ 'prefix' => '',
+ 'prefix_indexes' => true,
+ 'strict' => true,
+ 'engine' => null,
+ 'options' => extension_loaded('pdo_mysql') ? array_filter([
+ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
+ ]) : [],
+ ],
'pgsql' => [
'driver' => 'pgsql',
'url' => env('DATABASE_URL'),
diff --git a/database/seeders/CompanyEmployeesTableSeeder.php b/database/seeders/CompanyEmployeesTableSeeder.php
new file mode 100644
index 00000000..40473ed1
--- /dev/null
+++ b/database/seeders/CompanyEmployeesTableSeeder.php
@@ -0,0 +1,76 @@
+assignEmployeeProcessor = $assignEmployeeProcessor;
+ }
+
+
+ /**
+ * Run the database seeds.
+ *
+ * @return void
+ * @throws \App\Classes\Exceptions\AccessForbiddenException
+ * @throws \App\Classes\Exceptions\MalformedRequestException
+ * @throws \App\Classes\Exceptions\RequestValidationException
+ */
+ public function run()
+ {
+ DB::beginTransaction();
+ foreach(ExchangeCompany::all() as $company) {
+
+ if($connection = CompanyConnection::where('invitee_reference', $company->reference)->first()){
+
+ $companyModule = $connection->invitee;
+
+ if($companyModule->employees()->exists()) {
+ continue;
+ }
+
+ $exchangeUser = $company->employees()->first();
+
+ if(User::where('email', '=', $exchangeUser->email)->count()){
+ continue;
+ }
+
+ $user = new User();
+ $user->name = $exchangeUser->name;
+ $user->email = $exchangeUser->email;
+ $user->password = $exchangeUser->password;
+ $user->type = $exchangeUser->type;
+ $user->status = $exchangeUser->status;
+
+ $user->save();
+
+ $Object = new EmploymentObject($companyModule, $user);
+
+ $this->assignEmployeeProcessor->execute($Object);
+ }
+
+ }
+ DB::commit();
+
+
+ }
+
+}
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 @@
+
+ Personal Information
+