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 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(); } } } private function removeUsersThatAreNotInKaratAnymore(Collection $karatUsers, Collection $dbUsers) { $emailsInDbThatAreNotInKaratAnymore = $dbUsers->pluck('email')->diff($karatUsers->pluck('email')); User::whereIn('email', $emailsInDbThatAreNotInKaratAnymore)->delete(); } 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 syncProjectsName() { $karatProjects = Project::all(); $dbProjects = \App\Models\Project::all(); // make the array of dbprojects where key is the project code $dbProjectsArray = []; foreach ($dbProjects as $dbProject) { $dbProjectsArray[$dbProject->code] = $dbProject; } // if karat's project name is different than the name in our DB, we update the name in our DB foreach ($karatProjects as $karatProject) { if (isset($dbProjectsArray[$karatProject->code]) && $dbProjectsArray[$karatProject->code]->name !== $karatProject->name) { $dbProjectsArray[$karatProject->code]->name = $karatProject->name; $dbProjectsArray[$karatProject->code]->save(); } } } 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(); } }