<?php

/**
 * eliminar_comprobante actions.
 *
 * @package    Sofhouse
 * @subpackage eliminar_comprobante
 * @author     Software House
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class eliminar_comprobanteActions extends sfActions {

    /**
     * Metodo La funcionalidad permite la eliminación de comprobantes y todas sus referencias o documentos y todas sus referencias.
     * @param sfWebRequest $request
     */
    public function executeRemove(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");
        
        /*
         * Manejo de errores
         */
        try {

            //sentencia sql
            $sql = <<<EOD
ALTER TRIGGER CN_COTROL_CAD_TOT_TRG DISABLE
EOD;
            //ejecuta el sql
            CN_TABLE::executeSQL($sql);

            /*
             * variables por defecto para el registro de log
             */
            $id_tabla = 'null';
            $id_vigencia = 'null';
            $id_cen_op = 'null';

            $id_cia = 'null';
            if (isset($request['id_cia'])) {
                $id_cia = $request['id_cia'];
            }
            //obtener id maestro tabla
            $id_mae_bd = 'null';

            //5 - indica anular de consulta - para este caso es eliminar y pasar a tabla ANU
            $id_ope_bd = 5;

            //id del maestro tercero
            $id_mae_ter = 1;
            if (isset($request['id_username'])) {
                $id_mae_ter = $request['id_username'];
            }
            $usuario = 'admin';
            if (isset($request['username'])) {
                if (!is_null($request['username']) && $request['username'] != '') {
                    $usuario = $request['username'];
                }
            }
            $comando = 'sin comando';
            if (isset($request['comando'])) {
                $comando = $request['comando'];
            }
            //construir observacion
            $observacion = "'Se estan eliminando cad o documentos desde la funcionalidad: " . $comando . "'";

            /*
             * registro de consulta en tabla de log
             */
            $sql = CN_TABLE::registroTableLog($id_tabla, $id_vigencia, $id_cen_op, $id_cia, $id_mae_bd, $id_ope_bd, $id_mae_ter, $usuario, $comando, $observacion);



            /*
             * Variables de operacion
             */
            $id_periodo_contable = $request['id_periodo_contable'];
            $id_tipo_comprobante = $request['id_tipo_comprobante'];
            $id_cia = $request['id_cia'];
            $id_vigencia = $request['id_vigencia'];
            $id_cen_op = $request['id_cen_op'];
            $id_cad = $request['id_cad'];
            $id_documento = null;
            if (isset($request['id_documento'])) {
                $id_documento = $request['id_documento'];
            }
//            $fecha_sistema = CN_TABLE::fechaSistema();
            $motivo_anu = "'Sin Motivo'";
            if (isset($request['motivo_anu'])) {
                if ($request['motivo_anu'] != 'null') {
                    $motivo_anu = "'" . $request['motivo_anu'] . "'";
                } else {
                    $motivo_anu = "'Sin Motivo'";
                }
            }

            //Diferenciar entre eliminar CAD y Documentos
            if (is_null($id_documento)) {
                $this->logMessage("[ELIMINAR COMPROBANTE] Diferenciar entre eliminar CAD y Documentos.");

                /*
                 * eliminación de comprobantes y todas sus referencias
                 */

                //obtener Documentos            
                // Sentencia SQL 
                $sql = <<<EOD
select * from cn_documento
where 
id_cia = $id_cia
and id_vigencia = $id_vigencia
and id_cen_op = $id_cen_op
and id_cad = $id_cad
EOD;
                //ejecuta el sql
                $resultado = CN_TABLE::executeSQL($sql);

                if (count($resultado) > 0) {

                    //recorre los documentos
                    foreach ($resultado as $doc) {

                        $id_documento = $doc['id_documento'];


                        /*
                         * Pasar registros antes de eliminacion a tabla de anulacion
                         */
                        // Sentencia SQL 
                        $sql = <<<EOD
INSERT INTO cn_movimiento_contable_anu

select * from cn_movimiento_contable
where 
id_cia = $id_cia
and id_vigencia = $id_vigencia
and id_cen_op = $id_cen_op
and id_cad = $id_cad
and id_documento = $id_documento 
EOD;

                        //ejecuta el sql
                        CN_TABLE::executeSQL($sql);

                        /*
                         * Elimina registros de movimientos para el documento y cad
                         */
                        // Sentencia SQL 
                        $sql = <<<EOD
delete from cn_movimiento_contable 
where 
id_cia = $id_cia
and id_vigencia = $id_vigencia
and id_cen_op = $id_cen_op
and id_cad = $id_cad
and id_documento = $id_documento
EOD;
                        //ejecuta el sql
                        CN_TABLE::executeSQL($sql);
                    }


                    /*
                     * Pasar registros antes de eliminacion a tabla de anulacion
                     */
                    // Sentencia SQL 
                    $sql = <<<EOD
INSERT INTO cn_documento_anu

select 
doc.*, sysdate as fecha_anu, $motivo_anu as motivo_anu 

from cn_documento doc

where 
id_cia = $id_cia
and id_vigencia = $id_vigencia
and id_cen_op = $id_cen_op
and id_cad = $id_cad
EOD;
                    //ejecuta el sql
                    CN_TABLE::executeSQL($sql);

                    /*
                     * Elimina registros de documento para el cad
                     */
                    // Sentencia SQL 
                    $sql = <<<EOD
delete from cn_documento 
where 
id_cia = $id_cia
and id_vigencia = $id_vigencia
and id_cen_op = $id_cen_op
and id_cad = $id_cad
EOD;
                    //ejecuta el sql
                    CN_TABLE::executeSQL($sql);
                } else {

                    $this->logMessage("No hay Documentos creados.");
                }


                /*
                 * Pasar registros antes de eliminacion a tabla de anulacion
                 */
                // Sentencia SQL 
                $sql = <<<EOD
INSERT INTO cn_control_cad_anu

select 
cad.*,  sysdate as fecha_anu, $motivo_anu as motivo_anu   
from cn_control_cad cad
where
id_cia = $id_cia
and id_vigencia = $id_vigencia
and id_cen_op = $id_cen_op
and id_periodo_contable = $id_periodo_contable
and id_tipo_comprobante = $id_tipo_comprobante
and id_cad = $id_cad
EOD;
                //ejecuta el sql
                CN_TABLE::executeSQL($sql);

                /*
                 * Elimina registros de cad comprobante y periodo
                 */
                // Sentencia SQL 
                $sql = <<<EOD
delete from cn_control_cad
where
id_cia = $id_cia
and id_vigencia = $id_vigencia
and id_cen_op = $id_cen_op
and id_periodo_contable = $id_periodo_contable
and id_tipo_comprobante = $id_tipo_comprobante
and id_cad = $id_cad
EOD;
                //ejecuta el sql
                CN_TABLE::executeSQL($sql);

                /*
                 * variables por defecto para el registro de log
                 */
                $id_tabla = $id_cad;

                //obtener id maestro tabla
                $id_mae_bd = CN_TABLE::consultarIdTablaBD('CN_CONTROL_CAD');

                //construir observacion
                $observacion = "'Se elimino registro control cad $id_tabla desde la funcionalidad: " . $comando . "'";

                /*
                 * registro de consulta en tabla de log
                 */
                $sql = CN_TABLE::registroTableLog($id_tabla, $id_vigencia, $id_cen_op, $id_cia, $id_mae_bd, $id_ope_bd, $id_mae_ter, $usuario, $comando, $observacion);
            } else {
                /*
                 * eliminación documentos y todas sus referencias
                 */

                /*
                 * Pasar registros antes de eliminacion a tabla de anulacion
                 */
                // Sentencia SQL 
                $sql = <<<EOD
INSERT INTO cn_movimiento_contable_anu

select * from cn_movimiento_contable
where 
id_cia = $id_cia
and id_vigencia = $id_vigencia
and id_cen_op = $id_cen_op
and id_cad = $id_cad
and id_documento = $id_documento 
EOD;
                //ejecuta el sql
                CN_TABLE::executeSQL($sql);


                /*
                 * Elimina registros de movimientos para el documento y cad
                 */
                // Sentencia SQL 
                $sql = <<<EOD
delete from cn_movimiento_contable 
where 
id_cia = $id_cia
and id_vigencia = $id_vigencia
and id_cen_op = $id_cen_op
and id_cad = $id_cad
and id_documento = $id_documento
EOD;
                //ejecuta el sql
                CN_TABLE::executeSQL($sql);


                /*
                 * Pasar registros antes de eliminacion a tabla de anulacion
                 */
                // Sentencia SQL 
                $sql = <<<EOD
INSERT INTO cn_documento_anu

select 
doc.*, sysdate as fecha_anu, $motivo_anu as motivo_anu 

from cn_documento doc

where 
id_cia = $id_cia
and id_vigencia = $id_vigencia
and id_cen_op = $id_cen_op
and id_cad = $id_cad
and id_documento = $id_documento
EOD;
                //ejecuta el sql
                CN_TABLE::executeSQL($sql);

                /*
                 * Elimina registros de documento para el cad
                 */
                // Sentencia SQL 
                $sql = <<<EOD
delete from cn_documento 
where 
id_cia = $id_cia
and id_vigencia = $id_vigencia
and id_cen_op = $id_cen_op
and id_cad = $id_cad
and id_documento = $id_documento
EOD;
                //ejecuta el sql
                CN_TABLE::executeSQL($sql);

                /*
                 * variables por defecto para el registro de log
                 */
                $id_tabla = $id_documento;

                //obtener id maestro tabla
                $id_mae_bd = CN_TABLE::consultarIdTablaBD('CN_DOCUMENTO');

                //construir observacion
                $observacion = "'Se elimino registro documento $id_tabla desde la funcionalidad: " . $comando . "'";

                /*
                 * registro de consulta en tabla de log
                 */
                $sql = CN_TABLE::registroTableLog($id_tabla, $id_vigencia, $id_cen_op, $id_cia, $id_mae_bd, $id_ope_bd, $id_mae_ter, $usuario, $comando, $observacion);
            }

            //sentencia sql
            $sql = <<<EOD
ALTER TRIGGER CN_COTROL_CAD_TOT_TRG ENABLE
EOD;
            //ejecuta el sql
            CN_TABLE::executeSQL($sql);

            /*
             * Resultado
             */
            $mensaje = "[ELIMINAR COMPROBANTE] Se eliminaron los registros correctamente.";
            $this->list_data = array();
            $this->mensajeError = $mensaje;
            $this->logMessage($mensaje);
        } catch (Exception $e) {

            $this->logMessage("ERROR!!!");

            //sentencia sql
            $sql = <<<EOD
ALTER TRIGGER CN_COTROL_CAD_TOT_TRG ENABLE
EOD;
            //ejecuta el sql
            CN_TABLE::executeSQL($sql);

            $this->status = 1;
            $this->mensajeError = "ERROR!!!";
            $this->list_data = array();
            $this->logMessage($e->getMessage());
        }
    }

}
