87 lines
3.7 KiB
PHP
87 lines
3.7 KiB
PHP
<?php
|
|
|
|
namespace App\Lib\LDC;
|
|
|
|
use App\Enums\Discount\DiscountType;
|
|
use Gloudemans\Shoppingcart\CartItem;
|
|
use Gloudemans\Shoppingcart\Contracts\Calculator;
|
|
|
|
class CartCalculator implements Calculator
|
|
{
|
|
/**
|
|
* Methode de calcul du panier
|
|
*
|
|
* * Calcul par unité de produit
|
|
* https://blog.clever-age.com/fr/2022/04/28/tva%E2%80%AF-comment-bien-lappliquer-sur-un-site-e-commerce-ou-une-marketplace-en-europe%E2%80%AF/
|
|
*
|
|
* Les taux de TVA sont arrondis au centimes supérieurs.
|
|
*
|
|
* @param string $attribute
|
|
* @param \Gloudemans\Shoppingcart\CartItem $cartItem
|
|
* @return integer
|
|
* @throws \RuntimeException In DiscountType is unhandled.
|
|
* @phpcs:disable Generic.Metrics.CyclomaticComplexity.TooHigh
|
|
*/
|
|
public static function getAttribute(string $attribute, CartItem $cartItem): int
|
|
{
|
|
switch ($attribute) {
|
|
// ----- PRIX UNITAIRE -----
|
|
// * La remise HT sur un produit
|
|
case 'discount':
|
|
switch ($cartItem->options->discount_type) {
|
|
// * Remise en numeraire sur un produit
|
|
case DiscountType::amount()->value:
|
|
$value = $cartItem->price - ($cartItem->price - $cartItem->getDiscountRate());
|
|
return intval(max($value, 0));
|
|
// * Remise en pourcentage
|
|
case DiscountType::percent()->value:
|
|
return round($cartItem->price * $cartItem->getDiscountRate(), 0, PHP_ROUND_HALF_DOWN);
|
|
// * Pas de remise
|
|
case null:
|
|
return 0;
|
|
default:
|
|
throw new \RuntimeException(
|
|
"Unhandled discount type {$cartItem->options->discount_type}"
|
|
);
|
|
}
|
|
// * Le prix du produit remisé (min 0) HT
|
|
case 'discounted':
|
|
return max($cartItem->price - $cartItem->discount, 0);
|
|
// * La taxe d'un produit seulement (Avec la remise)
|
|
// * - (prix HT - Remise) * taxe (taxe en ratio)
|
|
case 'tax':
|
|
return round($cartItem->discounted * $cartItem->taxRate);
|
|
// * Le prix du produit avec la taxe (Avec la remise) prix TTC
|
|
// * - (prix HT - Remise) + tax => prix d'un produit TTC
|
|
case 'discountTax':
|
|
case 'priceTax':
|
|
return $cartItem->discounted + $cartItem->tax;
|
|
|
|
// * Prix en considérant aucune remise (pour affichage).
|
|
case 'undiscounted_price_ttc':
|
|
return $cartItem->price + round($cartItem->price * $cartItem->taxRate);
|
|
|
|
// ----- PRIX DU LOT DE PRODUIT -----
|
|
// * Le prix HT par la quantitée
|
|
case 'priceTotal':
|
|
return $cartItem->discounted * $cartItem->qty;
|
|
// * La remise totale HT par la quantité
|
|
case 'discountTotal':
|
|
return $cartItem->discount * $cartItem->qty;
|
|
|
|
// * Total des taxes
|
|
// ! requis par \Gloudemans\Shoppingcart\CartItem
|
|
case 'taxTotal':
|
|
return $cartItem->tax * $cartItem->qty;
|
|
// * Le prix du produit TCC par la quantité
|
|
// ! requis par \Gloudemans\Shoppingcart\CartItem
|
|
case 'subtotal':
|
|
return $cartItem->priceTax * $cartItem->qty;
|
|
// * Alias of subtotal, Calcul par unité de produits
|
|
case 'total':
|
|
return $cartItem->subtotal;
|
|
default:
|
|
throw new \RuntimeException("Unhandled attribute '{$attribute}'");
|
|
} //end switch
|
|
}
|
|
}
|