FillWeekTask::processOneDay()   A
last analyzed

Complexity

Conditions 4
Paths 3

Size

Total Lines 25

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 20

Importance

Changes 0
Metric Value
dl 0
loc 25
ccs 0
cts 17
cp 0
rs 9.52
c 0
b 0
f 0
cc 4
nc 3
nop 2
crap 20
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the zibios/sharep.
7
 *
8
 * (c) Zbigniew Ślązak
9
 */
10
11
namespace App\Task;
12
13
use App\Entity\Accounting\Journal;
14
use App\Entity\Accounting\JournalMove;
15
use App\Entity\Accounting\Task;
16
use App\Entity\EntityInterface;
17
use App\Entity\Parking\Member;
18
use App\Enum\Entity\JournalTypeEnum;
19
use App\Enum\Entity\TaskTypeEnum;
20
use App\Enum\Functional\ApplicationEnum;
21
22
class FillWeekTask extends AbstractTask
23
{
24
    /** @var array|EntityInterface[] */
25
    private $entitiesToSave = [];
26
27
    // -----------------------------------------------------------------------------------------------------------------
28
29
    public function run(\DateTimeImmutable $weekAnyWorkdayDate): void
30
    {
31
        $this->entitiesToSave = [];
32
        $weekWorkdaysDates = $this->getWeekWorkdaysDates($weekAnyWorkdayDate);
33
34
        $this->processAllDays(...$weekWorkdaysDates);
35
        $this->parkingReservationRepository->saveAllInTransaction(...$this->entitiesToSave);
36
    }
37
38
    // -----------------------------------------------------------------------------------------------------------------
39
40
    private function processAllDays(\DateTimeImmutable ...$dates): void
41
    {
42
        $task = new Task(TaskTypeEnum::FILL());
43
        $this->parkingReservationRepository->saveAll($task);
44
45
        foreach ($dates as $date) {
46
            $this->processOneDay($date, $task);
47
        }
48
    }
49
50
    private function processOneDay(\DateTimeImmutable $date, Task $task): void
51
    {
52
        $placesCount = $this->parkingReservationRepository->getPlacesCountAvailableForDate($date);
53
        $members = $this->parkingReservationRepository->getMembersWithMembershipForDate($date);
54
        $membersCount = \count($members);
55
56
        if (0 === $placesCount || 0 === $membersCount) {
57
            return;
58
        }
59
60
        $parkingPointsAvailable = $placesCount * ApplicationEnum::PLACE_POINTS;
61
        $pointsPerMember = (int) ceil($parkingPointsAvailable / $membersCount);
62
        $parkingPointsNormalized = $pointsPerMember * $membersCount;
63
64
        $journal = new Journal($task, JournalTypeEnum::FILL());
65
        $this->entitiesToSave[] = $journal;
66
67
        $systemMember = $this->parkingReservationRepository->getSystemMember();
68
        $journalMove = new JournalMove($journal, $systemMember, $date, $parkingPointsNormalized, 0);
69
        $this->entitiesToSave[] = $journalMove;
70
71
        foreach ($members as $member) {
72
            $this->processOneDayForMember($date, $member, $pointsPerMember, $journal);
73
        }
74
    }
75
76
    private function processOneDayForMember(
77
        \DateTimeImmutable $date,
78
        Member $member,
79
        int $pointsPerMember,
80
        Journal $journal
81
    ): void {
82
        $member->addPoints($pointsPerMember);
83
        $this->entitiesToSave[] = $member;
84
85
        $journalMove = new JournalMove($journal, $member, $date, 0, $pointsPerMember);
86
        $this->entitiesToSave[] = $journalMove;
87
    }
88
}
89