1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 
<?php

/* --------------------------------------------------------------
   OrderStatusWriter.inc.php 2017-03-30
   Gambio GmbH
   http://www.gambio.de
   Copyright (c) 2017 Gambio GmbH
   Released under the GNU General Public License (Version 2)
   [http://www.gnu.org/licenses/gpl-2.0.html]
   --------------------------------------------------------------
*/

/**
 * Class OrderStatusWriter
 *
 * @category   System
 * @package    OrderStatus
 * @subpackage Repositories
 */
class OrderStatusWriter implements OrderStatusWriterInterface
{
    /**
     * @var CI_DB_query_builder
     */
    protected $queryBuilder;
    
    /**
     * @var string
     */
    protected $table = 'orders_status';
    
    /**
     * @var string
     */
    protected $id = 'orders_status_id';
    
    /**
     * @var LanguageProvider
     */
    protected $languageProvider;
    
    
    /**
     * OrderStatusWriter constructor.
     *
     * @param \CI_DB_query_builder $queryBuilder     Active record instance for data access.
     * @param \LanguageProvider    $languageProvider Instance to access language code and ID's.
     */
    public function __construct(CI_DB_query_builder $queryBuilder, LanguageProvider $languageProvider)
    {
        $this->queryBuilder     = $queryBuilder;
        $this->languageProvider = $languageProvider;
    }
    
    
    /**
     * Creates a new order status.
     *
     * @param \OrderStatus $orderStatus Order status to be created.
     *
     * @throws OrderStatusIdExistsException If ::getId method of $orderStatus returns not null.
     * @return int Id of new order status entity.
     */
    public function createOrderStatus(OrderStatus $orderStatus)
    {
        if(null !== $orderStatus->getId())
        {
            throw new OrderStatusIdExistsException('Invalid order status entity with existing id "'
                                                   . $orderStatus->getId() . '" provided. (Please use update method)');
        }
        
        $maxOrdersStatusId  = $this->queryBuilder->select($this->id)
                                                 ->from($this->table)
                                                 ->where('`' . $this->id . '` = (SELECT MAX(`' . $this->id . '`) FROM `'
                                                         . $this->table . '`)', null, false)
                                                 ->get()
                                                 ->row_array()[$this->id];
        $nextOrdersStatusId = (int)$maxOrdersStatusId + 1;
        foreach($orderStatus->getNames() as $languageCode => $orderStatusName)
        {
            $languageId = $this->languageProvider->getIdByCode(MainFactory::create('LanguageCode',
                                                                                   new StringType($languageCode)));
            $this->queryBuilder->insert('orders_status', [
                'orders_status_id'   => $nextOrdersStatusId,
                'language_id'        => $languageId,
                'orders_status_name' => $orderStatusName,
                'color'              => $orderStatus->getColor()
            ]);
        }
        
        return $nextOrdersStatusId;
    }
    
    
    /**
     * Updates the given order status entity.
     *
     * @param \OrderStatus $orderStatus Order status to be update.
     *
     * @throws OrderStatusIdNotExistsException If ::getId method of $orderStatus returns null.
     * @return $this|OrderStatusWriterInterface Same instance for chained method calls.
     */
    public function updateOrderStatus(OrderStatus $orderStatus)
    {
        if(null === $orderStatus->getId())
        {
            throw new OrderStatusIdNotExistsException('Invalid order status entity provided.');
        }
        
        foreach($orderStatus->getNames() as $languageCode => $orderStatusName)
        {
            $escapedCode = new StringType(str_replace('\'', '', $this->queryBuilder->escape($languageCode)));
            $languageId = $this->languageProvider->getIdByCode(MainFactory::create('LanguageCode', $escapedCode));
            
            $this->queryBuilder->update($this->table, [
                'orders_status_name' => $orderStatusName,
                'color'              => $orderStatus->getColor()
            ], '`' . $this->id . '` = "' . $this->queryBuilder->escape($orderStatus->getId())
               . '" AND `language_id` = "' . $languageId . '"');
        }
        
        return $this;
    }
}