DROP PROCEDURE IF EXISTS `proceso_nomina_masivo_grati`;
CREATE PROCEDURE `proceso_nomina_masivo_grati`(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
	
			-- PROCESAR GRATIFICACIONES DE CESADOS
			
			delete FROM empleados_grati where periodo  = p_periodo ;
						
			Insert into empleados_grati (id_nomina,anio,mes,periodo,dni,nombre,haber_basico,asign_fam,fecha_cese,fecha_ingreso,fecha_calculo,seguro_salud) 
			select  id,anio,mes,Periodo,dni,nombre,haber_basico,asign_fam,fecha_cese,fecha_ingreso, CONCAT( YEAR(fecha_cese), '-', IF(MONTH(fecha_cese) <= 6, '06', '12'), '-15'  ),"ESSALUD"
			from mnom_planillas where fecha_cese is not null and periodo  = p_periodo ;
			
			UPDATE empleados_grati eg 
					SET  
						bonos = ifnull((
							SELECT 
							    if( count(*) > 0 ,ROUND(SUM(BONO_PRODUCTIVIDAD) / count(*), 2), 0)
								FROM mnom_planillas
								WHERE fecha_fin >= DATE_SUB(CURDATE(), INTERVAL 6 MONTH) and id = 6
								GROUP BY id
							),0),
						haber_basico_mype = round((haber_basico / 2),2), 
					    remuneracion_computable = (eg.haber_basico + eg.asign_fam + eg.bonos),  
					    remuneracion_computable_mype = round( haber_basico_mype + asign_fam  + bonos,2),
					    -- fecha_corte = CONCAT( YEAR(fecha_cese), '-', lpad(MONTH(fecha_cese) - 1,2,"0") ,'-',day(LAST_DAY(concat(YEAR(fecha_cese), '-', lpad(MONTH(fecha_cese) - 1,2,"0"),"-01")))  ),
						fecha_corte = CONCAT( YEAR(fecha_cese), '-', LPAD( CASE WHEN MONTH(fecha_cese) = 1 THEN 1 ELSE MONTH(fecha_cese) - 1 END, 2, '0'), '-', DAY(LAST_DAY(CONCAT( YEAR(fecha_cese), '-', LPAD( CASE WHEN MONTH(fecha_cese) = 1 THEN 1 ELSE MONTH(fecha_cese) - 1 END , 2, '0'), '-01' ))) ) ,
						fecha_corte= if( day(fecha_cese) = day(LAST_DAY(concat(anio, "-",mes,"-01"))),  fecha_cese, fecha_corte ),
						fecha_inicio = GREATEST(
					        eg.fecha_ingreso,
					        STR_TO_DATE(	
					            CASE 
					                WHEN MONTH(LEAST(eg.fecha_cese, eg.fecha_calculo)) BETWEEN 1 AND 6
					                    THEN CONCAT(YEAR(LEAST(eg.fecha_cese, eg.fecha_calculo)), '-01-01')
					                WHEN MONTH(LEAST(eg.fecha_cese, eg.fecha_calculo)) BETWEEN 7 AND 12
					                    THEN CONCAT(YEAR(LEAST(eg.fecha_cese, eg.fecha_calculo)), '-07-01')
					            END, 
					            '%Y-%m-%d'
					        )
					    ),
					    dias_residuales = (DATEDIFF(LEAST(eg.fecha_cese, eg.fecha_corte), fecha_inicio) -1),
					    meses_trabajados = TIMESTAMPDIFF(MONTH, fecha_inicio, LEAST(eg.fecha_cese, eg.fecha_corte)) ,
					    dias_residuales = DATEDIFF(
					        LEAST(eg.fecha_cese, eg.fecha_corte), 
					        DATE_ADD(fecha_inicio, INTERVAL TIMESTAMPDIFF(MONTH, fecha_inicio, LEAST(eg.fecha_cese, eg.fecha_corte)) MONTH)
					    ),
					    gratificacion_basica = ROUND(
					        (remuneracion_computable / 6) *
					        (meses_trabajados + (dias_residuales / 30.0)),
					        2
					    ),
					    gratificacion_basica_mype= ROUND(
					        (remuneracion_computable_mype / 6) *
					        (meses_trabajados + (dias_residuales / 30.0)),
					        2
					    ),
					    bonificacion_extraordinaria = ROUND(
					        (
					            (remuneracion_computable / 6) *
					            (meses_trabajados + (dias_residuales / 30.0))
					        ) * 
					        IF(eg.seguro_salud = 'ESSALUD', @bonificacion_extraordinaria_essalud, @bonificacion_extraordinaria_privado), 
					        2
					    ),
					    bonificacion_extraordinaria_mype = ROUND(
					        (
					            (remuneracion_computable_mype / 6) *
					            (meses_trabajados + (dias_residuales / 30.0))
					        ) * 
					        IF(eg.seguro_salud = 'ESSALUD', @bonificacion_extraordinaria_essalud, @bonificacion_extraordinaria_privado), 
					        2
					    ),
					    gratificacion_total = ROUND(
					        gratificacion_basica +
					        bonificacion_extraordinaria,
					        2
					    ),
						gratificacion_total_mype =  ROUND(
					        gratificacion_basica_mype +
					        bonificacion_extraordinaria_mype,
					        2
					    ) where periodo  = p_periodo ;
			
			update mnom_planillas p, empleados_grati g set 
			p.GRATIFICACPROPORC_LEY29351Y30334 = g.bonificacion_extraordinaria, 
			p.GRATIFICACPROPORC_LEY29351Y30334_mype = g.bonificacion_extraordinaria_mype, 
			p.Bonif_Grati_Trunca = g.gratificacion_basica,
			p.Bonif_Grati_Trunca_mype = g.gratificacion_basica_mype
			where p.id = g.id_nomina and g.periodo  = p_periodo ;	
END
