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': {