Browse Source

Added save draft transaction to database

pull/3/head
Nafies Luthfi 9 years ago
parent
commit
65016b0454
  1. 57
      app/Cart/TransactionDraft.php
  2. 23
      app/Http/Controllers/CartController.php
  3. 13
      app/Transaction.php
  4. 38
      database/migrations/2017_04_27_121204_create_transactions_table.php
  5. 2
      resources/views/cart/partials/draft-confirm.blade.php
  6. 4
      resources/views/cart/partials/form-draft-detail.blade.php
  7. 1
      routes/web.php
  8. 51
      tests/Unit/Integration/TransactionDraftTest.php

57
app/Cart/TransactionDraft.php

@ -3,6 +3,7 @@
namespace App\Cart; namespace App\Cart;
use App\Product; use App\Product;
use App\Transaction;
/** /**
* Transaction Draft Interface. * Transaction Draft Interface.
@ -101,4 +102,60 @@ abstract class TransactionDraft
{ {
return $this->payment - $this->getTotal(); return $this->payment - $this->getTotal();
} }
public function store()
{
$transaction = new Transaction;
$transaction->invoice_no = $this->getNewInvoiceNo();
$transaction->items = $this->getItemsArray();
$transaction->customer = $this->customer;
$transaction->payment = $this->payment;
$transaction->total = $this->getTotal();
$transaction->notes = $this->notes;
$transaction->user_id = auth()->id() ?: 1;
$transaction->save();
return $transaction;
}
public function getNewInvoiceNo()
{
$prefix = date('ym');
$lastTransaction = Transaction::orderBy('invoice_no','desc')->first();
if (! is_null($lastTransaction)) {
$lastInvoiceNo = $lastTransaction->invoice_no;
if (substr($lastInvoiceNo, 0, 4) == $prefix) {
return ++$lastInvoiceNo;
}
}
return $prefix . '0001';
}
protected function getItemsArray()
{
$items = [];
foreach ($this->items as $item) {
$items[] = [
'id' => $item->product->id,
'name' => $item->name,
'price' => $item->price,
'qty' => $item->qty,
'item_discount' => $item->item_discount,
'item_discount_subtotal' => $item->item_discount_subtotal,
'subtotal' => $item->subtotal,
];
}
return $items;
}
public function destroy()
{
$cart = app(CartCollection::class);
return $cart->removeDraft($this->draftKey);
}
} }

23
app/Http/Controllers/CartController.php

@ -28,6 +28,10 @@ class CartController extends Controller
public function show(Request $request, $draftKey) public function show(Request $request, $draftKey)
{ {
$draft = $this->cart->get($draftKey);
if (is_null($draft))
return redirect()->route('cart.index');
$query = $request->get('query'); $query = $request->get('query');
$queriedProducts = []; $queriedProducts = [];
if ($query) { if ($query) {
@ -36,8 +40,6 @@ class CartController extends Controller
})->get(); })->get();
} }
$draft = $this->cart->get($draftKey);
return view('cart.index', compact('draft', 'queriedProducts')); return view('cart.index', compact('draft', 'queriedProducts'));
} }
@ -101,7 +103,24 @@ class CartController extends Controller
public function proccess(Request $request, $draftKey) public function proccess(Request $request, $draftKey)
{ {
$this->validate($request, [
'customer.name' => 'required|string|max:30',
'customer.phone' => 'nullable|string|max:20',
'payment' => 'required|numeric',
'notes' => 'nullable|string|max:100',
]);
$this->cart->updateDraftAttributes($draftKey, $request->only('customer','notes','payment')); $this->cart->updateDraftAttributes($draftKey, $request->only('customer','notes','payment'));
return redirect()->route('cart.show', [$draftKey, 'action' => 'confirm']); return redirect()->route('cart.show', [$draftKey, 'action' => 'confirm']);
} }
public function store(Request $request, $draftKey)
{
$draft = $this->cart->get($draftKey);
if (is_null($draft))
return redirect()->route('cart.index');
$draft->store();
$draft->destroy();
return redirect()->route('cart.index');
}
} }

13
app/Transaction.php

@ -0,0 +1,13 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Transaction extends Model
{
protected $casts = [
'items' => 'array',
'customer' => 'array',
];
}

38
database/migrations/2017_04_27_121204_create_transactions_table.php

@ -0,0 +1,38 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateTransactionsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('transactions', function (Blueprint $table) {
$table->increments('id');
$table->char('invoice_no', 8);
$table->text('items');
$table->string('customer');
$table->unsignedInteger('payment');
$table->unsignedInteger('total');
$table->string('notes')->nullable();
$table->unsignedInteger('user_id');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('transactions');
}
}

2
resources/views/cart/partials/draft-confirm.blade.php

@ -63,7 +63,7 @@
</table> </table>
</div> </div>
<div class="panel-footer"> <div class="panel-footer">
{{ Form::open() }}
{{ Form::open(['route' => ['cart.store', $draft->draftKey]]) }}
{{ Form::submit(trans('transaction.save'), ['id' => 'save-transaction-draft', 'class' => 'btn btn-success']) }} {{ Form::submit(trans('transaction.save'), ['id' => 'save-transaction-draft', 'class' => 'btn btn-success']) }}
{{ link_to_route('cart.show', trans('app.back'), $draft->draftKey, ['class' => 'btn btn-default']) }} {{ link_to_route('cart.show', trans('app.back'), $draft->draftKey, ['class' => 'btn btn-default']) }}
{{ Form::close() }} {{ Form::close() }}

4
resources/views/cart/partials/form-draft-detail.blade.php

@ -1,9 +1,9 @@
<legend>{{ trans('transaction.detail') }}</legend> <legend>{{ trans('transaction.detail') }}</legend>
{{ Form::open(['route' => ['cart.draft-proccess', $draft->draftKey], 'method' => 'patch']) }} {{ Form::open(['route' => ['cart.draft-proccess', $draft->draftKey], 'method' => 'patch']) }}
{!! FormField::text('customer[name]', ['label' => trans('transaction.customer_name'), 'value' => $draft->customer['name']]) !!}
{!! FormField::text('customer[name]', ['label' => trans('transaction.customer_name'), 'value' => $draft->customer['name'], 'required' => true]) !!}
<div class="row"> <div class="row">
<div class="col-md-6">{!! FormField::text('customer[phone]', ['label' => trans('transaction.customer_phone'), 'value' => $draft->customer['phone']]) !!}</div> <div class="col-md-6">{!! FormField::text('customer[phone]', ['label' => trans('transaction.customer_phone'), 'value' => $draft->customer['phone']]) !!}</div>
<div class="col-md-6">{!! FormField::price('payment', ['label' => trans('transaction.payment'), 'value' => $draft->payment]) !!}</div>
<div class="col-md-6">{!! FormField::price('payment', ['label' => trans('transaction.payment'), 'value' => $draft->payment, 'required' => true]) !!}</div>
</div> </div>
{!! FormField::textarea('notes', ['label' => trans('transaction.notes'), 'value' => $draft->notes]) !!} {!! FormField::textarea('notes', ['label' => trans('transaction.notes'), 'value' => $draft->notes]) !!}
{{ Form::submit(trans('transaction.proccess'), ['class' => 'btn btn-info']) }} {{ Form::submit(trans('transaction.proccess'), ['class' => 'btn btn-info']) }}

1
routes/web.php

@ -21,6 +21,7 @@ Route::get('/home', 'CartController@index')->name('home');
Route::group(['middleware' => 'auth'], function () { Route::group(['middleware' => 'auth'], function () {
Route::get('drafts', 'CartController@index')->name('cart.index'); Route::get('drafts', 'CartController@index')->name('cart.index');
Route::get('drafts/{draftKey}', 'CartController@show')->name('cart.show'); Route::get('drafts/{draftKey}', 'CartController@show')->name('cart.show');
Route::post('drafts/{draftKey}', 'CartController@store')->name('cart.store');
Route::post('cart/add-draft', 'CartController@add')->name('cart.add'); Route::post('cart/add-draft', 'CartController@add')->name('cart.add');
Route::post('cart/add-draft-item/{draftKey}/{product}', 'CartController@addDraftItem')->name('cart.add-draft-item'); Route::post('cart/add-draft-item/{draftKey}/{product}', 'CartController@addDraftItem')->name('cart.add-draft-item');
Route::patch('cart/update-draft-item/{draftKey}', 'CartController@updateDraftItem')->name('cart.update-draft-item'); Route::patch('cart/update-draft-item/{draftKey}', 'CartController@updateDraftItem')->name('cart.update-draft-item');

51
tests/Unit/Integration/TransactionDraftTest.php

@ -41,6 +41,17 @@ class TransactionDraftTest extends TestCase
} }
/** @test */ /** @test */
public function it_has_destroy_method()
{
$cart = new CartCollection();
$draft = $cart->add(new CashDraft());
$draftKey = $draft->draftKey;
$this->assertNotNull($draft);
$draft->destroy();
$this->assertNull($cart->get($draftKey));
}
/** @test */
public function it_has_get_total_method() public function it_has_get_total_method()
{ {
$cart = new CartCollection(); $cart = new CartCollection();
@ -141,7 +152,7 @@ class TransactionDraftTest extends TestCase
} }
/** @test */ /** @test */
public function transaction_draft_has_payment_and_exchange()
public function it_has_payment_and_exchange()
{ {
$cart = new CartCollection(); $cart = new CartCollection();
@ -174,4 +185,42 @@ class TransactionDraftTest extends TestCase
], $draft->customer); ], $draft->customer);
$this->assertEquals('Catatan', $draft->notes); $this->assertEquals('Catatan', $draft->notes);
} }
/** @test */
public function it_has_store_method_to_save_to_database()
{
$cart = new CartCollection();
$draft = $cart->add(new CashDraft());
$product1 = factory(Product::class)->create(['cash_price' => 1000]);
$product2 = factory(Product::class)->create(['cash_price' => 2000]);
$item1 = new Item($product1, 1);
$item2 = new Item($product2, 3);
// Add items to draft
$cart->addItemToDraft($draft->draftKey, $item1);
$cart->addItemToDraft($draft->draftKey, $item2);
$draftAttributes = [
'customer' => [
'name' => 'Nafies',
'phone' => '081234567890',
],
'payment' => 10000,
'notes' => 'Catatan',
];
$cart->updateDraftAttributes($draft->draftKey, $draftAttributes);
$draft->store();
$this->assertDatabaseHas('transactions', [
'invoice_no' => date('ym') . '0001',
'items' => '[{"id":' . $product1->id . ',"name":"' . $product1->name . '","price":1000,"qty":1,"item_discount":0,"item_discount_subtotal":0,"subtotal":1000},{"id":' . $product2->id . ',"name":"' . $product2->name . '","price":2000,"qty":3,"item_discount":0,"item_discount_subtotal":0,"subtotal":6000}]',
'customer' => '{"name":"Nafies","phone":"081234567890"}',
'payment' => 10000,
'total' => 7000,
'notes' => 'Catatan',
'user_id' => 1,
]);
}
} }
Loading…
Cancel
Save