@@ 9-52 (lines=44) @@ | ||
6 | use OroCRM\Bundle\ChannelBundle\Entity\Channel; |
|
7 | use OroCRM\Bundle\MagentoBundle\Entity\Order; |
|
8 | ||
9 | class CustomerFrequencyProvider extends AbstractCustomerRFMProvider |
|
10 | { |
|
11 | /** |
|
12 | * {@inheritdoc} |
|
13 | */ |
|
14 | public function getType() |
|
15 | { |
|
16 | return RFMMetricCategory::TYPE_FREQUENCY; |
|
17 | } |
|
18 | ||
19 | /** |
|
20 | * {@inheritdoc} |
|
21 | */ |
|
22 | protected function getScalarValues(Channel $channel, array $ids = []) |
|
23 | { |
|
24 | $qb = $this->doctrineHelper |
|
25 | ->getEntityRepository($this->className) |
|
26 | ->createQueryBuilder('c'); |
|
27 | ||
28 | $date = new \DateTime('now', new \DateTimeZone('UTC')); |
|
29 | $qb |
|
30 | ->select('COUNT(o) as value', 'c.id') |
|
31 | ->join('c.orders', 'o') |
|
32 | ->where( |
|
33 | $qb->expr()->andX( |
|
34 | $qb->expr()->neq($qb->expr()->lower('o.status'), ':status'), |
|
35 | $qb->expr()->gte('o.createdAt', ':date'), |
|
36 | $qb->expr()->eq('c.dataChannel', ':channel') |
|
37 | ) |
|
38 | ) |
|
39 | ->groupBy('c.id') |
|
40 | ->orderBy($qb->expr()->asc('c.id')) |
|
41 | ->setParameter('status', Order::STATUS_CANCELED) |
|
42 | ->setParameter('channel', $channel) |
|
43 | ->setParameter('date', $date->sub(new \DateInterval('P365D'))); |
|
44 | ||
45 | if (!empty($ids)) { |
|
46 | $qb->andWhere($qb->expr()->in('c.id', ':ids')) |
|
47 | ->setParameter('ids', $ids); |
|
48 | } |
|
49 | ||
50 | return $qb->getQuery()->getScalarResult(); |
|
51 | } |
|
52 | } |
|
53 |
@@ 9-55 (lines=47) @@ | ||
6 | use OroCRM\Bundle\ChannelBundle\Entity\Channel; |
|
7 | use OroCRM\Bundle\MagentoBundle\Entity\Order; |
|
8 | ||
9 | class CustomerMonetaryProvider extends AbstractCustomerRFMProvider |
|
10 | { |
|
11 | /** |
|
12 | * {@inheritdoc} |
|
13 | */ |
|
14 | public function getType() |
|
15 | { |
|
16 | return RFMMetricCategory::TYPE_MONETARY; |
|
17 | } |
|
18 | ||
19 | /** |
|
20 | * {@inheritdoc} |
|
21 | */ |
|
22 | protected function getScalarValues(Channel $channel, array $ids = []) |
|
23 | { |
|
24 | $date = new \DateTime('now', new \DateTimeZone('UTC')); |
|
25 | $qb = $this->doctrineHelper |
|
26 | ->getEntityRepository($this->className) |
|
27 | ->createQueryBuilder('c'); |
|
28 | ||
29 | $qb |
|
30 | ->select('SUM( |
|
31 | CASE WHEN o.subtotalAmount IS NOT NULL THEN o.subtotalAmount ELSE 0 END - |
|
32 | CASE WHEN o.discountAmount IS NOT NULL THEN ABS(o.discountAmount) ELSE 0 END |
|
33 | ) as value', 'c.id') |
|
34 | ->join('c.orders', 'o') |
|
35 | ->where( |
|
36 | $qb->expr()->andX( |
|
37 | $qb->expr()->neq($qb->expr()->lower('o.status'), ':status'), |
|
38 | $qb->expr()->gte('o.createdAt', ':date'), |
|
39 | $qb->expr()->eq('c.dataChannel', ':channel') |
|
40 | ) |
|
41 | ) |
|
42 | ->groupBy('c.id') |
|
43 | ->orderBy($qb->expr()->asc('c.id')) |
|
44 | ->setParameter('status', Order::STATUS_CANCELED) |
|
45 | ->setParameter('channel', $channel) |
|
46 | ->setParameter('date', $date->sub(new \DateInterval('P365D'))); |
|
47 | ||
48 | if (!empty($ids)) { |
|
49 | $qb->andWhere($qb->expr()->in('c.id', ':ids')) |
|
50 | ->setParameter('ids', $ids); |
|
51 | } |
|
52 | ||
53 | return $qb->getQuery()->getScalarResult(); |
|
54 | } |
|
55 | } |
|
56 |