Completed
Push — master ( a18731...e2e070 )
by
unknown
99:54 queued 47:45
created

WebsiteMetricsProvider   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 109
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 9
lcom 1
cbo 2
dl 0
loc 109
rs 10
c 2
b 0
f 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 7 1
A getTemplateData() 0 6 1
A getEvents() 0 9 1
B getMetrics() 0 36 4
A getEventMetrics() 0 12 2
1
<?php
2
3
namespace OroCRM\Bundle\MagentoBundle\Provider;
4
5
use OroCRM\Bundle\MagentoBundle\Entity\Customer;
6
use OroCRM\Bundle\MagentoBundle\Provider\TrackingCustomerIdentification as TCI;
7
8
/**
9
 * Calculates metrics based on tracking events.
10
 *
11
 * It uses predefined set of events and metrics.
12
 */
13
class WebsiteMetricsProvider
14
{
15
    /** @var TrackingVisitProvider */
16
    protected $visitProvider;
17
18
    /** @var TrackingVisitEventProvider */
19
    protected $visitEventProvider;
20
21
    /**
22
     * @param TrackingVisitProvider $visitProvider
23
     * @param TrackingVisitEventProvider $visitEventProvider
24
     */
25
    public function __construct(
26
        TrackingVisitProvider $visitProvider,
27
        TrackingVisitEventProvider $visitEventProvider
28
    ) {
29
        $this->visitProvider = $visitProvider;
30
        $this->visitEventProvider = $visitEventProvider;
31
    }
32
33
    /**
34
     * @param Customer[] $customers
35
     *
36
     * @return array
37
     */
38
    public function getTemplateData(array $customers)
39
    {
40
        return [
41
            'metrics' => $this->getMetrics($customers),
42
        ];
43
    }
44
45
    /**
46
     * @return string[]
47
     */
48
    protected function getEvents()
49
    {
50
        return [
51
            TCI::EVENT_VISIT,
52
            TCI::EVENT_CART_ITEM_ADDED,
53
            TCI::EVENT_CHECKOUT_STARTED,
54
            TCI::EVENT_CUSTOMER_LOGIN,
55
        ];
56
    }
57
58
    /**
59
     *
60
     * @param Customer[] $customers Filter by customers
61
     *
62
     * @return array
63
     */
64
    protected function getMetrics(array $customers)
65
    {
66
        $eventMetrics = $this->getEventMetrics($customers, $this->getEvents());
67
68
        $pageViewsCount = $eventMetrics[TCI::EVENT_VISIT]['count'];
69
        $itemsAddedCount = $eventMetrics[TCI::EVENT_CART_ITEM_ADDED]['count'];
70
        $lastItem = $eventMetrics[TCI::EVENT_CART_ITEM_ADDED]['last'];
71
        $checkoutsCount = $eventMetrics[TCI::EVENT_CHECKOUT_STARTED]['count'];
72
        $lastCheckout = $eventMetrics[TCI::EVENT_CHECKOUT_STARTED]['last'];
73
        $lastLogin = $eventMetrics[TCI::EVENT_CUSTOMER_LOGIN]['last'];
74
75
        $lastViewedPage = $this->visitEventProvider->getLastViewedPage($customers);
76
        $mostVisitedPage = $this->visitEventProvider->getMostViewedPage($customers);
77
78
        $visitMetrics = $this->visitProvider->getAggregates($customers);
79
        $visitsCount = $visitMetrics['count'];
80
81
        $metrics = [
82
            'page_view_count'         => $pageViewsCount,
83
            'checkout_count'          => $checkoutsCount,
84
            'item_added_count'        => $itemsAddedCount,
85
            'visit_count'             => $visitsCount,
86
            'average_visit_views'     => $visitsCount ? $pageViewsCount / $visitsCount : 0,
87
            'average_visit_items'     => $visitsCount ? $itemsAddedCount / $visitsCount : 0,
88
            'average_visit_checkouts' => $checkoutsCount ? $visitsCount / $checkoutsCount : 0,
89
            'average_visit_monthly'   => $visitMetrics['monthly'],
90
            'most_viewed_page'        => $mostVisitedPage,
91
            'last_viewed_page'        => $lastViewedPage,
92
            'last_login'              => $lastLogin,
93
            'last_item'               => $lastItem,
94
            'last_checkout'           => $lastCheckout,
95
            'last_visit'              => $visitMetrics['last'],
96
        ];
97
98
        return $metrics;
99
    }
100
101
    /**
102
     * Get event count and last date of occurrence grouped by event name
103
     *
104
     * @param Customer[] $customers Filter by customers
105
     * @param string[] $eventNames Filter by event names
106
     *
107
     * @return array
108
     */
109
    protected function getEventMetrics(array $customers, array $eventNames)
110
    {
111
        $defaults = [];
112
        foreach ($eventNames as $eventName) {
113
            $defaults[$eventName] = ['count' => 0, 'last' => null];
114
        }
115
116
        $metrics = $this->visitEventProvider
117
            ->getCustomerEventAggregates($customers, $eventNames);
118
119
        return $metrics + $defaults;
120
    }
121
}
122