mirror of
https://bitbucket.org/studiotem/jandl-taskmanager-app.git
synced 2026-10-21 14:29:34 +00:00
168 lines
5.7 KiB
PHP
168 lines
5.7 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Karat;
|
|
|
|
use App\Models\Timesheet;
|
|
use App\Models\User;
|
|
use Carbon\Carbon;
|
|
use Illuminate\Support\Arr;
|
|
use Illuminate\Support\Collection;
|
|
|
|
class KaratService
|
|
{
|
|
private Api $api;
|
|
|
|
public function __construct()
|
|
{
|
|
$this->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) {
|
|
echo $timesheet->id . "\n";
|
|
if ($timesheet->subtask && $timesheet->subtask->mastertask->project)
|
|
$this->syncTimesheet($timesheet);
|
|
});
|
|
}
|
|
|
|
private function syncTimesheet(Timesheet $timesheet) {
|
|
$this->api->setTimesheet($timesheet);
|
|
|
|
$timesheet->synced_to_karat = Carbon::now();
|
|
$timesheet->save();
|
|
}
|
|
|
|
}
|