<?php

/**
 * factura_pos_completa actions.
 *
 * @package    cartera
 * @subpackage factura_pos_completa
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class factura_pos_completaActions 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");



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

        //sentencia sql
        $sql = <<<EOD
ALTER SESSION SET NLS_DATE_FORMAT = "YYYY-MM-DD"
EOD;

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

        //variable para los errores
        $error = false;
        $errorVar = "";

        /*
         * variables
         */
        //obtiene el valor para su identificador unico
        $id_tabla = 'null';
        if (isset($request['id_tabla'])) {
            $id_tabla = $request['id_tabla'];
        }


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

            $resultado = array();

            /*
             * CA_FACTURA_POS
              ID_PUNTO_VENTA
              ID_CAJA
              SEC_FACTURA
              ID_MAE_TER
              FECHA_FACTURACION
              VALOR_BRUTO
              VALOR_IVA
              VALOR_TOTAL
              CAJERO
              OBSERVACIONES
             */
            $id_anhos = $request['id_anhos'];
            $id_punto_venta = 0;
            if (isset($request['id_punto_venta'])) {
                $id_punto_venta = $request['id_punto_venta'];
            } else {
                $error = true;
                $errorVar .= "-id_punto_venta";
            }
            $id_caja = 0;
            if (isset($request['id_caja'])) {
                $id_caja = $request['id_caja'];
            } else {
                $error = true;
                $errorVar .= "-id_caja";
            }
            $sec_factura = 'null';
            if (isset($request['sec_factura'])) {
                $sec_factura = $request['sec_factura'];
            } else {
                $error = true;
                $errorVar .= "-sec_factura";
            }
            $id_mae_ter = 0;
            if (isset($request['id_mae_ter'])) {
                $id_mae_ter = $request['id_mae_ter'];
            } else {
                $error = true;
                $errorVar .= "-id_mae_ter";
            }
            $valor_bruto = 0;
            if (isset($request['valor_bruto'])) {
                $valor_bruto = $request['valor_bruto'];
            } else {
                $error = true;
                $errorVar .= "-valor_bruto";
            }
            $valor_iva = 0;
            if (isset($request['valor_iva'])) {
                $valor_iva = $request['valor_iva'];
            } else {
                $error = true;
                $errorVar .= "-valor_iva";
            }
            $valor_total = 0;
            if (isset($request['valor_total'])) {
                $valor_total = $request['valor_total'];
            } else {
                $error = true;
                $errorVar .= "-valor_total";
            }
            $valor_reten = 0;
            if (isset($request['valor_reten'])) {
                $valor_reten = $request['valor_reten'];
            } else {
                $error = true;
                $errorVar .= "-valor_reten";
            }
            $cajero = 'null';
            if (isset($request['cajero'])) {
                $cajero = $request['cajero'];
            } else {
                $error = true;
                $errorVar .= "-cajero";
            }
            $id_estado_caja = 'null';
            if (isset($request['id_estado_caja'])) {
                $id_estado_caja = $request['id_estado_caja'];
            } else {
                $error = true;
                $errorVar .= "-id_estado_caja";
            }
            $observaciones = 'Factura POS No.' . $sec_factura;
            if (isset($request['observaciones'])) {
                $observaciones = $request['observaciones'];
            }

            $valor_pago_total_pd = 0;
            if (isset($request['valor_total'])) {
                $valor_pago_total_pd = $request['valor_pago_total_pd'];
            }
            $valor_descuento_det = 0;
            if (isset($request['valor_dcto_det'])) {
                $valor_descuento_det = $request['valor_dcto_det'];
            }
            $porc_descuento_fac = 0;
            if (isset($request['porc_dcto_fac'])) {
                $porc_descuento_fac = $request['porc_dcto_fac'];
            }
            $valor_descuento_fac = 0;
            if (isset($request['valor_dcto_fac'])) {
                $valor_descuento_fac = $request['valor_dcto_fac'];
            }
            


            /*
             * CA_FACTURA_PROD
             */
            if (isset($request['prod_1'])) {
                $prod_1 = $request['prod_1'];
            } else {
                $error = true;
                $errorVar .= "-prod_1";
            }

            /*
             * CA_FACTURA_PAGO
             */
            if (isset($request['pago_1'])) {
                $pago_1 = $request['pago_1'];
            } else {
                $error = true;
                $errorVar .= "-pago_1";
            }


            /**
             * Valida que el valor de pago sea mayor o igual al total de la factura - 20150227
             */
            if ($valor_pago_total_pd < $valor_total || $valor_total == 0) {
                $mensajeError = "El valor del pago es inferior a la factura o es 0.";
                $this->status = 1;
                $this->list_data = array();
                $this->mensajeError = $mensajeError;
                $this->logMessage("[factura_pos_completa] " . $mensajeError);

                $this->logMessage("El valor del pago(" . $valor_pago_total_pd . ") es inferior a la factura(" . $valor_total . ").");
            } else {
                $this->logMessage("Valida que el valor de pago(" . $valor_pago_total_pd . ") sea mayor o igual al total de la factura(" . $valor_total . ").");

                /**
                 * validar parametros de entrada
                 */
                if ($error) {
                    /*
                     * Mensaje de error
                     */
                    $mensajeError = "Los datos de entrada estan incorrectos." . " Variables :: " . $errorVar;

                    $this->status = 1;
                    $this->list_data = array();
                    $this->mensajeError = $mensajeError;
                    $this->logMessage("[factura_pos_completa] " . $mensajeError);
                } else {

                    /**
                     * Variables del movimiento inventario - 20150716
                     */
                    $error = false;
                    $aplica_inventario = false;
                    $id_tipo_movimiento = 0;
                    $id_cen_op = 0;
                    $id_concepto_movimiento = 0;
                    $id_mae_ter_inv = 0;
                    $id_tipo_almacenamiento = 0;
                    $id_espacio = 0;
                    $id_ts_td = 0;
                    $id_username = $request['id_username'];


                    /**
                     * Si aplica inventario - 20150715
                     */
                    $sql = <<<EOD
select 
ter.num_doc as num_doc_inv,
ter.razon_soc,
es.descripcion as espacio,
ta.descripcion as tipo_almacenamiento,
co.prefijo,
co.nom_cen_op,
pv.* 
from ca_punto_venta pv

left join centro_operacion co
on pv.id_cen_op = co.id_cen_op

left join in_tipo_almacenamiento ta
on ta.id_tipo_almacenamiento = pv.id_tipo_almacenamiento

left join in_espacio es
on pv.id_espacio = es.id_espacio

left join interceros_v ter
on ter.id_mae_ter = pv.id_mae_ter

where 
pv.id_punto_venta = $id_punto_venta   
EOD;
                    //ejecuta el sql
                    $resultado_pv = CN_TABLE::executeSQL($sql);

                    if (count($resultado_pv) > 0 && $resultado_pv[0]['aplica_inventario']) {

                        $this->logMessage("Si aplica inventario.");
                        $aplica_inventario = true;

                        $id_cen_op = $resultado_pv[0]['id_cen_op'];
                        $id_concepto_movimiento = $resultado_pv[0]['id_concepto_movimiento'];
                        $id_mae_ter_inv = $resultado_pv[0]['id_mae_ter'];
                        $id_tipo_almacenamiento = $resultado_pv[0]['id_tipo_almacenamiento'];
                        $id_espacio = $resultado_pv[0]['id_espacio'];
                        $id_ts_td = $resultado_pv[0]['id_ts_td'];
                        $id_tipo_movimiento = $request['id_tipo_movimiento'];
                        $num_doc_inv = $resultado_pv[0]['num_doc_inv'];
                        $razon_soc = $resultado_pv[0]['razon_soc'];
                        $espacio = $resultado_pv[0]['espacio'];
                        $tipo_almacenamiento = $resultado_pv[0]['tipo_almacenamiento'];
                        $prefijo = $resultado_pv[0]['prefijo'];
                        $nom_cen_op = $resultado_pv[0]['nom_cen_op'];

                        /**
                         * recorrer productos
                         */
                        $prod_cant = $request['prod_cant'];
                        for ($i = 1; $i <= $prod_cant; $i++) {
                            //verifica que este el producto
                            if (isset($request['prod_' . $i])) {

                                $producto = array();
                                $prod = json_decode($request['prod_' . $i]);
                                //$this->logMessage(var_dump($prod));
                                foreach ($prod as $key => $value) {
                                    $this->logMessage("prod_" . $i . "::" . $key . " - " . $value);
                                    $producto[$key] = $value;
                                }

                                //obtener los valores del producto
                                $id_producto = '0';
                                if (isset($producto['id_producto'])) {
                                    $id_producto = $producto['id_producto'];
                                }
                                $cantidad = 0;
                                if (isset($producto['cantidad'])) {
                                    $cantidad = $producto['cantidad'];
                                }
                                //trae el codigo del producto
                                $sql = <<<EOD
select * from ca_producto where id_producto = $id_producto    
EOD;
                                //ejecuta el sql
                                $resultado_pro = CN_TABLE::executeSQL($sql);

                                if (count($resultado_pro) > 0) {

                                    $codigo_elemento = $resultado_pro[0]['codigo'];
                                    //verifica cantidad de elementos
                                    $sql = <<<EOD
select 
inv.* 
from in_inventario_con inv
where 
inv.id_cen_op = $id_cen_op
and inv.id_espacio = $id_espacio
and  inv.id_mae_ter = $id_mae_ter_inv
and inv.id_tipo_almacenamiento = $id_tipo_almacenamiento

and (inv.id_linea, inv.id_clase, inv.id_catalogo) in ( 
    select 
    invle.id_linea, invle.id_clase, invle.id_catalogo
    from in_codigo_elemento_v invle
    where 
    invle.codigo_elemento = '$codigo_elemento'
)   
EOD;
                                    //ejecuta el sql
                                    $resultado_cod = CN_TABLE::executeSQL($sql);

                                    if (count($resultado_cod) > 0) {

                                        $saldo = $resultado_cod[0]['saldo'];
                                        //cantidad mayor al saldo de inventario, no genera registros
                                        if ($cantidad > $saldo) {
                                            $this->logMessage("Validar cantidad de productos::" . $codigo_elemento);
                                            //Validar cantidad de productos
                                            $error = true;
                                        }
                                    } else {
                                        $this->logMessage("No esta el codigo_elemento::" . $codigo_elemento);
                                        //no esta el producto en inventario
                                        $error = true;
                                    }
                                }
                            }
                        }
                    }

                    if ($error) {
                        /*
                         * Mensaje de error
                         */
                        $mensajeError = <<<EOD
La cantidad necesaria de productos no se encuentran en el inventario.    
Para las Especificaciones :: <br><br>Centro de Operación : $nom_cen_op 
                             <br>Tipo Almacenamiento : $tipo_almacenamiento  
                             <br>Espacio : $espacio
                             <br>Responsable : $num_doc_inv - $razon_soc   
EOD;

                        $this->status = 3;
                        $this->list_data = array();
                        $this->mensajeError = $mensajeError;
                        $this->logMessage("[factura_pos_completa] " . $mensajeError);
                    } else {

                        /**
                         * INICIO::Crear Cabecera de CA_FACTURA_POS - 20150512
                         */
                        //sentencia sql
                        $sql = <<<EOD
ALTER SESSION SET NLS_DATE_FORMAT = "YYYY-MM-DD HH24:MI:SS" 
EOD;

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

                        //sentencia sql
                        $sql = <<<EOD
Insert into CA_FACTURA_POS (ID_FACTURA,ID_ANHOS,ID_PUNTO_VENTA,ID_CAJA,SEC_FACTURA,ID_MAE_TER,
    FECHA_FACTURACION,VALOR_BRUTO,VALOR_IVA,VALOR_TOTAL,CAJERO,OBSERVACIONES,ESTADO,FECHA_ANU,MOTIVO_ANU,ID_ESTADO_CAJA,VALOR_RETEN,VALOR_DCTO,PORC_DCTO,VALOR_DCTO_DET) 
    values (null,$id_anhos,$id_punto_venta,$id_caja,$sec_factura,$id_mae_ter,
        sysdate,$valor_bruto,$valor_iva,$valor_total,$cajero,
            '$observaciones',1,null,null,$id_estado_caja,$valor_reten,$valor_descuento_fac,$porc_descuento_fac,$valor_descuento_det) 
EOD;
                        //ejecuta el sql
                        $this->conn->execute($sql);


                        /**
                         * Ultima Factura Creada
                         * Ticket #4918, validar que tome la que se acaba de insertar, se agrega secuencia - 20161111 
                         */
                        $sql = <<<EOD
select * from ca_factura_pos
where id_punto_venta = $id_punto_venta and id_caja = $id_caja and id_mae_ter = $id_mae_ter and sec_factura = $sec_factura
order by fecha_facturacion desc    
EOD;
                        //ejecuta el sql
                        //$this->conn->execute($sql);
                        $resultado_facpos = CN_TABLE::executeSQL($sql);

                        $id_factura = $resultado_facpos[0]['id_factura'];

                        //sentencia sql
                        $sql = <<<EOD
ALTER SESSION SET NLS_DATE_FORMAT = "YYYY-MM-DD"
EOD;

                        //ejecuta el sql
                        CN_TABLE::executeSQL($sql);
                        /*
                         * FIN::Crear Cabecera de CA_FACTURA_POS - 20150512
                         */



                        /**
                         * INICIO::Crear Productos de la Factura - 20150512
                          ID_PRODUCTO
                          CANTIDAD
                          VALOR_UNI_BRUTO
                          VALOR_UNI_IVA
                          VALOR_UNI_TOTAL
                          REFERENCIA
                         */
                        $prod_cant = $request['prod_cant'];
                        for ($i = 1; $i <= $prod_cant; $i++) {
                            //verifica que este el producto
                            if (isset($request['prod_' . $i])) {

                                $producto = array();
                                $prod = json_decode($request['prod_' . $i]);
                                //$this->logMessage(var_dump($prod));
                                foreach ($prod as $key => $value) {
                                    $this->logMessage("prod_" . $i . "::" . $key . " - " . $value);
                                    $producto[$key] = $value;
                                }

                                //obtener los valores del producto
                                $id_producto = '0';
                                if (isset($producto['id_producto'])) {
                                    $id_producto = $producto['id_producto'];
                                }
                                $cantidad = '1';
                                if (isset($producto['cantidad'])) {
                                    $cantidad = $producto['cantidad'];
                                }
                                $valor_uni_bruto = '0';
                                if (isset($producto['valor_uni_bruto'])) {
                                    $valor_uni_bruto = $producto['valor_uni_bruto'];
                                }
                                $valor_uni_iva = '0';
                                if (isset($producto['valor_uni_iva'])) {
                                    $valor_uni_iva = $producto['valor_uni_iva'];
                                }
                                $valor_uni_total = '0';
                                if (isset($producto['valor_uni_total'])) {
                                    $valor_uni_total = $producto['valor_uni_total'];
                                }
                                $referencia = '';
                                if (isset($producto['referencia'])) {
                                    $referencia = $producto['referencia'];
                                }
                                //20170418 variable del descuento de detalle
                                $porc_descuento = '0';
                                if (isset($producto['porc_dcto'])) {
                                    $porc_descuento = $producto['porc_dcto'];
                                }
                                $valor_descuento = '0';
                                if (isset($producto['valor_dcto'])) {
                                    $valor_descuento = $producto['valor_dcto'];
                                }


                                //sentencia sql                
                                $sql = <<<EOD
Insert into CA_FACTURA_PROD (ID_FACTURA_PROD,ID_FACTURA,ID_PRODUCTO,CANTIDAD,VALOR_UNI_BRUTO,VALOR_UNI_IVA,VALOR_UNI_TOTAL,REFERENCIA,VALOR_DCTO,PORC_DCTO) 
    values (null,$id_factura,$id_producto,$cantidad,$valor_uni_bruto,$valor_uni_iva,$valor_uni_total,'$referencia',$valor_descuento,$porc_descuento) 
EOD;
                                //ejecuta el sql
                                $this->conn->execute($sql);
                            }
                        }
                        /*
                         * FIN::Crear Productos de la Factura - 20150512
                         */



                        /**
                         * INICIO::Crear Pagos de la Factura - 20150512
                          ID_TS_PC_FP
                          VALOR
                          ID_BN
                          ID_CB
                          OFICINA
                          NUM_DOC
                          FECHA_DOC
                         */
                        $pago_cant = $request['pago_cant'];
                        for ($i = 1; $i <= $pago_cant; $i++) {
                            //verifica que este el pago
                            if (isset($request['pago_' . $i])) {

                                $pago = array();
                                $pag = json_decode($request['pago_' . $i]);
                                //$this->logMessage(var_dump($pago));
                                foreach ($pag as $key => $value) {
                                    $this->logMessage("pago_" . $i . "::" . $key . " - " . $value);
                                    $pago[$key] = $value;
                                }

                                //obtener los valores del pago
                                $id_ts_pc_fp = 'null';
                                if (isset($pago['id_ts_pc_fp'])) {
                                    $id_ts_pc_fp = $pago['id_ts_pc_fp'];
                                }
                                $valor = 0;
                                if (isset($pago['valor'])) {
                                    $valor = $pago['valor'];
                                }
                                $id_bn = 'null';
                                if (isset($pago['id_bn'])) {
                                    $id_bn = $pago['id_bn'];
                                }
                                $id_cb = 'null';
                                if (isset($pago['id_cb'])) {
                                    $id_cb = $pago['id_cb'];
                                }
                                $oficina = '';
                                if (isset($pago['oficina'])) {
                                    $oficina = $pago['oficina'];
                                }
                                $num_doc = '';
                                if (isset($pago['num_doc'])) {
                                    $num_doc = $pago['num_doc'];
                                }
                                $fecha_doc = '';
                                if (isset($pago['fecha_doc'])) {
                                    $fecha_doc = $pago['fecha_doc'];
                                }


                                //sentencia sql                
                                $sql = <<<EOD
Insert into CA_FACTURA_PAGO (ID_FACTURA_PAGO,ID_FACTURA,ID_TS_PC_FP,VALOR,ID_BN,ID_CB,OFICINA,NUM_DOC,FECHA_DOC) 
    values (null,$id_factura,$id_ts_pc_fp,$valor,$id_bn,$id_cb,'$oficina','$num_doc',to_date('$fecha_doc','yyyy-mm-dd')) 
EOD;
                                //ejecuta el sql
                                $this->conn->execute($sql);
                            }
                        }
                        /*
                         * FIN::Crear Pagos de la Factura - 20150512
                         */



                        /**
                         * Datos de la factura, para devolver a la peticion del servicio - 20150206
                         */
                        //sentencia sql
                        $sql = <<<EOD
SELECT   

tab0.id_factura as id_factura, tab0.id_anhos as id_anhos, 
tab0.id_punto_venta as id_punto_venta, 
tab0.id_caja as id_caja, tab0.sec_factura as sec_factura, 
tab0.id_mae_ter as id_mae_ter, 
to_char(tab0.fecha_facturacion, 'YYYY-MM-DD HH:MI AM') as fecha_facturacion, 
tab0.valor_bruto as valor_bruto, 
tab0.valor_iva as valor_iva, tab0.valor_reten as valor_reten, 
tab0.valor_total as valor_total, 
tab0.cajero as cajero, tab0.observaciones as observaciones, 
tab0.estado as estado, 
to_char(tab0.fecha_anu, 'YYYY-MM-DD') as fecha_anu, 
tab0.motivo_anu as motivo_anu, 
tab0.id_estado_caja as id_estado_caja, tab1.nombre as punto_venta, 
tab1.encabezado as encabezado, 
tab1.pie_pagina as pie_pagina, tab2.num_doc as num_doc, 
tab2.razon_soc as razon_soc, 
tab2.num_doc||' - '||tab2.razon_soc as tercero, 
tab2.mail as mail, tab2.direccion as direccion, 
tab2.tel as tel, tab2.ciudad as ciudad, tab3.num_doc as num_doc_caj, 
tab3.razon_soc as razon_soc_caj, 
tab3.num_doc||' '||tab3.razon_soc as tercero_caj, 
tab4.prefijo as prefijo, tab5.sesion as sesion, 
to_char(tab5.fecha_estado, 'YYYY-MM-DD HH:MI AM') as fecha_estado, 
tab5.estado as estado_caja 

FROM CA_FACTURA_POS tab0  

JOIN CA_PUNTO_VENTA tab1 ON tab0.id_punto_venta = tab1.id_punto_venta  
JOIN INTERCEROS_V tab3 ON tab0.cajero = tab3.id_mae_ter  
JOIN INTERCEROS_DU_DIR_V tab2 ON tab0.id_mae_ter = tab2.id_mae_ter  
JOIN CA_CAJA tab4 ON tab0.id_punto_venta = tab4.id_punto_venta AND tab0.id_caja = tab4.id_caja  
JOIN CA_ESTADO_CAJA tab5 ON tab0.id_estado_caja = tab5.id_estado_caja 

WHERE  
tab0.id_factura = $id_factura 
AND tab0.id_punto_venta = $id_punto_venta

ORDER BY 
sec_factura 
EOD;

                        //ejecuta el sql
                        $resultado = CN_TABLE::executeSQL($sql);
                        $record = array();
                        if (count($resultado) > 0) {
                            $record = $resultado;
                        }


                        $this->list_data = $record_unico = $record;

                        $mensaje = "[factura_pos_completa] Termino Factura POS.";
                        $this->logMessage($mensaje);


                        /**
                         * Crea registros en inventario - 20150716
                         */
                        if ($aplica_inventario) {
                            $this->logMessage("Crea registros en inventario");
                            $id_movimientos_con = 1;


                            /**
                             * 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_CON'   
EOD;
                            //ejecuta el sql
                            $resultado_seg = CN_TABLE::executeSQL($sql);

                            if (count($resultado_seg) > 0) {
                                $this->logMessage("Si hay secuencia.");
                                $id_movimientos_con = $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_CON', $id_cen_op, $id_anhos, $id_movimientos_con, $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_CON (ID_MOVIMIENTOS_CON,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_con, $id_anhos, $id_cen_op, $id_tipo_movimiento, $id_concepto_movimiento, '$sec_factura', $id_ts_td, to_date(sysdate,'yyyy-mm-dd'),
    $id_mae_ter_inv, $id_mae_ter, $id_espacio, null, $id_tipo_almacenamiento, null,
        0, null, null, null, 1, '$observaciones', $id_cen_op,
            to_date(sysdate,'yyyy-mm-dd'), 0, 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_con
where
id_tipo_movimiento = $id_tipo_movimiento
and id_vigencia = $id_anhos
and id_cen_op = $id_cen_op
and nom_entidad = 'IN_MOVIMIENTOS_CON'   
EOD;
                            //ejecuta el sql
                            $this->conn->execute($sql);



                            /**
                             * Crear Detalle del movimiento - 20150716
                             */
                            $id_det_mov_con = 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_CON'   
EOD;
                            //ejecuta el sql
                            $resultado_seg = CN_TABLE::executeSQL($sql);

                            if (count($resultado_seg) > 0) {
                                $this->logMessage("Si hay secuencia.");
                                $id_det_mov_con = $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_CON', $id_cen_op, $id_anhos, $id_det_mov_con, $id_tipo_movimiento)   
EOD;
                                //ejecuta el sql
                                $this->conn->execute($sql);
                            }

                            //trae los productos
                            $sql = <<<EOD
select 
--fac.id_factura_prod,
fac.id_factura,
fac.id_producto,
pro.codigo,
sum(fac.cantidad) as cantidad,
sum(fac.valor_uni_bruto) as valor_uni_bruto,
sum(fac.valor_uni_iva) as valor_uni_iva,
sum(fac.valor_uni_total) as valor_uni_total,
max(fac.referencia) as referencia
from ca_factura_prod fac
join ca_producto pro on pro.id_producto = fac.id_producto
where 
fac.id_factura = $id_factura 
group by
fac.id_factura,
fac.id_producto,
pro.codigo
order by
fac.id_producto    
EOD;
                            //ejecuta el sql
                            $resultado_prod = CN_TABLE::executeSQL($sql);
                            /*
                             * For de productos
                             */
                            foreach ($resultado_prod as $value) {

                                $id_producto = $value['id_producto'];
                                $codigo_elemento = $value['codigo'];
                                $cantidad = $value['cantidad'];


                                //verifica cantidad de elementos
                                $sql = <<<EOD
select 
inv.* 
from in_inventario_con inv
where 
inv.id_cen_op = $id_cen_op
and inv.id_espacio = $id_espacio
and  inv.id_mae_ter = $id_mae_ter_inv
and inv.id_tipo_almacenamiento = $id_tipo_almacenamiento

and (inv.id_linea, inv.id_clase, inv.id_catalogo) in ( 
    select 
    invle.id_linea, invle.id_clase, invle.id_catalogo
    from in_codigo_elemento_v invle
    where 
    invle.codigo_elemento = '$codigo_elemento'
)   
EOD;
                                //ejecuta el sql
                                $resultado_cod = CN_TABLE::executeSQL($sql);

                                if (count($resultado_cod) > 0) {

                                    $id_inventario_con = $resultado_cod[0]['id_inventario_con'];
                                    $id_linea = $resultado_cod[0]['id_linea'];
                                    $id_clase = $resultado_cod[0]['id_clase'];
                                    $id_catalogo = $resultado_cod[0]['id_catalogo'];
                                    $valor_promedio = $resultado_cod[0]['valor_promedio'];

                                    $saldo = $resultado_cod[0]['saldo'];
                                    //cantidad mayor al saldo de inventario, no genera registros
                                    if ($cantidad > $saldo) {
                                        $this->logMessage("Validar cantidad de productos::" . $codigo_elemento);
                                    } else {

                                        $saldo = $saldo - $cantidad;

                                        /**
                                         * Crea el detalle
                                         */
                                        //sentencia sql                
                                        $sql = <<<EOD
Insert into IN_DET_MOV_CON (ID_DET_MOV_CON,ID_MOVIMIENTOS_CON,ID_VIGENCIA,ID_INVENTARIO_CON,
    VALOR_UNITARIO,ANULADO,ESTADO,ID_CATALOGO,ID_CLASE,ID_LINEA,ID_CEN_OP,CANTIDAD,ID_TIPO_MOVIMIENTO,
        SALDO,VALOR_PROMEDIO,VALOR_PROMEDIO_ANT,ID_INVENTARIO_CON_FIN,SALDO_FIN) 
values ( $id_det_mov_con, $id_movimientos_con, $id_anhos, $id_inventario_con,
    $valor_promedio, 0, 1, $id_catalogo, $id_clase, $id_linea, $id_cen_op, $cantidad, $id_tipo_movimiento,
        $saldo, $valor_promedio, $valor_promedio, null, 0)  
EOD;
                                        //ejecuta el sql
                                        $this->conn->execute($sql);

                                        //Aumenta consecutivo del detalle del movimiento                                        
                                        $id_det_mov_con = $id_det_mov_con + 1;
                                    }
                                }
                            }

                            /*
                             * 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_con - 1
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_CON'   
EOD;
                            //ejecuta el sql
                            $this->conn->execute($sql);


                            /**
                             * Relacion de la factua y el inventario - 20160215
                             */
                            //sentencia sql                
                            $sql = <<<EOD
Insert into CA_FACTURA_POS_MOVIMIENTOS_CON (ID_FACTURA,ID_MOVIMIENTOS_CON,ID_VIGENCIA,ID_CEN_OP,ID_TIPO_MOVIMIENTO) 
    values ($id_factura,$id_movimientos_con,$id_anhos,$id_cen_op,$id_tipo_movimiento) 
EOD;
                            //ejecuta el sql
                            $this->conn->execute($sql);


                            $this->conn->commit();



                            /**
                             * Descontar cantidad en inventario, llamar cierre en inventario - 20160215
                             * LLave: 
                              $num_movimiento_id = $request['id_movimientos_con'];
                              $id_tipo_movimiento = $request['id_tipo_movimiento'];
                              $id_vig = $request['id_vigencia'];
                              $id_cen_op = $request['id_cen_op'];
                             */
                            $this->logMessage("Descontar cantidad en inventario, llamar cierre en inventario");


                            //Se trae de la configuracipon la url que se ha establecido para las interfaces contables
                            $arrayAtrib = array();

                            $array = sfYaml::load(dirname(__FILE__) . '/../../../config/app-gwt.yml');

                            $int = 0;
                            foreach ($array as $routeName => $routeData) {
                                //echo $routeName . "\n";
                                if ('service_url_inventario' == $routeName) {
                                    foreach ($routeData as $key => $value) {
                                        //echo $value . "\n";
                                        if ($key == 'value') {
                                            $service_url = $value;
                                        }
                                    }
                                }
                                $int++;
                            }

                            //$url = sfConfig::get('app-gwt_jasper_url');
                            //echo $url;
                            //$ch = curl_init("http://www.sofhouse.net/");
                            //&PARAM_comando=pos_imprimir_factura&PARAM_envio_correo=true&PARAM_mensaje_log=1");
                            $url = $service_url;
                            $url = $url . 'cierre_salida_con/add.json?id_mod=17&username=websafi&nitocc=800189921&id_username=946&entidad_cliente=5&id_cen_op_log=' . $id_cen_op . '&comando=in_movi_consumo';

                            //variables del credito
                            $url = $url . '&id_movimientos_con=' . $id_movimientos_con;
                            $url = $url . '&id_tipo_movimiento=' . $id_tipo_movimiento;
                            $url = $url . '&id_vigencia=' . $id_anhos;
                            $url = $url . '&id_cen_op=' . $id_cen_op;
                            /*
                             * Se coloca una variable mov_pos, para determinar si el cierre es po mov_pos para que no ejecute elecho del return  - 20160215
                             */
                            $url = $url . '&mov_pos=' . 1;

                            //Si aplica estante - 20160830
                            if ($aplica_estante) {
                                $url = $url . '&aplica_estante=true';
                            }

                            //echo $url;
                            //die ();

                            $ch = curl_init($url);

                            //Parametros de retorno en cURL
                            curl_setopt($ch, CURLOPT_HEADER, 0);

                            //Ejecuta la petición
                            $rta = curl_exec($ch);
                            //Se cierra la conexión
                            curl_close($ch);

//                            $arrayRespuesta = json_decode($rta, true);
                            //Verifica el status, si es diferente de 0, ocurrio un error al subir la interfaz y debe reportarlo
//                            if ($arrayRespuesta['response']['status'] == 1) {
//                                $mensajeError = "Error :: Al generar el movimiento de bancos, se debe anular la factura.";
//                                $this->status = 1;
//                                $this->list_data = array();
//                                $this->mensajeError = $mensajeError;
//                                $this->logMessage("[CREDITO_COMPLETO] " . $mensajeError);
//                            } else {
//                                $this->logMessage("[CREDITO_COMPLETO] Genero movimiento de bancos.");
//                            }

                            $mensaje_inv = "[factura_pos_completa] Termino Movimiento INVENTARIO.";
                            $this->logMessage($mensaje_inv);


                            $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
                            $this->conn->beginTransaction();
                        } else {
                            $this->logMessage("No aplica inventario.");
                        }//Fin de mov inventario
                    }//Fin Factura
                }
            }
            /*
             * 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();

            $mensaje = "[factura_pos_completa] ERROR al Generar la Factura POS. !!!";

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

            $this->status = 2;
            $this->mensajeError = $mensaje;
            $this->list_data = array(
                array(
                    'Code' => $e->getCode(),
                    'Message' => $e->getMessage(),
                    'Line' => $e->getLine(),
                    'Trace' => $e->getTraceAsString(),
                    'mensaje' => $mensaje
                )
            );
        }
    }

}
