ldc-boutique-cnc/app/Lib/LDC/CartCalculator.php
2023-05-23 19:08:52 +02:00

91 lines
3.9 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|float
* @throws \RuntimeException In DiscountType is unhandled.
* @phpcs:disable Generic.Metrics.CyclomaticComplexity.TooHigh
*/
public static function getAttribute(string $attribute, CartItem $cartItem)
{
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':
// * Arrondi au plus proche.
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 +
// * Arrondi au plus proche.
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':
// * Arrondi au plus proche.
return round($cartItem->discounted * $cartItem->taxRate * $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
}
}