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

<mapper namespace="com.mx.dla.dda.admin.presupuestos.daos.PresupuestoDAO">

	<resultMap id="presu" type="PresupuestoDTO">
		<id     property="id"	          column="ID_PRESUPUESTO" />
		<result property="anio" 		  column="ANNIO" />
		<result property="montoAsignado"  column="MONTO" />
		<result property="fechaSAP"		  column="FECHA_SAP" />		
		<association property="apartados" resultMap="apartadoPre"/>					
	</resultMap>

	<resultMap id="apartadoPre" type="PresupuestoApartadoDTO">	
		<id     property="id"	        column="ID_APARTADO" />
		<result property="type" 		column="AMORTIZABLE" />
		<result property="nombre" 		column="DESC_APARTADO" />		
		<result property="idSap"		column="ID_SAP" />		
	</resultMap>

	<resultMap id="amorApar" type="AmortApartadoDTO">	
		<result property="id"	          column="ID_PRESUPUESTO" />
		<result property="anio" 		  column="ANNIO" />
		<result property="montoAsignado"  column="MONTO" />						
	</resultMap>
	
	<resultMap id="montoTrans" type="MontoTransferirDTO">	
		<result property="idOrigen"	           column="ID_APARTADO_ORIGEN" />
		<result property="idDestino" 		   column="ID_APARTADO_DESTINO" />
		<result property="montoOrigen"         column="MONTO_ORIGEN" />
		<result property="montoDestino"        column="MONTO_DESTINO" />
		<result property="montoTransferido"    column="MONTO_TRANSFERIDO" />
		<result property="fechaTransferencia"  column="FECHA_TRANSFERENCIA" />						
	</resultMap>



	<select id="getApartados" resultMap="apartadoPre">      
	     SELECT
	            a.ID_APARTADO, a.DESC_APARTADO, a.ID_SAP, a.AMORTIZABLE
		  FROM DDA_T_APARTADO a order by a.DESC_APARTADO 		  		  
	</select>   
	
	<select id="getPresupuestos" resultMap="presu" parameterType="map">      
	     SELECT
	            p.ID_PRESUPUESTO, p.ANNIO, p.MONTO, p.FECHA_SAP, ap.AMORTIZABLE,
	            ap.ID_APARTADO, ap.DESC_APARTADO, ap.ID_SAP
		  FROM DDA_T_PRESUPUESTO_APARTADO p 
		  INNER JOIN DDA_T_APARTADO ap ON p.ID_APARTADO = ap.ID_APARTADO
		  WHERE ap.ID_APARTADO IN 
         	   <foreach item="id" index="index" collection="ids" open="(" separator="," close=")">
	           		#{id}
	           </foreach>		  		  
	</select>   
		                                      
	<select id="getApartadosAmortizacion" parameterType="map" resultMap='amorApar'>      
	     SELECT 
	     	   DDA_T_APARTADO.ID_APARTADO ID_PRESUPUESTO, EXTRACT(YEAR FROM DDA_T_AMORTIZACION.MES) ANNIO, DDA_T_AMORTIZACION.MONTO MONTO 
         FROM DDA_T_AMORTIZACION 
         INNER JOIN DDA_T_CONTRATO ON DDA_T_AMORTIZACION.ID_CONTRATO_ORIGINAL = DDA_T_CONTRATO.ID_CONTRATO_ORIGINAL
         INNER JOIN DDA_T_APARTADO ON DDA_T_CONTRATO.ID_APARTADO              = DDA_T_APARTADO.ID_APARTADO
         INNER JOIN DDA_T_PRESUPUESTO_APARTADO ON DDA_T_PRESUPUESTO_APARTADO.ID_APARTADO = DDA_T_APARTADO.ID_APARTADO
         WHERE DDA_T_CONTRATO.ID_ESTATUS = 5 AND DDA_T_PRESUPUESTO_APARTADO.ID_APARTADO IN 
         	   <foreach item="id" index="index" collection="ids" open="(" separator="," close=")">
	           		#{id}
	           </foreach>	                         		
	</select>  	  	
  	
  	<select id="getAmortizables" resultMap="amorApar">      
	     SELECT p.ANNIO, p.MONTO FROM DDA_T_AMORTIZABLE p 		  		 
	</select>

  	
  		<insert id="almacenaMonto" 
	useGeneratedKeys="true" keyProperty="idAmortizable">
		<!-- <selectKey keyProperty="idAmortizable" resultType="int"
			order="BEFORE">
			select DDA_SQT_AMORTIZABLE.nextVal from DUAL
		</selectKey> -->
		<!-- INSERT INTO	DDA_T_AMORTIZABLE (ID_AMORTIZABLE, ANNIO, MONTO)
        values(#{idAmortizable}, #{annio}, #{monto}) -->
        
        MERGE INTO DDA_T_AMORTIZABLE x
			USING (SELECT #{annio} anio FROM dual) y
			ON (x.annio  = y.anio)
			WHEN MATCHED THEN
			    UPDATE SET x.monto = #{monto}
			WHEN NOT MATCHED THEN
				<selectKey keyProperty="idAmortizable" resultType="int"
					order="BEFORE">
					select DDA_SQT_AMORTIZABLE.nextVal from DUAL
				</selectKey>
			    INSERT(x.ID_AMORTIZABLE, x.ANNIO, x.MONTO)  
			    VALUES(#{idAmortizable}, #{annio}, #{monto})
			        
        
        
	</insert>
  	
  	
	<resultMap id="apPresBD" type="ApartadoPreBD">	
		<result property="idApartado"	    column="ID_APARTADO" />
		<result property="descApartado" 	column="DESC_APARTADO" />
		<result property="tipo"             column="AMORTIZABLE" />
		<result property="montoAsignado"    column="MONTO" />
		<result property="idSap"            column="ID_SAP" />
		<result property="idPreApart"       column="ID_PRESUPUESTO" />
		<result property="fechaSap"         column="FECHA_SAP" />
		<result property="anio"             column="ANNIO" />						
	</resultMap>
  	
  	<select id="obtenerApartadosAsignado" parameterType="map" resultMap="apPresBD">
	  	SELECT 
	         DDA_T_PRESUPUESTO_APARTADO.MONTO,	         
	         DDA_T_PRESUPUESTO_APARTADO.ID_PRESUPUESTO,
	         DDA_T_PRESUPUESTO_APARTADO.FECHA_SAP,
	         DDA_T_PRESUPUESTO_APARTADO.ID_APARTADO	         
			 FROM DDA_T_PRESUPUESTO_APARTADO 
	         WHERE DDA_T_PRESUPUESTO_APARTADO.ANNIO = #{anio} AND DDA_T_PRESUPUESTO_APARTADO.ID_APARTADO IN
	         	<foreach item="id" index="index" collection="ids" open="(" separator="," close=")">
	           		#{id.id}
	           </foreach>	            	
  	</select>
  	
  	<select id="obtenerApartadosComprometido" parameterType="map" resultMap="apPresBD">
        
              SELECT         
					    cnt.ID_APARTADO,
					    NVL( ROUND( SUM( TO_NUMBER( tit.COSTO ) ), 2 ), 0 ) as MONTO
					FROM 
					    (
					        SELECT
					            ctt.ID_CONTRATO_ORIGINAL, MAX( ctt.ID_CONTRATO ) as ID_CONTRATO
					        FROM
					            DDA_T_CONTRATO ctt,            
					            DDA_T_APARTADO apdo,
					            DDA_C_CONTRATO_ESTATUS est
					        WHERE
					            ctt.ID_ESTATUS  = est.ID_ESTATUS        
					        AND ctt.ID_APARTADO = apdo.ID_APARTADO
					        AND est.AFECTA_PPTO = 1
					        AND apdo.AMORTIZABLE = #{tipo}
					        GROUP BY ctt.ID_CONTRATO_ORIGINAL
					    ) mx,    
					    DDA_T_CONTRATO cnt,
					    DDA_T_CONTRATO_TITULO tit
					WHERE
					    cnt.ID_CONTRATO = mx.ID_CONTRATO
					and mx.ID_CONTRATO = tit.ID_CONTRATO
					and tit.ESTATUS = 'ACTIVO'    
					and TO_CHAR( tit.FECHA_INICIO, 'yyyy' )  = #{anio}
					group by cnt.ID_APARTADO
         	
  	</select>
  	
  	<select id="obtenerPresupuestoAsignado" parameterType="map" resultMap="apPresBD">
  		SELECT 
	         DDA_T_PRESUPUESTO_APARTADO.ANNIO, SUM(DDA_T_PRESUPUESTO_APARTADO.MONTO) MONTO
	         FROM DDA_T_PRESUPUESTO_APARTADO  
	         WHERE DDA_T_PRESUPUESTO_APARTADO.ID_APARTADO IN
	         	<foreach item="a" index="index" collection="ids" open="(" separator="," close=")">
	           		#{a.id}
	           </foreach>   	           
              GROUP BY DDA_T_PRESUPUESTO_APARTADO.ANNIO              
  	</select>
  	
  	<select id="obtenerPresupuestoComprometido" parameterType="map" resultMap="apPresBD">
  		      SELECT         
   					 TO_CHAR( tit.FECHA_INICIO, 'yyyy' ) as ANIO,
    				 NVL( ROUND( SUM( TO_NUMBER( tit.COSTO ) ), 2 ), 0 ) as MONTO
					FROM 
				    (
				        SELECT
				            ctt.ID_CONTRATO_ORIGINAL, MAX( ctt.ID_CONTRATO ) as ID_CONTRATO
				        FROM
				            DDA_T_CONTRATO ctt,            
				            DDA_T_APARTADO apdo,
				            DDA_C_CONTRATO_ESTATUS est
				        WHERE
				            ctt.ID_ESTATUS  = est.ID_ESTATUS        
				        AND ctt.ID_APARTADO = apdo.ID_APARTADO
				        AND est.AFECTA_PPTO = 1
				        AND apdo.AMORTIZABLE = #{tipo}
				        GROUP BY ctt.ID_CONTRATO_ORIGINAL
				    ) mx,        
				    DDA_T_CONTRATO_TITULO tit
				WHERE
				    mx.ID_CONTRATO = tit.ID_CONTRATO
				and tit.ESTATUS = 'ACTIVO'    
				group by TO_CHAR( tit.FECHA_INICIO, 'yyyy' )  		              
  	</select>
  	
	<select id="getAmortizable" resultType="String" parameterType="map">      
	     SELECT p.MONTO FROM DDA_T_AMORTIZABLE p where p.ANNIO = #{anio} 		  		 
	</select>
	
	<select id="getApartadosXTipo" resultMap="apartadoPre">      
	     SELECT
	            a.ID_APARTADO, a.DESC_APARTADO, a.ID_SAP, a.AMORTIZABLE
		  FROM DDA_T_APARTADO a 
		  WHERE a.AMORTIZABLE = #{tipo}
	</select>
	
	<insert id="guardarTransferencia" parameterType="MontoTransferirDTO">
		INSERT INTO DDA_T_APARTADO_TRANSFER
		  ( ID_APARTADO_ORIGEN, ID_APARTADO_DESTINO, MONTO_ORIGEN, MONTO_DESTINO, MONTO_TRANSFERIDO, FECHA_TRANSFERENCIA)
        VALUES
  		  ( #{obj.idOrigen}, #{obj.idDestino}, #{obj.montoOrigen}, #{obj.montoDestino}, #{obj.montoTransferido}, #{obj.fechaTransferencia})					    	        	   
  	</insert>   	

	<insert id="guardarApartado" parameterType="PresupuestoApartadoDTO">
		<selectKey keyProperty="ap.idPreApart" resultType="long" order="BEFORE">
	     		   select DDA_SQT_PRESUPUESTO_APARTADO.nextVal from DUAL
	  	</selectKey> 	  	
		INSERT INTO DDA_T_PRESUPUESTO_APARTADO
		  ( ID_PRESUPUESTO, ID_APARTADO, ANNIO, MONTO, FECHA_SAP)
        VALUES
  		  ( #{ap.idPreApart}, #{ap.id}, #{anio}, #{ap.montoAsignado}, #{ap.fechaSAP})					    	        	   
  	</insert>

	<update id="actualizarApartado" parameterType="PresupuestoApartadoDTO">
		update 	DDA_T_PRESUPUESTO_APARTADO 
  		set 	MONTO          = #{ap.montoAsignado},
  				FECHA_SAP      = #{ap.fechaSAP}
  		where 	ID_PRESUPUESTO = #{ap.idPreApart} 
  	</update>
  	
  	<delete id="eliminarPrepApartadoPrevio">
  	   delete DDA_T_PRESUPUESTO_APARTADO where ID_APARTADO = #{idApartado} and ANNIO = #{anio}
  	</delete>
  	
</mapper>
