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 125 126 127 128 
<?php

/* --------------------------------------------------------------
   OrderItemPropertyRepositoryReader.php 2015-11-16
   Gambio GmbH
   http://www.gambio.de
   Copyright (c) 2015 Gambio GmbH
   Released under the GNU General Public License (Version 2)
   [http://www.gnu.org/licenses/gpl-2.0.html]
   --------------------------------------------------------------
*/

MainFactory::load_class('OrderItemPropertyRepositoryReaderInterface');

/**
 * Class OrderItemPropertyRepositoryReader
 *
 * @category   System
 * @package    Order
 * @subpackage Repositories
 */
class OrderItemPropertyRepositoryReader implements OrderItemPropertyRepositoryReaderInterface
{
    /**
     * Order item property factory.
     * @var OrderItemPropertyFactory
     */
    protected $orderItemAttributeFactory;
    
    /**
     * Query builder.
     * @var CI_DB_query_builder
     */
    protected $db;
    
    /**
     * Table.
     * @var string
     */
    protected $table = 'orders_products_properties';
    
    /**
     * ID column.
     * @var string
     */
    protected $key = 'orders_products_properties_id';
    
    
    /**
     * OrderItemPropertyRepositoryReader constructor.
     *
     * @param CI_DB_query_builder                $db                        Query builder.
     * @param OrderItemAttributeFactoryInterface $orderItemAttributeFactory Order item property factory.
     */
    public function __construct(CI_DB_query_builder $db, OrderItemAttributeFactoryInterface $orderItemAttributeFactory)
    {
        $this->db                        = $db;
        $this->orderItemAttributeFactory = $orderItemAttributeFactory;
    }
    
    
    /**
     * Returns an order item property by the given ID.
     *
     * @param IdType $orderItemPropertyId ID of order item property.
     *
     * @return StoredOrderItemProperty Fetched order item property.
     * @throws UnexpectedValueException If no entry has been found.
     */
    public function getPropertyById(IdType $orderItemPropertyId)
    {
        $data = $this->db->where($this->key, $orderItemPropertyId->asInt())->get($this->table)->row_array();
        
        if(empty($data))
        {
            throw new UnexpectedValueException('No order item property record matches the provided $orderItemPropertyId: '
                                               . $orderItemPropertyId->asInt());
        }
        
        return $this->_createStoredOrderItemProperty($data);
    }
    
    
    /**
     * Returns a collection of order item properties by the given order item ID.
     *
     * @param IdType $orderItemId ID of the order item.
     *
     * @return StoredOrderItemAttributeCollection Fetched order item attribute collection.
     */
    public function getPropertiesByOrderItemId(IdType $orderItemId)
    {
        $storedOrderItemAttributes = array();
        
        $results = $this->db->where('orders_products_id', $orderItemId->asInt())->get($this->table);
        
        foreach($results->result_array() as $result)
        {
            $storedOrderItemAttributes[] = $this->_createStoredOrderItemProperty($result);
        }
        
        $storedOrderItemAttributeCollection = MainFactory::create('StoredOrderItemAttributeCollection',
                                                                  $storedOrderItemAttributes);
        
        return $storedOrderItemAttributeCollection;
    }
    

    /**
     * Created a stored order item property with data provided.
     *
     * @param array $storedOrderItemPropertyData Order item property data.
     *
     * @return StoredOrderItemProperty Created stored order item property.
     */
    protected function _createStoredOrderItemProperty(array $storedOrderItemPropertyData)
    {
        $orderItemAttributeId    = new IdType($storedOrderItemPropertyData[$this->key]);
        $storedOrderItemProperty = $this->orderItemAttributeFactory->createStoredOrderItemAttribute($orderItemAttributeId);
        $storedOrderItemProperty->setName(new StringType($storedOrderItemPropertyData['properties_name']));
        $storedOrderItemProperty->setValue(new StringType($storedOrderItemPropertyData['values_name']));
        $storedOrderItemProperty->setPrice(new DecimalType($storedOrderItemPropertyData['properties_price']));
        $storedOrderItemProperty->setPriceType(new StringType($storedOrderItemPropertyData['properties_price_type']));
        $storedOrderItemProperty->setCombisId(new IdType($storedOrderItemPropertyData['products_properties_combis_id']));
        
        return $storedOrderItemProperty;
    }
}