From 9886487b64626dd4f6987eee4fec4ab6edb9a16f Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Wed, 19 Feb 2014 21:42:57 +0200 Subject: [PATCH 1/2] Added support for selecting invoice design --- README.md | 7 +- app/controllers/AccountController.php | 1 + app/controllers/InvoiceController.php | 8 ++- ...151817_add_support_for_invoice_designs.php | 71 +++++++++++++++++++ app/models/InvoiceDesign.php | 7 ++ app/ninja/repositories/InvoiceRepository.php | 3 +- app/views/accounts/notifications.blade.php | 6 +- app/views/invoices/edit.blade.php | 6 +- 8 files changed, 96 insertions(+), 13 deletions(-) create mode 100644 app/database/migrations/2014_02_19_151817_add_support_for_invoice_designs.php create mode 100644 app/models/InvoiceDesign.php diff --git a/README.md b/README.md index e38b87e05918..a35cc3f2a58c 100644 --- a/README.md +++ b/README.md @@ -9,14 +9,9 @@ Most online invoicing sites are expensive. They shouldn't be. The aim of this pr ### Features * Core application built using Laravel 4.1 * Invoice PDF generation directly in the browser -* Tax rates and payment terms * Integrates with many payment providers * Recurring invoices - -### Remaining Work -* Home dashboard -* Multiple language support -* Reports +* Tax rates and payment terms ### Steps to setup diff --git a/app/controllers/AccountController.php b/app/controllers/AccountController.php index 9fe73413aab9..988b83db0f4c 100755 --- a/app/controllers/AccountController.php +++ b/app/controllers/AccountController.php @@ -300,6 +300,7 @@ class AccountController extends \BaseController { $client->save(); $client->contacts()->save($contact); + Activity::createClient($client); } $message = Utils::pluralize('Successfully created ? client', $count); diff --git a/app/controllers/InvoiceController.php b/app/controllers/InvoiceController.php index e16c401781ab..7117a797e077 100755 --- a/app/controllers/InvoiceController.php +++ b/app/controllers/InvoiceController.php @@ -216,6 +216,7 @@ class InvoiceController extends \BaseController { '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(), 'frequencies' => array( 1 => 'Weekly', 2 => 'Two weeks', @@ -266,12 +267,15 @@ class InvoiceController extends \BaseController { $invoiceData = (array) $invoice; $invoiceData['client_id'] = $client->id; $invoice = $this->invoiceRepo->save($publicId, $invoiceData); - + $account = Auth::user()->account; - if ($account->invoice_taxes != $input->invoice_taxes || $account->invoice_item_taxes != $input->invoice_item_taxes) + if ($account->invoice_taxes != $input->invoice_taxes + || $account->invoice_item_taxes != $input->invoice_item_taxes + || $account->invoice_design_id != $input->invoice->invoice_design_id) { $account->invoice_taxes = $input->invoice_taxes; $account->invoice_item_taxes = $input->invoice_item_taxes; + $account->invoice_design_id = $input->invoice->invoice_design_id; $account->save(); } diff --git a/app/database/migrations/2014_02_19_151817_add_support_for_invoice_designs.php b/app/database/migrations/2014_02_19_151817_add_support_for_invoice_designs.php new file mode 100644 index 000000000000..df8b3588c8a8 --- /dev/null +++ b/app/database/migrations/2014_02_19_151817_add_support_for_invoice_designs.php @@ -0,0 +1,71 @@ +increments('id'); + $table->string('name'); + }); + + DB::table('invoice_designs')->insert(['name' => 'Clean']); + DB::table('invoice_designs')->insert(['name' => 'Bold']); + DB::table('invoice_designs')->insert(['name' => 'Modern']); + + Schema::table('invoices', function($table) + { + $table->unsignedInteger('invoice_design_id')->default(1); + }); + + Schema::table('accounts', function($table) + { + $table->unsignedInteger('invoice_design_id')->default(1); + }); + + DB::table('invoices')->update(['invoice_design_id' => 1]); + DB::table('accounts')->update(['invoice_design_id' => 1]); + + Schema::table('invoices', function($table) + { + $table->foreign('invoice_design_id')->references('id')->on('invoice_designs'); + }); + + Schema::table('accounts', function($table) + { + $table->foreign('invoice_design_id')->references('id')->on('invoice_designs'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('invoices', function($table) + { + $table->dropForeign('invoices_invoice_design_id_foreign'); + $table->dropColumn('invoice_design_id'); + }); + + Schema::table('accounts', function($table) + { + $table->dropForeign('accounts_invoice_design_id_foreign'); + $table->dropColumn('invoice_design_id'); + }); + + Schema::dropIfExists('invoice_designs'); + } + +} diff --git a/app/models/InvoiceDesign.php b/app/models/InvoiceDesign.php new file mode 100644 index 000000000000..0def7e92e444 --- /dev/null +++ b/app/models/InvoiceDesign.php @@ -0,0 +1,7 @@ +terms = trim($data['terms']); $invoice->public_notes = trim($data['public_notes']); $invoice->po_number = trim($data['po_number']); - + $invoice->invoice_design_id = $data['invoice_design_id']; + if (isset($data['tax_rate']) && Utils::parseFloat($data['tax_rate']) > 0) { $invoice->tax_rate = Utils::parseFloat($data['tax_rate']); diff --git a/app/views/accounts/notifications.blade.php b/app/views/accounts/notifications.blade.php index b575e9868452..2e8790306654 100755 --- a/app/views/accounts/notifications.blade.php +++ b/app/views/accounts/notifications.blade.php @@ -14,9 +14,9 @@ {{ Former::checkbox('notify_viewed')->label(' ')->text('Email me when an invoice is viewed') }} {{ Former::checkbox('notify_paid')->label(' ')->text('Email me when an invoice is paid') }} - {{ Former::legend('Custom messages') }} - {{ Former::textarea('invoice_terms') }} - {{ Former::textarea('email_footer') }} + {{ Former::legend('Custom Messages') }} + {{ Former::textarea('invoice_terms')->label('Set default invoice terms') }} + {{ Former::textarea('email_footer')->label('Set default email signature') }} {{ Former::actions( Button::lg_primary_submit('Save') ) }} {{ Former::close() }} diff --git a/app/views/invoices/edit.blade.php b/app/views/invoices/edit.blade.php index 8f6bc4675b73..7f2477f2e3d7 100755 --- a/app/views/invoices/edit.blade.php +++ b/app/views/invoices/edit.blade.php @@ -207,6 +207,9 @@ + {{ Former::select('invoice_design_id')->label('Design')->style('display:inline;width:100px')->raw() + ->fromQuery($invoiceDesigns, 'name', 'id')->data_bind("value: invoice_design_id") }} + {{ Button::normal('Download PDF', array('onclick' => 'onDownloadClick()')) }} @if (!$invoice || (!$invoice->trashed() && !$invoice->client->trashed())) @@ -462,7 +465,7 @@ refreshPDF(); }); //.trigger('change'); - $('#terms, #public_notes, #invoice_number, #invoice_date, #due_date, #po_number, #discount, #currency_id').change(function() { + $('#terms, #public_notes, #invoice_number, #invoice_date, #due_date, #po_number, #discount, #currency_id, #invoice_design_id').change(function() { refreshPDF(); }); @@ -947,6 +950,7 @@ self.invoice_items = ko.observableArray(); self.amount = ko.observable(0); self.balance = ko.observable(0); + self.invoice_design_id = ko.observable({{ $account->invoice_design_id }}); self.mapping = { 'client': { From 848a6c7e391d42e9b2bc9c22660b31e9beb074be Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Wed, 19 Feb 2014 21:59:46 +0200 Subject: [PATCH 2/2] bug fixes --- app/controllers/AccountController.php | 2 +- app/ninja/repositories/ClientRepository.php | 2 +- app/ninja/repositories/CreditRepository.php | 2 +- app/ninja/repositories/InvoiceRepository.php | 4 ++-- app/ninja/repositories/PaymentRepository.php | 2 +- app/views/invoices/edit.blade.php | 6 ++++-- app/views/list.blade.php | 2 +- 7 files changed, 11 insertions(+), 9 deletions(-) diff --git a/app/controllers/AccountController.php b/app/controllers/AccountController.php index 988b83db0f4c..93db77a26903 100755 --- a/app/controllers/AccountController.php +++ b/app/controllers/AccountController.php @@ -60,7 +60,7 @@ class AccountController extends \BaseController { public function setTrashVisible($entityType, $visible) { - Session::put("trash_{$entityType}", $visible == 'true'); + Session::put('show_trash', $visible == 'true'); return Redirect::to("{$entityType}s"); } diff --git a/app/ninja/repositories/ClientRepository.php b/app/ninja/repositories/ClientRepository.php index 263ef151d271..6084a7847565 100755 --- a/app/ninja/repositories/ClientRepository.php +++ b/app/ninja/repositories/ClientRepository.php @@ -13,7 +13,7 @@ class ClientRepository ->where('contacts.is_primary', '=', true) ->select('clients.public_id','clients.name','contacts.first_name','contacts.last_name','clients.balance','clients.last_login','clients.created_at','clients.work_phone','contacts.email','clients.currency_id'); - if (!\Session::get('trash_client')) + if (!\Session::get('show_trash')) { $query->where('clients.deleted_at', '=', null); } diff --git a/app/ninja/repositories/CreditRepository.php b/app/ninja/repositories/CreditRepository.php index e9924600a89f..ca3f03ac132c 100755 --- a/app/ninja/repositories/CreditRepository.php +++ b/app/ninja/repositories/CreditRepository.php @@ -22,7 +22,7 @@ class CreditRepository $query->where('clients.public_id', '=', $clientPublicId); } - if (!\Session::get('trash_credit')) + if (!\Session::get('show_trash')) { $query->where('credits.deleted_at', '=', null); } diff --git a/app/ninja/repositories/InvoiceRepository.php b/app/ninja/repositories/InvoiceRepository.php index 3982cc62c890..b22b59c16d3e 100755 --- a/app/ninja/repositories/InvoiceRepository.php +++ b/app/ninja/repositories/InvoiceRepository.php @@ -20,7 +20,7 @@ class InvoiceRepository ->where('contacts.is_primary', '=', true) ->select('clients.public_id as client_public_id', 'invoice_number', 'clients.name as client_name', 'invoices.public_id', 'amount', 'invoices.balance', 'invoice_date', 'due_date', 'invoice_statuses.name as invoice_status_name', 'clients.currency_id', 'contacts.first_name', 'contacts.last_name', 'contacts.email'); - if (!\Session::get('trash_invoice')) + if (!\Session::get('show_trash')) { $query->where('invoices.deleted_at', '=', null); } @@ -60,7 +60,7 @@ class InvoiceRepository $query->where('clients.public_id', '=', $clientPublicId); } - if (!\Session::get('trash_invoice')) + if (!\Session::get('show_trash')) { $query->where('invoices.deleted_at', '=', null); } diff --git a/app/ninja/repositories/PaymentRepository.php b/app/ninja/repositories/PaymentRepository.php index 44e661bba4f3..d9a126e2c253 100755 --- a/app/ninja/repositories/PaymentRepository.php +++ b/app/ninja/repositories/PaymentRepository.php @@ -20,7 +20,7 @@ class PaymentRepository ->where('contacts.is_primary', '=', true) ->select('payments.public_id', 'payments.transaction_reference', 'clients.name as client_name', 'clients.public_id as client_public_id', 'payments.amount', 'payments.payment_date', 'invoices.public_id as invoice_public_id', 'invoices.invoice_number', 'clients.currency_id', 'contacts.first_name', 'contacts.last_name', 'contacts.email', 'payment_types.name as payment_type'); - if (!\Session::get('trash_payment')) + if (!\Session::get('show_trash')) { $query->where('payments.deleted_at', '=', null); } diff --git a/app/views/invoices/edit.blade.php b/app/views/invoices/edit.blade.php index 7f2477f2e3d7..baee61b8e469 100755 --- a/app/views/invoices/edit.blade.php +++ b/app/views/invoices/edit.blade.php @@ -207,9 +207,11 @@ - {{ Former::select('invoice_design_id')->label('Design')->style('display:inline;width:100px')->raw() +
+ {{ Former::select('invoice_design_id')->label('Design')->style('display:inline;width:120px')->raw() ->fromQuery($invoiceDesigns, 'name', 'id')->data_bind("value: invoice_design_id") }} - +
+ {{ Button::normal('Download PDF', array('onclick' => 'onDownloadClick()')) }} @if (!$invoice || (!$invoice->trashed() && !$invoice->client->trashed())) diff --git a/app/views/list.blade.php b/app/views/list.blade.php index 90f491cf29fb..deed03edbdc5 100755 --- a/app/views/list.blade.php +++ b/app/views/list.blade.php @@ -19,7 +19,7 @@