diff --git a/app/Http/Controllers/AccountController.php b/app/Http/Controllers/AccountController.php index 9ec3fea97ef9..2435f70119e8 100644 --- a/app/Http/Controllers/AccountController.php +++ b/app/Http/Controllers/AccountController.php @@ -1065,6 +1065,7 @@ class AccountController extends BaseController $account->quote_terms = Input::get('quote_terms'); $account->auto_convert_quote = Input::get('auto_convert_quote'); $account->auto_archive_quote = Input::get('auto_archive_quote'); + $account->require_approve_quote = Input::get('require_approve_quote'); $account->allow_approve_expired_quote = Input::get('allow_approve_expired_quote'); $account->auto_archive_invoice = Input::get('auto_archive_invoice'); $account->auto_email_invoice = Input::get('auto_email_invoice'); diff --git a/app/Http/Controllers/ClientPortalController.php b/app/Http/Controllers/ClientPortalController.php index e1f27d331fbc..4bf1c92849d8 100644 --- a/app/Http/Controllers/ClientPortalController.php +++ b/app/Http/Controllers/ClientPortalController.php @@ -146,13 +146,14 @@ class ClientPortalController extends BaseController } } - $showApprove = $invoice->quote_invoice_id ? false : true; + $showApprove = ($invoice->isQuote() && $account->require_approve_quote) ? true: false; if ($invoice->invoice_status_id >= INVOICE_STATUS_APPROVED) { $showApprove = false; } $data += [ 'account' => $account, + 'approveRequired' => $account->require_approve_quote, 'showApprove' => $showApprove, 'showBreadcrumbs' => false, 'invoice' => $invoice->hidePrivateFields(), diff --git a/app/Models/Account.php b/app/Models/Account.php index 008c99e7e941..2bfd0916dbca 100644 --- a/app/Models/Account.php +++ b/app/Models/Account.php @@ -109,6 +109,8 @@ class Account extends Eloquent 'body_font_id', 'auto_convert_quote', 'auto_archive_quote', + 'require_approve_quote', + 'allow_approve_expired_quote', 'auto_archive_invoice', 'auto_email_invoice', 'all_pages_footer', diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php index 334eb49a7c11..ad4ba8d42566 100644 --- a/app/Models/Invoice.php +++ b/app/Models/Invoice.php @@ -787,7 +787,15 @@ class Invoice extends EntityModel implements BalanceAffecting public function canBePaid() { - return ! $this->isPaid() && ! $this->is_deleted && $this->isStandard(); + // already paid or deleted + if ($this->isPaid() || $this->is_deleted) return false; + + // if quote approve is required, them only standard invoices can be paid + if ($this->account->require_approve_quote) { + return $this->isStandard(); + } + + return true; } public static function calcStatusLabel($status, $class, $entityType, $quoteInvoiceId) diff --git a/database/migrations/2019_04_29_073828_add_require_approve_quote.php b/database/migrations/2019_04_29_073828_add_require_approve_quote.php new file mode 100644 index 000000000000..8a728bde4034 --- /dev/null +++ b/database/migrations/2019_04_29_073828_add_require_approve_quote.php @@ -0,0 +1,32 @@ +boolean('require_approve_quote')->default(1); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('accounts', function ($table) { + $table->dropColumn('require_approve_quote'); + }); + } +} diff --git a/resources/lang/en/texts.php b/resources/lang/en/texts.php index 4842af52adc8..f223fc96cc7c 100644 --- a/resources/lang/en/texts.php +++ b/resources/lang/en/texts.php @@ -2842,6 +2842,8 @@ $LANG = array( 'auto_archive_invoice_help' => 'Automatically archive invoices when they are paid.', 'auto_archive_quote' => 'Auto Archive', 'auto_archive_quote_help' => 'Automatically archive quotes when they are converted.', + 'require_approve_quote' => 'Require approve quote', + 'require_approve_quote_help' => 'Require clients to approve quotes.', 'allow_approve_expired_quote' => 'Allow approve expired quote', 'allow_approve_expired_quote_help' => 'Allow clients to approve expired quotes.', 'invoice_workflow' => 'Invoice Workflow', diff --git a/resources/views/accounts/invoice_settings.blade.php b/resources/views/accounts/invoice_settings.blade.php index e79e4a325a15..72cd1229c4d2 100644 --- a/resources/views/accounts/invoice_settings.blade.php +++ b/resources/views/accounts/invoice_settings.blade.php @@ -415,6 +415,11 @@ ->blockHelp(trans('texts.auto_archive_quote_help')) ->value(1) !!} + {!! Former::checkbox('require_approve_quote') + ->text(trans('texts.enable')) + ->blockHelp(trans('texts.require_approve_quote')) + ->value(1) !!} + {!! Former::checkbox('allow_approve_expired_quote') ->text(trans('texts.enable')) ->blockHelp(trans('texts.allow_approve_expired_quote_help')) diff --git a/resources/views/invoices/view.blade.php b/resources/views/invoices/view.blade.php index d7652eb21d83..fb026a746f47 100644 --- a/resources/views/invoices/view.blade.php +++ b/resources/views/invoices/view.blade.php @@ -160,7 +160,7 @@ @include($partialView) @else
- @if ($invoice->isQuote()) + @if ($invoice->isQuote() && $approveRequired) {!! Button::normal(trans('texts.download'))->withAttributes(['onclick' => 'onDownloadClick()'])->large() !!}   @if ($showApprove) {!! Button::success(trans('texts.approve'))->withAttributes(['id' => 'approveButton', 'onclick' => 'onApproveClick()', 'class' => 'require-authorization'])->large() !!}