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
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)