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 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): # Nueva consulta CESCE (jpedrero) if f.cliente.riesgoAsegurado != -1: modelcesce = self.wids['tv_cesce'].get_model() fdp = None for v in f.vencimientosCobro: modelcesce.append((f.cliente.nombre, "", f.cliente.cif, "", utils.str_fecha(f.fecha), utils.float2str(v.importe), v.observaciones, utils.str_fecha(v.fecha), f.numfactura, f.id)) # Los otros dos TreeViews, más complejos: fecha = f.fecha mes = utils.corregir_nombres_fecha(fecha.strftime("%B '%y")) primero_mes = mx.DateTime.DateTimeFrom(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)