6 changed files with 427 additions and 0 deletions
-
142app/Http/Controllers/References/BankAccountsController.php
-
28resources/lang/id/bank_account.php
-
65resources/views/bank-accounts/forms.blade.php
-
66resources/views/bank-accounts/index.blade.php
-
5routes/web/references.php
-
121tests/Feature/References/ManageBankAccountsTest.php
@ -0,0 +1,142 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Http\Controllers\References; |
||||
|
|
||||
|
use App\Entities\Options\Option; |
||||
|
use App\Http\Controllers\Controller; |
||||
|
use Illuminate\Http\Request; |
||||
|
|
||||
|
class BankAccountsController extends Controller |
||||
|
{ |
||||
|
/** |
||||
|
* Display a listing of the bankAccount. |
||||
|
* |
||||
|
* @return \Illuminate\Http\Response |
||||
|
*/ |
||||
|
public function index() |
||||
|
{ |
||||
|
$editableBankAccount = null; |
||||
|
$bankAccounts = Option::where('key', 'bank_accounts')->first(); |
||||
|
|
||||
|
if (!is_null($bankAccounts)) { |
||||
|
$bankAccounts = $bankAccounts->value; |
||||
|
$bankAccounts = json_decode($bankAccounts, true); |
||||
|
|
||||
|
if (in_array(request('action'), ['edit', 'delete']) && request('id') != null) { |
||||
|
$editableBankAccount = (object) $bankAccounts[request('id')]; |
||||
|
} |
||||
|
} else { |
||||
|
$bankAccounts = []; |
||||
|
} |
||||
|
|
||||
|
return view('bank-accounts.index', compact('bankAccounts', 'editableBankAccount')); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Store a newly created bank account in storage. |
||||
|
* |
||||
|
* @param \Illuminate\Http\Request $request |
||||
|
* @return \Illuminate\Http\Response |
||||
|
*/ |
||||
|
public function store(Request $request) |
||||
|
{ |
||||
|
$newBankAccount = $request->validate([ |
||||
|
'name' => 'required|max:60', |
||||
|
'number' => 'required|max:60', |
||||
|
'account_name' => 'required|max:60', |
||||
|
'description' => 'nullable|max:255', |
||||
|
]); |
||||
|
|
||||
|
$option = Option::firstOrNew(['key' => 'bank_accounts']); |
||||
|
if ($option->exists) { |
||||
|
$bankAccounts = $option->value; |
||||
|
$bankAccounts = json_decode($bankAccounts, true); |
||||
|
if ($bankAccounts == []) { |
||||
|
$bankAccounts[1] = $newBankAccount; |
||||
|
} else { |
||||
|
$bankAccounts[] = $newBankAccount; |
||||
|
} |
||||
|
} else { |
||||
|
$bankAccounts = []; |
||||
|
$bankAccounts[1] = $newBankAccount; |
||||
|
} |
||||
|
|
||||
|
$bankAccounts = json_encode($bankAccounts); |
||||
|
|
||||
|
$option->value = $bankAccounts; |
||||
|
$option->save(); |
||||
|
|
||||
|
flash(trans('bank_account.created'), 'success'); |
||||
|
|
||||
|
return redirect()->route('bank-accounts.index'); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Update the specified bank account in storage. |
||||
|
* |
||||
|
* @param \Illuminate\Http\Request $request |
||||
|
* @param \App\Entities\Invoices\BankAccount $bankAccount |
||||
|
* @return \Illuminate\Http\Response |
||||
|
*/ |
||||
|
public function update(Request $request, $bankAccountId) |
||||
|
{ |
||||
|
$bankAccountData = $request->validate([ |
||||
|
'name' => 'required|max:60', |
||||
|
'number' => 'required|max:60', |
||||
|
'account_name' => 'required|max:60', |
||||
|
'description' => 'nullable|max:255', |
||||
|
]); |
||||
|
|
||||
|
$bankAccounts = Option::where('key', 'bank_accounts')->first(); |
||||
|
|
||||
|
$bankAccounts = $bankAccounts->value; |
||||
|
$bankAccounts = json_decode($bankAccounts, true); |
||||
|
|
||||
|
$bankAccounts[$bankAccountId] = $bankAccountData; |
||||
|
|
||||
|
$bankAccounts = json_encode($bankAccounts); |
||||
|
|
||||
|
$option = Option::where('key', 'bank_accounts')->first(); |
||||
|
$option->value = $bankAccounts; |
||||
|
$option->save(); |
||||
|
|
||||
|
flash(trans('bank_account.updated'), 'success'); |
||||
|
|
||||
|
return redirect()->route('bank-accounts.index'); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Remove the specified bank account from storage. |
||||
|
* |
||||
|
* @param \App\Entities\Invoices\BankAccount $bankAccount |
||||
|
* @return \Illuminate\Http\Response |
||||
|
*/ |
||||
|
public function destroy($bankAccountId) |
||||
|
{ |
||||
|
request()->validate([ |
||||
|
'bank_account_id' => 'required', |
||||
|
]); |
||||
|
|
||||
|
if (request('bank_account_id') == $bankAccountId) { |
||||
|
|
||||
|
$bankAccounts = Option::where('key', 'bank_accounts')->first(); |
||||
|
|
||||
|
$bankAccounts = $bankAccounts->value; |
||||
|
$bankAccounts = json_decode($bankAccounts, true); |
||||
|
|
||||
|
unset($bankAccounts[$bankAccountId]); |
||||
|
|
||||
|
$bankAccounts = json_encode($bankAccounts); |
||||
|
|
||||
|
$option = Option::where('key', 'bank_accounts')->first(); |
||||
|
$option->value = $bankAccounts; |
||||
|
$option->save(); |
||||
|
|
||||
|
flash(trans('bank_account.deleted'), 'success'); |
||||
|
|
||||
|
return redirect()->route('bank-accounts.index'); |
||||
|
} |
||||
|
|
||||
|
return back(); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,28 @@ |
|||||
|
<?php |
||||
|
|
||||
|
return [ |
||||
|
// Labels
|
||||
|
'bank_account' => 'Rekening Bank', |
||||
|
'list' => 'Daftar Rekening Bank', |
||||
|
'empty' => 'Belum ada Rekening Bank', |
||||
|
'back_to_index' => 'Kembali ke daftar Rekening Bank', |
||||
|
|
||||
|
// Actions
|
||||
|
'create' => 'Input Rekening Bank Baru', |
||||
|
'created' => 'Input Rekening Bank baru telah berhasil.', |
||||
|
'show' => 'Lihat Detail Rekening Bank', |
||||
|
'edit' => 'Edit Rekening Bank', |
||||
|
'update' => 'Update Rekening Bank', |
||||
|
'updated' => 'Update data Rekening Bank telah berhasil.', |
||||
|
'delete' => 'Hapus Rekening Bank', |
||||
|
'delete_confirm' => 'Anda yakin akan menghapus Rekening Bank ini?', |
||||
|
'deleted' => 'Hapus data Rekening Bank telah berhasil.', |
||||
|
'undeleted' => 'Data Rekening Bank gagal dihapus.', |
||||
|
'undeleteable' => 'Data Rekening Bank tidak dapat dihapus.', |
||||
|
|
||||
|
// Attributes
|
||||
|
'name' => 'Nama Bank', |
||||
|
'number' => 'No. Rekening', |
||||
|
'account_name' => 'Atas Nama', |
||||
|
'description' => 'Deskripsi', |
||||
|
]; |
||||
@ -0,0 +1,65 @@ |
|||||
|
@if (Request::get('action') == 'create') |
||||
|
<div class="panel panel-default"> |
||||
|
<div class="panel-heading"><h3 class="panel-title">{{ trans('bank_account.create') }}</h3></div> |
||||
|
{!! Form::open(['route' => 'bank-accounts.store']) !!} |
||||
|
<div class="panel-body"> |
||||
|
{!! FormField::text('name', ['required' => true, 'label' => trans('bank_account.name')]) !!} |
||||
|
{!! FormField::text('number', ['required' => true, 'label' => trans('bank_account.number')]) !!} |
||||
|
{!! FormField::text('account_name', ['required' => true, 'label' => trans('bank_account.account_name')]) !!} |
||||
|
{!! FormField::textarea('description', ['label' => trans('bank_account.description')]) !!} |
||||
|
</div> |
||||
|
<div class="panel-footer"> |
||||
|
{!! Form::submit(trans('bank_account.create'), ['class' => 'btn btn-success']) !!} |
||||
|
{{ link_to_route('bank-accounts.index', trans('app.cancel'), [], ['class' => 'btn btn-default']) }} |
||||
|
</div> |
||||
|
{!! Form::close() !!} |
||||
|
</div> |
||||
|
@endif |
||||
|
@if (Request::get('action') == 'edit' && $editableBankAccount) |
||||
|
<div class="panel panel-default"> |
||||
|
<div class="panel-heading"><h3 class="panel-title">{{ trans('bank_account.edit') }}</h3></div> |
||||
|
{!! Form::model($editableBankAccount, ['route' => ['bank-accounts.update', request('id')],'method' => 'patch']) !!} |
||||
|
<div class="panel-body"> |
||||
|
{!! FormField::text('name', ['required' => true, 'label' => trans('bank_account.name')]) !!} |
||||
|
{!! FormField::text('number', ['required' => true, 'label' => trans('bank_account.number')]) !!} |
||||
|
{!! FormField::text('account_name', ['required' => true, 'label' => trans('bank_account.account_name')]) !!} |
||||
|
{!! FormField::textarea('description', ['label' => trans('bank_account.description')]) !!} |
||||
|
</div> |
||||
|
<div class="panel-footer"> |
||||
|
{!! Form::submit(trans('bank_account.update'), ['class' => 'btn btn-success']) !!} |
||||
|
{{ link_to_route('bank-accounts.index', trans('app.cancel'), [], ['class' => 'btn btn-default']) }} |
||||
|
</div> |
||||
|
{!! Form::close() !!} |
||||
|
</div> |
||||
|
@endif |
||||
|
@if (Request::get('action') == 'delete' && $editableBankAccount) |
||||
|
<div class="panel panel-default"> |
||||
|
<div class="panel-heading"><h3 class="panel-title">{{ trans('bank_account.delete') }}</h3></div> |
||||
|
<div class="panel-body"> |
||||
|
<label class="control-label">{{ trans('bank_account.name') }}</label> |
||||
|
<p>{{ $editableBankAccount->name }}</p> |
||||
|
<label class="control-label">{{ trans('bank_account.number') }}</label> |
||||
|
<p>{{ $editableBankAccount->number }}</p> |
||||
|
<label class="control-label">{{ trans('bank_account.account_name') }}</label> |
||||
|
<p>{{ $editableBankAccount->account_name }}</p> |
||||
|
<label class="control-label">{{ trans('bank_account.description') }}</label> |
||||
|
<p>{{ $editableBankAccount->description }}</p> |
||||
|
{!! $errors->first('bank_account_id', '<span class="form-error small">:message</span>') !!} |
||||
|
</div> |
||||
|
<hr style="margin:0"> |
||||
|
<div class="panel-body">{{ trans('app.delete_confirm') }}</div> |
||||
|
<div class="panel-footer"> |
||||
|
{!! FormField::delete( |
||||
|
['route'=>['bank-accounts.destroy',request('id')]], |
||||
|
trans('app.delete_confirm_button'), |
||||
|
['class'=>'btn btn-danger'], |
||||
|
[ |
||||
|
'bank_account_id' => request('id'), |
||||
|
'page' => request('page'), |
||||
|
'q' => request('q'), |
||||
|
] |
||||
|
) !!} |
||||
|
{{ link_to_route('bank-accounts.index', trans('app.cancel'), [], ['class' => 'btn btn-default']) }} |
||||
|
</div> |
||||
|
</div> |
||||
|
@endif |
||||
@ -0,0 +1,66 @@ |
|||||
|
@extends('layouts.app') |
||||
|
|
||||
|
@section('title', trans('bank_account.list')) |
||||
|
|
||||
|
@section('content') |
||||
|
<h1 class="page-header"> |
||||
|
<div class="pull-right"> |
||||
|
{{ link_to_route('bank-accounts.index', trans('bank_account.create'), ['action' => 'create'], ['class' => 'btn btn-success']) }} |
||||
|
</div> |
||||
|
{{ trans('bank_account.list') }} |
||||
|
<small>{{ trans('app.total') }} : {{ count($bankAccounts) }} {{ trans('bank_account.bank_account') }}</small> |
||||
|
</h1> |
||||
|
<div class="row"> |
||||
|
<div class="col-md-8"> |
||||
|
<div class="panel panel-default table-responsive"> |
||||
|
<table class="table table-condensed"> |
||||
|
<thead> |
||||
|
<tr> |
||||
|
<th class="text-center">{{ trans('app.table_no') }}</th> |
||||
|
<th>{{ trans('bank_account.name') }}</th> |
||||
|
<th>{{ trans('bank_account.number') }}</th> |
||||
|
<th>{{ trans('bank_account.account_name') }}</th> |
||||
|
<th>{{ trans('bank_account.description') }}</th> |
||||
|
<th class="text-center">{{ trans('app.action') }}</th> |
||||
|
</tr> |
||||
|
</thead> |
||||
|
<tbody> |
||||
|
@forelse($bankAccounts as $key => $bankAccount) |
||||
|
@php |
||||
|
$bankAccount = (object) $bankAccount; |
||||
|
@endphp |
||||
|
<tr> |
||||
|
<td class="text-center">{{ $key }}</td> |
||||
|
<td>{{ $bankAccount->name }}</td> |
||||
|
<td>{{ $bankAccount->number }}</td> |
||||
|
<td>{{ $bankAccount->account_name }}</td> |
||||
|
<td>{{ $bankAccount->description }}</td> |
||||
|
<td class="text-center"> |
||||
|
{!! link_to_route( |
||||
|
'bank-accounts.index', |
||||
|
trans('app.edit'), |
||||
|
['action' => 'edit', 'id' => $key], |
||||
|
['id' => 'edit-bank_account-' . $key] |
||||
|
) !!} | |
||||
|
{!! link_to_route( |
||||
|
'bank-accounts.index', |
||||
|
trans('app.delete'), |
||||
|
['action' => 'delete', 'id' => $key], |
||||
|
['id' => 'del-bank_account-' . $key] |
||||
|
) !!} |
||||
|
</td> |
||||
|
</tr> |
||||
|
@empty |
||||
|
<tr> |
||||
|
<td colspan="6">{{ trans('bank_account.empty') }}</td> |
||||
|
</tr> |
||||
|
@endforelse |
||||
|
</tbody> |
||||
|
</table> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-md-4"> |
||||
|
@includeWhen(Request::has('action'), 'bank-accounts.forms') |
||||
|
</div> |
||||
|
</div> |
||||
|
@endsection |
||||
@ -0,0 +1,121 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Tests\Feature\References; |
||||
|
|
||||
|
use Illuminate\Foundation\Testing\DatabaseMigrations; |
||||
|
use Option; |
||||
|
use Tests\TestCase as TestCase; |
||||
|
|
||||
|
class ManageBankAccountsTest extends TestCase |
||||
|
{ |
||||
|
use DatabaseMigrations; |
||||
|
|
||||
|
/** @test */ |
||||
|
public function user_can_see_bank_account_list_in_bank_account_index_page() |
||||
|
{ |
||||
|
$this->adminUserSigningIn(); |
||||
|
$this->visit(route('bank-accounts.index')); |
||||
|
} |
||||
|
|
||||
|
/** @test */ |
||||
|
public function user_can_create_a_bank_account() |
||||
|
{ |
||||
|
$this->adminUserSigningIn(); |
||||
|
$this->visit(route('bank-accounts.index')); |
||||
|
|
||||
|
$this->click(trans('bank_account.create')); |
||||
|
$this->seePageIs(route('bank-accounts.index', ['action' => 'create'])); |
||||
|
|
||||
|
$this->submitForm(trans('bank_account.create'), [ |
||||
|
'name' => 'BankAccount 1 name', |
||||
|
'number' => '1234567890', |
||||
|
'account_name' => 'John Doe', |
||||
|
'description' => 'BankAccount 1 description', |
||||
|
]); |
||||
|
|
||||
|
$this->seePageIs(route('bank-accounts.index')); |
||||
|
|
||||
|
$bankAccounts = []; |
||||
|
|
||||
|
$bankAccounts[1] = [ |
||||
|
'name' => 'BankAccount 1 name', |
||||
|
'number' => '1234567890', |
||||
|
'account_name' => 'John Doe', |
||||
|
'description' => 'BankAccount 1 description', |
||||
|
]; |
||||
|
|
||||
|
$this->seeInDatabase('site_options', [ |
||||
|
'value' => json_encode($bankAccounts), |
||||
|
]); |
||||
|
} |
||||
|
|
||||
|
/** @test */ |
||||
|
public function user_can_edit_a_bank_account_within_search_query() |
||||
|
{ |
||||
|
$this->adminUserSigningIn(); |
||||
|
|
||||
|
$bankAccounts = []; |
||||
|
$bankAccounts[1] = [ |
||||
|
'name' => 'BankAccount 1 name', |
||||
|
'number' => '1234567890', |
||||
|
'account_name' => 'John Doe', |
||||
|
'description' => 'BankAccount 1 description', |
||||
|
]; |
||||
|
|
||||
|
Option::set('bank_accounts', json_encode($bankAccounts)); |
||||
|
|
||||
|
$this->visit(route('bank-accounts.index')); |
||||
|
$this->click('edit-bank_account-1'); |
||||
|
$this->seePageIs(route('bank-accounts.index', ['action' => 'edit', 'id' => '1'])); |
||||
|
|
||||
|
$this->submitForm(trans('bank_account.update'), [ |
||||
|
'name' => 'BankAccount 2 name', |
||||
|
'number' => '1234567890', |
||||
|
'account_name' => 'John Doe', |
||||
|
'description' => 'BankAccount 2 description', |
||||
|
]); |
||||
|
|
||||
|
$this->seePageIs(route('bank-accounts.index')); |
||||
|
|
||||
|
$bankAccounts[1] = [ |
||||
|
'name' => 'BankAccount 2 name', |
||||
|
'number' => '1234567890', |
||||
|
'account_name' => 'John Doe', |
||||
|
'description' => 'BankAccount 2 description', |
||||
|
]; |
||||
|
|
||||
|
$this->seeInDatabase('site_options', [ |
||||
|
'value' => json_encode($bankAccounts), |
||||
|
]); |
||||
|
} |
||||
|
|
||||
|
/** @test */ |
||||
|
public function user_can_delete_a_bank_account() |
||||
|
{ |
||||
|
$this->adminUserSigningIn(); |
||||
|
|
||||
|
$bankAccounts = []; |
||||
|
$bankAccounts[2] = [ |
||||
|
'name' => 'BankAccount 1 name', |
||||
|
'number' => '1234567890', |
||||
|
'account_name' => 'John Doe', |
||||
|
'description' => 'BankAccount 1 description', |
||||
|
]; |
||||
|
|
||||
|
Option::set('bank_accounts', json_encode($bankAccounts)); |
||||
|
|
||||
|
$this->seeInDatabase('site_options', [ |
||||
|
'value' => json_encode($bankAccounts), |
||||
|
]); |
||||
|
|
||||
|
$this->visit(route('bank-accounts.index')); |
||||
|
$this->click('del-bank_account-2'); |
||||
|
$this->seePageIs(route('bank-accounts.index', ['action' => 'delete', 'id' => '2'])); |
||||
|
|
||||
|
$this->press(trans('app.delete_confirm_button')); |
||||
|
|
||||
|
$this->dontSeeInDatabase('site_options', [ |
||||
|
'value' => json_encode($bankAccounts), |
||||
|
]); |
||||
|
} |
||||
|
} |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue