efaraneda's picture
Update src/control.py
6b8e77d verified
Raw History Blame Contribute Delete
11.4 kB
def tabla_control_diario(semana):
prod_s1, pcp_s1, pod_s1, cnc_avance_s1, cnc_pf_s1 = obtener_avance_pcp(f'NORDES_PC2506_W{semana}', semana)
prod_s1_total = prod_s1.groupby('id_actividad')[['ganadas','gastadas']].sum().reset_index()
prod_diaria_s1 = prod_s1.groupby('dia')[['ganadas','gastadas']].sum().reset_index()
prod_diaria_s1.loc[prod_diaria_s1['ganadas']==0,'Reporta avance'] = 'No'
prod_diaria_s1.loc[prod_diaria_s1['gastadas']==0,'Reporta HH gastadas'] = 'No'
prod_diaria_s1.loc[prod_diaria_s1['ganadas']!=0,'Reporta avance'] = 'Si'
prod_diaria_s1.loc[prod_diaria_s1['gastadas']!=0,'Reporta HH gastadas'] = 'Si'
prod_diaria_s1.drop(columns=['ganadas','gastadas'],inplace=True)
pcp_s1['lunes_pcp']=pcp_s1['lunes_pcp'].apply(lambda x: safe_decimal_conversion(x))
pcp_s1['martes_pcp']=pcp_s1['martes_pcp'].apply(lambda x: safe_decimal_conversion(x))
pcp_s1['miercoles_pcp']=pcp_s1['miercoles_pcp'].apply(lambda x: safe_decimal_conversion(x))
pcp_s1['jueves_pcp']=pcp_s1['jueves_pcp'].apply(lambda x: safe_decimal_conversion(x))
pcp_s1['viernes_pcp']=pcp_s1['viernes_pcp'].apply(lambda x: safe_decimal_conversion(x))
pcp_s1['sabado_pcp']=pcp_s1['sabado_pcp'].apply(lambda x: safe_decimal_conversion(x))
pcp_s1['domingo_pcp'] = pcp_s1['domingo_pcp'].apply(lambda x: safe_decimal_conversion(x))
# Diccionario con los días
pcp_s1_total = {}
dias = ["lunes_pcp", "martes_pcp", "miercoles_pcp", "jueves_pcp",
"viernes_pcp", "sabado_pcp", "domingo_pcp"]
for dia in dias:
nombre_columna = dia.replace("_pcp", "").capitalize()
pcp_s1_total[nombre_columna] = "Si" if pcp_s1[dia].sum() > 0 else "No"
# Crear DataFrame y poner como índice el nombre de la métrica
df_pcp = pd.DataFrame([pcp_s1_total], index=["Elabora Planificación Semanal"])
df_total = prod_diaria_s1.set_index('dia').T
df_total.columns.name = None
# orden que quieres
orden_dias = ["Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado", "Domingo"]
# si ya tienes el DataFrame creado:
df_total = df_total[orden_dias]
df_total = pd.concat([df_total,df_pcp])
pod_s1['lunes_pod']=pod_s1['lunes_pod'].apply(lambda x: safe_decimal_conversion(x))
pod_s1['martes_pod']=pod_s1['martes_pod'].apply(lambda x: safe_decimal_conversion(x))
pod_s1['miercoles_pod']=pod_s1['miercoles_pod'].apply(lambda x: safe_decimal_conversion(x))
pod_s1['jueves_pod']=pod_s1['jueves_pod'].apply(lambda x: safe_decimal_conversion(x))
pod_s1['viernes_pod']=pod_s1['viernes_pod'].apply(lambda x: safe_decimal_conversion(x))
pod_s1['sabado_pod']=pod_s1['sabado_pod'].apply(lambda x: safe_decimal_conversion(x))
pod_s1['domingo_pod'] = pod_s1['domingo_pod'].apply(lambda x: safe_decimal_conversion(x))
# Diccionario con los días
pod_s1_total = {}
dias = ["lunes_pod", "martes_pod", "miercoles_pod", "jueves_pod",
"viernes_pod", "sabado_pod", "domingo_pod"]
for dia in dias:
nombre_columna = dia.replace("_pod", "").capitalize()
pod_s1_total[nombre_columna] = "Si" if pod_s1[dia].sum() > 0 else "No"
# Crear DataFrame y poner como índice el nombre de la métrica
df_pod = pd.DataFrame([pod_s1_total], index=["Elabora POD"])
df_total = pd.concat([df_total,df_pod])
return df_total
from decimal import Decimal, InvalidOperation
import numpy as np
import pandas as pd
import boto3
from boto3.dynamodb.conditions import Key
import os
def safe_decimal_conversion(x):
try:
x_str = str(x).strip()
if x_str == '':
return Decimal(0)
x_str = x_str.replace('.', '').replace(',', '.')
return Decimal(x_str)
except (InvalidOperation, ValueError):
return Decimal(0)
def obtener_avance_pcp(empresa_proyecto_semana, semana):
dynamodb = boto3.resource('dynamodb', region_name='us-east-1',
aws_access_key_id=os.getenv('ACCESS_KEY_US'),
aws_secret_access_key=os.getenv('SECRET_KEY_US'))
# Referencia a tu tabla de DynamoDB
table = dynamodb.Table('corto-plazo')
CNCS_AVANCE = []
CNCS_PF = []
# Realiza la consulta para obtener los datos más recientes
try:
response = table.query(
KeyConditionExpression=Key('id_empresa_proyecto').eq(empresa_proyecto_semana),
ScanIndexForward=False # Ordenar de forma descendente
)
# Lista para almacenar todos los resultados
resultados = {}
resultados['dia'] = []
resultados['capataz'] = []
resultados['semana'] = []
resultados['gastadas'] = []
resultados['ganadas'] = []
resultados['rendimiento'] = []
resultados['id_actividad'] = []
resultados_pcp = []
resultados_pod = []
# Verifica si se encontraron elementos
if 'Items' in response and len(response['Items']) > 0:
# Iteramos sobre todos los elementos encontrados
for item in response['Items']:
id_actividad = item.get('id_actividad', 0)
if id_actividad == 'A1620':
continue
capataz = item.get('rut_responsable_capataz', 0)
rendimiento = item.get('rendimiento', 0)
resultados['dia'].append('Lunes')
resultados['ganadas'].append(item.get('lunes_re_q', 0))
resultados['gastadas'].append(item.get('lunes_rg_hh', 0))
resultados['rendimiento'].append(rendimiento)
resultados['id_actividad'].append(id_actividad)
resultados['semana'].append(semana)
resultados['capataz'].append(capataz)
resultados['dia'].append('Martes')
resultados['ganadas'].append(item.get('martes_re_q', 0))
resultados['gastadas'].append(item.get('martes_rg_hh', 0))
resultados['rendimiento'].append(rendimiento)
resultados['id_actividad'].append(id_actividad)
resultados['semana'].append(semana)
resultados['capataz'].append(capataz)
resultados['dia'].append('Miercoles')
resultados['ganadas'].append(item.get('miercoles_re_q', 0))
resultados['gastadas'].append(item.get('miercoles_rg_hh', 0))
resultados['rendimiento'].append(rendimiento)
resultados['id_actividad'].append(id_actividad)
resultados['semana'].append(semana)
resultados['capataz'].append(capataz)
resultados['dia'].append('Jueves')
resultados['ganadas'].append(item.get('jueves_re_q', 0))
resultados['gastadas'].append(item.get('jueves_rg_hh', 0))
resultados['rendimiento'].append(rendimiento)
resultados['id_actividad'].append(id_actividad)
resultados['semana'].append(semana)
resultados['capataz'].append(capataz)
resultados['dia'].append('Viernes')
resultados['ganadas'].append(item.get('viernes_re_q', 0))
resultados['gastadas'].append(item.get('viernes_rg_hh', 0))
resultados['rendimiento'].append(rendimiento)
resultados['id_actividad'].append(id_actividad)
resultados['semana'].append(semana)
resultados['capataz'].append(capataz)
resultados['dia'].append('Sabado')
resultados['ganadas'].append(item.get('sabado_re_q', 0))
resultados['gastadas'].append(item.get('sabado_rg_hh', 0))
resultados['rendimiento'].append(rendimiento)
resultados['id_actividad'].append(id_actividad)
resultados['semana'].append(semana)
resultados['capataz'].append(capataz)
resultados['dia'].append('Domingo')
resultados['ganadas'].append(item.get('domingo_re_q', 0))
resultados['gastadas'].append(item.get('domingo_rg_hh', 0))
resultados['rendimiento'].append(rendimiento)
resultados['id_actividad'].append(id_actividad)
resultados['semana'].append(semana)
resultados['capataz'].append(capataz)
result2 = {
'id_actividad': item.get('id_actividad', 0),
'lunes_pcp': item.get('lunes_pcp', 0),
'martes_pcp': item.get('martes_pcp', 0),
'miercoles_pcp': item.get('miercoles_pcp', 0),
'jueves_pcp': item.get('jueves_pcp', 0),
'viernes_pcp': item.get('viernes_pcp', 0),
'sabado_pcp': item.get('sabado_pcp', 0),
'domingo_pcp': item.get('domingo_pcp', 0),
'rendimiento': item.get('rendimiento', 0)
}
result3 = {
'id_actividad': item.get('id_actividad', 0),
'lunes_pod': item.get('lunes_pod', 0),
'martes_pod': item.get('martes_pod', 0),
'miercoles_pod': item.get('miercoles_pod', 0),
'jueves_pod': item.get('jueves_pod', 0),
'viernes_pod': item.get('viernes_pod', 0),
'sabado_pod': item.get('sabado_pod', 0),
'domingo_pod': item.get('domingo_pod', 0),
'rendimiento': item.get('rendimiento', 0)
}
if item.get('cnc_1_responsable'):
CNCS_AVANCE.append(item.get('id_actividad'))
if item.get('cnc_2_responsable'):
CNCS_PF.append(item.get('id_actividad'))
resultados_pcp.append(result2)
resultados_pod.append(result3)
df = pd.DataFrame(resultados)
df.loc[(df['rendimiento']=='') | (df['rendimiento'].isna()) ,'rendimiento'] = '0'
df.loc[(df['gastadas']=='') | (df['gastadas'].isna()) ,'gastadas'] = '0'
df.loc[(df['ganadas']=='') | (df['ganadas'].isna()) ,'ganadas'] = '0'
df['rendimiento'] = df['rendimiento'].apply(safe_decimal_conversion)
df['gastadas'] = df['gastadas'].apply(safe_decimal_conversion)
df['ganadas'] = df['ganadas'].apply(safe_decimal_conversion)
df['ganadas'] = df['ganadas'].replace(0, np.nan)*df['rendimiento'].replace(0, np.nan)
# Convertimos la lista de diccionarios en un DataFrame
df.fillna(0, inplace=True)
return df, pd.DataFrame(resultados_pcp), pd.DataFrame(resultados_pod), CNCS_AVANCE, CNCS_PF
else:
print("No se encontraron elementos para el id_empresa_proyecto dado.")
return pd.DataFrame(),pd.DataFrame(), pd.DataFrame(), CNCS_AVANCE, CNCS_PF # En caso de error, devolvemos un DataFrame vacío
except Exception as e:
print(f"Error al consultar la tabla: {e}")
return pd.DataFrame(), pd.DataFrame(), pd.DataFrame(), CNCS_AVANCE, CNCS_PF