JEMBOT MAWOT Bypass Shell

Current Path : /home/cinepatreb/billetterie/modules/mollie/src/Utility/
Upload File :
Current File : /home/cinepatreb/billetterie/modules/mollie/src/Utility/NumberUtility.php

<?php
/**
 * Mollie       https://www.mollie.nl
 *
 * @author      Mollie B.V. <info@mollie.nl>
 * @copyright   Mollie B.V.
 * @license     https://github.com/mollie/PrestaShop/blob/master/LICENSE.md
 *
 * @see        https://github.com/mollie/PrestaShop
 * @codingStandardsIgnoreStart
 */

namespace Mollie\Utility;

use PrestaShop\Decimal\DecimalNumber;
use PrestaShop\Decimal\Number;
use PrestaShop\Decimal\Operation\Rounding;

if (!defined('_PS_VERSION_')) {
    exit;
}

class NumberUtility
{
    public const DECIMAL_PRECISION = 2;
    public const FLOAT_PRECISION = 6;
    private const ROUNDING = Rounding::ROUND_HALF_UP;

    // TODO make all methods consistent: either pass string/float as parameter or cast members to Number/DecimalNumber class beforehand.

    public static function toPrecision(
        float $number,
        int $precision = self::DECIMAL_PRECISION,
        string $roundingMode = self::ROUNDING
    ): float {
        $decimalNumber = self::getNumber($number);

        return (float) $decimalNumber->toPrecision($precision, $roundingMode);
    }

    /**
     * Decreases number by its given percentage
     * E.g 75/1.5 = 50.
     *
     * @param float $number
     * @param float $percentage
     *
     * @return float
     *
     * @throws \PrestaShop\Decimal\Exception\DivisionByZeroException
     */
    public static function decreaseByPercentage($number, $percentage)
    {
        if (!$percentage || $percentage <= 0) {
            return $number;
        }
        $numberTransformed = self::getNumber($number);
        $totalDecrease = self::toPercentageIncrease($percentage);
        $decrement = (string) $numberTransformed->dividedBy(self::getNumber($totalDecrease));

        return (float) $decrement;
    }

    public static function increaseByPercentage($number, $percentage)
    {
        if (!$percentage || $percentage <= 0) {
            return $number;
        }
        $numberTransformed = self::getNumber($number);
        $percentageIncrease = self::toPercentageIncrease($percentage);
        $percentageIncreaseTransformed = self::getNumber($percentageIncrease);
        $result = (string) $numberTransformed->times($percentageIncreaseTransformed);

        return (float) $result;
    }

    /**
     * E.g 21% will become 1.21.
     *
     * @param float $percentage
     *
     * @return float
     */
    public static function toPercentageIncrease($percentage)
    {
        $percentageNumber = self::getNumber($percentage);
        $smallerNumber = $percentageNumber->dividedBy(self::getNumber(100));
        $result = (string) $smallerNumber->plus(self::getNumber(1));

        return (float) $result;
    }

    public static function times(
        float $target,
        float $factor,
        int $precision = self::FLOAT_PRECISION,
        string $roundingMode = self::ROUNDING
    ): float {
        $firstNumber = self::getNumber($target);
        $secondNumber = self::getNumber($factor);

        $result = $firstNumber->times($secondNumber);

        return (float) $result->toPrecision($precision, $roundingMode);
    }

    public static function divide(
        float $target,
        float $divisor,
        int $precision = self::FLOAT_PRECISION,
        string $roundingMode = self::ROUNDING
    ): float {
        $firstNumber = self::getNumber($target);
        $secondNumber = self::getNumber($divisor);

        $result = $firstNumber->dividedBy($secondNumber, $precision);

        return (float) $result->toPrecision($precision, $roundingMode);
    }

    public static function isEqual(float $a, float $b): bool
    {
        $firstNumber = self::getNumber($a);
        $secondNumber = self::getNumber($b);

        return $firstNumber->equals($secondNumber);
    }

    public static function isLowerThan($a, $b)
    {
        $firstNumber = self::getNumber($a);
        $secondNumber = self::getNumber($b);

        return $firstNumber->isLowerThan($secondNumber);
    }

    public static function isLowerOrEqualThan($a, $b)
    {
        $firstNumber = self::getNumber($a);
        $secondNumber = self::getNumber($b);

        return $firstNumber->isLowerOrEqualThan($secondNumber);
    }

    public static function isGreaterThan(float $target, float $comparison): bool
    {
        $firstNumber = self::getNumber($target);
        $secondNumber = self::getNumber($comparison);

        return $firstNumber->isGreaterThan($secondNumber);
    }

    public static function minus($a, $b)
    {
        $firstNumber = self::getNumber($a);
        $secondNumber = self::getNumber($b);

        return (float) ((string) $firstNumber->minus($secondNumber));
    }

    public static function plus($a, $b)
    {
        $firstNumber = self::getNumber($a);
        $secondNumber = self::getNumber($b);

        return (float) ((string) $firstNumber->plus($secondNumber));
    }

    /**
     * @return Number|DecimalNumber
     */
    private static function getNumber(float $number)
    {
        if (is_subclass_of(Number::class, DecimalNumber::class)) {
            return new DecimalNumber((string) $number);
        }

        return new Number((string) $number);
    }
}

xxxxx1.0, XXX xxxx