Passed
Push — master ( c6afeb...a80cbd )
by Nic
02:33
created

OrderFactory::cleanRelatedOrderData()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 1
dl 0
loc 3
rs 10
1
<?php
2
3
namespace Dynamic\Foxy\Orders\Factory;
4
5
use Dynamic\Foxy\Orders\Model\Order;
6
use SilverStripe\Core\Config\Configurable;
7
use SilverStripe\Core\Extensible;
8
use SilverStripe\Core\Injector\Injectable;
9
use SilverStripe\View\ArrayData;
10
11
/**
12
 * Class OrderFactory
13
 * @package Dynamic\Foxy\Orders\Factory
14
 */
15
class OrderFactory extends FoxyFactory
16
{
17
    use Configurable;
18
    use Extensible;
19
    use Injectable;
20
21
    /**
22
     * @var Order
23
     */
24
    private $order;
25
26
    /**
27
     * Return the Order object from a given transaction data set.
28
     *
29
     * @return Order
30
     * @throws \SilverStripe\ORM\ValidationException
31
     */
32
    public function getOrder()
33
    {
34
        if (!$this->order instanceof Order) {
0 ignored issues
show
introduced by
$this->order is always a sub-type of Dynamic\Foxy\Orders\Model\Order.
Loading history...
35
            $this->setOrder();
36
        }
37
38
        return $this->order;
39
    }
40
41
    /**
42
     * Find and update, or create new Order record and set.
43
     *
44
     * @return $this
45
     * @throws \SilverStripe\ORM\ValidationException
46
     */
47
    protected function setOrder()
48
    {
49
        /** @var ArrayData $transaction */
50
        $transaction = $this->getTransaction()->getParsedTransactionData()->getField('transaction');
51
52
        /** @var $order Order */
53
        if ($transaction->hasField('id')
54
            && !($order = Order::get()->filter('OrderID', $transaction->getField('id'))->first())) {
55
            $order = Order::create();
56
        }
57
58
        if ($order->exists()) {
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $order does not seem to be defined for all execution paths leading up to this point.
Loading history...
59
            $this->cleanRelatedOrderData($order);
60
        }
61
62
        foreach ($this->config()->get('order_mapping') as $foxy => $ssFoxy) {
63
            if ($transaction->hasField($foxy)) {
64
                $order->{$ssFoxy} = $transaction->getField($foxy);
65
            }
66
        }
67
68
        $order->write();
69
70
        $order->Details()->addMany(OrderDetailFactory::create($this->getTransaction())->getOrderDetails());
71
72
        $this->order = Order::get()->byID($order->ID);
73
74
        return $this;
75
    }
76
77
    /**
78
     * @param Order $order
79
     */
80
    private function cleanRelatedOrderData(Order $order)
81
    {
82
        $order->Details()->removeAll();
83
    }
84
}
85