Compare commits

...
6 Commits
Author SHA1 Message Date
Joel Male f60bf92157 1.0.12 2024-11-28 13:11:23 +10:00
Joel Male a231ed8c43 1.0.12 2024-11-28 13:06:30 +10:00
Joel Male 599051631c wip: rename package to joelwmale 2024-11-28 13:06:24 +10:00
Joel Male b3ef4c38fc 1.0.11 2024-09-23 07:48:27 +10:00
Joel Male a45121ca63 Merge pull request #20 from wearepixel/task/fix-subtotal-always-being-used-if-the-total-is-$0
Task: Fix subtotal always being used when cart conditions on the total bring it to $0
2024-09-23 07:48:06 +10:00
Joel Male 5505f121c7 fix subtotal always being used 2024-09-23 07:45:59 +10:00
27 changed files with 455 additions and 530 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
The MIT License (MIT)
Copyright (c) Pixel Digital Pty Ltd <hello@wearepixel.com.au>
Copyright (c) Joel Male <joel@joelmale.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
+13 -13
View File
@@ -1,11 +1,11 @@
[![Latest Version on Packagist](https://img.shields.io/packagist/v/wearepixel/laravel-cart.svg?style=flat-square)](https://packagist.org/packages/wearepixel/laravel-cart)
[![GitHub Tests Action Status](https://img.shields.io/github/actions/workflow/status/wearepixel/laravel-cart/tests.yml?branch=master&label=Tests)](https://github.com/wearepixel/laravel-cart/actions?query=workflow%3ATests+branch%3Amaster)
[![Total Downloads](https://img.shields.io/packagist/dt/wearepixel/laravel-cart.svg?style=flat-square)](https://packagist.org/packages/wearepixel/laravel-cart)
[![License](https://poser.pugx.org/wearepixel/laravel-cart/license.svg)](https://packagist.org/packages/wearepixel/laravel-cart)
[![Latest Version on Packagist](https://img.shields.io/packagist/v/joelwmale/laravel-cart.svg?style=flat-square)](https://packagist.org/packages/joelwmale/laravel-cart)
[![GitHub Tests Action Status](https://img.shields.io/github/actions/workflow/status/joelwmale/laravel-cart/tests.yml?branch=master&label=Tests)](https://github.com/joelwmale/laravel-cart/actions?query=workflow%3ATests+branch%3Amaster)
[![Total Downloads](https://img.shields.io/packagist/dt/joelwmale/laravel-cart.svg?style=flat-square)](https://packagist.org/packages/joelwmale/laravel-cart)
[![License](https://poser.pugx.org/joelwmale/laravel-cart/license.svg)](https://packagist.org/packages/joelwmale/laravel-cart)
A Cart Implementation for Laravel.
Supported Laravel Versions: 9, 10, 11
Supported Laravel Versions: 9, 10, and 11
## Quick Demo
@@ -33,14 +33,14 @@ ## Installing
Install the package through [Composer](http://getcomposer.org/).
`composer require "wearepixel/laravel-cart"`
`composer require "joelwmale/laravel-cart"`
## Configuration
You can publish the configuration file to customize various options.
```php
php artisan vendor:publish --provider="Wearepixel\Cart\CartServiceProvider" --tag="config"
php artisan vendor:publish --provider="Joelwmale\Cart\CartServiceProvider" --tag="config"
```
### Formatting Numbers
@@ -304,7 +304,7 @@ #### Adding a condition to the cart: **Cart::condition()**
```php
// Add a single condition to the cart
$condition = new \Wearepixel\Cart\CartCondition([
$condition = new \Joelwmale\Cart\CartCondition([
'name' => 'Tax: 10%',
'type' => 'tax',
'target' => 'subtotal', // this condition will be applied to cart's subtotal when getSubTotal() is called.
@@ -317,7 +317,7 @@ #### Adding a condition to the cart: **Cart::condition()**
Cart::condition($condition);
// Add multiple conditions
$tax = new \Wearepixel\Cart\CartCondition([
$tax = new \Joelwmale\Cart\CartCondition([
'name' => 'Tax: 10%',
'type' => 'tax',
'target' => 'subtotal', // this condition will be applied to cart's subtotal when getSubTotal() is called.
@@ -325,7 +325,7 @@ #### Adding a condition to the cart: **Cart::condition()**
'order' => 2
]);
$shipping = new \Wearepixel\Cart\CartCondition([
$shipping = new \Joelwmale\Cart\CartCondition([
'name' => 'Shipping: $15',
'type' => 'shipping',
'target' => 'subtotal', // this condition will be applied to cart's subtotal when getSubTotal() is called.
@@ -340,7 +340,7 @@ #### Adding a condition to the cart: **Cart::condition()**
Cart::condition([$tax, $shipping]);
// add condition to only apply on totals, not in subtotal
$shipping = new \Wearepixel\Cart\CartCondition([
$shipping = new \Joelwmale\Cart\CartCondition([
'name' => 'Express Shipping $15',
'type' => 'shipping',
'target' => 'total',
@@ -532,7 +532,7 @@ ### Condition on items
```php
// lets create first our condition instance
$saleCondition = new \Wearepixel\Cart\CartCondition([
$saleCondition = new \Joelwmale\Cart\CartCondition([
'name' => '50% Off',
'type' => 'tax',
'value' => '-50%',
@@ -552,7 +552,7 @@ ### Condition on items
Cart::add($product);
// You can of course also do multiple conditions on an item
$saleCondition = new \Wearepixel\Cart\CartCondition([
$saleCondition = new \Joelwmale\Cart\CartCondition([
'name' => 'SALE 5%',
'type' => 'sale',
'value' => '-5%',
+6 -6
View File
@@ -1,6 +1,6 @@
{
"name": "wearepixel/laravel-cart",
"version": "1.0.10",
"name": "joelwmale/laravel-cart",
"version": "1.0.12",
"description": "A cart implementation for Laravel",
"keywords": [
"laravel",
@@ -15,7 +15,7 @@
},
{
"name": "Joel Male",
"email": "joel@wearepixel.com.au"
"email": "joel@joelmale.com"
}
],
"require": {
@@ -32,17 +32,17 @@
},
"autoload": {
"psr-4": {
"Wearepixel\\Cart\\": "src/"
"Joelwmale\\Cart\\": "src/"
}
},
"minimum-stability": "dev",
"extra": {
"laravel": {
"providers": [
"Wearepixel\\Cart\\CartServiceProvider"
"Joelwmale\\Cart\\CartServiceProvider"
],
"aliases": {
"Cart": "Wearepixel\\Cart\\Facades\\CartFacade"
"Cart": "Joelwmale\\Cart\\Facades\\CartFacade"
}
}
},
Generated
+370 -446
View File
File diff suppressed because it is too large Load Diff
+17 -16
View File
@@ -1,12 +1,12 @@
<?php
namespace Wearepixel\Cart;
namespace Joelwmale\Cart;
use Wearepixel\Cart\Helpers\Helpers;
use Wearepixel\Cart\Validators\CartItemValidator;
use Wearepixel\Cart\Exceptions\InvalidItemException;
use Wearepixel\Cart\Exceptions\UnknownModelException;
use Wearepixel\Cart\Exceptions\InvalidConditionException;
use Joelwmale\Cart\Helpers\Helpers;
use Joelwmale\Cart\Validators\CartItemValidator;
use Joelwmale\Cart\Exceptions\InvalidItemException;
use Joelwmale\Cart\Exceptions\UnknownModelException;
use Joelwmale\Cart\Exceptions\InvalidConditionException;
class Cart
{
@@ -227,11 +227,11 @@ public function setConfig($config)
public function addItemCondition($productId, $itemCondition)
{
if ($product = $this->get($productId)) {
$conditionInstance = '\\Wearepixel\\Cart\\CartCondition';
$conditionInstance = '\\Joelwmale\\Cart\\CartCondition';
if ($itemCondition instanceof $conditionInstance) {
// we need to copy first to a temporary variable to hold the conditions
// to avoid hitting this error "Indirect modification of overloaded element of Wearepixel\Cart\ItemCollection has no effect"
// to avoid hitting this error "Indirect modification of overloaded element of Joelwmale\Cart\ItemCollection has no effect"
// this is due to laravel Collection instance that implements Array Access
// // see link for more info: http://stackoverflow.com/questions/20053269/indirect-modification-of-overloaded-element-of-splfixedarray-has-no-effect
$itemConditionTempHolder = $product['conditions'];
@@ -313,7 +313,7 @@ public function condition(array|CartCondition $condition): self
}
if (! $condition instanceof CartCondition) {
throw new InvalidConditionException('Argument 1 must be an instance of \'Wearepixel\Cart\CartCondition\'');
throw new InvalidConditionException('Argument 1 must be an instance of \'Joelwmale\Cart\CartCondition\'');
}
$conditions = $this->getConditions();
@@ -448,7 +448,7 @@ public function removeItemCondition($itemId, $conditionName)
// on the given condition name the user wants to remove, if so,
// lets just make $item['conditions'] an empty array as there's just 1 condition on it anyway
else {
$conditionInstance = 'Wearepixel\\Cart\\CartCondition';
$conditionInstance = 'Joelwmale\\Cart\\CartCondition';
if ($item['conditions'] instanceof $conditionInstance) {
if ($tempConditionsHolder->getName() == $conditionName) {
@@ -458,9 +458,6 @@ public function removeItemCondition($itemId, $conditionName)
}
}
// reset indexes
$item['conditions'] = array_values($item['conditions']);
$this->update($itemId, [
'conditions' => $item['conditions'],
]);
@@ -601,10 +598,14 @@ public function getTotal(): int|float
return Helpers::formatValue($subTotal, $this->config['format_numbers'], $this->config);
}
$conditionsForTotal->each(function (CartCondition $condition) use ($subTotal, &$total) {
$toBeCalculated = $total > 0 ? $total : $subTotal;
$index = 0;
$conditionsForTotal->each(function (CartCondition $condition) use ($subTotal, &$total, &$index) {
$toBeCalculated = ($index > 0) ? $total : $subTotal;
$total = $condition->applyCondition($toBeCalculated);
$index++;
});
return Helpers::formatValue($total, $this->config['format_numbers'], $this->config);
@@ -763,7 +764,7 @@ protected function itemHasConditions($item)
return count($item['conditions']) > 0;
}
$conditionInstance = 'Wearepixel\\Cart\\CartCondition';
$conditionInstance = 'Joelwmale\\Cart\\CartCondition';
if ($item['conditions'] instanceof $conditionInstance) {
return true;
+1 -1
View File
@@ -1,6 +1,6 @@
<?php
namespace Wearepixel\Cart;
namespace Joelwmale\Cart;
use Illuminate\Support\Collection;
+4 -4
View File
@@ -1,10 +1,10 @@
<?php
namespace Wearepixel\Cart;
namespace Joelwmale\Cart;
use Wearepixel\Cart\Helpers\Helpers;
use Wearepixel\Cart\Validators\CartConditionValidator;
use Wearepixel\Cart\Exceptions\InvalidConditionException;
use Joelwmale\Cart\Helpers\Helpers;
use Joelwmale\Cart\Validators\CartConditionValidator;
use Joelwmale\Cart\Exceptions\InvalidConditionException;
class CartCondition
{
+1 -1
View File
@@ -1,6 +1,6 @@
<?php
namespace Wearepixel\Cart;
namespace Joelwmale\Cart;
use Illuminate\Support\Collection;
+1 -1
View File
@@ -1,6 +1,6 @@
<?php
namespace Wearepixel\Cart;
namespace Joelwmale\Cart;
use Illuminate\Support\ServiceProvider;
+1 -1
View File
@@ -1,5 +1,5 @@
<?php
namespace Wearepixel\Cart\Exceptions;
namespace Joelwmale\Cart\Exceptions;
class InvalidConditionException extends \Exception {}
+1 -1
View File
@@ -1,5 +1,5 @@
<?php
namespace Wearepixel\Cart\Exceptions;
namespace Joelwmale\Cart\Exceptions;
class InvalidItemException extends \Exception {}
+1 -1
View File
@@ -1,5 +1,5 @@
<?php
namespace Wearepixel\Cart\Exceptions;
namespace Joelwmale\Cart\Exceptions;
class UnknownModelException extends \Exception {}
+1 -1
View File
@@ -1,6 +1,6 @@
<?php
namespace Wearepixel\Cart\Facades;
namespace Joelwmale\Cart\Facades;
use Illuminate\Support\Facades\Facade;
+1 -1
View File
@@ -1,6 +1,6 @@
<?php
namespace Wearepixel\Cart\Helpers;
namespace Joelwmale\Cart\Helpers;
class Helpers
{
+1 -1
View File
@@ -1,6 +1,6 @@
<?php
namespace Wearepixel\Cart;
namespace Joelwmale\Cart;
use Illuminate\Support\Collection;
+3 -3
View File
@@ -1,9 +1,9 @@
<?php
namespace Wearepixel\Cart;
namespace Joelwmale\Cart;
use Illuminate\Support\Collection;
use Wearepixel\Cart\Helpers\Helpers;
use Joelwmale\Cart\Helpers\Helpers;
class ItemCollection extends Collection
{
@@ -72,7 +72,7 @@ public function hasConditions()
if (is_array($this['conditions'])) {
return count($this['conditions']) > 0;
}
$conditionInstance = 'Wearepixel\\Cart\\CartCondition';
$conditionInstance = 'Joelwmale\\Cart\\CartCondition';
if ($this['conditions'] instanceof $conditionInstance) {
return true;
}
+1 -1
View File
@@ -1,5 +1,5 @@
<?php
namespace Wearepixel\Cart\Validators;
namespace Joelwmale\Cart\Validators;
class CartConditionValidator extends Validator {}
+1 -1
View File
@@ -1,5 +1,5 @@
<?php
namespace Wearepixel\Cart\Validators;
namespace Joelwmale\Cart\Validators;
class CartItemValidator extends Validator {}
+1 -1
View File
@@ -1,6 +1,6 @@
<?php
namespace Wearepixel\Cart\Validators;
namespace Joelwmale\Cart\Validators;
use Illuminate\Validation\Factory;
use Illuminate\Filesystem\Filesystem;
+1 -1
View File
@@ -1,6 +1,6 @@
<?php
namespace Wearepixel\Cart\Tests\Helpers;
namespace Joelwmale\Cart\Tests\Helpers;
use Illuminate\Contracts\Database\ModelIdentifier;
+1 -1
View File
@@ -1,6 +1,6 @@
<?php
namespace Wearepixel\Cart\Tests\Helpers;
namespace Joelwmale\Cart\Tests\Helpers;
class SessionMock
{
+5 -5
View File
@@ -1,9 +1,9 @@
<?php
use Wearepixel\Cart\Cart;
use Wearepixel\Cart\CartCondition;
use Wearepixel\Cart\CartConditionCollection;
use Wearepixel\Cart\Tests\Helpers\SessionMock;
use Joelwmale\Cart\Cart;
use Joelwmale\Cart\CartCondition;
use Joelwmale\Cart\CartConditionCollection;
use Joelwmale\Cart\Tests\Helpers\SessionMock;
beforeEach(function () {
$events = Mockery::mock('Illuminate\Contracts\Events\Dispatcher');
@@ -1310,7 +1310,7 @@
// now we should have only 1 condition left on that item
expect($this->cart->get(1)['conditions'])->toHaveCount(1, 'Item should have one condition left');
expect($this->cart->get(1)['conditions'][0]->getName())->toEqual('Mother\'s Day Gift Pack');
expect($this->cart->get(1)['conditions'][1]->getName())->toEqual('Mother\'s Day Gift Pack');
});
test('can add item with multiple negative item conditions', function () {
+10 -10
View File
@@ -1,8 +1,8 @@
<?php
use Wearepixel\Cart\Cart;
use Wearepixel\Cart\Tests\Helpers\MockProduct;
use Wearepixel\Cart\Tests\Helpers\SessionMock;
use Joelwmale\Cart\Cart;
use Joelwmale\Cart\Tests\Helpers\MockProduct;
use Joelwmale\Cart\Tests\Helpers\SessionMock;
beforeEach(function () {
$events = Mockery::mock('Illuminate\Contracts\Events\Dispatcher');
@@ -149,7 +149,7 @@
$item = $this->cart->get(1);
expect($item->attributes)->toBeInstanceOf('Wearepixel\\Cart\\ItemAttributeCollection');
expect($item->attributes)->toBeInstanceOf('Joelwmale\\Cart\\ItemAttributeCollection');
// now lets update the item with its new attributes
// when we get that item from cart, it should still be an instance of ItemAttributeCollection
@@ -162,7 +162,7 @@
$this->cart->update(1, $updatedItem);
expect($item->attributes)->toBeInstanceOf('Wearepixel\\Cart\\ItemAttributeCollection');
expect($item->attributes)->toBeInstanceOf('Joelwmale\\Cart\\ItemAttributeCollection');
});
test('item orders are preserved by the order they are added', function () {
@@ -298,19 +298,19 @@
});
test('should throw an exception when no quantity is provided', function () {
$this->expectException('Wearepixel\Cart\Exceptions\InvalidItemException');
$this->expectException('Joelwmale\Cart\Exceptions\InvalidItemException');
$this->expectExceptionMessage('The quantity must be at least 0.1.');
$this->cart->add(455, 'Sample Item', 100.99, 0, []);
});
test('should throw an exception when no id is provided', function () {
$this->expectException('Wearepixel\Cart\Exceptions\InvalidItemException');
$this->expectException('Joelwmale\Cart\Exceptions\InvalidItemException');
$this->expectExceptionMessage('The id field is required.');
$this->cart->add('', 'Sample Item', 100.99, 2, []);
});
test('should throw an exception when no name is provided', function () {
$this->expectException('Wearepixel\Cart\Exceptions\InvalidItemException');
$this->expectException('Joelwmale\Cart\Exceptions\InvalidItemException');
$this->expectExceptionMessage('The name field is required.');
$this->cart->add(523, '', 100.99, 2, []);
});
@@ -646,7 +646,7 @@
expect($this->cart->getContent()->count())->toEqual(1, 'Cart should have 1 item on it');
expect($this->cart->getContent()->first()['id'])->toEqual(456, 'The first content must have ID of 456');
expect($this->cart->getContent()->first()['name'])->toEqual('Sample Item', 'The first content must have name of "Sample Item"');
expect($addedItem->model)->toBeInstanceOf('Wearepixel\Cart\Tests\Helpers\MockProduct');
expect($addedItem->model)->toBeInstanceOf('Joelwmale\Cart\Tests\Helpers\MockProduct');
});
test('cart can add items with multidimensional array with associated model', function () {
@@ -681,7 +681,7 @@
$content = $this->cart->getContent();
foreach ($content as $item) {
expect($item->model)->toBeInstanceOf('Wearepixel\Cart\Tests\Helpers\MockProduct');
expect($item->model)->toBeInstanceOf('Joelwmale\Cart\Tests\Helpers\MockProduct');
}
expect($this->cart->isEmpty())->toBeFalse('Cart should not be empty');
+2 -2
View File
@@ -1,7 +1,7 @@
<?php
use Wearepixel\Cart\Cart;
use Wearepixel\Cart\Tests\Helpers\SessionMock;
use Joelwmale\Cart\Cart;
use Joelwmale\Cart\Tests\Helpers\SessionMock;
beforeEach(function () {});
+2 -2
View File
@@ -1,7 +1,7 @@
<?php
use Wearepixel\Cart\Cart;
use Wearepixel\Cart\Tests\Helpers\SessionMock;
use Joelwmale\Cart\Cart;
use Joelwmale\Cart\Tests\Helpers\SessionMock;
beforeEach(function () {
$events = Mockery::mock('Illuminate\Contracts\Events\Dispatcher');
+6 -6
View File
@@ -1,9 +1,9 @@
<?php
use Wearepixel\Cart\Cart;
use Wearepixel\Cart\CartCondition;
use Wearepixel\Cart\Tests\Helpers\MockProduct;
use Wearepixel\Cart\Tests\Helpers\SessionMock;
use Joelwmale\Cart\Cart;
use Joelwmale\Cart\CartCondition;
use Joelwmale\Cart\Tests\Helpers\MockProduct;
use Joelwmale\Cart\Tests\Helpers\SessionMock;
beforeEach(function () {
$events = Mockery::mock('Illuminate\Contracts\Events\Dispatcher');
@@ -47,7 +47,7 @@
});
test('item get conditions with conditions', function () {
$itemCondition1 = new \Wearepixel\Cart\CartCondition([
$itemCondition1 = new \Joelwmale\Cart\CartCondition([
'name' => 'SALE 5%',
'type' => 'sale',
'target' => 'item',
@@ -77,7 +77,7 @@
});
test('it will throw an exception when a non existing model is being associated', function () {
$this->expectException(\Wearepixel\Cart\Exceptions\UnknownModelException::class);
$this->expectException(\Joelwmale\Cart\Exceptions\UnknownModelException::class);
$this->expectExceptionMessage('The supplied model SomeModel does not exist.');
$this->cart->add(1, 'Test item', 1, 10.00)->associate('SomeModel');
+2 -2
View File
@@ -1,7 +1,7 @@
<?php
use Wearepixel\Cart\Cart;
use Wearepixel\Cart\Tests\Helpers\SessionMock;
use Joelwmale\Cart\Cart;
use Joelwmale\Cart\Tests\Helpers\SessionMock;
beforeEach(function () {
$events = Mockery::mock('Illuminate\Contracts\Events\Dispatcher');