diff --git a/source/app/controllers/helper.py b/source/app/controllers/helper.py index efc7274..c6bc2c5 100644 --- a/source/app/controllers/helper.py +++ b/source/app/controllers/helper.py @@ -340,6 +340,7 @@ class SendMail(object): class NumberedCanvas(canvas.Canvas): X = 20.59 * cm + XC = 21.6 * cm / 2 + 1.5 * cm Y = 1.5 * cm def __init__(self, *args, **kwargs): @@ -363,10 +364,14 @@ class NumberedCanvas(canvas.Canvas): def draw_page_number(self, page_count): self.setFont('Helvetica', 8) - self.setFillColor(colors.darkred) - text = 'Página {} de {}'.format(self._pageNumber, page_count) + # ~ self.setFillColor(colors.darkred) + text = f'Página {self._pageNumber} de {page_count}' self.drawRightString(self.X, self.Y, text) - text = 'Factura elaborada con software libre: www.empresalibre.net' + + text = 'Este documento es una representación impresa de un CFDI' + self.drawCentredString(self.XC, self.Y, text) + + text = 'Factura elaborada con software libre' self.drawString(1.5 * cm, 1.5 * cm, text) return @@ -418,6 +423,8 @@ class TemplateInvoice(BaseDocTemplate): def _emisor(self, styles, data): logo_path = data.pop('logo', '') logo_style = styles.pop('logo', {}) + logo_path2 = data.pop('logo2', '') + logo_style2 = styles.pop('logo2', {}) for k, v in styles.items(): self._set_text(styles[k], data.get(k, '')) @@ -428,6 +435,14 @@ class TemplateInvoice(BaseDocTemplate): for k in keys: rect[k] = rect[k] * cm self.canv.drawImage(logo_path, **rect) + + if logo_path2 and logo_style2: + rect = logo_style2['rectangulo'] + keys = ('x', 'y', 'width', 'height') + for k in keys: + rect[k] = rect[k] * cm + self.canv.drawImage(logo_path2, **rect) + return def _receptor(self, styles, data): @@ -449,6 +464,7 @@ class TemplateInvoice(BaseDocTemplate): def _comprobante1(self, styles, data): title = styles.pop('titulo', {}) + self.canv.setTitle(f"Factura {data.get('seriefolio', '')}") for k, v in styles.items(): self._set_text(styles[k], data.get(k, '')) @@ -480,6 +496,12 @@ class TemplateInvoice(BaseDocTemplate): fields = ('valorunitario', 'importe') if field in fields: return self._currency(value) + + if field == 'descripcion': + html = '{}' + style_bt = getSampleStyleSheet()['BodyText'] + return Paragraph(html.format(value), style_bt) + return value def _conceptos(self, conceptos): @@ -515,8 +537,8 @@ class TemplateInvoice(BaseDocTemplate): ('GRID', (0, 0), (-1, -1), 0.05 * cm, colors.white), ('ALIGN', (1, 0), (-1, -1), 'RIGHT'), ('FONTSIZE', (0, 0), (-1, -1), 8), - ('BACKGROUND', (1, 0), (-1, -1), colors.linen), - ('TEXTCOLOR', (1, 0), (-1, -1), colors.darkred), + ('BACKGROUND', (1, 0), (-1, -1), colors.lightgrey), + ('TEXTCOLOR', (1, 0), (-1, -1), colors.black), ('FACE', (1, 0), (-1, -1), 'Helvetica-Bold'), ] table = Table(rows, colWidths=widths, spaceBefore=0.25*cm) @@ -524,7 +546,7 @@ class TemplateInvoice(BaseDocTemplate): return table def _comprobante2(self, styles, data): - leyenda = styles.pop('leyenda', {}) + leyendas = styles.pop('leyendas', {}) ls = [] for k, v in styles.items(): @@ -542,7 +564,7 @@ class TemplateInvoice(BaseDocTemplate): style_bt = getSampleStyleSheet()['BodyText'] style_bt.leading = 8 html_t = '{}' - html = '{}' + html = '{}' msg = 'Cadena original del complemento de certificación digital del SAT' rows = [ (cbb, Paragraph(html_t.format('Sello Digital del CFDI'), style_bt)), @@ -558,13 +580,13 @@ class TemplateInvoice(BaseDocTemplate): ('FONTSIZE', (0, 0), (-1, -1), 6), ('SPAN', (0, 0), (0, -1)), ('FACE', (1, 0), (1, 0), 'Helvetica-Bold'), - ('BACKGROUND', (1, 1), (1, 1), colors.linen), + ('BACKGROUND', (1, 1), (1, 1), colors.lightgrey), ('TEXTCOLOR', (1, 1), (1, 1), colors.darkred), ('FACE', (1, 2), (1, 2), 'Helvetica-Bold'), - ('BACKGROUND', (1, 3), (1, 3), colors.linen), + ('BACKGROUND', (1, 3), (1, 3), colors.lightgrey), ('TEXTCOLOR', (1, 3), (1, 3), colors.darkred), ('FACE', (1, 4), (1, 4), 'Helvetica-Bold'), - ('BACKGROUND', (1, 5), (1, 5), colors.linen), + ('BACKGROUND', (1, 5), (1, 5), colors.lightgrey), ('TEXTCOLOR', (1, 5), (1, 5), colors.darkred), ('ALIGN', (0, 0), (0, 0), 'CENTER'), ('VALIGN', (0, 0), (0, 0), 'MIDDLE'), @@ -573,14 +595,14 @@ class TemplateInvoice(BaseDocTemplate): table.setStyle(TableStyle(table_styles)) ls.append(table) - if leyenda: - if 'spaceBefore' in leyenda['estilo']: - leyenda['estilo']['spaceBefore'] = \ - leyenda['estilo']['spaceBefore'] * cm - msg = 'Este documento es una representación impresa de un CFDI' - ps = ParagraphStyle(**leyenda['estilo']) - p = Paragraph(msg, ps) - ls.append(p) + if leyendas: + if 'spaceBefore' in leyendas['estilo']: + leyendas['estilo']['spaceBefore'] = \ + leyendas['estilo']['spaceBefore'] * cm + for t in leyendas['textos']: + ps = ParagraphStyle(**leyendas['estilo']) + p = Paragraph(t, ps) + ls.append(p) return ls @@ -607,13 +629,13 @@ class TemplateInvoice(BaseDocTemplate): ('ALIGN', (0, 0), (-1, 0), 'CENTER'), ('TEXTCOLOR', (0, 0), (-1, 0), colors.white), ('FACE', (0, 0), (-1, 0), 'Helvetica-Bold'), - ('BACKGROUND', (0, 0), (-1, 0), colors.darkred), + ('BACKGROUND', (0, 0), (-1, 0), colors.grey), ('FONTSIZE', (0, 1), (-1, -1), 7), ('VALIGN', (0, 1), (-1, -1), 'TOP'), ('ALIGN', (0, 1), (0, -1), 'CENTER'), ('ALIGN', (2, 1), (2, -1), 'CENTER'), ('ALIGN', (3, 1), (5, -1), 'RIGHT'), - ('LINEBELOW', (0, 1), (-1, -1), 0.05 * cm, colors.darkred), + ('LINEBELOW', (0, 1), (-1, -1), 0.05 * cm, colors.grey), ('LINEBEFORE', (0, 1), (-1, -1), 0.05 * cm, colors.white), ] table_conceptos = Table(rows, colWidths=widths, repeatRows=1) diff --git a/source/app/controllers/util.py b/source/app/controllers/util.py index dd38ed8..673b7ea 100644 --- a/source/app/controllers/util.py +++ b/source/app/controllers/util.py @@ -1592,9 +1592,15 @@ def to_pdf(data, emisor_rfc, ods=False, pdf_from='1'): def to_pdf_from_json(rfc, version, data): + rfc = rfc.lower() name = '{}_{}.json'.format(rfc, version) custom_styles = get_custom_styles(name) + path_logo = _join(PATHS['IMG'], f"{rfc}.png") + data['emisor']['logo'] = path_logo + path_logo = _join(PATHS['IMG'], f"{rfc}_2.png") + data['emisor']['logo2'] = path_logo + path = get_path_temp() pdf = TemplateInvoice(path) pdf.custom_styles = custom_styles diff --git a/source/app/models/main.py b/source/app/models/main.py index c42f14a..db985fe 100644 --- a/source/app/models/main.py +++ b/source/app/models/main.py @@ -3719,6 +3719,7 @@ class Facturas(BaseModel): values['receptor'] = {} for k, v in receptor.items(): values['receptor'][k] = v + return values @classmethod diff --git a/source/templates/plantilla_factura.json b/source/templates/plantilla_factura.json index 2dff441..18dfca1 100644 --- a/source/templates/plantilla_factura.json +++ b/source/templates/plantilla_factura.json @@ -1,4 +1,5 @@ { +"colores": {"piepagina": "darkred"}, "encabezado": { "emisor": { "direccion": { @@ -208,10 +209,9 @@ "estilo": {"name": "tipocambio", "fontName": "Helvetica", "fontSize": 7, "alignment": 0, "textColor": "black"} }, - "leyenda": { - "estilo": {"name": "leyenda", "fontName": "Helvetica-Bold", - "fontSize": 6, "alignment": 1, "textColor": "black", - "spaceBefore": 0.2} + "notas": { + "estilo": {"name": "notas", "fontName": "Helvetica", + "fontSize": 7, "alignment": 0, "textColor": "black"} } } }