Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 115
0.00% covered (danger)
0.00%
0 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
UsersImport
0.00% covered (danger)
0.00%
0 / 115
0.00% covered (danger)
0.00%
0 / 6
380
0.00% covered (danger)
0.00%
0 / 1
 chunkSize
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 shouldSaveToDB
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 saveToDB
0.00% covered (danger)
0.00%
0 / 75
0.00% covered (danger)
0.00%
0 / 1
72
 createInstancyAccount
0.00% covered (danger)
0.00%
0 / 10
0.00% covered (danger)
0.00%
0 / 1
12
 updateSubcription
0.00% covered (danger)
0.00%
0 / 27
0.00% covered (danger)
0.00%
0 / 1
30
 sendWelcomeEmail
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace App\Imports;
4
5use App\Events\User\Registered;
6use App\Exceptions\ExpectedException;
7use App\Helpers\FlyMSGLogger;
8use App\Http\Models\Admin\Company;
9use App\Http\Models\Admin\CompanyGroup;
10use App\Http\Models\Auth\Role;
11use App\Http\Models\Auth\User;
12use App\Http\Models\Auth\UserRole;
13use App\Http\Models\Plans;
14use App\Http\Models\SalesProTeamManager;
15use App\Http\Services\InstancyServiceV2;
16use Carbon\Carbon;
17use Illuminate\Support\Str;
18use MongoDB\BSON\UTCDateTime;
19
20class UsersImport extends AbstractImportable
21{
22    /**
23     * Set the chunk size for better performance with large datasets.
24     */
25    public function chunkSize(): int
26    {
27        return 1000; // Example chunk size, adjust as necessary
28    }
29
30    public function shouldSaveToDB(): bool
31    {
32        return true;
33    }
34
35    public function saveToDB(array $row)
36    {
37        $admin = auth()->user();
38
39        $first_name = $row[0] ?? null;
40        $last_name = $row[1] ?? null;
41        $email = $row[2] ?? null;
42        $group_name = $row[3] ?? null;
43        $manager_first_name = $row[4] ?? null;
44        $manager_last_name = $row[5] ?? null;
45        $manager_email = $row[6] ?? null;
46        $plan_name = $row[7] ?? null;
47        $role_1 = $row[8] ?? null;
48        $role_2 = $row[9] ?? null;
49        $role_3 = $row[10] ?? null;
50        $role_4 = $row[11] ?? null;
51
52        $plan = match ($plan_name) {
53            'Sales Pro' => Plans::whereTitle('FlyMSG.io Sales Pro - YR Plan')->first(),
54            'Starter' => Plans::whereTitle('Starter Yearly')->first(),
55            'Growth' => Plans::whereTitle('Growth Yearly')->first(),
56            'Sales Pro Teams - ENT' => Plans::whereTitle('Pro Plan Teams - ENT')->first(),
57            'Sales Pro Teams - SMB' => Plans::whereTitle('Pro Plan Teams - SMB')->first(),
58            default => null,
59        };
60
61        $role_name = role($role_1);
62        $role = Role::where('name', $role_name)->first();
63        if (! $role) {
64            throw new ExpectedException('Role not found: '.$role_name.' '.$role_1.' '.$role_2.' '.$role_3.' '.$role_4);
65        }
66
67        $group = CompanyGroup::where('name', $group_name)->first();
68        if (! $group) {
69            $group = new CompanyGroup([
70                'name' => $group_name,
71            ]);
72            $group->company_id = $admin->company_id;
73            $group->save();
74        }
75
76        $manager = SalesProTeamManager::where('email', $manager_email)->first();
77        if (! $manager) {
78            $manager = new SalesProTeamManager([
79                'first_name' => $manager_first_name,
80                'last_name' => $manager_last_name,
81                'email' => $manager_email,
82            ]);
83            $manager->company_id = $admin->company_id;
84            $manager->company_group_id = $group->id;
85            $manager->save();
86        }
87
88        $user = new User([
89            'first_name' => $first_name,
90            'last_name' => $last_name,
91            'email' => $email,
92            'onboardingv2_presented' => true,
93        ]);
94
95        $password = Str::password(16);
96
97        $user->password = bcrypt($password);
98        $user->company_group_id = $group->id;
99        $user->company_id = $admin->company_id;
100        $user->sales_pro_team_manager_id = $manager->id;
101        $user->imported_by = $admin->id;
102        $user->email_verified_at = new UTCDateTime(now()->getTimestamp() * 1000);
103        $user->save();
104
105        // Revoke all current roles
106        UserRole::where('user_id', $user->id)->delete();
107        // Assign new role
108        UserRole::create([
109            'user_id' => $user->id,
110            'role_id' => $role->id,
111        ]);
112
113        $data = [
114            'email' => $user->email,
115            'first_name' => $user->first_name,
116            'last_name' => $user->last_name,
117        ];
118
119        Registered::dispatch($user, $data);
120
121        try {
122            $this->updateSubcription($user, $plan, $plan_name);
123        } catch (\Throwable $th) {
124            FlyMSGLogger::logError('UsersImport : Failed to update user subscription', $th);
125            // Send this to devs
126        }
127        if (Str::contains($plan_name, 'Pro') || Str::contains($plan_name, 'pro')) {
128            try {
129                $this->createInstancyAccount($user->email);
130            } catch (\Throwable $th) {
131                FlyMSGLogger::logError('UsersImport : Failed to create the users instancy account', $th);
132                // Send this to devs
133            }
134        }
135
136        $this->sendWelcomeEmail($user, $password);
137    }
138
139    private function createInstancyAccount($email)
140    {
141        $instancyService = new InstancyServiceV2;
142
143        $user = User::firstWhere('email', $email);
144        $group = CompanyGroup::find($user->company_group_id);
145        $company = Company::find($user->company_id);
146
147        $groupId = false;
148        if ($company) {
149            $groupId = $company->instancy_id;
150        } elseif ($group) {
151            $groupId = $group->instancy_id;
152        }
153
154        $instancyService->createInstancyUser($email, $groupId);
155    }
156
157    private function updateSubcription($user, $plan, $user_plan_name)
158    {
159        try {
160            if ($user->subscribed('main')) {
161                $user->subscription('main')->cancel();
162            } else {
163                $subscription = $user->subscriptions()->latest()->first();
164                if ($subscription) {
165                    $subscription->update([
166                        'stripe_status' => 'canceled',
167                        'ends_at' => Carbon::now()->toDateTimeString(),
168                    ]);
169                }
170            }
171        } catch (\Throwable $th) {
172            FlyMSGLogger::logError('UsersImport', $th);
173            $subscription = $user->subscriptions()
174                ->latest()
175                ->first();
176            if ($subscription) {
177                $subscription->update([
178                    'stripe_status' => 'canceled',
179                    'ends_at' => Carbon::now()->toDateTimeString(),
180                ]);
181            }
182        }
183
184        // Only sales pro team users
185        $end_date_c = Carbon::now()->addMonths(12)->endOfDay();
186
187        $user->subscriptions()->create([
188            'name' => 'main',
189            'stripe_status' => 'active',
190            'stripe_plan' => $plan->stripe_id,
191            'quantity' => '1',
192            'ends_at' => $end_date_c->toDateTimeString(),
193            'starts_at' => Carbon::now()->startOfDay()->toDateTimeString(),
194        ]);
195    }
196
197    private function sendWelcomeEmail() {}
198}