Skip to content

Commit

Permalink
Fix an issue where the AmountOff percentage is cast to an int, even t… (
Browse files Browse the repository at this point in the history
#2004)

The admin panel allows you to enter a decimal value when creating an
AmountOff Discount with a percentage discount. However, it gets cast to
an int in the AmountOff class, which results in the percentage being
rounded and the discount amount being slightly off.

You could argue that usually percentage discounts are given as whole
numbers, but since the admin panel already supports decimal values, I
think this should be changed.

Fixes #2003

---------

Co-authored-by: tim <tim@direct-effect.nl>
Co-authored-by: Author <actions@github.com>
Co-authored-by: Alec Ritson <hello@itsalec.co.uk>
  • Loading branch information
4 people authored Nov 5, 2024
1 parent e97122e commit 0b2d76e
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 12 deletions.
2 changes: 1 addition & 1 deletion packages/core/src/DiscountTypes/AmountOff.php
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ protected function getEligibleLines(Cart $cart): \Illuminate\Support\Collection
/**
* Apply the percentage to the cart line.
*/
private function applyPercentage(int $value, Cart $cart): Cart
private function applyPercentage(float $value, Cart $cart): Cart
{
$lines = $this->getEligibleLines($cart);

Expand Down
35 changes: 24 additions & 11 deletions tests/core/Unit/DiscountTypes/AmountOffTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -784,7 +784,16 @@
expect($lastLine->discountTotal->value)->toEqual(333);
});

test('can apply percentage discount', function () {
test('can apply percentage discount', function (
string $coupon,
float $percentage,
int $discountTotalForOne,
int $taxTotalForOne,
int $totalForOne,
int $discountTotalForTwo,
int $taxTotalForTwo,
int $totalForTwo
) {
$customerGroup = CustomerGroup::getDefault();

$channel = Channel::getDefault();
Expand All @@ -794,7 +803,7 @@
$cart = Cart::factory()->create([
'channel_id' => $channel->id,
'currency_id' => $currency->id,
'coupon_code' => '10PERCENTOFF',
'coupon_code' => $coupon,
]);

$purchasable = ProductVariant::factory()->create();
Expand All @@ -816,9 +825,9 @@
$discount = Discount::factory()->create([
'type' => AmountOff::class,
'name' => 'Test Coupon',
'coupon' => '10PERCENTOFF',
'coupon' => $coupon,
'data' => [
'percentage' => 10,
'percentage' => $percentage,
'fixed_value' => false,
],
]);
Expand All @@ -843,9 +852,9 @@

$cart = $cart->calculate();

expect($cart->discountTotal->value)->toEqual(100);
expect($cart->taxTotal->value)->toEqual(180);
expect($cart->total->value)->toEqual(1080);
expect($cart->discountTotal->value)->toEqual($discountTotalForOne);
expect($cart->taxTotal->value)->toEqual($taxTotalForOne);
expect($cart->total->value)->toEqual($totalForOne);

$cart->lines()->delete();

Expand All @@ -857,10 +866,14 @@

$cart = $cart->refresh()->calculate();

expect($cart->discountTotal->value)->toEqual(200);
expect($cart->taxTotal->value)->toEqual(360);
expect($cart->total->value)->toEqual(2160);
});
expect($cart->discountTotal->value)->toEqual($discountTotalForTwo);
expect($cart->taxTotal->value)->toEqual($taxTotalForTwo);
expect($cart->total->value)->toEqual($totalForTwo);
})->with([
'10% Discount' => ['10PERCENTOFF', 10, 100, 180, 1080, 200, 360, 2160],
'10.25% Discount' => ['10PT25PERCENTOFF', 10.25, 103, 179, 1076, 205, 359, 2154],
'10.5% Discount' => ['10PT5PERCENTOFF', 10.5, 105, 179, 1074, 210, 358, 2148],
]);

test('can only same discount to line once', function () {
$customerGroup = CustomerGroup::getDefault();
Expand Down

0 comments on commit 0b2d76e

Please sign in to comment.