OrderFactory   A
last analyzed

Complexity

Total Complexity 10

Size/Duplication

Total Lines 74
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 25
c 2
b 0
f 0
dl 0
loc 74
rs 10
wmc 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
A getOrder() 0 7 2
A cleanRelatedOrderData() 0 3 1
B setOrder() 0 34 7
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\Security\Member;
10
use SilverStripe\View\ArrayData;
11
12
/**
13
 * Class OrderFactory
14
 * @package Dynamic\Foxy\Orders\Factory
15
 */
16
class OrderFactory extends FoxyFactory
17
{
18
    use Configurable;
19
    use Extensible;
20
    use Injectable;
21
22
    /**
23
     * @var Order
24
     */
25
    private $order;
26
27
    /**
28
     * Return the Order object from a given transaction data set.
29
     *
30
     * @return Order
31
     * @throws \SilverStripe\ORM\ValidationException
32
     */
33
    public function getOrder()
34
    {
35
        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...
36
            $this->setOrder();
37
        }
38
39
        return $this->order;
40
    }
41
42
    /**
43
     * Find and update, or create new Order record and set.
44
     *
45
     * @return $this
46
     * @throws \SilverStripe\ORM\ValidationException
47
     */
48
    protected function setOrder()
49
    {
50
        /** @var ArrayData $transaction */
51
        $transaction = $this->getTransaction()->getParsedTransactionData()->getField('transaction');
52
53
        /** @var $order Order */
54
        if ($transaction->hasField('id')
55
            && !($order = Order::get()->filter('OrderID', $transaction->getField('id'))->first())) {
56
            $order = Order::create();
57
        }
58
59
        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...
60
            $this->cleanRelatedOrderData($order);
61
        }
62
63
        foreach ($this->config()->get('order_mapping') as $foxy => $ssFoxy) {
64
            if ($transaction->hasField($foxy)) {
65
                $order->{$ssFoxy} = $transaction->getField($foxy);
66
            }
67
        }
68
69
        if ($member = Member::get()->filter('Email', $order->Email)->first()) {
70
            $order->MemberID = $member->ID;
71
        }
72
73
        $order->Response = urlencode($this->getTransaction()->getEncryptedData());
74
75
        $order->write();
76
77
        $order->Details()->addMany(OrderDetailFactory::create($this->getTransaction())->getOrderDetails());
78
79
        $this->order = Order::get()->byID($order->ID);
80
81
        return $this;
82
    }
83
84
    /**
85
     * @param Order $order
86
     */
87
    private function cleanRelatedOrderData(Order $order)
88
    {
89
        $order->Details()->removeAll();
90
    }
91
}
92