<?php

/**
 * novedad_det_tit_anueta actions.
 *
 * @package    canon
 * @subpackage novedad_det_tit_anueta
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class novedad_det_tit_anuetaActions extends sfActions {

    /**
     * Executes index action
     *
     * @param sfRequest $request A request object
     */
    public function executeList(sfWebRequest $request) {

        //Revisar que sea post
        //$this->forward404Unless($request->isMethod('post'));
        //Guardar los parametros del request en el log
        $this->logMessage("---BEGIN Logging request");
        foreach ($request->getPostParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("--------------------------------------------------*  Ip: " . $_SERVER['REMOTE_ADDR']);
        foreach ($request->getGetParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("---END Logging request");

        $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
        $this->conn->beginTransaction();

        /*
         * Formato de fecha
         */
        //Sql
        $sql = <<<EOD
ALTER SESSION SET NLS_DATE_FORMAT = "YYYY-MM-DD" 
EOD;
        //Ejecutar SQL
        CN_TABLE::executeSQL($sql);

        /*
         * Manejo de errores
         */
        try {


            /*
             * variables de filtro
             */
            $whereTitulo = ' ';
            if (isset($request['id_titulo'])) {
                $whereTitulo = "and nov.id_titulo = " . $request['id_titulo'] . " ";
            }

            /**
             * Borrar registros anteriores
             */
            $sql = <<<EOD
DELETE FROM ca_novedad_det_tit_anueta nov
where
1 = 1
$whereTitulo
EOD;
            $this->conn->execute($sql);

            /**
             * Recorrer las novedades segun anualidades y titulos
             */
            $sql = <<<EOD
select  distinct

anu.id_anual_etapa,
anu.fecha_inicio-1 as fecha_fin,
anu.fecha_inicio as fecha_inicio_anu,
anu.fecha_fin as fecha_fin_anu,
nov.id_titulo

from ca_novedad nov

left join ca_anual_etapa anu
on anu.id_titulo = nov.id_titulo

left join ca_titulo_etapa titeta
on titeta.id_titulo_etapa = anu.id_titulo_etapa

where
nov.fecha_inicio between anu.fecha_inicio and anu.fecha_fin
and nov.fecha_fin between anu.fecha_inicio and anu.fecha_fin
and nov.aprobada = 1
and nov.id_tipo_novedad = 10
and titeta.actual = 1
$whereTitulo

order by
nov.id_titulo,
anu.fecha_inicio 
EOD;

            //ejecuta y obtiene el resultado del sql
            $records_tit = CN_TABLE::executeSQL($sql, true);

            foreach ($records_tit as $value_tit) {

                $orden = 1;
                $id_titulo_rec = $value_tit["id_titulo"];
                $id_anual_etapa_rec = $value_tit["id_anual_etapa"];
                $fecha_fin = $value_tit["fecha_fin"];
                $fecha_inicio_anu_rec = $value_tit["fecha_inicio_anu"];
                $fecha_fin_anu_rec = $value_tit["fecha_fin_anu"];


                /**
                 * Recorrer las novedades segun anualidades y titulos
                 */
                $sql = <<<EOD
select distinct 

anu.fecha_inicio as fecha_inicio_for,
nov.fecha_inicio - 1 as fecha_fin_for,
                        
anu.id_anual_etapa,
anu.fecha_inicio as fecha_inicio_anu,
anu.fecha_fin as fecha_fin_anu,
to_char(nov.fecha_inicio,'yyyy') as vigencia,
nov.fecha_fin - nov.fecha_inicio + 1 as dias,
nov.*

from ca_novedad nov

left join ca_anual_etapa anu
on anu.id_titulo = nov.id_titulo

left join ca_titulo_etapa titeta
on titeta.id_titulo_etapa = anu.id_titulo_etapa

where
nov.fecha_inicio between anu.fecha_inicio and anu.fecha_fin
and nov.fecha_fin between anu.fecha_inicio and anu.fecha_fin
and nov.aprobada = 1
and nov.id_tipo_novedad = 10
and titeta.actual = 1
and nov.id_titulo = $id_titulo_rec             

order by
nov.id_titulo,
anu.fecha_inicio,
nov.fecha_inicio 
EOD;

                //ejecuta y obtiene el resultado del sql
                $records = CN_TABLE::executeSQL($sql, true);

                $orden = 1;
                $tag_ini = true;
                
                $fecha_inicio_for = $fecha_inicio_anu_rec;

                foreach ($records as $value) {

                    //variables titulo y etapa
                    $id_titulo = $value["id_titulo"];
                    $id_anual_etapa = $value["id_anual_etapa"];

                    //variables de novedad
                    $id_novedad = $value["id_novedad"];
                    $fecha_inicio = $value["fecha_inicio"];
                    $fecha_fin = $value["fecha_fin"];
                    $fecha_fin_for = $value["fecha_fin_for"];

                    //validaciones de fecha, solo para el primer registro
                    if ($tag_ini) {
                        $fecha_inicio_anu = $fecha_inicio_anu_rec;
                        $fecha_fin_anu = $fecha_fin_for;
                    } else {
                        /**
                         * sumar dia a fecha
                         */
                        $sql = <<<EOD
select to_date('$fecha_inicio_for','YYYY-MM-DD') + 1 as fecha_inicio_for from dual                         
EOD;

                        //ejecuta y obtiene el resultado del sql
                        $records_sum = CN_TABLE::executeSQL($sql, true);

                        $fecha_inicio_anu = $records_sum[0]['fecha_inicio_for'];
                        $fecha_fin_anu = $fecha_fin_for;
                    }
                    $tag_ini = false;

                    //validar registro segun fechas
                    $datetime1 = new DateTime($fecha_fin_anu);
                    $datetime2 = new DateTime($fecha_inicio);
                    $datetime3 = new DateTime($fecha_inicio_anu);
                    $datetime4 = new DateTime($fecha_fin_anu);
                    if ($datetime1 < $datetime2 && $datetime3 < $datetime4) {

                        /**
                         * Inserta las antiguas anualidades en la nueva proyeccion
                         */
                        $sql = <<<EOD
insert into ca_novedad_det_tit_anueta (id_titulo,id_anual_etapa,id_novedad,
    fecha_inicio,fecha_fin,
        dias,tag_etapa,orden) 
values ('$id_titulo','$id_anual_etapa',null,
    to_date('$fecha_inicio_anu','YYYY-MM-DD'),to_date('$fecha_fin_anu','YYYY-MM-DD'),
        '0','1','$orden')
EOD;
                        $this->conn->execute($sql);
                        $orden++;
                    }

                    $this->logMessage("Inserto ca_novedad_det_tit_anueta tag 1");

                    /**
                     * Inserta las novedades
                     */
                    $sql = <<<EOD
insert into ca_novedad_det_tit_anueta (id_titulo,id_anual_etapa,id_novedad,
    fecha_inicio,fecha_fin,
        dias,tag_etapa,orden) 
values ('$id_titulo','$id_anual_etapa',$id_novedad,
    to_date('$fecha_inicio','YYYY-MM-DD'),to_date('$fecha_fin','YYYY-MM-DD'),
        '0','0','$orden')
EOD;
                    $this->conn->execute($sql);
                    $orden++;
                    $fecha_inicio_for = $fecha_fin;

                    $this->logMessage("Inserto ca_novedad_det_tit_anueta tag 0");
                }

                /**
                 * Inserta etapa fecha final rango
                 */
                $sql = <<<EOD
insert into ca_novedad_det_tit_anueta (id_titulo,id_anual_etapa,id_novedad,
    fecha_inicio,fecha_fin,
        dias,tag_etapa,orden) 
values ('$id_titulo_rec','$id_anual_etapa_rec',null,
    to_date('$fecha_fin','YYYY-MM-DD')+1,to_date('$fecha_fin_anu_rec','YYYY-MM-DD'),
        '0','1','$orden')
EOD;
                $this->conn->execute($sql);

                $this->logMessage("Inserto ca_novedad_det_tit_anueta final");
            }

            /**
             * Actualiza dias
             */
            $sql = <<<EOD
update ca_novedad_det_tit_anueta nov 
    set nov.dias = nov.fecha_fin - nov.fecha_inicio + 1
where
1 = 1
$whereTitulo 
EOD;
            $this->conn->execute($sql);


            /*
             * COMMIT de transacciones
             */
            $this->conn->commit();
            $this->status = 0;
            $this->list_data = array();
        } catch (Exception $e) {

            $this->conn->rollback();
            $this->logMessage("FALLO novedad_det_tit_anueta");
            $this->status = -1;
            $this->list_data = array();
            $this->logMessage("[novedad_det_tit_anueta] Generación Erronea.");
        }
    }

}
