api = new Api(); } public function syncUsers() { $karatUsers = \App\Services\Karat\User::all(); $dbUsers = User::withTrashed()->get(); $this->insertUsersFromKarat($karatUsers, $dbUsers); $this->updateUserNamesFromKarat($karatUsers, $dbUsers); $this->removeUsersThatAreNotInKaratAnymore($karatUsers, $dbUsers); } private function insertUsersFromKarat(Collection $karatUsers, Collection $dbUsers) { $emailsToSkip = $dbUsers->pluck('email' )->intersect( $karatUsers->pluck('email')); $karatUsersToInsert = $karatUsers->reject(function ($item) use ($emailsToSkip) { return $emailsToSkip->contains($item->email); })->map(function ($item) { $arrayToInsert = $item->toArray(); $arrayToInsert['created_at'] = Carbon::now()->toDateTimeString(); $arrayToInsert['updated_at'] = Carbon::now()->toDateTimeString(); return $arrayToInsert; }); User::insert($karatUsersToInsert->toArray()); } private function removeUsersThatAreNotInKaratAnymore( Collection $karatUsers, Collection $dbUsers ) { $emailsInDbThatAreNotInKaratAnymore = $dbUsers->pluck('email' )->diff( $karatUsers->pluck('email')); User::whereIn('email', $emailsInDbThatAreNotInKaratAnymore)->delete(); } private function updateUserNamesFromKarat(Collection $karatUsers, Collection $dbUsers) { foreach ( $karatUsers as $karatUser ) { $dbUser = User::where('email', $karatUser->email)->first(); if (!$dbUser) { continue; } if ($dbUser->lastname !== $karatUser->lastname || $dbUser->firstname !== $karatUser->firstname) { $dbUser->firstname = $karatUser->firstname; $dbUser->lastname = $karatUser->lastname; $dbUser->save(); } } } public function syncClients() { $karatClients = Client::all(); $dbClients = \App\Models\Client::all(); $this->insertClientsFromKarat($karatClients, $dbClients); $this->removeClientsThatAreNotInKaratAnymore($karatClients, $dbClients); } private function insertClientsFromKarat( Collection $karatClients, Collection $dbClients ) { $clientsToSkip = $dbClients->pluck('code' )->intersect( $karatClients->pluck('code')); $karatClientsToInsert = $karatClients->reject(function ($item) use ($clientsToSkip) { return $clientsToSkip->contains($item->code); })->map(function ($item) { $arrayToInsert = $item->toArray(); $arrayToInsert['created_at'] = Carbon::now()->toDateTimeString(); $arrayToInsert['updated_at'] = Carbon::now()->toDateTimeString(); return $arrayToInsert; }); \App\Models\Client::insert($karatClientsToInsert->toArray()); } private function removeClientsThatAreNotInKaratAnymore( Collection $karatClients, Collection $dbClients ) { $codesInDbThatAreNotInKaratAnymore = $dbClients->pluck('code' )->diff( $karatClients->pluck('code')); \App\Models\Client::whereIn('code', $codesInDbThatAreNotInKaratAnymore)->delete(); } public function syncProjects() { $karatProjects = Project::all(); $dbProjects = \App\Models\Project::all(); // ked sa to davalo naraz, tak to padalo na Prepared statement contains too many placeholders $karatProjects->chunk(300)->each(function ($chunk) use ($dbProjects) { $this->insertProjectsFromKarat($chunk, $dbProjects); }); $this->removeProjectsThatAreNotInKaratAnymore($karatProjects, $dbProjects); } private function insertProjectsFromKarat( Collection $karatProjects, Collection $dbProjects ) { $projectsToSkip = $dbProjects->pluck('code' )->intersect( $karatProjects->pluck('code')); $karatProjectsToInsert = $karatProjects->reject(function ($item) use ($projectsToSkip) { return $projectsToSkip->contains($item->code); })->map(function ($item) { $arrayToInsert = $item->toArray(); $dbClient = \App\Models\Client::where('code', $item->client_id)->first(); $arrayToInsert['created_at'] = Carbon::now()->toDateTimeString(); $arrayToInsert['updated_at'] = Carbon::now()->toDateTimeString(); $arrayToInsert['client_id'] = ($dbClient) ? $dbClient->id : null; // $arrayToInsert['client_id'] = 12; return $arrayToInsert; }); \App\Models\Project::insert($karatProjectsToInsert->toArray()); } private function removeProjectsThatAreNotInKaratAnymore( Collection $karatProjects, Collection $dbProjects ) { $codesInDbThatAreNotInKaratAnymore = $dbProjects->pluck('code' )->diff( $karatProjects->pluck('code')); \App\Models\Project::whereIn('code', $codesInDbThatAreNotInKaratAnymore)->delete(); } public function syncTimesheets() { $notSyncedTimesheets = Timesheet::whereNull('synced_to_karat')->get(); $notSyncedTimesheets->each(function ($timesheet) { if ($timesheet->subtask && $timesheet->subtask->mastertask->project) $this->syncTimesheet($timesheet); else echo "Timesheet with id: " . $timesheet->id . " has no project, subtask or mastertask" . PHP_EOL; }); } private function syncTimesheet(Timesheet $timesheet) { $this->api->setTimesheet($timesheet); $timesheet->synced_to_karat = Carbon::now(); $timesheet->save(); } }