Your IP : 216.73.216.52


Current Path : /proc/thread-self/root/var/www/surf/TYPO3/src/surf/Classes/Controller/
Upload File :
Current File : //proc/thread-self/root/var/www/surf/TYPO3/src/surf/Classes/Controller/DeliveryController.php

<?php

declare(strict_types=1);

namespace Torresani\Surf\Controller;
use TYPO3\CMS\Extbase\Http\ForwardResponse;
use TYPO3\CMS\Core\Type\ContextualFeedbackSeverity;
use TYPO3\CMS\Core\Database\ConnectionPool;

/**
 * This file is part of the "Surf" Extension for TYPO3 CMS.
 *
 * For the full copyright and license information, please read the
 * LICENSE.txt file that was distributed with this source code.
 *
 * (c) 2023 Roberto Torresani <roberto@torresani.eu>
 */

/**
 * DeliveryController
 */
class DeliveryController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController
{

    /**
     * deliveryRepository
     *
     * @var \Torresani\Surf\Domain\Repository\DeliveryRepository
     */
    protected $deliveryRepository = null;

    /**
     * orderRepository
     *
     * @var \Torresani\Surf\Domain\Repository\OrderRepository
     */
    protected $orderRepository = null;

    /**
     * @param \Torresani\Surf\Domain\Repository\DeliveryRepository $deliveryRepository
     */
    public function injectDeliveryRepository(\Torresani\Surf\Domain\Repository\DeliveryRepository $deliveryRepository)
    {
        $this->deliveryRepository = $deliveryRepository;
    }

    /**
     * @param \Torresani\Surf\Domain\Repository\OrderRepository $orderRepository
     */
    public function injectOrderRepository(\Torresani\Surf\Domain\Repository\OrderRepository $orderRepository)
    {
        $this->orderRepository = $orderRepository;
    }

    /**
     * orderItemRepository
     *
     * @var \Torresani\Surf\Domain\Repository\OrderItemRepository
     */
    protected $orderItemRepository = null;

    /**
     * @param \Torresani\Surf\Domain\Repository\OrderItemRepository $orderItemRepository
     */
    public function injectOrderItemRepository(\Torresani\Surf\Domain\Repository\OrderItemRepository $orderItemRepository)
    {
        $this->orderItemRepository = $orderItemRepository;
    }

    /**
     * logRepository
     *
     * @var \Torresani\Surf\Domain\Repository\LogRepository
     */
    protected $logRepository = null;

    /**
     * @param \Torresani\Surf\Domain\Repository\LogRepository $logRepository
     */
    public function injectLogRepository(\Torresani\Surf\Domain\Repository\LogRepository $logRepository)
    {
        $this->logRepository = $logRepository;
    }

    /**
     * action list
     *
     * @return \Psr\Http\Message\ResponseInterface
     */
    public function listAction(): \Psr\Http\Message\ResponseInterface
    {
        $deliveries = $this->deliveryRepository->findAll();
        $this->view->assign('deliveries', $deliveries);
        $this->view->assign('debug', "ROBY");
        return $this->htmlResponse();
    }

    /**
     * action show
     *
     * @param \Torresani\Surf\Domain\Model\Delivery $delivery
     * @param \Torresani\Surf\Domain\Model\Vendor $vendor
     * @return \Psr\Http\Message\ResponseInterface
     */
    public function showAction(\Torresani\Surf\Domain\Model\Delivery $delivery, \Torresani\Surf\Domain\Model\Vendor $vendor=null): \Psr\Http\Message\ResponseInterface
    {
        $orders = $this->orderRepository->findByDelivery($delivery);
        $statusDelivery = 100;
        $filteredOrders = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
        $vendorList = [];
        $forceVendor = null;
        if ($GLOBALS['TSFE']->fe_user->user['usergroup'] <> 2 && $vendor) {
            $forceVendor = $vendor->getUid();
        }
        foreach ($orders as $keyOrder => $order) {
            /** @var \Torresani\Surf\Domain\Model\Order $tempOrder */
            $tempOrder = new \Torresani\Surf\Domain\Model\Order();
            $iteration = 0;
            $statusOrder = 100;
            $vendorBool = false;
            $filteredOrderItems = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
            foreach ($order->getOrderitem() as $key => $item) {
                if ($item->getVendor()->getUser() == $GLOBALS['TSFE']->fe_user->user['uid'] || $item->getVendor()->getUid() == $forceVendor) {
                    if ($statusDelivery > $item->getStatus()) {
                        $statusDelivery = $item->getStatus();
                    }
                    if ($statusOrder > $item->getStatus()) {
                        $statusOrder = $item->getStatus();
                    }
                    $vendorBool = true;
                    $filteredOrderItems->attach($item);
                } else if (!$forceVendor && $GLOBALS['TSFE']->fe_user->user['usergroup'] <> 2) {
                    if ($statusDelivery > $item->getStatus()) {
                        $statusDelivery = $item->getStatus();
                    }
                    if ($statusOrder > $item->getStatus()) {
                        $statusOrder = $item->getStatus();
                    }
                    $vendorBool = true;
                    $filteredOrderItems->attach($item);
                }
                if ($GLOBALS['TSFE']->fe_user->user['usergroup'] <> 2) {
                    $vendorList[$item->getVendor()->getName()] = $item->getVendor();
                }
                $iteration++;
            }
            if ($vendorBool || $forceVendor) {
                $tempOrder->setUid($order->getUid());
                $tempOrder->setStatus($statusOrder);
                $tempOrder->setDelivery($order->getDelivery());
                $tempOrder->setCode($order->getCode());
                $tempOrder->setName($order->getName());
                $tempOrder->setOrderitem($filteredOrderItems);
                $filteredOrders->attach($tempOrder);
            }
        }
        $delivery->setStatus($statusDelivery);

        $button = [];
        switch ($GLOBALS['TSFE']->fe_user->user['usergroup']) {
            case 2:
                if ($statusDelivery==0) {
                    $button['forceCloseOrder'] = true;
                }
                if ($statusDelivery==1) {
                    $button['closeDelivery'] = true;
                }
                if ($statusDelivery==1 || $statusDelivery==2) {
                    $button['requestDelivery'] = true;
                }
                if ($statusDelivery==1 || $statusDelivery==2 || $statusDelivery==3) {
                    $button['shipDelivery'] = true;
                }
                break;
            case 3:
                if ($forceVendor) {
                    if ($statusDelivery < 3) {
                        $button['forceWithdraw'] = true;
                    }
                    if ($statusDelivery == 4) {
                        $button['withdraw'] = true;
                    }
                    if ($statusDelivery == 5) {
                        $button['openDelivery'] = true;
                    }
                }
        }

        $this->view->assign('orders', $filteredOrders);
        $this->view->assign('delivery', $delivery);
        $this->view->assign('button', $button);
        $this->view->assign('vendorList', $vendorList);
        $this->view->assign('forceVendor', $forceVendor);
        $logs = $this->logRepository->findAllByCodeAndType($delivery->getCode(), 'delivery');
        $this->view->assign('logs', $logs);
        return $this->htmlResponse();
    }

    /**
     * action moving
     *
     * @param \Torresani\Surf\Domain\Model\Delivery $delivery
     * @param string $newStatus
     * @param \Torresani\Surf\Domain\Model\Vendor $vendor
     * @return \Psr\Http\Message\ResponseInterface
     */
    public function movingAction(\Torresani\Surf\Domain\Model\Delivery $delivery, string $newStatus, \Torresani\Surf\Domain\Model\Vendor $vendor=null): \Psr\Http\Message\ResponseInterface
    {
        $descriptionLog = "Log non personalizzato";
        $execute = false;
        switch ($GLOBALS['TSFE']->fe_user->user['usergroup']) {
            case 2: // Vendor
                if ($newStatus == 'forceCloseOrder') { $execute = true; $descriptionLog = "Il vendor ha forzato la chiusura della consegna"; }
                if ($newStatus == 'closeDelivery') { $execute = true; $descriptionLog = "Il vendor ha chiuso la consegna"; }
                if ($newStatus == 'requestDelivery') { $execute = true; $descriptionLog = "Il vendor ha richiesto la spedizione della consegna"; }
                if ($newStatus == 'shipDelivery') { $execute = true; $descriptionLog = "Il vendor ha messo la consegna in viaggio"; }
                break;
            case 3: // Wharehouse
                if ($newStatus == 'forceWithdraw') { $execute = true; $descriptionLog = "Il magazzino ha forzato la ricezione della consegna del vendor " . $vendor->getName(); }
                if ($newStatus == 'withdraw') { $execute = true; $descriptionLog = "Il magazzino ha ricevuto la consegna del vendor " . $vendor->getName(); }
                if ($newStatus == 'openDelivery') { $execute = true; $descriptionLog = "Il magazzino ha aperto la consegna del vendor " . $vendor->getName(); }
                break;
        }

        if ($execute) {
            $mapOrderNewStatus = [
              'forceCloseOrder' => 1,
              'closeDelivery' => 2,
              'requestDelivery' => 3,
              'shipDelivery' => 4,
              'forceWithdraw' => 5,
              'withdraw' => 5,
              'openDelivery' => 6
            ];
            if ($newStatus == 'forceCloseOrder' ||
                $newStatus == 'closeDelivery' ||
                $newStatus == 'requestDelivery' ||
                $newStatus == 'shipDelivery'
            ) {
                $orders = $this->orderRepository->findByDelivery($delivery);
                foreach ($orders as $keyOrder => $order) {
                    foreach ($order->getOrderitem() as $key => $item) {
                        if ($item->getStatus() < $mapOrderNewStatus[$newStatus] && $item->getVendor()->getUser() == $GLOBALS['TSFE']->fe_user->user['uid']) {
                            $orderItem = $this->orderItemRepository->findOneByUid($item->getUid());
                            $orderItem->setStatus($mapOrderNewStatus[$newStatus]);
                            $this->orderItemRepository->update($orderItem);
                        }
                    }
                }
            }
            if ($newStatus == 'forceWithdraw' ||
                $newStatus == 'withdraw' ||
                $newStatus == 'openDelivery'
            ) {
                if ($vendor) {
                    $orders = $this->orderRepository->findByDelivery($delivery);
                    foreach ($orders as $keyOrder => $order) {
                        foreach ($order->getOrderitem() as $key => $item) {
                            if ($item->getStatus() < $mapOrderNewStatus[$newStatus] && $item->getVendor()->getUid() == $vendor->getUid()) {
                                $orderItem = $this->orderItemRepository->findOneByUid($item->getUid());
                                $orderItem->setStatus($mapOrderNewStatus[$newStatus]);
                                $this->orderItemRepository->update($orderItem);
                            }
                        }
                    }
                } else {
                    $this->addFlashMessage('You have to filter by vendor to be able to do this', 'Attention', ContextualFeedbackSeverity::ERROR);
                }
            }
        } else {
            $this->addFlashMessage('You are not authorized for this operation', 'Attention', ContextualFeedbackSeverity::ERROR);
        }
        $this->addLog($descriptionLog, $delivery->getCode(), 'delivery', $GLOBALS['TSFE']->fe_user->user['username']);
        return new ForwardResponse('show');
    }

    public function addLog($description, $code, $type, $user) {
        $newLog = new \Torresani\Surf\Domain\Model\Log();
        $newLog->setCode($code);
        $newLog->setType($type);
        $newLog->setUser($user);
        $newLog->setDescription($description);
        $newLog->setDate(new \DateTime());
        $newLog->setPid(7);

        $this->logRepository->add($newLog);
    }

    public function resetAction(): \Psr\Http\Message\ResponseInterface
    {
        $message = "Error in reset test";
        if ($GLOBALS['TSFE']->fe_user->user['usergroup'] == 1) {
            $queryBuilder = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_operations_domain_model_operation');
            $statement = $queryBuilder
                ->update('tx_surf_domain_model_orderitem', 'o')
                ->set('o.status', 0)
                ->execute();
            $statement = $queryBuilder
                ->delete('tx_surf_domain_model_log', 'l')
                ->execute();
            $message = "Reset test done";
        } else {
            $message = "We have permissions for this action";
        }
        $this->view->assign('message', $message);
        return $this->htmlResponse();

    }

}