feat: additional custom discount applied to total price
This commit is contained in:
@@ -37,14 +37,17 @@ class AccommodationBookingBreakdownCalculator
|
||||
*
|
||||
* @param array<string, mixed> $breakdown
|
||||
*
|
||||
* @return array<string, mixed> the breakdown plus `discounts` and `discountedTotal`
|
||||
* @return array<string, mixed> the breakdown plus `discounts`, `discountSubtotal`,
|
||||
* `totalDiscountDetails` and `discountedTotal`
|
||||
*/
|
||||
public function withDiscounts(AccommodationBooking $booking, array $breakdown): array
|
||||
{
|
||||
// The labels carry their own "Rabatt" prefix so that every row renders as plain
|
||||
// {label} {percent} %, including the freely named discount on the total below.
|
||||
$buckets = [
|
||||
['Unterkunft', $booking->getAccommodationDiscount(), (int) ($breakdown['basePrice'] ?? 0) + (int) ($breakdown['additionalPersonsPrice'] ?? 0)],
|
||||
['Verpflegung', $booking->getBoardServiceDiscount(), (int) ($breakdown['boardPrice'] ?? 0)],
|
||||
['Zusatzleistungen', $booking->getAdditionalServicesDiscount(), (int) ($breakdown['servicesPrice'] ?? 0)],
|
||||
['Rabatt Unterkunft', $booking->getAccommodationDiscount(), (int) ($breakdown['basePrice'] ?? 0) + (int) ($breakdown['additionalPersonsPrice'] ?? 0)],
|
||||
['Rabatt Verpflegung', $booking->getBoardServiceDiscount(), (int) ($breakdown['boardPrice'] ?? 0)],
|
||||
['Rabatt Zusatzleistungen', $booking->getAdditionalServicesDiscount(), (int) ($breakdown['servicesPrice'] ?? 0)],
|
||||
];
|
||||
|
||||
$discounts = [];
|
||||
@@ -63,10 +66,26 @@ class AccommodationBookingBreakdownCalculator
|
||||
$discounts[] = ['label' => $label, 'percent' => $percent, 'amount' => $amount];
|
||||
}
|
||||
|
||||
$breakdown['discounts'] = $discounts;
|
||||
// Deliberately not $booking->getTotalPrice(): refreshPriceSnapshot() calls this while
|
||||
// computing the new total, where the stored one is still the outdated value.
|
||||
$breakdown['discountedTotal'] = (int) ($breakdown['total'] ?? 0) - $discountSum;
|
||||
$subtotal = (int) ($breakdown['total'] ?? 0) - $discountSum;
|
||||
|
||||
// Compounds on the already-reduced subtotal rather than on the gross total: the discount
|
||||
// is granted on what the customer would otherwise pay, not on a figure no longer asked.
|
||||
$totalDiscountAmount = self::discountAmount($subtotal, $booking->getTotalDiscount());
|
||||
|
||||
$breakdown['discounts'] = $discounts;
|
||||
$breakdown['totalDiscountDetails'] = 0 !== $totalDiscountAmount
|
||||
? [
|
||||
'label' => (string) $booking->getTotalDiscountLabel(),
|
||||
'percent' => $booking->getTotalDiscount(),
|
||||
'amount' => $totalDiscountAmount,
|
||||
]
|
||||
: null;
|
||||
// Only worth a row when it sits between two sets of discounts — with no section discount
|
||||
// above it, a subtotal would merely restate the total one line up.
|
||||
$breakdown['discountSubtotal'] = 0 !== $totalDiscountAmount && [] !== $discounts ? $subtotal : null;
|
||||
$breakdown['discountedTotal'] = $subtotal - $totalDiscountAmount;
|
||||
|
||||
return $breakdown;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user