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