<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.mx.dla.dda.contrato.fees.daos.FeesContratoDAO">

	<resultMap id="feesContratos" type="FeesContratoPagoBD">
		<result property="idContratoPago"   column="ID_CONTRATO_PAGO" />
		<result property="idContrato"       column="ID_CONTRATO" />
		<result property="tipoPago"         column="TIPO_PAGO" />
		<result property="idTipoSuscriptor" column="ID_TIPO_SUSCRIPTOR" />
 	    <result property="tipoAnio"         column="TIPO_ANNIO" />  		
		<result property="fechaInicio"      column="FECHA_INICIO" />
		<result property="fechaFin"         column="FECHA_FIN" />
		<result property="contratoInicio"   column="INICIO_CTO" />
		<result property="contratoFin"      column="FIN_CTO" />	
		<result property="anioContrato"     column="ANIO_CONTRATO" />
	</resultMap>
		
	<resultMap id="feesSuscriptor" type="FeesSuscriptorBD">
		<result property="idContratoPago"  column="ID_CONTRATO_PAGO" />
		<result property="idPagoRango"     column="ID_PAGO_RANGO" />
		<result property="desde"           column="DESDE" />
		<result property="hasta"           column="HASTA" />
 	    <result property="costo"           column="COSTO" />  		
		<result property="idCategoria"     column="ID_PAGO_CATEG" />
		<result property="desCategoria"    column="DESC_CATEGORIA" />
		<result property="vigencia"        column="VIGENCIA" />				
	</resultMap>

	<resultMap id="feesFlat" type="FeesFlatBD">
		<result property="idContratoPago"     column="ID_CONTRATO_PAGO" />
		<result property="idFlat"             column="ID_CONTRATO_FLAT" />
		<result property="anio"               column="ANNIO" />
		<result property="costo"              column="COSTO" /> 	      		
		<result property="idCategoria"        column="ID_PAGO_CATEG" />
		<result property="desCategoria"       column="DESC_CATEGORIA" />
		<result property="bonoAnioInicio"     column="ANNIO_INICIO" />
		<result property="bonoTipoSuscriptor" column="ID_TIPO_SUSCRIPTOR" />			
	</resultMap>

	<resultMap id="rangoBono"      type="FeesBonoRangoDTO">
		<result property="idRango"         column="ID_BONO_RANGO" />
		<result property="idContratoPago"  column="ID_CONTRATO_PAGO" />
		<result property="desde"           column="DESDE" />
		<result property="hasta"           column="HASTA" />
 	    <result property="bono"            column="COSTO" />
 	    <result property="tipoPago"        column="TIPO_PAGO" /> 	     	      								
	</resultMap>
	
	<resultMap id="catTitulo" type="CategoriaFeesDTO">	
		<result property="idCategoria"   column="ID_PAGO_CATEG" />
		<result property="titulo"        column="desc_titulo" />
		<result property="categoria"     column="DESC_CATEGORIA" />				
	</resultMap>	
				
	<!-- Consultas para fees suscriptor -->	
	<select id="getFeesSuscriptor" resultMap="feesSuscriptor" parameterType="map">
		SELECT rango.ID_CONTRATO_PAGO, rango.ID_PAGO_RANGO, rango.DESDE, rango.HASTA,
		       costo.COSTO, costo.ID_PAGO_CATEG,
		       categoria.DESC_CATEGORIA
		    FROM  DDA_T_CONTRATO_PAGO_RANGO rango 
		    INNER JOIN DDA_T_CONTRATO_PAGO_COSTO costo     ON costo.ID_PAGO_RANGO = rango.ID_PAGO_RANGO
		    INNER JOIN DDA_T_CONTRATO_PAGO_CATEG categoria ON costo.ID_PAGO_CATEG = categoria.ID_PAGO_CATEG
		    WHERE rango.ID_CONTRATO_PAGO IN 
		    <foreach item="id" index="index" collection="idsContratoPago" open="(" separator="," close=")">
            		#{id}
        	</foreach>	       				
       		ORDER BY  costo.ID_PAGO_CATEG ASC, rango.ID_PAGO_RANGO ASC 		 				         		     		  			       		   				    
	</select>
	
	<insert id="guardarPagoRango"     parameterType="map"
			useGeneratedKeys="true"   keyProperty="rango.idRango">
			<selectKey keyProperty="rango.idRango" resultType="long"
				order="BEFORE">
				select DDA_SQT_CONTRATO_PAGO_RANGO.nextVal from DUAL
			</selectKey>										
		INSERT INTO DDA_T_CONTRATO_PAGO_RANGO (ID_PAGO_RANGO, ID_CONTRATO_PAGO, DESDE, HASTA)
		            values (#{rango.idRango},#{idContratoPago},#{rango.desde}, #{rango.hasta})
	</insert>
	
	<insert id="guardarPagoCostoALL" parameterType="java.util.List">		
		INSERT ALL								
		<foreach item="c" collection="costos"  separator=" ">		    		   
		    	INTO DDA_T_CONTRATO_PAGO_COSTO (ID_PAGO_RANGO, COSTO, ID_PAGO_CATEG)			
			    VALUES (#{c.idPagoRango}, #{c.costo}, #{c.idCategoria})		    
		</foreach> 
		SELECT * FROM DUAL
	</insert>	
	
	<insert id="guardarPagoCosto" parameterType="map">	
		INSERT INTO DDA_T_CONTRATO_PAGO_COSTO (ID_PAGO_RANGO, COSTO, ID_PAGO_CATEG)
	            VALUES (#{idRango}, #{costo}, #{idCategoria})			
	</insert>
	
	<delete id="eliminarPagoCosto" parameterType="map">
		DELETE DDA_T_CONTRATO_PAGO_COSTO WHERE ID_PAGO_CATEG = #{idCateg} AND ID_PAGO_RANGO = #{idRango}											
	</delete>

	<delete id="eliminarPagoRango"     parameterType="map">
	    DELETE DDA_T_CONTRATO_PAGO_RANGO WHERE ID_CONTRATO_PAGO = #{idContratoPago}			          		
	</delete>
		
	<delete id="eliminarContratoPago"  parameterType="map">
		DELETE DDA_T_CONTRATO_PAGO WHERE ID_CONTRATO_PAGO = #{idContratoPago}									
	</delete>	

	<delete id="eliminarPagoCostoXCto" parameterType="map">
			DELETE FROM DDA_T_CONTRATO_PAGO_COSTO WHERE ID_PAGO_RANGO IN ( 
						SELECT RANGO.ID_PAGO_RANGO FROM DDA_T_CONTRATO_PAGO_RANGO RANGO 
      					INNER JOIN DDA_T_CONTRATO_PAGO PAGO ON PAGO.ID_CONTRATO_PAGO = RANGO.ID_CONTRATO_PAGO 
      					WHERE PAGO.ID_CONTRATO = #{idCto} )											
	</delete>	
	
	<delete id="eliminarPagoRangoXCto"     parameterType="map">
	    DELETE FROM DDA_T_CONTRATO_PAGO_RANGO WHERE ID_CONTRATO_PAGO IN (SELECT ID_CONTRATO_PAGO FROM DDA_T_CONTRATO_PAGO WHERE ID_CONTRATO = #{idCto})			          		
	</delete>

	<delete id="eliminarPagoCostoXCategoria" parameterType="map">
		DELETE DDA_T_CONTRATO_PAGO_COSTO WHERE ID_PAGO_CATEG = #{idCateg}											
	</delete>
		
	<!-- Consultas para fees flat -->
	<select id="getFeesFlat" resultMap="feesFlat" parameterType="map">
		SELECT flat.ID_CONTRATO_PAGO, flat.ID_CONTRATO_FLAT, flat.ANNIO, flat.COSTO, flat.ID_PAGO_CATEG, categoria.DESC_CATEGORIA
           FROM DDA_T_CONTRATO_PAGO_FLAT flat
           INNER JOIN DDA_T_CONTRATO_PAGO_CATEG categoria ON flat.ID_PAGO_CATEG    = categoria.ID_PAGO_CATEG                   
           WHERE flat.ID_CONTRATO_PAGO IN
           <foreach item="id" index="index" collection="idsContratoPago" open="(" separator="," close=")">
            		#{id}
           </foreach>	       				
       	   ORDER BY  flat.ID_PAGO_CATEG ASC, flat.ANNIO ASC
	</select>
	
	<insert id="guardarPagoFlatAll" parameterType="java.util.List">		
		INSERT ALL								
		<foreach item="f" collection="flats"  separator=" ">		    		   
		    INTO DDA_T_CONTRATO_PAGO_FLAT (ID_CONTRATO_FLAT,ID_CONTRATO_PAGO,ANNIO,COSTO, ID_PAGO_CATEG)
			VALUES  (extractvalue(dbms_xmlgen.getxmltype('select DDA_SQT_CONTRATO_PAGO_FLAT.nextval from dual'),'//text()'),			
			         #{f.idContratoPago}, 
			         #{f.anio},
			         #{f.costo}, 
			         #{f.idCategoria})		    
		</foreach> 
		SELECT * FROM DUAL									
	</insert>
	
	<delete id="eliminarPagoFlat" parameterType="map">
		DELETE DDA_T_CONTRATO_PAGO_FLAT WHERE ID_CONTRATO_PAGO = #{idContratoPago}					          			
	</delete>
	
	<delete id="eliminarPagoFlatxCto" parameterType="map">
		DELETE DDA_T_CONTRATO_PAGO_FLAT WHERE ID_CONTRATO_PAGO IN ( SELECT ID_CONTRATO_PAGO FROM DDA_T_CONTRATO_PAGO WHERE ID_CONTRATO = #{idContrato} )						          			
	</delete>
	
	<!-- Consultas para fees bono -->
	<select id="getRangosBono" resultMap="rangoBono" parameterType="map">
		SELECT ID_BONO_RANGO, ID_CONTRATO, DESDE, HASTA,BONO, TIPO_PAGO
	       FROM DDA_T_CONTRATO_BONO_RANGO
    	   WHERE DDA_T_CONTRATO_BONO_RANGO.ID_CONTRATO= #{idContrato} order by DESDE asc
	</select>	
	
	<insert id="guardarRangoBonoFlatALL" parameterType="map">		
			INSERT ALL
			<foreach item="r" collection="rangos"  separator=" ">
				INTO DDA_T_CONTRATO_BONO_RANGO
					(ID_BONO_RANGO, ID_CONTRATO, DESDE, HASTA, BONO, TIPO_PAGO)
					values (extractvalue(dbms_xmlgen.getxmltype('select DDA_SQT_CONTRATO_BONO_RANGO.nextval from dual'),'//text()'),
					        #{idContrato},
					        #{r.desde},
					        #{r.hasta},
					        #{r.bono},
					        #{r.tipoPago})
			</foreach> 
		SELECT * FROM DUAL
	</insert>
	
	<delete id="eliminarBono" parameterType="map">
		DELETE DDA_T_CONTRATO_BONO_RANGO WHERE ID_CONTRATO = #{idContrato}			          
	</delete>
	
	<delete id="eliminarRangoFlatBonoByRango" parameterType="map">
		DELETE DDA_T_CONTRATO_BONO_RANGO WHERE ID_CONTRATO = #{idContrato} AND ID_BONO_RANGO = #{idRango}			          
	</delete>	
	
	<!-- Consultas para fees generales -->
	<select id="getPeriodos" resultMap="feesContratos" parameterType="map">
		SELECT pago.ID_CONTRATO_PAGO, pago.ID_CONTRATO, pago.ID_TIPO_SUSCRIPTOR,
               pago.TIPO_PAGO       , pago.TIPO_ANNIO , pago.FECHA_INICIO      , pago.FECHA_FIN,
               contrato.FECHA_INICIO INICIO_CTO, contrato.FECHA_FIN FIN_CTO, pago.ANIO_CONTRATO
           FROM DDA_T_CONTRATO contrato
           LEFT JOIN DDA_T_CONTRATO_PAGO pago ON contrato.ID_CONTRATO = pago.ID_CONTRATO  
           WHERE pago.ID_CONTRATO = #{idContrato}
           ORDER BY pago.FECHA_INICIO ASC
	</select>
	
	<select id="getTipoFees" resultType="String" parameterType="map">
			SELECT TIPO_PAGO FROM DDA_T_CONTRATO_PAGO WHERE ROWNUM = 1 AND ID_CONTRATO = #{idContrato}	               
	</select>
	
	<update id="actualizarContratoPago"  parameterType="FeesContratoPagoBD">		
		UPDATE DDA_T_CONTRATO_PAGO
			 SET ID_TIPO_SUSCRIPTOR = #{idTipoSuscriptor},
	             TIPO_PAGO          = #{tipoPago},
	             TIPO_ANNIO         = #{tipoAnio},
	             FECHA_INICIO       = #{fechaInicio},
	             FECHA_FIN          = #{fechaFin},
	             ANIO_CONTRATO      = #{anioContrato}   	             
	    WHERE 
	             ID_CONTRATO_PAGO = #{idContratoPago}				
	</update>
	
	<insert id="guardarContratoPago"  parameterType="FeesContratoPagoBD"
	        useGeneratedKeys="true"   keyProperty="idContratoPago">
		<selectKey keyProperty="idContratoPago" resultType="long"
			order="BEFORE">
			select DDA_SQT_CONTRATO_PAGO.nextVal from DUAL
		</selectKey>
		
		INSERT INTO 
		    DDA_T_CONTRATO_PAGO (ID_CONTRATO_PAGO, ID_CONTRATO, ID_TIPO_SUSCRIPTOR, TIPO_PAGO,
                                 TIPO_ANNIO, FECHA_INICIO, FECHA_FIN, ANIO_CONTRATO)
		    VALUES ( #{idContratoPago}, #{idContrato}, #{idTipoSuscriptor}, #{tipoPago}, 
		             #{tipoAnio}, #{fechaInicio}, #{fechaFin}, #{anioContrato})
	</insert>
		
	<delete id="eliminarContratoPagoXCto"  parameterType="map">
		DELETE DDA_T_CONTRATO_PAGO WHERE ID_CONTRATO = #{idContrato}									
	</delete>
	
	<!-- Consultas para fees categorias -->
	<update id="actualizarTitulosTCateg" parameterType="map">
		UPDATE DDA_T_CONTRATO_TITULO SET ID_PAGO_CATEG = null WHERE ID_PAGO_CATEG = #{idCategoria}        
	</update>
	
	<insert id="guardarCategoria" parameterType="map"
	        useGeneratedKeys="true"   keyProperty="categ.idCategoria">
			<selectKey keyProperty="categ.idCategoria" resultType="long"
				order="BEFORE">
				select DDA_SQT_CONTRATO_PAGO_CATEG.nextVal from DUAL
			</selectKey>								
		INSERT INTO DDA_T_CONTRATO_PAGO_CATEG (ID_PAGO_CATEG, DESC_CATEGORIA, ID_CONTRATO)
		VALUES (#{categ.idCategoria}, #{categ.categoria}, #{idContrato})
	</insert>
	
	<update id="actualizarCategoria" parameterType="CategoriaFeesDTO">										
		UPDATE DDA_T_CONTRATO_PAGO_CATEG
			 SET DESC_CATEGORIA = #{categoria.categoria} 
	    WHERE 
	          ID_PAGO_CATEG = #{categoria.idCategoria}
	</update>
	
	<delete id="eliminarCategoriasContrato" parameterType="map">		
		DELETE DDA_T_CONTRATO_PAGO_CATEG WHERE ID_CONTRATO = #{idContrato}											
	</delete>
	
	<select id="getCategoriasTitulosXContrato" resultMap="catTitulo" parameterType="map">
		SELECT desc_titulo, perCat.DESC_CATEGORIA as DESC_CATEGORIA
       		   FROM DDA_T_CONTRATO_TITULO titulo
               INNER JOIN DDA_T_CONTRATO_PAGO_CATEG perCat ON titulo.ID_PAGO_CATEG    = perCat.ID_PAGO_CATEG               
               WHERE perCat.ID_CONTRATO = #{idContrato} 
	</select>
	
	<select id="getCategoriasTitulosXCategoria" resultMap="catTitulo" parameterType="map">
		SELECT desc_titulo, perCat.DESC_CATEGORIA as DESC_CATEGORIA
       		   FROM DDA_T_CONTRATO_TITULO titulo       
       		   INNER JOIN DDA_T_CONTRATO_PAGO_CATEG perCat ON titulo.ID_PAGO_CATEG = perCat.ID_PAGO_CATEG
               WHERE titulo.ID_PAGO_CATEG = #{idCategoria}
	</select>
	
	<update id="actualizarTitulosMCateg" parameterType="map">		
        UPDATE DDA_M_CONTRATO_TITULO SET ID_PAGO_CATEG = null WHERE ID_PAGO_CATEG = #{idCategoria}
	</update>
	
	<delete id="eliminarPagoCategoria" parameterType="map">		
		DELETE DDA_T_CONTRATO_PAGO_CATEG WHERE ID_PAGO_CATEG = #{idCateg}											
	</delete>
	
	<delete id="eliminarPagoFlatByCategoria" parameterType="map">
		DELETE DDA_T_CONTRATO_PAGO_FLAT WHERE ID_PAGO_CATEG = #{idCateg}			          
	</delete>
		
	<!-- Consultas para fees contrato -->
	<select id="fechaInicio" resultType="string" parameterType="map">
		SELECT TO_CHAR(MIN(FECHA_INICIO), 'mm/dd/yyyy')     		        
               FROM DDA_T_CONTRATO 
               WHERE ID_CONTRATO_ORIGINAL = (SELECT ID_CONTRATO_ORIGINAL FROM DDA_T_CONTRATO WHERE ID_CONTRATO = #{idCto})                                		 				         		     		  			       		   				   
	</select>

	<select id="fechaFin" resultType="string" parameterType="map">
		SELECT TO_CHAR(MAX(FECHA_FIN), 'mm/dd/yyyy')     		        
               FROM DDA_T_CONTRATO 
               WHERE ID_CONTRATO_ORIGINAL = (SELECT ID_CONTRATO_ORIGINAL FROM DDA_T_CONTRATO WHERE ID_CONTRATO = #{idCto})                                		 				         		     		  			       		   				   
	</select>
	
	<update id="actualizarInflacionCto" parameterType="map">
		UPDATE DDA_T_CONTRATO
			  SET  INFLACION = #{inflacion}			     
	    WHERE ID_CONTRATO = #{idContrato}
	</update>
	
	<select id="getCostoTotal" resultType="string" parameterType="map">
		SELECT ROUND(SUM(COSTO),3)    		        
               FROM DDA_T_CONTRATO_TITULO 
               WHERE ID_CONTRATO = #{idContrato}                           		 				         		     		  			       		   				   
	</select>
	<select id="actualizarCostoTitulos" parameterType="map" statementType="CALLABLE" resultType="string">
      			 { 
      			 #{response, javaType=String, jdbcType=VARCHAR, mode=OUT} = call DDA_COSTO_TOTALCONTRATO( #{idContrato, mode=IN, javaType=LONG, jdbcType=NUMERIC},
      			 #{costoTotal, mode=IN, javaType=DOUBLE, jdbcType=NUMERIC}) 
      			 } 
   	  </select>
		
		
</mapper>