From aa3a3f174ff76e2f8d2e24e71fc5f3f2ebd07445 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Sat, 17 May 2014 22:29:57 +0300 Subject: [PATCH] Working on quotes --- app/controllers/InvoiceController.php | 41 ++------ app/controllers/QuoteController.php | 94 +++++++++++++++++++ .../2014_05_17_175626_add_quotes.php | 34 +++++++ app/lang/en/texts.php | 20 ++++ app/libraries/utils.php | 5 + app/ninja/repositories/InvoiceRepository.php | 61 ++++++++++++ app/routes.php | 16 +++- app/views/header.blade.php | 3 + app/views/invoices/edit.blade.php | 16 ++-- 9 files changed, 244 insertions(+), 46 deletions(-) create mode 100644 app/controllers/QuoteController.php create mode 100644 app/database/migrations/2014_05_17_175626_add_quotes.php diff --git a/app/controllers/InvoiceController.php b/app/controllers/InvoiceController.php index 578e5d0403..41193707e8 100755 --- a/app/controllers/InvoiceController.php +++ b/app/controllers/InvoiceController.php @@ -40,42 +40,12 @@ class InvoiceController extends \BaseController { } public function getDatatable($clientPublicId = null) - { - $query = $this->invoiceRepo->getInvoices(Auth::user()->account_id, $clientPublicId, Input::get('sSearch')); - $table = Datatable::query($query); + { + $accountId = Auth::user()->account_id; + $search = Input::get('sSearch'); - if (!$clientPublicId) { - $table->addColumn('checkbox', function($model) { return ''; }); - } - - $table->addColumn('invoice_number', function($model) { return link_to('invoices/' . $model->public_id . '/edit', $model->invoice_number); }); - - if (!$clientPublicId) { - $table->addColumn('client_name', function($model) { return link_to('clients/' . $model->client_public_id, Utils::getClientDisplayName($model)); }); - } - - return $table->addColumn('invoice_date', function($model) { return Utils::fromSqlDate($model->invoice_date); }) - ->addColumn('amount', function($model) { return Utils::formatMoney($model->amount, $model->currency_id); }) - ->addColumn('balance', function($model) { return Utils::formatMoney($model->balance, $model->currency_id); }) - ->addColumn('due_date', function($model) { return Utils::fromSqlDate($model->due_date); }) - ->addColumn('invoice_status_name', function($model) { return $model->invoice_status_name; }) - ->addColumn('dropdown', function($model) - { - return ''; - }) - ->make(); - } + return $this->invoiceRepo->getDatatable($accountId, $clientPublicId, ENTITY_INVOICE, $search); + } public function getRecurringDatatable($clientPublicId = null) { @@ -236,6 +206,7 @@ class InvoiceController extends \BaseController { private static function getViewModel() { return [ + 'entityType' => ENTITY_INVOICE, 'account' => Auth::user()->account, 'products' => Product::scope()->orderBy('id')->get(array('product_key','notes','cost','qty')), 'countries' => Country::remember(DEFAULT_QUERY_CACHE)->orderBy('name')->get(), diff --git a/app/controllers/QuoteController.php b/app/controllers/QuoteController.php new file mode 100644 index 0000000000..0f51c9b21f --- /dev/null +++ b/app/controllers/QuoteController.php @@ -0,0 +1,94 @@ +mailer = $mailer; + $this->invoiceRepo = $invoiceRepo; + $this->clientRepo = $clientRepo; + $this->taxRateRepo = $taxRateRepo; + } + + public function index() + { + $data = [ + 'title' => '- Quotes', + 'entityType'=>ENTITY_QUOTE, + 'columns'=>Utils::trans(['checkbox', 'quote_number', 'client', 'quote_date', 'quote_total', 'due_date', 'status', 'action']) + ]; + + if (Invoice::scope()->where('is_recurring', '=', true)->count() > 0) + { + $data['secEntityType'] = ENTITY_RECURRING_INVOICE; + $data['secColumns'] = Utils::trans(['checkbox', 'frequency', 'client', 'start_date', 'end_date', 'quote_total', 'action']); + } + + return View::make('list', $data); + } + + public function getDatatable($clientPublicId = null) + { + $accountId = Auth::user()->account_id; + $search = Input::get('sSearch'); + + return $this->invoiceRepo->getDatatable($accountId, $clientPublicId, ENTITY_QUOTE, $search); + } + + public function create($clientPublicId = 0) + { + $client = null; + $invoiceNumber = Auth::user()->account->getNextInvoiceNumber(); + $account = Account::with('country')->findOrFail(Auth::user()->account_id); + + if ($clientPublicId) + { + $client = Client::scope($clientPublicId)->firstOrFail(); + } + + $data = array( + 'account' => $account, + 'invoice' => null, + 'data' => Input::old('data'), + 'invoiceNumber' => $invoiceNumber, + 'method' => 'POST', + 'url' => 'quotes', + 'title' => '- New Quote', + 'client' => $client); + $data = array_merge($data, self::getViewModel()); + + return View::make('invoices.edit', $data); + } + + private static function getViewModel() + { + return [ + 'entityType' => ENTITY_QUOTE, + 'account' => Auth::user()->account, + 'products' => Product::scope()->orderBy('id')->get(array('product_key','notes','cost','qty')), + 'countries' => Country::remember(DEFAULT_QUERY_CACHE)->orderBy('name')->get(), + 'clients' => Client::scope()->with('contacts', 'country')->orderBy('name')->get(), + 'taxRates' => TaxRate::scope()->orderBy('name')->get(), + 'currencies' => Currency::remember(DEFAULT_QUERY_CACHE)->orderBy('name')->get(), + 'sizes' => Size::remember(DEFAULT_QUERY_CACHE)->orderBy('id')->get(), + 'paymentTerms' => PaymentTerm::remember(DEFAULT_QUERY_CACHE)->orderBy('num_days')->get(['name', 'num_days']), + 'industries' => Industry::remember(DEFAULT_QUERY_CACHE)->orderBy('id')->get(), + 'invoiceDesigns' => InvoiceDesign::remember(DEFAULT_QUERY_CACHE)->orderBy('id')->get(), + 'invoiceLabels' => Auth::user()->account->getInvoiceLabels() + ]; + } + + +} \ No newline at end of file diff --git a/app/database/migrations/2014_05_17_175626_add_quotes.php b/app/database/migrations/2014_05_17_175626_add_quotes.php new file mode 100644 index 0000000000..5db67cb83f --- /dev/null +++ b/app/database/migrations/2014_05_17_175626_add_quotes.php @@ -0,0 +1,34 @@ +boolean('is_quote'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('invoices', function($table) + { + $table->dropColumn('is_quote'); + }); + } + +} diff --git a/app/lang/en/texts.php b/app/lang/en/texts.php index 211ca6629a..fe421a2a62 100644 --- a/app/lang/en/texts.php +++ b/app/lang/en/texts.php @@ -351,5 +351,25 @@ return array( 'chart_builder' => 'Chart Builder', 'ninja_email_footer' => 'Use :site to invoice your clients and get paid online for free!', + 'quote' => 'Quote', + 'quotes' => 'Quotes', + 'quote_number' => 'Quote Number', + 'quote_date' => 'Quote Date', + 'quote_total' => 'Quote Total', + + 'new_quote' => 'New Quote', + 'edit_quote' => 'Edit Quote', + 'archive_quote' => 'Archive Quote', + 'delete_quote' => 'Delete Quote', + + 'updated_quote' => 'Successfully updated quote', + 'created_quote' => 'Successfully created quote', + 'cloned_quote' => 'Successfully cloned quote', + 'emailed_quote' => 'Successfully emailed quote', + 'archived_quote' => 'Successfully archived quote', + 'archived_quotes' => 'Successfully archived :count quotes', + 'deleted_quote' => 'Successfully deleted quote', + 'deleted_quotes' => 'Successfully deleted :count quotes', + ); diff --git a/app/libraries/utils.php b/app/libraries/utils.php index b0b76f5fea..accb7ec6ed 100755 --- a/app/libraries/utils.php +++ b/app/libraries/utils.php @@ -32,6 +32,11 @@ class Utils return isset($_ENV['NINJA_DEV']) && $_ENV['NINJA_DEV']; } + public static function isPro() + { + return Auth::check() && Auth::user()->isPro(); + } + public static function getProLabel($feature) { if (Auth::check() diff --git a/app/ninja/repositories/InvoiceRepository.php b/app/ninja/repositories/InvoiceRepository.php index 528736de07..5ecf57cea7 100755 --- a/app/ninja/repositories/InvoiceRepository.php +++ b/app/ninja/repositories/InvoiceRepository.php @@ -80,6 +80,67 @@ class InvoiceRepository return $query; } + public function getDatatable($accountId, $clientPublicId = null, $entityType, $search) + { + $query = $this->getInvoices($accountId, $clientPublicId, $search); + + if ($entityType == ENTITY_QUOTE) + { + $query->where('invoices.is_quote', '=', true); + } + + $table = \Datatable::query($query); + + if (!$clientPublicId) + { + $table->addColumn('checkbox', function($model) { return ''; }); + } + + $table->addColumn("invoice_number", function($model) use ($entityType) { return link_to("{$entityType}s/" . $model->public_id . '/edit', $model->invoice_number); }); + + if (!$clientPublicId) + { + $table->addColumn('client_name', function($model) { return link_to('clients/' . $model->client_public_id, Utils::getClientDisplayName($model)); }); + } + + $table->addColumn("invoice_date", function($model) { return Utils::fromSqlDate($model->invoice_date); }) + ->addColumn('amount', function($model) { return Utils::formatMoney($model->amount, $model->currency_id); }); + + if ($entityType == ENTITY_INVOICE) + { + $table->addColumn('balance', function($model) { return Utils::formatMoney($model->balance, $model->currency_id); }); + } + + return $table->addColumn('due_date', function($model) { return Utils::fromSqlDate($model->due_date); }) + ->addColumn('invoice_status_name', function($model) { return $model->invoice_status_name; }) + ->addColumn('dropdown', function($model) use ($entityType) + { + $str = ''; + }) + ->make(); + } + + public function getErrors($input) { $contact = (array) $input->client->contacts[0]; diff --git a/app/routes.php b/app/routes.php index d0506ad702..2749a58850 100755 --- a/app/routes.php +++ b/app/routes.php @@ -91,10 +91,17 @@ Route::group(array('before' => 'auth'), function() Route::get('recurring_invoices', 'InvoiceController@recurringIndex'); Route::get('api/recurring_invoices/{client_id?}', array('as'=>'api.recurring_invoices', 'uses'=>'InvoiceController@getRecurringDatatable')); - Route::resource('invoices', 'InvoiceController'); - Route::get('api/invoices/{client_id?}', array('as'=>'api.invoices', 'uses'=>'InvoiceController@getDatatable')); - Route::get('invoices/create/{client_id?}', 'InvoiceController@create'); - Route::post('invoices/bulk', 'InvoiceController@bulk'); + Route::resource('invoices', 'InvoiceController'); + Route::get('api/invoices/{client_id?}', array('as'=>'api.invoices', 'uses'=>'InvoiceController@getDatatable')); + Route::get('invoices/create/{client_id?}', 'InvoiceController@create'); + Route::post('invoices/bulk', 'InvoiceController@bulk'); + + Route::resource('quotes', 'QuoteController'); + Route::get('api/quotes/{client_id?}', array('as'=>'api.quotes', 'uses'=>'QuoteController@getDatatable')); + /* + Route::get('invoices/create/{client_id?}', 'InvoiceController@create'); + Route::post('invoices/bulk', 'InvoiceController@bulk'); + */ Route::get('payments/{id}/edit', function() { return View::make('header'); }); Route::resource('payments', 'PaymentController'); @@ -132,6 +139,7 @@ define('ENTITY_INVOICE', 'invoice'); define('ENTITY_RECURRING_INVOICE', 'recurring_invoice'); define('ENTITY_PAYMENT', 'payment'); define('ENTITY_CREDIT', 'credit'); +define('ENTITY_QUOTE', 'quote'); define('PERSON_CONTACT', 'contact'); define('PERSON_USER', 'user'); diff --git a/app/views/header.blade.php b/app/views/header.blade.php index 6df84c67fb..17cef6eff6 100755 --- a/app/views/header.blade.php +++ b/app/views/header.blade.php @@ -89,6 +89,9 @@