def calcular_exceso_medio_plazo_cobro(self): """ Calcula el exceso medio de los cobros sobre los vencimientos de las facturas del cliente. Devuelve None si no hay datos suficientes para calcular. """ plazos = [] for f in self.facturasVenta: plazo = f.get_plazo_pagado() if plazo != None: plazo_ini = f.get_plazo_pago(default = 0) try: plazo -= plazo_ini except TypeError: # plazo_ini es una lista de días. plazo_ini.sort() plazo -= plazo_ini[-1] # Me quedo con el día más lejano # porque seguramente lo demás sea el día de pago, no # el plazo entre vencimientos. plazos.append(plazo) if plazos: res = utils.media(plazos) else: res = None return res
def rellenar_widgets(self): """ Introduce la información del objeto actual en los widgets. No se chequea que sea != None, así que hay que tener cuidado de no llamar a esta función en ese caso. """ if self.objeto: self.wids['e_numalbaran'].set_text(self.objeto.numalbaran) referencias = {} # Valores de referencia por producto. ## TODO: Refactorizar esto para sacar los cálculos de la capa vista. ## Se debe poder calcular los valores de impresión desde ## cualquier parte de la aplicación sin tener que abrir esta ## ventana. # Rescato lotes y partidas. productos = {} for articulo in self.objeto.articulos: producto = articulo.productoVenta for atributo in ("lote", "loteCem", "partida", "partidaCem"): lote_o_partida = getattr(articulo, atributo) try: if (lote_o_partida and lote_o_partida not in productos[producto]): productos[producto].append(lote_o_partida) except KeyError: productos[producto] = [lote_o_partida] # Valores de referencia. if producto.camposEspecificosRolloID: try: fpar = articulo.partida.get_fecha_fabricacion() cer = producto.camposEspecificosRollo.buscar_marcado(fpar) if cer == None: raise ValueError except (AttributeError, ValueError): cer = producto.camposEspecificosRollo referencias[producto] = { "Resistencia longitudinal": [cer.valorPruebaLongitudinalInf, cer.estandarPruebaLongitudinal, cer.valorPruebaLongitudinalSup], "Alargamiento longitudinal": [cer.valorPruebaAlargamientoLongitudinalInf, cer.estandarPruebaAlargamientoLongitudinal, cer.valorPruebaAlargamientoLongitudinalSup], "Resistencia transversal": [cer.valorPruebaTransversalInf, cer.estandarPruebaTransversal, cer.valorPruebaTransversalSup], "Alargamiento transversal": [cer.valorPruebaAlargamientoTransversalInf, cer.estandarPruebaAlargamientoTransversal, cer.valorPruebaAlargamientoTransversalSup], "Resistencia a la compresión": [cer.valorPruebaCompresionInf, cer.estandarPruebaCompresion, cer.valorPruebaCompresionSup], "Perforación": [cer.valorPruebaPerforacionInf, cer.estandarPruebaPerforacion, cer.valorPruebaPerforacionSup], "Espesor": [cer.valorPruebaEspesorInf, cer.estandarPruebaEspesor, cer.valorPruebaEspesorSup], "Permeabilidad": [cer.valorPruebaPermeabilidadInf, cer.estandarPruebaPermeabilidad, cer.valorPruebaPermeabilidadSup], "Apertura de poros": [cer.valorPruebaPorosInf, cer.estandarPruebaPoros, cer.valorPruebaPorosSup], "Gramaje": [cer.valorPruebaGramajeInf, cer.estandarPruebaGramaje, cer.valorPruebaGramajeSup], "Punzonado piramidal": [cer.valorPruebaPiramidalInf, cer.estandarPruebaPiramidal, cer.valorPruebaPiramidalSup]} elif producto.camposEspecificosBalaID: ceb = producto.camposEspecificosBala referencias[producto] = { "Media título": [ceb.dtex, ceb.dtex, ceb.dtex]} # Es el único valor que se # puede comparar. # Calculo medias. valores = {} for p in productos: valores[p] = {} for lote_o_partida in productos[p]: if isinstance(lote_o_partida, pclases.Lote): descripciones_campo = (("Tenacidad", "tenacidad"), ("Elongación", "elongacion"), ("Encogimiento", "encogimiento"), ("% Grasa", "grasa"), ("Media título", "mediatitulo")) elif isinstance(lote_o_partida, pclases.LoteCem): descripciones_campo = (("Tenacidad", "tenacidad"), ("Elongación", "elongacion"), ("Encogimiento", "encogimiento"), ("% Grasa", "grasa"), ("% Humedad", "humedad"), ("Media título", "mediatitulo")) elif isinstance(lote_o_partida, pclases.Partida): descripciones_campo = (("Gramaje", "gramaje"), ("Resistencia longitudinal", "longitudinal"), ("Alargamiento longitudinal", "alongitudinal"), ("Resistencia transversal", "transversal"), ("Alargamiento transversal", "atransversal"), ("Resistencia a la compresión", "compresion"), ("Perforación", "perforacion"), ("Espesor", "espesor"), ("Permeabilidad", "permeabilidad"), ("Apertura de poros", "poros"), ("Punzonado piramidal", "piramidal")) elif isinstance(lote_o_partida, pclases.PartidaCem): descripciones_campo = [] for descripcion, campo in descripciones_campo: valor = getattr(lote_o_partida, campo) if valor is None or not lote_o_partida.esta_analizada(): # DONE: En teoría si no está analizada debería buscar # la partida anterior o posterior del mismo producto # que estuviera analizada (jmadrid). # Al final no. Me ha enviado otro correo con el nuevo # criterio para la impresión de valores nulos. continue # Ignoro valores nulos. try: valores[p][descripcion].append(valor) except KeyError: valores[p][descripcion] = [valor] # Y ahora sustituyo la lista de valores por su media: for p in valores: for campo in valores[p]: valores[p][campo] = utils.media(valores[p][campo]) self.rellenar_tabla_datos(valores, referencias) self.rellenar_info_albaran(productos) self.wids['tv_datos'].expand_all()