def crear_factura_base(): from gluon.contrib.pyfpdf.template import Template mensaje = "" # Si no se creó la demo agregar a la base de datos template = db(db.pdftemplate.title == "Demo invoice pyfpdf").select().first() if not template: template = db.pdftemplate.insert(title="Demo invoice pyfpdf", format = "A4") mensaje += "Se creó el template por defecto. " else: mensaje += "El template ya existe en la base de datos. " # eliminar todos los elementos del template por defecto. db(db.pdfelement.pdftemplate == template.id).delete() f = Template() f.parse_csv(infile=os.path.join(request.env.web2py_path,'applications', request.application, 'private', 'invoice.csv'), delimiter=";", decimal_sep=",") nro = 0 creados = 0 for k, v in f.elements.items(): nro += 1 try: v['align']= {'I':'L','D':'R','C':'C','J':'J',"":""}.get(v['align'], 'L') v['pdftemplate'] = template.id db.pdfelement.insert(**v) creados += 1 except (AttributeError, ValueError, KeyError, TypeError), e: mensaje += "Error en elemento nro: " + str(nro) + " - " + str(e) + ". "
def import_csv(): from gluon.contrib.pyfpdf import Template f = Template() f.parse_csv(infile="/home/reingart/web2py/gluon/contrib/pyfpdf/invoice.csv", delimiter=";", decimal_sep=",") for v in f.fields.elements(): v['align']= {'I':'L','D':'R','C':'C','':''}.get(v['align'], 'L') v['pdf_template_id'] = 1 db.pdf_element.insert(**v)
def import_csv(): from gluon.contrib.pyfpdf import Template f = Template() f.parse_csv(infile="/home/reingart/web2py/gluon/contrib/pyfpdf/invoice.csv", delimiter=";", decimal_sep=",") for v in f.fields.elements(): v["align"] = {"I": "L", "D": "R", "C": "C", "": ""}.get(v["align"], "L") v["pdf_template_id"] = 1 db.pdf_element.insert(**v)
def import_csv(): from gluon.contrib.pyfpdf import Template f = Template() f.parse_csv( infile="/home/reingart/web2py/gluon/contrib/pyfpdf/invoice.csv", delimiter=";", decimal_sep=",") for v in f.fields.elements(): v['align'] = { 'I': 'L', 'D': 'R', 'C': 'C', '': '' }.get(v['align'], 'L') v['pdf_template_id'] = 1 db.pdf_element.insert(**v)
def crear_factura_base(): from gluon.contrib.pyfpdf.template import Template mensaje = "" # Si no se creó la demo agregar a la base de datos template = db( db.pdftemplate.title == "Demo invoice pyfpdf").select().first() if not template: template = db.pdftemplate.insert(title="Demo invoice pyfpdf", format="A4") mensaje += "Se creó el template por defecto. " else: mensaje += "El template ya existe en la base de datos. " # eliminar todos los elementos del template por defecto. db(db.pdfelement.pdftemplate == template.id).delete() f = Template() f.parse_csv(infile=os.path.join(request.env.web2py_path, 'applications', request.application, 'private', 'invoice.csv'), delimiter=";", decimal_sep=",") nro = 0 creados = 0 for k, v in f.elements.items(): nro += 1 try: v['align'] = { 'I': 'L', 'D': 'R', 'C': 'C', 'J': 'J', "": "" }.get(v['align'], 'L') v['pdftemplate'] = template.id db.pdfelement.insert(**v) creados += 1 except (AttributeError, ValueError, KeyError, TypeError), e: mensaje += "Error en elemento nro: " + str(nro) + " - " + str( e) + ". "
def imprimir(): import csv, time from gluon.contrib.pyfpdf import Template import os.path import sys es_para_guardar = False if request.args(0): doc_id = request.args(0) if request.args(1): es_para_guardar = True doc_record = db(db.fc_documento.id == request.args(0)).select() doc_det_rec = db( db.fc_documento_det.fc_documento_id == request.args(0)).select( orderby=db.fc_documento_det.id) emp_rec = db(db.cf_empresa.id == 1).select() #print emp_rec f = Template(format="A4", title="Presupuesto", author="w.a", subject="w.a", keywords="") if es_para_guardar: f.parse_csv(infile=request.folder + '/static/rpt/presupuesto_save.csv', delimiter=";", decimal_sep=",") else: f.parse_csv(infile=request.folder + '/static/rpt/presupuesto.csv', delimiter=";", decimal_sep=",") # # calculate pages: lines = len(doc_det_rec) max_lines_per_page = 24 pages = lines / (max_lines_per_page - 1) if lines % (max_lines_per_page - 1): pages = pages + 1 # # # fill placeholders for each page for page in range(1, pages + 1): f.add_page() f['page'] = 'Page %s of %s' % (page, pages) if pages > 1 and page < pages: s = 'Continues on page %s' % (page + 1) else: s = '' # setting data from company for row in emp_rec: f["EMPRESA"] = row.razon_social f["Logo"] = os.path.join(request.env.web2py_path, "applications", "flota", "uploads", row.ruta_foto) f["membrete1"] = 'Rif.:' + row.rif + ' - Nit.: ' + row.nit f["membrete2"] = 'Tel.:' + row.tlf + ' - Fax.: ' + row.fax f["iva"] = 'Email.:' + row.email #data from document for row in doc_record: f["numero"] = row.correlativo lafecha = row.fecha.strftime("%d/%m/%Y") f["Fecha.L"] = 'Fecha: ' + lafecha f["cliente.localidad.l"] = 'Contacto: ' f["cliente.localidad"] = row.contacto lafecha2 = row.fecha_vencimiento.strftime("%d/%m/%Y") f["cuit"] = 'Fecha Vencimiento: ' + lafecha2 f["vencimiento"] = '' f["vencimientol"] = '' f['PeriodoFacturadoL'] = '' f['Periodo.Hasta'] = '' f['Periodo.Desde'] = '' f['cae'] = '' #f['cae.l']='' f['cae.vencimiento'] = '' f['cae.vencimiento.l'] = '' f['codigobarras'] = str(row.id) + str(row.correlativo) f['codigobarraslegible'] = str(row.id) + str(row.correlativo) f['neto.L'] = 'Sub-Total' f['iva.L'] = 'I.V.A. 12%' notainf = row.nota_detalle #data from client f["cliente.iva.l"] = '' f["cliente.cuit.l"] = '' clt_rec = db(db.cf_proveedor.id == row.cf_proveedor_id).select() for row in clt_rec: f["cliente.nombre"] = row.razon_social f["cliente.domicilio"] = row.direccion f["cliente.telefono"] = row.tlf + ' Fax: ' + row.fax + ' Email: ' + row.email # print line item... li = 0 k = 0 total = float("0.00") for row in doc_det_rec: k = k + 1 if k > page * (max_lines_per_page - 1): break if row.importe: total += float("%.6f" % row.total) if k > (page - 1) * (max_lines_per_page - 1): li += 1 f['item.descripcion%02d' % li] = row.descripcion if row.importe is not None: f['item.importe%02d' % li] = "%0.2f" % row.total if row.cantidad is not None: f['item.cantidad%02d' % li] = "%0.2f" % row.cantidad # ojo para la nota del detalle # split detail into each line description k = k + 2 if k > (page - 1) * (max_lines_per_page - 1): obs = "\n<U>Nota:</U>\n\n" + notainf for ds in f.split_multicell(obs, 'item.descripcion%02d' % k): for ml in ds.splitlines(): f['item.descripcion%02d' % k] = ml k = k + 1 if pages == page: f['neto'] = "%0.2f" % (total) #f['vat'] = "%0.2f" % (total*(1-1/float("1.12"))) f['iva21'] = float("0.00") f['total_label'] = 'Total:' else: f['total_label'] = 'SubTotal:' f['total'] = "%0.2f" % total if es_para_guardar: f.render("./presupuesto_" + doc_id + ".pdf", dest='F') if sys.platform.startswith("linux"): #print os.getcwd() os.system("evince ./presupuesto_" + doc_id + ".pdf") else: os.system("./presupuesto_" + doc_id + ".pdf") redirect( URL(c='presupuesto', f='email/' + "presupuesto_" + doc_id + ".pdf")) else: f.render("./presupuesto_" + doc_id + ".pdf") if sys.platform.startswith("linux"): #print os.getcwd() os.system("evince ./presupuesto_" + doc_id + ".pdf") else: os.system("./presupuesto_" + doc_id + ".pdf") redirect(URL(c='presupuesto', f='index'))
# generate sample invoice (according Argentina's regulations) the_details = db(db.movement.operation_id == operation_id).select() import random from decimal import Decimal # Instantiate the PyFPDF template f = Template(format="A4", title=T("Operation number") + " %s" % operation_id, author="GestionLibre", subject=utftolatin(document.description), keywords="Sales/Stock/Purchases document") # Complete the template object with .csv file element difinition f.parse_csv(infile=os.path.join(config.PDF_TEMPLATES_FOLDER, 'invoice.csv'), delimiter=";", decimal_sep=",") detail = "" items = [] i = 0 # Here goes the actual document data for detail in the_details: concept = db( db.concept.concept_id == detail.concept_id).select().first() i += 1 ds = utftolatin(concept.description) qty = "%.3f" % float(detail.quantity)
def porcobrar(): import csv, time, math from gluon.contrib.pyfpdf import Template import os.path import sys if request.args(0): if request.args(0) == 'todos': sql = "SELECT cf_proveedor_id, cf_proveedor.razon_social,fc_documento.fecha, \ fc_documento.correlativo,fc_documento.fecha_vencimiento,DATEDIFF(CURDATE(), \ fc_documento.fecha_vencimiento) dias,\ (select sum(total) from fc_documento_det where fc_documento_det.fc_documento_id=fc_documento.id) total,\ (select sum(monto) from fc_cobro_det where fc_cobro_det.fc_documento_id=fc_documento.id) cobrado \ FROM fc_documento \ inner join cf_proveedor on fc_documento.cf_proveedor_id=cf_proveedor.id \ where fc_documento.fc_tipo_doc_id=2\ having total=cobrado \ order by cf_proveedor_id;" sqlid = "SELECT cf_proveedor_id id, count(cf_proveedor_id) count, \ (select sum(total) from fc_documento_det where fc_documento_det.fc_documento_id=fc_documento.id) total, \ (select sum(monto) from fc_cobro_det where fc_cobro_det.fc_documento_id=fc_documento.id) cobrado \ FROM fc_documento \ inner join cf_proveedor on fc_documento.cf_proveedor_id=cf_proveedor.id \ where fc_documento.fc_tipo_doc_id=2 \ having total=cobrado \ order by cf_proveedor_id;" rec = db.executesql(sql, as_dict=True) rec_id = db.executesql(sqlid, as_dict=True) #doc_record=db(db.fc_documento.id == request.args(0)).select() #doc_det_rec=db(db.fc_documento_det.fc_documento_id == request.args(0)).select(orderby=db.fc_documento_det.id) emp_rec = db(db.cf_empresa.id == 1).select() #print emp_rec f = Template(format="A4", title="Cuentas por Cobrar", author="w.a", subject="w.a", keywords="") f.parse_csv(infile=request.folder + '/static/rpt/porcobrar.csv', delimiter=";", decimal_sep=",") max_lines_per_page = 49.0 lines = len(rec) ids = len(rec_id) if ids > lines: pages = ids else: pages = int(math.ceil(float(lines / (max_lines_per_page - 1)))) page = 0 # # # fill placeholders for each page total = float("0.00") for row in range(len(rec_id)): #primer proveedor para ruptura de control #nro paginas para este proveedore #print rec_id.index() subpages = int( math.ceil(float(rec_id[row]['count'] / (max_lines_per_page - 1)))) for pg in range(subpages): f.add_page() page += 1 f['page'] = 'Pagina %s de %s' % (page, pages) if pages > 1 and page < pages: s = 'Continua en la pagina %s' % (page + 1) else: s = '' # setting data from company rowemp = emp_rec[0] f["EMPRESA"] = rowemp.razon_social f["Logo"] = os.path.join(request.env.web2py_path, "applications", "flota", "uploads", rowemp.ruta_foto) f["membrete1"] = 'Rif.:' + rowemp.rif + ' - Nit.: ' + rowemp.nit f["membrete2"] = 'Tel.:' + rowemp.tlf + ' - Fax.: ' + rowemp.fax + 'Email.:' + rowemp.email #datos del proveedor f["proveedor.nombre"] = rowemp['razon_social'] proveedor = rec_id[row]['id'] # print line item... li = 0 k = 0 subtotal = float("0.00") for rowdet in rec: if rowdet['cf_proveedor_id'] == proveedor: k = k + 1 if k > page * (max_lines_per_page - 1): break if k > (page - 1) * (max_lines_per_page - 1): if rowdet['total'] == rowdet['cobrado']: li += 1 f['factura%02d' % li] = rowdet['correlativo'] f['fecha%02d' % li] = rowdet['fecha'] f['vencimiento%02d' % li] = rowdet['fecha_vencimiento'] f['dias%02d' % li] = rowdet['dias'] f['monto%02d' % li] = "%0.2f" % rowdet['total'] subtotal += rowdet['total'] total += subtotal else: f['subtotal.monto'] = "%0.2f" % subtotal break if subtotal > 0: f['subtotal.monto'] = "%0.2f" % subtotal f['total.monto'] = "%0.2f" % total f.render("./porcobrar.pdf") if sys.platform.startswith("linux"): #print os.getcwd() os.system("evince ./porcobrar.pdf") else: os.system("./porcobrar.pdf") redirect(URL(c='default', f='index'))