2015-03-16 22:45:25 +01:00
< ? php namespace App\Console\Commands ;
2015-04-12 16:18:05 +02:00
use DateTime ;
use Carbon ;
use Utils ;
2015-03-16 22:45:25 +01:00
use Illuminate\Console\Command ;
use Symfony\Component\Console\Input\InputOption ;
use Symfony\Component\Console\Input\InputArgument ;
2015-03-24 09:21:12 +01:00
use App\Ninja\Mailers\ContactMailer as Mailer ;
2015-08-10 17:48:41 +02:00
use App\Ninja\Repositories\InvoiceRepository ;
2016-05-25 04:49:06 +02:00
use App\Services\PaymentService ;
2015-04-12 16:18:05 +02:00
use App\Models\Invoice ;
use App\Models\InvoiceItem ;
use App\Models\Invitation ;
2015-03-16 22:45:25 +01:00
class SendRecurringInvoices extends Command
{
protected $name = 'ninja:send-invoices' ;
protected $description = 'Send recurring invoices' ;
protected $mailer ;
2015-08-10 17:48:41 +02:00
protected $invoiceRepo ;
2016-05-25 04:49:06 +02:00
protected $paymentService ;
2015-03-16 22:45:25 +01:00
2016-05-25 04:49:06 +02:00
public function __construct ( Mailer $mailer , InvoiceRepository $invoiceRepo , PaymentService $paymentService )
2015-03-16 22:45:25 +01:00
{
parent :: __construct ();
$this -> mailer = $mailer ;
2015-08-10 17:48:41 +02:00
$this -> invoiceRepo = $invoiceRepo ;
2016-05-25 04:49:06 +02:00
$this -> paymentService = $paymentService ;
2015-03-16 22:45:25 +01:00
}
public function fire ()
{
$this -> info ( date ( 'Y-m-d' ) . ' Running SendRecurringInvoices...' );
$today = new DateTime ();
$invoices = Invoice :: with ( 'account.timezone' , 'invoice_items' , 'client' , 'user' )
2015-10-20 10:23:38 +02:00
-> 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 ))
-> orderBy ( 'id' , 'asc' )
-> get ();
2015-03-16 22:45:25 +01:00
$this -> info ( count ( $invoices ) . ' recurring invoice(s) found' );
foreach ( $invoices as $recurInvoice ) {
2015-10-20 10:23:38 +02:00
if ( ! $recurInvoice -> user -> confirmed ) {
continue ;
}
2015-10-20 19:12:34 +02:00
2015-10-14 16:15:39 +02:00
$recurInvoice -> account -> loadLocalizationSettings ( $recurInvoice -> client );
2015-09-17 21:01:06 +02:00
$this -> info ( 'Processing Invoice ' . $recurInvoice -> id . ' - Should send ' . ( $recurInvoice -> shouldSendToday () ? 'YES' : 'NO' ));
2015-08-11 16:38:36 +02:00
$invoice = $this -> invoiceRepo -> createRecurringInvoice ( $recurInvoice );
2015-09-10 19:50:09 +02:00
if ( $invoice && ! $invoice -> isPaid ()) {
2016-05-25 05:14:19 +02:00
$invoice -> account -> auto_bill_on_due_date ;
$autoBillLater = false ;
if ( $invoice -> account -> auto_bill_on_due_date ) {
$autoBillLater = true ;
} elseif ( $paymentMethod = $this -> paymentService -> getClientDefaultPaymentMethod ( $invoice -> client )) {
if ( $paymentMethod && $paymentMethod -> requiresDelayedAutoBill ()) {
$autoBillLater = true ;
}
}
if ( $autoBillLater ) {
if ( empty ( $paymentMethod )) {
$paymentMethod = $this -> paymentService -> getClientDefaultPaymentMethod ( $invoice -> client );
}
if ( $paymentMethod ) {
$invoice -> autoBillPaymentMethod = $paymentMethod ;
}
}
2015-10-20 10:23:38 +02:00
$this -> info ( 'Sending Invoice' );
2015-08-11 16:38:36 +02:00
$this -> mailer -> sendInvoice ( $invoice );
}
2015-03-16 22:45:25 +01:00
}
2016-05-25 04:49:06 +02:00
$delayedAutoBillInvoices = Invoice :: with ( 'account.timezone' , 'recurring_invoice' , 'invoice_items' , 'client' , 'user' )
-> leftJoin ( 'invoices as recurring_invoice' , 'invoices.recurring_invoice_id' , '=' , 'recurring_invoice.id' )
-> whereRaw ( ' invoices . is_deleted IS FALSE AND invoices . deleted_at IS NULL AND invoices . is_recurring IS FALSE
AND invoices . balance > 0 AND invoices . due_date = ?
AND ( recurring_invoice . auto_bill = ? OR ( recurring_invoice . auto_bill != ? AND recurring_invoice . client_enable_auto_bill IS TRUE )) ' ,
array ( $today -> format ( 'Y-m-d' ), AUTO_BILL_ALWAYS , AUTO_BILL_OFF ))
-> orderBy ( 'invoices.id' , 'asc' )
-> get ();
$this -> info ( count ( $delayedAutoBillInvoices ) . ' due recurring auto bill invoice instance(s) found' );
foreach ( $delayedAutoBillInvoices as $invoice ) {
$autoBill = $invoice -> getAutoBillEnabled ();
$billNow = false ;
if ( $autoBill && ! $invoice -> isPaid ()) {
$billNow = $invoice -> account -> auto_bill_on_due_date ;
if ( ! $billNow ) {
2016-05-25 05:14:19 +02:00
$paymentMethod = $this -> paymentService -> getClientDefaultPaymentMethod ( $invoice -> client );
2016-05-25 04:49:06 +02:00
if ( $paymentMethod && $paymentMethod -> requiresDelayedAutoBill ()) {
$billNow = true ;
}
}
}
$this -> info ( 'Processing Invoice ' . $invoice -> id . ' - Should bill ' . ( $billNow ? 'YES' : 'NO' ));
if ( $billNow ) {
$this -> paymentService -> autoBillInvoice ( $invoice );
}
}
2015-03-16 22:45:25 +01:00
$this -> info ( 'Done' );
}
protected function getArguments ()
{
return array (
//array('example', InputArgument::REQUIRED, 'An example argument.'),
);
}
protected function getOptions ()
{
return array (
//array('example', null, InputOption::VALUE_OPTIONAL, 'An example option.', null),
);
}
}