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 
<?php
/* --------------------------------------------------------------
   WithdrawalReader.inc.php 2018-01-08
   Gambio GmbH
   http://www.gambio.de
   Copyright (c) 2018 Gambio GmbH
   Released under the GNU General Public License (Version 2)
   [http://www.gnu.org/licenses/gpl-2.0.html]
   --------------------------------------------------------------
*/

/**
 * Class WithdrawalReader
 *
 * @category   System
 * @package    Withdrawal
 * @subpackage Repositories
 */
class WithdrawalReader implements WithdrawalReaderInterface
{
    /**
     * @var \CI_DB_query_builder
     */
    protected $queryBuilder;
    
    
    /**
     * WithdrawalReader constructor.
     *
     * @param \CI_DB_query_builder $queryBuilder
     */
    public function __construct(CI_DB_query_builder $queryBuilder)
    {
        $this->queryBuilder = $queryBuilder;
    }
    
    
    /**
     * Returns all withdrawal entities as array
     *
     * @return array
     */
    public function getAll()
    {
        $result = [];
        foreach($this->queryBuilder->get('withdrawals')->result_array() as $withdrawalData)
        {
            $withdrawal = [
                'id'             => (int)$withdrawalData['withdrawal_id'],
                'date'           => $withdrawalData['withdrawal_date'],
                'content'        => $withdrawalData['withdrawal_content'],
                'dateCreated'    => $withdrawalData['date_created'],
                'createdByAdmin' => $withdrawalData['created_by_admin'],
                'order'          => $this->_getOrderData($withdrawalData)
            ];
            
            $result[] = $withdrawal;
        }
        
        return $result;
    }
    
    
    /**
     * Returns withdrawal entity data by the given id.
     *
     * @param \IdType $withdrawalId
     *
     * @throws \EntityNotFoundException
     *
     * @return array
     */
    public function getById(IdType $withdrawalId)
    {
        $rawData = $this->queryBuilder->select()
                                      ->from('withdrawals')
                                      ->where('withdrawal_id', $withdrawalId->asInt())
                                      ->get()
                                      ->result_array() ? : [];
        
        if(count($rawData) === 0)
        {
            throw new EntityNotFoundException('Withdrawal entity was not found with provided id "'
                                              . $withdrawalId->asInt() . '"');
        }
        
        $result = ['id' => $withdrawalId->asInt()];
        foreach($rawData as $data)
        {
            $result['date']           = $data['withdrawal_date'];
            $result['content']        = $data['withdrawal_content'];
            $result['dateCreated']    = $data['date_created'];
            $result['createdByAdmin'] = $data['created_by_admin'];
            $result['order']          = $this->_getOrderData($data);
        }
        
        return $result;
    }
    
    
    /**
     * Returns WithdrawalOrder.
     *
     * @param array $OrderData
     *
     * @return array
     */
    private function _getOrderData(array $OrderData)
    {
        return [
            'orderId'      => $OrderData['order_id'],
            'customerId'   => $OrderData['customer_id'],
            'gender'       => $OrderData['customer_gender'],
            'firstName'    => $OrderData['customer_firstname'],
            'lastName'     => $OrderData['customer_lastname'],
            'address'      => $OrderData['customer_street_address'],
            'postCode'     => $OrderData['customer_postcode'],
            'city'         => $OrderData['customer_city'],
            'country'      => $OrderData['customer_country'],
            'email'        => $OrderData['customer_email'],
            'orderDate'    => $OrderData['order_date'],
            'deliveryDate' => $OrderData['delivery_date']
        
        ];
    }
}