Base::renderTemplate()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 34

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 34
ccs 0
cts 34
cp 0
rs 9.376
c 0
b 0
f 0
cc 1
nc 1
nop 8
crap 2

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
<?php
2
3
namespace NFePHP\Mail;
4
5
class Base
6
{
7
    /**
8
     * Html Templates
9
     * @var array
10
     */
11
    protected $templates = [
12
        'NFe'=> "<p><b>Prezados {destinatario},</b></p>"
13
            . "<p>Você está recebendo a Nota Fiscal Eletrônica emitida em {data} com o número "
14
            . "{numero}, de {emitente}, no valor de R$ {valor}. "
15
            . "Junto com a mercadoria, você receberá também um DANFE (Documento "
16
            . "Auxiliar da Nota Fiscal Eletrônica), que acompanha o trânsito das mercadorias.</p>"
17
            . "<p><i>Podemos conceituar a Nota Fiscal Eletrônica como um documento "
18
            . "de existência apenas digital, emitido e armazenado eletronicamente, "
19
            . "com o intuito de documentar, para fins fiscais, uma operação de "
20
            . "circulação de mercadorias, ocorrida entre as partes. Sua validade "
21
            . "jurídica garantida pela assinatura digital do remetente (garantia "
22
            . "de autoria e de integridade) e recepção, pelo Fisco, do documento "
23
            . "eletrônico, antes da ocorrência do Fato Gerador.</i></p>"
24
            . "<p><i>Os registros fiscais e contábeis devem ser feitos, a partir "
25
            . "do próprio arquivo da NF-e, anexo neste e-mail, ou utilizando o "
26
            . "DANFE, que representa graficamente a Nota Fiscal Eletrônica. "
27
            . "A validade e autenticidade deste documento eletrônico pode ser "
28
            . "verificada no site nacional do projeto (www.nfe.fazenda.gov.br), "
29
            . "através da chave de acesso contida no DANFE.</i></p>"
30
            . "<p><i>Para poder utilizar os dados descritos do DANFE na "
31
            . "escrituração da NF-e, tanto o contribuinte destinatário, "
32
            . "como o contribuinte emitente, terão de verificar a validade da NF-e. "
33
            . "Esta validade está vinculada à efetiva existência da NF-e nos "
34
            . "arquivos da SEFAZ, e comprovada através da emissão da Autorização de Uso.</i></p>"
35
            . "<p><b>O DANFE não é uma nota fiscal, nem substitui uma nota fiscal, "
36
            . "servindo apenas como instrumento auxiliar para consulta da NF-e no "
37
            . "Ambiente Nacional.</b></p>"
38
            . "<p>Para mais detalhes, consulte: <a href=\"http://www.nfe.fazenda.gov.br/\">"
39
            . "www.nfe.fazenda.gov.br</a></p>"
40
            . "<br>"
41
            . "<p>Atenciosamente,</p>"
42
            . "<p>{emitente}</p>",
43
        
44
        'CTe'=> "<p><b>Prezados {destinatario},</b></p>"
45
            . "<p>Você está recebendo um Conhecimento de Transporte Eletrônico emitido em {data} com o número "
46
            . "{numero}, de {emitente}, no valor de R$ {valor}. "
47
            . "Junto com a mercadoria, você receberá também um DACTE (Documento "
48
            . "Auxiliar do Conhecimento de Transporte Eletrônico), que acompanha o trânsito das mercadorias.</p>"
49
            . "<p><i>Podemos conceituar o CTe como um documento "
50
            . "de existência apenas digital, emitido e armazenado eletronicamente, "
51
            . "com o intuito de documentar, para fins fiscais, uma operação de "
52
            . "circulação de mercadorias, ocorrida entre as partes. Sua validade "
53
            . "jurídica garantida pela assinatura digital do remetente (garantia "
54
            . "de autoria e de integridade) e recepção, pelo Fisco, do documento "
55
            . "eletrônico, antes da ocorrência do Fato Gerador.</i></p>"
56
            . "<p><i>Os registros fiscais e contábeis devem ser feitos, a partir "
57
            . "do próprio arquivo da NF-e, anexo neste e-mail, ou utilizando o "
58
            . "DACTE, que representa graficamente o Conhecimento de Transporte Eletrônico. "
59
            . "A validade e autenticidade deste documento eletrônico pode ser "
60
            . "verificada no site nacional do projeto (www.cte.fazenda.gov.br), "
61
            . "através da chave de acesso contida no DACTE.</i></p>"
62
            . "<p><i>Para poder utilizar os dados descritos do DACTE na "
63
            . "escrituração do CT-e, tanto o contribuinte destinatário, "
64
            . "como o contribuinte emitente, terão de verificar a validade do CT-e. "
65
            . "Esta validade está vinculada à efetiva existência do CT-e nos "
66
            . "arquivos da SEFAZ, e comprovada através da emissão da Autorização de Uso.</i></p>"
67
            . "<p><b>O DACTE não é um Conhecimento de transporte, nem o substitui, "
68
            . "servindo apenas como instrumento auxiliar para consulta do CT-e no "
69
            . "Ambiente Nacional.</b></p>"
70
            . "<p>Para mais detalhes, consulte: <a href=\"http://www.cte.fazenda.gov.br/\">"
71
            . "www.cte.fazenda.gov.br</a></p>"
72
            . "<br>"
73
            . "<p>Atenciosamente,</p>"
74
            . "<p>{emitente}</p>",
75
                
76
        'CCe'=> "<p><b>Prezados,</b></p>"
77
            . "<p>Você está recebendo uma Carta de Correção referente ao nosso documento "
78
            . "{chave}.</p><p>Essa carta de correção datada de {data} procura corrigir:</p> "
79
            . "<p><b>{correcao}</b></p>"
80
            . "<p><i>{conduso}</i></p>"
81
            . "<p>Atenciosamente,</p>"
82
            . "<p>{emitente}</p>",
83
        
84
        'CTeOS' => "<p><b>Prezados {destinatario},</b></p>"
85
            . "<p>Você está recebendo um Conhecimentode Transporte Eletrônico "
86
            . "para Outros Serviços emitido em {data} com o número "
87
            . "{numero}, de {emitente}, no valor de R$ {valor}. "
88
            . "Junto com a mercadoria, você receberá também um DACTEOS (Documento "
89
            . "Auxiliar do Conhecimentode Transporte Eletrônico para Outros "
90
            . "Serviços), que acompanha o trânsito das mercadorias.</p>"
91
            . "<p><i>Podemos conceituar o CTe-OS como um documento "
92
            . "de existência apenas digital, emitido e armazenado eletronicamente, "
93
            . "com o intuito de documentar, para fins fiscais, uma operação de "
94
            . "circulação de mercadorias, ocorrida entre as partes. Sua validade "
95
            . "jurídica garantida pela assinatura digital do remetente (garantia "
96
            . "de autoria e de integridade) e recepção, pelo Fisco, do documento "
97
            . "eletrônico, antes da ocorrência do Fato Gerador.</i></p>"
98
            . "<p><i>Os registros fiscais e contábeis devem ser feitos, a partir "
99
            . "do próprio arquivo da CTe-OS, anexo neste e-mail, ou utilizando o "
100
            . "DACTEOS, que representa graficamente o Conhecimentode Transporte Eletrônico para Outros Serviços. "
101
            . "A validade e autenticidade deste documento eletrônico pode ser "
102
            . "verificada no site nacional do projeto (www.cte.fazenda.gov.br), "
103
            . "através da chave de acesso contida no DACTEOS.</i></p>"
104
            . "<p><i>Para poder utilizar os dados descritos do DACTEOS na "
105
            . "escrituração do CTe-OS, tanto o contribuinte destinatário, "
106
            . "como o contribuinte emitente, terão de verificar a validade do CT-e. "
107
            . "Esta validade está vinculada à efetiva existência do CTe-OS nos "
108
            . "arquivos da SEFAZ, e comprovada através da emissão da Autorização de Uso.</i></p>"
109
            . "<p><b>O DACTEOS não é um Conhecimento de transporte, nem o substitui, "
110
            . "servindo apenas como instrumento auxiliar para consulta do CTe-OS no "
111
            . "Ambiente Nacional.</b></p>"
112
            . "<p>Para mais detalhes, consulte: <a href=\"http://www.cte.fazenda.gov.br/\">"
113
            . "www.cte.fazenda.gov.br</a></p>"
114
            . "<br>"
115
            . "<p>Atenciosamente,</p>"
116
            . "<p>{emitente}</p>",
117
    ];
118
    
119
    /**
120
     * template user-defined
121
     * @var string
122
     */
123
    public $template;
124
    /**
125
     * Type from xml document NFe, CTe or CCe
126
     * @var string
127
     */
128
    protected $type;
129
    /**
130
     * Addresses to send mail
131
     * This array should be repeated fields removed
132
     * @var array
133
     */
134
    protected $addresses = [];
135
    /**
136
     * Assunto do email
137
     * @var string
138
     */
139
    protected $subject;
140
    /**
141
     * Fields from xml
142
     * @var \stdClass
143
     */
144
    public $fields;
145
    /**
146
     * PHPMailer class
147
     * @var \PHPMailer
148
     */
149
    protected $mail;
150
    /**
151
     * Xml content
152
     * @var string
153
     */
154
    public $xml;
155
    /**
156
     * PDF content
157
     * @var string
158
     */
159
    public $pdf;
160
    /**
161
     * config
162
     * @var \stdClass
163
     */
164
    protected $config;
165
166
    /**
167
     * Search xml for data
168
     * @param string $xml
169
     * @throws \InvalidArgumentException
170
     */
171
    protected function getXmlData($xml)
172
    {
173
        $dom = new \DOMDocument('1.0', 'UTF-8');
174
        $dom->preserveWhiteSpace = false;
175
        $dom->loadXML($xml);
176
        $root = $dom->documentElement;
177
        $name = $root->tagName;
178
        $dest = $dom->getElementsByTagName('dest')->item(0);
179
        $ide = $dom->getElementsByTagName('ide')->item(0);
180
        switch ($name) {
181
            case 'nfeProc':
182
            case 'NFe':
183
                $type = 'NFe';
184
                $infNFe = $dom->getElementsByTagName('infNFe')->item(0);
185
                $this->fields->id = substr($infNFe->getAttribute('Id'), 3) . '-' . strtolower($name);
186
                $this->fields->numero = $ide->getElementsByTagName('nNF')->item(0)->nodeValue;
187
                $this->fields->valor = $dom->getElementsByTagName('vNF')->item(0)->nodeValue;
188
                $this->fields->data = $ide->getElementsByTagName('dhEmi')->item(0)->nodeValue;
189
                $this->subject = "NFe n. {$this->fields->numero} - {$this->config->fantasy}";
190
                break;
191
            case 'cteProc':
192
            case 'CTe':
193
                $type = 'CTe';
194
                $infCte = $dom->getElementsByTagName('infCte')->item(0);
195
                $this->fields->id = substr($infCte->getAttribute('Id'), 3) . '-' . strtolower($name);
196
                $this->fields->numero = $ide->getElementsByTagName('nCT')->item(0)->nodeValue;
197
                $this->fields->valor = $dom->getElementsByTagName('vRec')->item(0)->nodeValue;
198
                $this->fields->data = $ide->getElementsByTagName('dhEmi')->item(0)->nodeValue;
199
                $this->subject = "CTe n. {$this->fields->numero} - {$this->config->fantasy}";
200
                break;
201
            case 'cteOSProc':
202
            case 'CTeOS':
203
                $type = 'CTeOS';
204
                $infCte = $dom->getElementsByTagName('infCte')->item(0);
205
                $this->fields->id = substr($infCte->getAttribute('Id'), 3) . '-' . strtolower($name);
206
                $this->fields->numero = $ide->getElementsByTagName('nCT')->item(0)->nodeValue;
207
                $this->fields->valor = $dom->getElementsByTagName('vRec')->item(0)->nodeValue;
208
                $this->fields->data = $ide->getElementsByTagName('dhEmi')->item(0)->nodeValue;
209
                $this->subject = "CTe-OS n. {$this->fields->numero} - {$this->config->fantasy}";
210
                break;
211
            case 'procEventoNFe':
212
            case 'procEventoCTe':
213
                $type = 'CCe';
214
                $this->fields->chave = $dom->getElementsByTagName('chNFe')->item(0)->nodeValue;
215
                $this->fields->id = $this->fields->chave.'-procCCe-'.strtolower(substr($name, -3));
216
                $this->fields->data = $dom->getElementsByTagName('dhEvento')->item(0)->nodeValue;
217
                $this->fields->correcao = $dom->getElementsByTagName('xCorrecao')->item(0)->nodeValue;
218
                $this->fields->conduso = $dom->getElementsByTagName('xCondUso')->item(0)->nodeValue;
219
                if (empty($this->fields->chave)) {
220
                    $this->fields->chave = $dom->getElementsByTagName('chCTe')->item(0)->nodeValue;
221
                }
222
                $this->subject = "Carta de Correção {$this->config->fantasy}";
223
                break;
224
            default:
225
                $type = '';
226
        }
227
        //get email adresses from xml, if exists
228
        //may have one address in <dest><email>
229
        if (!empty($dest)) {
230
            $this->fields->destinatario = $dest->getElementsByTagName('xNome')->item(0)->nodeValue;
231
            $email = !empty($dest->getElementsByTagName('email')->item(0)->nodeValue) ?
232
                $dest->getElementsByTagName('email')->item(0)->nodeValue : '';
233
        }
234
        if (!empty($email)) {
235
            // if recieve more than one e-mail address.
236
            if (strpos($email, ';')) {
237
                $emails = explode(';', $email);
238
239
                $emails = array_map(function ($item) {
240
                    return trim($item);
241
                }, $emails);
242
243
                $this->addresses = array_merge($this->addresses, $emails);
244
            } else {
245
                $this->addresses[] = $email;
246
            }
247
        }
248
        //may have others in <obsCont xCampo="email"><xTexto>[email protected]</xTexto>
249
        $obs = $dom->getElementsByTagName('obsCont');
250
        foreach ($obs as $ob) {
251
            if (strtoupper($ob->getAttribute('xCampo')) === 'EMAIL') {
252
                $this->addresses[] = $ob->getElementsByTagName('xTexto')->item(0)->nodeValue;
253
            }
254
        }
255
        //xml may be a NFe or a CTe or a CCe nothing else
256
        if ($type != 'NFe' && $type != 'CTe' && $type != 'CCe') {
257
            $msg = "Você deve passar apenas uma NFe ou um CTe ou um CCe. "
258
              . "Esse documento não foi reconhecido.";
259
            throw new \InvalidArgumentException($msg);
260
        }
261
        $this->type = $type;
262
    }
263
    
264
    /**
265
     * Set all addresses including those that exists in the xml document
266
     * Send email only to listed addresses ignoring all email addresses in xml
267
     * @param array $addresses
268
     * @param bool $include
269
     */
270
    protected function setAddresses(array $addresses = [], $include = true)
271
    {
272
        if (!empty($addresses)) {
273
            if (!empty($this->addresses) && $include) {
274
                $this->addresses = array_merge($this->addresses, $addresses);
275
            } else {
276
                $this->addresses = $addresses;
277
            }
278
        }
279
        $this->removeInvalidAdresses();
280
    }
281
282
    /**
283
     * Render a template with valid data
284
     * @param string $template
285
     * @param string $destinatario
286
     * @param string $data
287
     * @param string $numero
288
     * @param string $valor
289
     * @param string $chave
290
     * @param string $correcao
291
     * @param string $conduso
292
     * @return string
293
     */
294
    protected function renderTemplate(
295
        $template,
296
        $destinatario = '',
297
        $data = '',
298
        $numero = '',
299
        $valor = 0,
300
        $chave = '',
301
        $correcao = '',
302
        $conduso = ''
303
    ) {
304
        $dt = new \DateTime(str_replace('T', ' ', $data));
305
        $search = array(
306
            '{destinatario}',
307
            '{data}',
308
            '{numero}',
309
            '{valor}',
310
            '{emitente}',
311
            '{chave}',
312
            '{correcao}',
313
            '{conduso}'
314
        );
315
        $replace = array(
316
            $destinatario,
317
            $dt->format('d/m/Y'),
318
            $numero,
319
            number_format($valor, 2, ',', '.'),
320
            $this->config->fantasy,
321
            $chave,
322
            $correcao,
323
            $conduso
324
        );
325
        $template = str_replace($search, $replace, $template);
326
        return $template;
327
    }
328
    
329
    /**
330
     * Remove all invalid addresses
331
     */
332
    protected function removeInvalidAdresses()
333
    {
334
        //This resulted array should be repeated fields removed
335
        //and all not valid strings, and also trim and strtolower strings
336
        $this->addresses = array_unique($this->addresses);
337
        $this->addresses = array_map(array($this, 'clearAddressString'), $this->addresses);
338
        $this->addresses = array_filter($this->addresses, array($this, 'checkEmailAddress'));
339
    }
340
    
341
    /**
342
     * Build Message
343
     * @return string
344
     */
345
    protected function render()
346
    {
347
        //depending on the document a different template should be loaded
348
        //and having data patterns appropriately substituted
349
        $template = $this->templates[$this->type];
350
        if (!empty($this->template)) {
351
            $template = $this->template;
352
        }
353
        return $this->renderTemplate(
354
            $template,
355
            $this->fields->destinatario,
356
            $this->fields->data,
357
            $this->fields->numero,
358
            $this->fields->valor,
359
            $this->fields->chave,
360
            $this->fields->correcao,
361
            $this->fields->conduso
362
        );
363
    }
364
    
365
    /**
366
     * Attach all documents to message
367
     */
368
    protected function attach()
369
    {
370
        $this->mail->addStringAttachment(
371
            $this->xml,
372
            $this->fields->id . '.xml'
373
        );
374
        if (!empty($this->pdf)) {
375
            $this->mail->addStringAttachment(
376
                $this->pdf,
377
                $this->fields->id. '.pdf',
378
                'base64',
379
                'application/pdf'
380
            );
381
        }
382
    }
383
    
384
    /**
385
     * Returns only valid email string
386
     * @param string $email
387
     * @return boolean
388
     */
389
    protected function checkEmailAddress($email)
390
    {
391
        return filter_var($email, FILTER_VALIDATE_EMAIL);
392
    }
393
    
394
    /**
395
     * Format email address string removing garbage and
396
     * set to lower characters
397
     * @param string $email
398
     * @return string
399
     */
400
    protected function clearAddressString($email)
401
    {
402
        return preg_replace('/[ ,;:]+/', '', strtolower($email));
403
    }
404
}
405