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') !!} + + +