diff --git a/pytrustnfe/nfe/danfe.py b/pytrustnfe/nfe/danfe.py index 55449753..799150c9 100644 --- a/pytrustnfe/nfe/danfe.py +++ b/pytrustnfe/nfe/danfe.py @@ -77,7 +77,7 @@ def __init__(self, sizepage=A4, list_xml=None, recibo=True, self.nLeft = 10 self.nRight = 10 self.nTop = 7 - self.nBottom = 15 + self.nBottom = 8 self.nlin = self.nTop self.logo = logo self.oFrete = {'0': '0 - Emitente', @@ -104,7 +104,7 @@ def __init__(self, sizepage=A4, list_xml=None, recibo=True, # Calculando total linhas usadas para descrições dos itens # Com bloco fatura, apenas 29 linhas para itens na primeira folha - nNr_Lin_Pg_1 = 34 if oXML_cobr is None else 29 + nNr_Lin_Pg_1 = 34 if oXML_cobr is None else 30 # [ rec_ini , rec_fim , lines , limit_lines ] oPaginator = [[0, 0, 0, nNr_Lin_Pg_1]] el_det = oXML.findall(".//{http://www.portalfiscal.inf.br/nfe}det") @@ -163,7 +163,8 @@ def __init__(self, sizepage=A4, list_xml=None, recibo=True, self.newpage() self.ide_emit(oXML=oXML) self.produtos(oXML=oXML, el_det=el_det, oPaginator=oPag, - list_desc=list_desc, nHeight=77) + list_desc=list_desc, nHeight=77, + list_cod_prod=list_cod_prod) self.newpage() @@ -185,6 +186,8 @@ def ide_emit(self, oXML=None): self.rect(self.nLeft+115, self.nlin+1, self.width-self.nLeft-self.nRight-115, 39) + self.hline(self.nLeft+85, self.nlin+1, 125) + self.rect(self.nLeft+116, self.nlin+15, self.width-self.nLeft-self.nRight-117, 6) @@ -196,7 +199,7 @@ def ide_emit(self, oXML=None): # Labels self.canvas.setFont('NimbusSanL-Bold', 12) - self.stringcenter(self.nLeft+98, self.nlin+4, 'DANFE') + self.stringcenter(self.nLeft+98, self.nlin+5, 'DANFE') self.stringcenter(self.nLeft+109, self.nlin+19.5, tagtext(oNode=elem_ide, cTag='tpNF')) self.canvas.setFont('NimbusSanL-Bold', 8) @@ -342,9 +345,9 @@ def destinatario(self, oXML=None): self.string(nMr-69, self.nlin+7.5, format_cnpj_cpf(tagtext(oNode=elem_dest, cTag='CNPJ'))) cDt, cHr = getdateUTC(tagtext(oNode=elem_ide, cTag='dhEmi')) - self.string(nMr-24, self.nlin+7.7, cDt) + self.string(nMr-24, self.nlin+7.7, cDt + ' ' + cHr) cDt, cHr = getdateUTC(tagtext(oNode=elem_ide, cTag='dhSaiEnt')) - self.string(nMr-24, self.nlin+14.3, cDt) # Dt saída + self.string(nMr-24, self.nlin+14.3, cDt + ' ' + cHr) # Dt saída cEnd = tagtext(oNode=elem_dest, cTag='xLgr') + ', ' + tagtext( oNode=elem_dest, cTag='nro') self.string(self.nLeft+1, self.nlin+14.3, cEnd) @@ -442,65 +445,67 @@ def impostos(self, oXML=None): self.width-self.nLeft-self.nRight, 13) self.hline(self.nLeft, self.nlin+8.5, self.width-self.nLeft) self.vline(nMr-35, self.nlin+2, 6.5) - self.vline(nMr-72, self.nlin+2, 6.5) - self.vline(nMr-110, self.nlin+2, 6.5) - self.vline(nMr-148, self.nlin+2, 6.5) + self.vline(nMr-65, self.nlin+2, 6.5) + self.vline(nMr-95, self.nlin+2, 6.5) + self.vline(nMr-125, self.nlin+2, 6.5) + self.vline(nMr-155, self.nlin+2, 6.5) self.vline(nMr-35, self.nlin+8.5, 6.5) - self.vline(nMr-66, self.nlin+8.5, 6.5) - self.vline(nMr-90, self.nlin+8.5, 6.5) - self.vline(nMr-119, self.nlin+8.5, 6.5) - self.vline(nMr-140, self.nlin+8.5, 6.5) - self.vline(nMr-163, self.nlin+8.5, 6.5) + self.vline(nMr-65, self.nlin+8.5, 6.5) + self.vline(nMr-95, self.nlin+8.5, 6.5) + self.vline(nMr-125, self.nlin+8.5, 6.5) + self.vline(nMr-155, self.nlin+8.5, 6.5) # Labels self.canvas.setFont('NimbusSanL-Regu', 5) - self.string(nMr-34, self.nlin+3.8, 'VALOR TOTAL DOS PRODUTOS') - self.string(nMr-71, self.nlin+3.8, 'VALOR DO ICMS ST') - self.string(nMr-109, self.nlin+3.8, 'BASE DE CÁLCULO DO ICMS ST') - self.string(nMr-147, self.nlin+3.8, 'VALOR DO ICMS') self.string(self.nLeft+1, self.nlin+3.8, 'BASE DE CÁLCULO DO ICMS') - self.string(nMr-34, self.nlin+10.2, 'VALOR TOTAL DA NOTA') - self.string(nMr-65, self.nlin+10.2, 'VALOR APROX TRIBUTOS') - self.string(nMr-89, self.nlin+10.2, 'VALOR DO IPI') - self.string(nMr-118, self.nlin+10.2, 'OUTRAS DESP. ACESSÓRIAS') - self.string(nMr-139, self.nlin+10.2, 'DESCONTO') - self.string(nMr-162, self.nlin+10.2, 'VALOR DO SEGURO') + self.string(nMr-154, self.nlin+3.8, 'VALOR DO ICMS') + self.string(nMr-124, self.nlin+3.8, 'BASE DE CÁLCULO DO ICMS ST') + self.string(nMr-94, self.nlin+3.8, 'VALOR DO ICMS ST') + self.string(nMr-64, self.nlin+3.8, 'VALOR APROX TRIBUTOS') + self.string(nMr-34, self.nlin+3.8, 'VALOR TOTAL DOS PRODUTOS') + self.string(self.nLeft+1, self.nlin+10.2, 'VALOR DO FRETE') + self.string(nMr-154, self.nlin+10.2, 'VALOR DO SEGURO') + self.string(nMr-124, self.nlin+10.2, 'DESCONTO') + self.string(nMr-94, self.nlin+10.2, 'OUTRAS DESP. ACESSÓRIAS') + self.string(nMr-64, self.nlin+10.2, 'VALOR DO IPI') + self.string(nMr-34, self.nlin+10.2, 'VALOR TOTAL DA NOTA') + # Conteúdo campos self.canvas.setFont('NimbusSanL-Regu', 8) self.stringRight( - self.nLeft+41, self.nlin+7.7, + self.nLeft+34, self.nlin+7.7, format_number(tagtext(oNode=el_total, cTag='vBC'), precision=2)) self.stringRight( - self.nLeft+79, self.nlin+7.7, + self.nLeft+64, self.nlin+7.7, format_number(tagtext(oNode=el_total, cTag='vICMS'), precision=2)) self.stringRight( - self.nLeft+117, self.nlin+7.7, + self.nLeft+94, self.nlin+7.7, format_number(tagtext(oNode=el_total, cTag='vBCST'), precision=2)) self.stringRight( - nMr-36, self.nlin+7.7, + nMr-66, self.nlin+7.7, format_number(tagtext(oNode=el_total, cTag='vST'), precision=2)) + self.stringRight( + nMr-36, self.nlin+7.7, + format_number(tagtext(oNode=el_total, cTag='vTotTrib'), + precision=2)) self.stringRight( nMr-1, self.nlin+7.7, format_number(tagtext(oNode=el_total, cTag='vProd'), precision=2)) self.stringRight( - self.nLeft+26, self.nlin+14.1, + self.nLeft+34, self.nlin+14.1, format_number(tagtext(oNode=el_total, cTag='vFrete'), precision=2)) self.stringRight( - self.nLeft+49, self.nlin+14.1, + self.nLeft+64, self.nlin+14.1, format_number(tagtext(oNode=el_total, cTag='vSeg'), precision=2)) self.stringRight( - self.nLeft+70, self.nlin+14.1, + self.nLeft+94, self.nlin+14.1, format_number(tagtext(oNode=el_total, cTag='vDesc'), precision=2)) self.stringRight( - self.nLeft+99, self.nlin+14.1, + self.nLeft+124, self.nlin+14.1, format_number(tagtext(oNode=el_total, cTag='vOutro'), precision=2)) - self.stringRight( - self.nLeft+123, self.nlin+14.1, - format_number(tagtext(oNode=el_total, cTag='vIPI'), precision=2)) self.stringRight( self.nLeft+154, self.nlin+14.1, - format_number(tagtext(oNode=el_total, cTag='vTotTrib'), - precision=2)) + format_number(tagtext(oNode=el_total, cTag='vIPI'), precision=2)) self.stringRight( nMr-1, self.nlin+14.1, format_number(tagtext(oNode=el_total, cTag='vNF'), precision=2)) @@ -652,8 +657,6 @@ def produtos(self, oXML=None, el_det=None, oPaginator=None, vIPI = tagtext(oNode=el_imp_IPI, cTag='vIPI') pIPI = tagtext(oNode=el_imp_IPI, cTag='pIPI') - #self.string(self.nLeft+1, nLin, - # tagtext(oNode=el_prod, cTag='cProd')) self.stringcenter(nMr-112.5, nLin, tagtext(oNode=el_prod, cTag='NCM')) self.stringcenter(nMr-105, nLin, cCST) @@ -685,12 +688,14 @@ def produtos(self, oXML=None, el_det=None, oPaginator=None, line_cod += nStep # Descrição Item + line_desc = nLin for des in list_desc[id]: - self.string(self.nLeft+15.5, nLin, des) - nLin += nStep + self.string(self.nLeft+15.5, line_desc, des) + line_desc += nStep + nLin = max(line_cod, line_desc) self.canvas.setStrokeColor(gray) - self.hline(self.nLeft, nLin-1.5, self.width-self.nLeft) + self.hline(self.nLeft, nLin-2, self.width-self.nLeft) self.canvas.setStrokeColor(black) self.nlin += nH + 3 @@ -706,8 +711,8 @@ def adicionais(self, oXML=None): self.string(self.nLeft+1, self.nlin+4, 'INFORMAÇÕES COMPLEMENTARES') self.string((self.width/2)+1, self.nlin+4, 'RESERVADO AO FISCO') self.rect(self.nLeft, self.nlin+2, - self.width-self.nLeft-self.nRight, 34) - self.vline(self.width/2, self.nlin+2, 34) + self.width-self.nLeft-self.nRight, 42) + self.vline(self.width/2, self.nlin+2, 42) # Conteúdo campos styles = getSampleStyleSheet() styleN = styles['Normal'] @@ -715,11 +720,14 @@ def adicionais(self, oXML=None): styleN.fontName = 'NimbusSanL-Regu' styleN.leading = 7 - P = Paragraph(tagtext(oNode=el_infAdic, - cTag='infCpl'), styles['Normal']) + fisco = tagtext(oNode=el_infAdic, cTag='infAdFisco') + observacoes = tagtext(oNode=el_infAdic, cTag='infCpl') + if fisco: + observacoes = fisco + ' ' + observacoes + P = Paragraph(observacoes, styles['Normal']) w, h = P.wrap(92*mm, 32*mm) - P.drawOn(self.canvas, (self.nLeft+1)*mm, (self.height-self.nlin-17)*mm) - + altura = (self.height-self.nlin-5)*mm + P.drawOn(self.canvas, (self.nLeft+1)*mm, altura - h) self.nlin += 36 def recibo_entrega(self, oXML=None): @@ -778,7 +786,7 @@ def recibo_entrega(self, oXML=None): P = Paragraph(cString, styleN) w, h = P.wrap(149*mm, 7*mm) P.drawOn(self.canvas, (self.nLeft+1)*mm, - (self.height-self.nlin-7.5)*mm) + ((self.height-self.nlin)*mm) - h) self.nlin += 20 self.hline(self.nLeft, self.nlin, self.width-self.nRight) diff --git a/pytrustnfe/test/XMLs/NFe00000857.xml b/pytrustnfe/test/XMLs/NFe00000857.xml index 7da0140f..d431ac34 100644 --- a/pytrustnfe/test/XMLs/NFe00000857.xml +++ b/pytrustnfe/test/XMLs/NFe00000857.xml @@ -1,4 +1,4 @@ -3513416577Venda Não Contribuintes15518572017-02-24T11:39:30-00:002017-02-24T11:39:30-00:0012355030811721100Odoo Brasil 1021332917000163TRUSTCODE TECNOLOGIA DA INFORMAÇÃO LTDATrustcodeRua Vinicius de Moraes42Córrego Grande3550308FlorianópolisSC880372401058Brasil1135302850144013873114111370685000184NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCALAV AMAZONAS1193Centro4314902Porto AlegreRS902405421058Brasil9VTS-L123110090339FIU32898EDSDKJ23JK4K2JLKJ4LK23234234KLJ3L3VENTIS PRETO- O2 CO H2S DIFUSAO VENTIS PRETO- O2 CO H2S DIFUSAO VENTIS PRETO- O2 CO H2S DIFUSAOVENTIS PRETO- O2 CO H2S2902710006108UN1.0100.00100.00UN1.03562.2695.0010.000102999493657.260.000.0007070.000.000.000.000.003562.2695.000.000.000.000.000.000.000.003657.260.001SEDEXFalse - False, FalseINV/2017/01263562.263657.26012017-03-161828.63022017-04-151828.63PERMITE O APROVEITAMENTO DO CRÉDITO DE ICMS NO VALOR CORRESPONDENTE À ALÍQUOTA DE 1,25%, NOS TERMOS DO ART. 23 DA LC 123/2006 >>IMPORTANTE<< P/ LIQUIDACAO DESTA NF, EFETUE DEPOSITO IDENTIFICADO NO BANCO BRADESCO AG: 1992-5, C/c: 4897-6 PEDIDO DE COMPRAS: OC 0045-05/2017 N/S 16122WZ-021 (Orçamento SO176) **VENCIMENTO: 15/04/2017 ==> .OC 0045-05/2017 N/S 16122WZ-021bNLOBxpMk5J6rrz37coB8/pvTBE=Y++vItLsZAbwzM/YDsgGqSn2+u035OSigoskd1x7DDJuAFuM0imbOuC20TAJPODcZCFxfqO1VTFCVgMmJUtHGzwvVdr3DSlbxIevfTF0nNwBYN2LzQVY2R/495ro2Vw2waKfOU+O2IZrKlFxBfu91Vv/JRpbECElwZaDK1BEp2ekGkB0tHfisGbQu1WFR8HBqwcyn8khhScO8nE7S+MR8uyEqf5057AiZZr1/vG/vyNhN1yzP8FFT3kHOG3w2aNe0H85s9spUrSC5hOAIy0yD6/NUUfH9AOOlER+cCLgLT52W7I5nnxC7dgEzG6YQffy1XGd/TQ4RC7ppKwmkVFaoQ==MIIIPzCCBiegAwIBAgIQYdesnYUNG8VPne0qhTeKOzANBgkqhkiG9w0BAQsFADB4 +3513416577Venda Não Contribuintes15518572017-02-24T11:39:30-00:002017-02-24T11:39:30-00:0012355030811721100Odoo Brasil 1021332917000163TRUSTCODE TECNOLOGIA DA INFORMAÇÃO LTDATrustcodeRua Vinicius de Moraes42Córrego Grande3550308FlorianópolisSC880372401058Brasil1135302850144013873114111370685000184NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCALAV AMAZONAS1193Centro4314902Porto AlegreRS902405421058Brasil9VTS-L123110090339FIU32898EDSDKJ23JK4K2JLKJ4LK23234234KLJ3L3VENTIS PRETO- O2 CO H2S DIFUSAO VENTIS PRETO- O2 CO H2S DIFUSAO VENTIS PRETO- O2 CO H2S DIFUSAOVENTIS PRETO- O2 CO H2S2902710006108UN1.0100.00100.00UN1.03562.2695.0010.000102999493657.260.000.0007070.000.000.000.000.003562.2695.000.000.000.000.000.000.000.003657.260.001SEDEXFalse - False, FalseINV/2017/01263562.263657.26012017-03-161828.63022017-04-151828.63PERMITE O APROVEITAMENTO DO CRÉDITO DE ICMS NO VALOR CORRESPONDENTE À ALÍQUOTA DE 1,25%, NOS TERMOS DO ART. 23 DA LC 123/2006 >>IMPORTANTE<< P/ LIQUIDACAO DESTA NF, EFETUE DEPOSITO IDENTIFICADO NO BANCO BRADESCO AG: PEDIDO DE COMPRAS: OC 0045-05/2017 (Orçamento SO176) **VENCIMENTO: 15/04/2017 ==> .OC 0045-05/2017 N/S 16122WZ-021bNLOBxpMk5J6rrz37coB8/pvTBE=Y++vItLsZAbwzM/YDsgGqSn2+u035OSigoskd1x7DDJuAFuM0imbOuC20TAJPODcZCFxfqO1VTFCVgMmJUtHGzwvVdr3DSlbxIevfTF0nNwBYN2LzQVY2R/495ro2Vw2waKfOU+O2IZrKlFxBfu91Vv/JRpbECElwZaDK1BEp2ekGkB0tHfisGbQu1WFR8HBqwcyn8khhScO8nE7S+MR8uyEqf5057AiZZr1/vG/vyNhN1yzP8FFT3kHOG3w2aNe0H85s9spUrSC5hOAIy0yD6/NUUfH9AOOlER+cCLgLT52W7I5nnxC7dgEzG6YQffy1XGd/TQ4RC7ppKwmkVFaoQ==MIIIPzCCBiegAwIBAgIQYdesnYUNG8VPne0qhTeKOzANBgkqhkiG9w0BAQsFADB4 MQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDE2MDQGA1UECxMtU2Vj cmV0YXJpYSBkYSBSZWNlaXRhIEZlZGVyYWwgZG8gQnJhc2lsIC0gUkZCMRwwGgYD VQQDExNBQyBDZXJ0aXNpZ24gUkZCIEc0MB4XDTE2MDUxMDAwMDAwMFoXDTE3MDUw diff --git a/pytrustnfe/test/test_danfe.py b/pytrustnfe/test/test_danfe.py index 031f4920..e7385c73 100644 --- a/pytrustnfe/test/test_danfe.py +++ b/pytrustnfe/test/test_danfe.py @@ -14,11 +14,13 @@ class test_danfe(unittest.TestCase): def test_can_generate_danfe(self): path = os.path.join(os.path.dirname(__file__), 'XMLs') xml_string = open(os.path.join(path, 'NFe00000857.xml'), "r").read() + # xml_string = open('/home/danimar/Downloads/NFe (5).xml', "r").read() + xml_element = etree.fromstring(xml_string) oDanfe = danfe(list_xml=[xml_element]) # Para testar localmente o Danfe - with open('/home/danimar/danfe.pdf', 'w') as oFile: - # with tempfile.TemporaryFile(mode='w') as oFile: + # with open('/home/danimar/danfe.pdf', 'w') as oFile: + with tempfile.TemporaryFile(mode='w') as oFile: oDanfe.writeto_pdf(oFile) diff --git a/setup.py b/setup.py index f2048560..8c8b28e1 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,7 @@ # coding=utf-8 from setuptools import setup, find_packages -VERSION = "0.1.30" +VERSION = "0.1.31" setup( name="PyTrustNFe",