コード例 #1
0
    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
コード例 #2
0
 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)
コード例 #3
0
 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)
コード例 #4
0
    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)
コード例 #5
0
    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()
コード例 #6
0
    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)
コード例 #7
0
    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()
コード例 #8
0
    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()
コード例 #9
0
    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)
コード例 #10
0
    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
コード例 #11
0
    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)
コード例 #12
0
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()
コード例 #13
0
    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()