Skip to content
Code-Schnipsel Gruppen Projekte
Utils.php 4,61 KiB
Newer Older
Henning Leutz's avatar
Henning Leutz committed
<?php

/**
 * This file contains QUI\ERP\Discount\Utils
 */
Henning Leutz's avatar
Henning Leutz committed
namespace QUI\ERP\Discount;

use QUI\ERP\Products\Product\Product;
use QUI\Utils\UserGroups;
use QUI\Interfaces\Users\User as UserInterface;

use function array_filter;
use function array_merge;
use function str_replace;

Henning Leutz's avatar
Henning Leutz committed
/**
 * Class Utils
 *
 * @package QUI\ERP\Discount
 */
class Utils
{
    /**
     * Return all discounts which are usable by the user
     *
     * @param UserInterface $User
Henning Leutz's avatar
Henning Leutz committed
     * @return array
     *
     * @throws \QUI\Database\Exception
Henning Leutz's avatar
Henning Leutz committed
     */
    public static function getUserDiscounts(UserInterface $User): array
Henning Leutz's avatar
Henning Leutz committed
    {
        $guString = UserGroups::getUserGroupStringFromUser($User);
        $guString = ',' . str_replace(',', ',|,', $guString) . ',';
        $result = [];
Henning Leutz's avatar
Henning Leutz committed
        $Discounts = new Handler();

        $personalDiscounts = $Discounts->getChildren([
            'where' => [
                'user_groups' => [
                    'type' => 'REGEXP',
Henning Leutz's avatar
Henning Leutz committed
                    'value' => $guString
        $discounts = $Discounts->getChildren([
            'where' => [
Henning Leutz's avatar
Henning Leutz committed
                'user_groups' => ''
Henning Leutz's avatar
Henning Leutz committed


        if (!empty($personalDiscounts)) {
            $result = array_merge($personalDiscounts, $result);
Henning Leutz's avatar
Henning Leutz committed
        }

        if (!empty($discounts)) {
            $result = array_merge($discounts, $result);
Henning Leutz's avatar
Henning Leutz committed
        }

        return $result;
    }

    /**
     * Return all discounts which are usable with the product
     *
     * @param Product $Product
     * @return array
     *
     * @throws \QUI\Database\Exception
Henning Leutz's avatar
Henning Leutz committed
     */
    public static function getProductDiscounts(Product $Product): array
Henning Leutz's avatar
Henning Leutz committed
    {
        $result = [];
Henning Leutz's avatar
Henning Leutz committed
        $Discounts = new Handler();

        $productDiscounts = $Discounts->getChildren([
            'where' => [
                'user_groups' => [
                    'type' => 'REGEXP',
                    'value' => ',' . $Product->getId() . ','
        $discounts = $Discounts->getChildren([
            'where' => [
Henning Leutz's avatar
Henning Leutz committed
                'user_groups' => ''
Henning Leutz's avatar
Henning Leutz committed


        if (!empty($productDiscounts)) {
            $result = array_merge($productDiscounts, $result);
Henning Leutz's avatar
Henning Leutz committed
        }

        if (!empty($discounts)) {
            $result = array_merge($discounts, $result);
Henning Leutz's avatar
Henning Leutz committed
        }

        return $result;
    }

    /**
     * Return all active discounts which are usable by the user
     *
     * @param UserInterface $User
Henning Leutz's avatar
Henning Leutz committed
     * @return array
     *
     * @throws \QUI\Database\Exception
Henning Leutz's avatar
Henning Leutz committed
     */
    public static function getActiveUserDiscounts(UserInterface $User): array
Henning Leutz's avatar
Henning Leutz committed
    {
        $guString = UserGroups::getUserGroupStringFromUser($User);
        $guString = ',' . str_replace(',', ',|,', $guString) . ',';
        $result = [];
Henning Leutz's avatar
Henning Leutz committed
        $Discounts = new Handler();

        $personalDiscounts = $Discounts->getChildren([
            'where' => [
                'active' => 1,
                'user_groups' => [
                    'type' => 'REGEXP',
Henning Leutz's avatar
Henning Leutz committed
                    'value' => $guString
        $discounts = $Discounts->getChildren([
            'where' => [
                'active' => 1,
Henning Leutz's avatar
Henning Leutz committed
                'user_groups' => ''
        $discountsNULL = $Discounts->getChildren([
            'where' => [
                'active' => 1,
                'user_groups' => null
            ]
        ]);

        $discounts = array_merge($discounts, $discountsNULL);
Henning Leutz's avatar
Henning Leutz committed

        if (!empty($personalDiscounts)) {
            $result = array_merge($personalDiscounts, $result);
Henning Leutz's avatar
Henning Leutz committed
        }

        if (!empty($discounts)) {
            $result = array_merge($discounts, $result);
        $alreadyAttached = [];

        return array_filter($result, function ($Discount) use (&$alreadyAttached) {
            /* @var $Discount Discount */
            $id = $Discount->getId();

            if (isset($alreadyAttached[$id])) {
                return false;
            }

            $alreadyAttached[$id] = true;

            return true;
        });
Henning Leutz's avatar
Henning Leutz committed
    }

    /**
     * Return all active and usable discounts which are usable by the user
     *
     * @param UserInterface $User
Henning Leutz's avatar
Henning Leutz committed
     * @return array
     *
     * @throws \QUI\Database\Exception
Henning Leutz's avatar
Henning Leutz committed
     */
    public static function getUsableUserDiscounts(UserInterface $User): array
Henning Leutz's avatar
Henning Leutz committed
    {
        $discounts = self::getActiveUserDiscounts($User);
        $result = [];
Henning Leutz's avatar
Henning Leutz committed

        /* @var $Discount Discount */
        foreach ($discounts as $Discount) {
            if ($Discount->canUsedBy($User)) {
                $result[] = $Discount;
            }
        }

        return $result;
    }
}