diff --git a/app/commands/SendRecurringInvoices.php b/app/commands/SendRecurringInvoices.php index 1e582149b8bc..b5e3fb874359 100755 --- a/app/commands/SendRecurringInvoices.php +++ b/app/commands/SendRecurringInvoices.php @@ -24,7 +24,7 @@ class SendRecurringInvoices extends Command { $today = new DateTime(); - $invoices = RecurringInvoice::with('account', 'invoice_items')->whereRaw('start_date <= ? AND (end_date IS NULL OR end_date >= ?)', array($today, $today))->get(); + $invoices = Invoice::with('account', 'invoice_items')->whereRaw('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) diff --git a/app/controllers/ClientController.php b/app/controllers/ClientController.php index 9430ffae2468..48531451356b 100755 --- a/app/controllers/ClientController.php +++ b/app/controllers/ClientController.php @@ -100,7 +100,7 @@ class ClientController extends \BaseController { $data = array( 'client' => $client, 'title' => '- ' . $client->name, - 'hasRecurringInvoices' => RecurringInvoice::whereClientId($client->id)->count() > 0 + 'hasRecurringInvoices' => Invoice::scope()->where('frequency_id', '>', '0')->count() > 0 ); return View::make('clients.show', $data); diff --git a/app/controllers/InvoiceController.php b/app/controllers/InvoiceController.php index 0294ee4c9e11..8e55799d0af5 100755 --- a/app/controllers/InvoiceController.php +++ b/app/controllers/InvoiceController.php @@ -15,11 +15,19 @@ class InvoiceController extends \BaseController { public function index() { - return View::make('list', array( - 'entityType'=>ENTITY_INVOICE, + $data = [ 'title' => '- Invoices', + 'entityType'=>ENTITY_INVOICE, 'columns'=>['checkbox', 'Invoice Number', 'Client', 'Total', 'Amount Due', 'Invoice Date', 'Due Date', 'Status', 'Action'] - )); + ]; + + if (Invoice::scope()->where('frequency_id', '>', '0')->count() > 0) + { + $data['secEntityType'] = ENTITY_RECURRING_INVOICE; + $data['secColumns'] = ['checkbox', 'Client', 'Total', 'Frequency', 'Start Date', 'End Date', 'Action']; + } + + return View::make('list', $data); } public function getDatatable($clientPublicId = null) @@ -29,6 +37,7 @@ class InvoiceController extends \BaseController { ->join('invoice_statuses', 'invoice_statuses.id', '=', 'invoices.invoice_status_id') ->where('invoices.account_id', '=', Auth::user()->account_id) ->where('invoices.deleted_at', '=', null) + ->where('invoices.frequency_id', '=', 0) ->select('clients.public_id as client_public_id', 'invoice_number', 'clients.name as client_name', 'invoices.public_id', 'total', 'invoices.balance', 'invoice_date', 'due_date', 'invoice_statuses.name as invoice_status_name'); if ($clientPublicId) { @@ -70,6 +79,52 @@ class InvoiceController extends \BaseController { ->make(); } + public function getRecurringDatatable($clientPublicId = null) + { + $query = DB::table('invoices') + ->join('clients', 'clients.id', '=','invoices.client_id') + ->join('frequencies', 'frequencies.id', '=', 'invoices.frequency_id') + ->where('invoices.account_id', '=', Auth::user()->account_id) + ->where('invoices.deleted_at', '=', null) + ->where('invoices.frequency_id', '>', 0) + ->select('clients.public_id as client_public_id', 'clients.name as client_name', 'invoices.public_id', 'total', 'frequencies.name as frequency', 'start_date', 'end_date'); + + if ($clientPublicId) { + $query->where('clients.public_id', '=', $clientPublicId); + } + + $table = Datatable::query($query); + + if (!$clientPublicId) { + $table->addColumn('checkbox', function($model) { return ''; }); + } + + if (!$clientPublicId) { + $table->addColumn('client', function($model) { return link_to('clients/' . $model->client_public_id, $model->client_name); }); + } + + return $table->addColumn('total', function($model) { return '$' . money_format('%i', $model->total); }) + ->addColumn('frequency', function($model) { return $model->frequency; }) + ->addColumn('start_date', function($model) { return Utils::fromSqlDate($model->start_date); }) + ->addColumn('end_date', function($model) { return Utils::fromSqlDate($model->end_date); }) + ->addColumn('dropdown', function($model) + { + return '
'; + }) + ->orderColumns('client','total','frequency','start_date','end_date') + ->make(); + } + public function view($invitationKey) { @@ -279,10 +334,9 @@ class InvoiceController extends \BaseController { return View::make('invoices.edit', $data); } - public static function getViewModel($isRecurring = false) + public static function getViewModel() { return [ - 'isRecurring' => $isRecurring, 'account' => Auth::user()->account, 'products' => Product::scope()->get(array('product_key','notes','cost','qty')), 'countries' => Country::orderBy('name')->get(), @@ -320,8 +374,6 @@ class InvoiceController extends \BaseController { $rules = array( 'client' => 'required', - 'invoice_number' => 'required', - 'invoice_date' => 'required' ); $validator = Validator::make(Input::all(), $rules); @@ -374,7 +426,11 @@ class InvoiceController extends \BaseController { $invoice->discount = 0; $invoice->invoice_number = trim(Input::get('invoice_number')); $invoice->invoice_date = Utils::toSqlDate(Input::get('invoice_date')); - $invoice->due_date = Utils::toSqlDate(Input::get('due_date', null)); + $invoice->due_date = Utils::toSqlDate(Input::get('due_date')); + + $invoice->frequency_id = Input::get('recurring') ? Input::get('frequency') : 0; + $invoice->start_date = Utils::toSqlDate(Input::get('start_date')); + $invoice->end_date = Utils::toSqlDate(Input::get('end_date')); $invoice->notes = Input::get('notes'); $client->invoices()->save($invoice); diff --git a/app/database/migrations/2013_11_05_180133_confide_setup_users_table.php b/app/database/migrations/2013_11_05_180133_confide_setup_users_table.php index 6081bbdc95a2..1a49df14620d 100755 --- a/app/database/migrations/2013_11_05_180133_confide_setup_users_table.php +++ b/app/database/migrations/2013_11_05_180133_confide_setup_users_table.php @@ -17,12 +17,10 @@ class ConfideSetupUsersTable extends Migration { Schema::dropIfExists('account_gateways'); Schema::dropIfExists('gateways'); Schema::dropIfExists('payments'); - Schema::dropIfExists('recurring_invoice_items'); Schema::dropIfExists('invoice_items'); Schema::dropIfExists('products'); Schema::dropIfExists('contacts'); Schema::dropIfExists('invoices'); - Schema::dropIfExists('recurring_invoices'); Schema::dropIfExists('password_reminders'); Schema::dropIfExists('clients'); Schema::dropIfExists('users'); @@ -209,33 +207,6 @@ class ConfideSetupUsersTable extends Migration { $t->string('name'); }); - Schema::create('recurring_invoices', function($t) - { - $t->increments('id'); - $t->unsignedInteger('client_id'); - $t->unsignedInteger('user_id'); - $t->unsignedInteger('account_id'); - $t->timestamps(); - $t->softDeletes(); - - $t->float('discount'); - $t->text('notes'); - $t->decimal('total', 10, 2); - - $t->unsignedInteger('frequency_id'); - $t->date('start_date')->nullable(); - $t->date('end_date')->nullable(); - $t->date('last_sent_date')->nullable(); - - $t->foreign('client_id')->references('id')->on('clients')->onDelete('cascade'); - $t->foreign('account_id')->references('id')->on('accounts'); - $t->foreign('user_id')->references('id')->on('users'); - $t->foreign('frequency_id')->references('id')->on('frequencies'); - - $t->unsignedInteger('public_id'); - $t->unique( array('account_id','public_id') ); - }); - Schema::create('invoices', function($t) { $t->increments('id'); @@ -252,17 +223,22 @@ class ConfideSetupUsersTable extends Migration { $t->date('due_date')->nullable(); $t->text('notes'); + $t->unsignedInteger('frequency_id'); + $t->date('start_date')->nullable(); + $t->date('end_date')->nullable(); + $t->date('last_sent_date')->nullable(); + $t->unsignedInteger('recurring_invoice_id')->nullable(); + + $t->decimal('total', 10, 2); $t->decimal('balance', 10, 2); - - $t->unsignedInteger('recurring_invoice_id')->nullable(); - + $t->foreign('client_id')->references('id')->on('clients')->onDelete('cascade'); $t->foreign('account_id')->references('id')->on('accounts'); $t->foreign('user_id')->references('id')->on('users'); $t->foreign('invoice_status_id')->references('id')->on('invoice_statuses'); - $t->foreign('recurring_invoice_id')->references('id')->on('recurring_invoices'); - + $t->foreign('recurring_invoice_id')->references('id')->on('invoices'); + $t->unsignedInteger('public_id'); $t->unique( array('account_id','public_id') ); }); @@ -333,29 +309,6 @@ class ConfideSetupUsersTable extends Migration { $t->unique( array('account_id','public_id') ); }); - Schema::create('recurring_invoice_items', function($t) - { - $t->increments('id'); - $t->unsignedInteger('account_id'); - $t->unsignedInteger('user_id'); - $t->unsignedInteger('recurring_invoice_id'); - $t->unsignedInteger('product_id')->nullable(); - $t->timestamps(); - $t->softDeletes(); - - $t->string('product_key'); - $t->string('notes'); - $t->decimal('cost', 10, 2); - $t->decimal('qty', 10, 2); - - $t->foreign('recurring_invoice_id')->references('id')->on('recurring_invoices')->onDelete('cascade'); - $t->foreign('product_id')->references('id')->on('products'); - $t->foreign('user_id')->references('id')->on('users'); - - $t->unsignedInteger('public_id'); - $t->unique( array('account_id','public_id') ); - }); - Schema::create('payments', function($t) { $t->increments('id'); @@ -417,7 +370,6 @@ class ConfideSetupUsersTable extends Migration { $t->unsignedInteger('contact_id'); $t->unsignedInteger('payment_id'); $t->unsignedInteger('invoice_id'); - $t->unsignedInteger('recurring_invoice_id'); $t->unsignedInteger('credit_id'); $t->unsignedInteger('invitation_id'); @@ -445,12 +397,10 @@ class ConfideSetupUsersTable extends Migration { Schema::dropIfExists('account_gateways'); Schema::dropIfExists('gateways'); Schema::dropIfExists('payments'); - Schema::dropIfExists('recurring_invoice_items'); Schema::dropIfExists('invoice_items'); Schema::dropIfExists('products'); Schema::dropIfExists('contacts'); Schema::dropIfExists('invoices'); - Schema::dropIfExists('recurring_invoices'); Schema::dropIfExists('password_reminders'); Schema::dropIfExists('clients'); Schema::dropIfExists('users'); diff --git a/app/libraries/utils.php b/app/libraries/utils.php index fb8a64f256dc..90f73f0faad1 100755 --- a/app/libraries/utils.php +++ b/app/libraries/utils.php @@ -143,7 +143,7 @@ class Utils for ($i=0; $i +