diff --git a/app/controllers/InvoiceController.php b/app/controllers/InvoiceController.php index f4501c4bbbd3..b185f4310d13 100755 --- a/app/controllers/InvoiceController.php +++ b/app/controllers/InvoiceController.php @@ -317,6 +317,7 @@ class InvoiceController extends \BaseController { $data = array( 'account' => $invoice->account, 'invoice' => $invoice, + 'data' => false, 'method' => 'PUT', 'invitationContactIds' => $contactIds, 'url' => 'invoices/' . $publicId, @@ -338,13 +339,13 @@ class InvoiceController extends \BaseController { $data = array( 'account' => $account, - 'invoice' => null, + 'invoice' => null, + 'data' => Input::old('data'), 'invoiceNumber' => $invoiceNumber, 'method' => 'POST', 'url' => 'invoices', 'title' => '- New Invoice', - 'client' => $client, - 'items' => json_decode(Input::old('items'))); + 'client' => $client); $data = array_merge($data, InvoiceController::getViewModel()); return View::make('invoices.edit', $data); } @@ -393,20 +394,21 @@ class InvoiceController extends \BaseController { } $input = json_decode(Input::get('data')); - - if (!$input->client->contacts[0]->email) + $invoice = $input->invoice; + + if ($errors = $this->invoiceRepo->getErrors($invoice)) { return Redirect::to('invoices/create') - ->withInput(); + ->withInput()->withErrors($errors); } else { $this->taxRateRepo->save($input->tax_rates); - $clientData = (array) $input->client; - $client = $this->clientRepo->save($input->client->public_id, $clientData); - - $invoiceData = (array) $input; + $clientData = (array) $invoice->client; + $client = $this->clientRepo->save($invoice->client->public_id, $clientData); + + $invoiceData = (array) $invoice; $invoiceData['client_id'] = $client->id; $invoice = $this->invoiceRepo->save($publicId, $invoiceData); @@ -454,7 +456,7 @@ class InvoiceController extends \BaseController { } $message = ''; - if ($input->client->public_id == '-1') + if ($input->invoice->client->public_id == '-1') { $message = ' and created client'; $url = URL::to('clients/' . $client->public_id); 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 7fdc6e95ae11..27bd519a6ee4 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 @@ -321,6 +321,7 @@ class ConfideSetupUsersTable extends Migration { $t->unsignedInteger('public_id')->index(); $t->unique( array('account_id','public_id') ); + $t->unique( array('account_id','invoice_number') ); }); diff --git a/app/ninja/repositories/InvoiceRepository.php b/app/ninja/repositories/InvoiceRepository.php index 70429fd0e60f..0d7065bae014 100755 --- a/app/ninja/repositories/InvoiceRepository.php +++ b/app/ninja/repositories/InvoiceRepository.php @@ -68,6 +68,29 @@ class InvoiceRepository return $query; } + public function getErrors($input) + { + $contact = (array) $input->client->contacts[0]; + $rules = ['email' => 'required|email']; + $validator = \Validator::make($contact, $rules); + + if ($validator->fails()) + { + return $validator; + } + + $invoice = (array) $input; + $rules = ['invoice_number' => 'unique:invoices,invoice_number,' . $input->id]; + $validator = \Validator::make($invoice, $rules); + + if ($validator->fails()) + { + return $validator; + } + + return false; + } + public function save($publicId, $data) { if ($publicId) @@ -94,10 +117,10 @@ class InvoiceRepository $invoice->po_number = trim($data['po_number']); $invoice->currency_id = $data['currency_id']; - if (isset($data['tax']) && isset($data['tax']->rate) && floatval($data['tax']->rate) > 0) + if (isset($data['tax_rate']) && floatval($data['tax_rate']) > 0) { - $invoice->tax_rate = floatval($data['tax']->rate); - $invoice->tax_name = trim($data['tax']->name); + $invoice->tax_rate = floatval($data['tax_rate']); + $invoice->tax_name = trim($data['tax_name']); } else { @@ -144,10 +167,10 @@ class InvoiceRepository $invoiceItem->qty = floatval($item->qty); $invoiceItem->tax_rate = 0; - if ($item->tax && isset($item->tax->rate) && floatval($item->tax->rate) > 0) + if (isset($item->tax_rate) && floatval($item->tax_rate) > 0) { - $invoiceItem->tax_rate = floatval($item->tax->rate); - $invoiceItem->tax_name = trim($item->tax->name); + $invoiceItem->tax_rate = floatval($item->tax_rate); + $invoiceItem->tax_name = trim($item->tax_name); } $invoice->invoice_items()->save($invoiceItem); diff --git a/app/ninja/repositories/TaxRateRepository.php b/app/ninja/repositories/TaxRateRepository.php index 4f91999c8519..97957ba698df 100755 --- a/app/ninja/repositories/TaxRateRepository.php +++ b/app/ninja/repositories/TaxRateRepository.php @@ -10,7 +10,7 @@ class TaxRateRepository foreach ($taxRates as $record) { - if (!isset($record->rate) || $record->is_deleted) + if (!isset($record->rate) || (isset($record->is_deleted) && $record->is_deleted)) { continue; } diff --git a/app/routes.php b/app/routes.php index 8440f73a83d1..fb8635382e0c 100755 --- a/app/routes.php +++ b/app/routes.php @@ -21,6 +21,7 @@ include_once(app_path().'/libraries/utils.php'); // TODO_FIX include_once(app_path().'/handlers/UserEventHandler.php'); // TODO_FIX + Route::get('/send_emails', function() { Artisan::call('ninja:send-invoices'); }); @@ -172,4 +173,9 @@ define('DEFAULT_CURRENCY', 1); // US Dollar define('DEFAULT_DATE_FORMAT', 'M j, Y'); define('DEFAULT_DATE_PICKER_FORMAT', 'M d, yyyy'); define('DEFAULT_DATETIME_FORMAT', 'F j, Y, g:i a'); -define('DEFAULT_QUERY_CACHE', 120); \ No newline at end of file +define('DEFAULT_QUERY_CACHE', 120); + + +if (Auth::check() && !Session::has(SESSION_TIMEZONE)) { + Event::fire('user.refresh'); +} \ No newline at end of file diff --git a/app/views/invoices/edit.blade.php b/app/views/invoices/edit.blade.php index 82531a1f3594..4eb1fe4bbb0b 100755 --- a/app/views/invoices/edit.blade.php +++ b/app/views/invoices/edit.blade.php @@ -9,14 +9,16 @@ @section('content') +

 

{{ Former::open($url)->method($method)->addClass('main_form')->rules(array( 'client' => 'required', 'email' => 'required', 'product_key' => 'max:14', - )); }} + )); }} +
@@ -24,7 +26,7 @@
@@ -35,7 +37,7 @@
- +
@@ -48,7 +50,7 @@
@@ -89,7 +91,7 @@ @@ -98,7 +100,7 @@

 

- {{ Former::hidden('data')->data_bind("value: ko.toJSON(model)") }} + {{ Former::hidden('data')->data_bind("value: ko.mapping.toJSON(model)") }} @@ -108,7 +110,7 @@ - + @@ -131,11 +133,11 @@ - - + - + - + - - + + - +
Description Unit Cost QuantityTaxTax Line Total
- + + - +   @@ -146,34 +148,34 @@
- + Subtotal
- + Discount
- + Tax
- + Paid to Date
- + Balance Due
@@ -183,8 +185,9 @@
{{ Former::text('action') }} - @if ($invoice) + @if ($invoice) {{ Former::text('id') }} + {{ Former::populateField('id', $invoice->id) }} @endif
@@ -202,12 +205,12 @@ array('Delete Invoice', "javascript:onDeleteClick()"), ) ) - , array('id'=>'actionDropDown', 'style'=>'text-align:left', 'data-bind'=>'css: saveButtonEnabled'))->split(); }} + , array('id'=>'actionDropDown', 'style'=>'text-align:left', 'data-bind'=>'css: enable.save'))->split(); }} @else - {{ Button::primary_submit('Save Invoice', array('data-bind'=>'css: saveButtonEnabled')) }} + {{ Button::primary_submit('Save Invoice', array('data-bind'=>'css: enable.save')) }} @endif - {{ Button::primary('Send Email', array('id' => 'email_button', 'onclick' => 'onEmailClick()', 'data-bind' => 'css: emailButtonEnabled')) }} + {{ Button::primary('Send Email', array('id' => 'email_button', 'onclick' => 'onEmailClick()', 'data-bind' => 'css: enable.email')) }}

 

@@ -253,7 +256,7 @@
{{ Former::legend('Additional Info') }} - {{ Former::select('payment_terms')->addOption('','')->data_bind('value: payment_terms') + {{ Former::select('payment_terms')->addOption('','0')->data_bind('value: payment_terms') ->fromQuery($paymentTerms, 'name', 'num_days') }} {{ Former::select('currency_id')->addOption('','')->label('Currency')->data_bind('value: currency_id') ->fromQuery($currencies, 'name', 'id') }} @@ -289,7 +292,7 @@
@@ -314,7 +317,7 @@ - + @@ -324,7 +327,7 @@ -   +   @@ -332,15 +335,15 @@   {{ Former::checkbox('invoice_taxes')->text('Enable specifying an invoice tax') - ->label('Settings')->data_bind('checked: invoice_taxes, enable: tax_rates().length > 1') }} + ->label('Settings')->data_bind('checked: $root.invoice_taxes, enable: $root.tax_rates().length > 1') }} {{ Former::checkbox('invoice_item_taxes')->text('Enable specifying line item taxes') - ->label(' ')->data_bind('checked: invoice_item_taxes, enable: tax_rates().length > 1') }} + ->label(' ')->data_bind('checked: $root.invoice_item_taxes, enable: $root.tax_rates().length > 1') }} @@ -349,6 +352,7 @@ {{ Former::close() }} +