Skip to content

Commit cc64416

Browse files
committed
Improve xml nfse parser
1 parent 59b6f03 commit cc64416

3 files changed

Lines changed: 21 additions & 1 deletion

File tree

src/Dto/Nfse/InfNfseData.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44

55
use Nfse\Dto\Dto;
66
use Nfse\Enums\AmbienteGerador;
7-
use Nfse\Enums\ProcessoEmissao;
87
use Nfse\Enums\CodigoStatus;
8+
use Nfse\Enums\ProcessoEmissao;
99
use Nfse\Support\DTO\EnumCaster;
1010
use Spatie\DataTransferObject\Attributes\CastWith;
1111
use Spatie\DataTransferObject\Attributes\MapFrom;

src/Xml/NfseXmlParser.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ public function parse(string $xml): NfseData
1717
// Remove invalid characters
1818
$xml = iconv('UTF-8', 'UTF-8//IGNORE', $xml);
1919

20+
// Remove escaped quotes if present (e.g. from JSON dumps)
21+
$xml = str_replace('\"', '"', $xml);
22+
2023
// 2. Parse XML
2124
$useInternal = libxml_use_internal_errors(true);
2225
$simpleXml = simplexml_load_string(
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
use Nfse\Dto\Nfse\NfseData;
4+
use Nfse\Xml\NfseXmlParser;
5+
6+
it('parses real world xml correctly', function () {
7+
$xml = '<?xml version=\"1.0\" encoding=\"utf-8\"?><NFSe versao=\"1.00\" xmlns=\"http://www.sped.fazenda.gov.br/nfse\"><infNFSe Id=\"NFS15042082252190743000175000000000000223113059264808\"><xLocEmi>Marabá</xLocEmi><xLocPrestacao>Belém</xLocPrestacao><nNFSe>2</nNFSe><cLocIncid>1504208</cLocIncid><xLocIncid>Marabá</xLocIncid><xTribNac>Análise e desenvolvimento de sistemas.</xTribNac><xTribMun>Análise e desenvolvimento de sistemas</xTribMun><verAplic>EmissorWeb_1.1.0.1</verAplic><ambGer>2</ambGer><tpEmis>1</tpEmis><procEmi>2</procEmi><cStat>100</cStat><dhProc>2023-11-01T12:04:39-03:00</dhProc><nDFSe>21164</nDFSe><emit><CNPJ>52190743000175</CNPJ><xNome>52.190.743 ATILA DENIS CARDOSO DA SILVA</xNome><enderNac><xLgr>SOL POENTE</xLgr><nro>1725</nro><xBairro>CIDADE NOVA</xBairro><cMun>1504208</cMun><UF>PA</UF><CEP>68501670</CEP></enderNac></emit><valores><vTotalRet>0.00</vTotalRet><vLiq>2200.00</vLiq></valores><DPS versao=\"1.00\" xmlns=\"http://www.sped.fazenda.gov.br/nfse\"><infDPS Id=\"DPS150420825219074300017500900000000000000002\"><tpAmb>1</tpAmb><dhEmi>2023-11-01T12:04:39-03:00</dhEmi><verAplic>EmissorWeb_1.1.0.4</verAplic><serie>900</serie><nDPS>2</nDPS><dCompet>2023-10-31</dCompet><tpEmit>1</tpEmit><cLocEmi>1504208</cLocEmi><prest><CNPJ>52190743000175</CNPJ><IM>817445</IM><fone>9189242304</fone><email>ATILA.DANVI@OUTLOOK.COM</email><regTrib><opSimpNac>2</opSimpNac><regEspTrib>0</regEspTrib></regTrib></prest><toma><CNPJ>03279735000194</CNPJ><xNome>MAIA PRODUCAO DE SOFTWARES LTDA</xNome><end><endNac><cMun>1501402</cMun><CEP>66095055</CEP></endNac><xLgr>BARAO DO TRIUNFO</xLgr><nro>3540</nro><xCpl>SALA 813</xCpl><xBairro>MARCO</xBairro></end></toma><serv><locPrest><cLocPrestacao>1501402</cLocPrestacao></locPrest><cServ><cTribNac>010101</cTribNac><cTribMun>001</cTribMun><xDescServ>Serviços prestados de 22 de setembro a 31 outubro de 2023</xDescServ></cServ></serv><valores><vServPrest><vServ>2200.00</vServ></vServPrest><trib><tribMun><tribISSQN>1</tribISSQN><tpRetISSQN>1</tpRetISSQN></tribMun><totTrib><indTotTrib>0</indTotTrib></totTrib></trib></valores></infDPS></DPS></infNFSe><Signature xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><SignedInfo><CanonicalizationMethod Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\" /><SignatureMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#rsa-sha1\" /><Reference URI=\"#NFS15042082252190743000175000000000000223113059264808\"><Transforms><Transform Algorithm=\"http://www.w3.org/2000/09/xmldsig#enveloped-signature\" /><Transform Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\" /></Transforms><DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /><DigestValue>T0h1oIE7dS/DwXoFj2NpuVtZ1CM=</DigestValue></Reference></SignedInfo><SignatureValue>lrH9dIh9zvC6j0Mr1wxjqrIyoC9GFwSHlFZQKvIdwCt/k4ZkykWCLrcLHC1gd4KMedaqc8NjwlfRxh5XxY+OdIlqPPRtzhumSQRpt892k5rNxFM+FBvNSt0eEMUtV4k4uxzN6FZNUH3LSEkogczdZs372zCqeqbhSGJTpl/KV/KUBPgZohmUpwvG/5sCN+gO5qepNKN1EF7anM7up+O1cDuek5oEJWkle71rmeQK0a8LUJ4G1ebQlGeUNTDB5lHhReGXSjS07rpqE+ZM++GWj+oyjulyR0249VRdd7derC94Uvr6qoIlsRhBla2Mp8sdsblfKQX0/cm/+fofk9iT2Q==</SignatureValue><KeyInfo><X509Data><X509Certificate>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</X509Certificate></X509Data></KeyInfo></Signature></NFSe>';
8+
9+
$parser = new NfseXmlParser;
10+
$nfseData = $parser->parse($xml);
11+
12+
expect($nfseData)->toBeInstanceOf(NfseData::class)
13+
->and($nfseData->infNfse->localEmissao)->toBe('Marabá')
14+
->and($nfseData->infNfse->numeroNfse)->toBe('2')
15+
->and($nfseData->infNfse->emitente->cnpj)->toBe('52190743000175')
16+
->and($nfseData->infNfse->valores->valorLiquido)->toBe(2200.00);
17+
});

0 commit comments

Comments
 (0)