<?php

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

    /**
     * Executes Update action
     *
     * @param sfRequest $request A request object
     */
    public function executeUpdate(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");

        /*
         * Forzar formato de fecha para manejo en el postprocess - 20130918
         */
        $sql = <<<EOD
ALTER SESSION SET NLS_DATE_FORMAT = "YYYY-MM-DD"
EOD;
        CN_TABLE::executeSQL($sql);

        /*
         * Manejo de errores
         */
        try {
            /*
             * Variables obligatorias
             */
            $id_certi_retefuente = $request['id_certi_retefuente'];
            $id_concep_nomina = $request['id_concep_nomina'];
            $id_tipo_doc = $request['id_tipo_doc'];
            $num_doc = $request['num_doc'];
            $motivo_anu = $request['motivo_anu'];
            $fecha_anu = CN_TABLE::fechaSistema();
            $estado = 0;


            $resultado = array();

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

            //actualiza certificado
            $sql = <<<EOD
update no_certi_retefuente set estado = $estado, 
    fecha_anu = to_date('$fecha_anu','yyyy-mm-dd'), 
        motivo_anu = '$motivo_anu' 
    where id_certi_retefuente = $id_certi_retefuente 
        and id_tipo_doc = $id_tipo_doc and num_doc = $num_doc 
EOD;

            $this->conn->execute($sql);

            //inactiva de no_concepto_func
            $sql = <<<EOD
update no_concepto_func set estado = 0 , actual = 0, fecha_hasta = to_date('$fecha_anu','yyyy-mm-dd')  
    where id_tipo_doc = $id_tipo_doc and num_doc = $num_doc
      and id_concep_nomina = $id_concep_nomina and actual = 1
EOD;
            //execute sql
            $this->conn->execute($sql);


            $this->conn->commit();

            $this->list_data = $resultado;
            $this->logMessage("[certificado_retefuente_anul] Consulta exitosa.");
        } catch (Exception $e) {

            //ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
            $this->conn->rollback();

            $this->status = 1;
            $this->totalRows = 0;
            $this->startRow = 0;
            $this->endRow = 0;
            $this->list_data = array();
            $this->logMessage("ERROR!!!");
            $this->logMessage($e->getMessage());
        }
    }

    /**
     * Executes Add action
     *
     * @param sfRequest $request A request object
     */
    public function executeAdd(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");

        /*
         * Forzar formato de fecha para manejo en el postprocess - 20130918
         */
        $sql = <<<EOD
ALTER SESSION SET NLS_DATE_FORMAT = "YYYY-MM-DD"
EOD;
        CN_TABLE::executeSQL($sql);

        /*
         * Manejo de errores
         */
        try {


            $resultado = array();

            /*
             * Variables obligatorias
             */
            $motivo_anu = $request['motivo_anu'];
            $fecha_anu = CN_TABLE::fechaSistema();
            $estado = 0;

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

            /**
             * Inactiva todos los certificados mensuales que hay en el momento - 20150417
             * Los únicos comprobantes que no se deben inactivar, son los que corresponden a SALUD OBLIGATORIA, los cuales se actualizan con el reproceso de cada 6 meses. - 20150420
             */
            $sql = <<<EOD
select
tab0.*

from(
select tab1.*, tab2.codigo||' - '||tab2.descripcion as concepto, tab3.nombre_apellido,
per.id_anhos, per.id_meses

from no_certi_retefuente tab1

left join no_concep_nomina tab2 ON tab2.id_concep_nomina = tab1.id_concep_nomina
left join no_datos_funcionario_v tab3 on tab3.id_tipo_doc = tab1.id_tipo_doc and tab3.num_doc = tab1.num_doc
left join no_periodo per on per.id_periodo = tab1.id_periodo

where tab2.estado = 0
and tab2.id_concep_nomina != nvl((SELECT ID_CONCEP_APOR_SALOBLI FROM NO_PARAM_CONCEP where ID_PARAM_CONCEP = 1), 0)

)tab0

where 
tab0.estado = 1
--and tab0.num_doc = 52421014

order by tab0.num_doc, tab0.concepto 
EOD;

            $results = CN_TABLE::executeSQL($sql);

            if (count($results) > 0) {
                //recorre cada certificado
                foreach ($results as $value) {

                    $id_tipo_doc = $value['id_tipo_doc'];
                    $num_doc = $value['num_doc'];
                    $id_certi_retefuente = $value['id_certi_retefuente'];
                    $id_concep_nomina = $value['id_concep_nomina'];


                    /*
                     * anula certificado
                     */
                    $sql = <<<EOD
update no_certi_retefuente set estado = $estado, 
    fecha_anu = to_date('$fecha_anu','yyyy-mm-dd'), 
        motivo_anu = '$motivo_anu' 
    where id_certi_retefuente = $id_certi_retefuente 
        and id_tipo_doc = $id_tipo_doc and num_doc = $num_doc 
EOD;
                    //execute sql
                    $this->conn->execute($sql);


                    /**
                     * desactiva no_concep_func
                     */
                    $sql = <<<EOD
update no_concepto_func set estado = 0 , actual = 0, fecha_hasta = to_date('$fecha_anu','yyyy-mm-dd')  
    where id_tipo_doc = $id_tipo_doc and num_doc = $num_doc
      and id_concep_nomina = $id_concep_nomina and actual = 1 
EOD;
                    //execute sql
                    $this->conn->execute($sql);
                }
            }

            $this->conn->commit();


            $this->list_data = $resultado;
            $this->logMessage("[certificado_retefuente_anul] Consulta exitosa.");
        } catch (Exception $e) {

            //ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
            $this->conn->rollback();

            $this->status = 1;
            $this->totalRows = 0;
            $this->startRow = 0;
            $this->endRow = 0;
            $this->list_data = array();
            $this->logMessage("ERROR!!!");
            $this->logMessage($e->getMessage());
        }
    }

}
