mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2024-09-19 16:01:34 +02:00
Posibility to modify payment terms
This commit is contained in:
parent
eed8ee55a1
commit
d8a501ed95
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
103
app/Http/Controllers/PaymentTermController.php
Normal file
103
app/Http/Controllers/PaymentTermController.php
Normal file
@ -0,0 +1,103 @@
|
||||
<?php namespace App\Http\Controllers;
|
||||
|
||||
use Auth;
|
||||
use Str;
|
||||
use DB;
|
||||
use Datatable;
|
||||
use Utils;
|
||||
use URL;
|
||||
use View;
|
||||
use Input;
|
||||
use Session;
|
||||
use Redirect;
|
||||
|
||||
use App\Models\PaymentTerm;
|
||||
use App\Ninja\Repositories\VendorRepository;
|
||||
use App\Services\PaymentService;
|
||||
use App\Services\PaymentTermService;
|
||||
|
||||
class PaymentTermController extends BaseController
|
||||
{
|
||||
protected $paymentTermService;
|
||||
|
||||
public function __construct(PaymentTermService $paymentTermService)
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
$this->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);
|
||||
}
|
||||
|
||||
}
|
30
app/Http/Requests/CreatePaymentTermRequest.php
Normal file
30
app/Http/Requests/CreatePaymentTermRequest.php
Normal file
@ -0,0 +1,30 @@
|
||||
<?php namespace app\Http\Requests;
|
||||
|
||||
use App\Http\Requests\Request;
|
||||
use Illuminate\Validation\Factory;
|
||||
|
||||
class CreatePaymentTermRequest extends Request
|
||||
{
|
||||
/**
|
||||
* Determine if the user is authorized to make this request.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function authorize()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
'num_days' => 'required',
|
||||
'name' => 'required',
|
||||
];
|
||||
}
|
||||
}
|
@ -23,6 +23,8 @@ class UpdateExpenseRequest extends Request
|
||||
*/
|
||||
public function rules()
|
||||
{
|
||||
return [];
|
||||
return [
|
||||
'amount' => 'required|positive',
|
||||
];
|
||||
}
|
||||
}
|
||||
|
@ -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 [];
|
||||
|
||||
}
|
||||
}
|
||||
|
30
app/Http/Requests/UpdatePaymentTermRequest.php
Normal file
30
app/Http/Requests/UpdatePaymentTermRequest.php
Normal file
@ -0,0 +1,30 @@
|
||||
<?php namespace app\Http\Requests;
|
||||
|
||||
use App\Http\Requests\Request;
|
||||
use Illuminate\Validation\Factory;
|
||||
|
||||
class UpdateExpenseRequest extends Request
|
||||
{
|
||||
/**
|
||||
* Determine if the user is authorized to make this request.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function authorize()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
'amount' => 'required|positive',
|
||||
];
|
||||
|
||||
}
|
||||
}
|
@ -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',
|
||||
|
@ -30,6 +30,7 @@ class Account extends Eloquent
|
||||
ACCOUNT_PRODUCTS,
|
||||
ACCOUNT_NOTIFICATIONS,
|
||||
ACCOUNT_IMPORT_EXPORT,
|
||||
ACCOUNT_PAYMENT_TERMS,
|
||||
];
|
||||
|
||||
public static $advancedSettings = [
|
||||
|
@ -1,8 +1,17 @@
|
||||
<?php namespace App\Models;
|
||||
|
||||
use Eloquent;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
|
||||
class PaymentTerm extends Eloquent
|
||||
class PaymentTerm extends EntityModel
|
||||
{
|
||||
public $timestamps = false;
|
||||
use SoftDeletes;
|
||||
|
||||
public $timestamps = true;
|
||||
protected $dates = ['deleted_at'];
|
||||
|
||||
public function getEntityType()
|
||||
{
|
||||
return ENTITY_PAYMENT_TERM;
|
||||
}
|
||||
|
||||
}
|
||||
|
22
app/Ninja/Repositories/PaymentTermRepository.php
Normal file
22
app/Ninja/Repositories/PaymentTermRepository.php
Normal file
@ -0,0 +1,22 @@
|
||||
<?php namespace App\Ninja\Repositories;
|
||||
|
||||
use DB;
|
||||
use Utils;
|
||||
use App\Models\PaymentTerm;
|
||||
use App\Ninja\Repositories\BaseRepository;
|
||||
|
||||
class PaymentTermRepository extends BaseRepository
|
||||
{
|
||||
public function getClassName()
|
||||
{
|
||||
return 'App\Models\PaymentTerm';
|
||||
}
|
||||
|
||||
public function find($accountId = 0)
|
||||
{
|
||||
return DB::table('payment_terms')
|
||||
//->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');
|
||||
}
|
||||
}
|
60
app/Services/PaymentTermService.php
Normal file
60
app/Services/PaymentTermService.php
Normal file
@ -0,0 +1,60 @@
|
||||
<?php namespace App\Services;
|
||||
|
||||
use URL;
|
||||
use Auth;
|
||||
use App\Services\BaseService;
|
||||
use App\Ninja\Repositories\PaymentTermRepository;
|
||||
|
||||
class PaymentTermService extends BaseService
|
||||
{
|
||||
protected $paymentTermRepo;
|
||||
protected $datatableService;
|
||||
|
||||
public function __construct(PaymentTermRepository $paymentTermRepo, DatatableService $datatableService)
|
||||
{
|
||||
$this->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");
|
||||
}
|
||||
]
|
||||
];
|
||||
}
|
||||
}
|
1
database/.gitignore
vendored
1
database/.gitignore
vendored
@ -1 +1,2 @@
|
||||
*.sqlite
|
||||
*-komodoproject
|
@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AddFieldsToPaymentterms extends Migration {
|
||||
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('payment_terms', function(Blueprint $table)
|
||||
{
|
||||
$table->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)
|
||||
{
|
||||
//
|
||||
});
|
||||
}
|
||||
|
||||
}
|
@ -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',
|
||||
);
|
||||
|
47
resources/views/accounts/payment_term.blade.php
Normal file
47
resources/views/accounts/payment_term.blade.php
Normal file
@ -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') !!}
|
||||
|
||||
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h3 class="panel-title">{!! $title !!}</h3>
|
||||
</div>
|
||||
<div class="panel-body form-padding-right">
|
||||
|
||||
@if ($paymentTerm)
|
||||
{{ Former::populate($paymentTerm) }}
|
||||
@endif
|
||||
|
||||
{!! Former::text('name')->label('texts.name') !!}
|
||||
{!! Former::text('num_days')->label('texts.num_days') !!}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{!! 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() !!}
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
$(function() {
|
||||
$('#name').focus();
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
@stop
|
33
resources/views/accounts/payment_terms.blade.php
Normal file
33
resources/views/accounts/payment_terms.blade.php
Normal file
@ -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') !!}
|
||||
|
||||
<script>
|
||||
window.onDatatableReady = actionListHandler;
|
||||
</script>
|
||||
|
||||
|
||||
@stop
|
Loading…
Reference in New Issue
Block a user