def procesar_factura(self, f, model, subtotal, total, pendiente, cobrado, 
                         total_pagares, pendiente_pagares, cobrado_pagares, 
                         total_otros, pendiente_otros, cobrado_otros, 
                         total_vencimientos, total_cobrado_strict, 
                         nodos_clientes):
        fecha = f.fecha
        mes = utils.corregir_nombres_fecha(fecha.strftime("%B '%y"))
        primero_mes = datetime.date(day = 1, 
                                    month = fecha.month, 
                                    year = fecha.year)
        try:
            rowpadre = [r for r in model if r[2] == mes][0]
            padre = rowpadre.iter
        except IndexError:
            padre = model.append(None, ("", utils.str_fecha(primero_mes), 
                                        mes, 0.0, False, "", 0, "", "", "", 
                                        "", 0, 0, 0))
            subtotal[mes] = 0

        tf, cf, pf, tp, cp, pp, to, co, po, tv, tcs = agregar_a_model(
                                                    model, f, padre, 
                                                    self.wids['tv_facturas'], 
                                                    nodos_clientes)
        subtotal[mes] += tf
        total += tf
        pendiente += pf
        cobrado += cf
        total_pagares += tp
        pendiente_pagares += pp
        cobrado_pagares += cp
        total_otros += to
        pendiente_otros += po
        cobrado_otros += co
        total_vencimientos += tv    # No tiene por qué coincidir con el 
                    # total facturado, ya que puede haber facturas sin 
                    # vencimientos creados (no es lo normal, pero es lo 
                    # que se ha estado usando para facturas antiguas que 
                    # no deben aparecer como pendientes de cobro con 
                    # vencimientos pendientes de cobrar).
        total_cobrado_strict += tcs
        
        model[padre][0] = "%s €" % (utils.float2str(subtotal[mes]))     
            # Total facturado (con o sin vencimientos)
        model[padre][3] += tv
            # Total vencimientos.
        #model[padre][6] += tp                                           
            # Total en pagarés (vencidos o no)
        model[padre][6] += tcs
            # Total cobrado estricto (importe de los cobros, incluyendo
            # pagarés, vencidos o no, y pendientes o no; cheques, otros, etc.
        model[padre][12] += to
            # Total otros (cobrado o no)
        return (total, pendiente, cobrado, total_pagares, pendiente_pagares, 
                cobrado_pagares, total_otros, pendiente_otros, cobrado_otros, 
                total_vencimientos, total_cobrado_strict)
 def agregar_factura_de_abono(self, f, model, total, vencido):
     vtos = []
     vtos_emparejados = f.emparejar_vencimientos()
     for vto in vtos_emparejados['vtos']:
         try:
             cobro = vtos_emparejados[vto][0]
         except IndexError:
             cobro = None
         vtos.append([vto, None, cobro])
         # OJO: A diferencia que con el emparejar_vencimientos de pclases.FacturaCompra, no debería haber más de un 
         # cobro por vencimiento en los abonos ni haber cobros sin vencimientos (clave None del diccionario), ya 
         # que los vencimientos son ficticios, no se corresponden con ningún registro de la BD (es una clase "closured") 
         # y se crean sobre la marcha en la función. Como tampoco se permite asociar una misma factura de abono a más 
         # de un cobro (bien en factura o bien en pagaré), nunca habrá más de un "vencimiento" por abono.
     # XXX: Hasta aquí lo que hace el preparar_vencimientos con las facturasVenta. Ahora a agregarlo al TreeView.
     vtos = [v for v in vtos if (v[2]==None or (v[2].pagareCobro != None and v[2].pagareCobro.pendiente)) and v[0] != None]
         # Todos los que no tienen pagaré o si lo tienen, que esté pendiente
         # y los que sean realmente vencimientos (hay entradas en vtos que pueden tener v[0] a None).
     for v in vtos:
         if v[2]!=None and v[2].pagareCobro!=None:
             pagare = v[2].pagareCobro
         else:
             pagare = None
         fechavto = pagare and pagare.fechaCobro or v[0].fecha   # Fecha del vencimiento final: la del vencimiento de la factura
                                                                 # si no tiene pagaré o la del vencimiento del pagaré que cubre
                                                                 # el vencimiento de la factura.
         mes = utils.corregir_nombres_fecha(fechavto.strftime("%B '%y"))
         primero_mes = mx.DateTime.DateTimeFrom(day = 1, month = fechavto.month, year = fechavto.year)
         try:
             rowpadre = [r for r in model if r[2] == mes][0]
             padre = rowpadre.iter
         except IndexError:
             padre = model.append(None, ("", utils.str_fecha(primero_mes), mes, 0.0, "", "", 0))
         factura = v[0].get_factura_o_prefactura()
         model.append(padre, ("%s (%s)" % (factura.numfactura, factura.cliente and factura.cliente.nombre or "Sin cliente"), 
                              utils.str_fecha(factura.fecha), 
                              utils.str_fecha(v[0].fecha),
                              v[0].importe,
                              pagare and "%s (%s)" % (pagare.codigo, utils.str_fecha(pagare.fechaRecepcion)) or '',
                              pagare and utils.str_fecha(pagare.fechaCobro) or '',
                              pagare and pagare.id or v[0].id)
                      )
         total += v[0].importe
         model[padre][3] += v[0].importe
         if pagare:
             if pagare.fechaCobro <= mx.DateTime.localtime():
                 vencido += v[0].importe
         else:
             if v[0].fecha <= mx.DateTime.localtime():
                 vencido += v[0].importe
         # NOTA: Si la fecha del vencimiento ha vencido pero la del pagaré no, no la cuento como pendiente.
     return total, vencido
Example #3
0
def build_label_dia(dia, mes, anno):
    """
    Devuelve un gtk.Label de una cadena "Nombredía, día" con el 
    nombre del día del mes y año recibido.
    """
    diafecha = mx.DateTime.DateTimeFrom(day = dia, month = mes, year = anno)
    texto_label = utils.corregir_nombres_fecha(diafecha.strftime("%A, %d"))
    # En windows las tildes dentro de etiquetas small no se muestran bien. ¿BUG de GTK?
#    if os.name == 'nt':
#        texto_label = texto_label.replace("á", "a")
#        texto_label = texto_label.replace("é", "e")
    label = gtk.Label("<small>%s</small>" % (texto_label))
    label.set_use_markup(True)
    label.set_justify(gtk.JUSTIFY_RIGHT)
    label.set_property('xalign', 1)
    return label
def build_pie(datos_de_la_empresa):
    estilo_pie = ParagraphStyle("Estilo pie", 
                                parent = estilos["Normal"])
    estilo_pie.alignment = enums.TA_CENTER
    texto_fecha = Paragraph("En %s a %s" % (
                        datos_de_la_empresa.ciudad, 
                        utils.corregir_nombres_fecha(
                          mx.DateTime.localtime().strftime("%d de %B de %Y"))), 
                      estilo_pie)
    tabla_firmas = Table([["Responsable de laboratorio", 
                           "Responsable de calidad"]], 
                         colWidths = (PAGE_WIDTH / 2.0, PAGE_WIDTH / 2.0), 
                         style = [
                            ("FONT", (0, 0), (0, 0), "Times-Roman", 10), 
                            ("ALIGN", (0, 0), (-1, -1), "CENTER"), 
                         ])
    return KeepTogether([texto_fecha, Spacer(1, 1.0*cm), tabla_firmas])
 def agregar_factura(self, f, model, total, vencido):
     vtos = self.preparar_vencimientos(f)
     vtos = [v for v in vtos if (v[2]==None or (v[2].pagareCobro != None and v[2].pagareCobro.pendiente)) and v[0] != None]
         # Todos los que no tienen pagaré o si lo tienen, que esté pendiente
         # y los que sean realmente vencimientos (hay entradas en vtos que pueden tener v[0] a None).
     for v in vtos:
         if v[2]!=None and v[2].pagareCobro!=None:
             pagare = v[2].pagareCobro
         else:
             pagare = None
         fechavto = pagare and pagare.fechaCobro or v[0].fecha   # Fecha del vencimiento final: la del vencimiento de la factura
                                                                 # si no tiene pagaré o la del vencimiento del pagaré que cubre
                                                                 # el vencimiento de la factura.
         mes = utils.corregir_nombres_fecha(fechavto.strftime("%B '%y"))
         primero_mes = mx.DateTime.DateTimeFrom(day = 1, month = fechavto.month, year = fechavto.year)
         try:
             rowpadre = [r for r in model if r[2] == mes][0]
             padre = rowpadre.iter
         except IndexError:
             padre = model.append(None, ("", utils.str_fecha(primero_mes), mes, 0.0, "", "", 0))
         factura = v[0].get_factura_o_prefactura()
         model.append(padre, ("%s (%s)" % (factura.numfactura, factura.cliente and factura.cliente.nombre or "Sin cliente"), 
                              utils.str_fecha(factura.fecha), 
                              utils.str_fecha(v[0].fecha),
                              v[0].importe,
                              pagare and "%s (%s)" % (pagare.codigo, utils.str_fecha(pagare.fechaRecepcion)) or '',
                              pagare and utils.str_fecha(pagare.fechaCobro) or '',
                              pagare and pagare.id or v[0].id)
                      )
         total += v[0].importe
         model[padre][3] += v[0].importe
         if pagare:
             if pagare.fechaCobro <= mx.DateTime.localtime():
                 vencido += v[0].importe
         else:
             if v[0].fecha <= mx.DateTime.localtime():
                 vencido += v[0].importe
         # NOTA: Si la fecha del vencimiento ha vencido pero la del pagaré no, no la cuento como pendiente.
     return total, vencido
 def buscar(self, boton):
     """
     Dadas fecha de inicio y de fin, lista todos los albaranes
     pendientes de facturar.
     """
     anno = utils.combo_get_value(self.wids['cbe_year'])
     resultado = []
     if anno == -1 or anno == None:
         # Intento leerlo del entry
         str_anno = self.wids['cbe_year'].child.get_text()
         try:
             anno = int(str_anno)
         except:
             pass
     if anno != -1 and anno != None:
         vpro = ventana_progreso.VentanaProgreso(padre = self.wids['ventana'])
         act = 0.0; tot = 8.0 * 12
         vpro.mostrar()
         total_produccion = {'rollos': 0, 'metros': 0, 'kilos': 0}
         total_existencias = {'rollos': 0, 'metros': 0, 'kilos': 0}
         total_composan_nacional = {'rollos': 0, 'metros': 0, 'kilos': 0}
         total_composan_internacional = {'rollos': 0, 'metros': 0, 'kilos': 0}
         total_gea21 = {'rollos': 0, 'metros': 0, 'kilos': 0}
         total_otros = {'rollos': 0, 'metros': 0, 'kilos': 0}
         total_salidas = {'rollos': 0, 'metros': 0, 'kilos': 0}
         total_pendiente = {'rollos': 0, 'metros': 0, 'kilos': 0}
         # DEBUG: for mes in xrange(1, 3):
         for mes in xrange(1, 13):
             fecha_ini = mx.DateTime.DateTimeFrom(day = 1, month = mes, year = anno)
             fecha_fin = mx.DateTime.DateTimeFrom(day = -1, month = mes, year = anno)    # Último día del mes
             mes_str = utils.corregir_nombres_fecha(mx.DateTime.Month[mes]).title()
             act = 1 + ((mes -1) * 8)
             vpro.set_valor(act/tot, "Calculando producción %s..." % (mes_str))
             produccion = get_produccion(fecha_ini, fecha_fin, incluir_sin_parte = True)
             act = 2 + ((mes -1) * 8)
             vpro.set_valor(act/tot, "Calculando existencias %s..." % (mes_str))
             existencias = get_existencias(fecha_fin)
             #act = 3 + ((mes -1) * 8)
             #vpro.set_valor(act/tot, "Calculando Composan nacional %s..." % (mes_str))
             #salidas_composan_nacional = get_salidas_composan_nacional(fecha_ini, fecha_fin)
             #act = 4 + ((mes -1) * 8)
             #vpro.set_valor(act/tot, "Calculando Composan internacional %s..." % (mes_str))
             #salidas_composan_internacional = get_salidas_composan_internacional(fecha_ini, fecha_fin)
             #act = 5 + ((mes -1) * 8)
             #vpro.set_valor(act/tot, "Calculando Gea 21 %s..." % (mes_str))
             #salidas_gea21 = get_salidas_gea21(fecha_ini, fecha_fin)
             #act = 6 + ((mes -1) * 8)
             #vpro.set_valor(act/tot, "Calculando Otros %s..." % (mes_str))
             #salidas_otros = get_salidas_otros(fecha_ini, fecha_fin)
             act = 5 + ((mes -1) * 8)
             vpro.set_valor(act/tot, "Calculando salidas por tarifa %s..." % (mes_str))
             salidas_composan_nacional, \
             salidas_composan_internacional, \
             salidas_gea21, \
             salidas_otros, \
             total_salidas_mes = get_salidas_compnac_compint_gea_otros(fecha_ini, fecha_fin)
             #act = 7 + ((mes -1) * 8)
             #vpro.set_valor(act/tot, "Calculando salidas totales %s..." % (mes_str))
             #total_salidas_mes = {}
             #for c in ('rollos', 'metros', 'kilos'): 
             #    total_salidas_mes[c] = salidas_composan_nacional[c] + salidas_composan_internacional[c] + salidas_gea21[c] + salidas_otros[c]
             act = 8 + ((mes -1) * 8)
             vpro.set_valor(act/tot, "Calculando pedidos pendientes %s..." % (mes_str))
             pedidos_pendientes = get_pedidos_pendientes(fecha_fin)
             resultado.append((mes_str, 
                               produccion['rollos'], 
                               utils.int2str(produccion['metros']), 
                               utils.float2str(produccion['kilos']), 
                               existencias['rollos'], 
                               utils.int2str(existencias['metros']), 
                               utils.float2str(existencias['kilos']), 
                               total_salidas_mes['rollos'], 
                               utils.int2str(total_salidas_mes['metros']), 
                               utils.float2str(total_salidas_mes['kilos']), 
                               salidas_composan_nacional['rollos'], 
                               utils.int2str(salidas_composan_nacional['metros']), 
                               utils.float2str(salidas_composan_nacional['kilos']),
                               salidas_composan_internacional['rollos'], 
                               utils.int2str(salidas_composan_internacional['metros']), 
                               utils.float2str(salidas_composan_internacional['kilos']), 
                               salidas_gea21['rollos'], 
                               utils.int2str(salidas_gea21['metros']), 
                               utils.float2str(salidas_gea21['kilos']), 
                               salidas_otros['rollos'], 
                               utils.int2str(salidas_otros['metros']), 
                               utils.float2str(salidas_otros['kilos']), 
                               pedidos_pendientes['rollos'], 
                               utils.int2str(pedidos_pendientes['metros']), 
                               utils.float2str(pedidos_pendientes['kilos']), 
                               mes))
             for campo in ('rollos', 'metros', 'kilos'):
                 for total, parcial in ((total_produccion, produccion), 
                                        (total_existencias, existencias), 
                                        (total_composan_nacional, salidas_composan_nacional), 
                                        (total_composan_internacional, salidas_composan_internacional), 
                                        (total_gea21, salidas_gea21), 
                                        (total_otros, salidas_otros), 
                                        (total_salidas, total_salidas_mes), 
                                        (total_pendiente, pedidos_pendientes)):
                     total[campo] += parcial[campo]
         resultado.append(("TOTAL", 
                           total_produccion['rollos'], 
                           utils.int2str(total_produccion['metros']),
                           utils.float2str(total_produccion['kilos']), 
                           total_existencias['rollos'],
                           utils.int2str(total_existencias['metros']),
                           utils.float2str(total_existencias['kilos']), 
                           total_salidas['rollos'],
                           utils.int2str(total_salidas['metros']),
                           utils.float2str(total_salidas['kilos']), 
                           total_composan_nacional['rollos'],
                           utils.int2str(total_composan_nacional['metros']),
                           utils.float2str(total_composan_nacional['kilos']),
                           total_composan_internacional['rollos'],
                           utils.int2str(total_composan_internacional['metros']),
                           utils.float2str(total_composan_internacional['kilos']), 
                           total_gea21['rollos'],
                           utils.int2str(total_gea21['metros']),
                           utils.float2str(total_gea21['kilos']), 
                           total_otros['rollos'],
                           utils.int2str(total_otros['metros']),
                           utils.float2str(total_otros['kilos']), 
                           total_pendiente['rollos'],
                           utils.int2str(total_pendiente['metros']),
                           utils.float2str(total_pendiente['kilos']), 
                           13))
         vpro.ocultar()
     self.rellenar_tabla(resultado)