diff --git a/app/Http/Controllers/InvoiceController.php b/app/Http/Controllers/InvoiceController.php
index 0106f6cf8937..b18951594d84 100644
--- a/app/Http/Controllers/InvoiceController.php
+++ b/app/Http/Controllers/InvoiceController.php
@@ -611,4 +611,15 @@ class InvoiceController extends BaseController
return View::make('invoices.history', $data);
}
+
+ public function checkInvoiceNumber($invoiceNumber)
+ {
+ $count = Invoice::scope()
+ ->whereInvoiceNumber($invoiceNumber)
+ ->withTrashed()
+ ->count();
+
+ return $count ? RESULT_FAILURE : RESULT_SUCCESS;
+ }
+
}
diff --git a/app/Http/routes.php b/app/Http/routes.php
index e0062cc1f71a..ae10edc82a3f 100644
--- a/app/Http/routes.php
+++ b/app/Http/routes.php
@@ -125,7 +125,8 @@ Route::group(['middleware' => 'auth:user'], function() {
Route::get('view_archive/{entity_type}/{visible}', 'AccountController@setTrashVisible');
Route::get('hide_message', 'HomeController@hideMessage');
Route::get('force_inline_pdf', 'UserController@forcePDFJS');
- Route::get('account/getSearchData', ['as' => 'getSearchData', 'uses' => 'AccountController@getSearchData']);
+ Route::get('account/get_search_data', ['as' => 'get_search_data', 'uses' => 'AccountController@getSearchData']);
+ Route::get('check_invoice_number/{invoice_number}', 'InvoiceController@checkInvoiceNumber');
Route::get('settings/user_details', 'AccountController@showUserDetails');
Route::post('settings/user_details', 'AccountController@saveUserDetails');
diff --git a/resources/views/header.blade.php b/resources/views/header.blade.php
index 4eaa4de24a4e..2ca594363631 100644
--- a/resources/views/header.blade.php
+++ b/resources/views/header.blade.php
@@ -234,7 +234,7 @@
if (!window.loadedSearchData) {
trackEvent('/activity', '/search');
- var request = $.get('{{ URL::route('getSearchData') }}', function(data) {
+ var request = $.get('{{ URL::route('get_search_data') }}', function(data) {
$('#search').typeahead({
hint: true,
highlight: true,
diff --git a/resources/views/invoices/edit.blade.php b/resources/views/invoices/edit.blade.php
index 3ede53d95cbc..0ee90310192c 100644
--- a/resources/views/invoices/edit.blade.php
+++ b/resources/views/invoices/edit.blade.php
@@ -162,6 +162,8 @@
{!! Former::text('invoice_number')
->label(trans("texts.{$entityType}_number_short"))
+ ->onchange('checkInvoiceNumber()')
+ ->addGroupClass('invoice-number')
->data_bind("value: invoice_number, valueUpdate: 'afterkeydown'") !!}
@if($account->getTokenGatewayId())
@@ -1296,6 +1298,11 @@
return false;
}
+ // check invoice number is unique
+ if ($('.invoice-number').hasClass('has-error')) {
+ return false;
+ }
+
if (!isSaveValid()) {
model.showClientForm();
return false;
diff --git a/resources/views/invoices/knockout.blade.php b/resources/views/invoices/knockout.blade.php
index 49a538c5db27..5ff34c6aaf0f 100644
--- a/resources/views/invoices/knockout.blade.php
+++ b/resources/views/invoices/knockout.blade.php
@@ -895,4 +895,25 @@ ko.bindingHandlers.productTypeahead = {
}
};
+function checkInvoiceNumber() {
+ var url = '{{ url('check_invoice_number') }}/' + $('#invoice_number').val();
+ $.get(url, function(data) {
+ var isValid = data == '{{ RESULT_SUCCESS }}' ? true : false;
+ if (isValid) {
+ $('.invoice-number')
+ .removeClass('has-error')
+ .find('span')
+ .hide();
+ } else {
+ if ($('.invoice-number').hasClass('has-error')) {
+ return;
+ }
+ $('.invoice-number')
+ .addClass('has-error')
+ .find('div')
+ .append('{{ trans('validation.unique', ['attribute' => trans('texts.invoice_number')]) }}');
+ }
+ });
+}
+