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