def VerificaFactura(self, tipo_comp, pto_vta, nro_comp): try: cabecera = Cabfact.get( Cabfact.tipocomp == tipo_comp, Cabfact.numero == '{}{}'.format(pto_vta[-4:], nro_comp[-8:])) except DoesNotExist: cabecera = Cabfact() return cabecera
def CargaFacturasCliente(self): self.view.gridDatos.setRowCount(0) if not self.view.controles['cliente'].text(): return cab = Cabfact().select().where( Cabfact.fecha >= self.view.controles['fecha'].date().toPyDate(), Cabfact.cliente == self.view.controles['cliente'].text()) for c in cab: item = [c.fecha, c.numero, c.total, c.idcabfact] self.view.gridDatos.AgregaItem(items=item)
def BorraComprobantes(self): cabecera = Cabfact.select().where( Cabfact.fecha.between(lo=self.view.textDesdeFecha.toPyDate(), hi=self.view.textHastaFecha.toPyDate())) total = len(cabecera) avance = 0 for cab in cabecera: avance += 1 QApplication.processEvents() self.view.avance.actualizar(avance / total * 100) cab.delete_instance(recursive=True)
def CuentaCorriente(self): if not self.view.lineEditCliente.text(): return modelo = Cabfact() modelo = modelo.select().where(Cabfact.cliente == self.view.lineEditCliente.text(), Cabfact.fecha.between(self.view.desdeFecha.date().toPyDate(), self.view.hastaFecha.date().toPyDate())) data = [] saldo = decimal.Decimal.from_float(0.) for m in modelo: if m.tipocomp.lado == 'H': debe = decimal.Decimal.from_float(0) haber = m.total else: haber = decimal.Decimal.from_float(0) debe = m.total if m.formapago.ctacte: saldo += debe - haber item = [m.formapago.detalle.strip(), m.tipocomp.nombre.strip(), m.numero, m.fecha, debe, haber, saldo] data.append(item) self.view.MostrarDeuda(data=data)
def CargaDeuda(self): self.view.gridDeuda.setRowCount(0) if not self.view.controles['cliente'].text(): return cabfact = Cabfact().select().where( Cabfact.saldo != 0, Cabfact.cliente == self.view.controles['cliente'].text()) for c in cabfact: if c.tipocomp.lado == 'H': saldo = c.saldo * -1 else: saldo = c.saldo item = [ c.tipocomp.nombre, c.numero, c.fecha, saldo, 0, c.idcabfact ] self.view.gridDeuda.AgregaItem(items=item) item = [u'A Cuenta', u'', u'', 0, 0] self.view.gridDeuda.AgregaItem(items=item) self.SumaDeuda()
def ExportaExcel(self, mostrar=True): self.view.avance.setVisible(True) cArchivo = QFileDialog.getSaveFileName(caption="Guardar archivo", directory="", filter="*.XLSX")[0] if not cArchivo: return self.cArchivoGenerado = cArchivo workbook = xlsxwriter.Workbook(cArchivo) worksheet = workbook.add_worksheet() data = Cabfact().select().where( Cabfact.fecha.between(self.view.lineDesdeFecha.date().toPyDate(), self.view.lineHastaFecha.date().toPyDate())) fila, col = 0, 0 worksheet.write(fila, 0, 'Fecha') worksheet.write(fila, 1, 'Tipo Comprobante') worksheet.write(fila, 2, 'Numero') worksheet.write(fila, 3, 'Cliente') worksheet.write(fila, 4, 'Reg IVA') worksheet.write(fila, 5, 'CUIT') worksheet.write(fila, 6, 'Neto 21') worksheet.write(fila, 7, 'Neto 10.5') worksheet.write(fila, 8, 'Operaciones Exentas') worksheet.write(fila, 9, 'IVA') worksheet.write(fila, 10, 'Percep. DGR') worksheet.write(fila, 11, 'CAE') worksheet.write(fila, 12, 'Venc CAE') worksheet.write(fila, 13, 'Producto') worksheet.write(fila, 14, 'Servicio') worksheet.write(fila, 15, 'Total') fila += 1 totalData = len(data) cant = 0.0 for d in data: QApplication.processEvents() cant += 1. self.view.avance.actualizar(cant / totalData * 100.) if str(self.view.controles['desdeptovta'].text()).zfill(4) <= d.numero[:4] <= \ str(self.view.controles['hastaptovta'].text()).zfill(4) \ and d.tipocomp.exporta: worksheet.write(fila, 0, d.fecha.strftime('%d/%m/%Y')) worksheet.write(fila, 1, d.tipocomp.nombre) worksheet.write(fila, 2, d.numero) worksheet.write(fila, 3, d.cliente.nombre) worksheet.write(fila, 4, d.cliente.tiporesp.nombre) worksheet.write(fila, 5, d.cliente.cuit) worksheet.write( fila, 6, d.netoa if d.tipocomp.lado == 'D' else d.netoa * -1) worksheet.write( fila, 7, d.netob if d.tipocomp.lado == 'D' else d.netob * -1) worksheet.write( fila, 9, d.iva if d.tipocomp.lado == 'D' else d.iva * -1) worksheet.write( fila, 10, d.percepciondgr if d.tipocomp.lado == 'D' else d.percepciondgr * -1) worksheet.write(fila, 11, d.cae) worksheet.write( fila, 12, d.venccae.strftime('%d/%m/%Y') if d.venccae else '') deta = Detfact.select().where(Detfact.idcabfact == d.idcabfact) totserv = decimal.Decimal.from_float(0.) totprod = totserv op_exentas = 0 for det in deta: art = Articulo.get_by_id(det.idarticulo) if art.concepto.strip(): if int(art.concepto.strip()) == FEv1.SERVICIOS: totserv += det.precio * det.cantidad if d.tipocomp.lado == 'D' else \ det.precio * det.cantidad * -1 else: totprod += det.precio * det.cantidad if d.tipocomp.lado == 'D' else \ det.precio * det.cantidad * -1 else: totprod += det.precio * det.cantidad if d.tipocomp.lado == 'D' else \ det.precio * det.cantidad * -1 if det.montoiva == 0: op_exentas += det.precio * det.cantidad worksheet.write(fila, 8, op_exentas) worksheet.write(fila, 13, totprod) worksheet.write(fila, 14, totserv) worksheet.write(fila, 15, '=sum(G{}:J{})'.format(fila + 1, fila + 1)) fila += 1 worksheet.write(fila, 6, '=sum(G{}:G{})'.format(2, fila)) worksheet.write(fila, 7, '=sum(H{}:H{})'.format(2, fila)) worksheet.write(fila, 8, '=sum(I{}:I{})'.format(2, fila)) worksheet.write(fila, 9, '=sum(J{}:J{})'.format(2, fila)) worksheet.write(fila, 10, '=sum(K{}:K{})'.format(2, fila)) worksheet.write(fila, 13, '=sum(N{}:N{})'.format(2, fila)) worksheet.write(fila, 14, '=sum(O{}:O{})'.format(2, fila)) worksheet.write(fila, 15, '=sum(P{}:P{})'.format(2, fila)) workbook.close() self.view.avance.setVisible(False) if mostrar: AbrirArchivo(cArchivo)
def Procesar(self): #arch = open(Constantes.ARCHIVO_CITI_VTAS + "ventas" + self.periodo.cPeriodo + ".txt", "w") #archDet = open(Constantes.ARCHIVO_CITI_VTAS + "alicuotas-ventas" + self.periodo.cPeriodo + ".txt", "w") if not os.path.isdir("cpras-vtas"): os.mkdir("cpras-vtas") data = Cabfact.select().where( Cabfact.fecha.between(lo=self.view.periodo.dInicio, hi=self.view.periodo.dFin)) arch = open( GuardarArchivo(caption="Guardar archivo", directory="cpras-vtas", filter="*.TXT", filename="REGINFO_CV_VENTAS_CBTE_{}".format( self.view.periodo.cPeriodo)), "w") archDet = open( GuardarArchivo(caption="Guardar archivo", directory="cpras-vtas", filter="*.TXT", filename="REGINFO_CV_VENTAS_ALICUOTAS_{}".format( self.view.periodo.cPeriodo)), "w") if not arch or not archDet: return anchos = [ 8, 3, 5, 20, 20, 2, 20, 30, 15, 15, 15, 15, 15, 15, 15, 15, 3, 10, 1, 1, 15, 8 ] anchosDet = [3, 5, 20, 15, 4, 15] totalData = len(data) cant = 0.0 for d in data: QApplication.processEvents() cant += 1. self.view.avance.actualizar(cant / totalData * 100.) if d.tipocomp.exporta: fecha = FechaMysql(d.fecha) tipocomp = str(d.tipocomp.codigo).zfill(3) ptovta = d.numero[:4].zfill(5) numero = d.numero[4:].zfill(20) if d.cliente.tiporesp.idtiporesp == 3: #consumidor final if d.total > 1000: tipodoc = '96' ndoc = str(d.cliente.dni).zfill( 20) if d.cliente.dni != 0 else '11111111'.zfill(20) else: tipodoc = '99' if d.cliente.dni == 0 or d.cliente.dni == '11111111' else '96' ndoc = ''.zfill( 20) if d.cliente.dni == '11111111' else str( d.cliente.dni).zfill(20) else: tipodoc = '80' ndoc = d.cliente.cuit.replace('-', '').zfill(20) nombre = Normaliza(d.nombre[:30]) total = '{:.{prec}f}'.format(d.total, prec=2).replace('.', '').zfill(15) nogravado, nocategorizado, exentas, percepcion, municipal, impinterno, otros = \ ''.zfill(15), ''.zfill(15), ''.zfill(15), ''.zfill(15), ''.zfill(15),''.zfill(15),''.zfill(15) percepciondgr = '{:.{prec}f}'.format( d.percepciondgr, prec=2).replace('.', '').zfill(15) moneda = 'PES' cambio = '1000000'.zfill(10) if d.netoa != 0 and d.netob != 0: cantalic = '2' elif d.netoa != 0 and d.netob == 0: cantalic = '1' elif d.netoa == 0 and d.netob != 0: cantalic = '1' else: cantalic = '1' if d.netoa == 0 and d.netob == 0: codop = 'A' else: codop = '0' vencepago = ''.zfill(8) items = [ fecha, tipocomp, ptovta, numero, numero, tipodoc, ndoc, nombre, total, nogravado, nocategorizado, exentas, percepcion, percepciondgr, municipal, impinterno, moneda, cambio, cantalic, codop, otros, vencepago ] arch.write("".join("%*s" % i for i in zip(anchos, items))) arch.write("\n") if d.netoa != 0: alicuota = Constantes.ALICUOTA_AFIP[21] impuesto = '{:.{prec}f}'.format(round(float(d.netoa) * 21. / 100,2), prec=2)\ .replace(".","").zfill(15) items = [ tipocomp, ptovta, numero, str(d.netoa).replace(".", "").zfill(15), alicuota, impuesto ] archDet.write("".join("%*s" % i for i in zip(anchosDet, items))) archDet.write("\n") if d.netob != 0: alicuota = Constantes.ALICUOTA_AFIP[10.5] impuesto = '{:.{prec}f}'.format(round(float(d.netob) * 10.5 / 100,2), prec=2)\ .replace(".","").zfill(15) items = [ tipocomp, ptovta, numero, str(d.netob).replace(".", "").zfill(15), alicuota, impuesto ] archDet.write("".join("%*s" % i for i in zip(anchosDet, items))) archDet.write("\n") if d.netoa == 0 and d.netob == 0: alicuota = Constantes.ALICUOTA_AFIP[0] impuesto = '0'.zfill(15) items = [ tipocomp, ptovta, numero, str(d.netob).replace(".", "").zfill(15), alicuota, impuesto ] archDet.write("".join("%*s" % i for i in zip(anchosDet, items))) archDet.write("\n") arch.close() archDet.close() Ventanas.showAlert("Sistema", "Proceso finalizado") self.view.close()
def onClickGraba(self): self.SumaDeuda() self.SumaPagos() cliente = Cliente.get_by_id(int(self.view.controles['cliente'].text())) recibo = Cabfact() recibo.tipocomp = Tipocomprobantes.CODIGO_RECIBO recibo.cliente = cliente.idcliente recibo.fecha = datetime.today() recibo.numero = str(TipoComprobante().SiguienteNumero( Tipocomprobantes.CODIGO_RECIBO)).zfill(12) recibo.total = float(self.view.controles['pagos'].text()) if float(self.view.controles['saldo'].text()) < 0: recibo.saldo = abs(float(self.view.controles['saldo'].text())) recibo.tipoiva = cliente.tiporesp.idtiporesp recibo.formapago = Tipocomprobantes.FORMA_PAGO['Cta Cte'] recibo.nombre = cliente.nombre recibo.domicilio = cliente.domicilio recibo.save() for x in range(self.view.gridDeuda.rowCount()): id = self.view.gridDeuda.ObtenerItem(fila=x, col='id') or 0 importe = float( self.view.gridDeuda.ObtenerItem(fila=x, col='a Saldar') or 0) cabecera = Cabfact.get_by_id(int(id)) cabecera.saldo = float(cabecera.saldo) - abs(importe) cabecera.desde = "0000-00-00" cabecera.hasta = "0000-00-00" cabecera.venccae = "0000-00-00" cabecera.save()
def onClickExcel(self, mostrar=True): archivo = GuardarArchivo(filter="*.XLSX", directory="excel/", filename="informe de ventas por grupo") if not archivo: return archivo = str(archivo) self.view.avance.setVisible(True) data = Cabfact().select().where( Cabfact.fecha.between(self.view.textDesdeFecha.date().toPyDate(), self.view.textHastaFecha.date().toPyDate())) workbook = xlsxwriter.Workbook(archivo) worksheet = workbook.add_worksheet() fila, col = 0, 0 worksheet.write( fila, 0, "Desde fecha {} hasta fecha {}".format( self.view.textDesdeFecha.text(), self.view.textHastaFecha.text())) fila += 2 worksheet.write(fila, 0, 'Fecha') worksheet.write(fila, 1, 'Tipo Comprobante') worksheet.write(fila, 2, 'Numero') worksheet.write(fila, 3, 'Grupo') worksheet.write(fila, 4, 'Importe') fila += 1 totalData = len(data) cant = 0.0 for d in data: QApplication.processEvents() cant += 1. self.view.avance.actualizar(cant / totalData * 100.) detfac = Detfact.select().where(Detfact.idcabfact == d.idcabfact) for det in detfac: worksheet.write(fila, 0, d.fecha.strftime('%d/%m/%Y')) worksheet.write(fila, 1, d.tipocomp.nombre) worksheet.write(fila, 2, d.numero) worksheet.write(fila, 3, det.idarticulo.grupo.nombre) if LeerIni(clave='cat_iva', key='WSFEv1') == Constantes.CODIGO_RI: worksheet.write( fila, 4, det.precio * det.cantidad + det.montoiva + det.montodgr) else: worksheet.write(fila, 4, det.precio * det.cantidad) fila += 1 precio = fn.Sum(Detfact.precio * Detfact.cantidad).alias("precio") montoiva = fn.Sum(Detfact.montoiva).alias("montoiva") montodgr = fn.Sum(Detfact.montodgr).alias("montodgr") det = Detfact.select(precio, montodgr, montoiva, Grupo.nombre, Impuesto.porcentaje)\ .join(Cabfact).switch(Detfact).join(Articulo).join(Grupo).join(Impuesto).where( Cabfact.fecha.between(self.view.textDesdeFecha.date().toPyDate(), self.view.textHastaFecha.date().toPyDate()))\ .group_by(Detfact.idarticulo.grupo.idgrupo) fila += 2 for d in det: worksheet.write(fila, 1, d.idarticulo.grupo.nombre) if LeerIni(clave='cat_iva', key='WSFEv1') == Constantes.CODIGO_RI: worksheet.write(fila, 2, d.precio + d.montoiva, d.montodgr) worksheet.write(fila, 3, d.idarticulo.grupo.impuesto.porcentaje) else: worksheet.write(fila, 2, d.precio) worksheet.write(fila, 3, d.idarticulo.grupo.impuesto.porcentaje) fila += 1 workbook.close() self.view.avance.setVisible(False) if mostrar: AbrirArchivo(archivo)
def ImprimeFactura(self, idcabecera=None, mostrar=True, *args, **kwargs): if not idcabecera: return cabfact = Cabfact().get_by_id(idcabecera) print("imprimir factura {}".format(cabfact.numero)) pyfpdf = FEPDF() #cuit del emisor pyfpdf.CUIT = LeerIni(clave='cuit', key='WSFEv1') #establezco formatos (cantidad de decimales): pyfpdf.FmtCantidad = "0.4" pyfpdf.FmtPrecio = "0.2" #Datos del encabezado de la factura: tipo_cbte = cabfact.tipocomp.codigo punto_vta = cabfact.numero[:4] cbte_nro = cabfact.numero[-8:] fecha = FechaMysql(cabfact.fecha) concepto = cabfact.concepto #datos del cliente: tipo_doc = "80" if cabfact.cliente.tiporesp_id != 3 else "96" nro_doc = cabfact.cliente.cuit if cabfact.cliente.tiporesp_id != 3 else str( cabfact.cliente.dni) nombre_cliente = cabfact.nombre if cabfact.nombre != '' else cabfact.cliente.nombre domicilio_cliente = cabfact.domicilio #totales del comprobante: imp_total = cabfact.total imp_tot_conc = "0.00" imp_neto = cabfact.neto imp_iva = cabfact.iva imp_trib = cabfact.percepciondgr imp_op_ex = "0.00" imp_subtotal = cabfact.neto fecha_cbte = fecha fecha_venc_pago = fecha #Fechas del período del servicio facturado if int(cabfact.concepto) in [ FEv1().SERVICIOS, FEv1().PRODUCTOYSERVICIOS ]: fecha_serv_desde = FechaMysql(cabfact.desde) fecha_serv_hasta = FechaMysql(cabfact.hasta) else: fecha_serv_hasta = None fecha_serv_desde = None moneda_id = "PES" moneda_ctz = "1.000" obs_generales = "" obs_comerciales = "" moneda_id = "" moneda_ctz = 1 cae = cabfact.cae fecha_vto_cae = FechaMysql(cabfact.venccae) #Creo la factura(internamente en la interfaz) ok = pyfpdf.CrearFactura(concepto, tipo_doc, nro_doc, tipo_cbte, punto_vta, cbte_nro, imp_total, imp_tot_conc, imp_neto, imp_iva, imp_trib, imp_op_ex, fecha_cbte, fecha_venc_pago, fecha_serv_desde, fecha_serv_hasta, moneda_id, moneda_ctz, cae, fecha_vto_cae, "", nombre_cliente, domicilio_cliente, 0) pyfpdf.EstablecerParametro("forma_pago", cabfact.formapago.detalle) pyfpdf.EstablecerParametro( "custom-nro-cli", "[{}]".format(str(cabfact.cliente.idcliente).zfill(5))) pyfpdf.EstablecerParametro("localidad_cli", cabfact.cliente.localidad.nombre) pyfpdf.EstablecerParametro("provincia_cli", cabfact.cliente.localidad.provincia) pyfpdf.EstablecerParametro("iva_cli", cabfact.cliente.tiporesp.nombre) #Agregar comprobantes asociados(si es una NC / ND): if cabfact.tipocomp.codigo in [3, 8, 13]: cpbterel = CpbteRel().select().where( CpbteRel.idcabfact == cabfact.idcabfact) for cp in cpbterel: tipo = cp.idtipocpbte.codigo pto_vta = cp.numero[:4] nro = cp.numero[-8:] pyfpdf.AgregarCmpAsoc(tipo, pto_vta, nro) # if str(self.view.cboComprobante.text()).find('credito'): # tipo = 19 # pto_vta = 2 # nro = 1234 # pyfepdf.AgregarCmpAsoc(tipo, pto_vta, nro) #Agrego subtotales de IVA(uno por alicuota) if cabfact.netoa != 0: iva_id = 5 #c�digo para al�cuota del 21 % base_imp = cabfact.netoa #importe neto sujeto a esta al�cuota importe = cabfact.netoa * 21 / 100 #importe liquidado de iva ok = pyfpdf.AgregarIva(iva_id, base_imp, importe) if cabfact.netob != 0: iva_id = 4 # c�digo para al�cuota del 10.5 % base_imp = cabfact.netob # importe neto sujeto a esta al�cuota importe = cabfact.netob * 10.5 / 100 # importe liquidado de iva ok = pyfpdf.AgregarIva(iva_id, base_imp, importe) if cabfact.netoa == 0 and cabfact.netob == 0: iva_id = 3 # c�digo para al�cuota del 21 % base_imp = cabfact.netob # importe neto sujeto a esta al�cuota importe = 0 # importe liquidado de iva ok = pyfpdf.AgregarIva(iva_id, base_imp, importe) if cabfact.percepciondgr != 0: #Agregar cada impuesto(por ej.IIBB, retenciones, percepciones, etc.): tributo_id = 99 #codigo para 99 - otros tributos Desc = cabfact.cliente.percepcion.detalle base_imp = cabfact.neto #importe sujeto a estetributo alic = cabfact.cliente.percepcion.porcentaje #alicuota(porcentaje) de estetributo importe = cabfact.percepciondgr #importe liquidado de este tributo ok = pyfpdf.AgregarTributo(tributo_id, Desc, base_imp, alic, importe) det = Detfact().select().where(Detfact.idcabfact == cabfact.idcabfact) for d in det: #Agrego detalles de cada item de la factura: u_mtx = 0 #unidades cod_mtx = "" #c�digo de barras codigo = d.idarticulo.idarticulo #codigo interno a imprimir(ej. "articulo") ds = d.descad.strip() qty = d.cantidad #cantidad umed = 7 #c�digo de unidad de medida(ej. 7 para"unidades") precio = d.precio #precio neto(A) o iva incluido(B) bonif = 0 #importe de descuentos iva_id = FEv1().TASA_IVA[str(float( d.tipoiva.iva))] #c�digopara al�cuota del 21 % imp_iva = d.montoiva #importe liquidado deiva importe = d.precio * d.cantidad #importe total del item despacho = "" #numero de despacho de importaci�n dato_a = "" #primer dato adicional del item dato_b = "" dato_c = "" dato_d = "" dato_e = "" #ultimo dato adicionaldel item ok = pyfpdf.AgregarDetalleItem(u_mtx, cod_mtx, codigo, ds, qty, umed, precio, bonif, iva_id, imp_iva, importe, despacho, dato_a, dato_b, dato_c, dato_d, dato_e) #Agrego datos adicionales fijos: ok = pyfpdf.AgregarDato("logo", ubicacion_sistema() + "plantillas/logo.png") fondo = ParamSist.ObtenerParametro("FONDO_FACTURA") if fondo: x1 = ParamSist.ObtenerParametro("FONDO_FACTURA_X1") or 50 y1 = ParamSist.ObtenerParametro("FONDO_FACTURA_Y1") or 117.1 x2 = ParamSist.ObtenerParametro("FONDO_FACTURA_X2") or 150 y2 = ParamSist.ObtenerParametro("FONDO_FACTURA_Y2") or 232.9 pyfpdf.AgregarCampo("fondo_factura", 'I', x1, y1, x2, y2, foreground=0x808080, priority=-1, text=imagen(fondo)) ok = pyfpdf.AgregarDato( "EMPRESA", "Razon social: {}".format( DeCodifica(LeerIni(clave='empresa', key='FACTURA')))) ok = pyfpdf.AgregarDato( "MEMBRETE1", "Domicilio Comercial: {}".format( DeCodifica(LeerIni(clave='membrete1', key='FACTURA')))) ok = pyfpdf.AgregarDato( "MEMBRETE2", DeCodifica(LeerIni(clave='membrete2', key='FACTURA'))) ok = pyfpdf.AgregarDato( "CUIT", 'CUIT: {}'.format(LeerIni(clave='cuit', key='WSFEv1'))) ok = pyfpdf.AgregarDato("IIBB", LeerIni(clave='iibb', key='FACTURA')) ok = pyfpdf.AgregarDato( "IVA", "Condicion frente al IVA: {}".format( LeerIni(clave='iva', key='FACTURA'))) ok = pyfpdf.AgregarDato( "INICIO", "Fecha inicio actividades: {}".format( LeerIni(clave='inicio', key='FACTURA'))) if int(cabfact.tipocomp.codigo ) in Constantes.COMPROBANTES_FCE: #si es una FCE pyfpdf.AgregarDato('CBUFCE', LeerIni('CBUFCE', key='FACTURA')) pyfpdf.AgregarDato('ALIASFCE', LeerIni('ALIASFCE', key='FACTURA')) pyfpdf.AgregarDato('nombre_condvta', Constantes.COND_VTA['T']) ok = pyfpdf.CargarFormato(ubicacion_sistema() + "/plantillas/factura-fce.csv") else: #Cargo el formato desde el archivo CSV(opcional) #(carga todos los campos a utilizar desde la planilla) ok = pyfpdf.CargarFormato(ubicacion_sistema() + "/plantillas/factura.csv") #Creo plantilla para esta factura(papel A4vertical): if LeerIni(clave='h**o') == 'S': pyfpdf.AgregarCampo("h**o", 'T', 150, 350, 0, 0, size=70, rotate=45, foreground=0x808080, priority=-1, text="HOMOLOGACION") papel = "A4" #o "letter" para carta, "legal" para oficio orientacion = "portrait" #o landscape(apaisado) ok = pyfpdf.CrearPlantilla(papel, orientacion) num_copias = int( LeerIni(clave='num_copias', key='FACTURA')) #original, duplicado y triplicado lineas_max = 24 #cantidad de linas de items porp�gina qty_pos = "izq" #(cantidad a la izquierda de la descripci�n del art�culo) #Proceso la plantilla ok = pyfpdf.ProcesarPlantilla(num_copias, lineas_max, qty_pos) if not os.path.isdir('facturas'): os.mkdir('facturas') #Genero el PDF de salida seg�n la plantilla procesada salida = join( 'facturas', "{}-{}.pdf".format(cabfact.tipocomp.nombre, cabfact.numero)) ok = pyfpdf.GenerarPDF(salida) #Abro el visor de PDF y muestro lo generado #(es necesario tener instalado Acrobat Reader o similar) imprimir = False #cambiar a True para que lo envie directo a laimpresora if mostrar: pyfpdf.MostrarPDF(salida, imprimir) self.facturaGenerada = salida
def GrabaFE(self, *args, **kwargs): self.view.layoutFactura.AssignNumero() cabfact = Cabfact() cabfact.tipocomp = self.tipo_cpte cabfact.cliente = self.cliente.idcliente cabfact.fecha = self.view.lineEditFecha.date().toPyDate() cabfact.numero = self.view.layoutFactura.numero cabfact.neto = sum([i for i in self.netos.values()]) cabfact.netoa = self.netos[21] cabfact.netob = self.netos[10.5] cabfact.iva = self.view.lineEditTotalIVA.value() cabfact.total = self.view.lineEditTotal.value() if self.view.cboFormaPago.text() == 'Contado': cabfact.saldo = 0.00 else: cabfact.saldo = self.view.lineEditTotal.value() cabfact.tipoiva = self.cliente.tiporesp.idtiporesp cabfact.cajero = 1 #por defecto cajero cabfact.formapago = 1 if self.view.cboFormaPago.text( ) == 'Contado' else 2 cabfact.percepciondgr = self.view.lineEditTributos.value() cabfact.nombre = self.view.lblNombreCliente.text() cabfact.domicilio = self.view.lineEditDomicilio.text() cabfact.cae = self.view.lineditCAE.text() cabfact.venccae = self.view.fechaVencCAE.date().toPyDate() cabfact.concepto = self.concepto cabfact.desde = self.view.fechaDesde.date().toPyDate() cabfact.hasta = self.view.fechaHasta.date().toPyDate() cabfact.save() for x in range(self.view.gridFactura.rowCount()): codigo = self.view.gridFactura.ObtenerItem(fila=x, col='Codigo') cantidad = float( self.view.gridFactura.ObtenerItem(fila=x, col='Cant.')) importe = float( self.view.gridFactura.ObtenerItem(fila=x, col='SubTotal')) iva = float(self.view.gridFactura.ObtenerItem(fila=x, col='IVA')) detalle = self.view.gridFactura.ObtenerItem(fila=x, col='Detalle') try: articulo = Articulo.get_by_id(codigo) detfact = Detfact() detfact.idcabfact = cabfact.idcabfact detfact.idarticulo = codigo detfact.cantidad = cantidad detfact.unidad = articulo.unidad detfact.costo = articulo.costo if LeerIni(clave='cat_iva', key='WSFEv1') == 1: if self.tipo_cpte in [6, 7, 8]: detfact.precio = importe / cantidad else: detfact.precio = (importe + importe * iva / 100) / cantidad else: detfact.precio = importe / cantidad try: ti = Tipoiva.get(Tipoiva.iva == iva) detfact.tipoiva = ti.codigo except Tipoiva.DoesNotExist: detfact.tipoiva = articulo.tipoiva.codigo if self.tipo_cpte in [6, 7, 8]: detfact.montoiva = importe * iva / 100 else: neto = round(importe / ((iva / 100) + 1), 3) detfact.montoiva = neto * iva / 100 if self.view.lineEditTributos.value() > 0: detfact.montodgr = importe * float( self.cliente.percepcion.porcentaje) / 100 else: detfact.montodgr = 0.00 detfact.montomuni = 0.00 detfact.descad = detalle detfact.detalle = detalle[:40] detfact.descuento = 0.00 detfact.save() except peewee.DoesNotExist: pass # Agregar comprobantes asociados(si es una NC / ND): if str(self.view.cboComprobante.text()).find('credito'): cpbte = CpbteRel() cpbte.idcabfact = cabfact.idcabfact if self.tipo_cpte == 13: cpbte.idtipocpbte = 11 else: if self.cliente.tiporesp.idtiporesp == 2: # resp inscripto cpbte.idtipocpbte = 1 else: cpbte.idtipocpbte = 6 cpbte.numero = self.view.layoutCpbteRelacionado.numero cpbte.save() self.ImprimeFactura(idcabecera=cabfact.idcabfact)
from modelos.Formaspago import Formapago from modelos.Grupos import Grupo from modelos.Impuestos import Impuesto from modelos.Localidades import Localidad from modelos.Proveedores import Proveedor from modelos.Tipocomprobantes import TipoComprobante from modelos.Tipodoc import Tipodoc from modelos.Tipoiva import Tipoiva from modelos.Tiporesp import Tiporesp from modelos.Unidades import Unidad if 'drop' in sys.argv: CpbteRel().drop_table() CtaCte().drop_table() Detfact().drop_table() Cabfact().drop_table() CabFactProv().drop_table() DetFactProv().drop_table() EmailCliente().drop_table() Cliente().drop_table() Articulo().drop_table() Proveedor().drop_table() Unidad().drop_table() Grupo().drop_table() Impuesto().drop_table() Formapago().drop_table() Tiporesp().drop_table() Tipodoc().drop_table() Localidad().drop_table() Tipoiva().drop_table() Cajero().drop_table()
def onClickBtnImportar(self, *args, **kwargs): if not os.path.isfile(self.view.textArchivo.text()) or \ not os.path.isfile(self.view.textArchivo_det.text()): Ventanas.showAlert("Sistema", "Archivos no validos o no encontrados") return if self.view.checkBorra.isChecked(): self.BorraComprobantes() archivo = open(self.view.textArchivo.text(), "r") total = total_lineas_archivo(self.view.textArchivo.text()) avance = 1 for linea in archivo: avance += 1 QApplication.processEvents() self.view.avance.actualizar(avance / total * 100) fecha_cbte = datetime.strptime(linea[0:8], "%Y%m%d").date() if self.view.textDesdeFecha.toPyDate( ) <= fecha_cbte <= self.view.textHastaFecha.toPyDate(): tipo_doc = linea[56:58] nro_doc = linea[59:78][-11:] nombre = linea[78:108] pto_vta = linea[11:16] nro_comp = linea[17:36] tipo_comp = linea[8:11] cliente = self.VerificaCliente(tipo_doc, nro_doc, nombre) cabecera = self.VerificaFactura(tipo_comp, pto_vta, nro_comp) cabecera.tipocomp = tipo_comp cabecera.cliente = cliente.idcliente cabecera.fecha = fecha_cbte cabecera.numero = '{}{}'.format(pto_vta[-4:], nro_comp[-8:]) if tipo_comp in ['011', '012', '013']: #comprobantes sin iva cabecera.neto = float(linea[109:123]) / 100 cabecera.iva = 0 cabecera.netoa = 0 cabecera.netob = 0 cabecera.descuento = 0 cabecera.recargo = 0 cabecera.total = cabecera.neto cabecera.saldo = 0 cabecera.tipoiva = cliente.tiporesp.idtiporesp cabecera.formapago = 1 cabecera.cuotapago = 0 cabecera.percepciondgr = float(linea[184:198]) / 100 cabecera.nombre = nombre cabecera.domicilio = "" cabecera.obs = "" cabecera.save() archivo.close() archivo = open(self.view.textArchivo_det.text(), "r") total = total_lineas_archivo(self.view.textArchivo_det.text()) avance = 1 for linea in archivo: avance += 1 QApplication.processEvents() self.view.avance.actualizar(avance / total * 100) try: cabecera = Cabfact.get( Cabfact.tipocomp == linea[0:3], Cabfact.numero == '{}{}'.format(linea[4:8], linea[20:28])) try: detalle = Detfact.get( Detfact.idcabfact == cabecera.idcabfact, Detfact.idarticulo == 1) except DoesNotExist: detalle = Detfact() articulo = Articulo.get_by_id(1) detalle.idcabfact = cabecera.idcabfact detalle.idarticulo = articulo.idarticulo detalle.cantidad = 1 detalle.unidad = 'UN' detalle.costo = 0 detalle.precio = cabecera.neto detalle.tipoiva = articulo.tipoiva.codigo detalle.montoiva = cabecera.total / ( articulo.tipoiva.iva / 100 + 1) * articulo.tipoiva.iva / 100 detalle.montodgr = cabecera.percepciondgr detalle.montomuni = 0 detalle.detalle = articulo.nombre detalle.descuento = 0 detalle.save() except DoesNotExist: pass
def onClickBtnExcel(self): excel = Excel() if not excel.ObtieneArchivo( archivo="informe recategorizacion de {} a {}".format( self.view.spnAnio.value(), self.view.cboPeriodo.GetDato().replace("/", ""))): return #ajuste por Gonzalo if (self.view.cboPeriodo.GetDato() == "Julio/Diciembre"): desde, hasta = self.view.cboPeriodo.RangoFecha( self.view.spnAnio.value() + 1) else: desde, hasta = self.view.cboPeriodo.RangoFecha( self.view.spnAnio.value()) datos = Cabfact.DatosAgrupadosPeriodo(desde=desde, hasta=hasta) fila = 0 excel.Titulo('Informe para recategorizacion', desdecol='A', hastacol='B', fila=fila) fila += 1 avance = 1 total = len(datos) total_facturacion = 0 for d in datos: QApplication.processEvents() self.view.avance.actualizar(avance / total * 100) avance += 1 total_facturacion += float(d.total) fila += 2 datos = ['Detalle', 'Montos'] excel.EscribeFila(datos=datos, fila=fila) fila += 1 datos = [ 'Ingresos Brutos Devengados entre {} y {}'.format( FormatoFecha(desde, formato="dma"), FormatoFecha(hasta, formato="dma")), total_facturacion ] excel.EscribeFila(datos=datos, fila=fila) fila += 1 categoria_monotributo = ParamSist.ObtenerParametro( "CATEGORIA_MONOTRIBUTO") datos = ['Categoria Actual', categoria_monotributo] excel.EscribeFila(datos=datos, fila=fila) try: datos_categoria = CategoriaMono.get_by_id(categoria_monotributo) datos = [ f'Categoria actual {datos_categoria.categoria}', datos_categoria.ing_brutos ] except: datos = ['Datos de categoria no encontrado', 0] excel.EscribeFila(datos=datos, fila=fila) fila += 1 categoria_monto = CategoriaMono.CategoriaMonto(total_facturacion) if categoria_monto: datos = [ f'Recategorizacion {categoria_monto.categoria}', categoria_monto.ing_brutos ] ingresos = categoria_monto.ing_brutos if ParamSist.ObtenerParametro("ACTIVIDAD_MONOTRIBUTO") == "S": cuota = float(categoria_monto.imp_servicio) else: cuota = float(categoria_monto.imp_cosas_muebles) aporte_os = float(categoria_monto.obra_social) * ( float(ParamSist.ObtenerParametro("CANTIDAD_ADH_OS") or 0) + 1) + float(categoria_monto.sipa) else: datos = ['Datos para recategorizacion no encontrado'] ingresos = 0 cuota = 0 aporte_os = 0 excel.EscribeFila(datos=datos, fila=fila) fila += 1 datos = [ 'Hasta el {} todavia podes facturar'.format(FormatoFecha(hasta)), round(float(ingresos) - total_facturacion, 2) ] excel.EscribeFila(datos=datos, fila=fila) fila += 1 meses = diferencia_meses(hasta, datetime.now().date()) + 1 datos = [ f"Faltan {meses} meses para la proxima recategorizacion", meses ] excel.EscribeFila(datos=datos, fila=fila) fila += 1 datos = ["Por mes podes facturar", f"=+B{fila-1}/B{fila}"] excel.EscribeFila(datos=datos, fila=fila) fila += 2 datos = ["Montos para la nueva categoria", ""] excel.EscribeFila(datos=datos, fila=fila) fila += 1 datos = ['Cuota Mensual', cuota] excel.EscribeFila(datos=datos, fila=fila) fila += 1 datos = ['Aporte autonomo / Obra social', aporte_os] excel.EscribeFila(datos=datos, fila=fila) fila += 1 datos = ['Total', aporte_os + cuota] excel.EscribeFila(datos=datos, fila=fila) excel.Cerrar()