expense_repo = new ExpenseRepository(); } public function backoff() { // return [5, 10, 30, 240]; return [rand(5, 10), rand(30, 40), rand(60, 79), rand(160, 400)]; } public function handle() { //multiDB environment, need to foreach (MultiDB::$dbs as $db) { MultiDB::setDB($db); nlog("importing expenses from imap-servers"); $a = Account::with('companies')->cursor()->each(function ($account) { $account->companies()->where('expense_import', true)->whereNotNull('expense_mailbox_imap_host')->whereNotNull('expense_mailbox_imap_user')->whereNotNull('expense_mailbox_imap_password')->cursor()->each(function ($company) { $this->handleCompanyImap($company); }); }); } } private function handleCompanyImap(Company $company) { $incommingMails = new IncomingMailHandler($company->expense_mailbox_imap_host, $company->company->expense_mailbox_imap_user, $company->company->expense_mailbox_imap_password); $emails = $incommingMails->getUnprocessedEmails(); foreach ($emails as $mail) { $sender = $mail->getSender(); $vendor = Vendor::where('expense_sender_email', $sender)->orWhere($sender, 'LIKE', "CONCAT('%',expense_sender_email)")->first(); if ($vendor !== null) $vendor = Vendor::where("email", $sender)->first(); // TODO: check email for existing vendor?! $data = [ "vendor_id" => $vendor !== null ? $vendor->id : null, "date" => $mail->getDate(), "public_notes" => $mail->getSubject(), "private_notes" => $mail->getCompleteBodyText(), "documents" => $mail->getAttachments(), // FIXME: https://github.com/ddeboer/imap?tab=readme-ov-file#message-attachments ]; $expense = $this->expense_repo->save($data, ExpenseFactory::create($company->company->id, $company->company->owner()->id)); // TODO: dont assign a new number at beginning // TODO: check for recurring expense?! => maybe replace existing ?! event(new ExpenseWasCreated($expense, $expense->company, Ninja::eventVars(null))); event('eloquent.created: App\Models\Expense', $expense); $mail->markAsSeen(); $incommingMails->moveProcessed($mail); } } }