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', - )); }} + )); }} +
- {{ Former::hidden('data')->data_bind("value: ko.toJSON(model)") }} + {{ Former::hidden('data')->data_bind("value: ko.mapping.toJSON(model)") }}
Description | Unit Cost | Quantity | -Tax | +Tax | Line Total | @@ -131,11 +133,11 @@- | - + | + | - + |
---|---|---|---|---|---|---|---|
- | + | Subtotal | -+ | ||||
Discount | -+ | ||||||
Tax | -- | + | + | ||||
Paid to Date | |||||||
Balance Due | -+ |
@@ -253,7 +256,7 @@