コード例 #1
0
ファイル: Mailer.php プロジェクト: soitun/invoice-ninja
 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();
         }
     }
 }
コード例 #2
0
 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');
 }
コード例 #3
0
ファイル: Mailer.php プロジェクト: janusnic/invoice-ninja
 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();
         }
     }
 }
コード例 #4
0
 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');
 }
コード例 #5
0
ファイル: Mailer.php プロジェクト: ricoa/invoice-ninja
 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);
     });
 }
コード例 #6
0
ファイル: Mailer.php プロジェクト: biggtfish/invoiceNinja-1
 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);
     });
 }
コード例 #7
0
 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");
     }
 }
コード例 #8
0
ファイル: Activity.php プロジェクト: ricoa/invoice-ninja
 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;
             }
         }
     }
 }
コード例 #9
0
 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);
 }
コード例 #10
0
 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();
 }
コード例 #11
0
 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');
 }
コード例 #12
0
 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);
 }
コード例 #13
0
 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');
 }
コード例 #14
0
 public function show($id)
 {
     $invoice = Invoice::with('customer.addresses')->with('items.product')->find($id);
     return $invoice;
 }