invoiceRepository = new InvoiceRepository($invoice); $invoiceSetting = new InvoiceSetting; $invoiceSettingRepository = new InvoiceSettingRepository($invoiceSetting); $this->invoiceSettingService = new InvoiceSettingService($this->invoiceRepository, $invoiceSettingRepository); } public function __invoke() { $startOfMonth = now()->startOfMonth()->toDateString(); $lastOfMonth = now()->lastOfMonth()->toDateString(); $users = DB::select(DB::raw(" select users.id, users.first_name, incentives.target_rule, incentives.description, incentives.amount_value_earned, count(videos.id) videos_count from studio_plus_videos videos left join studio_plus_channels channels on channels.id = videos.studio_plus_channel_id left join users on users.id = channels.user_id left join studio_plus_asins asins on asins.id = videos.studio_plus_asin_id inner join studio_plus_incentive_asins IA on IA.studio_plus_asin_id = asins.id left join studio_plus_incentives incentives on IA.studio_plus_incentive_id = incentives.id left join studio_plus_incentive_categories categories on categories.id = incentives.incentive_category_id where videos.created_at between '{$startOfMonth}' and '{$lastOfMonth}' and categories.name like '%Video Upload Bonus%' and videos.status like '%Published To Amazon%' group by users.id, users.first_name, incentives.target_rule, incentives.description, incentives.amount_value_earned having videos_count > incentives.target_rule; ")); $this->addIncentiveItem($users); } private function addIncentiveItem(array $users): void { foreach ($users as $user) { $newUser = User::query() ->where('id', $user->id) ->first(); $latestInvoiceNumber = $this->invoiceSettingService->getLatestInvoiceNumber($newUser); $invoice = $this->invoiceRepository->getInvoiceOfMonth($newUser, $latestInvoiceNumber); $invoice->items()->updateOrCreate( [ 'description' => $user->description, ], [ 'item_no' => 1, 'name' => 'Video Incentives Bonus', 'amount' => $user->amount_value_earned, 'quantity' => 1, 'issue_date' => now()->toDateString(), ] ); } } }