<?php

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

    /**
     * Metodo para add movimiento banco y generar saldo de facturas pos
     *
     * @param sfWebRequest $request
     */
    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");

        //facturas portal web - validar el retorno del json - 20150210
        $tag_portal_web = 0;

        /*
         * Manejo de errores
         */
        try {

            $resultado = array();

            /*
             * Variables obligatorias
             */
            $id_factura = $request['id_factura'];
            $id_anhos = $request['id_anhos'];
            $id_punto_venta = $request['id_punto_venta'];
            $sec_factura = $request['sec_factura'];
            $id_mae_ter = $request['id_mae_ter'];
            $fecha_proceso = $fecha_facturacion = $request['fecha_facturacion'];
            $cajero = $request['cajero'];
            if (isset($request['tag_portal_web'])) {
                $tag_portal_web = $request['tag_portal_web'];
            }


            /*
             * $usuario => Con el CA_FACTURA_POS.cajero buscar en INTERCEROS 
             * por el id_mae_ter, traer el num_doc y buscar en la tabla de USUARIO el username
             */
            //sentencia sql
            $sql = <<<EOD
select * from usuario
where
num_doc = to_char (
(select num_doc from interceros
where id_mae_ter = $cajero)
)  
EOD;
            //ejecuta el sql
            $result = CN_TABLE::executeSQL($sql);
            $username = 'null';
            if (count($result) > 0) {
                $username = $result[0]['username'];
            }

            /*
             * OBSERVACIONES => CANCELACION FACTURA: $compañia – CA_FACTURA_POS.sec_factura
             * 
             * $compañia => CA_PUNTO_VENTA.abreviatura buscando por el id_punto_venta de CA_FACTURA_POS
             */
            //sentencia sql
            $sql = <<<EOD
select * from ca_punto_venta where id_punto_venta = $id_punto_venta    
EOD;
            //ejecuta el sql
            $result = CN_TABLE::executeSQL($sql);

            if (count($result) > 0) {
                $nombre_pv = $result[0]['nombre'];
            } else {
                $nombre_pv = "Sin Identificar";
            }


            /*
             * ID_TS_MB => 95 
             * ID_TS_TD => 6
             */

            $id_ts_mb = 95;
            $id_ts_td = 6;
            $consecutivo = 0;


            /*
             * Obtener pago de facturas
             * Validar que aplica BN
             */
            //sentencia sql
            $sql = <<<EOD
select * from ca_factura_pago pago
join ts_pc_fp fp on fp.id = pago.id_ts_pc_fp and fp.aplica_bn = 1
where pago.id_factura = $id_factura 
EOD;
            //ejecuta el sql
            $result = CN_TABLE::executeSQL($sql);

            /*
             * Hay resultados de pagos
             */
            if (count($result) > 0) {

                /*
                 * Array para regenerar saldos
                 */
                $bn_cd = array();


                /*
                 * Recorrer pagos pos y crear movimiento banco
                 */
                foreach ($result as $value) {

                    /*
                     * Valores de record
                     */
                    $id_bn = $value['id_bn'];
                    $id_cb = $value['id_cb'];

                    //agregar valores bn y cb
                    $concat_bn_cb = $id_bn . ',' . $id_cb;
                    if (!array_key_exists($concat_bn_cb, $bn_cd)) {
                        $this->logMessage("[MOVIMIENTO_BANCO_POS] Concat BN CB: " . $concat_bn_cb);
                        $bn_cd[$concat_bn_cb] = $concat_bn_cb;
                    }

                    $num_doc = trim($value['num_doc']);
                    $fecha = $value['fecha_doc'];
                    $valor = $value['valor'];
                    $oficina = "'" . $value['oficina'] . "'";




                    /*
                     * Calcular secuencia movimiento
                     */

                    //sentencia sql
                    $sql = <<<EOD
Select tab0.consecutivo_mb cons from TS_MPT tab0    
EOD;

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

                    $consecutivo = $st[0]['cons'];

                    $cons = $id_anhos . "00";

                    $ceros = 4 - strlen($consecutivo);

                    for ($i = 0; $i < $ceros; $i++) {
                        $cons = $cons . "0";
                    }

                    $con = $cons . ($consecutivo + 1);

                    $consecutivo = 0;
                    $consecutivo = $con;


                    /*
                     * Se coloca en las observaciones la fecha de soporte - 20160721
                     */
                    //sentencia sql
                    $sql = <<<EOD
select * from ca_factura_pos
where observaciones like '%fecha de soporte%'
and id_factura = $id_factura 
EOD;
                    //ejecuta el sql
                    $result = CN_TABLE::executeSQL($sql);
                    if (count($result) > 0) {
                        $obs_fecha = ', Se reprocesa al mes actual de proceso fecha de soporte: ' . substr($fecha, 0, 10);
                    } else {
                        $obs_fecha = '';
                    }

                    $observaciones = "'CANCELACION FACTURA:" . $nombre_pv . " - CA_FACTURA_POS. " . $sec_factura . $obs_fecha . ".'";



                    /*
                     * Crear movimiento banco
                     * Insert into TS_MOV_BANC 
                     * (ID,ID_TS_BN,ID_TS_CB,ID_TS_MB,ID_TS_TD,NUMERO_DOC,FECHA,FECHA_PROC,ID_MAE_TER,VALOR,OBSERVACIONES,AFECTA_PAC,USUARIOLOG,FECHALOG,OFICINA,ID_MINERAL_CB,CONSECUTIVO_MB,ESTADO) 
                     * values (1354,3,20,95,6,2353600,to_date('21-JAN-2011','DD-MON-RRRR'),to_date('25-JAN-2011','DD-MON-RRRR'),2626,62150,'CANCELACION FACTURA :14 - 16974','0','admin',to_date('02-FEB-2011','DD-MON-RRRR'),'BOGOTA',null,2011001273,null);
                     */
                    //sentencia sql
                    $sql = <<<EOD
Insert into TS_MOV_BANC 
(ID,ID_TS_BN,ID_TS_CB,ID_TS_MB,ID_TS_TD,NUMERO_DOC,FECHA,FECHA_PROC,
                ID_MAE_TER,VALOR,OBSERVACIONES,AFECTA_PAC,USUARIOLOG,FECHALOG,
                OFICINA,ID_MINERAL_CB,CONSECUTIVO_MB,ESTADO) 
values (null,$id_bn,$id_cb,$id_ts_mb,$id_ts_td,$num_doc,
    to_date( substr( '$fecha',0,10) ,'yyyy-mm-dd' ), to_date( substr('$fecha_proceso',0,10) ,'yyyy-mm-dd'),
    $id_mae_ter,$valor,$observaciones,'0','$username',
    sysdate,$oficina,null,$consecutivo,null)   
EOD;
                    //ejecuta el sql
                    CN_TABLE::executeSQL($sql);


                    /*
                     * Despues se guarda el movimiento y se actualiza el consecutivo asi: 
                     */
                    $sub = substr($consecutivo, 4);
                    //sentencia sql
                    $sql = <<<EOD
update TS_MPT set consecutivo_mb = $sub 
EOD;

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


                    $this->logMessage("[MOVIMIENTO_BANCO_POS] Creado movimiento banco " . $consecutivo . " de factura pos.");
                }


                /*
                 * Se corren SALDOS DE BANCO
                 */
                foreach ($bn_cd as $key => $value) {
                    $this->logMessage("[MOVIMIENTO_BANCO_POS] Entro a regenerar saldos.");

                    //divide la variable
                    $div_bn_cb = explode(",", $value);

                    $id_bn = $div_bn_cb[0];
                    $id_cb = $div_bn_cb[1];
                    $fecha_proceso = substr($fecha_proceso, 0, 10);

                    //Traigo el registro de saldos de bancos de la fecha del proceso y la cuenta correspondiente
//                    $SaldoBanc = Doctrine::getTable('TS_SALDO_BANC')
//                            ->createQuery('a')
//                            ->where('a.fecha=? and a.id_ts_bn=? and a.id_ts_cb=?', array($fecha_proceso, $id_bn, $id_cb))
//                            ->execute();
                    //sentencia sql
                    $sql = <<<EOD
select 
t.id, t.vigencia, t.mes, t.fecha, 
t.id_ts_bn, t.id_ts_cb, t.saldo_anterior, 
t.debito, t.credito, t.saldo_actual 
from ts_saldo_banc t
where 
(
t.fecha = to_date('$fecha_proceso','yyyy-mm-dd') and 
t.id_ts_bn = $id_bn and 
t.id_ts_cb = $id_cb
)  
EOD;
                    //ejecuta el sql
                    $SaldoBanc = CN_TABLE::executeSQL($sql);


                    //Obtengo el id de esa cuenta
                    $id_saldo_banc = null;

                    foreach ($SaldoBanc as $sb):
                        $id_saldo_banc = $sb['id'];
                    endforeach;

                    //creo el objeto de saldos bancarios
//                    $ts_saldo_banc = Doctrine::getTable('TS_SALDO_BANC')->find($id_saldo_banc);
                    //sentencia sql
                    $sql = <<<EOD
select * from TS_SALDO_BANC
where id = $id_saldo_banc
EOD;
                    //ejecuta el sql
                    $ts_saldo_banc = CN_TABLE::executeSQL($sql);

//                    $conceptoMB = Doctrine::getTable('TS_MB')
//                            ->createQuery('a')
//                            ->where('a.id=?', $id_ts_mb)
//                            ->execute();
                    //sentencia sql
                    $sql = <<<EOD
select t.id, t.codigo, t.descripcion,
t.rubro_ing, t.grupo, t.dian, t.traslado,
t.operador, t.id_tip_mov, t.reintegro,
t.caja, t.retencion, t.id_ts_cr from ts_mb t 

where (t.id = $id_ts_mb)
EOD;
                    //ejecuta el sql
                    $conceptoMB = CN_TABLE::executeSQL($sql);


                    $operador = null;

                    foreach ($conceptoMB as $cmb):
                        $operador = $cmb['operador'];
                    endforeach;

                    if ($operador == 0):
                        $credito = $ts_saldo_banc[0]['credito'];
                        $saldoAnterior = $ts_saldo_banc[0]['saldo_anterior'];
                        $debito = $ts_saldo_banc[0]['debito'];

                        $credito = $credito + $valor;
                        $saldoActual = $saldoAnterior + $debito - $credito;

//                        $ts_saldo_banc->setCredito($credito);
//                        $ts_saldo_banc->setSaldoActual($saldoActual);
//                        $ts_saldo_banc->save();
                        //sentencia sql
                        $sql = <<<EOD
UPDATE TS_SALDO_BANC set credito = $credito, saldo_actual = $saldoActual  where id = $id_saldo_banc 
EOD;
                        //ejecuta el sql
                        $conceptoMB = CN_TABLE::executeSQL($sql);

                    else:

                        $credito = $ts_saldo_banc[0]['credito'];
                        $saldoAnterior = $ts_saldo_banc[0]['saldo_anterior'];
                        $debito = $ts_saldo_banc[0]['debito'];

                        $debito = $debito + $valor;
                        $saldoActual = $saldoAnterior + $debito - $credito;

//                        $ts_saldo_banc->setDebito($debito);
//                        $ts_saldo_banc->setSaldoActual($saldoActual);
//                        $ts_saldo_banc->save();
                        //sentencia sql
                        $sql = <<<EOD
UPDATE TS_SALDO_BANC set debito = $debito, saldo_actual = $saldoActual  where id = $id_saldo_banc 
EOD;
                        //ejecuta el sql
                        $conceptoMB = CN_TABLE::executeSQL($sql);

                    endif;
                }

                //Resultado para el Template
                $this->list_data = $resultado;
                $this->logMessage("[MOVIMIENTO_BANCO_POS] Creados los movimientos de bancos.");
                if ($tag_portal_web == 1) {
                    die();
                }
            } else {
                $mensaje = "[MOVIMIENTO_BANCO] NO hay pagos que aplican bancos.";
                $this->status = 1;
                $this->mensajeError = $mensaje;
                $this->list_data = array();
                $this->logMessage($mensaje);
                if ($tag_portal_web == 1) {
                    die();
                }
            }
        } catch (Exception $e) {

            $this->status = 1;
            $this->mensajeError = "[MOVIMIENTO_BANCO_POS] ERROR!!!";
            $this->list_data = array();
            $this->logMessage("[MOVIMIENTO_BANCO_POS] ERROR!!!");
            $this->logMessage($e->getMessage());
            if ($tag_portal_web == 1) {
                die();
            }
        }
    }

}
