2013-12-09 10:38:49 +01:00
< ? php
use Illuminate\Console\Command ;
use Symfony\Component\Console\Input\InputOption ;
use Symfony\Component\Console\Input\InputArgument ;
2013-12-25 22:34:42 +01:00
use ninja\mailers\ContactMailer as Mailer ;
2013-12-09 10:38:49 +01:00
class SendRecurringInvoices extends Command {
protected $name = 'ninja:send-invoices' ;
protected $description = 'Send recurring invoices' ;
2013-12-10 18:18:35 +01:00
protected $mailer ;
2013-12-09 10:38:49 +01:00
2013-12-10 18:18:35 +01:00
public function __construct ( Mailer $mailer )
2013-12-09 10:38:49 +01:00
{
parent :: __construct ();
2013-12-10 18:18:35 +01:00
$this -> mailer = $mailer ;
2013-12-09 10:38:49 +01:00
}
public function fire ()
{
2013-12-10 18:18:35 +01:00
$this -> info ( date ( 'Y-m-d' ) . ' Running SendRecurringInvoices...' );
2013-12-10 23:10:43 +01:00
$today = new DateTime ();
2013-12-10 18:18:35 +01:00
2013-12-13 10:13:57 +01:00
$invoices = Invoice :: with ( 'account' , 'invoice_items' ) -> whereRaw ( 'is_recurring is true AND start_date <= ? AND (end_date IS NULL OR end_date >= ?)' , array ( $today , $today )) -> get ();
2013-12-10 18:18:35 +01:00
$this -> info ( count ( $invoices ) . ' recurring invoice(s) found' );
foreach ( $invoices as $recurInvoice )
{
$this -> info ( 'Processing Invoice ' . $recurInvoice -> id . ' - Should send ' . ( $recurInvoice -> shouldSendToday () ? 'YES' : 'NO' ));
if ( ! $recurInvoice -> shouldSendToday ())
{
continue ;
}
2014-01-09 12:24:03 +01:00
$invoice = Invoice :: createNew ( $recurInvoice );
2013-12-10 18:18:35 +01:00
$invoice -> client_id = $recurInvoice -> client_id ;
2013-12-10 23:10:43 +01:00
$invoice -> recurring_invoice_id = $recurInvoice -> id ;
2014-01-06 19:03:00 +01:00
$invoice -> invoice_number = 'R' . $recurInvoice -> account -> getNextInvoiceNumber ();
2013-12-30 21:17:45 +01:00
$invoice -> amount = $recurInvoice -> amount ;
2014-01-09 11:05:35 +01:00
$invoice -> balance = $recurInvoice -> amount ;
2013-12-30 21:17:45 +01:00
$invoice -> currency_id = $recurInvoice -> currency_id ;
2014-01-09 12:15:19 +01:00
$invoice -> invoice_date = date_create () -> format ( 'Y-m-d' );
2014-01-09 11:05:35 +01:00
if ( $invoice -> client -> payment_terms )
{
2014-01-09 12:15:19 +01:00
$invoice -> due_date = date_create () -> modify ( $invoice -> client -> payment_terms . ' day' ) -> format ( 'Y-m-d' );
2014-01-09 11:05:35 +01:00
}
2013-12-10 18:18:35 +01:00
$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 );
2014-01-09 11:05:35 +01:00
$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 ( 20 );
$invoice -> invitations () -> save ( $invitation );
2013-12-10 18:18:35 +01:00
}
2014-01-09 12:15:19 +01:00
$recurInvoice -> last_sent_date = Carbon :: now () -> toDateTimeString ();
2013-12-10 18:18:35 +01:00
$recurInvoice -> save ();
2013-12-13 10:13:57 +01:00
$this -> mailer -> sendInvoice ( $invoice );
2013-12-10 18:18:35 +01:00
}
2013-12-09 10:38:49 +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),
);
}
}