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 
<?php
/* --------------------------------------------------------------
   OrderStatusHistoryStorage.inc.php 2017-06-14
   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 OrderStatusHistoryStorage
 *
 * @category   System
 * @package    Order
 * @subpackage Storages
 */
class OrderStatusHistoryStorage implements OrderStatusHistoryReaderInterface, OrderStatusHistoryWriterInterface
{
    /**
     * @var CI_DB_query_builder
     */
    protected $db;
    
    
    /**
     * OrderStatusHistoryStorage constructor.
     *
     * @param CI_DB_query_builder $db
     */
    public function __construct(CI_DB_query_builder $db)
    {
        $this->db = $db;
    }
    
    
    /**
     * Returns a collection of order status history items by the given order item id.
     *
     * @param IdType $orderId Id of order item.
     *
     * @return OrderStatusHistoryListItemCollection
     */
    public function getStatusHistory(IdType $orderId)
    {
        $orderStatusHistoryListItems = array();
        $result = $this->db->from('orders_status_history')
                           ->where('orders_id', $orderId->asInt())
                           ->order_by('date_added', 'ASC')
                           ->get();
        
        if($result->num_rows())
        {
            foreach($result->result_array() as $row)
            {
                $orderStatusHistoryListItems[] = MainFactory::create('OrderStatusHistoryListItem',
                                                                     new IdType($row['orders_status_history_id']),
                                                                     new IdType($row['orders_status_id']),
                                                                     new EmptyDateTime($row['date_added']),
                                                                     new StringType((string)$row['comments']),
                                                                     new BoolType($row['customer_notified']),
                                                                     new IdType($row['customer_id']));
            }
        }
        
        $orderStatusHistoryListItemCollection = MainFactory::create('OrderStatusHistoryListItemCollection',
                                                                    $orderStatusHistoryListItems);
        
        return $orderStatusHistoryListItemCollection;
    }
    
    
    /**
     * Adds an order status history item.
     *
     * @param IdType     $orderId
     * @param IntType    $newOrderStatusId
     * @param StringType $comment
     * @param BoolType   $customerNotified
     * @param IdType     $customerId
     */
    public function addStatusUpdate(IdType $orderId,
                                    IntType $newOrderStatusId,
                                    StringType $comment,
                                    BoolType $customerNotified,
                                    IdType $customerId = null)
    {
        if($customerId === null)
        {
            $customerId = new IdType(0);
        }
        
        $dateAdded = new DateTime();
        $dateAdded = $dateAdded->format('Y-m-d H:i:s');
        
        $this->db->insert('orders_status_history', array(
            'orders_id'         => $orderId->asInt(),
            'orders_status_id'  => $newOrderStatusId->asInt(),
            'date_added'        => $dateAdded,
            'customer_notified' => (int)$customerNotified->asBool(),
            'comments'          => $comment->asString(),
            'customer_id'       => $customerId->asInt()
        ));
    }
    
    
    /**
     * Deletes all order status history items which are associated with the given order item id.
     *
     * @param IdType $orderId
     */
    public function deleteHistory(IdType $orderId)
    {
        $this->db->delete('orders_status_history', array('orders_id' => $orderId->asInt()));
    }
}