DROP PROCEDURE IF EXISTS `proceso_nomina_masivo_cts`;
CREATE PROCEDURE `proceso_nomina_masivo_cts`(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 CTS DE CESADOS

			delete FROM empleados_cts where periodo  = p_periodo ;
			
			Insert into empleados_cts (id_nomina,periodo,dni,nombre,haber_basico,asign_fam,fecha_cese,fecha_ingreso,fecha_calculo) 
			select  id,Periodo,dni,nombre,haber_basico,asign_fam,fecha_cese,fecha_ingreso, CONCAT( YEAR(fecha_cese), '-', IF(MONTH(fecha_cese) <= 6, '06', '12'), '-15'  )  
			from mnom_planillas where fecha_cese is not null and periodo  = p_periodo ;
			
			update empleados_cts 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),
				remuneracion_computable = (eg.haber_basico + eg.asign_fam + eg.bonos ) ,  
				remuneracion_computable_mype = round((((eg.haber_basico)/2) + eg.asign_fam + eg.bonos),2) ,
				-- fecha_corte = CONCAT( YEAR(fecha_cese), '-', IF(MONTH(fecha_cese) <= 6, '04', '10'),'-',day(LAST_DAY(concat(YEAR(fecha_cese), '-', lpad(MONTH(fecha_cese) - 1,2,"0"),"-01")))  ),
                fecha_corte = CONCAT( YEAR(fecha_cese), '-', IF(MONTH(fecha_cese) <= 6, '04', '10'),'-',day(LAST_DAY(concat(YEAR(fecha_cese), '-', IF(MONTH(fecha_cese) <= 6, '04', '10'),"-01")))  ),
				fecha_corte= if( fecha_cese > fecha_corte,fecha_cese , fecha_corte),
				fecha_inicio = STR_TO_DATE(	
									CASE WHEN MONTH(LEAST(eg.fecha_cese, eg.fecha_corte)) BETWEEN 11 AND 12
									THEN CONCAT(YEAR(LEAST(eg.fecha_cese, eg.fecha_corte)), '-11-01')
									WHEN MONTH(LEAST(eg.fecha_cese, eg.fecha_corte)) BETWEEN 1 AND 4
									THEN CONCAT(YEAR(LEAST(eg.fecha_cese, eg.fecha_corte)) - 1, '-11-01')
									WHEN MONTH(LEAST(eg.fecha_cese, eg.fecha_corte)) BETWEEN 5 AND 10 
									THEN CONCAT(YEAR(LEAST(eg.fecha_cese, eg.fecha_corte)), '-05-01')
									END, '%Y-%m-%d' )  , 
				dias_trabajados_periodo =  DATEDIFF( LEAST(eg.fecha_cese, eg.fecha_corte),fecha_inicio ) , 
				meses_completos =  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)), 
				cts_total = ROUND(
								( eg.remuneracion_computable / 12) *
								( meses_completos 
								+ ( dias_residuales / 30.0
								)), 2),
				cts_total_mype = ROUND((
								( eg.remuneracion_computable / 12) *
								( meses_completos 
								+ ( dias_residuales / 30.0
								))/ 2),2) where periodo  = p_periodo ;
			
			
			update mnom_planillas p, empleados_cts g set 
			p.CTS = g.cts_total,
			p.CTS_mype =g.cts_total_mype
			where p.id = g.id_nomina and g.periodo  = p_periodo ;			
			
		-- PROCESAR VACACIONES TRUNCAS
			
			delete FROM empleados_vacaciones_truncas where periodo  = p_periodo ;
			
			Insert into empleados_vacaciones_truncas (id_nomina,periodo,dni,nombre,haber_basico,asign_fam,fecha_cese,fecha_ingreso,fecha_calculo,dias_truncos,dias_tomados) 
			select  id,Periodo,dni,nombre,haber_basico,asign_fam,fecha_cese,fecha_ingreso,now(),Vacaciones_Truncas_Q, (
			select sum(pp.Dias_Vac) from mnom_planillas pp where pp.DNI = p.DNI
			) as dias_tomados
			from mnom_planillas p where LENGTH(fecha_cese) != 0 and periodo  = p_periodo ;
			
			update empleados_vacaciones_truncas 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),
				remuneracion_computable = (eg.haber_basico + eg.asign_fam + eg.bonos ) ,  
				remuneracion_computable_mype = round((((eg.haber_basico)/2) + eg.asign_fam + eg.bonos),2) ,
				dias_trabajados_periodo =  DATEDIFF( eg.fecha_cese,fecha_ingreso ) , 
				dias_totales_ganados = round((30 / 365) * dias_trabajados_periodo,0),
				dias_totales_ganados_mype = round((15 / 365) * dias_trabajados_periodo,0),
				anios_computables = TIMESTAMPDIFF(YEAR, fecha_ingreso, fecha_cese)	,
				meses_completos =  TIMESTAMPDIFF(MONTH,fecha_ingreso, eg.fecha_cese) - (TIMESTAMPDIFF(YEAR, fecha_ingreso, fecha_cese) * 12 ) ,
				dias_residuales = DATEDIFF(eg.fecha_cese, DATE_ADD(fecha_ingreso, INTERVAL TIMESTAMPDIFF(MONTH, fecha_ingreso, eg.fecha_cese) MONTH)) , 
				total_vacacional_trunca = ROUND((eg.remuneracion_computable / 30) * eg.dias_tomados , 2),
				total_vacacional_trunca_mype =  ROUND((eg.remuneracion_computable_mype / 30) * eg.dias_tomados, 2),
				total_vacacional_ganado = ROUND(
					(
					(eg.remuneracion_computable  ) * (eg.anios_computables)
					) + 
					(
					(eg.remuneracion_computable / 12 ) * (eg.meses_completos)
					) +
					(
					(eg.remuneracion_computable / 12 / 30 ) * (eg.dias_residuales)
					)
				, 2),
				total_vacacional_ganado_mype =  ROUND(
					(
					(eg.remuneracion_computable_mype  ) * (eg.anios_computables)
					) + 
					(
					(eg.remuneracion_computable_mype / 12 ) * (eg.meses_completos)
					) +
					(
					(eg.remuneracion_computable_mype / 12 / 30 ) * (eg.dias_residuales)
					)
				, 2),
			total_pagar_vacacional = round(total_vacacional_ganado - total_vacacional_trunca,2),
			total_pagar_vacacional_mype = round(total_vacacional_ganado_mype - total_vacacional_trunca_mype,2)
			where Periodo  = p_periodo ;
			
			update mnom_planillas p, empleados_vacaciones_truncas g set 
			p.Vacaciones_Truncas = g.total_pagar_vacacional,
			p.Vacaciones_Truncas_mype =g.total_pagar_vacacional_mype
			where p.id = g.id_nomina and g.periodo  = p_periodo ;
			
			
			
			
			update mnom_planillas set 
			Total_Remunerac = IFNULL(ROUND(
			    IFNULL(Remuner, 0) +
			    IFNULL(SUBSIDIOS_ENFERMED, 0) +
			    IFNULL(ASIGN_FAM, 0) +
			    IFNULL(UTILIDADES, 0) +
			    IFNULL(BONO_PRODUCTIVIDAD, 0) +
   			    IFNULL(alimentos_Prestamos, 0) +
   			    IFNULL(BONO_EDUCATIVA, 0) +
   			    IFNULL(BONO_REFERIDO, 0) +
   			    IFNULL(MOVIL_SUPEDITADA, 0) +
			    IFNULL(TOTAL_HORAS_EXTRAS_Q, 0) +
			    IFNULL(Vacaciones_Truncas, 0) +
			    IFNULL(COMPENSACION_VACACIONAL, 0) +
			    IFNULL(REMUNER_VACACIONAL, 0) +
			    IFNULL(GRATIFICLEY29351Y30334, 0) +
			    IFNULL(GRATIFICACPROPORC_LEY29351Y30334, 0) +
			    IFNULL(GRATYBONI, 0) +
			    IFNULL(CTS, 0) +
			    IFNULL(Bonif_Grati, 0) +
			    IFNULL(Bonif_Grati_Trunca, 0) +
			    IFNULL(Remunerac_hora_de_permiso_lactancia, 0) +
			    IFNULL(GRATIFICAC_EXTRAORDINARIA_SIN_DSCTO_AFP, 0) +
			    IFNULL(Reintegro, 0) +
			    IFNULL(Devolucion_5ta, 0) +
			    IFNULL(Movilidad_Supedita_Asist_Otros, 0) +
			    IFNULL(Suma_Graciosa_Bonif_Ex, 0)
			    , 2), 0),
			Total_Remuneracion_Afecto = IFNULL(ROUND(
			       IFNULL(Remuner, 0) +
					    IFNULL(SUBSIDIOS_ENFERMED, 0) +
					    IFNULL(ASIGN_FAM, 0) +
					    IFNULL(TOTAL_HORAS_EXTRAS_Q, 0) +
					    IFNULL(Vacaciones_Truncas, 0) +
					    IFNULL(REMUNER_VACACIONAL, 0) +
					    IFNULL(Remunerac_hora_de_permiso_lactancia, 0) +
					    IFNULL(Reintegro, 0) -
						IFNULL(TARDANZ, 0) -
					    IFNULL(INASISTENC, 0) - 
						IFNULL(Suspension_q,0)
					, 2), 0),
			ONP = if(AFP="ONP",round( Total_Remuneracion_Afecto * desc_afp,2),"0"),
			Comision_Variable = round(( (Total_Remuneracion_Afecto + BONO_PRODUCTIVIDAD  ) * (Comis_AFP_percent/100) ),2),
			Seguro = round(( (Total_Remuneracion_Afecto + BONO_PRODUCTIVIDAD  ) * (Seguro_AFP_percent/100) ),2),
			Aporte_obligat = round(( (Total_Remuneracion_Afecto + BONO_PRODUCTIVIDAD  ) * (Aporte_AFP/100) ),2),
			Total_AFP = round((Comision_Variable + Seguro + Aporte_obligat),2),
			5_Categoria= ROUND((
			  CASE
			    WHEN (GREATEST(Total_Remuneracion_Afecto * 14 - @valorUIT * 7, 0) <= @valorUIT * 5) THEN 
			      (GREATEST(Total_Remuneracion_Afecto * 14 - @valorUIT * 7, 0) * 0.08)
			    WHEN (GREATEST(Total_Remuneracion_Afecto * 14 - @valorUIT * 7, 0) <= @valorUIT * 20) THEN 
			      ((@valorUIT * 5 * 0.08) +
			      ((GREATEST(Total_Remuneracion_Afecto * 14 - @valorUIT * 7, 0) - @valorUIT * 5) * 0.14))
			    WHEN (GREATEST(Total_Remuneracion_Afecto * 14 - @valorUIT * 7, 0) <= @valorUIT * 35) THEN
			      ((@valorUIT * 5 * 0.08) +
			      (@valorUIT * 15 * 0.14) +
			      ((GREATEST(Total_Remuneracion_Afecto * 14 - @valorUIT * 7, 0) - @valorUIT * 20) * 0.17))
			    WHEN (GREATEST(Total_Remuneracion_Afecto * 14 - @valorUIT * 7, 0) <= @valorUIT * 45) THEN
			 	  (@valorUIT * 5 * 0.08) +
			      (@valorUIT * 15 * 0.14) +
			      (@valorUIT * 15 * 0.17) +
			      (GREATEST(Total_Remuneracion_Afecto * 14 - @valorUIT * 7, 0) - @valorUIT * 35) * 0.20
			    ELSE
			      ((@valorUIT * 5 * 0.08) +
			      (@valorUIT * 15 * 0.14) +
			      (@valorUIT * 15 * 0.17) +
			      (@valorUIT * 10 * 0.20) +
			      (GREATEST(Total_Remuneracion_Afecto * 14 - @valorUIT * 7, 0) - @valorUIT * 45) * 0.30)
			  END
			)/ 12, 2),
			Total_Descuentos = ifnull(round((
					IFNULL(Total_AFP,0) + 
					IFNULL(ONP,0) + 
					IFNULL(`5_Categoria`,0) + 
					IFNULL(Cuota_Prestamos,0) + 
					IFNULL(Otros_dsctos_prestamos,0) + 
					IFNULL(Adelanto_de_Quincena,0) + 
					IFNULL(PAGO_UTILIDADES,0) + 
					IFNULL(SEGURO_EPS,0) + 
					IFNULL(PAGOS_ADELANTADOS,0) + 
					IFNULL(TARDANZ,0) + 
					IFNULL(INASISTENC,0) + 
					IFNULL(Suspension_q,0) +
					IFNULL(descuento_viaticos,0)  +
					IFNULL(descuento_oncologico,0)  +
					IFNULL(descuento_celular,0)  +
					IFNULL(descuento_alimentario,0)  +
					IFNULL(descuento_vehicular,0)  +
					IFNULL(descuento_fotocheck,0)  +
					IFNULL(descuento_equipos,0)  +
					IFNULL(descuento_payflow,0)  +
					IFNULL(descuento_oftalmologo,0)  +
					IFNULL(descuento_retencion,0)  
					),2),0),
			Neto_a_Pagar = round((Total_Remunerac - Total_Descuentos),2),
			Aporte_Empleador_ESSALUD = if(HABER_BASICO>@rmv,round((Total_Remuneracion_Afecto * @bonificacion_extraordinaria_essalud),2),round((@rmv * @bonificacion_extraordinaria_essalud),2)),
			Aporte_Empleador_SCTR_PENSION = round((REMUN_ASIG*Aporte_Empleador_SCTR_PENSION_Q),2),
			Aporte_Empleador_SCTR_SALUD=round((REMUN_ASIG *Aporte_Empleador_SCTR_SALUD_Q),2),
			VIDA_LEY=round((REMUN_ASIG *VIDA_LEY_Q),2),
			Aporte_Empleador_SENATI=round((Total_Remuneracion_Afecto*Aporte_Empleador_SENATI_Q),2)
			where Periodo  = p_periodo ;
		
END
