diff --git a/README.md b/README.md index 98a09b4..1cc5eb3 100644 --- a/README.md +++ b/README.md @@ -585,7 +585,7 @@ If you want to retrieve the cart from the database and restore it, all you have If you want to merge the cart with another one from the database, all you have to do is call the `merge($identifier)` where `$identifier` is the key you specified for the `store` method. You can also define if you want to keep the discount and tax rates of the items and if you want to dispatch "cart.added" events. // Merge the contents of 'savedcart' into 'username'. - Cart::instance('username')->merge('savedcart', $keepDiscount, $keepTaxrate, $dispatchAdd); + Cart::instance('username')->merge('savedcart', $keepDiscount, $keepTaxrate, $dispatchAdd, 'savedcartinstance'); ### Erasing the cart If you want to erase the cart from the database, all you have to do is call the `erase($identifier)` where `$identifier` is the key you specified for the `store` method. diff --git a/README_Idn.md b/README_Idn.md index 5861093..a9999a1 100644 --- a/README_Idn.md +++ b/README_Idn.md @@ -544,7 +544,7 @@ Jika Anda ingin mengambil keranjang dari database dan mengembalikannya, yang har Jika Anda ingin menggabungkan keranjang dengan keranjang lain dari basis data, yang harus Anda lakukan adalah memanggil `gabungan ($ identifier)` di mana `$ identifier` adalah kunci yang Anda tentukan untuk metode` store`. Anda juga dapat menentukan apakah Anda ingin mempertahankan potongan harga dan tarif pajak item. // Merge the contents of 'savedcart' into 'username'. - Cart::instance('username')->merge('savedcart', $keepDiscount, $keepTaxrate); + Cart::instance('username')->merge('savedcart', $keepDiscount, $keepTaxrate, 'savedcartinstance'); ## Pengecualian diff --git a/README_uk-UA.md b/README_uk-UA.md index fb27de2..9b2ed83 100644 --- a/README_uk-UA.md +++ b/README_uk-UA.md @@ -542,7 +542,7 @@ foreach(Cart::content() as $row) { Якщо ви хочете злити кошик із іншим кошиком, збереженим у базі даних, вам знадобиться викликати метод `merge($identifier)`, де `$identifier` - це ключ, який ви зазначили у методі`store`. Ви також можете визначити чи хочете ви зберегти знижку і ставку оподаткування для товарів. // Merge the contents of 'savedcart' into 'username'. - Cart::instance('username')->merge('savedcart', $keepDiscount, $keepTaxrate); + Cart::instance('username')->merge('savedcart', $keepDiscount, $keepTaxrate, 'savedcartinstance'); ## Перехоплення diff --git a/src/Cart.php b/src/Cart.php index 941fabb..5e9f3a6 100644 --- a/src/Cart.php +++ b/src/Cart.php @@ -636,13 +636,15 @@ class Cart $identifier = $identifier->getInstanceIdentifier(); } - if ($this->storedCartWithIdentifierExists($identifier)) { + $instance = $this->currentInstance(); + + if ($this->storedCartInstanceWithIdentifierExists($instance, $identifier)) { throw new CartAlreadyStoredException("A cart with identifier {$identifier} was already stored."); } $this->getConnection()->table($this->getTableName())->insert([ 'identifier' => $identifier, - 'instance' => $this->currentInstance(), + 'instance' => $instance, 'content' => serialize($content), 'created_at' => $this->createdAt ?: Carbon::now(), 'updated_at' => Carbon::now(), @@ -664,17 +666,17 @@ class Cart $identifier = $identifier->getInstanceIdentifier(); } - if (!$this->storedCartWithIdentifierExists($identifier)) { + $currentInstance = $this->currentInstance(); + + if (!$this->storedCartInstanceWithIdentifierExists($currentInstance, $identifier)) { return; } $stored = $this->getConnection()->table($this->getTableName()) - ->where('identifier', $identifier)->first(); + ->where(['identifier'=> $identifier, 'instance' => $currentInstance])->first(); $storedContent = unserialize(data_get($stored, 'content')); - $currentInstance = $this->currentInstance(); - $this->instance(data_get($stored, 'instance')); $content = $this->getContent(); @@ -692,7 +694,7 @@ class Cart $this->createdAt = Carbon::parse(data_get($stored, 'created_at')); $this->updatedAt = Carbon::parse(data_get($stored, 'updated_at')); - $this->getConnection()->table($this->getTableName())->where('identifier', $identifier)->delete(); + $this->getConnection()->table($this->getTableName())->where(['identifier' => $identifier, 'instance' => $currentInstance])->delete(); } /** @@ -708,11 +710,13 @@ class Cart $identifier = $identifier->getInstanceIdentifier(); } - if (!$this->storedCartWithIdentifierExists($identifier)) { + $instance = $this->currentInstance(); + + if (!$this->storedCartInstanceWithIdentifierExists($instance, $identifier)) { return; } - $this->getConnection()->table($this->getTableName())->where('identifier', $identifier)->delete(); + $this->getConnection()->table($this->getTableName())->where(['identifier' => $identifier, 'instance' => $instance])->delete(); $this->events->dispatch('cart.erased'); } @@ -727,14 +731,14 @@ class Cart * * @return bool */ - public function merge($identifier, $keepDiscount = false, $keepTax = false, $dispatchAdd = true) + public function merge($identifier, $keepDiscount = false, $keepTax = false, $dispatchAdd = true, $instance = self::DEFAULT_INSTANCE) { - if (!$this->storedCartWithIdentifierExists($identifier)) { + if (!$this->storedCartInstanceWithIdentifierExists($instance, $identifier)) { return false; } $stored = $this->getConnection()->table($this->getTableName()) - ->where('identifier', $identifier)->first(); + ->where(['identifier'=> $identifier, 'instance'=> $instance])->first(); $storedContent = unserialize($stored->content); @@ -832,9 +836,9 @@ class Cart * * @return bool */ - private function storedCartWithIdentifierExists($identifier) + private function storedCartInstanceWithIdentifierExists($instance, $identifier) { - return $this->getConnection()->table($this->getTableName())->where('identifier', $identifier)->exists(); + return $this->getConnection()->table($this->getTableName())->where(['identifier' => $identifier, 'instance'=> $instance])->exists(); } /** diff --git a/tests/CartTest.php b/tests/CartTest.php index 0e45315..f6a75bc 100644 --- a/tests/CartTest.php +++ b/tests/CartTest.php @@ -865,11 +865,11 @@ class CartTest extends TestCase $cart->store($identifier = 123); + Event::assertDispatched('cart.stored'); + $serialized = serialize($cart->content()); $this->assertDatabaseHas('shoppingcart', ['identifier' => $identifier, 'instance' => 'default', 'content' => $serialized]); - - Event::assertDispatched('cart.stored'); } /** @test */ @@ -905,6 +905,8 @@ class CartTest extends TestCase $cart->store($identifier); + Event::assertDispatched('cart.stored'); + sleep(1); $afterSecondStore = Carbon::now(); @@ -912,8 +914,6 @@ class CartTest extends TestCase $this->assertTrue($beforeStore->lessThanOrEqualTo($cart->createdAt()) && $afterStore->greaterThanOrEqualTo($cart->createdAt())); $this->assertTrue($beforeSecondStore->lessThanOrEqualTo($cart->updatedAt()) && $afterSecondStore->greaterThanOrEqualTo($cart->updatedAt())); - - Event::assertDispatched('cart.stored'); } /** @@ -936,9 +936,9 @@ class CartTest extends TestCase $cart->store($identifier = 123); - $cart->store($identifier); - Event::assertDispatched('cart.stored'); + + $cart->store($identifier); } /** @test */ @@ -962,11 +962,11 @@ class CartTest extends TestCase $cart->restore($identifier); + Event::assertDispatched('cart.restored'); + $this->assertItemsInCart(1, $cart); $this->assertDatabaseMissing('shoppingcart', ['identifier' => $identifier, 'instance' => 'default']); - - Event::assertDispatched('cart.restored'); } /** @test */ @@ -1011,7 +1011,7 @@ class CartTest extends TestCase $cart = $this->getCartDiscount(50); $cart->add(new BuyableProduct(1, 'First item', 10.00), 1); - $cart->update('027c91341fd5cf4d2579b49c4b6a90da', ['qty'=>2]); + $cart->update('027c91341fd5cf4d2579b49c4b6a90da', ['qty' => 2]); $cartItem = $cart->get('027c91341fd5cf4d2579b49c4b6a90da'); @@ -1453,4 +1453,74 @@ class CartTest extends TestCase $this->app['config']->set('cart.format.decimal_point', $decimalPoint); $this->app['config']->set('cart.format.thousand_separator', $thousandSeperator); } + + /** @test */ + public function it_can_store__mutiple_instances_of_the_cart_in_a_database() + { + $this->artisan('migrate', [ + '--database' => 'testing', + ]); + + Event::fake(); + + $cart = $this->getCart(); + + $cart->add(new BuyableProduct()); + + $cart->store($identifier = 123); + + Event::assertDispatched('cart.stored'); + + $serialized = serialize($cart->content()); + + $newInstance = $this->getCart(); + $newInstance->instance($instanceName = 'someinstance'); + $newInstance->add(new BuyableProduct()); + $newInstance->store($identifier); + + Event::assertDispatched('cart.stored'); + + $newInstanceSerialized = serialize($newInstance->content()); + + $this->assertDatabaseHas('shoppingcart', ['identifier' => $identifier, 'instance' => Cart::DEFAULT_INSTANCE, 'content' => $serialized]); + + $this->assertDatabaseHas('shoppingcart', ['identifier' => $identifier, 'instance' => $instanceName, 'content' => $newInstanceSerialized]); + } + + /** @test */ + public function it_can_calculate_the_total_price_of_the_items_in_cart() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'first item', $price = 1000), $qty = 5); + $this->assertEquals(5000, $cart->priceTotalFloat()); + } + + /** @test */ + public function it_can_format_the_total_price_of_the_items_in_cart() + { + $cart = $this->getCart(); + + $cart->add(new BuyableProduct(1, 'first item', 1000), 5); + $this->assertEquals('5,000.00', $cart->priceTotal()); + $this->assertEquals('5,000.0000', $cart->priceTotal(4, '.', ',')); + } + + /** @test */ + public function it_can_erase_saved_cart_from_the_database() + { + $this->artisan('migrate', [ + '--database' => 'testing', + ]); + + Event::fake(); + + $cart = $this->getCart(); + $cart->add(new BuyableProduct(1, 'Item', 10.00), 1); + $cart->add(new BuyableProduct(2, 'Item 2', 10.00), 1); + $cart->store($identifier = 'test'); + $cart->erase($identifier); + Event::assertDispatched('cart.erased'); + $this->assertDatabaseMissing('shoppingcart', ['identifier' => $identifier, 'instance' => Cart::DEFAULT_INSTANCE]); + } }