Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
78.34% covered (warning)
78.34%
123 / 157
66.67% covered (warning)
66.67%
10 / 15
CRAP
0.00% covered (danger)
0.00%
0 / 1
Mail
78.34% covered (warning)
78.34%
123 / 157
66.67% covered (warning)
66.67%
10 / 15
47.44
0.00% covered (danger)
0.00%
0 / 1
 readEntity
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
3
 readEntities
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 1
12
 readEntitiesIds
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
2
 readList
100.00% covered (success)
100.00%
13 / 13
100.00% covered (success)
100.00%
1 / 1
3
 readListIds
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
2
 readResolvedReferences
100.00% covered (success)
100.00%
14 / 14
100.00% covered (success)
100.00%
1 / 1
3
 writeInQueueWithAdmin
100.00% covered (success)
100.00%
18 / 18
100.00% covered (success)
100.00%
1 / 1
1
 writeInQueue
96.15% covered (success)
96.15%
25 / 26
0.00% covered (danger)
0.00%
0 / 1
7
 writeInQueueWithDailyProcessList
100.00% covered (success)
100.00%
16 / 16
100.00% covered (success)
100.00%
1 / 1
1
 writeMimeparts
100.00% covered (success)
100.00%
18 / 18
100.00% covered (success)
100.00%
1 / 1
6
 deleteEntity
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 deleteEntities
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 readReminderLastRun
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
2
 writeReminderLastRun
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 readMultiPartByQueueId
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3namespace BO\Zmsdb;
4
5use BO\Zmsentities\Mail as Entity;
6use BO\Zmsentities\Mimepart;
7use BO\Zmsentities\Process as ProcessEntity;
8use BO\Zmsentities\Collection\MailList as Collection;
9
10/**
11 *
12 * @SuppressWarnings(CouplingBetweenObjects)
13 */
14class Mail extends Base
15{
16    /**
17     * Fetch status from db
18     *
19     * @return \BO\Zmsentities\Mail
20     */
21    public function readEntity($itemId, $resolveReferences = 1)
22    {
23        $query = new Query\MailQueue(Query\Base::SELECT);
24        $query->addEntityMapping()
25            ->addResolvedReferences($resolveReferences)
26            ->addConditionItemId($itemId);
27        $mail = $this->fetchOne($query, new Entity());
28        if ($mail && $mail->hasId()) {
29            $mail = $this->readResolvedReferences($mail, $resolveReferences);
30        }
31        return $mail;
32    }
33
34    public function readEntities(array $itemIds, $resolveReferences = 1, $limit = 300, $order = 'ASC')
35    {
36        $mailList = new Collection();
37        $query = new Query\MailQueue(Query\Base::SELECT);
38        $query->addEntityMapping()
39              ->addResolvedReferences($resolveReferences)
40              ->addWhereIn('id', $itemIds)
41              ->addOrderBy('createTimestamp', $order)
42              ->addLimit($limit);
43        $result = $this->fetchList($query, new Entity());
44
45        foreach ($result as $item) {
46            $entity = new Entity($item);
47            $entity = $this->readResolvedReferences($entity, $resolveReferences);
48            if ($entity instanceof Entity) {
49                $mailList->addEntity($entity);
50            }
51        }
52
53        return $mailList;
54    }
55
56
57    public function readEntitiesIds(array $itemIds, $resolveReferences = 1, $limit = 300, $order = 'ASC')
58    {
59
60        $query = new Query\MailQueue(Query\Base::SELECT);
61        $query->selectFields(['id', 'createTimestamp'])
62              ->addEntityMapping()
63              ->addResolvedReferences($resolveReferences)
64              ->addWhereIn('id', $itemIds)
65              ->addOrderBy('createTimestamp', $order)
66              ->addLimit($limit);
67
68        return $this->fetchList($query, new Entity());
69    }
70
71    public function readList($resolveReferences = 1, $limit = 300, $order = 'ASC')
72    {
73        $mailList = new Collection();
74        $query = new Query\MailQueue(Query\Base::SELECT);
75        $query->addEntityMapping()
76              ->addResolvedReferences($resolveReferences)
77              ->addOrderBy('createTimestamp', $order)
78              ->addLimit($limit);
79        $result = $this->fetchList($query, new Entity());
80
81        foreach ($result as $item) {
82            $entity = new Entity($item);
83            $entity = $this->readResolvedReferences($entity, $resolveReferences);
84            if ($entity instanceof Entity) {
85                $mailList->addEntity($entity);
86            }
87        }
88
89        return $mailList;
90    }
91
92
93    public function readListIds($resolveReferences = 1, $limit = 300, $order = 'ASC')
94    {
95        $query = new Query\MailQueue(Query\Base::SELECT);
96        $query->selectFields(['id', 'createTimestamp'])
97              ->addEntityMapping()
98              ->addResolvedReferences($resolveReferences)
99              ->addOrderBy('createTimestamp', $order)
100              ->addLimit($limit);
101
102        return $this->fetchList($query, new Entity());
103    }
104
105
106
107    public function readResolvedReferences(\BO\Zmsentities\Schema\Entity $mail, $resolveReferences)
108    {
109        $multiPart = $this->readMultiPartByQueueId($mail->id);
110        $mail->addMultiPart($multiPart);
111        if (1 <= $resolveReferences) {
112            $processQuery = new \BO\Zmsdb\Process();
113            $authData = $processQuery->readAuthKeyByProcessId($mail->process['id']);
114            $mail->process = $processQuery
115                ->readEntity(
116                    $mail->process['id'],
117                    is_array($authData) ? $authData['authKey'] : null,
118                    $resolveReferences - 1
119                );
120            $mail->department = (new \BO\Zmsdb\Department())
121                ->readEntity($mail->department['id'], $resolveReferences - 1);
122        }
123        return $mail;
124    }
125
126    public function writeInQueueWithAdmin(Entity $mail)
127    {
128        $query = new Query\MailQueue(Query\Base::INSERT);
129        $process = new \BO\Zmsentities\Process($mail->process);
130        $department = (new Department())->readByScopeId($process->getScopeId(), 0);
131        $query->addValues(
132            array(
133                'processID' => $mail->process['id'],
134                'departmentID' => $department->toProperty()->id->get(),
135                'createIP' => $mail->createIP,
136                'createTimestamp' => time(),
137                'subject' => $mail->subject,
138                'clientFamilyName' => $process->scope['contact']['name'],
139                'clientEmail' => $process->scope['contact']['email']
140            )
141        );
142        $this->writeItem($query);
143        $queueId = $this->getWriter()->lastInsertId();
144        $this->writeMimeparts($queueId, $mail->multipart);
145        return $this->readEntity($queueId);
146    }
147
148    public function writeInQueue(Entity $mail, \DateTimeInterface $dateTime, $count = true)
149    {
150        $query = new Query\MailQueue(Query\Base::INSERT);
151        $process = new \BO\Zmsentities\Process($mail->process);
152        $client = $mail->getFirstClient();
153        if (! $client->hasEmail()) {
154            throw new Exception\Mail\ClientWithoutEmail();
155        }
156        $department = ($mail->department && $mail->department->hasId()) ?
157            $mail->department :
158            (new Department())->readByScopeId($process->getScopeId(), 0);
159        $query->addValues(
160            array(
161                'processID' => $mail->process['id'],
162                'departmentID' => $department->getId(),
163                'createIP' => $mail->createIP,
164                'createTimestamp' => ($dateTime) ? $dateTime->format('U') : time(),
165                'subject' => $mail->subject,
166                'clientFamilyName' => $client->familyName,
167                'clientEmail' => $client->email
168            )
169        );
170        $success = $this->writeItem($query);
171        $queueId = $this->getWriter()->lastInsertId();
172        if ($count && $success) {
173            $client->emailSendCount += 1;
174            (new Process())->updateEntity($process, $dateTime);
175        }
176        $this->writeMimeparts($queueId, $mail->multipart);
177        return $this->readEntity($queueId);
178    }
179
180    public function writeInQueueWithDailyProcessList(
181        \BO\Zmsentities\Scope $scope,
182        Entity $mail
183    ) {
184        $query = new Query\MailQueue(Query\Base::INSERT);
185        $department = (new Department())->readByScopeId($scope->getId(), 0);
186        $query->addValues(
187            array(
188                'departmentID' => $department->toProperty()->id->get(),
189                'createTimestamp' => time(),
190                'createIP' => $mail->createIP,
191                'subject' => $mail->subject,
192                'clientFamilyName' => $mail->client->familyName,
193                'clientEmail' => $mail->client->email
194            )
195        );
196        $this->writeItem($query);
197        $queueId = $this->getWriter()->lastInsertId();
198        $this->writeMimeparts($queueId, $mail->multipart);
199        return $this->readEntity($queueId);
200    }
201
202    protected function writeMimeparts($queueId, $multipart)
203    {
204        $success = true;
205        foreach ($multipart as $part) {
206            $query = new Query\Mimepart(Query\Base::INSERT);
207            $query->addValues(
208                array(
209                    'queueId' => $queueId,
210                    'mime' => $part['mime'],
211                    'content' => $part['content'],
212                    'base64' => $part['base64'] ? 1 : 0
213                )
214            );
215            if (! isset($part['content']) || ! isset($part['mime']) || ! $success) {
216                $this->deleteEntity($queueId);
217                throw new Exception\MailWritePartFailed(
218                    'Failed to write part (' . $part['mime'] . ') of mail with id ' . $queueId
219                );
220            }
221            $success = $this->writeItem($query);
222        }
223        return true;
224    }
225
226    public function deleteEntity($itemId)
227    {
228        $query = Query\MailQueue::QUERY_DELETE;
229        $status = $this->perform($query, [$itemId]);
230        return $status;
231    }
232
233    public function deleteEntities(array $itemIds)
234    {
235        $query = Query\MailQueue::QUERY_MULTI_DELETE;
236        $placeholders = implode(',', array_fill(0, count($itemIds), '?'));
237        $query = str_replace('?', $placeholders, $query);
238        return $this->perform($query, $itemIds);
239    }
240
241    public function readReminderLastRun($now)
242    {
243        $lastRun = (new \BO\Zmsdb\Config())->readProperty('status__mailReminderLastRun', false);
244        $lastRunDateTime = ($lastRun) ? new \DateTimeImmutable($lastRun) : $now;
245        return $lastRunDateTime;
246    }
247
248    public function writeReminderLastRun($now)
249    {
250        (new \BO\Zmsdb\Config())->replaceProperty('status__mailReminderLastRun', $now->format('Y-m-d H:i:s'));
251    }
252
253    protected function readMultiPartByQueueId($queueId)
254    {
255        $query = new Query\Mimepart(Query\Base::SELECT);
256        $query->addEntityMapping()
257            ->addConditionQueueId($queueId);
258        return $this->fetchList($query, new Mimepart());
259    }
260}