DROP PROCEDURE IF EXISTS `proceso_nomina_masivo_regular`;
CREATE PROCEDURE `proceso_nomina_masivo_regular`(IN `p_periodo` TEXT)
BEGIN
	DECLARE v_anio INT;
	SET v_anio = LEFT(p_periodo, 4);
    
    IF v_anio = '2024' THEN
		SET @rmv = 1025;
		SET @valorUIT = 5150;
	ELSEIF v_anio = '2025' THEN
		SET @rmv = 1130;
		SET @valorUIT = 5350;
	ELSE
		SET @rmv = 1130;
		SET @valorUIT = 5350;
	END IF;
	
	SET @asignacion_familiar = @rmv * 0.10;
    SET @bonificacion_extraordinaria_essalud = 0.09;
    SET @bonificacion_extraordinaria_privado = 0.0675;
   
-- MASIVOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
	
	-- SELECT @asignacion_familiar,@rmv; 
    
		update mnom_planillas set fecha_inicio = concat(anio,"-",mes,"-1"),fecha_fin=LAST_DAY(concat(anio,"-",mes,"-1")),
			-- Dias_periodo = IF(anio = YEAR(Fecha_Ingreso) AND mes = MONTH(Fecha_Ingreso), DATEDIFF(fecha_fin,Fecha_Ingreso),DAY(fecha_fin)),
			-- Dias_periodo = IF(anio = YEAR(Fecha_Ingreso) AND mes = MONTH(Fecha_Ingreso), DATEDIFF(fecha_fin,Fecha_Ingreso),30), 
			Dias_periodo = 30,
			periodo = concat(anio,mes),
			anio_laboral = TIMESTAMPDIFF(YEAR, fecha_ingreso, fecha_cese)	,
			mes_laboral =  TIMESTAMPDIFF(MONTH,DATE_ADD(fecha_ingreso, INTERVAL TIMESTAMPDIFF(YEAR, fecha_ingreso, fecha_cese) YEAR),fecha_cese),
			dia_laboral =  DATEDIFF(fecha_cese, DATE_ADD(fecha_ingreso, INTERVAL TIMESTAMPDIFF(MONTH, fecha_ingreso, fecha_cese) MONTH)) 
			where Periodo  = p_periodo ;
	
			update mnom_planillas set 
				Dias_pago =case 
					when YEAR(Fecha_Ingreso) = YEAR(Fecha_Cese) AND MONTH(Fecha_Ingreso) = MONTH(Fecha_Cese) then DATEDIFF(fecha_cese,Fecha_Ingreso) 
					when YEAR(Fecha_Ingreso) != YEAR(Fecha_Cese) AND MONTH(Fecha_Ingreso) != MONTH(Fecha_Cese) then DATEDIFF(fecha_cese,DATE_FORMAT(Fecha_Cese, '%Y-%m-01')) +1
					else day(LAST_DAY(concat(anio,"-",mes,"-01"))) end,
				cantidad_dias_mes = day(LAST_DAY(concat(anio,"-",mes,"-1")))
			where Periodo  = p_periodo ;
		
		update mnom_planillas set 
			Dias_pago = ( Dias_pago  - Dias_Sub - Dias_Vac - DIAS_LICENCIA_SIN_GOCE),
			Horas_Tr = ((Dias_pago - Dias_Sub - Dias_Vac - DIAS_LICENCIA_SIN_GOCE) * 8),
			desc_afp = (select round((total/100),5) from afp where AFP = nombre),
			ONP_percent = if(AFP="ONP",(select concat(total,"%") from afp where AFP = nombre),"0"),
			Comis_AFP_percent = (select comision from afp where AFP = nombre),
			Seguro_AFP_percent = (select prima from afp where AFP = nombre),
			Aporte_AFP = if(AFP!="ONP",(select aporte from afp where AFP = nombre),"0")
			where Periodo  = p_periodo ;
		
		update mnom_planillas set Dias_pago = if(Dias_pago < 0,0,Dias_pago) where Periodo  = p_periodo ;
		
		/*update mnom_planillas p set p.dias_domingo_Q = (WITH RECURSIVE fechas AS (
		  SELECT IF( p.Fecha_Ingreso > p.fecha_inicio, DATE(p.Fecha_Ingreso),DATE(p.fecha_inicio)) AS fecha
			UNION ALL
			SELECT DATE_ADD(fecha, INTERVAL 1 DAY)
			FROM fechas
			WHERE fecha < if(p.Fecha_Cese != null or p.Fecha_Cese!= "",DATE(p.Fecha_Cese),DATE(p.fecha_fin))
		)
		SELECT COUNT(*) AS domingos
		FROM fechas
		WHERE DAYOFWEEK(fecha) = 1); */
        
        UPDATE mnom_planillas p
		SET p.dias_domingo_Q =
		  CASE
			WHEN COALESCE(DATE(p.Fecha_Cese), DATE(p.fecha_fin)) 
				 < GREATEST(DATE(p.Fecha_Ingreso), DATE(p.fecha_inicio))
			  THEN 0
			WHEN DATE_ADD(
				   GREATEST(DATE(p.Fecha_Ingreso), DATE(p.fecha_inicio)),
				   INTERVAL (
					 CASE 
					   WHEN DAYOFWEEK(GREATEST(DATE(p.Fecha_Ingreso), DATE(p.fecha_inicio))) = 1 
						 THEN 0 
					   ELSE 8 - DAYOFWEEK(GREATEST(DATE(p.Fecha_Ingreso), DATE(p.fecha_inicio))) 
					 END
				   ) DAY
				 ) > COALESCE(DATE(p.Fecha_Cese), DATE(p.fecha_fin))
			  THEN 0
			ELSE
			  FLOOR(
				DATEDIFF(
				  COALESCE(DATE(p.Fecha_Cese), DATE(p.fecha_fin)),
				  DATE_ADD(
					GREATEST(DATE(p.Fecha_Ingreso), DATE(p.fecha_inicio)),
					INTERVAL (
					  CASE 
						WHEN DAYOFWEEK(GREATEST(DATE(p.Fecha_Ingreso), DATE(p.fecha_inicio))) = 1 
						  THEN 0 
						ELSE 8 - DAYOFWEEK(GREATEST(DATE(p.Fecha_Ingreso), DATE(p.fecha_inicio))) 
					  END
					) DAY
				  )
				) / 7
			  ) + 1
		  END;

		update mnom_planillas set 
			Remuner = ifnull(round((HABER_BASICO/cantidad_dias_mes)*Dias_pago,2),0),
			ASIGN_FAM = ifnull(round(if(ASIGN_FAM_Q>0,@asignacion_familiar,0),2),0),
			REMUN_ASIG=ifnull(round((HABER_BASICO+ASIGN_FAM),2),0),
			TOTAL_HORAS_EXTRAS = ifnull(round((25_percent + 35_percent + 100_percent),2),0),
			Horas_extras_25_pecent_q = ifnull(round( ( ((((HABER_BASICO + ASIGN_FAM)/240) * 25_percent) * 1.25) ),2),0),
			Horas_extras_35_percet_q = ifnull(round( ( ((((HABER_BASICO + ASIGN_FAM)/240) * 35_percent) * 1.35) ),2),0),
			Horas_extras_100_percent_q = ifnull(round( ( ((((HABER_BASICO + ASIGN_FAM)/240) * 100_percent) * 2 ) ),2),0),
			horas_descanso_q = ifnull(round( ( ((((HABER_BASICO + ASIGN_FAM)/240) * horas_descanso) * 2 ) ),2),0),
			horas_feriado_q = ifnull(round( ( ((((HABER_BASICO + ASIGN_FAM)/240) * horas_feriado) * 2 ) ),2),0),
			horas_nocturna_q = 0,
			TOTAL_HORAS_EXTRAS_Q = ifnull(round((Horas_extras_25_pecent_q + Horas_extras_35_percet_q + Horas_extras_100_percent_q + horas_descanso_q + horas_feriado_q + horas_nocturna_q),2),0),
			INASISTENC = ifnull(round(( HABER_BASICO / Dias_periodo ) * Dias_Falta,2),0),
            Suspension_q = ifnull(round(( HABER_BASICO / Dias_periodo ) * Suspension,2),0),
			COMPENSACION_VACACIONAL= ifnull(round(((HABER_BASICO +ASIGN_FAM)/Dias_periodo)* VACA_COMPRADAS_Q,2),0),
			REMUNER_VACACIONAL=  ifnull(round(( HABER_BASICO / day(LAST_DAY(concat(anio,"-",mes,"-1"))) ) * Dias_Vac,2),0),
			Vacaciones_Truncas = ifnull(round(( HABER_BASICO / day(LAST_DAY(concat(anio,"-",mes,"-1"))) ) * Vacaciones_Truncas_Q,2),0),
			Horas_Trab_PLAME = (Horas_Tr - (( dias_domingo_Q * 8)))
			where Periodo  = p_periodo ;
		
END
