*/ /** * Klasa pomocnicza dodająca podstawowe operacje na cenach * * @package stCurrencyPlugin * @subpackage libs */ class stPrice { const PRICE_MARGIN_AMOUNT = 'A'; const PRICE_MARGIN_PERCENT = '%'; public static function getPriceMarginTypes() { return array( self::PRICE_MARGIN_AMOUNT => stCurrency::getDefault()->getShortcut(), self::PRICE_MARGIN_PERCENT => '%', ); } /** * * Oblicza cenę uwzgledniając podatek * * @param float $price Cena bez podatku * @param float $tax Podatek * @return float Cena z podatkiem */ public static function calculate($price, $tax) { return self::round($price * (1 + $tax * 0.01)); } /** * * Wyciąga cenę bez podatku * * @param float $price Cena z podatkiem * @param float $tax Podatek * @return float Cena bez podatku */ public static function extract($price_brutto, $tax) { return self::round($price_brutto / (1 + $tax * 0.01)); } /** * Zwraca cenę + marża * @param string $price Cena * @param string $margin Marża wyrażona w procentach lub kwocie * @param string $type Rodzaj marży proceny/kwota * @return string Cena + marża */ public static function applyPriceMargin($price, $margin, $type = self::PRICE_MARGIN_PERCENT) { if ($margin > 0) { $price = self::PRICE_MARGIN_PERCENT === $type ? stPrice::calculate($price, $margin) : $price + $margin; } return $price; } /** * * Zaokrągla cene * * @param float $price Cena * @return float Cena zaokrąglona */ public static function round($price, $precision = 2) { return number_format($price, $precision, '.', ''); } public static function applyDiscount($price, $discount) { return stPrice::round($price * (1 - $discount * 0.01)); } public static function discountValue($price, $discount) { return stPrice::round($price * ($discount * 0.01)); } public static function percentValue($price, $percent) { return self::discountValue($price, $percent); } public static function percentFromValue($value, $discount) { return $discount >= $value ? 100 : stPrice::round($discount * 100 / $value, 1); } public static function createPriceModifier($value, $type, $prefix, $level = 1, $custom = array()) { return array('value' => $value, 'type' => $type, 'level' => $level, 'prefix' => $prefix, 'custom' => $custom); } /** * Oblicza cene produktu na podstawie ustawionych modyfikatorów * * @param Product $product * @param string $base_price Cena bazowa * @param string $price_type Typ ceny * @param boolean $with_currency * @return string */ public static function computePriceModifiers($product, $base_price, $price_type = 'netto', $with_currency = false) { $currency = $product->getGlobalCurrency(); $has_local_currency = $product->hasLocalCurrency(); if ($with_currency && $has_local_currency) { $price_type = 'currency_'.$price_type; } foreach ($product->getPriceModifiers() as $price_modifier) { if ($price_modifier['type'] === null) continue; $prefix = $price_modifier['prefix']; $value = $price_modifier['value']; if ($price_modifier['type'] == 'percent') { $price = stPrice::percentValue($base_price, $value); } else { $price = $value[$price_type]; // if ($price_type == 'brutto') // { // $countryTaxRate = $product->getTax()->getTaxRateByCountry(); // if ($countryTaxRate) // { // $price = stPrice::calculate($value['netto'], $countryTaxRate); // } // } if ($with_currency && !$has_local_currency) { $price = $currency->exchange($price); } } if ($prefix) { $base_price += $prefix.$price; } else { $base_price = $price; } } return stPrice::round($base_price >= 0 ? $base_price : 0.00); } /** * Poprawia formatowanie ceny. Usuwa wszelkie dodatkowe spacje i zamienia przecinek na kropkę * * @param string $price * @return string */ public static function fix($price) { return strtr($price, [',' => '.', ' ' => '']); } }