def test_gastos_actividad_con_gastos(self): # Caso 3: actividad con gastos y un viajero self.session = Session() self.viajeross = self.session.query(Viajero).all() self.viajeros1 = [] for viajero in self.viajeross: self.viajeros1.append(object_as_dict(viajero)) self.activities = [] self.actividades1 = self.session.query(Actividad).all() for act in self.actividades1: self.activities.append(object_as_dict(act)) # Consultar los viajeros registrados en la actividad self.viajeros_actividad = [] q2 = self.session.query(ActividadViajero).all() for q in q2: self.viajeros_actividad.append(object_as_dict(q)) # Determinar los gastos totales por viajero self.gastos_viajero_act = [] self.viajeros_act = [] for item in self.viajeros_actividad: actid = item.get("actividad") if actid == 2: self.gastos_viajero_act.append([item.get("viajero"), 0]) self.viajeros_act.append(item.get("viajero")) # Consolidar los gastos por viajero self.gastos_consolidados = [] self.gastos2 = [] self.gastos2 = self.session.query( Gasto.viajero, func.sum( Gasto.valor).label('GastoViajero')).join(Actividad).filter( Gasto.actividad == 2).group_by(Gasto.viajero).all() k = 0 for id in self.viajeros_act: for i in range(len(self.gastos2)): if id == self.gastos2[i][0]: self.gastos_viajero_act[k][1] = self.gastos2[k][1] k += 1 for i in range(len(self.viajeros_act)): for viajero in self.viajeros1: if self.viajeros_act[i] == viajero['id']: self.gastos_consolidados.append({ "Nombre": viajero["nombre"], "Apellido": viajero["apellido"] }) for i in range(len(self.viajeros_act)): self.gastos_consolidados[i]['Valor'] = self.gastos_viajero_act[i][ 1] self.assertEqual(self.gastos2[0][1], 150)
def test_mostrar_gastos_actividad(self): self.session = Session() self.act_id = 1 self.viajeross = self.session.query(Viajero).all() self.viajeros1 = [] for viajero in self.viajeross: self.viajeros1.append(object_as_dict(viajero)) self.gastos1 = self.session.query(Gasto).join(Actividad).filter(Gasto.actividad == self.act_id).all() self.gastos = [] for gasto in self.gastos1: self.gastos.append(object_as_dict(gasto)) for g in self.gastos: vid = g.get("viajero") for viajero in self.viajeros1: if viajero['id'] == vid: g["Nombre"] = viajero['nombre'] g["Apellido"] = viajero['apellido'] # Mostrar que la lista en la base de datos es la misma que fue insertada self.lista_gastos = [{'id': 1, 'concepto': 'Transporte', 'valor': 100, 'fecha': '21-01-2021', 'actividad': 1, 'viajero': 1, 'Nombre': 'Juan', 'Apellido': 'Perez'}, {'id': 2, 'concepto': 'Comida', 'valor': 200, 'fecha': '22-01-2021', 'actividad': 1, 'viajero': 2, 'Nombre': 'Rosa', 'Apellido': 'Garcia'}, {'id': 3, 'concepto': 'Bebida', 'valor': 90, 'fecha': '23-01-2021', 'actividad': 1, 'viajero': 1, 'Nombre': 'Juan', 'Apellido': 'Perez'}, {'id': 4, 'concepto': 'Fiesta', 'valor': 120, 'fecha': '24-01-2021', 'actividad': 1, 'viajero': 3, 'Nombre': 'Luis', 'Apellido': 'Mora'}] self.assertListEqual(self.lista_gastos, self.gastos)
def mostar_reporte_gastos(self, actividad): """ Esta función puebla el reporte de gastos con la información en la lista """ self.actividad = actividad Session = sessionmaker(bind=engine) session = Session() self.viajeross = session.query(Viajero).all() self.viajeros1 = [] for viajero in self.viajeross: self.viajeros1.append(object_as_dict(viajero)) self.activities = [] self.actividades1 = session.query(Actividad).all() for act in self.actividades1: self.activities.append(object_as_dict(act)) # Funcionalidad para encontrar id de la actividad actual for act in self.activities: self.actnom = act.get("nombre") if self.actnom == actividad: act_id = act.get("id") # Consultar los viajeros registrados en la actividad self.viajeros_actividad = [] q2 = session.query(ActividadViajero).all() for q in q2: self.viajeros_actividad.append(object_as_dict(q)) # Determinar los gastos totales por viajero self.gastos_viajero_act = [] self.viajeros_act = [] for item in self.viajeros_actividad: actid = item.get("actividad") if actid == act_id: self.gastos_viajero_act.append([item.get("viajero"), 0]) self.viajeros_act.append(item.get("viajero")) # Consolidar los gastos por viajero self.gastos_consolidados = [] self.gastos2 = session.query( Gasto.viajero, func.sum( Gasto.valor).label('GastoViajero')).join(Actividad).filter( Gasto.actividad == act_id).group_by(Gasto.viajero).all() # # for id in self.viajeros1: # self.gastos_consolidados.append({self.viajeros1[id].nombre, self.viajeros1[id].apellido, self.gastos2[id][1]}) k = 0 for id in self.viajeros_act: for i in range(len(self.gastos2)): if id == self.gastos2[i][0]: self.gastos_viajero_act[k][1] = self.gastos2[k][1] k += 1 for i in range(len(self.viajeros_act)): for viajero in self.viajeros1: if self.viajeros_act[i] == viajero['id']: self.gastos_consolidados.append({ "Nombre": viajero["nombre"], "Apellido": viajero["apellido"] }) for i in range(len(self.viajeros_act)): self.gastos_consolidados[i]['Valor'] = self.gastos_viajero_act[i][ 1] self.lista_gastos = self.gastos_consolidados #Por cada iteración, llenamos con el nombre del viajero y sus gastos consolidados para la actividad numero_fila = 1 for gasto in self.lista_gastos: etiqueta_viajero = QLabel(gasto["Nombre"] + ' ' + gasto["Apellido"]) etiqueta_viajero.setWordWrap(True) self.distribuidor_tabla_reporte.addWidget(etiqueta_viajero, numero_fila, 0, Qt.AlignLeft) etiqueta_concepto = QLabel('Gastos consolidados') etiqueta_concepto.setWordWrap(True) self.distribuidor_tabla_reporte.addWidget(etiqueta_concepto, numero_fila, 1, Qt.AlignLeft) etiqueta_total = QLabel("${:,.2f}".format(gasto["Valor"])) etiqueta_total.setWordWrap(True) self.distribuidor_tabla_reporte.addWidget(etiqueta_total, numero_fila, 2, Qt.AlignLeft) numero_fila = numero_fila + 1 #Elemento para ajustar la forma de la tabla (y evitar que queden muy espaciados) self.distribuidor_tabla_reporte.layout().setRowStretch( numero_fila + 1, 1)
def mostrar_reporte_compensacion(self, actividad): """ Esta función construye el reporte de compensación a partir de una matriz """ #self.matriz = matriz_compensacion self.actividad = actividad Session = sessionmaker(bind=engine) session = Session() self.activities = [] self.actividades1 = session.query(Actividad).all() for act in self.actividades1: self.activities.append(object_as_dict(act)) self.viajeross = session.query(Viajero).all() self.viajeros1 = [] for viajero in self.viajeross: self.viajeros1.append(object_as_dict(viajero)) # Funcionalidad para encontrar id de la actividad actual for act in self.activities: self.actnom = act.get("nombre") if self.actnom == actividad: act_id = act.get("id") # Consultar los viajeros registrados en la actividad self.viajeros_actividad = [] q2 = session.query(ActividadViajero).all() for q in q2: self.viajeros_actividad.append(object_as_dict(q)) # Determinar los gastos totales por viajero self.gastos_viajero_act = [] self.viajeros_act = [] for item in self.viajeros_actividad: actid = item.get("actividad") if actid == act_id: self.gastos_viajero_act.append([item.get("viajero"), 0]) self.viajeros_act.append(item.get("viajero")) # Consolidar los gastos por viajero self.gastos_consolidados = [] self.gastos2 = session.query( Gasto.viajero, func.sum( Gasto.valor).label('GastoViajero')).join(Actividad).filter( Gasto.actividad == act_id).group_by(Gasto.viajero).all() k = 0 for id in self.viajeros_act: for i in range(len(self.gastos2)): if id == self.gastos2[i][0]: self.gastos_viajero_act[k][1] = self.gastos2[k][1] k += 1 total = 0 n_viajeros = 0 for gast in self.gastos_viajero_act: total += gast[1] n_viajeros += 1 for gast in self.gastos_viajero_act: self.gastos_consolidados.append(list(gast)) for g in self.gastos_consolidados: if (g[1] - total / n_viajeros) < 0: g.append(total / n_viajeros - g[1]) g.append(0) else: g.append(0) g.append(g[1] - total / n_viajeros) self.matriz = [] for g in self.gastos_consolidados: self.matriz.append([]) for j in range(len(self.gastos_consolidados)): for row in self.gastos_consolidados: i = 1 if j + 1 == row[0]: self.matriz[j].append(-1) elif row[3] == 0: self.matriz[j].append(0) elif row[3] > 0: if row[3] > self.gastos_consolidados[j][2]: self.matriz[j].append(self.gastos_consolidados[j][2]) row[3] = row[3] - self.gastos_consolidados[j][2] self.gastos_consolidados[j][2] = 0 elif row[3] <= self.gastos_consolidados[j][2]: self.matriz[j].append(row[3]) self.gastos_consolidados[j][ 2] = self.gastos_consolidados[j][2] - row[3] row[3] = 0 i += 1 j = 0 self.viajeros_en_act = [] for id in self.viajeros_act: for viajero in self.viajeros1: if id == viajero["id"]: self.viajeros_en_act.append(viajero["nombre"]) self.viajeros_en_act[j] = self.viajeros_en_act[ j] + ' ' + viajero['apellido'] j += 1 self.viajeros_en_actividad = [] for viajero in self.viajeros1: if viajero['id'] not in self.viajeros_act: self.viajerodict = { "Nombre": viajero['nombre'] + ' ' + viajero['apellido'], "Presente": False } self.viajeros_en_actividad.append(self.viajerodict) else: self.viajerodict = { "Nombre": viajero['nombre'] + ' ' + viajero['apellido'], "Presente": True } self.viajeros_en_actividad.append(self.viajerodict) self.matriz_header = [[""]] for viajero in self.viajeros_en_actividad: if viajero["Presente"] == True: self.matriz_header[0].append(viajero['Nombre']) for i in range(len(self.matriz)): self.matriz[i].insert(0, self.matriz_header[0][i + 1]) self.matriz.insert(0, self.matriz_header[0]) for i in range(0, len(self.matriz)): for j in range(0, len(self.matriz)): if i == j: #La etiqueta 0,0 debe estar vacía. Las etiquetas diagonales deben estar en negro etiqueta_valor = QLabel("") if i != 0: etiqueta_valor = QLabel("") etiqueta_valor.setStyleSheet( "QLabel { background-color : #000; }") elif i == 0 or j == 0: #Las etiquetas de la primera fila y la primera columna son nombres etiqueta_valor = QLabel("{}".format(self.matriz[i][j])) etiqueta_valor.setWordWrap(True) etiqueta_valor.setFont(QFont("Times", weight=QFont.Bold)) else: #Las etiquetas restantes deben ser los montos de dinero etiqueta_valor = QLabel("${:,.2f}".format( self.matriz[i][j])) etiqueta_valor.setWordWrap(True) etiqueta_valor.setToolTip( self.matriz[0][i] + " debe " + "${:,.2f}".format(self.matriz[i][j]) + " a " + self.matriz[0][j]) etiqueta_valor.setFixedSize(100, 40) self.distribuidor_tabla_compensacion.addWidget( etiqueta_valor, i, j, Qt.AlignHCenter) #Elementos de espacio para ajustar las dimensiones de la tabla self.distribuidor_tabla_compensacion.layout().setRowStretch( len(self.matriz), 1) self.distribuidor_tabla_compensacion.layout().setColumnStretch( len(self.matriz), 1)