File size: 1,806 Bytes
3c4de5e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# -*- coding: utf-8 -*-
"""
Created on Fri Nov 22 11:36:45 2024

@author: fernando.schwartzer
"""
import pandas as pd
from .shared_state import state

def create_new_dataframe_with_index_and_value_unit(file, sheet_name, selected_columns, add_index, calculate_unit_value, col_value, col_area):
    if file is None or not sheet_name or not selected_columns:
        return pd.DataFrame({"Erro": ["Carregue um arquivo, selecione uma aba e colunas."]})
    
    # Carrega o DataFrame da aba especificada
    df = pd.read_excel(file.name, sheet_name=sheet_name)
    
    # Seleciona apenas as colunas especificadas
    new_df = df[selected_columns]
    
    # Adiciona um índice se necessário
    if add_index:
        new_df.insert(0, "Índice", range(1, len(new_df) + 1))
    
    # Renomeia e formata a coluna de valor total
    if col_value:
        new_df.rename(columns={col_value: "Valor Total"}, inplace=True)
        new_df["Valor Total"] = new_df["Valor Total"].round(2)
        cols = new_df.columns.tolist()
        cols.insert(1, cols.pop(cols.index("Valor Total")))
        new_df = new_df[cols]
    
    # Calcula o valor unitário se necessário
    if calculate_unit_value and col_value and col_area:
        try:
            new_df["Valor Unitário"] = (new_df["Valor Total"] / new_df[col_area]).round(2)
            cols = new_df.columns.tolist()
            cols.insert(2, cols.pop(cols.index("Valor Unitário")))
            new_df = new_df[cols]
        except ZeroDivisionError:
            new_df["Valor Unitário"] = "Erro: Divisão por zero"
        except KeyError:
            new_df["Valor Unitário"] = "Erro: Coluna inválida"
    
    # Salva o novo DataFrame no estado compartilhado
    new_df.columns = new_df.columns.map(str)
    state['new_df'] = new_df  
    return new_df