Browse Source

[11.0][IMP]different method to compute lines per page (#172)

* Adicionando mais espaço para as linhas de produtos
pull/173/head
Johny Chen Jy 7 years ago
committed by Danimar Ribeiro
parent
commit
260a7e5add
  1. 58
      pytrustnfe/nfe/danfe.py
  2. 2
      setup.py

58
pytrustnfe/nfe/danfe.py

@ -6,6 +6,7 @@
import os import os
from io import BytesIO from io import BytesIO
from textwrap import wrap from textwrap import wrap
import math
from reportlab.lib import utils from reportlab.lib import utils
from reportlab.pdfgen import canvas from reportlab.pdfgen import canvas
@ -40,7 +41,6 @@ def format_cnpj_cpf(value):
def getdateByTimezone(cDateUTC, timezone=None): def getdateByTimezone(cDateUTC, timezone=None):
''' '''
Esse método trata a data recebida de acordo com o timezone do Esse método trata a data recebida de acordo com o timezone do
usuário. O seu retorno é dividido em duas partes: usuário. O seu retorno é dividido em duas partes:
@ -153,16 +153,15 @@ class danfe(object):
self.NrPages = 1 self.NrPages = 1
self.Page = 1 self.Page = 1
# Calculando total linhas usadas para descrições dos itens
# Com bloco fatura, apenas 25 linhas para itens na primeira folha
nNr_Lin_Pg_1 = 30 if oXML_cobr is None else 26
# [ 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") el_det = oXML.findall(".//{http://www.portalfiscal.inf.br/nfe}det")
# Declaring variable to prevent future errors
nId = 0
if el_det is not None: if el_det is not None:
list_desc = [] list_desc = []
list_cod_prod = [] list_cod_prod = []
nPg = 0
for nId, item in enumerate(el_det): for nId, item in enumerate(el_det):
el_prod = item.find( el_prod = item.find(
".//{http://www.portalfiscal.inf.br/nfe}prod") ".//{http://www.portalfiscal.inf.br/nfe}prod")
@ -177,21 +176,9 @@ class danfe(object):
list_cProd = wrap(tagtext(oNode=el_prod, cTag='cProd'), 14) list_cProd = wrap(tagtext(oNode=el_prod, cTag='cProd'), 14)
list_cod_prod.append(list_cProd) list_cod_prod.append(list_cProd)
# Nr linhas necessárias p/ descrição item
nLin_Itens = len(list_)
if (oPaginator[nPg][2] + nLin_Itens) >= oPaginator[nPg][3]:
oPaginator.append([0, 0, 0, 77])
nPg += 1
oPaginator[nPg][0] = nId
oPaginator[nPg][1] = nId + 1
oPaginator[nPg][2] = nLin_Itens
else:
# adiciona-se 1 pelo funcionamento de xrange
oPaginator[nPg][1] = nId + 1
oPaginator[nPg][2] += nLin_Itens
self.NrPages = len(oPaginator) # Calculando nr. páginas
# Calculando nr. aprox. de páginas
if nId > 25:
self.NrPages += math.ceil((nId - 25) / 70)
if recibo: if recibo:
self.recibo_entrega(oXML=oXML, timezone=timezone) self.recibo_entrega(oXML=oXML, timezone=timezone)
@ -204,18 +191,21 @@ class danfe(object):
self.impostos(oXML=oXML) self.impostos(oXML=oXML)
self.transportes(oXML=oXML) self.transportes(oXML=oXML)
self.produtos(oXML=oXML, el_det=el_det, oPaginator=oPaginator[0],
list_desc=list_desc, list_cod_prod=list_cod_prod)
index = self.produtos(
oXML=oXML, el_det=el_det, max_index=nId,
list_desc=list_desc, list_cod_prod=list_cod_prod)
self.adicionais(oXML=oXML) self.adicionais(oXML=oXML)
# Gera o restante das páginas do XML # Gera o restante das páginas do XML
for oPag in oPaginator[1:]:
while index < nId:
self.newpage() self.newpage()
self.ide_emit(oXML=oXML, timezone=timezone) self.ide_emit(oXML=oXML, timezone=timezone)
self.produtos(oXML=oXML, el_det=el_det, oPaginator=oPag,
list_desc=list_desc, nHeight=77,
list_cod_prod=list_cod_prod)
index = self.produtos(
oXML=oXML, el_det=el_det, index=index,
max_index=nId,
list_desc=list_desc, nHeight=77,
list_cod_prod=list_cod_prod)
self.newpage() self.newpage()
if cce_xml: if cce_xml:
@ -326,7 +316,7 @@ class danfe(object):
P = Paragraph(tagtext(oNode=elem_emit, cTag='xNome'), styleN) P = Paragraph(tagtext(oNode=elem_emit, cTag='xNome'), styleN)
w, h = P.wrap(55 * mm, 40 * mm) w, h = P.wrap(55 * mm, 40 * mm)
P.drawOn(self.canvas, (self.nLeft + 30) * mm, P.drawOn(self.canvas, (self.nLeft + 30) * mm,
(self.height - self.nlin - ((4.3*h + 12)/12)) * mm)
(self.height - self.nlin - ((4.3 * h + 12) / 12)) * mm)
if self.logo: if self.logo:
img = get_image(self.logo, width=2 * cm) img = get_image(self.logo, width=2 * cm)
@ -667,7 +657,7 @@ obsCont[@xCampo='NomeVendedor']")
self.nlin += 23 self.nlin += 23
def produtos(self, oXML=None, el_det=None, oPaginator=None,
def produtos(self, oXML=None, el_det=None, index=0, max_index=0,
list_desc=None, list_cod_prod=None, nHeight=29): list_desc=None, list_cod_prod=None, nHeight=29):
nMr = self.width - self.nRight nMr = self.width - self.nRight
@ -721,7 +711,11 @@ obsCont[@xCampo='NomeVendedor']")
self.canvas.setFont('NimbusSanL-Regu', 5) self.canvas.setFont('NimbusSanL-Regu', 5)
nLin = self.nlin + 10.5 nLin = self.nlin + 10.5
for id in range(oPaginator[0], oPaginator[1]):
for id in range(index, max_index + 1):
if nLin > 242:
break
item = el_det[id] item = el_det[id]
el_prod = item.find(".//{http://www.portalfiscal.inf.br/nfe}prod") el_prod = item.find(".//{http://www.portalfiscal.inf.br/nfe}prod")
el_imp = item.find( el_imp = item.find(
@ -781,6 +775,7 @@ obsCont[@xCampo='NomeVendedor']")
self.canvas.setStrokeColor(black) self.canvas.setStrokeColor(black)
self.nlin += nH + 3 self.nlin += nH + 3
return id
def adicionais(self, oXML=None): def adicionais(self, oXML=None):
el_infAdic = oXML.find( el_infAdic = oXML.find(
@ -989,3 +984,4 @@ obsCont[@xCampo='NomeVendedor']")
paragraph = Paragraph(ptext, style=style) paragraph = Paragraph(ptext, style=style)
w, h = paragraph.wrapOn(self.canvas, x, y) w, h = paragraph.wrapOn(self.canvas, x, y)
return w, h, paragraph return w, h, paragraph

2
setup.py

@ -2,7 +2,7 @@
from setuptools import setup, find_packages from setuptools import setup, find_packages
VERSION = "1.0.2"
VERSION = "1.0.3"
setup( setup(

Loading…
Cancel
Save