Skip to content
Code-Schnipsel Gruppen Projekte
ArticleList.php 9,41 KiB
Newer Older
  • Learn to ignore specific revisions
  • <?php
    
    /**
     * This file contains QUI\ERP\Accounting\ArticleList
     */
    
    namespace QUI\ERP\Accounting;
    
    
    /**
     * Class ArticleList
     *
     * @package QUI\ERP\Accounting
     */
    
    class ArticleList extends ArticleListUnique implements \IteratorAggregate
    
        /**
         * is the article list calculated?
         * @var bool
         */
        protected $calculated = false;
    
        /**
         * @var int|float|double
         */
        protected $sum;
    
        /**
         * @var QUI\Interfaces\Users\User
         */
        protected $User = null;
    
    
        /**
         * @var QUI\ERP\Currency\Currency
         */
        protected $Currency = null;
    
    
        /**
         * @var int|float|double
         */
        protected $subSum;
    
        /**
         * @var int|float|double
         */
        protected $nettoSum;
    
        /**
         * @var int|float|double
         */
        protected $nettoSubSum;
    
        /**
         * key 19% value[sum] = sum value[text] = text value[display_sum] formatiert
         * @var array
         */
    
        protected $vatArray = [];
    
    
        /**
         * key 19% value[sum] = sum value[text] = text value[display_sum] formatiert
         * @var array()
         */
        protected $vatText;
    
        /**
         * Prüfen ob EU Vat für den Benutzer in Frage kommt
         * @var
         */
        protected $isEuVat = false;
    
        /**
         * Wird Brutto oder Netto gerechnet
         * @var bool
         */
        protected $isNetto = true;
    
        /**
         * Currency information
         * @var array
         */
    
        protected $currencyData = [
    
            'currency_sign' => '',
            'currency_code' => '',
            'user_currency' => '',
            'currency_rate' => ''
    
    
        /**
         * ArticleList constructor.
    
    Henning Leutz's avatar
    Henning Leutz committed
         *
    
         * @param array $attributes
    
    Henning Leutz's avatar
    Henning Leutz committed
         * @throws QUI\ERP\Exception
    
        public function __construct(array $attributes = [])
    
        {
            if (!isset($attributes['calculations'])) {
    
                $attributes['calculations'] = [];
    
            }
    
            if (!isset($attributes['articles'])) {
    
                $attributes['articles'] = [];
            }
    
            if (!isset($attributes['priceFactors'])) {
                $attributes['priceFactors'] = [];
    
            }
    
            parent::__construct($attributes);
        }
    
        /**
         * Set the user for the list
         * User for calculation
         *
         * @param QUI\Interfaces\Users\User $User
         */
        public function setUser(QUI\Interfaces\Users\User $User)
        {
    
            $this->calculated = false;
            $this->User       = $User;
    
            foreach ($this->articles as $Article) {
                /* @var $Article Article */
                $Article->setUser($User);
            }
    
            $this->calc();
    
        }
    
        /**
         * Return the list user
         *
         * @return QUI\Interfaces\Users\User|QUI\Users\User
         */
        public function getUser()
        {
            return $this->User;
        }
    
    
        /**
         * Return the currency
         *
         * @return QUI\ERP\Currency\Currency
         */
        public function getCurrency()
        {
    
            if (!\is_null($this->Currency)) {
    
            if (\is_array($this->currencyData) && !empty($this->currencyData['currency_code'])) {
    
                try {
                    $this->Currency = QUI\ERP\Currency\Handler::getCurrency(
                        $this->currencyData['currency_code']
                    );
    
                    return $this->Currency;
                } catch (QUI\Exception $Exception) {
                }
            }
    
            return QUI\ERP\Defaults::getCurrency();
    
        }
    
        /**
         * Set the currency for the list
         *
         * @param QUI\ERP\Currency\Currency $Currency
         */
        public function setCurrency(QUI\ERP\Currency\Currency $Currency)
        {
    
            $this->Currency = $Currency;
    
    
            $this->currencyData = [
                'currency_sign' => $this->Currency->getSign(),
                'currency_code' => $this->Currency->getCode(),
                'user_currency' => '',
                'currency_rate' => $this->Currency->getExchangeRate()
            ];
    
            if (isset($this->calculations['currencyData'])) {
                $this->calculations['currencyData'] = [
                    'code' => $this->Currency->getCode(),
                    'sign' => $this->Currency->getSign(),
                    'rate' => $this->Currency->getExchangeRate()
                ];
            }
    
    
            if (\count($this->articles)) {
                foreach ($this->articles as $Article) {
                    $Article->setCurrency($Currency);
                }
            }
    
        }
    
        /**
         * Return the list as an array
         *
         * @return array
         */
        public function toArray()
        {
            $data = parent::toArray();
    
            if (empty($data['calculations'])) {
                return $data;
            }
    
            $Currency = $this->getCurrency();
    
            // format
            $articles     = $data['articles'];
            $calculations = $data['calculations'];
    
    
            $calculations['currencyData'] = $Currency->toArray();
    
    
            $calculations['vatSum'] = QUI\ERP\Accounting\Calc::calculateTotalVatOfInvoice(
                $calculations['vatArray']
            );
    
            $calculations['display_subSum'] = $Currency->format($calculations['subSum']);
            $calculations['display_sum']    = $Currency->format($calculations['sum']);
            $calculations['display_vatSum'] = $Currency->format($calculations['vatSum']);
    
            foreach ($articles as $key => $article) {
                $articles[$key]['display_sum']       = $Currency->format($article['sum']);
                $articles[$key]['display_unitPrice'] = $Currency->format($article['unitPrice']);
            }
    
            $data['articles']     = $articles;
            $data['calculations'] = $calculations;
    
    
            /* @var $Factor PriceFactors\Factor */
            foreach ($this->PriceFactors as $Factor) {
    
                if (!$Factor->isVisible()) {
                    continue;
                }
    
                $result['attributes'][] = [
                    'title'     => $Factor->getTitle(),
    
                    'value'     => $Factor->getSumFormatted(),
    
                    'valueText' => ''
    
        /**
         * Parse this ArticleList to an ArticleListUnique
         *
         * @return ArticleListUnique
    
    Henning Leutz's avatar
    Henning Leutz committed
         *
         * @throws QUI\ERP\Exception
    
         * @throws QUI\Exception
    
         */
        public function toUniqueList()
        {
            $this->calc();
    
            return new ArticleListUnique($this->toArray());
        }
    
    
        /**
         * @param null $Calc
         */
        public function recalculate($Calc = null)
        {
            $this->calculated = false;
            $this->calc($Calc);
        }
    
    
         * @param null|Calc $Calc
    
         * @return $this
         */
        public function calc($Calc = null)
        {
    
            $self = $this;
    
            if (!$Calc) {
                $Calc = Calc::getInstance();
    
                if ($this->User) {
                    $Calc->setUser($this->User);
                }
            }
    
            $Calc->calcArticleList($this, function ($data) use ($self) {
                $self->sum          = $data['sum'];
                $self->subSum       = $data['subSum'];
                $self->nettoSum     = $data['nettoSum'];
                $self->nettoSubSum  = $data['nettoSubSum'];
                $self->vatArray     = $data['vatArray'];
                $self->vatText      = $data['vatText'];
                $self->isEuVat      = $data['isEuVat'];
                $self->isNetto      = $data['isNetto'];
                $self->currencyData = $data['currencyData'];
    
    
                $this->calculations = [
    
                    'sum'          => $self->sum,
                    'subSum'       => $self->subSum,
                    'nettoSum'     => $self->nettoSum,
                    'nettoSubSum'  => $self->nettoSubSum,
                    'vatArray'     => $self->vatArray,
                    'vatText'      => $self->vatText,
                    'isEuVat'      => $self->isEuVat,
                    'isNetto'      => $self->isNetto,
                    'currencyData' => $self->currencyData
    
                $self->setCurrency($self->getCurrency());
    
                $self->calculated = true;
            });
    
            return $this;
        }
    
        //region Article Management
    
    
        /**
         * Add an article to the list
         *
         * @param Article $Article
         */
        public function addArticle(Article $Article)
        {
            $this->articles[] = $Article;
    
            $this->calculated = false;
    
    
            if ($this->User) {
                $Article->setUser($this->User);
            }
    
    
            if ($this->Currency) {
                $Article->setCurrency($this->Currency);
            }
    
        }
    
        /**
         * Remove an article by its index position
         *
         * @param integer $index
         */
        public function removeArticle($index)
        {
            if (isset($this->articles[$index])) {
                unset($this->articles[$index]);
            }
        }
    
        /**
         * Replace an article at a specific position
         *
         * @param Article $Article
         * @param integer $index
         */
        public function replaceArticle(Article $Article, $index)
        {
            $this->articles[$index] = $Article;
        }
    
        /**
         * Clears the list
         */
        public function clear()
        {
    
            $this->articles = [];
    
         * Return the length of the list
    
         * @return int
    
        public function count()
    
            return \count($this->articles);
    
    
        //region Price Factors
    
        /**
         * Import a price factor list
         *
    
         * @param QUI\ERP\Accounting\PriceFactors\FactorList $PriceFactors
    
        public function importPriceFactors(QUI\ERP\Accounting\PriceFactors\FactorList $PriceFactors)
    
        {
            $this->PriceFactors = $PriceFactors;
        }
    
        //endregion