2013-12-09 11:38:49 +02:00
< ? php
use Illuminate\Console\Command ;
use Symfony\Component\Console\Input\InputOption ;
use Symfony\Component\Console\Input\InputArgument ;
2013-12-25 16:34:42 -05:00
use ninja\mailers\ContactMailer as Mailer ;
2013-12-09 11:38:49 +02:00
class SendRecurringInvoices extends Command {
protected $name = 'ninja:send-invoices' ;
protected $description = 'Send recurring invoices' ;
2013-12-10 19:18:35 +02:00
protected $mailer ;
2013-12-09 11:38:49 +02:00
2013-12-10 19:18:35 +02:00
public function __construct ( Mailer $mailer )
2013-12-09 11:38:49 +02:00
{
parent :: __construct ();
2013-12-10 19:18:35 +02:00
$this -> mailer = $mailer ;
2013-12-09 11:38:49 +02:00
}
public function fire ()
{
2013-12-10 19:18:35 +02:00
$this -> info ( date ( 'Y-m-d' ) . ' Running SendRecurringInvoices...' );
2014-06-04 23:41:34 +03:00
$today = new DateTime ();
$invoices = Invoice :: with ( 'account.timezone' , 'invoice_items' , 'client' )
2014-05-26 12:43:46 +03:00
-> 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 ();
2013-12-10 19:18:35 +02:00
$this -> info ( count ( $invoices ) . ' recurring invoice(s) found' );
foreach ( $invoices as $recurInvoice )
{
2014-06-04 23:41:34 +03:00
if ( $recurInvoice -> client -> deleted_at )
{
continue ;
}
2014-01-09 19:00:08 +00:00
date_default_timezone_set ( $recurInvoice -> account -> getTimezone ());
2013-12-10 19:18:35 +02:00
$this -> info ( 'Processing Invoice ' . $recurInvoice -> id . ' - Should send ' . ( $recurInvoice -> shouldSendToday () ? 'YES' : 'NO' ));
2014-01-09 13:44:55 +00:00
2013-12-10 19:18:35 +02:00
if ( ! $recurInvoice -> shouldSendToday ())
{
continue ;
}
2014-01-09 11:24:03 +00:00
$invoice = Invoice :: createNew ( $recurInvoice );
2013-12-10 19:18:35 +02:00
$invoice -> client_id = $recurInvoice -> client_id ;
2013-12-11 00:10:43 +02:00
$invoice -> recurring_invoice_id = $recurInvoice -> id ;
2014-01-06 20:03:00 +02:00
$invoice -> invoice_number = 'R' . $recurInvoice -> account -> getNextInvoiceNumber ();
2013-12-30 22:17:45 +02:00
$invoice -> amount = $recurInvoice -> amount ;
2014-01-09 10:05:35 +00:00
$invoice -> balance = $recurInvoice -> amount ;
2014-01-09 11:15:19 +00:00
$invoice -> invoice_date = date_create () -> format ( 'Y-m-d' );
2014-05-01 20:20:52 +03:00
$invoice -> discount = $recurInvoice -> discount ;
$invoice -> po_number = $recurInvoice -> po_number ;
$invoice -> public_notes = $recurInvoice -> public_notes ;
$invoice -> terms = $recurInvoice -> terms ;
$invoice -> tax_name = $recurInvoice -> tax_name ;
$invoice -> tax_rate = $recurInvoice -> tax_rate ;
$invoice -> invoice_design_id = $recurInvoice -> invoice_design_id ;
2014-01-09 10:05:35 +00:00
if ( $invoice -> client -> payment_terms )
{
2014-01-09 11:15:19 +00:00
$invoice -> due_date = date_create () -> modify ( $invoice -> client -> payment_terms . ' day' ) -> format ( 'Y-m-d' );
2014-01-09 10:05:35 +00:00
}
2013-12-10 19:18:35 +02:00
$invoice -> save ();
2014-01-09 12:37:38 +00:00
2013-12-10 19:18:35 +02:00
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 );
2014-05-01 20:20:52 +03:00
$item -> tax_name = $recurItem -> tax_name ;
$item -> tax_rate = $recurItem -> tax_rate ;
2014-01-09 10:05:35 +00:00
$invoice -> invoice_items () -> save ( $item );
}
foreach ( $recurInvoice -> invitations as $recurInvitation )
{
$invitation = Invitation :: createNew ( $recurInvitation );
$invitation -> contact_id = $recurInvitation -> contact_id ;
2014-01-13 19:22:43 +00:00
$invitation -> invitation_key = str_random ( RANDOM_KEY_LENGTH );
2014-01-09 10:05:35 +00:00
$invoice -> invitations () -> save ( $invitation );
2013-12-10 19:18:35 +02:00
}
2013-12-13 11:13:57 +02:00
$this -> mailer -> sendInvoice ( $invoice );
2014-05-01 22:02:36 +03:00
$recurInvoice -> last_sent_date = Carbon :: now () -> toDateTimeString ();
$recurInvoice -> save ();
2013-12-10 19:18:35 +02:00
}
2013-12-09 11:38:49 +02: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),
);
}
}