41 lines
1.3 KiB
PHP
41 lines
1.3 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
class DiscountEngine
|
|
{
|
|
/**
|
|
* Tính tổng chiết khấu và giá trị sau chiết khấu.
|
|
*
|
|
* @param float $totalValue Giá trị gốc
|
|
* @param array|null $discountDetails Dữ liệu chiết khấu từ contract
|
|
* @return array ['discount_amount' => float, 'final_value' => float]
|
|
*/
|
|
public static function calculate(float $totalValue, ?array $discountDetails): array
|
|
{
|
|
if (empty($discountDetails)) {
|
|
return [
|
|
'discount_amount' => 0,
|
|
'final_value' => $totalValue,
|
|
];
|
|
}
|
|
|
|
$discountAmount = 0;
|
|
|
|
// Ưu tiên total_amount nếu có
|
|
if (! empty($discountDetails['total_amount'])) {
|
|
$discountAmount = (float) $discountDetails['total_amount'];
|
|
} elseif (! empty($discountDetails['total_percentage'])) {
|
|
$discountAmount = $totalValue * ((float) $discountDetails['total_percentage'] / 100);
|
|
}
|
|
|
|
// Đảm bảo chiết khấu không vượt quá giá trị hợp đồng
|
|
$discountAmount = min($discountAmount, $totalValue);
|
|
|
|
return [
|
|
'discount_amount' => $discountAmount,
|
|
'final_value' => $totalValue - $discountAmount,
|
|
];
|
|
}
|
|
}
|