Browse Source

Add invoice detail page

Change invoice_no column into number in invoices table
pull/1/head
Nafies Luthfi 8 years ago
parent
commit
d7f3613f43
  1. 8
      app/Entities/Invoices/Invoice.php
  2. 4
      app/Http/Controllers/InvoiceDraftController.php
  3. 2
      app/Http/Controllers/InvoicesController.php
  4. 10
      app/Services/InvoiceDraft/InvoiceDraft.php
  5. 8
      app/Services/InvoiceDraft/InvoiceDraftCollection.php
  6. 16
      database/factories/ModelFactory.php
  7. 2
      database/migrations/2017_10_05_162758_create_invoices_table.php
  8. 5
      resources/lang/id/invoice.php
  9. 6
      resources/views/invoices/partials/form-draft-detail.blade.php
  10. 58
      resources/views/invoices/show.blade.php
  11. 2
      tests/Feature/InvoiceEntryTest.php
  12. 17
      tests/Unit/Models/InvoiceTest.php

8
app/Entities/Invoices/Invoice.php

@ -2,6 +2,7 @@
namespace App\Entities\Invoices;
use App\Entities\Projects\Project;
use Illuminate\Database\Eloquent\Model;
class Invoice extends Model
@ -12,6 +13,11 @@ class Invoice extends Model
public function getRouteKeyName()
{
return 'invoice_no';
return 'number';
}
public function project()
{
return $this->belongsTo(Project::class);
}
}

4
app/Http/Controllers/InvoiceDraftController.php

@ -126,8 +126,8 @@ class InvoiceDraftController extends Controller
$invoice = $draft->store();
$draft->destroy();
flash(trans('invoice.created', ['invoice_no' => $invoice->invoice_no]), 'success')->important();
flash(trans('invoice.created', ['number' => $invoice->number]), 'success')->important();
return redirect()->route('invoices.show', $invoice->invoice_no);
return redirect()->route('invoices.show', $invoice->number);
}
}

2
app/Http/Controllers/InvoicesController.php

@ -9,6 +9,6 @@ class InvoicesController extends Controller
{
public function show(Invoice $invoice)
{
return $invoice;
return view('invoices.show', compact('invoice'));
}
}

10
app/Services/InvoiceDraft/InvoiceDraft.php

@ -62,7 +62,7 @@ class InvoiceDraft
public function store()
{
$invoice = new Invoice();
$invoice->invoice_no = $this->getNewInvoiceNo();
$invoice->number = $this->getNewInvoiceNo();
$invoice->items = $this->getItemsArray();
$invoice->project_id = $this->projectId;
$invoice->amount = $this->getTotal();
@ -79,16 +79,16 @@ class InvoiceDraft
{
$prefix = date('ym');
$lastInvoice = Invoice::orderBy('invoice_no', 'desc')->first();
$lastInvoice = Invoice::orderBy('number', 'desc')->first();
if (!is_null($lastInvoice)) {
$lastInvoiceNo = $lastInvoice->invoice_no;
if (substr($lastInvoiceNo, 0, 4) == $prefix) {
$lastInvoiceNo = $lastInvoice->number;
if (substr($lastInvoiceNo, 0, 3) == $prefix) {
return ++$lastInvoiceNo;
}
}
return $prefix.'0001';
return $prefix.'001';
}
protected function getItemsArray()

8
app/Services/InvoiceDraft/InvoiceDraftCollection.php

@ -2,7 +2,6 @@
namespace App\Services\InvoiceDrafts;
use App\Product;
use Illuminate\Support\Collection;
/**
@ -110,13 +109,6 @@ class InvoiceDraftCollection
return $item;
}
public function draftHasItem(TrasactionDraft $draft, Product $product)
{
$item = $draft->search($product);
return !is_null($item);
}
public function updateDraftItem($draftKey, $itemKey, $newItemData)
{
$content = $this->getContent();

16
database/factories/ModelFactory.php

@ -1,5 +1,6 @@
<?php
use App\Entities\Invoices\Invoice;
use App\Entities\Payments\Payment;
use App\Entities\Projects\Feature;
use App\Entities\Projects\Project;
@ -136,3 +137,18 @@ $factory->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' => date('ym').'001',
'items' => [],
'amount' => 100000,
'notes' => $faker->paragraph,
'status_id' => 1,
'user_id' => 1,
];
});

2
database/migrations/2017_10_05_162758_create_invoices_table.php

@ -16,7 +16,7 @@ class CreateInvoicesTable extends Migration
Schema::create('invoices', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('project_id');
$table->string('invoice_no', 8);
$table->string('number', 8)->unique();
$table->text('items');
$table->unsignedInteger('amount');
$table->string('notes');

5
resources/lang/id/invoice.php

@ -12,6 +12,7 @@ return [
// Actions
'proccess' => 'Proses Invoice',
'item_list_empty' => 'List Item masih kosong.',
'create' => 'Input Invoice Baru',
'created' => 'Input Invoice baru telah berhasil.',
'show' => 'Detail Invoice',
@ -25,7 +26,11 @@ return [
'undeleteable' => 'Data Invoice tidak dapat dihapus.',
// Attributes
'number' => 'No. Invoice',
'project' => 'Project',
'items' => 'Item Invoice',
'notes' => 'Catatan',
'amount' => 'Tagihan',
'item_description' => 'Deskripsi',
'item_amount' => 'Biaya',
];

6
resources/views/invoices/partials/form-draft-detail.blade.php

@ -1,6 +1,10 @@
<legend>{{ trans('invoice.detail') }}</legend>
{{ Form::open(['route' => ['cart.draft-proccess', $draft->draftKey], 'method' => 'patch']) }}
{!! FormField::select('project_id', $projects, ['label' => trans('invoice.project'), 'required' => true]) !!}
{!! FormField::select('project_id', $projects, [
'label' => trans('invoice.project'),
'value' => $draft->projectId,
'required' => true,
] ) !!}
{!! FormField::textarea('notes', ['label' => trans('invoice.notes'), 'value' => $draft->notes]) !!}
{{ Form::submit(trans('invoice.proccess'), ['class' => 'btn btn-info']) }}
{{ Form::close() }}

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

@ -0,0 +1,58 @@
@extends('layouts.app')
@section('title', $invoice->number . ' - ' . trans('invoice.detail'))
@section('content')
{{-- <div class="pull-right">{{ link_to_route('invoices.pdf', trans('invoice.invoice_print'), [$invoice->number], ['class' => 'btn btn-info']) }}</div> --}}
<h1 class="page-header">{{ $invoice->number }} <small>{{ trans('invoice.detail') }}</small></h1>
<div class="row">
<div class="col-sm-4">
<div class="panel panel-default">
<div class="panel-heading"><h3 class="panel-title">{{ trans('invoice.detail') }}</h3></div>
<div class="panel-body">
<table class="table table-condensed">
<tbody>
<tr><td>{{ trans('invoice.number') }}</td><td class="text-primary strong">{{ $invoice->number }}</td></tr>
<tr><td>{{ trans('app.date') }}</td><td>{{ $invoice->created_at->format('Y-m-d') }}</td></tr>
<tr><td>{{ trans('invoice.project') }}</td><td>{{ $invoice->project_id }}</td></tr>
<tr><td>{{ trans('invoice.customer_phone') }}</td><td>{{ $invoice->customer['phone'] }}</td></tr>
<tr><td>{{ trans('invoice.items_count') }}</td><td>{{ $invoice->items_count }}</td></tr>
<tr><td>{{ trans('invoice.amount') }}</td><td class="text-right strong">{{ formatRp($invoice->amount) }}</td></tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="col-sm-8">
<div class="panel panel-default">
<div class="panel-heading"><h3 class="panel-title">{{ trans('invoice.items') }}</h3></div>
<div class="panel-body">
<table class="table table-condensed">
<thead>
<tr>
<th>{{ trans('app.table_no') }}</th>
<th>{{ trans('invoice.item_description') }}</th>
<th class="text-right">{{ trans('invoice.item_amount') }}</th>
</tr>
</thead>
<tbody>
@foreach($invoice->items as $key => $item)
<tr>
<td>{{ $key + 1 }}</td>
<td>{{ $item['description'] }}</td>
<td class="text-right">{{ formatRp($item['amount']) }}</td>
</tr>
@endforeach
</tbody>
<tfoot>
<tr>
<th colspan="2" class="text-right">{{ trans('app.total') }} :</th>
<th class="text-right">{{ formatRp($invoice['total']) }}</th>
</tr>
</tfoot>
</table>
</div>
</div>
</div>
</div>
@endsection

2
tests/Feature/InvoiceEntryTest.php

@ -157,7 +157,7 @@ class InvoiceEntryTest extends TestCase
// $this->see(trans('invoice.created', ['invoice_no' => date('ym').'0001']));
$this->seeInDatabase('invoices', [
'invoice_no' => date('ym').'0001',
'number' => date('ym').'001',
'items' => '[{"description":"Deskripsi item invoice","amount":1000},{"description":"Deskripsi item invoice","amount":2000}]',
'project_id' => $project->id,
'amount' => 3000,

17
tests/Unit/Models/InvoiceTest.php

@ -0,0 +1,17 @@
<?php
namespace Tests\Unit\Models;
use App\Entities\Invoices\Invoice;
use App\Entities\Projects\Project;
use Tests\TestCase;
class InvoiceTest extends TestCase
{
/** @test */
public function it_has_project_relation()
{
$invoice = factory(Invoice::class)->create();
$this->assertTrue($invoice->project instanceof Project);
}
}
Loading…
Cancel
Save