Skip to content
Code-Schnipsel Gruppen Projekte
User.php 10 KiB
Newer Older
  • Learn to ignore specific revisions
  • <?php
    
    /**
     * This file contains QUI\ERP\Utils\User
     */
    
    namespace QUI\ERP\Utils;
    
    use QUI;
    use QUI\Interfaces\Users\User as UserInterface;
    
    use QUI\Users\Address;
    
    Henning Leutz's avatar
    Henning Leutz committed
    use function array_flip;
    use function class_exists;
    use function is_array;
    use function is_numeric;
    use function is_object;
    
    
    /**
     * Class User Utils
     *
     * @package QUI\ERP\Utils
     * @author www.pcsg.de (Henning Leutz)
     */
    class User
    {
        /**
         * netto flag
         */
        const IS_NETTO_USER = 1;
    
        /**
         * brutto flag
         */
        const IS_BRUTTO_USER = 2;
    
    
        /**
         * Runtime cache for user brutt/netto status
         *
         * @var array
         */
    
    Henning Leutz's avatar
    Henning Leutz committed
        protected static array $userBruttoNettoStatus = [];
    
        /**
         * Return the brutto netto status
         * is the user a netto or brutto user
         *
         * @param UserInterface $User
    
        public static function getBruttoNettoUserStatus(UserInterface $User): int
    
            if ($User->getAttribute('RUNTIME_NETTO_BRUTTO_STATUS')) {
                return $User->getAttribute('RUNTIME_NETTO_BRUTTO_STATUS');
            }
    
    
            if ($User instanceof QUI\Users\Nobody) {
                $status = QUI::getSession()->get('quiqqer.erp.b2b.status');
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                if (is_numeric($status)) {
    
    Henning Leutz's avatar
    Henning Leutz committed
            $uid = $User->getUUID();
    
    
            if (isset(self::$userBruttoNettoStatus[$uid])) {
                return self::$userBruttoNettoStatus[$uid];
            }
    
            try {
                $Package = QUI::getPackage('quiqqer/erp');
                $Config = $Package->getConfig();
    
                if ($Config->getValue('general', 'businessType') === 'B2B') {
                    self::$userBruttoNettoStatus[$uid] = QUI\ERP\Utils\User::IS_NETTO_USER;
                    return self::$userBruttoNettoStatus[$uid];
                }
    
            if (QUI::getUsers()->isSystemUser($User)) {
    
                self::$userBruttoNettoStatus[$uid] = self::IS_NETTO_USER;
    
                return self::$userBruttoNettoStatus[$uid];
    
            if ($User instanceof QUI\ERP\User && $User->hasBruttoNettoStatus()) {
    
                if ($User->isNetto()) {
                    self::$userBruttoNettoStatus[$uid] = self::IS_NETTO_USER;
                } else {
                    self::$userBruttoNettoStatus[$uid] = self::IS_BRUTTO_USER;
                }
    
                return self::$userBruttoNettoStatus[$uid];
    
            $nettoStatus = $User->getAttribute('quiqqer.erp.isNettoUser');
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            if (is_numeric($nettoStatus)) {
    
                $nettoStatus = (int)$nettoStatus;
            }
    
            switch ($nettoStatus) {
                case self::IS_NETTO_USER:
                case self::IS_BRUTTO_USER:
    
                    self::$userBruttoNettoStatus[$uid] = $nettoStatus;
    
                    return self::$userBruttoNettoStatus[$uid];
    
            $euVatId = $User->getAttribute('quiqqer.erp.euVatId');
    
            $taxId = $User->getAttribute('quiqqer.erp.taxId');
    
    
            if (!empty($euVatId) || !empty($taxId)) {
    
                self::$userBruttoNettoStatus[$uid] = self::IS_NETTO_USER;
    
                return self::$userBruttoNettoStatus[$uid];
    
                self::$userBruttoNettoStatus[$uid] = self::IS_BRUTTO_USER;
    
                return self::$userBruttoNettoStatus[$uid];
    
            try {
                $Config = $Package->getConfig();
            } catch (QUI\Exception $Exception) {
                QUI\System\Log::writeDebugException($Exception);
    
    
                self::$userBruttoNettoStatus[$uid] = self::IS_NETTO_USER;
    
                return self::$userBruttoNettoStatus[$uid];
    
            // Verifizierung als Unternehmen einbauen
    
            try {
                $Address = self::getUserERPAddress($User);
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                if (is_object($Address) && $Address) {
    
                    $company = $Address->getAttribute('company');
    
                    if (!empty($company)) {
                        if ($Config->getValue('shop', 'companyForceBruttoPrice')) {
                            self::$userBruttoNettoStatus[$uid] = self::IS_BRUTTO_USER;
    
                            return self::$userBruttoNettoStatus[$uid];
                        }
    
                        self::$userBruttoNettoStatus[$uid] = self::IS_NETTO_USER;
    
                        return self::$userBruttoNettoStatus[$uid];
                    }
    
                if (
                    is_array($Address)
    
                    && isset($Address['company'])
                    && $Address['company'] == 1
                ) {
                    if ($Config->getValue('shop', 'companyForceBruttoPrice')) {
    
                        self::$userBruttoNettoStatus[$uid] = self::IS_BRUTTO_USER;
    
                        return self::$userBruttoNettoStatus[$uid];
    
                    self::$userBruttoNettoStatus[$uid] = self::IS_NETTO_USER;
    
                    return self::$userBruttoNettoStatus[$uid];
    
            // @todo es gibt neue einstellungen b2b, b2c b2bANDb2c ... von diesen einstellungen ausgehen
            // @todo tax ist nicht optimal dafür
    
    
            $isNetto = $Config->getValue('shop', 'isNetto');
    
            if ($isNetto) {
    
                self::$userBruttoNettoStatus[$uid] = self::IS_NETTO_USER;
    
                return self::$userBruttoNettoStatus[$uid];
    
            }
    
    
            try {
                $Tax = QUI\ERP\Tax\Utils::getTaxByUser($User);
    
                if ($Tax->getValue() == 0) {
    
                    self::$userBruttoNettoStatus[$uid] = self::IS_NETTO_USER;
    
                    return self::$userBruttoNettoStatus[$uid];
    
                self::$userBruttoNettoStatus[$uid] = self::IS_NETTO_USER;
    
                return self::$userBruttoNettoStatus[$uid];
    
            self::$userBruttoNettoStatus[$uid] = self::IS_BRUTTO_USER;
    
            return self::$userBruttoNettoStatus[$uid];
    
        }
    
        /**
         * Is the user a netto user?
         *
         * @param UserInterface $User
         * @return bool
         */
    
        public static function isNettoUser(UserInterface $User): bool
    
        {
            return self::getBruttoNettoUserStatus($User) === self::IS_NETTO_USER;
        }
    
        /**
         * Return the area of the user
         * if user is in no area, the default one of the shop would be used
         *
         * @param UserInterface $User
         * @return bool|QUI\ERP\Areas\Area
    
    Henning Leutz's avatar
    Henning Leutz committed
         * @throws QUI\Exception
    
        public static function getUserArea(UserInterface $User): bool|QUI\ERP\Areas\Area
    
            $CurrentAddress = $User->getAttribute('CurrentAddress');
    
            if ($CurrentAddress instanceof Address) {
    
                try {
                    $Country = $CurrentAddress->getCountry();
    
                    $Area = QUI\ERP\Areas\Utils::getAreaByCountry($Country);
    
                    if ($Area) {
                        return $Area;
                    }
                } catch (QUI\Exception $Exception) {
                    QUI\System\Log::addDebug($Exception->getMessage());
    
                }
            }
    
            try {
                $addressId = $User->getAttribute('quiqqer.erp.address');
    
                $Address = $User->getAddress($addressId);
                $Country = $Address->getCountry();
                $Area = QUI\ERP\Areas\Utils::getAreaByCountry($Country);
    
    
                if ($Area) {
                    return $Area;
                }
            } catch (QUI\Exception $Exception) {
                QUI\System\Log::addDebug($Exception->getMessage());
            }
    
    
    
            $Country = $User->getCountry();
    
            $Area = QUI\ERP\Areas\Utils::getAreaByCountry($Country);
    
    
            if ($Area) {
                return $Area;
            }
    
            return QUI\ERP\Defaults::getArea();
        }
    
        /**
         * Return the user ERP address (Rechnungsaddresse, Accounting Address)
         *
         * @param UserInterface $User
         * @return false|QUI\Users\Address
         * @throws QUI\Exception
         */
    
        public static function getUserERPAddress(UserInterface $User): null|Address
    
        {
            if (!QUI::getUsers()->isUser($User)) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                throw new QUI\Exception([
    
    Henning Leutz's avatar
    Henning Leutz committed
                ]);
    
            }
    
            /* @var $User QUI\Users\User */
            if (!$User->getAttribute('quiqqer.erp.address')) {
                return $User->getStandardAddress();
            }
    
            $erpAddress = $User->getAttribute('quiqqer.erp.address');
    
            try {
                return $User->getAddress($erpAddress);
    
            }
    
            return $User->getStandardAddress();
        }
    
        /**
         * Return the area of the shop
         *
         * @return QUI\ERP\Areas\Area
         * @throws QUI\Exception
         * @deprecated use QUI\ERP\Defaults::getShopArea()
         */
    
        public static function getShopArea(): QUI\ERP\Areas\Area
    
        {
            return QUI\ERP\Defaults::getArea();
        }
    
    Henning Leutz's avatar
    Henning Leutz committed
    
        /**
         * Filter unwanted user attributes
         * Therefore we can use the attributes in the ERP stack
         *
    
    Henning Leutz's avatar
    Henning Leutz committed
         * @return array
         */
    
        public static function filterCustomerAttributes(array $attributes = []): array
    
    Henning Leutz's avatar
    Henning Leutz committed
        {
            $needle = [
                'uuid',
                'id',
                'email',
                'lang',
                'usergroup',
                'username',
                'active',
                'regdate',
                'lastvisit',
                'lastedit',
    
                'address',
    
    Henning Leutz's avatar
    Henning Leutz committed
    
                'firstname',
                'lastname',
                'usertitle',
                'company',
                'birthday',
                'avatar',
    
                'quiqqer.erp.euVatId',
                'quiqqer.erp.taxId',
                'quiqqer.erp.address',
                'quiqqer.erp.isNettoUser'
            ];
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            $needle = array_flip($needle);
    
    Henning Leutz's avatar
    Henning Leutz committed
            $result = [];
    
            foreach ($attributes as $key => $value) {
                if (isset($needle[$key])) {
                    $result[$key] = $value;
                }
            }
    
            return $result;
        }
    
    
        /**
         * @param UserInterface $User
         * @param $Address
         */
        public static function setUserCurrentAddress(
            QUI\Interfaces\Users\User $User,
            $Address
        ) {
    
    Henning Leutz's avatar
    Henning Leutz committed
            if (class_exists('QUI\ERP\Tax\Utils')) {
    
                QUI\ERP\Tax\Utils::cleanUpUserTaxCache($User);
            }
    
            $User->setAttribute('CurrentAddress', $Address);
        }