<?php

/**
 * ccg_producto_proyec actions.
 *
 * @package    costeoConocCient
 * @subpackage ccg_producto_proyec
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class ccg_producto_proyecActions extends sfQuery {
    /*
     * ------------VARIABLES PARA SERVICIOS DE CONSULTA - LIST
     */

    protected $table_names = array(
        'CCG_PRODUCTO_PROYECTO_V'
    ); //tablas para construir el sql, por medio de joins
    protected $table_join_ids = array(); //si posee tablas para joins, identificar la relacion de los campos con las tablas
    protected $fields = array(
        'CCG_PRODUCTO_PROYECTO_V' =>
        array(
            'id_producto_proyecto' => 'id_producto_proyecto',
            'id_anhos' => 'id_anhos',
            'id_meses' => 'id_meses',
            'fecha_proceso' => 'fecha_proceso',
            'id_proyectos' => 'id_proyectos',
            'sgr' => 'sgr',
            'id_catalogo' => 'id_catalogo',
            'id_clase' => 'id_clase',
            'id_linea' => 'id_linea',
            'cantidad' => 'cantidad',
            'porcentaje' => 'porcentaje',
            'valor' => 'valor',
            'id_ts_td' => 'id_ts_td',
            'doc_soporte' => 'doc_soporte',
            'fecha_soporte' => 'fecha_soporte',
            'observaciones' => 'observaciones',
            'usuario' => 'usuario',
            'mes' => 'mes',
            'id' => 'id',
            'ano_fiscal' => 'ano_fiscal',
            'proyecto' => 'proyecto',
            'id_area_lider' => 'id_area_lider',
            'valor_proyecto' => 'valor_proyecto',
            'codigo' => 'codigo',
            'codigo_cat' => 'codigo_cat',
            'nombre_codigo_cat' => 'nombre_codigo_cat',
            'documento_td' => 'documento_td',
            'descripcion_td' => 'descripcion_td',
            'desccorta_td' => 'desccorta_td',
            'num_doc_usu' => 'num_doc_usu',
            'nombre_usu' => 'nombre_usu',
            'apellido_usu' => 'apellido_usu'
        )
    ); //por cada tabla especificar los campos del select

    /*
     * OPCIONES DE FILTRO:
     *
     * LIKEALLPLUS- busqueda comparativa de la cadena dividida por los espacios en blanco en cualquier posición
     * LIKEALL - busqueda comparativa de la cadena en cualquier posición
     * LIKE - busqueda en la cadena que inicie por la variable de filtro
     *
     * rownum,start - rownum,end / estos campos para uso del Grid live GWT, numero fijo de filas de consulta
     */
    protected $table_field_conditions = array(
        'CCG_PRODUCTO_PROYECTO_V' => array(
            'id_producto_proyecto,a' => array('!=' => array(-1)),
            'id_producto_proyecto,b' => array('=' => array('id_producto_proyecto')),
            'id_anhos' => array('=' => array('id_anhos')),
            'id_meses' => array('=' => array('id_meses')),
            'id_proyectos' => array('=' => array('id_proyectos')),
            'sgr' => array('=' => array('sgr')),
            'id_catalogo' => array('=' => array('id_catalogo')),
            'id_clase' => array('=' => array('id_clase')),
            'id_linea' => array('=' => array('id_linea')),
            'id_ts_td' => array('=' => array('id_ts_td')),
            'rownum,start' => array('>' => array('_startRow')),
            'rownum,end' => array('<=' => array('_endRow'))
        )
    ); //por cada tabla se dan los campos, opcion de filtro y variable que entra para los posibles filtros
    protected $table_field_or_conditions = array(); // filtros de condicion or
    protected $fields_orderBy = array(
        'id_anhos', 'id_meses', 'codigo', 'sgr', 'codigo_cat'
    ); //campos para el ordenamiento de la consulta
//    protected $table_field_obligatory = array('id_debito'); //campos obligatorios de filtro - estan en el request

    /*
     * Variables manejo de log
     */
    //true - consulta de administracion
    protected $is_admin = true;
    //si es servicio para filtro agregar campo
//    protected $filtro = 'Area';
    //true - la tabla principal de busqueda no es una vista
    protected $is_filtro = true;


    /*
     * ------------VARIABLES PARA SERVICIOS CRUD
     */
    protected $id_name = 'id_producto_proyecto'; //identificador de la tabla
    protected $id_names = array('id_producto_proyecto'); //llave primaria
    protected $field_names = array('id_anhos', 'id_meses', 'fecha_proceso', 'id_proyectos',
        'sgr', 'id_catalogo', 'id_clase', 'id_linea', 'cantidad', 'porcentaje', 'valor',
        'id_ts_td', 'doc_soporte', 'fecha_soporte', 'observaciones', 'usuario'); //campos de la tabla, sin la llave primaria
    protected $table_name = 'CCG_PRODUCTO_PROYECTO'; //tabla en la cual se aplican los cambios 
    /*
     * Manejo de registro log
     */
    protected $id_unico = 'id_producto_proyecto'; //identificador unico de la tabla

    /**
     * Construccion de observacion perzonalizada
     * 
     * Toda variable para tomarla del request con el formato:
     * &request-variable&
     * 
     * false - observacion por defecto
     *
     * @var string 
     */
    protected $observacion_list = false;
    protected $observacion_add = false;
    protected $observacion_update = false;
    protected $observacion_remove = false;

    // Validate
    /**
     * Ejecuta una validación previa a la ejecución de una operación tipo Add
     *
     * @param sfWebRequest $request
     * @return array 
     */
    protected function validateAdd(sfWebRequest $request) {

        //valor por defecto
        $errors = null;

        /*
         *  Validar la operación, ya sea por SQL
         */

        /*
         *  Generar errores en $errors
         */

        return $errors;
    }

    /**
     * Ejecuta una validación previa a la ejecución de una operación tipo Update
     *
     * @param sfWebRequest $request
     * @return array 
     */
    protected function validateUpdate(sfWebRequest $request) {

        //valor por defecto
        $errors = null;

        /*
         *  Validar la operación, ya sea por SQL
         */

        /*
         *  Generar errores en $errors
         */

        return $errors;
    }

    /**
     * Ejecuta una validación previa a la ejecución de una operación tipo Remove
     *
     * @param sfWebRequest $request
     * @return array 
     */
    protected function validateRemove(sfWebRequest $request) {

        //valor por defecto
        $errors = null;

        /*
         *  Validar la operación, ya sea por SQL
         */

        /*
         *  Generar errores en $errors
         */

        return $errors;
    }

    /**
     * Acciones anteriores a la original
     * 
     * return sfWebRequest Changed Request with additional parameters.
     * 
     * @param type $Action ( ADD, UPDATE, REMOVE )
     * @param sfWebRequest $request
     * @return \sfWebRequest 
     */
    protected function preprocessRequest($Action, sfWebRequest $request) {

        /*
         * Se instancia la clase del manejo del log
         */
        $logger = sfContext::getInstance()->getLogger();
        $logger->info("Entro a preprocessRequest");

        /*
         * Procesar Request
         */
        //accion add
        if ($Action == "ADD") {
            $request['usuario'] = $request['username'];
            //$request['fecha_sys'] = CN_TABLE::fechaSistema();            
        }

        //accion update
        if ($Action == "UPDATE") {
            
        }

        //accion remove
        if ($Action == "REMOVE") {
            
        }

        return $request;
    }

    /**
     * Acciones posteriores a la original
     * 
     * return sfWebRequest Changed Request with additional parameters.
     * 
     * @param type $Action ( ADD, UPDATE, REMOVE )
     * @param sfWebRequest $request
     * @return \sfWebRequest 
     */
    protected function postprocessRequest($Action, sfWebRequest $request, $list_data_post) {

        /*
         * Se instancia la clase del manejo del log
         */
        $logger = sfContext::getInstance()->getLogger();
        $logger->info("Entro a postprocessRequest - " . $list_data_post);

        /*
         * Procesar Request
         */
        //accion add
        if ($Action == "ADD") {

            /**
             * Abrir nueva conexion con la Base de Datos
             */
            $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
            $this->conn->beginTransaction();


            /**
             * Validar errores de procedimiento
             */
            try {

                /**
                 * Crear movimiento de entrada de inventarios
                 */
                /**
                 * Datos quemados mov:
                  > 281 - Concepto: INGRESO PRODUCTOS DE CONOCIMIENTO GEOCIENTIFICO
                  >
                  > ? - Datos de documentos soporte y observaciones:  las que se registran en la novedad
                  >
                  > 16 - Centro de operación : SERVICIO GEOLOGICO COLOMBIANO-BOGOTA
                  >
                  > ? - Fecha la del día de registro
                  >
                  > 145 - Estructra:  SEDE  CENTRAL BOGOTA
                  >
                  > 480 - Espacio: UBICACION GENERAL
                  >
                  > 81 - Tipo almacenamiento: PRODUCTOS DE CONOCIMIENTO GEOCIENTIFICO
                  >
                  > 2 - Grupo Almacenamiento: PLANTA Y EQUIPO
                  >
                  > 444 - Responsable:  899999294 	SERVICIO GEOLOGICO COLOMBIANO
                  >
                  > ? - Vida útil: 0
                 */
                /**
                 * Crea registros en inventario - 20150716
                 */
                if (true) {
                    $this->logMessage("Crea registros en inventario");
                    $id_movimientos_dv = 1;

                    $id_cen_op = 16;
                    $id_tipo_movimiento = 1;
                    $id_anhos = $request['id_anhos'];
                    $id_concepto_movimiento = 281;
                    $sec_factura = $request['doc_soporte'];
                    $id_ts_td = $request['id_ts_td'];
                    $fecha_soporte = $request['fecha_soporte'];
                    $id_mae_ter = 444;
                    $id_espacio = 480;
                    $id_tipo_almacenamiento = 81;
                    $observaciones = $request['observaciones'];

                    $valor_factura = $request['valor'];
                    $id_username = $request['id_username'];
                    $valor_iva = 0;

                    $id_producto_proyecto = $list_data_post[0]['id_producto_proyecto'];

                    $id_catalogo = $request['id_catalogo'];
                    $id_clase = $request['id_clase'];
                    $id_linea = $request['id_linea'];
                    $cantidad = $request['cantidad'];

                    /**
                     * Si aplica estante el cen_op - 20160830
                     */
                    $sql = <<<EOD
select * from centro_operacion 
where id_cen_op = $id_cen_op and aplica_estante = 1 
EOD;
                    //ejecuta el sql
                    $resultado_apli = CN_TABLE::executeSQL($sql);

                    $aplica_estante = false;
                    if (count($resultado_apli) > 0) {
                        $aplica_estante = true;
                    }


                    /*
                     * Obtener el consecutivo del movimiento
                     */
                    $sql = <<<EOD
select 
* 
from in_table_vig_seq
where
id_tipo_movimiento = $id_tipo_movimiento
and id_vigencia = $id_anhos
and id_cen_op = $id_cen_op
and nom_entidad = 'IN_MOVIMIENTOS_DV'   
EOD;
                    //ejecuta el sql
                    $resultado_seg = CN_TABLE::executeSQL($sql);

                    if (count($resultado_seg) > 0) {
                        $this->logMessage("Si hay secuencia.");
                        $id_movimientos_dv = $resultado_seg[0]['seq'] + 1;
                    } else {
                        //sentencia sql                
                        $sql = <<<EOD
Insert into IN_TABLE_VIG_SEQ (NOM_ENTIDAD,ID_CEN_OP,ID_VIGENCIA,SEQ,ID_TIPO_MOVIMIENTO) 
    values ('IN_MOVIMIENTOS_DV', $id_cen_op, $id_anhos, $id_movimientos_dv, $id_tipo_movimiento)   
EOD;
                        //ejecuta el sql
                        $this->conn->execute($sql);
                    }

                    //valida el iva
                    $tiene_iva = 0;
                    if ($valor_iva > 0) {
                        $tiene_iva = 1;
                    }


                    /**
                     * Crear Cabecera del movimiento - 20150716
                     */
                    //sentencia sql                
                    $sql = <<<EOD
Insert into IN_MOVIMIENTOS_DV (ID_MOVIMIENTOS_DV,ID_VIGENCIA,ID_CEN_OP,ID_TIPO_MOVIMIENTO,
    ID_CONCEPTO_MOVIMIENTO,NUM_DOC,ID_TS_TD,FECHA_DOC,ID_MAE_TER_INI,ID_MAE_TER_FIN,
        ID_ESPACIO_INI,ID_ESPACIO_FIN,ID_TIPO_ALMACENAMIENTO_INI,ID_TIPO_ALMACENAMIENTO_FIN,
            ANULADO,FECHA_ANU,MOTIVO_ANU,ID_USUARIO_ANU,ESTADO,OBSERVACIONES,ID_CEN_OP_FIN,
                FECHA_MOV,VALOR_FACTURA,VALOR_AJUSTE,ID_USUARIO,TIENE_IVA,FECHA_MOV_TIME) 
values ( $id_movimientos_dv, $id_anhos, $id_cen_op, $id_tipo_movimiento, $id_concepto_movimiento, '$sec_factura', $id_ts_td, to_date('$fecha_soporte','yyyy-mm-dd'),
    null, $id_mae_ter, null, $id_espacio, null, $id_tipo_almacenamiento,
        0, null, null, null, 1, '$observaciones', $id_cen_op,
            trunc(sysdate), $valor_factura, 0, $id_username, $tiene_iva, null)  
EOD;
                    //ejecuta el sql
                    $this->conn->execute($sql);

                    /*
                     * Actualizar la seq del movimiento
                     */
                    //sentencia sql                
                    $sql = <<<EOD
update in_table_vig_seq set seq = $id_movimientos_dv
where
id_tipo_movimiento = $id_tipo_movimiento
and id_vigencia = $id_anhos
and id_cen_op = $id_cen_op
and nom_entidad = 'IN_MOVIMIENTOS_DV'   
EOD;
                    //ejecuta el sql
                    $this->conn->execute($sql);



                    /**
                     * Crear Detalle del movimiento - 20150716
                     */
                    $id_det_mov_dv = 1;
                    /*
                     * Obtener el consecutivo del detalle del movimiento
                     */
                    $sql = <<<EOD
select 
* 
from in_table_vig_seq
where
id_tipo_movimiento = $id_tipo_movimiento
and id_vigencia = $id_anhos
and id_cen_op = $id_cen_op
and nom_entidad = 'IN_DET_MOV_DV'   
EOD;
                    //ejecuta el sql
                    $resultado_seg = CN_TABLE::executeSQL($sql);

                    if (count($resultado_seg) > 0) {
                        $this->logMessage("Si hay secuencia.");
                        $id_det_mov_dv = $resultado_seg[0]['seq'] + 1;
                    } else {
                        //sentencia sql                
                        $sql = <<<EOD
Insert into IN_TABLE_VIG_SEQ (NOM_ENTIDAD,ID_CEN_OP,ID_VIGENCIA,SEQ,ID_TIPO_MOVIMIENTO) 
    values ('IN_DET_MOV_DV', $id_cen_op, $id_anhos, $id_det_mov_dv, $id_tipo_movimiento)   
EOD;
                        //ejecuta el sql
                        $this->conn->execute($sql);
                    }

                    /**
                     * Crea el detalle
                     */
                    //sentencia sql                
                    $sql = <<<EOD
Insert into IN_DET_MOV_DV (ID_DET_MOV_DV,ID_MOVIMIENTOS_DV,ID_VIGENCIA,ID_INVENTARIO_DV,
    VALOR_UNITARIO,ANULADO,ESTADO,ID_CATALOGO,ID_CLASE,ID_LINEA,ID_CEN_OP,CANTIDAD,ID_TIPO_MOVIMIENTO) 
values ( $id_det_mov_dv, $id_movimientos_dv, $id_anhos, null,
    $valor_factura, 0, 1, $id_catalogo, $id_clase, $id_linea, $id_cen_op, $cantidad, $id_tipo_movimiento)  
EOD;
                    //ejecuta el sql
                    $this->conn->execute($sql);

                    /*
                     * Actualizar la seq del detalle del movimiento
                     * Se resta uno ya que siempre, despues de insertar un registro aumenta en 1
                     */
                    //sentencia sql                
                    $sql = <<<EOD
update in_table_vig_seq set seq = $id_det_mov_dv 
where
id_tipo_movimiento = $id_tipo_movimiento
and id_vigencia = $id_anhos
and id_cen_op = $id_cen_op
and nom_entidad = 'IN_DET_MOV_DV'   
EOD;
                    //ejecuta el sql
                    $this->conn->execute($sql);


                    /**
                     * Relacion de la factua y el inventario - 20160215
                     */
                    //sentencia sql                
                    $sql = <<<EOD
Insert into CCG_PRODUCTO_MOVIMIENTOS_DV (ID_PRODUCTO_PROYECTO,ID_MOVIMIENTOS_DV,ID_VIGENCIA,ID_CEN_OP,ID_TIPO_MOVIMIENTO) 
    values ($id_producto_proyecto,$id_movimientos_dv,$id_anhos,$id_cen_op,$id_tipo_movimiento) 
EOD;
                    //ejecuta el sql
                    $this->conn->execute($sql);


                    $this->conn->commit();


                    /**
                     * Cierre movimiento ...
                     */
                    $mensaje_inv = "[ccg_producto_proyec] Termino Movimiento DV INVENTARIO.";
                    $this->logMessage($mensaje_inv);


                    $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
                    $this->conn->beginTransaction();
                } else {
                    $this->logMessage("No aplica inventario.");
                }//Fin de mov inventario

                /*
                 * COMMIT DE TODAS LAS TRANSACCIONES
                 */
                $this->logMessage("[CREDITO_COMPLETO] COMMIT DE TODAS LAS TRANSACCIONES.");
                $this->conn->commit();
            } catch (Exception $e) {

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

                $this->logMessage("state 2");
                $this->logMessage("Code " . $e->getCode());
                $this->logMessage("Message " . $e->getMessage());
            }
        }

        //accion update
        if ($Action == "UPDATE") {
            
        }

        //accion remove
        if ($Action == "REMOVE") {
            
        }

        return $request;
    }

}
