From d8a501ed9516a498cc592762fafa17431cb44bc0 Mon Sep 17 00:00:00 2001 From: steenrabol Date: Thu, 7 Jan 2016 20:39:51 +0100 Subject: [PATCH] Posibility to modify payment terms --- app/Http/Controllers/AccountController.php | 16 +++ .../Controllers/PaymentTermController.php | 103 ++++++++++++++++++ .../Requests/CreatePaymentTermRequest.php | 30 +++++ app/Http/Requests/UpdateExpenseRequest.php | 4 +- app/Http/Requests/UpdatePaymentRequest.php | 6 +- .../Requests/UpdatePaymentTermRequest.php | 30 +++++ app/Http/routes.php | 10 +- app/Models/Account.php | 1 + app/Models/PaymentTerm.php | 15 ++- .../Repositories/PaymentTermRepository.php | 22 ++++ app/Services/PaymentTermService.php | 60 ++++++++++ database/.gitignore | 1 + ...1_07_173015_add_fields_to_paymentterms.php | 50 +++++++++ resources/lang/en/texts.php | 7 ++ .../views/accounts/payment_term.blade.php | 47 ++++++++ .../views/accounts/payment_terms.blade.php | 33 ++++++ 16 files changed, 426 insertions(+), 9 deletions(-) create mode 100644 app/Http/Controllers/PaymentTermController.php create mode 100644 app/Http/Requests/CreatePaymentTermRequest.php create mode 100644 app/Http/Requests/UpdatePaymentTermRequest.php create mode 100644 app/Ninja/Repositories/PaymentTermRepository.php create mode 100644 app/Services/PaymentTermService.php create mode 100644 database/migrations/2016_01_07_173015_add_fields_to_paymentterms.php create mode 100644 resources/views/accounts/payment_term.blade.php create mode 100644 resources/views/accounts/payment_terms.blade.php diff --git a/app/Http/Controllers/AccountController.php b/app/Http/Controllers/AccountController.php index dc890d7ed510..af9737caa42b 100644 --- a/app/Http/Controllers/AccountController.php +++ b/app/Http/Controllers/AccountController.php @@ -20,6 +20,7 @@ use App\Models\Account; use App\Models\Gateway; use App\Models\InvoiceDesign; use App\Models\TaxRate; +use App\Models\PaymentTerm; use App\Ninja\Repositories\AccountRepository; use App\Ninja\Repositories\ReferralRepository; use App\Ninja\Mailers\UserMailer; @@ -158,6 +159,8 @@ class AccountController extends BaseController return self::showProducts(); } elseif ($section === ACCOUNT_TAX_RATES) { return self::showTaxRates(); + } elseif ($section === ACCOUNT_PAYMENT_TERMS) { + return self::showPaymentTerms(); } elseif ($section === ACCOUNT_SYSTEM_SETTINGS) { return self::showSystemSettings(); } else { @@ -313,6 +316,17 @@ class AccountController extends BaseController return View::make('accounts.tax_rates', $data); } + private function showPaymentTerms() + { + $data = [ + 'account' => Auth::user()->account, + 'title' => trans('texts.payment_terms'), + 'taxRates' => PaymentTerm::scope()->get(['id', 'name', 'num_days']), + ]; + + return View::make('accounts.payment_terms', $data); + } + private function showInvoiceDesign($section) { $account = Auth::user()->account->load('country'); @@ -443,6 +457,8 @@ class AccountController extends BaseController return AccountController::saveProducts(); } elseif ($section === ACCOUNT_TAX_RATES) { return AccountController::saveTaxRates(); + } elseif ($section === ACCOUNT_PAYMENT_TERMS) { + return AccountController::savePaymetTerms(); } } diff --git a/app/Http/Controllers/PaymentTermController.php b/app/Http/Controllers/PaymentTermController.php new file mode 100644 index 000000000000..623ca1bf42da --- /dev/null +++ b/app/Http/Controllers/PaymentTermController.php @@ -0,0 +1,103 @@ +paymentTermService = $paymentTermService; + } + + public function index() + { + return Redirect::to('settings/' . ACCOUNT_PAYMENT_TERMS); + } + + public function getDatatable() + { + return $this->paymentTermService->getDatatable(); + } + + public function edit($publicId) + { + $data = [ + 'paymentTerm' => PaymentTerm::scope($publicId)->firstOrFail(), + 'method' => 'PUT', + 'url' => 'payment_terms/'.$publicId, + 'title' => trans('texts.edit_payment_term'), + ]; + + return View::make('accounts.payment_term', $data); + } + + public function create() + { + $data = [ + 'paymentTerm' => null, + 'method' => 'POST', + 'url' => 'payment_terms', + 'title' => trans('texts.create_payment_term'), + ]; + + return View::make('accounts.payment_term', $data); + } + + public function store() + { + return $this->save(); + } + + public function update($publicId) + { + return $this->save($publicId); + } + + private function save($publicId = false) + { + if ($publicId) { + $paymentTerm = PaymentTerm::scope($publicId)->firstOrFail(); + } else { + $paymentTerm = PaymentTerm::createNew(); + } + + $paymentTerm->name = trim(Input::get('name')); + $paymentTerm->num_days = Utils::parseInt(Input::get('num_days')); + $paymentTerm->save(); + + $message = $publicId ? trans('texts.updated_payment_term') : trans('texts.created_payment_term'); + Session::flash('message', $message); + + return Redirect::to('settings/' . ACCOUNT_PAYMENT_TERMS); + } + + public function bulk() + { + $action = Input::get('bulk_action'); + $ids = Input::get('bulk_public_id'); + $count = $this->paymentTermService->bulk($ids, $action); + + Session::flash('message', trans('texts.archived_payment_term')); + + return Redirect::to('settings/' . ACCOUNT_PAYMENT_TERMS); + } + +} diff --git a/app/Http/Requests/CreatePaymentTermRequest.php b/app/Http/Requests/CreatePaymentTermRequest.php new file mode 100644 index 000000000000..d8581793160e --- /dev/null +++ b/app/Http/Requests/CreatePaymentTermRequest.php @@ -0,0 +1,30 @@ + 'required', + 'name' => 'required', + ]; + } +} diff --git a/app/Http/Requests/UpdateExpenseRequest.php b/app/Http/Requests/UpdateExpenseRequest.php index 6ee77877e6c0..08555aaaaad4 100644 --- a/app/Http/Requests/UpdateExpenseRequest.php +++ b/app/Http/Requests/UpdateExpenseRequest.php @@ -23,6 +23,8 @@ class UpdateExpenseRequest extends Request */ public function rules() { - return []; + return [ + 'amount' => 'required|positive', + ]; } } diff --git a/app/Http/Requests/UpdatePaymentRequest.php b/app/Http/Requests/UpdatePaymentRequest.php index b3d4f536bc6e..29ac70e85e74 100644 --- a/app/Http/Requests/UpdatePaymentRequest.php +++ b/app/Http/Requests/UpdatePaymentRequest.php @@ -3,7 +3,7 @@ use App\Http\Requests\Request; use Illuminate\Validation\Factory; -class UpdateExpenseRequest extends Request +class UpdatePaymentRequest extends Request { /** * Determine if the user is authorized to make this request. @@ -22,9 +22,7 @@ class UpdateExpenseRequest extends Request */ public function rules() { - return [ - 'amount' => 'required|positive', - ]; + return []; } } diff --git a/app/Http/Requests/UpdatePaymentTermRequest.php b/app/Http/Requests/UpdatePaymentTermRequest.php new file mode 100644 index 000000000000..b3d4f536bc6e --- /dev/null +++ b/app/Http/Requests/UpdatePaymentTermRequest.php @@ -0,0 +1,30 @@ + 'required|positive', + ]; + + } +} diff --git a/app/Http/routes.php b/app/Http/routes.php index c94f16641abe..707aacff12e9 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -119,6 +119,12 @@ Route::group(['middleware' => 'auth'], function() { Route::get('settings/{section?}', 'AccountController@showSection'); Route::post('settings/{section?}', 'AccountController@doSection'); + // Payment term + Route::get('api/payment_terms', array('as'=>'api.payment_terms', 'uses'=>'PaymentTermController@getDatatable')); + Route::resource('payment_terms', 'PaymentTermController'); + Route::post('payment_terms/bulk', 'PaymentTermController@bulk'); + + Route::get('account/getSearchData', array('as' => 'getSearchData', 'uses' => 'AccountController@getSearchData')); Route::post('user/setTheme', 'UserController@setTheme'); Route::post('remove_logo', 'AccountController@removeLogo'); @@ -278,6 +284,7 @@ if (!defined('CONTACT_EMAIL')) { define('ENTITY_ACTIVITY', 'activity'); define('ENTITY_VENDOR','vendor'); define('ENTITY_EXPENSE', 'expense'); + define('ENTITY_PAYMENT_TERM','payment_term'); define('PERSON_CONTACT', 'contact'); define('PERSON_USER', 'user'); @@ -308,6 +315,7 @@ if (!defined('CONTACT_EMAIL')) { define('ACCOUNT_API_TOKENS', 'api_tokens'); define('ACCOUNT_CUSTOMIZE_DESIGN', 'customize_design'); define('ACCOUNT_SYSTEM_SETTINGS', 'system_settings'); + define('ACCOUNT_PAYMENT_TERMS','payment_terms'); define('ACTION_RESTORE', 'restore'); define('ACTION_ARCHIVE', 'archive'); @@ -568,7 +576,7 @@ if (!defined('CONTACT_EMAIL')) { 'dateFormats' => 'App\Models\DateFormat', 'datetimeFormats' => 'App\Models\DatetimeFormat', 'languages' => 'App\Models\Language', - 'paymentTerms' => 'App\Models\PaymentTerm', + //'paymentTerms' => 'App\Models\PaymentTerm', 'paymentTypes' => 'App\Models\PaymentType', 'countries' => 'App\Models\Country', 'invoiceDesigns' => 'App\Models\InvoiceDesign', diff --git a/app/Models/Account.php b/app/Models/Account.php index ae8276a48dd8..a089726b4958 100644 --- a/app/Models/Account.php +++ b/app/Models/Account.php @@ -30,6 +30,7 @@ class Account extends Eloquent ACCOUNT_PRODUCTS, ACCOUNT_NOTIFICATIONS, ACCOUNT_IMPORT_EXPORT, + ACCOUNT_PAYMENT_TERMS, ]; public static $advancedSettings = [ diff --git a/app/Models/PaymentTerm.php b/app/Models/PaymentTerm.php index de8cced5db72..dbb788aef1c2 100644 --- a/app/Models/PaymentTerm.php +++ b/app/Models/PaymentTerm.php @@ -1,8 +1,17 @@ where('payment_terms.account_id', '=', $accountId) + ->where('payment_terms.deleted_at', '=', null) + ->select('payment_terms.public_id', 'payment_terms.name', 'payment_terms.num_days', 'payment_terms.deleted_at'); + } +} diff --git a/app/Services/PaymentTermService.php b/app/Services/PaymentTermService.php new file mode 100644 index 000000000000..bfcf670475b9 --- /dev/null +++ b/app/Services/PaymentTermService.php @@ -0,0 +1,60 @@ +paymentTermRepo = $paymentTermRepo; + $this->datatableService = $datatableService; + } + + protected function getRepo() + { + return $this->paymentTermRepo; + } + + public function getDatatable($accountId = 0) + { + $query = $this->paymentTermRepo->find(); + + return $this->createDatatable(ENTITY_PAYMENT_TERM, $query, false); + } + + protected function getDatatableColumns($entityType, $hideClient) + { + return [ + [ + 'name', + function ($model) { + return link_to("payment_terms/{$model->public_id}/edit", $model->name); + } + ], + [ + 'days', + function ($model) { + return $model->num_days; + } + ] + ]; + } + + protected function getDatatableActions($entityType) + { + return [ + [ + uctrans('texts.edit_payment_terms'), + function ($model) { + return URL::to("payment_terms/{$model->public_id}/edit"); + } + ] + ]; + } +} \ No newline at end of file diff --git a/database/.gitignore b/database/.gitignore index 9b1dffd90fdc..bb55a4b89e24 100644 --- a/database/.gitignore +++ b/database/.gitignore @@ -1 +1,2 @@ *.sqlite +*-komodoproject \ No newline at end of file diff --git a/database/migrations/2016_01_07_173015_add_fields_to_paymentterms.php b/database/migrations/2016_01_07_173015_add_fields_to_paymentterms.php new file mode 100644 index 000000000000..1756cc60b246 --- /dev/null +++ b/database/migrations/2016_01_07_173015_add_fields_to_paymentterms.php @@ -0,0 +1,50 @@ +timestamps(); + $table->softDeletes(); + $table->integer('user_id', false, true); + $table->integer('account_id', false, true); + $table->integer('public_id')->default(0); + }); + + // Update public id + $paymentTerms = DB::table('payment_terms') + ->where('public_id', '=',0) + ->select('id', 'public_id') + ->get(); + $i = 1; + foreach ($paymentTerms as $pTerm) { + $data = ['public_id' => $i]; + + DB::table('paymet_terms')->where('id', $pTerm->id)->update($data); + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('payment_terms', function(Blueprint $table) + { + // + }); + } + +} diff --git a/resources/lang/en/texts.php b/resources/lang/en/texts.php index e7993b59ac58..be1067c43a3c 100644 --- a/resources/lang/en/texts.php +++ b/resources/lang/en/texts.php @@ -1032,4 +1032,11 @@ return array( 'expense_date' => 'Expense date', 'expense_exchange_rate_100' => 'The amount for 100 in company currency', 'expense_should_be_invoiced' => 'Should this expense be invoiced?', + + // Payment terms + 'num_days' => 'Number of days', + 'create_payment_term' => 'Create payment term', + 'edit_payment_terms' => 'Edit payment term', + 'edit_payment_term' => 'Edit payment term', + 'archive_payment_term' => 'Archive payment term', ); diff --git a/resources/views/accounts/payment_term.blade.php b/resources/views/accounts/payment_term.blade.php new file mode 100644 index 000000000000..a1939995dcbb --- /dev/null +++ b/resources/views/accounts/payment_term.blade.php @@ -0,0 +1,47 @@ +@extends('header') + +@section('content') + @parent + + @include('accounts.nav', ['selected' => ACCOUNT_PAYMENT_TERMS]) + + {!! Former::open($url)->method($method) + ->rules([ + 'name' => 'required', + 'num_days' => 'required' + ]) + ->addClass('warn-on-exit') !!} + + +
+
+

{!! $title !!}

+
+
+ + @if ($paymentTerm) + {{ Former::populate($paymentTerm) }} + @endif + + {!! Former::text('name')->label('texts.name') !!} + {!! Former::text('num_days')->label('texts.num_days') !!} + +
+
+ + {!! Former::actions( + Button::normal(trans('texts.cancel'))->large()->asLinkTo(URL::to('/settings/payment_terms'))->appendIcon(Icon::create('remove-circle')), + Button::success(trans('texts.save'))->submit()->large()->appendIcon(Icon::create('floppy-disk')) + ) !!} + + {!! Former::close() !!} + + + +@stop \ No newline at end of file diff --git a/resources/views/accounts/payment_terms.blade.php b/resources/views/accounts/payment_terms.blade.php new file mode 100644 index 000000000000..f88016991f13 --- /dev/null +++ b/resources/views/accounts/payment_terms.blade.php @@ -0,0 +1,33 @@ +@extends('header') + +@section('content') + @parent + + @include('accounts.nav', ['selected' => ACCOUNT_PAYMENT_TERMS]) + + {!! Button::primary(trans('texts.create_payment_term')) + ->asLinkTo(URL::to('/payment_terms/create')) + ->withAttributes(['class' => 'pull-right']) + ->appendIcon(Icon::create('plus-sign')) !!} + + @include('partials.bulk_form', ['entityType' => ENTITY_PAYMENT_TERM]) + + {!! Datatable::table() + ->addColumn( + trans('texts.name'), + trans('texts.num_days'), + trans('texts.action')) + ->setUrl(url('api/payment_terms/')) + ->setOptions('sPaginationType', 'bootstrap') + ->setOptions('bFilter', false) + ->setOptions('bAutoWidth', false) + ->setOptions('aoColumns', [[ "sWidth"=> "40%" ], [ "sWidth"=> "40%" ], ["sWidth"=> "20%"]]) + ->setOptions('aoColumnDefs', [['bSortable'=>false, 'aTargets'=>[2]]]) + ->render('datatable') !!} + + + + +@stop \ No newline at end of file