TransactionDateFactory::getDayOfMonth()   A
last analyzed

Complexity

Conditions 2
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 1
nc 1
nop 0
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * This file is part of byrokrat\giroapp.
5
 *
6
 * byrokrat\giroapp is free software: you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License as published
8
 * by the Free Software Foundation, either version 3 of the License, or
9
 * (at your option) any later version.
10
 *
11
 * byrokrat\giroapp is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with byrokrat\giroapp. If not, see <http://www.gnu.org/licenses/>.
18
 *
19
 * Copyright 2016-21 Hannes Forsgård
20
 */
21
22
declare(strict_types=1);
23
24
namespace byrokrat\giroapp\Domain\State;
25
26
use byrokrat\giroapp\Config\ConfigInterface;
27
use byrokrat\giroapp\Utils\SystemClock;
28
29
class TransactionDateFactory
30
{
31
    /**
32
     * Default day of month of created date
33
     */
34
    public const DEFAULT_DAY_OF_MONTH = 28;
35
36
    /**
37
     * Default value for minimal number of days in the future
38
     */
39
    public const DEFAULT_MIN_DAYS_IN_FUTURE = 4;
40
41
    /**
42
     * @var SystemClock
43
     */
44
    private $systemClock;
45
46
    /**
47
     * @var ConfigInterface
48
     */
49
    private $dayOfMonth;
50
51
    /**
52
     * @var ConfigInterface
53
     */
54
    private $minDaysInFuture;
55
56
    public function __construct(
57
        SystemClock $systemClock,
58
        ConfigInterface $dayOfMonth,
59
        ConfigInterface $minDaysInFuture
60
    ) {
61
        $this->systemClock = $systemClock;
62
        $this->dayOfMonth = $dayOfMonth;
63
        $this->minDaysInFuture = $minDaysInFuture;
64
    }
65
66
    /**
67
     * Calculate the date of next possible transaction date based on requested day of month
68
     */
69
    public function createNextTransactionDate(): \DateTimeImmutable
70
    {
71
        $currentDate = $this->systemClock->getNow();
72
73
        $createdDate = new \DateTime($currentDate->format('Ym') . $this->getDayOfMonth());
74
75
        if ($createdDate->diff($currentDate)->format('%d') < $this->getMinDaysInFuture()) {
76
            $createdDate->add(new \DateInterval('P1M'));
77
        }
78
79
        return \DateTimeImmutable::createFromMutable($createdDate);
80
    }
81
82
    private function getDayOfMonth(): int
83
    {
84
        return (int)$this->dayOfMonth->getValue() ?: self::DEFAULT_DAY_OF_MONTH;
85
    }
86
87
    private function getMinDaysInFuture(): int
88
    {
89
        return (int)$this->minDaysInFuture->getValue() ?: self::DEFAULT_MIN_DAYS_IN_FUTURE;
90
    }
91
}
92