Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
48.44% covered (danger)
48.44%
31 / 64
50.00% covered (danger)
50.00%
5 / 10
CRAP
0.00% covered (danger)
0.00%
0 / 1
SendNotificationReminder
48.44% covered (danger)
48.44%
31 / 64
50.00% covered (danger)
50.00%
5 / 10
74.84
0.00% covered (danger)
0.00%
0 / 1
 __construct
58.33% covered (warning)
58.33%
7 / 12
0.00% covered (danger)
0.00%
0 / 1
5.16
 log
50.00% covered (danger)
50.00%
1 / 2
0.00% covered (danger)
0.00%
0 / 1
2.50
 getCount
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 setLimit
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 setLoopCount
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 startProcessing
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 writeNotificationReminderList
100.00% covered (success)
100.00%
10 / 10
100.00% covered (success)
100.00%
1 / 1
1
 writeByCallback
70.00% covered (warning)
70.00%
7 / 10
0.00% covered (danger)
0.00%
0 / 1
4.43
 writeReminder
0.00% covered (danger)
0.00%
0 / 16
0.00% covered (danger)
0.00%
0 / 1
6
 deleteReminderTimestamp
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
12
1<?php
2
3namespace BO\Zmsdb\Helper;
4
5use BO\Zmsdb\Log;
6use BO\Zmsdb\Config as ConfigRepository;
7
8class SendNotificationReminder
9{
10    protected $datetime;
11
12    protected $reminderInSeconds;
13
14    protected $verbose = false;
15
16    protected $limit = 5000;
17
18    protected $loopCount = 500;
19
20    protected $count = 0;
21
22    public function __construct(\DateTimeInterface $now, $verbose = false)
23    {
24        $config = (new ConfigRepository())->readEntity();
25        $configLimit = $config->getPreference('notifications', 'sqlMaxLimit');
26        $configBatchSize = $config->getPreference('notifications', 'sqlBatchSize');
27        $this->limit = ($configLimit) ? $configLimit : $this->limit;
28        $this->loopCount  = ($configBatchSize) ? $configBatchSize : $this->loopCount;
29        $this->dateTime = $now;
30        if ($verbose) {
31            $this->verbose = true;
32            $this->log(
33                "\nINFO: Send notification reminder (Limits: " .
34                $configLimit . "|" . $configBatchSize . ") dependent on lead time"
35            );
36        }
37    }
38
39    protected function log($message)
40    {
41        if ($this->verbose) {
42            error_log(trim($message));
43        }
44    }
45
46    public function getCount()
47    {
48        return $this->count;
49    }
50
51    public function setLimit($limit)
52    {
53        $this->limit = $limit;
54    }
55
56    public function setLoopCount($loopCount)
57    {
58        $this->loopCount = $loopCount;
59    }
60
61    public function startProcessing($commit)
62    {
63        $this->writeNotificationReminderList($commit);
64        $this->log("\nINFO: Last run " . $this->dateTime->format('Y-m-d H:i:s'));
65        $this->log("SUMMARY: Sent notification reminder: " . $this->count);
66    }
67
68    protected function writeNotificationReminderList($commit)
69    {
70        // The offset parameter was removed here, because with each loop the processes are searched, which have not
71        // been processed yet. An offset leads to the fact that with the renewed search the first results are skipped.
72        $count = $this->writeByCallback($commit, function ($limit) {
73            $processList = (new \BO\Zmsdb\Process())->readNotificationReminderProcessList(
74                $this->dateTime,
75                $limit,
76                null,
77                1
78            );
79            return $processList;
80        });
81        $this->count += $count;
82    }
83
84    protected function writeByCallback($commit, \Closure $callback)
85    {
86        $processCount = 0;
87        while ($processCount < $this->limit) {
88            $this->log("***Stack count***: " . $processCount);
89            $processList = $callback($this->loopCount);
90            if (0 == $processList->count()) {
91                break;
92            }
93            foreach ($processList as $process) {
94                $this->writeReminder($process, $commit, $processCount);
95                $processCount++;
96            }
97        }
98        return $processCount;
99    }
100
101    protected function writeReminder(\BO\Zmsentities\Process $process, $commit, $processCount)
102    {
103        $config = (new \BO\Zmsdb\Config())->readEntity();
104        $department = (new \BO\Zmsdb\Department())->readByScopeId($process->getScopeId(), 2);
105        $entity = (new \BO\Zmsentities\Notification())->toResolvedEntity($process, $config, $department, 'reminder');
106
107        $this->log("INFO: $processCount Create notification: $entity->message");
108        if ($commit) {
109            $notification = (new \BO\Zmsdb\Notification())->writeInQueue($entity, $this->dateTime);
110            Log::writeProcessLog(
111                "Write Reminder (Notification::writeInQueue) $entity ",
112                Log::ACTION_SEND_REMINDER,
113                $process
114            );
115            $this->log(
116                "INFO: $processCount Notification has been written in queue successfully with ID " .
117                $notification->getId()
118            );
119            $this->deleteReminderTimestamp($process, $notification, $processCount, $commit);
120        }
121    }
122
123    protected function deleteReminderTimestamp(
124        \BO\Zmsentities\Process $process,
125        $notification,
126        $processCount,
127        $commit
128    ) {
129        if ($notification) {
130            $process->reminderTimestamp = 0;
131            if ($commit) {
132                $process = (new \BO\Zmsdb\Process())->updateEntity($process, $this->dateTime);
133            }
134            $this->log("INFO: $processCount Updated $process->id - reminder timestamp removed");
135        } else {
136            $this->log(
137                "WARNING: $processCount Notification for $process->id not possible - no telephone or not enabled"
138            );
139        }
140    }
141}