public function sendTo($toEmail, $fromEmail, $fromName, $subject, $view, $data = []) { // https://github.com/wildbit/laravel-postmark-provider/issues/2 if (isset($data['invoice_id']) && isset($_ENV['POSTMARK_API_TOKEN'])) { $views = 'emails.' . $view . '_html'; } else { $views = ['emails.' . $view . '_html', 'emails.' . $view . '_text']; } try { Mail::send($views, $data, function ($message) use($toEmail, $fromEmail, $fromName, $subject, $data) { $toEmail = strtolower($toEmail); $replyEmail = $fromEmail; $fromEmail = CONTACT_EMAIL; $message->to($toEmail)->from($fromEmail, $fromName)->replyTo($replyEmail, $fromName)->subject($subject); if (isset($data['invoice_id'])) { $invoice = Invoice::with('account')->where('id', '=', $data['invoice_id'])->first(); if ($invoice->account->pdf_email_attachment && file_exists($invoice->getPDFPath())) { $message->attach($invoice->getPDFPath(), array('as' => $invoice->getFileName(), 'mime' => 'application/pdf')); } } }); return true; } catch (Exception $exception) { Utils::logError('Email Error: ' . $exception->getMessage()); if (isset($_ENV['POSTMARK_API_TOKEN'])) { $response = $exception->getResponse()->getBody()->getContents(); $response = json_decode($response); return nl2br($response->Message); } else { return $exception->getMessage(); } } }
public function fire() { $this->info(date('Y-m-d') . ' Running SendRecurringInvoices...'); $today = new DateTime(); $invoices = Invoice::with('account.timezone', 'invoice_items', 'client', 'user')->whereRaw('is_deleted IS FALSE AND deleted_at IS NULL AND is_recurring IS TRUE AND frequency_id > 0 AND start_date <= ? AND (end_date IS NULL OR end_date >= ?)', [$today, $today])->orderBy('id', 'asc')->get(); $this->info(count($invoices) . ' recurring invoice(s) found'); foreach ($invoices as $recurInvoice) { $shouldSendToday = $recurInvoice->shouldSendToday(); $this->info('Processing Invoice ' . $recurInvoice->id . ' - Should send ' . ($shouldSendToday ? 'YES' : 'NO')); if (!$shouldSendToday) { continue; } $recurInvoice->account->loadLocalizationSettings($recurInvoice->client); $invoice = $this->invoiceRepo->createRecurringInvoice($recurInvoice); if ($invoice && !$invoice->isPaid()) { $this->info('Sending Invoice'); $this->mailer->sendInvoice($invoice); } } $delayedAutoBillInvoices = Invoice::with('account.timezone', 'recurring_invoice', 'invoice_items', 'client', 'user')->whereRaw('is_deleted IS FALSE AND deleted_at IS NULL AND is_recurring IS FALSE AND balance > 0 AND due_date = ? AND recurring_invoice_id IS NOT NULL', [$today->format('Y-m-d')])->orderBy('invoices.id', 'asc')->get(); $this->info(count($delayedAutoBillInvoices) . ' due recurring invoice instance(s) found'); /** @var Invoice $invoice */ foreach ($delayedAutoBillInvoices as $invoice) { if ($invoice->isPaid()) { continue; } if ($invoice->getAutoBillEnabled() && $invoice->client->autoBillLater()) { $this->info('Processing Autobill-delayed Invoice ' . $invoice->id); $this->paymentService->autoBillInvoice($invoice); } } $this->info('Done'); }
public function sendTo($toEmail, $fromEmail, $fromName, $subject, $view, $data = []) { $views = ['emails.' . $view . '_html', 'emails.' . $view . '_text']; try { Mail::send($views, $data, function ($message) use($toEmail, $fromEmail, $fromName, $subject, $data) { $replyEmail = $fromEmail; $fromEmail = CONTACT_EMAIL; if (isset($data['invoice_id'])) { $invoice = Invoice::with('account')->where('id', '=', $data['invoice_id'])->get()->first(); if ($invoice->account->pdf_email_attachment && file_exists($invoice->getPDFPath())) { $message->attach($invoice->getPDFPath(), array('as' => $invoice->getFileName(), 'mime' => 'application/pdf')); } } $message->to($toEmail)->from($fromEmail, $fromName)->replyTo($replyEmail, $fromName)->subject($subject); }); return true; } catch (Exception $exception) { if (method_exists($exception, 'getResponse')) { $response = $exception->getResponse()->getBody()->getContents(); $response = json_decode($response); return nl2br($response->Message); } else { return $exception->getMessage(); } } }
public function fire() { $this->info(date('Y-m-d') . ' Running SendRecurringInvoices...'); $today = new DateTime(); $invoices = Invoice::with('account.timezone', 'invoice_items', 'client', 'user')->whereRaw('is_deleted IS FALSE AND deleted_at IS NULL AND is_recurring IS TRUE AND frequency_id > 0 AND start_date <= ? AND (end_date IS NULL OR end_date >= ?)', array($today, $today))->get(); $this->info(count($invoices) . ' recurring invoice(s) found'); foreach ($invoices as $recurInvoice) { $recurInvoice->account->loadLocalizationSettings($recurInvoice->client); $this->info('Processing Invoice ' . $recurInvoice->id . ' - Should send ' . ($recurInvoice->shouldSendToday() ? 'YES' : 'NO')); $invoice = $this->invoiceRepo->createRecurringInvoice($recurInvoice); if ($invoice && !$invoice->isPaid()) { $this->mailer->sendInvoice($invoice); } } $this->info('Done'); }
public function sendTo($toEmail, $fromEmail, $fromName, $subject, $view, $data = []) { $views = ['emails.' . $view . '_html', 'emails.' . $view . '_text']; Mail::send($views, $data, function ($message) use($toEmail, $fromEmail, $fromName, $subject, $data) { $replyEmail = $fromEmail; $fromEmail = NINJA_FROM_EMAIL; if (isset($data['invoice_id'])) { $invoice = Invoice::with('account')->where('id', '=', $data['invoice_id'])->get()->first(); if ($invoice->account->pdf_email_attachment && file_exists($invoice->getPDFPath())) { $message->attach($invoice->getPDFPath(), array('as' => $invoice->getFileName(), 'mime' => 'application/pdf')); } } //$message->setEncoder(\Swift_Encoding::get8BitEncoding()); $message->to($toEmail)->from($fromEmail, $fromName)->replyTo($replyEmail, $fromName)->subject($subject); }); }
public function sendTo($toEmail, $fromEmail, $fromName, $subject, $view, $data = []) { $views = ['emails.' . $view . '_html', 'emails.' . $view . '_text']; Mail::send($views, $data, function ($message) use($toEmail, $fromEmail, $fromName, $subject, $data) { $replyEmail = $fromEmail; // http://stackoverflow.com/questions/2421234/gmail-appearing-to-ignore-reply-to if (Utils::isNinja() && $toEmail != CONTACT_EMAIL) { $fromEmail = NINJA_FROM_EMAIL; } if (isset($data['invoice_id'])) { $invoice = Invoice::with('account')->where('id', '=', $data['invoice_id'])->get()->first(); if ($invoice->account->pdf_email_attachment && file_exists($invoice->getPDFPath())) { $message->attach($invoice->getPDFPath(), array('as' => $invoice->getFileName(), 'mime' => 'application/pdf')); } } //$message->setEncoder(\Swift_Encoding::get8BitEncoding()); $message->to($toEmail)->from($fromEmail, $fromName)->replyTo($replyEmail, $fromName)->subject($subject); }); }
public function bulk() { $action = Input::get('bulk_action') ?: Input::get('action'); $ids = Input::get('bulk_public_id') ?: (Input::get('public_id') ?: Input::get('ids')); if ($action == 'convert') { $invoice = Invoice::with('invoice_items')->scope($ids)->firstOrFail(); $clone = $this->invoiceService->approveQuote($invoice); Session::flash('message', trans('texts.converted_to_invoice')); return Redirect::to('invoices/' . $clone->public_id); } $count = $this->invoiceService->bulk($ids, $action); if ($count > 0) { $key = $action == 'markSent' ? "updated_quote" : "{$action}d_quote"; $message = Utils::pluralize($key, $count); Session::flash('message', $message); } if ($action == 'restore' && $count == 1) { return Redirect::to("quotes/" . Utils::getFirst($ids)); } else { return Redirect::to("quotes"); } }
public static function updateInvoice($invoice) { $client = $invoice->client; if ($invoice->is_deleted && !$invoice->getOriginal('is_deleted')) { $adjustment = 0; if (!$invoice->is_quote && !$invoice->is_recurring) { $adjustment = $invoice->balance * -1; $client->balance = $client->balance - $invoice->balance; $client->paid_to_date = $client->paid_to_date - ($invoice->amount - $invoice->balance); $client->save(); } $activity = Activity::getBlank(); $activity->client_id = $invoice->client_id; $activity->invoice_id = $invoice->id; $activity->activity_type_id = $invoice->is_quote ? ACTIVITY_TYPE_DELETE_QUOTE : ACTIVITY_TYPE_DELETE_INVOICE; $activity->message = Utils::encodeActivity(Auth::user(), 'deleted', $invoice); $activity->balance = $invoice->client->balance; $activity->adjustment = $adjustment; $activity->save(); } else { $diff = floatval($invoice->amount) - floatval($invoice->getOriginal('amount')); $fieldChanged = false; foreach (['invoice_number', 'po_number', 'invoice_date', 'due_date', 'terms', 'public_notes', 'invoice_footer', 'partial'] as $field) { if ($invoice->{$field} != $invoice->getOriginal($field)) { $fieldChanged = true; break; } } if ($diff != 0 || $fieldChanged) { $backupInvoice = Invoice::with('invoice_items', 'client.account', 'client.contacts')->find($invoice->id); if ($diff != 0 && !$invoice->is_quote && !$invoice->is_recurring) { $client->balance = $client->balance + $diff; $client->save(); } $activity = Activity::getBlank($invoice); $activity->client_id = $invoice->client_id; $activity->invoice_id = $invoice->id; $activity->activity_type_id = $invoice->is_quote ? ACTIVITY_TYPE_UPDATE_QUOTE : ACTIVITY_TYPE_UPDATE_INVOICE; $activity->message = Utils::encodeActivity(Auth::user(), 'updated', $invoice); $activity->balance = $client->balance; $activity->adjustment = $invoice->is_quote || $invoice->is_recurring ? 0 : $diff; $activity->json_backup = $backupInvoice->hidePrivateFields()->toJSON(); $activity->save(); if ($invoice->isPaid() && $invoice->balance > 0) { $invoice->invoice_status_id = INVOICE_STATUS_PARTIAL; } } } }
public function convertQuote($publicId) { $invoice = Invoice::with('invoice_items')->scope($publicId)->firstOrFail(); $clone = $this->invoiceService->approveQuote($invoice); Session::flash('message', trans('texts.converted_to_invoice')); return Redirect::to('invoices/' . $clone->public_id); }
public function updatedQuote(QuoteWasUpdated $event) { if (!$event->quote->isChanged()) { return; } $backupQuote = Invoice::with('invoice_items', 'client.account', 'client.contacts')->find($event->quote->id); $activity = $this->activityRepo->create($event->quote, ACTIVITY_TYPE_UPDATE_QUOTE); $activity->json_backup = $backupQuote->hidePrivateFields()->toJSON(); $activity->save(); }
public function bulk() { $action = Input::get('action'); if ($action == 'convert') { $invoice = Invoice::with('invoice_items')->scope(Input::get('id'))->firstOrFail(); $clone = $this->invoiceRepo->cloneInvoice($invoice, $invoice->id); Session::flash('message', trans('texts.converted_to_invoice')); return Redirect::to('invoices/' . $clone->public_id); } $statusId = Input::get('statusId'); $ids = Input::get('id') ? Input::get('id') : Input::get('ids'); $count = $this->invoiceRepo->bulk($ids, $action, $statusId); if ($count > 0) { $key = $action == 'mark' ? "updated_quote" : "{$action}d_quote"; $message = Utils::pluralize($key, $count); Session::flash('message', $message); } return Redirect::to('quotes'); }
public function bulk() { $action = Input::get('bulk_action') ?: Input::get('action'); $ids = Input::get('bulk_public_id') ?: (Input::get('public_id') ?: Input::get('ids')); if ($action == 'convert') { $invoice = Invoice::with('invoice_items')->scope($ids)->firstOrFail(); $clone = $this->invoiceService->convertQuote($invoice); Session::flash('message', trans('texts.converted_to_invoice')); return Redirect::to('invoices/' . $clone->public_id); } $count = $this->invoiceService->bulk($ids, $action); if ($count > 0) { $key = $action == 'markSent' ? 'updated_quote' : "{$action}d_quote"; $message = Utils::pluralize($key, $count); Session::flash('message', $message); } return $this->returnBulk(ENTITY_QUOTE, $action, $ids); }
public function fire() { $this->info(date('Y-m-d') . ' Running SendRecurringInvoices...'); $today = new DateTime(); $invoices = Invoice::with('account.timezone', 'invoice_items', 'client', 'user')->whereRaw('is_deleted IS FALSE AND deleted_at IS NULL AND is_recurring IS TRUE AND start_date <= ? AND (end_date IS NULL OR end_date >= ?)', array($today, $today))->get(); $this->info(count($invoices) . ' recurring invoice(s) found'); foreach ($invoices as $recurInvoice) { if ($recurInvoice->client->deleted_at) { continue; } if (!$recurInvoice->user->confirmed) { continue; } $this->info('Processing Invoice ' . $recurInvoice->id . ' - Should send ' . ($recurInvoice->shouldSendToday() ? 'YES' : 'NO')); if (!$recurInvoice->shouldSendToday()) { continue; } $invoice = Invoice::createNew($recurInvoice); $invoice->client_id = $recurInvoice->client_id; $invoice->recurring_invoice_id = $recurInvoice->id; $invoice->invoice_number = $recurInvoice->account->getNextInvoiceNumber(false, 'R'); $invoice->amount = $recurInvoice->amount; $invoice->balance = $recurInvoice->amount; $invoice->invoice_date = date_create()->format('Y-m-d'); $invoice->discount = $recurInvoice->discount; $invoice->po_number = $recurInvoice->po_number; $invoice->public_notes = Utils::processVariables($recurInvoice->public_notes); $invoice->terms = Utils::processVariables($recurInvoice->terms); $invoice->invoice_footer = Utils::processVariables($recurInvoice->invoice_footer); $invoice->tax_name = $recurInvoice->tax_name; $invoice->tax_rate = $recurInvoice->tax_rate; $invoice->invoice_design_id = $recurInvoice->invoice_design_id; $invoice->custom_value1 = $recurInvoice->custom_value1; $invoice->custom_value2 = $recurInvoice->custom_value2; $invoice->custom_taxes1 = $recurInvoice->custom_taxes1; $invoice->custom_taxes2 = $recurInvoice->custom_taxes2; $invoice->is_amount_discount = $recurInvoice->is_amount_discount; if ($invoice->client->payment_terms != 0) { $days = $invoice->client->payment_terms; if ($days == -1) { $days = 0; } $invoice->due_date = date_create()->modify($days . ' day')->format('Y-m-d'); } $invoice->save(); foreach ($recurInvoice->invoice_items as $recurItem) { $item = InvoiceItem::createNew($recurItem); $item->product_id = $recurItem->product_id; $item->qty = $recurItem->qty; $item->cost = $recurItem->cost; $item->notes = Utils::processVariables($recurItem->notes); $item->product_key = Utils::processVariables($recurItem->product_key); $item->tax_name = $recurItem->tax_name; $item->tax_rate = $recurItem->tax_rate; $invoice->invoice_items()->save($item); } foreach ($recurInvoice->invitations as $recurInvitation) { $invitation = Invitation::createNew($recurInvitation); $invitation->contact_id = $recurInvitation->contact_id; $invitation->invitation_key = str_random(RANDOM_KEY_LENGTH); $invoice->invitations()->save($invitation); } $this->mailer->sendInvoice($invoice); $recurInvoice->last_sent_date = Carbon::now()->toDateTimeString(); $recurInvoice->save(); } $this->info('Done'); }
public function show($id) { $invoice = Invoice::with('customer.addresses')->with('items.product')->find($id); return $invoice; }