<?php

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

    /**
     * Metodo que Genera el comprobante, los documentos y los movimientos para el periodo de Cierre Fiscal - 13 según es explicado en la mecánica
     * @param sfWebRequest $request
     */
    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");

        /*
         * Variables globales del proyecto
         */
        $clasecuentapres = sfConfig::get('app_clasecuentapres');


        /*
         * 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 de operacion
             */
            $id_cia = $request['id_cia'];
            $vig_cierre = $request['vig_cierre'];
            $fecha_cierre = $request['fecha_cierre'];
            $id_periodo_contable = $request['id_periodo_contable'];
            $id_tipo_cuenta = $request['id_tipo_cuenta'];
            $id_tipo_comprobante = $request['id_tipo_comprobante'];
            $id_td = $request['id_td'];
            $id_pyg = $request['id_pyg'];
            $id_util_ejer = $request['id_util_ejer'];
            $id_perd_ejer = $request['id_perd_ejer'];
            $id_mae_ter = $request['id_mae_ter'];


            /*
             * Borrar los registro para el tipo de comprobante en la fecha de cierre y vigencia, periodo - CAD - Documentos - Movimientos
             */
            $this->deleteComprobanteCierreFiscal($id_cia, $vig_cierre, $id_periodo_contable, $id_tipo_comprobante, $fecha_cierre);

            /*
             * Obtener clase cuentas de tipo cuenta resultados
             */
            // Sentencia SQL 
            $sql = <<<EOD
select * from cn_tipo_cuenta_clase
where id_cia = $id_cia
and id_tipo_cuenta = $id_tipo_cuenta
EOD;

            // Ejecuta SQL
            $resultado = CN_TABLE::executeSQL($sql);

            /*
             * Validar y Crear where segun cuentas de resultados
             */
            if (count($resultado) > 0) {

                

                
                //and ( ID_CLASE_CUENTA = 5 or ID_CLASE_CUENTA = 6 )
                $where_clases_cuenta = " and ( ";
                // and (  sal.ID_CLASE_CUENTA = 5  or  sal.ID_CLASE_CUENTA = 6  or sal.ID_CLASE_CUENTA = 1 )  
                $where_clases_cuenta_pres = " and ( ";

                //recorre las clase cuenta del tipo cuenta
                $have_or = false;
                foreach ($resultado as $value) {
                    // la primera vez no entra
                    if ($have_or) {
                        $where_clases_cuenta .= " or ";
                        $where_clases_cuenta_pres .= " or ";
                    }

                    $where_clases_cuenta .= " sal.ID_CLASE_CUENTA = " . $value['id_clase_cuenta'] . " ";
                    $where_clases_cuenta_pres .= " sal.ID_CLASE_CUENTA = " . $value['id_clase_cuenta'] . " ";

                    $have_or = true;
                }
                $where_clases_cuenta .= " ) ";
                $where_clases_cuenta_pres .= " or sal.ID_CLASE_CUENTA = $clasecuentapres ) ";

                /*
                 * Obtener centros de operacion
                 */
                // Sentencia SQL 
                $sql = <<<EOD
select * from cn_centro_operacion 
EOD;

                // Ejecuta SQL
                $resultado = CN_TABLE::executeSQL($sql);

                /*
                 * Validar centros de operacion
                 */
                if (count($resultado) > 0) {


                    /*
                     * Recorrer cada centro de operacion
                     */
                    foreach ($resultado as $value) {

                        //por cada cenop crear un cad y un documento para periodo 13 - fecha 31-12-20??
                        $id_cen_op = $value['id_cen_op'];

                        /*
                         * Crear cad - Insert into CN_CONTROL_CAD (ID_CAD,ID_VIGENCIA,ID_CEN_OP,ID_CIA,ID_PERIODO_CONTABLE,ID_TIPO_COMPROBANTE,FECHA_CAD,TOT_DEBITO,TOT_CREDITO,ID_TER_GENERO,ID_TER_REVISO,ID_TER_APROBO) values (0,2011,16,1,13,8,to_date('31-DEC-11','DD-MON-RR'),0,0,null,null,null);
                         */
                        //obtener secuencia de tabla_vig_seq 
                        //sentencia sql
                        $sql = <<<EOD
select * from cn_table_vig_seq
where
id_cia = $id_cia
and id_vigencia = $vig_cierre
and nom_entidad = 'CN_CONTROL_CAD'
EOD;
                        //ejecuta el sql
                        $resultado = CN_TABLE::executeSQL($sql);

                        $id_cad = $resultado[0]['seq'];

                        // Sentencia SQL 
                        $sql = <<<EOD
Insert into CN_CONTROL_CAD (ID_CAD,ID_VIGENCIA,ID_CEN_OP,ID_CIA,ID_PERIODO_CONTABLE,ID_TIPO_COMPROBANTE,FECHA_CAD,TOT_DEBITO,TOT_CREDITO,ID_TER_GENERO,ID_TER_REVISO,ID_TER_APROBO) 
    values ($id_cad+1,$vig_cierre,$id_cen_op,$id_cia,$id_periodo_contable,$id_tipo_comprobante,to_date('31/12/$vig_cierre', 'dd/mm/yyyy'),0,0,null,null,null)
EOD;

                        // Ejecuta SQL
                        CN_TABLE::executeSQL($sql);


                        /*
                         * Crear docu - Insert into CN_DOCUMENTO (ID_DOCUMENTO,ID_CAD,ID_VIGENCIA,ID_CEN_OP,ID_CIA,ID_TD,ID_MAE_TER,DESCR_MTO,DOC_SOPORTE,FECHA_SOPORTE,TOT_DEBITO,TOT_CREDITO) values (0,0,2011,16,1,9,444,'prueba','0',to_date('31-DEC-11','DD-MON-RR'),0,0);
                         */

                        //obtener secuencia de tabla_vig_seq 
                        //sentencia sql
                        $sql = <<<EOD
select * from cn_table_vig_seq
where
id_cia = $id_cia
and id_vigencia = $vig_cierre
and nom_entidad = 'CN_DOCUMENTO'
EOD;
                        //ejecuta el sql
                        $resultado = CN_TABLE::executeSQL($sql);

                        $id_documento = $resultado[0]['seq'];

                        // Sentencia SQL
                        $sql = <<<EOD
Insert into CN_DOCUMENTO (ID_DOCUMENTO,ID_CAD,ID_VIGENCIA,ID_CEN_OP,ID_CIA,ID_TD,ID_MAE_TER,DESCR_MTO,DOC_SOPORTE,FECHA_SOPORTE,TOT_DEBITO,TOT_CREDITO) 
    values ($id_documento+1,$id_cad+1,$vig_cierre,$id_cen_op,$id_cia,$id_td,$id_mae_ter,'CANCELACION CUENTAS DE RESULTADOS - CIERRE FISCAL VIGENCIA $vig_cierre','0',to_date('31/12/$vig_cierre', 'dd/mm/yyyy'),0,0)
EOD;

                        // Ejecuta SQL
                        CN_TABLE::executeSQL($sql);

                        //actualizar secuencia de tabla_vig_seq por vigencia y tabla Cad-Docu-Movi
                        //Actualiza secuencia de cad
                        //sentencia sql
                        $sql = <<<EOD
UPDATE CN_TABLE_VIG_SEQ
SET SEQ = NVL( (SELECT max(ID_CAD) FROM CN_CONTROL_CAD where ID_VIGENCIA = $vig_cierre AND ID_CIA = $id_cia ), 0 )
WHERE NOM_ENTIDAD='CN_CONTROL_CAD' AND ID_CIA = $id_cia and ID_VIGENCIA = $vig_cierre
EOD;
                        //ejecuta el sql
                        CN_TABLE::executeSQL($sql);

                        //Actualiza secuencia de documentos
                        //sentencia sql
                        $sql = <<<EOD
UPDATE CN_TABLE_VIG_SEQ
SET SEQ = NVL( (SELECT max(ID_DOCUMENTO) FROM CN_DOCUMENTO where ID_VIGENCIA = $vig_cierre AND ID_CIA = $id_cia ), 0 )
WHERE NOM_ENTIDAD='CN_DOCUMENTO' AND ID_CIA = $id_cia and ID_VIGENCIA = $vig_cierre
EOD;
                        //ejecuta el sql
                        CN_TABLE::executeSQL($sql);


                        /*
                         * crear movimientos contrarios a las cuentas de resultados
                         */

                        //obtener secuencia de tabla_vig_seq 
                        //sentencia sql
                        $sql = <<<EOD
select * from cn_table_vig_seq
where
id_cia = $id_cia
and id_vigencia = $vig_cierre
and nom_entidad = 'CN_MOVIMIENTO_CONTABLE'
EOD;
                        //ejecuta el sql
                        $resultado = CN_TABLE::executeSQL($sql);

                        $id_mov_cont = $resultado[0]['seq'];

                        // Sentencia SQL 
                        $sql = <<<EOD
insert into cn_movimiento_contable 

SELECT 

(ROWNUM + $id_mov_cont ) id_mov_cont,
($id_documento+1) as id_documento,
($id_cad+1) as id_cad,
sal.id_vigencia,
sal.id_cen_op,
sal.id_cia,
sal.id_catalogo,
sal.id_cuenta_mayor,
sal.id_grupo_cuenta,
sal.id_clase_cuenta,
sal.id_mae_ter,
sal.id_auxiliar,
sal.id_sub_aux,
sal.id_centro_costo,
sal.id_sub_centro_costo,

/* Debito */
case
       when cue.naturaleza = 'D' and sal.saldo_actual < 0 then sal.saldo_actual * (-1)
       when cue.naturaleza = 'C' and sal.saldo_actual > 0 then sal.saldo_actual
       else 0
end as debito,

/* Credito */
case
       when cue.naturaleza = 'D' and sal.saldo_actual > 0 then sal.saldo_actual
       when cue.naturaleza = 'C' and sal.saldo_actual < 0 then sal.saldo_actual * (-1)
       else 0
end as credito,

0 as valor_base/*,
sal.saldo_actual,
cue.naturaleza,
sal.subcuenta*/

FROM cn_saldo sal

JOIN CN_CUENTA_MAYOR cue
ON sal.ID_CIA           = cue.ID_CIA
AND sal.ID_CUENTA_MAYOR = cue.ID_CUENTA_MAYOR
AND sal.ID_GRUPO_CUENTA = cue.ID_GRUPO_CUENTA
AND sal.ID_CLASE_CUENTA = cue.ID_CLASE_CUENTA

where
sal.id_cia = $id_cia
and sal.id_periodo_contable = ($id_periodo_contable - 1)
and sal.id_vigencia = $vig_cierre
and sal.id_cen_op = $id_cen_op
$where_clases_cuenta_pres
and sal.SALDO_ACTUAL <> 0

order by subcuenta

EOD;

                        // Ejecuta SQL
                        $resultado = CN_TABLE::executeSQL($sql);

                        //Actualiza secuencia de movimientos
                        //sentencia sql
                        $sql = <<<EOD
UPDATE CN_TABLE_VIG_SEQ
SET SEQ = NVL( (SELECT max(ID_MOV_CONT) FROM CN_MOVIMIENTO_CONTABLE where ID_VIGENCIA = $vig_cierre AND ID_CIA = $id_cia ), 0 )
WHERE NOM_ENTIDAD='CN_MOVIMIENTO_CONTABLE' AND ID_CIA = $id_cia and ID_VIGENCIA = $vig_cierre
EOD;
                        //ejecuta el sql
                        CN_TABLE::executeSQL($sql);

                        /*
                         * Obtener debito y credito acumulado de los registros creados
                         */
                        //sentencia sql
                        $sql = <<<EOD
SELECT 

0 as id_mov_cont,
id_documento,
id_cad,
id_vigencia,
id_cen_op,
id_cia,

0 as id_catalogo,
0 as id_cuenta_mayor,
0 as id_grupo_cuenta,
0 as id_clase_cuenta,

null as id_mae_ter,
null as id_auxiliar,
null as id_sub_aux,
null as id_centro_costo,
null as id_sub_centro_costo,

sum(debito) as debito,
sum(credito) as credito,

0 as valor_base

FROM (

SELECT 

(ROWNUM + 500000) id_mov_cont,
0 as id_documento,
0 as id_cad,
sal.id_vigencia,
sal.id_cen_op,
sal.id_cia,
sal.id_catalogo,
sal.id_cuenta_mayor,
sal.id_grupo_cuenta,
sal.id_clase_cuenta,
sal.id_mae_ter,
sal.id_auxiliar,
sal.id_sub_aux,
sal.id_centro_costo,
sal.id_sub_centro_costo,

/* Debito */
case
       when cue.naturaleza = 'D' and sal.saldo_actual < 0 then sal.saldo_actual * (-1)
       when cue.naturaleza = 'C' and sal.saldo_actual > 0 then sal.saldo_actual
       else 0
end as debito,

/* Credito */
case
       when cue.naturaleza = 'D' and sal.saldo_actual > 0 then sal.saldo_actual
       when cue.naturaleza = 'C' and sal.saldo_actual < 0 then sal.saldo_actual * (-1)
       else 0
end as credito,

0 as valor_base/*,
sal.saldo_actual,
cue.naturaleza,
sal.subcuenta*/

FROM cn_saldo sal

JOIN CN_CUENTA_MAYOR cue
ON sal.ID_CIA           = cue.ID_CIA
AND sal.ID_CUENTA_MAYOR = cue.ID_CUENTA_MAYOR
AND sal.ID_GRUPO_CUENTA = cue.ID_GRUPO_CUENTA
AND sal.ID_CLASE_CUENTA = cue.ID_CLASE_CUENTA

where
sal.id_cia = $id_cia
and sal.id_periodo_contable = ( $id_periodo_contable - 1 )
and sal.id_vigencia = $vig_cierre
and sal.id_cen_op = $id_cen_op
$where_clases_cuenta
and sal.SALDO_ACTUAL <> 0

order by subcuenta

)

group by
id_documento,
id_cad,
id_vigencia,
id_cen_op, 
id_cia 
EOD;
                        //ejecuta el sql
                        $resultado = CN_TABLE::executeSQL($sql);

                        if (count($resultado) > 0) {
                            $debito = $resultado[0]['debito'];
                            $credito = $resultado[0]['credito'];
                        } else {
                            $debito = 0;
                            $credito = 0;
                        }





                        //obtener secuencia de tabla_vig_seq 
                        //sentencia sql
                        $sql = <<<EOD
select * from cn_table_vig_seq
where
id_cia = $id_cia
and id_vigencia = $vig_cierre
and nom_entidad = 'CN_MOVIMIENTO_CONTABLE'
EOD;
                        //ejecuta el sql
                        $resultado = CN_TABLE::executeSQL($sql);

                        $id_mov_cont = $resultado[0]['seq'];


                        /*
                         * Crear registro cuenta cierre fiscal
                         */
                        //obtener cuenta pyg
                        //sentencia sql
                        $sql = <<<EOD
SELECT 

tab.*,
cue.naturaleza

FROM cn_cuenta_tipo_parametro tab

JOIN CN_CUENTA_MAYOR cue
ON tab.ID_CIA           = cue.ID_CIA
AND tab.ID_CUENTA_MAYOR = cue.ID_CUENTA_MAYOR
AND tab.ID_GRUPO_CUENTA = cue.ID_GRUPO_CUENTA
AND tab.ID_CLASE_CUENTA = cue.ID_CLASE_CUENTA

where 
tab.id_cia = $id_cia
and tab.id_tipo_parametro = $id_pyg  
EOD;
                        //ejecuta el sql
                        $resultado = CN_TABLE::executeSQL($sql);

                        $id_catalogo = $resultado[0]['id_catalogo'];
                        $id_cuenta_mayor = $resultado[0]['id_cuenta_mayor'];
                        $id_grupo_cuenta = $resultado[0]['id_grupo_cuenta'];
                        $id_clase_cuenta = $resultado[0]['id_clase_cuenta'];
                        $naturaleza = $resultado[0]['naturaleza'];

                        /*
                         * Al terminar los movimientos de cancelación de cuentas se consolida esta suma en un Saldo dependiendo de la naturaleza de la cuenta de cierre.
                         * 
                         * Si la naturaleza es Débito
                         *       El Saldo es igual a El total Débito menos el total Crédito
                         * Si la naturaleza es Crédito
                         *       El Saldo es igual a El total Crédito menos el total Débito
                         * 
                         */
                        if ($naturaleza == 'D') {
//                            $saldo = $debito - $credito;
                            $saldo = $credito - $debito;
                        } else {
//                            $saldo = $credito - $debito;
                            $saldo = $debito - $credito;
                        }


                        /*
                         *  Guardar registros de cuenta pyg - Insert into EXPORT_TABLE (ID_MOV_CONT,ID_DOCUMENTO,ID_CAD,ID_VIGENCIA,ID_CEN_OP,ID_CIA,ID_CATALOGO,ID_CUENTA_MAYOR,ID_GRUPO_CUENTA,ID_CLASE_CUENTA,ID_MAE_TER,ID_AUXILIAR,ID_SUB_AUX,ID_CENTRO_COSTO,ID_SUB_CENTRO_COSTO,DEBITO,CREDITO,VALOR_BASE) values (0,0,0,2011,16,0,0,0,0,0,null,null,null,null,null,199168505784.82,67687478415.95,0);
                         */
                        // Sentencia SQL
                        $sql = <<<EOD
Insert into CN_MOVIMIENTO_CONTABLE (ID_MOV_CONT,ID_DOCUMENTO,ID_CAD,ID_VIGENCIA,ID_CEN_OP,ID_CIA,ID_CATALOGO,ID_CUENTA_MAYOR,ID_GRUPO_CUENTA,ID_CLASE_CUENTA,ID_MAE_TER,ID_AUXILIAR,ID_SUB_AUX,ID_CENTRO_COSTO,ID_SUB_CENTRO_COSTO,DEBITO,CREDITO,VALOR_BASE) 
    values (($id_mov_cont+1),($id_documento+1),($id_cad+1),$vig_cierre,$id_cen_op,$id_cia,$id_catalogo,$id_cuenta_mayor,$id_grupo_cuenta,$id_clase_cuenta,null,null,null,null,null,$credito,0,0)
EOD;

                        // Ejecuta SQL
                        CN_TABLE::executeSQL($sql);

                        // Sentencia SQL
                        $sql = <<<EOD
Insert into CN_MOVIMIENTO_CONTABLE (ID_MOV_CONT,ID_DOCUMENTO,ID_CAD,ID_VIGENCIA,ID_CEN_OP,ID_CIA,ID_CATALOGO,ID_CUENTA_MAYOR,ID_GRUPO_CUENTA,ID_CLASE_CUENTA,ID_MAE_TER,ID_AUXILIAR,ID_SUB_AUX,ID_CENTRO_COSTO,ID_SUB_CENTRO_COSTO,DEBITO,CREDITO,VALOR_BASE) 
    values (($id_mov_cont+2),($id_documento+1),($id_cad+1),$vig_cierre,$id_cen_op,$id_cia,$id_catalogo,$id_cuenta_mayor,$id_grupo_cuenta,$id_clase_cuenta,null,null,null,null,null,0,$debito,0)
EOD;

                        // Ejecuta SQL
                        CN_TABLE::executeSQL($sql);



                        /**
                         * Se generan 2 movimientos, sobre la cuenta de cierre fiscal y las cuentas de utilidad o ganancia del ejercicio 
                         * (Según la parametrización de cierre) donde se inyecta el valor del Saldo que se ha calculado, según la naturaleza de la cuenta:
                         */
                        /*
                         * Si la Naturaleza es Débito
                         */
                        if ($naturaleza == 'D') {

                            //Si el Saldo es Mayor a 0
                            if ($saldo > 0) {

                                /*
                                 * La Cuenta Crédito es la Cuenta de cierre
                                 */
                                // Sentencia SQL
                                $sql = <<<EOD
Insert into CN_MOVIMIENTO_CONTABLE (ID_MOV_CONT,ID_DOCUMENTO,ID_CAD,ID_VIGENCIA,ID_CEN_OP,ID_CIA,ID_CATALOGO,ID_CUENTA_MAYOR,ID_GRUPO_CUENTA,ID_CLASE_CUENTA,ID_MAE_TER,ID_AUXILIAR,ID_SUB_AUX,ID_CENTRO_COSTO,ID_SUB_CENTRO_COSTO,DEBITO,CREDITO,VALOR_BASE) 
    values (($id_mov_cont+3),($id_documento+1),($id_cad+1),$vig_cierre,$id_cen_op,$id_cia,$id_catalogo,$id_cuenta_mayor,$id_grupo_cuenta,$id_clase_cuenta,null,null,null,null,null,0,$saldo,0)
EOD;

                                // Ejecuta SQL
                                CN_TABLE::executeSQL($sql);

                                /*
                                 * La Cuenta Débito es la Cuenta de pérdidas
                                 */
                                //obtener cuenta perdida ejercicio
                                //sentencia sql
                                $sql = <<<EOD
SELECT 

tab.*,
cue.naturaleza

FROM cn_cuenta_tipo_parametro tab

JOIN CN_CUENTA_MAYOR cue
ON tab.ID_CIA           = cue.ID_CIA
AND tab.ID_CUENTA_MAYOR = cue.ID_CUENTA_MAYOR
AND tab.ID_GRUPO_CUENTA = cue.ID_GRUPO_CUENTA
AND tab.ID_CLASE_CUENTA = cue.ID_CLASE_CUENTA

where 
tab.id_cia = $id_cia
and tab.id_tipo_parametro = $id_perd_ejer
EOD;
                                //ejecuta el sql
                                $resultado = CN_TABLE::executeSQL($sql);

                                $id_catalogo = $resultado[0]['id_catalogo'];
                                $id_cuenta_mayor = $resultado[0]['id_cuenta_mayor'];
                                $id_grupo_cuenta = $resultado[0]['id_grupo_cuenta'];
                                $id_clase_cuenta = $resultado[0]['id_clase_cuenta'];
                                $naturaleza = $resultado[0]['naturaleza'];


                                /*
                                 * Se generan 2 movimientos de las Cuentas de utilidad o ganancia del ejercicio (Según la parametrización de cierre) donde se inyecta el valor del Saldo que se ha calculado, según la naturaleza de la cuenta:
                                 */
                                // Sentencia SQL
                                $sql = <<<EOD
Insert into CN_MOVIMIENTO_CONTABLE (ID_MOV_CONT,ID_DOCUMENTO,ID_CAD,ID_VIGENCIA,ID_CEN_OP,ID_CIA,ID_CATALOGO,ID_CUENTA_MAYOR,ID_GRUPO_CUENTA,ID_CLASE_CUENTA,ID_MAE_TER,ID_AUXILIAR,ID_SUB_AUX,ID_CENTRO_COSTO,ID_SUB_CENTRO_COSTO,DEBITO,CREDITO,VALOR_BASE) 
    values (($id_mov_cont+4),($id_documento+1),($id_cad+1),$vig_cierre,$id_cen_op,$id_cia,$id_catalogo,$id_cuenta_mayor,$id_grupo_cuenta,$id_clase_cuenta,null,null,null,null,null,$saldo,0,0)
EOD;

                                // Ejecuta SQL
                                CN_TABLE::executeSQL($sql);
                            } else {//Si el Saldo es Menor a 0
                                $saldo = $saldo * (-1);

                                /*
                                 * La Cuenta Débito es la Cuenta de cierre
                                 */
                                // Sentencia SQL
                                $sql = <<<EOD
Insert into CN_MOVIMIENTO_CONTABLE (ID_MOV_CONT,ID_DOCUMENTO,ID_CAD,ID_VIGENCIA,ID_CEN_OP,ID_CIA,ID_CATALOGO,ID_CUENTA_MAYOR,ID_GRUPO_CUENTA,ID_CLASE_CUENTA,ID_MAE_TER,ID_AUXILIAR,ID_SUB_AUX,ID_CENTRO_COSTO,ID_SUB_CENTRO_COSTO,DEBITO,CREDITO,VALOR_BASE) 
    values (($id_mov_cont+3),($id_documento+1),($id_cad+1),$vig_cierre,$id_cen_op,$id_cia,$id_catalogo,$id_cuenta_mayor,$id_grupo_cuenta,$id_clase_cuenta,null,null,null,null,null,$saldo,0,0)
EOD;

                                // Ejecuta SQL
                                CN_TABLE::executeSQL($sql);

                                /*
                                 * La Cuenta Crédito es la Cuenta de utilidades
                                 */
                                //obtener cuenta utilidad ejercicio
                                //sentencia sql
                                $sql = <<<EOD
SELECT 

tab.*,
cue.naturaleza

FROM cn_cuenta_tipo_parametro tab

JOIN CN_CUENTA_MAYOR cue
ON tab.ID_CIA           = cue.ID_CIA
AND tab.ID_CUENTA_MAYOR = cue.ID_CUENTA_MAYOR
AND tab.ID_GRUPO_CUENTA = cue.ID_GRUPO_CUENTA
AND tab.ID_CLASE_CUENTA = cue.ID_CLASE_CUENTA

where 
tab.id_cia = $id_cia
and tab.id_tipo_parametro = $id_util_ejer
EOD;
                                //ejecuta el sql
                                $resultado = CN_TABLE::executeSQL($sql);

                                $id_catalogo = $resultado[0]['id_catalogo'];
                                $id_cuenta_mayor = $resultado[0]['id_cuenta_mayor'];
                                $id_grupo_cuenta = $resultado[0]['id_grupo_cuenta'];
                                $id_clase_cuenta = $resultado[0]['id_clase_cuenta'];
                                $naturaleza = $resultado[0]['naturaleza'];


                                /*
                                 * Se generan 2 movimientos de las uentas de utilidad o ganancia del ejercicio (Según la parametrización de cierre) donde se inyecta el valor del Saldo que se ha calculado, según la naturaleza de la cuenta:
                                 */
                                // Sentencia SQL
                                $sql = <<<EOD
Insert into CN_MOVIMIENTO_CONTABLE (ID_MOV_CONT,ID_DOCUMENTO,ID_CAD,ID_VIGENCIA,ID_CEN_OP,ID_CIA,ID_CATALOGO,ID_CUENTA_MAYOR,ID_GRUPO_CUENTA,ID_CLASE_CUENTA,ID_MAE_TER,ID_AUXILIAR,ID_SUB_AUX,ID_CENTRO_COSTO,ID_SUB_CENTRO_COSTO,DEBITO,CREDITO,VALOR_BASE) 
    values (($id_mov_cont+4),($id_documento+1),($id_cad+1),$vig_cierre,$id_cen_op,$id_cia,$id_catalogo,$id_cuenta_mayor,$id_grupo_cuenta,$id_clase_cuenta,null,null,null,null,null,0,$saldo,0)
EOD;

                                // Ejecuta SQL
                                CN_TABLE::executeSQL($sql);
                            }
                        } else {//Si la Naturaleza es Crédito
                            //Si el Saldo es Mayor a 0
                            if ($saldo > 0) {


                                /*
                                 * La Cuenta Débito es la Cuenta de cierre
                                 */
                                // Sentencia SQL
                                $sql = <<<EOD
Insert into CN_MOVIMIENTO_CONTABLE (ID_MOV_CONT,ID_DOCUMENTO,ID_CAD,ID_VIGENCIA,ID_CEN_OP,ID_CIA,ID_CATALOGO,ID_CUENTA_MAYOR,ID_GRUPO_CUENTA,ID_CLASE_CUENTA,ID_MAE_TER,ID_AUXILIAR,ID_SUB_AUX,ID_CENTRO_COSTO,ID_SUB_CENTRO_COSTO,DEBITO,CREDITO,VALOR_BASE) 
    values (($id_mov_cont+3),($id_documento+1),($id_cad+1),$vig_cierre,$id_cen_op,$id_cia,$id_catalogo,$id_cuenta_mayor,$id_grupo_cuenta,$id_clase_cuenta,null,null,null,null,null,$saldo,0,0)
EOD;

                                // Ejecuta SQL
                                CN_TABLE::executeSQL($sql);


                                /*
                                 * La Cuenta Crédito es la Cuenta de utilidades
                                 */
                                //obtener cuenta utilidad ejercicio
                                //sentencia sql
                                $sql = <<<EOD
SELECT 

tab.*,
cue.naturaleza

FROM cn_cuenta_tipo_parametro tab

JOIN CN_CUENTA_MAYOR cue
ON tab.ID_CIA           = cue.ID_CIA
AND tab.ID_CUENTA_MAYOR = cue.ID_CUENTA_MAYOR
AND tab.ID_GRUPO_CUENTA = cue.ID_GRUPO_CUENTA
AND tab.ID_CLASE_CUENTA = cue.ID_CLASE_CUENTA

where 
tab.id_cia = $id_cia
and tab.id_tipo_parametro = $id_util_ejer
EOD;
                                //ejecuta el sql
                                $resultado = CN_TABLE::executeSQL($sql);

                                $id_catalogo = $resultado[0]['id_catalogo'];
                                $id_cuenta_mayor = $resultado[0]['id_cuenta_mayor'];
                                $id_grupo_cuenta = $resultado[0]['id_grupo_cuenta'];
                                $id_clase_cuenta = $resultado[0]['id_clase_cuenta'];
                                $naturaleza = $resultado[0]['naturaleza'];


                                /*
                                 * Se generan 2 movimientos de las uentas de utilidad o ganancia del ejercicio (Según la parametrización de cierre) donde se inyecta el valor del Saldo que se ha calculado, según la naturaleza de la cuenta:
                                 */
                                // Sentencia SQL
                                $sql = <<<EOD
Insert into CN_MOVIMIENTO_CONTABLE (ID_MOV_CONT,ID_DOCUMENTO,ID_CAD,ID_VIGENCIA,ID_CEN_OP,ID_CIA,ID_CATALOGO,ID_CUENTA_MAYOR,ID_GRUPO_CUENTA,ID_CLASE_CUENTA,ID_MAE_TER,ID_AUXILIAR,ID_SUB_AUX,ID_CENTRO_COSTO,ID_SUB_CENTRO_COSTO,DEBITO,CREDITO,VALOR_BASE) 
    values (($id_mov_cont+4),($id_documento+1),($id_cad+1),$vig_cierre,$id_cen_op,$id_cia,$id_catalogo,$id_cuenta_mayor,$id_grupo_cuenta,$id_clase_cuenta,null,null,null,null,null,0,$saldo,0)
EOD;

                                // Ejecuta SQL
                                CN_TABLE::executeSQL($sql);
                            } else {//Si el Saldo es Menor a 0
                                $saldo = $saldo * (-1);

                                /*
                                 * La Cuenta Crédito es la Cuenta de cierre
                                 */
                                // Sentencia SQL
                                $sql = <<<EOD
Insert into CN_MOVIMIENTO_CONTABLE (ID_MOV_CONT,ID_DOCUMENTO,ID_CAD,ID_VIGENCIA,ID_CEN_OP,ID_CIA,ID_CATALOGO,ID_CUENTA_MAYOR,ID_GRUPO_CUENTA,ID_CLASE_CUENTA,ID_MAE_TER,ID_AUXILIAR,ID_SUB_AUX,ID_CENTRO_COSTO,ID_SUB_CENTRO_COSTO,DEBITO,CREDITO,VALOR_BASE) 
    values (($id_mov_cont+3),($id_documento+1),($id_cad+1),$vig_cierre,$id_cen_op,$id_cia,$id_catalogo,$id_cuenta_mayor,$id_grupo_cuenta,$id_clase_cuenta,null,null,null,null,null,0,$saldo,0)
EOD;

                                // Ejecuta SQL
                                CN_TABLE::executeSQL($sql);


                                /*
                                 * La Cuenta Débito es la Cuenta de pérdidas
                                 */
                                //obtener cuenta perdida ejercicio
                                //sentencia sql
                                $sql = <<<EOD
SELECT 

tab.*,
cue.naturaleza

FROM cn_cuenta_tipo_parametro tab

JOIN CN_CUENTA_MAYOR cue
ON tab.ID_CIA           = cue.ID_CIA
AND tab.ID_CUENTA_MAYOR = cue.ID_CUENTA_MAYOR
AND tab.ID_GRUPO_CUENTA = cue.ID_GRUPO_CUENTA
AND tab.ID_CLASE_CUENTA = cue.ID_CLASE_CUENTA

where 
tab.id_cia = $id_cia
and tab.id_tipo_parametro = $id_perd_ejer
EOD;
                                //ejecuta el sql
                                $resultado = CN_TABLE::executeSQL($sql);

                                $id_catalogo = $resultado[0]['id_catalogo'];
                                $id_cuenta_mayor = $resultado[0]['id_cuenta_mayor'];
                                $id_grupo_cuenta = $resultado[0]['id_grupo_cuenta'];
                                $id_clase_cuenta = $resultado[0]['id_clase_cuenta'];
                                $naturaleza = $resultado[0]['naturaleza'];


                                /*
                                 * Se generan 2 movimientos de las uentas de utilidad o ganancia del ejercicio (Según la parametrización de cierre) donde se inyecta el valor del Saldo que se ha calculado, según la naturaleza de la cuenta:
                                 */
                                // Sentencia SQL
                                $sql = <<<EOD
Insert into CN_MOVIMIENTO_CONTABLE (ID_MOV_CONT,ID_DOCUMENTO,ID_CAD,ID_VIGENCIA,ID_CEN_OP,ID_CIA,ID_CATALOGO,ID_CUENTA_MAYOR,ID_GRUPO_CUENTA,ID_CLASE_CUENTA,ID_MAE_TER,ID_AUXILIAR,ID_SUB_AUX,ID_CENTRO_COSTO,ID_SUB_CENTRO_COSTO,DEBITO,CREDITO,VALOR_BASE) 
    values (($id_mov_cont+4),($id_documento+1),($id_cad+1),$vig_cierre,$id_cen_op,$id_cia,$id_catalogo,$id_cuenta_mayor,$id_grupo_cuenta,$id_clase_cuenta,null,null,null,null,null,$saldo,0,0)
EOD;

                                // Ejecuta SQL
                                CN_TABLE::executeSQL($sql);
                            }
                        }



                        /*
                         * Actualiza secuencia de movimientos
                         */
                        //sentencia sql
                        $sql = <<<EOD
UPDATE CN_TABLE_VIG_SEQ
SET SEQ = NVL( (SELECT max(ID_MOV_CONT) FROM CN_MOVIMIENTO_CONTABLE where ID_VIGENCIA = $vig_cierre AND ID_CIA = $id_cia ), 0 )
WHERE NOM_ENTIDAD='CN_MOVIMIENTO_CONTABLE' AND ID_CIA = $id_cia and ID_VIGENCIA = $vig_cierre
EOD;
                        //ejecuta el sql
                        CN_TABLE::executeSQL($sql);

                        $this->logMessage("[CIERRE FISCAL] Se crearon los registros de centro operacion: " . $id_cen_op);
                    }


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

                    /*
                     * Resultado
                     */
                    $mensaje = "[CIERRE FISCAL] Se crearon los registros de cierre fiscal.";
                    $this->list_data = array();
                    $this->mensajeError = $mensaje;
                    $this->logMessage($mensaje);
                } else {

                    $mensaje = "[CIERRE FISCAL] No hay centros de operaciones.";
                    $this->status = 1;
                    $this->mensajeError = $mensaje;
                    $this->logMessage($mensaje);
                }
            } else {

                $mensaje = "[CIERRE FISCAL] No hay registro asociados de cuentas de resultados al tipo de cuenta.";
                $this->status = 1;
                $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());
        }
    }

    /**
     * Metodo que Elimina el comprobante de cierre (Comprobante de Tipo de Cierre) que exista para la vigencia seleccionada, para la fecha de Dic 31
     * @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");


        try {

            /*
             * Variables de operacion
             */
            $id_cia = $request['id_cia'];
            $vig_cierre = $request['vig_cierre'];
            $fecha_cierre = $request['fecha_cierre'];
            $id_periodo_contable = $request['id_periodo_contable'];
            $id_tipo_cuenta = $request['id_tipo_cuenta'];
            $id_tipo_comprobante = $request['id_tipo_comprobante'];


            /*
             * Borrar los registro para el tipo de comprobante en la fecha de cierre y vigencia, periodo - CAD - Documentos - Movimientos
             */
            $this->deleteComprobanteCierreFiscal($id_cia, $vig_cierre, $id_periodo_contable, $id_tipo_comprobante, $fecha_cierre);
        } catch (Exception $e) {

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


        $mensaje = "[CIERRE FISCAL] Se eliminaron los registros de cierre fiscal.";
        $this->list_data = array();
        $this->mensajeError = $mensaje;
        $this->logMessage($mensaje);
        $this->list_data = array();
    }

    /**
     * Metodo que elimina los movimientos, documentos y cads para el comprobante
     * @param type $id_cia
     * @param type $vig_cierre
     * @param type $id_periodo_contable
     * @param type $id_tipo_comprobante
     * @param type $fecha_cierre 
     */
    public function deleteComprobanteCierreFiscal($id_cia, $vig_cierre, $id_periodo_contable, $id_tipo_comprobante, $fecha_cierre) {

        //obtener CADs            
        // Sentencia SQL 
        $sql = <<<EOD
select * from cn_control_cad
where 
id_cia = $id_cia
and id_vigencia = $vig_cierre
/*and id_cen_op = 16*/
and id_periodo_contable = $id_periodo_contable
and id_tipo_comprobante = $id_tipo_comprobante
and fecha_cad = to_date('31/12/$vig_cierre', 'dd/mm/yyyy')
EOD;
        //ejecuta el sql
        $resultado = CN_TABLE::executeSQL($sql);

        if (count($resultado) > 0) {

            //recorre los cads
            foreach ($resultado as $cad) {

                $id_cad = $cad['id_cad'];

                //obtener Documentos            
                // Sentencia SQL 
                $sql = <<<EOD
select * from cn_documento
where 
id_cia = $id_cia
and id_vigencia = $vig_cierre
/*and id_cen_op = 16*/
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'];

                        /*
                         * 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 = $vig_cierre
/*and id_cen_op = 16*/
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 = $vig_cierre
/*and id_cen_op = 16*/
and id_cad = $id_cad
EOD;
                    //ejecuta el sql
                    CN_TABLE::executeSQL($sql);
                } else {

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


            /*
             * Elimina registros de cad comprobante y periodo
             */
            // Sentencia SQL 
            $sql = <<<EOD
delete from cn_control_cad
where
id_cia = $id_cia
and id_vigencia = $vig_cierre
/*and id_cen_op = 16*/
and id_periodo_contable = $id_periodo_contable
and id_tipo_comprobante = $id_tipo_comprobante
and fecha_cad = to_date('31/12/$vig_cierre', 'dd/mm/yyyy')
EOD;
            //ejecuta el sql
            CN_TABLE::executeSQL($sql);
        } else {

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


        //actualizar secuencia de tabla_vig_seq por vigencia y tabla Cad-Docu-Movi
        //Actualiza secuencia de cad
        //sentencia sql
        $sql = <<<EOD
UPDATE CN_TABLE_VIG_SEQ
SET SEQ = NVL( (SELECT max(ID_CAD) FROM CN_CONTROL_CAD where ID_VIGENCIA = $vig_cierre AND ID_CIA = $id_cia ), 0 )
WHERE NOM_ENTIDAD='CN_CONTROL_CAD' AND ID_CIA = $id_cia and ID_VIGENCIA = $vig_cierre
EOD;
        //ejecuta el sql
        CN_TABLE::executeSQL($sql);

        //Actualiza secuencia de documentos
        //sentencia sql
        $sql = <<<EOD
UPDATE CN_TABLE_VIG_SEQ
SET SEQ = NVL( (SELECT max(ID_DOCUMENTO) FROM CN_DOCUMENTO where ID_VIGENCIA = $vig_cierre AND ID_CIA = $id_cia ), 0 )
WHERE NOM_ENTIDAD='CN_DOCUMENTO' AND ID_CIA = $id_cia and ID_VIGENCIA = $vig_cierre
EOD;
        //ejecuta el sql
        CN_TABLE::executeSQL($sql);

        //Actualiza secuencia de movimientos
        //sentencia sql
        $sql = <<<EOD
UPDATE CN_TABLE_VIG_SEQ
SET SEQ = NVL( (SELECT max(ID_MOV_CONT) FROM CN_MOVIMIENTO_CONTABLE where ID_VIGENCIA = $vig_cierre AND ID_CIA = $id_cia ), 0 )
WHERE NOM_ENTIDAD='CN_MOVIMIENTO_CONTABLE' AND ID_CIA = $id_cia and ID_VIGENCIA = $vig_cierre
EOD;
        //ejecuta el sql
        CN_TABLE::executeSQL($sql);
    }

}

