api = new Api(); } public function syncVacations() { $intranetVacations = Vacation::fromDate(Carbon::yesterday()->toDateString()); // toto sa pouziva pre delete starych dovoleniek. je to najstarsi datum, ktory mame v produkcnej DB. ak by sme ho tam nemali, API by nevratila stare dovolenky a povazovalo by sa to za vymazanu dovolenku a tym padom by sa to chybne odstranilo z nasej DB $intranetVacationsFromPast = Vacation::fromDate('2023-02-08'); $dbVacations = Blocker::whereIn('type', ['vacation', 'home_office', 'free_day'])->get(); $this->insertVacationsFromIntranet($intranetVacations, $dbVacations); $this->checkIfVacationsGotAprroved($intranetVacations); $this->deleteVacations($intranetVacationsFromPast, $dbVacations); } private function insertVacationsFromIntranet(Collection $intranetVacations, Collection $dbVacations) { $vacationsToSkip = $dbVacations->pluck('intranet_id')->intersect($intranetVacations->pluck('intranet_id')); $intranetVacationsToInsert = $intranetVacations->reject(function ($item) use ($vacationsToSkip) { return $vacationsToSkip->contains($item->intranet_id); })->map(function ($item) { $arrayToInsert = $item->toArray(); $arrayToInsert['created_at'] = Carbon::now()->toDateTimeString(); $arrayToInsert['updated_at'] = Carbon::now()->toDateTimeString(); return $arrayToInsert; }); Blocker::insert($intranetVacationsToInsert->toArray()); } private function checkIfVacationsGotAprroved(Collection $intranetVacations) { $notApprovedDBVacations = Blocker::whereIn('type', ['vacation', 'home_office', 'free_day'])->where('approved', false)->get(); // filter vacations from intranet with approved parameter to be true $approvedVacations = $intranetVacations->filter(function ($item) { return $item->approved === true; }); $vacationsToApprove = $approvedVacations->filter(function ($item) use ($notApprovedDBVacations) { return $notApprovedDBVacations->contains('intranet_id', $item->intranet_id); }); // get intranet_id from vacations to approve and update them in db $vacationsToApproveIds = $vacationsToApprove->map(function ($item) { return $item->intranet_id; }); // mass update in DB Blocker::whereIn('intranet_id', $vacationsToApproveIds)->update(['approved' => true]); } private function deleteVacations(Collection $intranetVacations, Collection $dbVacations) { $vacationsToDelete = $dbVacations->reject(function ($item) use ($intranetVacations) { return $intranetVacations->pluck('intranet_id')->contains($item->intranet_id); }); $vacationsToDeleteIds = $vacationsToDelete->pluck('id'); Blocker::destroy($vacationsToDeleteIds->toArray()); } }