HaaseIT/HCSF

View on GitHub
src/Controller/Admin/Shop/Shopadmin.php

Summary

Maintainability
F
3 days
Test Coverage
<?php

/*
    HCSF - A multilingual CMS and Shopsystem
    Copyright (C) 2014  Marcus Haase - mail@marcus.haase.name

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

namespace HaaseIT\HCSF\Controller\Admin\Shop;


use HaaseIT\Toolbox\Tools;
use Zend\ServiceManager\ServiceManager;

/**
 * Class Shopadmin
 * @package HaaseIT\HCSF\Controller\Admin\Shop
 */
class Shopadmin extends Base
{
    /**
     * @var \Doctrine\DBAL\Connection
     */
    protected $dbal;

    /**
     * @var \HaaseIT\HCSF\HardcodedText
     */
    private $hardcodedtextcats;

    /**
     * Shopadmin constructor.
     * @param ServiceManager $serviceManager
     */
    public function __construct(ServiceManager $serviceManager)
    {
        parent::__construct($serviceManager);
        $this->dbal = $serviceManager->get('dbal');
        $this->hardcodedtextcats = $serviceManager->get('hardcodedtextcats');
    }

    /**
     *
     */
    public function preparePage()
    {
        $this->P = new \HaaseIT\HCSF\CorePage($this->serviceManager, [], 'admin/base.twig');
        $this->P->cb_pagetype = 'content';
        $this->P->cb_subnav = 'admin';

        $this->P->cb_customcontenttemplate = 'shop/shopadmin';

        if (filter_input(INPUT_POST, 'change') !== null) {
            $iID = filter_var(trim(Tools::getFormfield('id')), FILTER_SANITIZE_NUMBER_INT);
            $serverauthuser = filter_input(INPUT_SERVER, 'PHP_AUTH_USER', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);

            $querybuilder = $this->dbal->createQueryBuilder();
            $querybuilder
                ->update('orders')
                ->set('o_lastedit_timestamp', ':o_lastedit_timestamp')
                ->set('o_remarks_internal', ':o_remarks_internal')
                ->set('o_transaction_no', ':o_transaction_no')
                ->set('o_paymentcompleted', ':o_paymentcompleted')
                ->set('o_ordercompleted', ':o_ordercompleted')
                ->set('o_lastedit_user', ':o_lastedit_user')
                ->set('o_shipping_service', ':o_shipping_service')
                ->set('o_shipping_trackingno', ':o_shipping_trackingno')
                ->where('o_id = :o_id')
                ->setParameter(':o_lastedit_timestamp', time())
                ->setParameter(':o_remarks_internal', filter_var(trim(Tools::getFormfield('remarks_internal')), FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW))
                ->setParameter(':o_transaction_no', filter_var(trim(Tools::getFormfield('transaction_no')), FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW))
                ->setParameter(':o_paymentcompleted', filter_var(trim(Tools::getFormfield('order_paymentcompleted')), FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW))
                ->setParameter(':o_ordercompleted', filter_var(trim(Tools::getFormfield('order_completed')), FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW))
                ->setParameter(':o_lastedit_user', !empty($serverauthuser) ? $serverauthuser : '')
                ->setParameter(':o_shipping_service', filter_var(trim(Tools::getFormfield('order_shipping_service')), FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW))
                ->setParameter(':o_shipping_trackingno', filter_var(trim(Tools::getFormfield('order_shipping_trackingno')), FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW))
                ->setParameter(':o_id', $iID)
            ;
            $querybuilder->execute();
            $this->helper->redirectToPage('/_admin/shopadmin.html?action=edit&id='.$iID);
        }

        $aPData = [
            'searchform_type' => Tools::getFormfield('type', 'openinwork'),
            'searchform_fromday' => Tools::getFormfield('fromday', '01'),
            'searchform_frommonth' => Tools::getFormfield('frommonth', '01'),
            'searchform_fromyear' => Tools::getFormfield('fromyear', '2014'),
            'searchform_today' => Tools::getFormfield('today', date('d')),
            'searchform_tomonth' => Tools::getFormfield('tomonth', date('m')),
            'searchform_toyear' => Tools::getFormfield('toyear', date('Y')),
        ];

        $CSA = [
            'list_orders' => [
                ['title' => '', 'key' => 'o_id', 'width' => 30, 'linked' => false, 'callback' => 'shopadminMakeCheckbox'],
                ['title' => $this->hardcodedtextcats->get('shopadmin_list_orderid'), 'key' => 'o_id', 'width' => 30, 'linked' => false,],
                ['title' => $this->hardcodedtextcats->get('shopadmin_list_customer'), 'key' => 'o_cust', 'width' => 280, 'linked' => false,],
                ['title' => $this->hardcodedtextcats->get('shopadmin_list_sumnettoall'), 'key' => 'o_sumnettoall', 'width' => 75, 'linked' => false,],
                ['title' => $this->hardcodedtextcats->get('shopadmin_list_orderstatus'), 'key' => 'o_order_status', 'width' => 80, 'linked' => false,],
                ['title' => $this->hardcodedtextcats->get('shopadmin_list_ordertimenumber'), 'key' => 'o_ordertime_number', 'width' => 100, 'linked' => false,],
                ['title' => $this->hardcodedtextcats->get('shopadmin_list_hostpayment'), 'key' => 'o_order_host_payment', 'width' => 140, 'linked' => false,],
                [
                    'title' => $this->hardcodedtextcats->get('shopadmin_list_edit'),
                    'key' => 'o_id',
                    'width' => 45,
                    'linked' => true,
                    'ltarget' => '/_admin/shopadmin.html',
                    'lkeyname' => 'id',
                    'lgetvars' => [
                        'action' => 'edit',
                    ],
                ],
            ],
            'list_orderitems' => [
                ['title' => $this->hardcodedtextcats->get('shopadmin_list_itemno'), 'key' => 'oi_itemno', 'width' => 95, 'linked' => false,],
                ['title' => $this->hardcodedtextcats->get('shopadmin_list_itemname'), 'key' => 'oi_itemname', 'width' => 350, 'linked' => false,],
                ['title' => $this->hardcodedtextcats->get('shopadmin_list_itemamount'), 'key' => 'oi_amount', 'width' => 50, 'linked' => false, 'style-data' => 'text-align: center;',],
                ['title' => $this->hardcodedtextcats->get('shopadmin_list_itemnetto'), 'key' => 'oi_price_netto', 'width' => 70, 'linked' => false,],
                ['title' => $this->hardcodedtextcats->get('shopadmin_list_itemsumnetto'), 'key' => 'ges_netto', 'width' => 75, 'linked' => false,],
            ],
        ];

        $aShopadmin = $this->handleShopAdmin($CSA);

        $this->P->cb_customdata = array_merge($aPData, $aShopadmin);
    }

    /**
     * @param $CSA
     * @return array
     */
    private function handleShopAdmin($CSA)
    {
        $aSData = [];
        $aData = [];
        $getaction = filter_input(INPUT_GET, 'action');
        if ($getaction === null) {
            $bIgnoreStorno = false;

            $querybuilder = $this->dbal->createQueryBuilder();
            $querybuilder
                ->select('*')
                ->from('orders')
                ->orderBy('o_ordertimestamp', 'DESC')
            ;

            $posttype = filter_input(INPUT_POST, 'type');
            $querybuilder->where('o_ordercompleted = ?');
            if ($posttype !== null) {
                switch ($posttype) {
                    case 'closed':
                        $querybuilder->setParameter(0, 'y');
                        break;
                    case 'open':
                        $querybuilder->setParameter(0, 'n');
                        break;
                    case 'inwork':
                        $querybuilder->setParameter(0, 'i');
                        break;
                    case 'storno':
                        $querybuilder->setParameter(0, 's');
                        break;
                    case 'deleted':
                        $querybuilder->setParameter(0, 'd');
                        break;
                    case 'all':
                        $querybuilder
                            ->where('o_ordercompleted != ?')
                            ->setParameter(0, 'd')
                        ;
                        $bIgnoreStorno = true;
                        break;
                    case 'openinwork':
                    default:
                    $querybuilder
                        ->where('o_ordercompleted = ? OR o_ordercompleted = ?')
                        ->setParameter(0, 'n')
                        ->setParameter(1, 'i')
                    ;
                }
            } else {
                $querybuilder
                    ->where('o_ordercompleted = ? OR o_ordercompleted = ?')
                    ->setParameter(0, 'n')
                    ->setParameter(1, 'i')
                ;
            }

            $sFrom = null;
            $sTo = null;
            if ($posttype === 'deleted' || $posttype === 'all' || $posttype === 'closed') {
                $sFrom = filter_input(INPUT_POST, 'fromyear', FILTER_SANITIZE_NUMBER_INT).'-'
                    .Tools::dateAddLeadingZero(filter_input(INPUT_POST, 'frommonth', FILTER_SANITIZE_NUMBER_INT)).'-'
                    .Tools::dateAddLeadingZero(filter_input(INPUT_POST, 'fromday', FILTER_SANITIZE_NUMBER_INT))
                ;
                $sTo = filter_input(INPUT_POST, 'toyear', FILTER_SANITIZE_NUMBER_INT).'-'
                    .Tools::dateAddLeadingZero(filter_input(INPUT_POST, 'tomonth', FILTER_SANITIZE_NUMBER_INT)).'-'
                    .Tools::dateAddLeadingZero(filter_input(INPUT_POST, 'today', FILTER_SANITIZE_NUMBER_INT));

                $querybuilder
                    ->andWhere('o_orderdate >= :from AND o_orderdate <= :to')
                    ->setParameter(':from', $sFrom)
                    ->setParameter(':to', $sTo)
                ;
            }
            $stmt = $querybuilder->execute();

            if ($stmt->rowCount() !== 0) {
                $i = 0;
                $j = 0;
                $k = 0;
                $fGesamtnetto = 0.0;
                while ($aRow = $stmt->fetch()) {
                    switch ($aRow['o_ordercompleted']) {
                        case 'y':
                            $sStatus = '<span style="color: green; font-weight: bold;">'.$this->hardcodedtextcats->get('shopadmin_orderstatus_completed').'</span>';
                            break;
                        case 'n':
                            $sStatus = '<span style="color: orange; font-weight: bold;">'.$this->hardcodedtextcats->get('shopadmin_orderstatus_open').'</span>';
                            break;
                        case 'i':
                            $sStatus = '<span style="color: orange;">'.$this->hardcodedtextcats->get('shopadmin_orderstatus_inwork').'</span>';
                            break;
                        case 's':
                            $sStatus = '<span style="color: red; font-weight: bold;">'.$this->hardcodedtextcats->get('shopadmin_orderstatus_canceled').'</span>';
                            break;
                        case 'd':
                            $sStatus = $this->hardcodedtextcats->get('shopadmin_orderstatus_deleted');
                            break;
                        default:
                            $sStatus = '';
                    }

                    if ($aRow['o_paymentcompleted'] === 'y') {
                        $sZahlungsmethode = '<span style="color: green;">';
                    } else {
                        $sZahlungsmethode = '<span style="color: red;">';
                    }
                    $mZahlungsmethode = $this->serviceManager->get('textcats')->T('order_paymentmethod_' .$aRow['o_paymentmethod'], true);
                    if ($mZahlungsmethode ) {
                        $sZahlungsmethode .= $mZahlungsmethode;
                    } else {
                        $sZahlungsmethode .= ucwords($aRow['o_paymentmethod']);
                    }
                    $sZahlungsmethode .= '</span>';

                    if (trim($aRow['o_corpname']) === '') {
                        $sName = $aRow['o_name'];
                    } else {
                        $sName = $aRow['o_corpname'];
                    }

                    $aData[] = [
                        'o_id' => $aRow['o_id'],
                        'o_account_no' => $aRow['o_custno'],
                        'o_email' => $aRow['o_email'],
                        'o_cust' => $sName.'<br>'.$aRow['o_zip'].' '.$aRow['o_town'],
                        'o_authed' => $aRow['o_authed'],
                        'o_sumnettoall' => number_format(
                                $aRow['o_sumnettoall'],
                                $this->config->getCore('numberformat_decimals'),
                                $this->config->getCore('numberformat_decimal_point'),
                                $this->config->getCore('numberformat_thousands_seperator')
                            )
                            .' '.$this->config->getShop('waehrungssymbol')
                            .(
                                ($aRow['o_mindermenge'] != 0 && $aRow['o_mindermenge'] !== '')
                                    ? '<br>+'.number_format(
                                        $aRow['o_mindermenge'],
                                        $this->config->getCore('numberformat_decimals'),
                                        $this->config->getCore('numberformat_decimal_point'),
                                        $this->config->getCore('numberformat_thousands_seperator')
                                    ).' '.$this->config->getShop('waehrungssymbol') : ''),
                        'o_order_status' => $sStatus.((trim($aRow['o_lastedit_user']) !== '') ? '<br>'.$aRow['o_lastedit_user'] : ''),
                        'o_ordertime_number' => date(
                            $this->config->getCore('locale_format_date_time'),
                                $aRow['o_ordertimestamp']
                            )
                            .((trim($aRow['o_transaction_no']) !== '') ? '<br>'.$aRow['o_transaction_no'] : ''),
                        'o_order_host_payment' => $sZahlungsmethode.'<br>'.$aRow['o_srv_hostname'],
                    ];
                    if (!($bIgnoreStorno && $aRow['o_ordercompleted'] === 's')) {
                        $fGesamtnetto += $aRow['o_sumnettoall'];
                        $j ++;
                    } else {
                        $k++;
                    }
                    $i++;
                }
                $aSData['listtable_orders'] = Tools::makeListtable($CSA['list_orders'], $aData, $this->serviceManager->get('twig'));
                $aSData['listtable_i'] = $i;
                $aSData['listtable_j'] = $j;
                $aSData['listtable_k'] = $k;
                $aSData['listtable_gesamtnetto'] = $fGesamtnetto;
            } else {
                $aSData['nomatchingordersfound'] = true;
            }
        } elseif ($getaction === 'edit') {
            $iId = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT);
            $querybuilder = $this->dbal->createQueryBuilder();
            $querybuilder
                ->select('*')
                ->from('orders')
                ->where('o_id = ?')
                ->setParameter(0, $iId)
            ;
            $stmt = $querybuilder->execute();
            if ($stmt->rowCount() === 1) {
                $aSData['orderdata'] = $stmt->fetch();

                $querybuilder = $this->dbal->createQueryBuilder();
                $querybuilder
                    ->select('*')
                    ->from('orders_items')
                    ->where('oi_o_id = ?')
                    ->setParameter(0, $iId)
                ;
                $stmt = $querybuilder->execute();
                $aItems = $stmt->fetchAll();

                $aUserdata = [
                    'cust_no' => $aSData['orderdata']['o_custno'],
                    'cust_email' => $aSData['orderdata']['o_email'],
                    'cust_corp' => $aSData['orderdata']['o_corpname'],
                    'cust_name' => $aSData['orderdata']['o_name'],
                    'cust_street' => $aSData['orderdata']['o_street'],
                    'cust_zip' => $aSData['orderdata']['o_zip'],
                    'cust_town' => $aSData['orderdata']['o_town'],
                    'cust_phone' => $aSData['orderdata']['o_phone'],
                    'cust_cellphone' => $aSData['orderdata']['o_cellphone'],
                    'cust_fax' => $aSData['orderdata']['o_fax'],
                    'cust_country' => $aSData['orderdata']['o_country'],
                    'cust_group' => $aSData['orderdata']['o_group'],
                ];
                $aSData['customerform'] = $this->helperCustomer->buildCustomerForm(
                    $this->config->getLang(),
                    'shopadmin',
                    [],
                    $aUserdata
                );

                $aSData['orderdata']['options_shippingservices'] = [''];
                foreach ($this->config->getShop('shipping_services') as $sValue) {
                    $aSData['orderdata']['options_shippingservices'][] = $sValue;
                }

                $aItemsCarttable = [];
                foreach ($aItems as $aValue) {
                    $aPrice = [
                        'netto_list' => $aValue['oi_price_netto_list'],
                        'netto_sale' => $aValue['oi_price_netto_sale'],
                        'netto_rebated' => $aValue['oi_price_netto_rebated'],
                        'netto_use' => $aValue['oi_price_netto_use'],
                        'brutto_use' => $aValue['oi_price_brutto_use'],
                    ];

                    $aItemsCarttable[$aValue['oi_cartkey']] = [
                        'amount' => $aValue['oi_amount'],
                        'price' => $aPrice,
                        'vat' => $aValue['oi_vat'],
                        'rg' => $aValue['oi_rg'],
                        'rg_rebate' => $aValue['oi_rg_rebate'],
                        'name' => $aValue['oi_itemname'],
                        'img' => $aValue['oi_img'],
                    ];
                }

                $aSData = array_merge(
                    $this->helperShop->buildShoppingCartTable(
                        $aItemsCarttable,
                        true,
                        $aSData['orderdata']['o_group'],
                        [],
                        $aSData['orderdata']['o_vatfull'],
                        $aSData['orderdata']['o_vatreduced']
                    ),
                    $aSData);
            } else {
                $aSData['ordernotfound'] = true;
            }
        }

        return $aSData;
    }
}