Skip to content
Code-Schnipsel Gruppen Projekte
calc.php 4,61 KiB
Newer Older
  • Learn to ignore specific revisions
  • <?php
    
    /**
     * This file contains package_quiqqer_invoice_ajax_invoices_temporary_product_calc
     */
    
    /**
     * Calculates the current price of the article
     *
     * @return string
     */
    
    
    use QUI\ERP\Accounting\ArticleDiscount;
    
    
    QUI::$Ajax->registerFunction(
        'package_quiqqer_erp_ajax_products_calc',
    
    Henning Leutz's avatar
    Henning Leutz committed
        function ($articles, $priceFactors, $user, $currency) {
            $articles     = json_decode($articles, true);
            $user         = json_decode($user, true);
            $priceFactors = json_decode($priceFactors, true);
    
    Henning Leutz's avatar
    Henning Leutz committed
            if (!is_array($articles)) {
    
    
            if (!empty($user)) {
                try {
                    $User = QUI\ERP\User::convertUserDataToErpUser($user);
                    $Calc = QUI\ERP\Accounting\Calc::getInstance($User);
                } catch (QUI\ERP\Exception $Exception) {
                    $Calc = QUI\ERP\Accounting\Calc::getInstance();
                }
            } else {
                $Calc = QUI\ERP\Accounting\Calc::getInstance();
            }
    
    
            $User = $Calc->getUser();
    
    
            $Articles = new QUI\ERP\Accounting\ArticleList($articles);
    
    Henning Leutz's avatar
    Henning Leutz committed
    
            foreach ($priceFactors as $priceFactor) {
                $Articles->addPriceFactor(
                    new QUI\ERP\Accounting\PriceFactors\Factor($priceFactor)
                );
            }
    
    
            $Articles->setUser($User);
    
            try {
                $Articles->setCurrency(
                    \QUI\ERP\Currency\Handler::getCurrency($currency)
                );
            } catch (QUI\Exception $Exception) {
            }
    
    
            $result = $Articles->toArray();
    
            // brutto stuff (for display)
            $User->setAttribute('RUNTIME_NETTO_BRUTTO_STATUS', QUI\ERP\Utils\User::IS_BRUTTO_USER);
            $Calc->setUser($User);
            $Articles->setUser($User);
            $Articles->recalculate($Calc);
    
            $brutto = $Articles->toArray();
    
    
            // discount stuff
            $Currency = $Articles->getCurrency();
    
            foreach ($brutto['articles'] as $k => $article) {
                $vat       = $article['vat'] / 100 + 1;
    
                $bruttoSum = $article['sum'];
                $quantity  = $article['quantity'];
    
    Henning Leutz's avatar
    Henning Leutz committed
                if ($quantity) {
                    $unitPrice = $bruttoSum / $quantity;
    
    Henning Leutz's avatar
    Henning Leutz committed
                    $unitPrice = round($unitPrice, $Currency->getPrecision());
    
    Henning Leutz's avatar
    Henning Leutz committed
                } else {
                    $unitPrice = $article['unitPrice'] * $vat;
                }
    
                $brutto['articles'][$k]['unitPrice']            = $unitPrice;
                $brutto['articles'][$k]['display_unitPrice']    = $Currency->format($unitPrice);
    
                $brutto['articles'][$k]['display_quantity_sum'] = $brutto['articles'][$k]['display_sum'];
                $brutto['articles'][$k]['quantity_sum']         = $brutto['articles'][$k]['sum'];
    
    
                if (empty($article['discount'])) {
                    continue;
                }
    
                $Discount = ArticleDiscount::unserialize($article['discount']);
    
    
                if ($Discount->getCalculation() !== QUI\ERP\Accounting\Calc::CALCULATION_COMPLEMENT) {
    
                    $bruttoUnit     = $result['articles'][$k]['unitPrice'] * $vat;
                    $discount       = $bruttoUnit * ($Discount->getValue() / 100);
    
    Henning Leutz's avatar
    Henning Leutz committed
                    $uniqueDiscount = round($discount, $Currency->getPrecision());
    
    Henning Leutz's avatar
    Henning Leutz committed
                    $brutto['articles'][$k]['discount']         = $Discount->getValue() . '%';
                    $brutto['articles'][$k]['display_discount'] = $Discount->getValue() . '%';
    
                } else {
                    $discount       = $Discount->getValue() * $vat;
    
    Henning Leutz's avatar
    Henning Leutz committed
                    $discount       = round($discount, $Currency->getPrecision());
    
                    $uniqueDiscount = $discount / $quantity;
    
                    $brutto['articles'][$k]['discount']         = $discount;
                    $brutto['articles'][$k]['display_discount'] = $Currency->format($discount);
    
                $unitPrice = $brutto['articles'][$k]['unitPrice'];
                $unitPrice = $unitPrice + $uniqueDiscount;
    
                $brutto['articles'][$k]['display_sum']          = $Currency->format($bruttoSum);
    
    Henning Leutz's avatar
    Henning Leutz committed
                $brutto['articles'][$k]['sum']                  = round($bruttoSum, $Currency->getPrecision());
    
                $brutto['articles'][$k]['display_unitPrice']    = $Currency->format($unitPrice);
    
    Henning Leutz's avatar
    Henning Leutz committed
                $brutto['articles'][$k]['unitPrice']            = round($unitPrice, $Currency->getPrecision());
    
                $brutto['articles'][$k]['display_quantity_sum'] = $Currency->format($unitPrice * $quantity);
                $brutto['articles'][$k]['quantity_sum']         = $unitPrice * $quantity;
    
            }
    
            $result['brutto'] = $brutto;
    
    
    Henning Leutz's avatar
    Henning Leutz committed
        ['articles', 'priceFactors', 'user', 'currency'],
    
        'Permission::checkAdminUser'
    );