Base::getXmlData()   F
last analyzed

Complexity

Conditions 19
Paths 594

Size

Total Lines 92

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 380

Importance

Changes 0
Metric Value
dl 0
loc 92
ccs 0
cts 85
cp 0
rs 0.9138
c 0
b 0
f 0
cc 19
nc 594
nop 1
crap 380

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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