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 129 130 131 132 133 134 135 136 137 138 139 140 141 142 
<?php
/* --------------------------------------------------------------
 ParcelTrackingCodeFactory.inc.php 2018-01-15
 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 ParcelTrackingCodeFactory
 */
class ParcelTrackingCodeFactory
{
    /**
     * @var \ParcelTrackingCodeRepository
     */
    private $repository;
    
    /**
     * @var \ParcelTrackingCodeDeleteService
     */
    private $deleteService;
    
    /**
     * @var \ParcelTrackingCodeFinder
     */
    private $finder;
    
    
    /**
     * Creates an active record version of the parcel tracking code entity.
     *
     * @param \ParcelTrackingCodeServiceId  $parcelServiceId Id of related parcel service.
     * @param \ParcelTrackingCodeOrderId    $orderId         Id of related order.
     * @param \OrderParcelTrackingCode      $trackingCode    Parcel tracking code of order.
     * @param \ParcelTrackingCodeLanguageId $languageId      Language id, used to fetch language specific descriptions.
     *
     * @return \ActiveRecordParcelTrackingCode New parcel tracking code entity with active record functionality.
     */
    public function create(ParcelTrackingCodeServiceId $parcelServiceId,
                           ParcelTrackingCodeOrderId $orderId,
                           OrderParcelTrackingCode $trackingCode,
                           ParcelTrackingCodeLanguageId $languageId)
    {
        return MainFactory::create('ActiveRecordParcelTrackingCode', $this->trackingCodeRepository(),
                                   GXParcelTrackingCode::create($parcelServiceId, $orderId, $trackingCode,
                                                                $languageId));
    }
    
    
    /**
     * Creates an active record version of the parcel tracking code entity with lightweight data.
     *
     * @param \ParcelTrackingCodeOrderId      $orderId Id of related order.
     * @param \ParcelTrackingCodeServiceName  $name    Name of parcel service.
     * @param \ParcelTrackingCodeUrl          $url     Parcel tracking code url.
     * @param \ParcelTrackingCodeComment|null $comment Optional comment for parcel tracking code.
     *
     * @return \ActiveRecordParcelTrackingCode New parcel tracking code entity with active record functionality.
     */
    public function createLightweight(ParcelTrackingCodeOrderId $orderId,
                                      ParcelTrackingCodeServiceName $name,
                                      ParcelTrackingCodeUrl $url,
                                      ParcelTrackingCodeComment $comment = null)
    {
        return MainFactory::create('ActiveRecordParcelTrackingCode', $this->trackingCodeRepository(),
                                   GXParcelTrackingCode::createLightweight($orderId, $name, $url, $comment));
    }
    
    
    /**
     * Creates an active record version of the given parcel tracking code entity.
     *
     * @param \GXParcelTrackingCode $trackingCode Entity to be enriched with AR functionality.
     *
     * @return \ActiveRecordParcelTrackingCode New parcel tracking code entity with active record functionality.
     */
    public function createFrom(GXParcelTrackingCode $trackingCode)
    {
        return MainFactory::create('ActiveRecordParcelTrackingCode', $this->trackingCodeRepository(), $trackingCode);
    }
    
    
    /**
     * Creates and returns a delete service for parcel tracking codes.
     * The service will be cached in memory.
     *
     * @return \ParcelTrackingCodeDeleteService Service for delete operations in the parcel tracking code domain.
     */
    public function deleteService()
    {
        if(null === $this->deleteService)
        {
            $this->deleteService = MainFactory::create('ParcelTrackingCodeDeleteService',
                                                       $this->trackingCodeRepository());
        }
        
        return $this->deleteService;
    }
    
    
    /**
     * Creates and returns a parcel tracking code finder.
     * The finder will be cached in memory.
     *
     * @return \ParcelTrackingCodeFinder Search component to find parcel tracking codes.
     */
    public function finder()
    {
        if(null === $this->finder)
        {
            $this->finder = MainFactory::create('ParcelTrackingCodeFinder',
                                                StaticGXCoreLoader::getDatabaseQueryBuilder());
        }
        
        return $this->finder;
    }
    
    
    /**
     * Creates and returns the parcel tracking code repository.
     * The repository will be cached in memory.
     *
     * @return \ParcelTrackingCodeRepository Access to data layer of domain.
     */
    protected function trackingCodeRepository()
    {
        if(null === $this->repository)
        {
            $db      = StaticGXCoreLoader::getDatabaseQueryBuilder();
            $writer  = new GXParcelTrackingCodeWriter($db);
            $deleter = new ParcelTrackingCodeDeleter($db);
            
            $this->repository = new ParcelTrackingCodeRepository($writer, $deleter);
        }
        
        return $this->repository;
    }
}