api = new Api(); } public function syncVacations() { $intranetVacations = Vacation::fromDate(Carbon::yesterday()->toDateString()); $dbVacations = Blocker::whereIn('type', ['vacation', 'home_office', 'free_day'])->get(); $this->insertVacationsFromIntranet($intranetVacations, $dbVacations); $this->checkIfVacationsGotAprroved($intranetVacations); } 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]); } }