From a813524f680e9926d64f1006a1c615acf86c24f1 Mon Sep 17 00:00:00 2001 From: Nafies Luthfi Date: Sat, 2 Dec 2017 23:53:23 +0800 Subject: [PATCH] Add invoice edit feature Move Invoice related controllers into Invoices namespace Add date and due_date column on invoice date --- .../DraftsController.php} | 15 ++- .../Controllers/Invoices/InvoicesController.php | 55 ++++++++ app/Http/Controllers/Invoices/ItemsController.php | 75 +++++++++++ app/Http/Controllers/InvoicesController.php | 30 ----- app/Services/InvoiceDraft/InvoiceDraft.php | 6 +- .../InvoiceDraft/InvoiceDraftCollection.php | 8 +- database/factories/InvoiceFactory.php | 22 ++++ database/factories/ModelFactory.php | 17 --- .../2017_10_05_162758_create_invoices_table.php | 2 + resources/lang/id/invoice.php | 5 + .../partials/form-draft-detail.blade.php | 6 +- resources/views/invoices/edit.blade.php | 59 +++++++++ resources/views/invoices/index.blade.php | 18 ++- .../views/invoices/partials/item-list.blade.php | 77 +++++++++++ resources/views/invoices/show.blade.php | 68 +++++----- resources/views/projects/invoices.blade.php | 16 +-- routes/web/invoices.php | 34 +++-- tests/Feature/Invoices/InvoiceEntryTest.php | 23 ++-- tests/Feature/Invoices/ManageInvoiceTest.php | 19 --- tests/Feature/Invoices/ManageInvoicesTest.php | 145 +++++++++++++++++++++ 20 files changed, 559 insertions(+), 141 deletions(-) rename app/Http/Controllers/{InvoiceDraftsController.php => Invoices/DraftsController.php} (93%) create mode 100644 app/Http/Controllers/Invoices/InvoicesController.php create mode 100644 app/Http/Controllers/Invoices/ItemsController.php delete mode 100644 app/Http/Controllers/InvoicesController.php create mode 100644 database/factories/InvoiceFactory.php create mode 100644 resources/views/invoices/edit.blade.php create mode 100644 resources/views/invoices/partials/item-list.blade.php delete mode 100644 tests/Feature/Invoices/ManageInvoiceTest.php create mode 100644 tests/Feature/Invoices/ManageInvoicesTest.php diff --git a/app/Http/Controllers/InvoiceDraftsController.php b/app/Http/Controllers/Invoices/DraftsController.php similarity index 93% rename from app/Http/Controllers/InvoiceDraftsController.php rename to app/Http/Controllers/Invoices/DraftsController.php index 5818ee5..bcc756b 100644 --- a/app/Http/Controllers/InvoiceDraftsController.php +++ b/app/Http/Controllers/Invoices/DraftsController.php @@ -1,8 +1,9 @@ */ -class InvoiceDraftsController extends Controller +class DraftsController extends Controller { private $draftCollection; @@ -119,14 +120,16 @@ class InvoiceDraftsController extends Controller return redirect()->route('invoice-drafts.index'); } - public function proccess(Request $request, $draftKey) + public function proccess($draftKey) { - $this->validate($request, [ - 'project_id' => 'required|exists:projects,id', + $invoiceData = request()->validate([ + 'date' => 'required|date', 'notes' => 'nullable|string|max:100', + 'due_date' => 'nullable|date|after:date', + 'project_id' => 'required|exists:projects,id', ]); - $draft = $this->draftCollection->updateDraftAttributes($draftKey, $request->only('project_id', 'notes')); + $draft = $this->draftCollection->updateDraftAttributes($draftKey, $invoiceData); if ($draft->getItemsCount() == 0) { flash(trans('invoice.item_list_empty'), 'warning')->important(); diff --git a/app/Http/Controllers/Invoices/InvoicesController.php b/app/Http/Controllers/Invoices/InvoicesController.php new file mode 100644 index 0000000..d79ee87 --- /dev/null +++ b/app/Http/Controllers/Invoices/InvoicesController.php @@ -0,0 +1,55 @@ + + */ +class InvoicesController extends Controller +{ + public function index() + { + $invoices = Invoice::paginate(); + + return view('invoices.index', compact('invoices')); + } + + public function show(Invoice $invoice) + { + return view('invoices.show', compact('invoice')); + } + + public function edit(Invoice $invoice) + { + $projects = Project::pluck('name', 'id'); + + return view('invoices.edit', compact('invoice', 'projects')); + } + + public function update(Invoice $invoice) + { + $invoiceData = request()->validate([ + 'project_id' => 'required|exists:projects,id', + 'date' => 'required|date', + 'due_date' => 'nullable|date|after:date', + 'notes' => 'nullable|string|max:255', + ]); + + $invoice->update($invoiceData); + + flash(trans('invoice.updated'), 'success'); + + return redirect()->route('invoices.show', $invoice); + } + + public function pdf(Invoice $invoice) + { + return view('invoices.pdf', compact('invoice')); + } +} diff --git a/app/Http/Controllers/Invoices/ItemsController.php b/app/Http/Controllers/Invoices/ItemsController.php new file mode 100644 index 0000000..3cbc95a --- /dev/null +++ b/app/Http/Controllers/Invoices/ItemsController.php @@ -0,0 +1,75 @@ +validate([ + 'new_item_description' => 'required|string|max:255', + 'new_item_amount' => 'required|numeric', + ]); + + $items = $invoice->items; + $items[] = [ + 'description' => $itemData['new_item_description'], + 'amount' => $itemData['new_item_amount'], + ]; + $invoice->items = $items; + $invoice->amount = collect($items)->sum('amount'); + $invoice->save(); + + flash(trans('invoice.item_added')); + + return back(); + } + + public function update(Invoice $invoice) + { + $rawItemData = request()->validate([ + 'item_key.*' => 'required|numeric', + 'description.*' => 'required|string|max:255', + 'amount.*' => 'required|numeric', + ]); + + $itemKey = array_shift($rawItemData['item_key']); + $amount = array_shift($rawItemData['amount']); + $description = array_shift($rawItemData['description']); + + $items = $invoice->items; + $items[$itemKey] = [ + 'description' => $description, + 'amount' => $amount, + ]; + $invoice->items = $items; + $invoice->amount = collect($items)->sum('amount'); + $invoice->save(); + + flash(trans('invoice.item_updated')); + + return back(); + } + + public function destroy(Invoice $invoice) + { + $itemData = request()->validate([ + 'item_index' => 'required|numeric', + ]); + + $itemIndex = $itemData['item_index']; + + $items = $invoice->items; + unset($items[$itemIndex]); + $invoice->items = $items; + $invoice->amount = (int) collect($items)->sum('amount'); + $invoice->save(); + + flash(trans('invoice.item_removed')); + + return back(); + } +} diff --git a/app/Http/Controllers/InvoicesController.php b/app/Http/Controllers/InvoicesController.php deleted file mode 100644 index 93ec4b9..0000000 --- a/app/Http/Controllers/InvoicesController.php +++ /dev/null @@ -1,30 +0,0 @@ - - */ -class InvoicesController extends Controller -{ - public function index() - { - $invoices = Invoice::paginate(); - - return view('invoices.index', compact('invoices')); - } - - public function show(Invoice $invoice) - { - return view('invoices.show', compact('invoice')); - } - - public function pdf(Invoice $invoice) - { - return view('invoices.pdf', compact('invoice')); - } -} diff --git a/app/Services/InvoiceDraft/InvoiceDraft.php b/app/Services/InvoiceDraft/InvoiceDraft.php index 328791d..30eb579 100644 --- a/app/Services/InvoiceDraft/InvoiceDraft.php +++ b/app/Services/InvoiceDraft/InvoiceDraft.php @@ -13,8 +13,10 @@ class InvoiceDraft { public $items = []; - public $projectId; + public $date; public $notes; + public $dueDate; + public $projectId; public function items() { @@ -66,6 +68,8 @@ class InvoiceDraft $invoice->number = $invoice->generateNewNumber(); $invoice->items = $this->getItemsArray(); $invoice->project_id = $this->projectId; + $invoice->date = $this->date; + $invoice->due_date = $this->dueDate; $invoice->amount = $this->getTotal(); $invoice->notes = $this->notes; $invoice->status_id = 1; diff --git a/app/Services/InvoiceDraft/InvoiceDraftCollection.php b/app/Services/InvoiceDraft/InvoiceDraftCollection.php index fe83b2a..dac625d 100644 --- a/app/Services/InvoiceDraft/InvoiceDraftCollection.php +++ b/app/Services/InvoiceDraft/InvoiceDraftCollection.php @@ -5,7 +5,7 @@ namespace App\Services\InvoiceDrafts; use Illuminate\Support\Collection; /** - * InvoiceDraft Collection Class. + * Invoice Draft Collection Class. * * @author Nafies Luthfi */ @@ -36,7 +36,7 @@ class InvoiceDraftCollection public function add(InvoiceDraft $draft) { - $content = $this->getContent(); + $content = $this->getContent(); $draft->draftKey = str_random(10); $content->put($draft->draftKey, $draft); @@ -57,8 +57,10 @@ class InvoiceDraftCollection { $content = $this->getContent(); + $content[$draftKey]->date = $draftAttributes['date']; + $content[$draftKey]->notes = $draftAttributes['notes']; + $content[$draftKey]->dueDate = $draftAttributes['due_date']; $content[$draftKey]->projectId = $draftAttributes['project_id']; - $content[$draftKey]->notes = $draftAttributes['notes']; $this->session->put($this->instance, $content); diff --git a/database/factories/InvoiceFactory.php b/database/factories/InvoiceFactory.php new file mode 100644 index 0000000..73b9610 --- /dev/null +++ b/database/factories/InvoiceFactory.php @@ -0,0 +1,22 @@ +define(Invoice::class, function (Faker $faker) { + return [ + 'project_id' => function () { + return factory(Project::class)->create()->id; + }, + 'number' => (new Invoice)->generateNewNumber(), + 'items' => [], + 'date' => '2010-10-10', + 'amount' => 100000, + 'status_id' => 1, + 'creator_id' => function () { + return factory(User::class)->create()->id; + }, + ]; +}); diff --git a/database/factories/ModelFactory.php b/database/factories/ModelFactory.php index 9c71809..a63d5a8 100644 --- a/database/factories/ModelFactory.php +++ b/database/factories/ModelFactory.php @@ -1,6 +1,5 @@ define(Event::class, function (Faker\Generator $faker) { 'is_allday' => rand(0, 1), ]; }); - -$factory->define(Invoice::class, function (Faker\Generator $faker) { - return [ - 'project_id' => function () { - return factory(Project::class)->create()->id; - }, - 'number' => (new Invoice)->generateNewNumber(), - 'items' => [], - 'amount' => 100000, - 'notes' => $faker->paragraph, - 'status_id' => 1, - 'creator_id' => function () { - return factory(User::class)->create()->id; - }, - ]; -}); diff --git a/database/migrations/2017_10_05_162758_create_invoices_table.php b/database/migrations/2017_10_05_162758_create_invoices_table.php index e0f2bdd..32e248d 100644 --- a/database/migrations/2017_10_05_162758_create_invoices_table.php +++ b/database/migrations/2017_10_05_162758_create_invoices_table.php @@ -17,6 +17,8 @@ class CreateInvoicesTable extends Migration $table->increments('id'); $table->unsignedInteger('project_id'); $table->string('number', 8)->unique(); + $table->date('date'); + $table->date('due_date')->nullable(); $table->text('items'); $table->unsignedInteger('amount'); $table->string('notes')->nullable(); diff --git a/resources/lang/id/invoice.php b/resources/lang/id/invoice.php index c653988..eaa204c 100644 --- a/resources/lang/id/invoice.php +++ b/resources/lang/id/invoice.php @@ -8,6 +8,7 @@ return [ 'detail' => 'Detail Invoice', 'not_found' => 'Invoice tidak ditemukan.', 'empty' => 'Belum ada Invoice', + 'back_to_show' => 'Kembali ke Detail Invoice', 'back_to_index' => 'Kembali ke daftar Invoice', 'draft_list' => 'List Draft Invoice', 'draft_list_empty' => 'Draft Invoice kosong.', @@ -31,6 +32,8 @@ return [ 'print' => 'Cetak Invoice', 'add_item' => 'Tambah Item', 'item_added' => 'Item berhasil ditambahkan.', + 'item_updated' => 'Item berhasil diupdate.', + 'item_removed' => 'Item berhasil dihapus.', 'confirm_instruction' => 'Silakan periksa rincian di bawah ini, jika belum sesuai, silakan klik kembali.', // Attributes @@ -39,6 +42,8 @@ return [ 'creator' => 'Dibuat Oleh', 'items' => 'Item Invoice', 'notes' => 'Catatan', + 'date' => 'Tanggal', + 'due_date' => 'Jatuh Tempo', 'amount' => 'Tagihan', 'total' => 'Total Tagihan', 'customer' => 'Customer', diff --git a/resources/views/invoice-drafts/partials/form-draft-detail.blade.php b/resources/views/invoice-drafts/partials/form-draft-detail.blade.php index d228e99..17aa9b9 100644 --- a/resources/views/invoice-drafts/partials/form-draft-detail.blade.php +++ b/resources/views/invoice-drafts/partials/form-draft-detail.blade.php @@ -6,7 +6,11 @@ 'label' => trans('invoice.project'), 'value' => $draft->projectId, 'required' => true, - ] ) !!} + ]) !!} +
+
{!! FormField::text('date', ['label' => trans('invoice.date')]) !!}
+
{!! FormField::text('due_date', ['label' => trans('invoice.due_date')]) !!}
+
{!! FormField::textarea('notes', ['label' => trans('invoice.notes'), 'value' => $draft->notes]) !!} @endsection diff --git a/resources/views/projects/invoices.blade.php b/resources/views/projects/invoices.blade.php index 5d442ef..a950835 100755 --- a/resources/views/projects/invoices.blade.php +++ b/resources/views/projects/invoices.blade.php @@ -24,20 +24,20 @@ {{ trans('app.table_no') }} {{ trans('invoice.number') }} - {{ trans('app.date') }} - {{ trans('invoice.customer') }} - {{ trans('app.description') }} + {{ trans('invoice.date') }} + {{ trans('invoice.due_date') }} + {{ trans('invoice.customer') }} {{ trans('invoice.amount') }} - {{ trans('app.action') }} + {{ trans('app.action') }} @forelse($project->invoices as $key => $invoice) {{ 1 + $key }} {{ $invoice->number }} - {{ $invoice->created_at->format('Y-m-d') }} - {{ $project->customer->name }} - {!! nl2br($invoice->description) !!} + {{ $invoice->date }} + {{ $invoice->due_date }} + {{ $project->customer->nameLink() }} {{ formatRp($invoice->amount) }} {!! html_link_to_route('invoices.show', '', [$invoice->number], ['class' => 'btn btn-info btn-xs','icon' => 'search','title' => 'Lihat ' . trans('invoice.show')]) !!} @@ -52,7 +52,7 @@ {{ trans('app.total') }} {{ formatRp($project->invoices->sum('amount')) }} - +   diff --git a/routes/web/invoices.php b/routes/web/invoices.php index 4b26809..8b238b0 100644 --- a/routes/web/invoices.php +++ b/routes/web/invoices.php @@ -1,25 +1,31 @@ ['web', 'role:admin']], function () { +Route::group(['middleware' => ['web', 'role:admin'], 'namespace' => 'Invoices'], function () { /* * Invoice Drafts Routes */ - Route::get('invoice-drafts', 'InvoiceDraftsController@index')->name('invoice-drafts.index'); - Route::get('invoice-drafts/{draftKey}', 'InvoiceDraftsController@show')->name('invoice-drafts.show'); - Route::post('invoice-drafts', 'InvoiceDraftsController@create')->name('invoice-drafts.create'); - Route::post('invoice-drafts/{draftKey}/add-draft-item', 'InvoiceDraftsController@addDraftItem')->name('invoice-drafts.add-draft-item'); - Route::patch('invoice-drafts/{draftKey}/update-draft-item', 'InvoiceDraftsController@updateDraftItem')->name('invoice-drafts.update-draft-item'); - Route::patch('invoice-drafts/{draftKey}/proccess', 'InvoiceDraftsController@proccess')->name('invoice-drafts.draft-proccess'); - Route::delete('invoice-drafts/{draftKey}/remove-draft-item', 'InvoiceDraftsController@removeDraftItem')->name('invoice-drafts.remove-draft-item'); - Route::delete('invoice-drafts/{draftKey}/empty-draft', 'InvoiceDraftsController@emptyDraft')->name('invoice-drafts.empty-draft'); - Route::delete('invoice-drafts/{draftKey}/remove', 'InvoiceDraftsController@remove')->name('invoice-drafts.remove'); - Route::delete('invoice-drafts/destroy', 'InvoiceDraftsController@destroy')->name('invoice-drafts.destroy'); - Route::post('invoice-drafts/{draftKey}/store', 'InvoiceDraftsController@store')->name('invoice-drafts.store'); + Route::get('invoice-drafts', 'DraftsController@index')->name('invoice-drafts.index'); + Route::get('invoice-drafts/{draftKey}', 'DraftsController@show')->name('invoice-drafts.show'); + Route::post('invoice-drafts', 'DraftsController@create')->name('invoice-drafts.create'); + Route::post('invoice-drafts/{draftKey}/add-draft-item', 'DraftsController@addDraftItem')->name('invoice-drafts.add-draft-item'); + Route::patch('invoice-drafts/{draftKey}/update-draft-item', 'DraftsController@updateDraftItem')->name('invoice-drafts.update-draft-item'); + Route::patch('invoice-drafts/{draftKey}/proccess', 'DraftsController@proccess')->name('invoice-drafts.draft-proccess'); + Route::delete('invoice-drafts/{draftKey}/remove-draft-item', 'DraftsController@removeDraftItem')->name('invoice-drafts.remove-draft-item'); + Route::delete('invoice-drafts/{draftKey}/empty-draft', 'DraftsController@emptyDraft')->name('invoice-drafts.empty-draft'); + Route::delete('invoice-drafts/{draftKey}/remove', 'DraftsController@remove')->name('invoice-drafts.remove'); + Route::delete('invoice-drafts/destroy', 'DraftsController@destroy')->name('invoice-drafts.destroy'); + Route::post('invoice-drafts/{draftKey}/store', 'DraftsController@store')->name('invoice-drafts.store'); /* * Invoices Routes */ - Route::get('invoices', ['as' => 'invoices.index', 'uses' => 'InvoicesController@index']); - Route::get('invoices/{invoice}', ['as' => 'invoices.show', 'uses' => 'InvoicesController@show']); Route::get('invoices/{invoice}/pdf', ['as' => 'invoices.pdf', 'uses' => 'InvoicesController@pdf']); + Route::resource('invoices', 'InvoicesController'); + + /** + * Invoice Items Routes + */ + Route::post('invoices/{invoice}/items', ['as' => 'invoices.items.store', 'uses' => 'ItemsController@store']); + Route::patch('invoices/{invoice}/items', ['as' => 'invoices.items.update', 'uses' => 'ItemsController@update']); + Route::delete('invoices/{invoice}/items', ['as' => 'invoices.items.destroy', 'uses' => 'ItemsController@destroy']); }); diff --git a/tests/Feature/Invoices/InvoiceEntryTest.php b/tests/Feature/Invoices/InvoiceEntryTest.php index f7e49f4..99a27b8 100644 --- a/tests/Feature/Invoices/InvoiceEntryTest.php +++ b/tests/Feature/Invoices/InvoiceEntryTest.php @@ -10,7 +10,7 @@ use App\Services\InvoiceDrafts\Item; use Tests\TestCase; /** - * Invoice Entry Feature Test + * Invoice Entry Feature Test. * * @author Nafies Luthfi */ @@ -136,9 +136,12 @@ class InvoiceEntryTest extends TestCase $this->visit(route('invoice-drafts.show', $draft->draftKey)); - $this->type($project->id, 'project_id'); - $this->type('catatan', 'notes'); - $this->press(trans('invoice.proccess')); + $this->submitForm(trans('invoice.proccess'), [ + 'project_id' => $project->id, + 'date' => '2017-01-01', + 'due_date' => '2017-01-30', + 'notes' => 'catatan', + ]); $this->seePageIs(route('invoice-drafts.show', [$draft->draftKey, 'action' => 'confirm'])); @@ -169,6 +172,8 @@ class InvoiceEntryTest extends TestCase $draftAttributes = [ 'project_id' => $project->id, + 'date' => '2010-10-10', + 'due_date' => '2010-10-30', 'notes' => 'Catatan', ]; $cart->updateDraftAttributes($draft->draftKey, $draftAttributes); @@ -177,17 +182,19 @@ class InvoiceEntryTest extends TestCase $this->press(trans('invoice.save')); - // $this->seePageIs(route('invoices.show', date('ym').'0001')); - // $this->see(trans('invoice.created', ['invoice_no' => date('ym').'0001'])); + $this->seePageIs(route('invoices.show', date('ym').'001')); + $this->see(trans('invoice.created', ['invoice_no' => date('ym').'001'])); $this->seeInDatabase('invoices', [ + 'project_id' => $project->id, 'number' => date('ym').'001', + 'date' => '2010-10-10', + 'due_date' => '2010-10-30', 'items' => '[{"description":"Deskripsi item invoice","amount":1000},{"description":"Deskripsi item invoice","amount":2000}]', - 'project_id' => $project->id, 'amount' => 3000, 'notes' => 'Catatan', - 'creator_id' => $user->id, 'status_id' => 1, + 'creator_id' => $user->id, ]); } } diff --git a/tests/Feature/Invoices/ManageInvoiceTest.php b/tests/Feature/Invoices/ManageInvoiceTest.php deleted file mode 100644 index adc36c5..0000000 --- a/tests/Feature/Invoices/ManageInvoiceTest.php +++ /dev/null @@ -1,19 +0,0 @@ -adminUserSigningIn(); - - $this->visit(route('invoices.index')); - - $this->seePageIs(route('invoices.index')); - $this->see(trans('invoice.list')); - } -} diff --git a/tests/Feature/Invoices/ManageInvoicesTest.php b/tests/Feature/Invoices/ManageInvoicesTest.php new file mode 100644 index 0000000..c868f5d --- /dev/null +++ b/tests/Feature/Invoices/ManageInvoicesTest.php @@ -0,0 +1,145 @@ + + */ +class ManageInvoicesTest extends TestCase +{ + /** @test */ + public function user_can_browse_invoice_list_page() + { + $this->adminUserSigningIn(); + + $invoice = factory(Invoice::class)->create(); + + $this->visit(route('invoices.index')); + + $this->seePageIs(route('invoices.index')); + $this->see(trans('invoice.list')); + $this->see($invoice->number); + } + + /** @test */ + public function user_can_edit_invoice_data() + { + $this->adminUserSigningIn(); + $invoice = factory(Invoice::class)->create(); + + $this->visit(route('invoices.edit', $invoice)); + + $this->submitForm(trans('invoice.update'), [ + 'project_id' => $invoice->project_id, + 'date' => '2011-01-01', + 'due_date' => '2011-01-30', + 'notes' => 'Catatan invoice 123', + ]); + + $this->see(trans('invoice.updated')); + $this->seePageIs(route('invoices.show', $invoice)); + + $this->seeInDatabase('invoices', [ + 'id' => $invoice->id, + 'notes' => 'Catatan invoice 123', + 'date' => '2011-01-01', + 'due_date' => '2011-01-30', + ]); + } + + /** @test */ + public function user_can_add_invoice_item() + { + $this->adminUserSigningIn(); + $invoice = factory(Invoice::class)->create(); + + $this->visit(route('invoices.edit', $invoice)); + + $this->submitForm(trans('invoice.add_item'), [ + 'new_item_description' => 'Testing deskripsi invoice item', + 'new_item_amount' => 2000, + ]); + + $this->see(trans('invoice.item_added')); + + $this->submitForm(trans('invoice.add_item'), [ + 'new_item_description' => 'Testing deskripsi invoice item', + 'new_item_amount' => 3000, + ]); + + $this->see(trans('invoice.item_added')); + + $this->seePageIs(route('invoices.edit', $invoice)); + + $this->seeInDatabase('invoices', [ + 'id' => $invoice->id, + 'items' => '[{"description":"Testing deskripsi invoice item","amount":"2000"},{"description":"Testing deskripsi invoice item","amount":"3000"}]', + 'amount' => 5000, + ]); + } + + /** @test */ + public function user_can_update_invoice_item() + { + $this->adminUserSigningIn(); + + $invoice = factory(Invoice::class)->create([ + 'items' => [ + ['description' => 'Testing deskripsi invoice item', 'amount' => '1111'], + ['description' => 'Testing deskripsi invoice item', 'amount' => '2222'], + ], + ]); + + $this->visit(route('invoices.edit', $invoice)); + + $this->submitForm('update-item-1', [ + 'item_key[1]' => 1, + 'description[1]' => 'Testing deskripsi Update', + 'amount[1]' => 100, + ]); + + $this->see(trans('invoice.item_updated')); + + $this->seePageIs(route('invoices.edit', $invoice)); + + $this->seeInDatabase('invoices', [ + 'id' => $invoice->id, + 'items' => '[{"description":"Testing deskripsi invoice item","amount":"1111"},{"description":"Testing deskripsi Update","amount":"100"}]', + 'amount' => 1211, + ]); + } + + /** @test */ + public function user_can_remove_invoice_item() + { + $this->adminUserSigningIn(); + + $invoice = factory(Invoice::class)->create([ + 'items' => [ + ['description' => 'Testing deskripsi invoice item', 'amount' => '1111'], + ['description' => 'Testing deskripsi invoice item', 'amount' => '2222'], + ], + ]); + + $this->visit(route('invoices.edit', $invoice)); + + $this->submitForm('remove-item-1', [ + 'item_index' => 1, + ]); + + $this->see(trans('invoice.item_removed')); + + $this->seePageIs(route('invoices.edit', $invoice)); + + $this->seeInDatabase('invoices', [ + 'id' => $invoice->id, + 'items' => '[{"description":"Testing deskripsi invoice item","amount":"1111"}]', + 'amount' => 1111, + ]); + } +}