Browse Source

Add invoice discount - closes #10

pull/12/head
Nafies Luthfi 8 years ago
parent
commit
8ba3e9f793
  1. 12
      app/Http/Controllers/Invoices/InvoicesController.php
  2. 12
      app/Http/Controllers/Invoices/ItemsController.php
  3. 2
      database/migrations/2017_10_05_162758_create_invoices_table.php
  4. 3
      resources/lang/de/invoice.php
  5. 3
      resources/lang/en/invoice.php
  6. 3
      resources/lang/id/invoice.php
  7. 2
      resources/views/invoices/edit.blade.php
  8. 2
      resources/views/invoices/partials/item-list.blade.php
  9. 19
      resources/views/invoices/pdf.blade.php
  10. 21
      resources/views/invoices/show.blade.php
  11. 151
      tests/Feature/Invoices/ManageInvoicesTest.php

12
app/Http/Controllers/Invoices/InvoicesController.php

@ -36,11 +36,15 @@ class InvoicesController extends Controller
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',
'project_id' => 'required|exists:projects,id',
'date' => 'required|date',
'due_date' => 'nullable|date|after:date',
'discount' => 'nullable|numeric',
'discount_notes' => 'nullable|string|max:255',
'notes' => 'nullable|string|max:255',
]);
$invoiceSubtotal = collect($invoice->items)->sum('amount');
$invoiceData['amount'] = $invoiceSubtotal - $invoiceData['discount'];
$invoice->update($invoiceData);

12
app/Http/Controllers/Invoices/ItemsController.php

@ -20,10 +20,10 @@ class ItemsController extends Controller
'amount' => $itemData['new_item_amount'],
];
$invoice->items = $items;
$invoice->amount = collect($items)->sum('amount');
$invoice->amount = (int) collect($items)->sum('amount') - $invoice->discount;
$invoice->save();
flash(trans('invoice.item_added'));
flash(__('invoice.item_added'));
return back();
}
@ -46,10 +46,10 @@ class ItemsController extends Controller
'amount' => $amount,
];
$invoice->items = $items;
$invoice->amount = collect($items)->sum('amount');
$invoice->amount = (int) collect($items)->sum('amount') - $invoice->discount;
$invoice->save();
flash(trans('invoice.item_updated'));
flash(__('invoice.item_updated'));
return back();
}
@ -65,10 +65,10 @@ class ItemsController extends Controller
$items = $invoice->items;
unset($items[$itemIndex]);
$invoice->items = $items;
$invoice->amount = (int) collect($items)->sum('amount');
$invoice->amount = (int) collect($items)->sum('amount') - $invoice->discount;
$invoice->save();
flash(trans('invoice.item_removed'));
flash(__('invoice.item_removed'));
return back();
}

2
database/migrations/2017_10_05_162758_create_invoices_table.php

@ -21,6 +21,8 @@ class CreateInvoicesTable extends Migration
$table->date('due_date')->nullable();
$table->text('items');
$table->unsignedInteger('amount');
$table->unsignedInteger('discount')->nullable();
$table->string('discount_notes')->nullable();
$table->string('notes')->nullable();
$table->unsignedTinyInteger('status_id');
$table->unsignedInteger('creator_id');

3
resources/lang/de/invoice.php

@ -56,4 +56,7 @@ return [
'item_description' => 'Beschreibung',
'item_amount' => 'Summe',
'items_count' => 'Summe Positionen',
'subtotal' => 'Subtotal',
'discount' => 'Discount',
'discount_notes' => 'Discount Notes',
];

3
resources/lang/en/invoice.php

@ -56,4 +56,7 @@ return [
'item_description' => 'Description',
'item_amount' => 'Amount',
'items_count' => 'Item Count',
'subtotal' => 'Subtotal',
'discount' => 'Discount',
'discount_notes' => 'Discount Notes',
];

3
resources/lang/id/invoice.php

@ -56,4 +56,7 @@ return [
'item_description' => 'Deskripsi',
'item_amount' => 'Biaya',
'items_count' => 'Jumlah Item',
'subtotal' => 'Subtotal',
'discount' => 'Diskon',
'discount_notes' => 'Catatan Diskon',
];

2
resources/views/invoices/edit.blade.php

@ -56,6 +56,8 @@
<div class="col-md-6">{!! FormField::text('due_date', ['label' => trans('invoice.due_date')]) !!}</div>
</div>
{!! FormField::textarea('notes', ['label' => trans('invoice.notes')]) !!}
{!! FormField::price('discount', ['label' => __('invoice.discount'), 'currency' => Option::get('money_sign', 'Rp')]) !!}
{!! FormField::text('discount_notes', ['label' => __('invoice.discount_notes')]) !!}
</div>
<div class="panel-footer">
{{ Form::submit(trans('invoice.update'), ['class' => 'btn btn-info']) }}

2
resources/views/invoices/partials/item-list.blade.php

@ -77,7 +77,7 @@
<tfoot>
<tr>
<th colspan="2" class="text-right">{{ trans('invoice.amount') }} :</th>
<th class="text-right">{{ formatRp($invoice->amount) }}</th>
<th class="text-right">{{ formatRp(collect($invoice->items)->sum('amount')) }}</th>
<th></th>
</tr>
</tfoot>

19
resources/views/invoices/pdf.blade.php

@ -103,15 +103,34 @@
</tr>
</thead>
<tbody>
@php
$subtotal = 0;
@endphp
@foreach ($invoice->items as $key => $item)
<tr>
<td class="text-center text-top">{{ 1 + $key }}</td>
<td>{!! nl2br($item['description']) !!}</td>
<td class="text-right text-top">{{ formatRp($item['amount']) }}</td>
</tr>
@php
$subtotal += $item['amount'];
@endphp
@endforeach
</tbody>
<tfoot>
@if ($invoice->discount)
<tr>
<th colspan="2" class="text-right">{{ __('invoice.subtotal') }} :</th>
<th class="text-right">{{ formatRp($subtotal) }}</th>
</tr>
<tr>
<td colspan="2" class="text-right">
<strong>{{ __('invoice.discount') }}</strong>
{{ $invoice->discount_notes ? '('.$invoice->discount_notes.')': '' }} :
</td>
<th class="text-right">- {{ formatRp($invoice->discount) }}</th>
</tr>
@endif
<tr>
<th colspan="2" class="text-right">{{ trans('app.total') }}</th>
<th colspan="2" class="text-right">{{ formatRp($invoice->amount) }}</th>

21
resources/views/invoices/show.blade.php

@ -32,15 +32,34 @@
</tr>
</thead>
<tbody>
@php
$subtotal = 0;
@endphp
@foreach($invoice->items as $key => $item)
<tr>
<td>{{ $key + 1 }}</td>
<td>{{ $item['description'] }}</td>
<td>{!! nl2br($item['description']) !!}</td>
<td class="text-right">{{ formatRp($item['amount']) }}</td>
</tr>
@php
$subtotal += $item['amount'];
@endphp
@endforeach
</tbody>
<tfoot>
@if ($invoice->discount)
<tr>
<th colspan="2" class="text-right">{{ __('invoice.subtotal') }} :</th>
<th class="text-right">{{ formatRp($subtotal) }}</th>
</tr>
<tr>
<td colspan="2" class="text-right">
<strong>{{ __('invoice.discount') }}</strong>
{{ $invoice->discount_notes ? '('.$invoice->discount_notes.')': '' }} :
</td>
<th class="text-right">- {{ formatRp($invoice->discount) }}</th>
</tr>
@endif
<tr>
<th colspan="2" class="text-right">{{ trans('app.total') }} :</th>
<th class="text-right">{{ formatRp($invoice->amount) }}</th>

151
tests/Feature/Invoices/ManageInvoicesTest.php

@ -22,7 +22,7 @@ class ManageInvoicesTest extends TestCase
$this->visit(route('invoices.index'));
$this->seePageIs(route('invoices.index'));
$this->see(trans('invoice.list'));
$this->see(__('invoice.list'));
$this->see($invoice->number);
}
@ -34,14 +34,14 @@ class ManageInvoicesTest extends TestCase
$this->visit(route('invoices.edit', $invoice));
$this->submitForm(trans('invoice.update'), [
$this->submitForm(__('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->see(__('invoice.updated'));
$this->seePageIs(route('invoices.show', $invoice));
$this->seeInDatabase('invoices', [
@ -53,6 +53,45 @@ class ManageInvoicesTest extends TestCase
}
/** @test */
public function user_can_edit_invoice_with_additional_discount()
{
$this->adminUserSigningIn();
$invoice = factory(Invoice::class)->create([
'date' => '2010-10-10',
'due_date' => '2010-10-30',
'amount' => 3000,
'items' => [
['description' => 'Deskripsi item invoice', 'amount' => 1000],
['description' => 'Deskripsi item invoice', 'amount' => 2000],
],
]);
$this->visit(route('invoices.edit', $invoice));
$this->submitForm(__('invoice.update'), [
'project_id' => $invoice->project_id,
'date' => '2011-01-01',
'due_date' => '2011-01-30',
'discount' => 500,
'discount_notes' => 'Diskon 500.',
'notes' => 'Catatan invoice 123',
]);
$this->see(__('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',
'amount' => 2500,
'discount' => 500,
'discount_notes' => 'Diskon 500.',
]);
}
/** @test */
public function user_can_add_invoice_item_on_invoice_edit_page()
{
$this->adminUserSigningIn();
@ -60,19 +99,19 @@ class ManageInvoicesTest extends TestCase
$this->visit(route('invoices.edit', $invoice));
$this->submitForm(trans('invoice.add_item'), [
$this->submitForm(__('invoice.add_item'), [
'new_item_description' => 'Testing deskripsi invoice item',
'new_item_amount' => 2000,
]);
$this->see(trans('invoice.item_added'));
$this->see(__('invoice.item_added'));
$this->submitForm(trans('invoice.add_item'), [
$this->submitForm(__('invoice.add_item'), [
'new_item_description' => 'Testing deskripsi invoice item',
'new_item_amount' => 3000,
]);
$this->see(trans('invoice.item_added'));
$this->see(__('invoice.item_added'));
$this->seePageIs(route('invoices.edit', $invoice));
@ -84,6 +123,32 @@ class ManageInvoicesTest extends TestCase
}
/** @test */
public function user_can_add_invoice_item_on_invoice_with_discount_and_sum_correct_amount()
{
$this->adminUserSigningIn();
$invoice = factory(Invoice::class)->create([
'discount' => 300,
]);
$this->visit(route('invoices.edit', $invoice));
$this->submitForm(__('invoice.add_item'), [
'new_item_description' => 'Testing deskripsi invoice item',
'new_item_amount' => 2000,
]);
$this->see(__('invoice.item_added'));
$this->seePageIs(route('invoices.edit', $invoice));
$this->seeInDatabase('invoices', [
'id' => $invoice->id,
'amount' => 1700,
'discount' => 300,
]);
}
/** @test */
public function user_can_update_invoice_item_on_invoice_edit_page()
{
$this->adminUserSigningIn();
@ -103,7 +168,7 @@ class ManageInvoicesTest extends TestCase
'amount[1]' => 100,
]);
$this->see(trans('invoice.item_updated'));
$this->see(__('invoice.item_updated'));
$this->seePageIs(route('invoices.edit', $invoice));
@ -115,6 +180,38 @@ class ManageInvoicesTest extends TestCase
}
/** @test */
public function user_can_update_invoice_item_on_invoice_with_discount_and_sum_correct_amount()
{
$this->adminUserSigningIn();
$invoice = factory(Invoice::class)->create([
'items' => [
['description' => 'Testing deskripsi invoice item', 'amount' => '1111'],
['description' => 'Testing deskripsi invoice item', 'amount' => '2222'],
],
'discount' => 50,
]);
$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(__('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' => 1161,
]);
}
/** @test */
public function user_can_remove_invoice_item_on_invoice_edit_page()
{
$this->adminUserSigningIn();
@ -132,7 +229,7 @@ class ManageInvoicesTest extends TestCase
'item_index' => 1,
]);
$this->see(trans('invoice.item_removed'));
$this->see(__('invoice.item_removed'));
$this->seePageIs(route('invoices.edit', $invoice));
@ -144,6 +241,36 @@ class ManageInvoicesTest extends TestCase
}
/** @test */
public function user_can_remove_invoice_item_on_invoice_with_discount_and_sum_correct_amount()
{
$this->adminUserSigningIn();
$invoice = factory(Invoice::class)->create([
'items' => [
['description' => 'Testing deskripsi invoice item', 'amount' => '1111'],
['description' => 'Testing deskripsi invoice item', 'amount' => '2222'],
],
'discount' => 50,
]);
$this->visit(route('invoices.edit', $invoice));
$this->submitForm('remove-item-1', [
'item_index' => 1,
]);
$this->see(__('invoice.item_removed'));
$this->seePageIs(route('invoices.edit', $invoice));
$this->seeInDatabase('invoices', [
'id' => $invoice->id,
'items' => '[{"description":"Testing deskripsi invoice item","amount":"1111"}]',
'amount' => 1061,
]);
}
/** @test */
public function user_can_delete_an_invoice()
{
$this->adminUserSigningIn();
@ -151,14 +278,14 @@ class ManageInvoicesTest extends TestCase
$this->visit(route('invoices.edit', $invoice));
$this->click(trans('invoice.delete'));
$this->click(__('invoice.delete'));
$this->seePageIs(route('invoices.edit', [$invoice, 'action' => 'delete']));
$this->submitForm(trans('invoice.delete'), [
$this->submitForm(__('invoice.delete'), [
'invoice_id' => $invoice->id,
]);
$this->see(trans('invoice.deleted'));
$this->see(__('invoice.deleted'));
$this->seePageIs(route('projects.invoices', $invoice->project_id));

Loading…
Cancel
Save