diff --git a/app/Cart/CartCollection.php b/app/Cart/CartCollection.php index 907579d..d79e6d7 100644 --- a/app/Cart/CartCollection.php +++ b/app/Cart/CartCollection.php @@ -66,6 +66,13 @@ class CartCollection return $content[$draftKey]; } + public function emptyDraft($draftKey) + { + $content = $this->getContent(); + $content[$draftKey]->empty(); + $this->session->put($this->instance, $content); + } + public function removeDraft($draftKey) { $content = $this->getContent(); diff --git a/app/Cart/TransactionDraft.php b/app/Cart/TransactionDraft.php index 9424110..d459a6f 100644 --- a/app/Cart/TransactionDraft.php +++ b/app/Cart/TransactionDraft.php @@ -43,6 +43,11 @@ abstract class TransactionDraft unset($this->items[$itemKey]); } + public function empty() + { + $this->items = []; + } + public function getTotal() { return $this->items()->sum('subtotal'); @@ -53,6 +58,11 @@ abstract class TransactionDraft return $this->items()->sum('qty'); } + public function getDiscountTotal() + { + return $this->items()->sum('item_discount_subtotal'); + } + public function updateItem($itemKey, $newItemData) { if (!isset($this->items[$itemKey])) diff --git a/app/Http/Controllers/CartController.php b/app/Http/Controllers/CartController.php index 102b254..f109e5e 100644 --- a/app/Http/Controllers/CartController.php +++ b/app/Http/Controllers/CartController.php @@ -35,12 +35,24 @@ class CartController extends Controller return redirect()->route('cart.index', $item->draftKey); } + public function updateDraftItem(Request $request, $draftKey) + { + $this->cart->updateDraftItem($draftKey, $request->item_key, $request->only('qty','item_discount')); + return redirect()->route('cart.index', $draftKey); + } + public function removeDraftItem(Request $request, $draftKey) { $this->cart->removeItemFromDraft($draftKey, $request->item_index); return redirect()->route('cart.index', $draftKey); } + public function empty($draftKey) + { + $this->cart->emptyDraft($draftKey); + return redirect()->route('cart.index', $draftKey); + } + public function remove(Request $request) { $this->cart->removeDraft($request->draft_key); diff --git a/routes/web.php b/routes/web.php index 935af31..ab58f6c 100644 --- a/routes/web.php +++ b/routes/web.php @@ -20,6 +20,8 @@ Auth::routes(); Route::get('/home', 'HomeController@index')->name('home'); Route::post('cart/add-draft/{product}', 'CartController@add')->name('cart.add'); 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::delete('cart/remove-draft-item/{draftKey}', 'CartController@removeDraftItem')->name('cart.remove-draft-item'); +Route::delete('cart/empty/{draftKey}', 'CartController@empty')->name('cart.empty'); Route::delete('cart/remove', 'CartController@remove')->name('cart.remove'); Route::delete('cart/destroy', 'CartController@destroy')->name('cart.destroy'); diff --git a/tests/Feature/Cart/CartControllerTest.php b/tests/Feature/Cart/CartControllerTest.php index 229fc13..22f6e31 100644 --- a/tests/Feature/Cart/CartControllerTest.php +++ b/tests/Feature/Cart/CartControllerTest.php @@ -71,7 +71,7 @@ class CartControllerTest extends TestCase $this->assertEquals(2, $cashDraft->getTotalQty()); $this->assertEquals(2200, $cashDraft->getTotal()); - // Add Product as CashDraft item + // Remove Item Product from CashDraft $response = $this->delete(route('cart.remove-draft-item', [$cashDraft->draftKey]), [ 'item_index' => 0 ]); @@ -93,7 +93,7 @@ class CartControllerTest extends TestCase $this->assertFalse($cart->isEmpty()); $this->assertEquals(1, $cart->count()); - // Add Product as CashDraft item + // Remove a transaction draft $response = $this->delete(route('cart.remove'), [ 'draft_key' => $cashDraft->draftKey ]); @@ -114,9 +114,61 @@ class CartControllerTest extends TestCase $this->assertFalse($cart->isEmpty()); $this->assertEquals(2, $cart->count()); - // Add Product as CashDraft item + // Destroy cart (empty out cart) $response = $this->delete(route('cart.destroy')); $this->assertTrue($cart->isEmpty()); } + + /** @test */ + public function user_can_empty_out_transaction_draft() + { + $this->loginAsUser(); + + $cart = new CartCollection; + $cashDraft = new CashDraft; + $product = factory(Product::class)->create(['cash_price' => 1100], ['credit_price' => 1000]); + $item = new Item($product, 2); + + $cashDraft->addItem($item); + $cart->add($cashDraft); + + $this->assertEquals(2, $cashDraft->getTotalQty()); + $this->assertEquals(2200, $cashDraft->getTotal()); + + // Empty out a transaction draft + $response = $this->delete(route('cart.empty', $cashDraft->draftKey)); + + $this->assertEquals(0, $cashDraft->getTotalQty()); + $this->assertCount(0, $cashDraft->items()); + $this->assertEquals(0, $cashDraft->getTotal()); + } + + /** @test */ + public function user_can_update_draft_item_qty_and_item_discount_in_a_draft() + { + $this->loginAsUser(); + + $cart = new CartCollection; + $cashDraft = new CashDraft; + $product = factory(Product::class)->create(['cash_price' => 1100], ['credit_price' => 1000]); + $item = new Item($product, 2); + + $cashDraft->addItem($item); + $cart->add($cashDraft); + + $this->assertEquals(2, $cashDraft->getTotalQty()); + $this->assertEquals(2200, $cashDraft->getTotal()); + + // Update draft item on a transaction draft + $response = $this->patch(route('cart.update-draft-item', [$cashDraft->draftKey]), [ + 'item_key' => 0, + 'qty' => 3, + 'item_discount' => 100, + ]); + + $this->assertEquals(3, $cashDraft->getTotalQty()); + $this->assertEquals(3000, $cashDraft->getTotal()); + $this->assertEquals(300, $cashDraft->getDiscountTotal()); + } } \ No newline at end of file