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)
Пример #4
0
    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)