Completed
Push — currency-cookie ( 8ef560...28b724 )
by Kamil
24:47
created

SequentialOrderNumberGenerator::getSequence()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 14
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 14
rs 9.4285
cc 2
eloc 7
nc 2
nop 0
1
<?php
2
3
/*
4
 * This file is a part of the Sylius package.
5
 *
6
 * (c) Paweł Jędrzejewski
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Sylius\Bundle\CoreBundle\Order\NumberGenerator;
13
14
use Doctrine\DBAL\LockMode;
15
use Doctrine\ORM\EntityManagerInterface;
16
use Sylius\Bundle\OrderBundle\NumberGenerator\OrderNumberGeneratorInterface;
17
use Sylius\Component\Order\Model\OrderInterface;
18
use Sylius\Component\Order\Model\OrderSequenceInterface;
19
use Sylius\Component\Resource\Factory\FactoryInterface;
20
use Sylius\Component\Resource\Repository\RepositoryInterface;
21
22
/**
23
 * @author Grzegorz Sadowski <[email protected]>
24
 */
25
final class SequentialOrderNumberGenerator implements OrderNumberGeneratorInterface
26
{
27
    /**
28
     * @var RepositoryInterface
29
     */
30
    private $sequenceRepository;
31
32
    /**
33
     * @var FactoryInterface
34
     */
35
    private $sequenceFactory;
36
37
    /**
38
     * @var EntityManagerInterface
39
     */
40
    private $sequenceManager;
41
42
    /**
43
     * @var int
44
     */
45
    private $startNumber;
46
47
    /**
48
     * @var int
49
     */
50
    private $numberLength;
51
52
    /**
53
     * @param RepositoryInterface $sequenceRepository
54
     * @param FactoryInterface $sequenceFactory
55
     * @param EntityManagerInterface $sequenceManager
56
     * @param int $startNumber
57
     * @param int $numberLength
58
     */
59
    public function __construct(
60
        RepositoryInterface $sequenceRepository,
61
        FactoryInterface $sequenceFactory,
62
        EntityManagerInterface $sequenceManager,
63
        $startNumber = 1,
64
        $numberLength = 9
65
    ) {
66
        $this->sequenceRepository = $sequenceRepository;
67
        $this->sequenceFactory = $sequenceFactory;
68
        $this->sequenceManager = $sequenceManager;
69
        $this->startNumber = $startNumber;
70
        $this->numberLength = $numberLength;
71
    }
72
73
    /**
74
     * {@inheritdoc}
75
     */
76
    public function generate(OrderInterface $order)
77
    {
78
        $sequence = $this->getSequence();
79
80
        $this->sequenceManager->lock($sequence, LockMode::OPTIMISTIC, $sequence->getVersion());
81
        
82
        $number = $this->generateNumber($sequence->getIndex());
83
        $sequence->incrementIndex();
84
        
85
        return $number;
86
    }
87
88
    /**
89
     * @param int $index
90
     *
91
     * @return string
92
     */
93
    private function generateNumber($index)
94
    {
95
        $number = $this->startNumber + $index;
96
97
        return str_pad($number, $this->numberLength, 0, STR_PAD_LEFT);
98
    }
99
100
    /**
101
     * @return OrderSequenceInterface
102
     */
103
    private function getSequence()
104
    {
105
        /** @var OrderSequenceInterface $sequence */
106
        $sequence = $this->sequenceRepository->findOneBy([]);
107
108
        if (null !== $sequence) {
109
            return $sequence;
110
        }
111
112
        $sequence = $this->sequenceFactory->createNew();
113
        $this->sequenceManager->persist($sequence);
114
115
        return $sequence;
116
    }
117
}
118