Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
n/a
0 / 0
n/a
0 / 0
CRAP
n/a
0 / 0
AppointmentDeallocateByCron
n/a
0 / 0
n/a
0 / 0
22
n/a
0 / 0
 __construct
n/a
0 / 0
n/a
0 / 0
2
 log
n/a
0 / 0
n/a
0 / 0
2
 getCount
n/a
0 / 0
n/a
0 / 0
1
 setLimit
n/a
0 / 0
n/a
0 / 0
1
 setLoopCount
n/a
0 / 0
n/a
0 / 0
1
 startProcessing
n/a
0 / 0
n/a
0 / 0
1
 deallocateProcessList
n/a
0 / 0
n/a
0 / 0
1
 deleteByCallback
n/a
0 / 0
n/a
0 / 0
5
 handleProcess
n/a
0 / 0
n/a
0 / 0
4
 writeDeallocatedProcess
n/a
0 / 0
n/a
0 / 0
4
1<?php
2
3namespace BO\Zmsdb\Helper;
4
5/**
6 * @codeCoverageIgnore
7 */
8class AppointmentDeallocateByCron
9{
10    protected $verbose = false;
11
12    protected $limit = 10000;
13
14    protected $loopCount = 500;
15
16    protected $time;
17
18    protected $statuslist = [
19        "deleted"
20    ];
21
22    protected $count = [];
23
24    public function __construct(\DateTimeInterface $dateTime, $verbose = false)
25    {
26        $this->time = $dateTime;
27        if ($verbose) {
28            $this->log("INFO: Deallocate cancelled appointments by scopes deallocate preference");
29            $this->verbose = true;
30        }
31    }
32
33    protected function log($message)
34    {
35        if ($this->verbose) {
36            error_log($message);
37        }
38    }
39
40    public function getCount()
41    {
42        return $this->count;
43    }
44
45    public function setLimit($limit)
46    {
47        $this->limit = $limit;
48    }
49
50    public function setLoopCount($loopCount)
51    {
52        $this->loopCount = $loopCount;
53    }
54
55    public function startProcessing($commit)
56    {
57        $this->count['deallocated'] = 0;
58        $this->deallocateProcessList($commit);
59        $this->log("\nSUMMARY: Deallocated processes: " . var_export($this->count, true));
60    }
61
62    protected function deallocateProcessList($commit)
63    {
64        $this->log("\nDeallocate cancelled processes");
65        $count = $this->deleteByCallback($commit, function ($limit, $offset) {
66            $query = new \BO\Zmsdb\Process();
67            $processList = $query->readDeallocateProcessList($this->time, $limit, $offset);
68            return $processList;
69        });
70        $this->count["deallocated"] += $count;
71    }
72
73    protected function deleteByCallback($commit, \Closure $callback)
74    {
75        $processCount = 0;
76        $startposition = 0;
77        while ($processCount < $this->limit) {
78            $processList = $callback($this->loopCount, $startposition);
79            if (0 == $processList->count()) {
80                break;
81            }
82            foreach ($processList as $process) {
83                if (!$this->handleProcess($process, $commit, $processCount)) {
84                    $startposition++;
85                }
86                $processCount++;
87            }
88        }
89        return $processCount;
90    }
91
92    protected function handleProcess(\BO\Zmsentities\Process $process, $commit, $processCount)
93    {
94        $verbose = $this->verbose;
95        if (in_array($process->status, $this->statuslist)) {
96            $this->log("INFO: $processCount. Deallocate $process");
97            if ($commit) {
98                $this->writeDeallocatedProcess($process);
99                return 1;
100            }
101        } elseif ($verbose) {
102            $this->log("INFO: Keep process $process->id");
103        }
104        return 0;
105    }
106
107    /**
108     * It is important to know that the slots in writeBlockedEntity are unblocked again,
109     * but the ID remains blocked until the next day
110     */
111    protected function writeDeallocatedProcess(\BO\Zmsentities\Process $process)
112    {
113        $verbose = $this->verbose;
114        $query = new \BO\Zmsdb\Process();
115        if ($query->writeBlockedEntity($process, true)) {
116            if ($verbose) {
117                $this->log("INFO: Process $process->id successfully deallocated");
118            }
119        } else {
120            if ($verbose) {
121                $this->log("WARN: Could not deallocate process '$process->id'!");
122            }
123        }
124    }
125}