<?php

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

    /**
     * Metodo para add movimiento banco y generar saldo de notas credito
     *
     * @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 - 20160512
        $tag_portal_web = 0;


        /*
         * Manejo de errores
         */
        try {

            $resultado = array();

            /*
             * Variables obligatorias
             */
            $id_credito = $request['id_credito'];
            $id_anhos = $request['id_anhos'];
            $id_punto_venta = $request['id_punto_venta'];
            $id_tipo_credito = $request['id_tipo_credito'];
            $id_con_credito = $request['id_con_credito'];
            $fecha_proceso = $request['fecha_proceso'];
//            $fecha_proceso = CN_TABLE::fechaSistema();
            $num_doc = trim($request['num_doc']);
            $valor = $request['valor'];
            $fecha = $request['fecha'];
            $id_ts_td = $request['id_ts_td'];
            $username = $request['username'];
            $id_mae_ter = $request['id_mae_ter'];

            //dato al crearse el credito
            $sec_credito = $request['sec_credito'];

            if (isset($request['tag_portal_web'])) {
                $tag_portal_web = $request['tag_portal_web'];
            }

            /*
             * Variables NO obligatorias
             */
            $oficina = 'null';
            if (isset($request['oficina'])) {
                $oficina = "'" . $request['oficina'] . "'";
            }

            $id_bn = 'null';
            if (isset($request['id_bn'])) {
                $id_bn = $request['id_bn'];
            }
            $id_cb = 'null';
            if (isset($request['id_cb'])) {
                $id_cb = $request['id_cb'];
            }

            $id_ts_mb = 17;
            if (isset($request['id_ts_mb'])) {
                $id_ts_mb = $request['id_ts_mb'];
            }

            $consecutivo = 0;

            /*
             * OBSERVACIONES => CARTERA CIA: $compañia - NC. ca_credito.sec_credito, ABONA A LA(S) $tipo $sec_debito DE $fecha_debito
             * 
             * $compañia => ca_punto_venta.abreviatura buscando por el id_punto_venta del ca_credito
             * $tipo => Corresponde al tipo de debito que se esta afectando con la Nota Credito (ND o FC)
             * $sec_debito => Corresponde a la Secuencia del Debito ca_debito.sec_debito que se esta afectando
             * $fecha_debito => Corresponde a la fecha del Debito ca_debito.fecha_proceso
             * 
             */
            //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";
            }

            /*
             * Crear observacion debitos
             */
            //sentencia sql
            $sql = <<<EOD
select 

cre.id_credito ,
credet.id_credito_detalle,
credet.id_vencimiento,
ven.id_debito,
deb.sec_debito,
to_char(deb.fecha_proceso, 'yyyy-mm-dd') as fecha_proceso,
deb.id_tipo_debito,
tipdeb.descripcion,
deb.id_pr_tipo_ingre,
ref.id_referencia1,
credet.valor_abono,
credet.valor_bruto

from ca_credito cre

join ca_credito_detalle credet
on credet.id_credito = cre.id_credito

join ca_vencimientos ven
on ven.id_vencimiento = credet.id_vencimiento

join ca_debito deb
on deb.id_debito = ven.id_debito

join ca_tipo_debito tipdeb
on tipdeb.id_tipo_debito = deb.id_tipo_debito

left join ca_debito_ref ref
on ref.id_debito = deb.id_debito
            
where 
cre.id_credito = $id_credito

order by deb.sec_debito   
EOD;
            //ejecuta el sql
            $result = CN_TABLE::executeSQL($sql);

            if (count($result) > 0) {

                $observaciones_deb = "";
                /*
                 * Recorre cada detalle del credito
                 * 
                 */
                foreach ($result as $fila) {

                    $observaciones_deb .= $fila['descripcion'] . " " . $fila['sec_debito'] . " de  " . $fila['fecha_proceso'] . " ";
                    $observaciones_rec = $fila['descripcion'] . " " . $fila['sec_debito'] . " de  " . $fila['fecha_proceso'] . " ";
                    $observaciones_rec = "'CARTERA CIA:" . $nombre_pv . " - NC. " . $sec_credito . ", abona a la " . $observaciones_rec . " '";


                    $tipo_ingre = $fila['id_pr_tipo_ingre'];
                    $id_referencia1 = 'null';
                    if ($fila['id_referencia1'] != '') {
                        $id_referencia1 = $fila['id_referencia1'];
                    }
                    $valor_rec = $fila['valor_bruto'];

                    /*
                     * Verificar registro del recaudo regalias
                     */
                    $recaudo = false;
                    if ($tipo_ingre == 7) {
                        //si debe crear recaudo
                        $recaudo = true;
                    } else {
                        //no debe crear recaudo
                        $recaudo = false;
                    }

                    /*
                     * GENERACION DE RECAUDOS PARA REGALIAS
                     * Adicionalmente al proceso de Creacion de Movimiento de Bancos, la funcionalidad debe permitir la creacion de un Recaudo en el modulo de Regalias.
                     * Tabla a afectar : RE_RECAUDO
                     * Condiciones:
                     * Cuando el Debito que esta afectando la Nota Credito tiene parametrizado el campo id_pr_tipo_ingre con el valor (7) DIS - RECURSOS PARA DISTRIBUIR.
                     * 
                     * insert into re_recaudo (id_recaudo,id_ts_mov_banc,id_bn,id_cb,id_ts_mb,id_ts_td,numero_doc,fecha,fecha_proc,id_mae_ter,id_mineral,
                     * placa_rmn,observaciones,valor_recaudo,saldo,estado,fecha_anu,motivo_anu) 
                     * values (35428,2012000117,2,9,27,6,'84595',to_date('11-JAN-2012','DD-MON-RRRR'),to_date('11-JAN-2012','DD-MON-RRRR'),1970,5,null,
                     * 'RECAUDO REGALIAS CARBON DEL MES DE ENERO DE 2012 - MIGUEL ALFONSO CARDENAS LOPEZ',4419391,0,1,null,null);
                     */
                    if ($recaudo) {

                        //sentencia sql
                        $sql = <<<EOD
insert into re_recaudo (id_recaudo,id_ts_mov_banc,id_bn,id_cb,id_ts_mb,id_ts_td,numero_doc,fecha,fecha_proc,id_mae_ter,
id_mineral,placa_rmn,observaciones,valor_recaudo,saldo,estado,fecha_anu,motivo_anu) 
values ( 0, (SELECT max(id_ts_mov_banc)+1 id_ts_mov_banc from RE_RECAUDO), $id_bn, $id_cb, $id_ts_mb, $id_ts_td, '$num_doc',to_date('$fecha','yyyy-mm-dd'),to_date('$fecha_proceso','yyyy-mm-dd'), $id_mae_ter,
    $id_referencia1, null, $observaciones_rec, $valor_rec, $valor_rec, 1, null, null) 
EOD;

                        //ejecuta el sql
                        CN_TABLE::executeSQL($sql);
                        $this->logMessage("[MOVIMIENTO_BANCO] Creado recaudo en regalias.");
                    } else {
                        $this->logMessage("[MOVIMIENTO_BANCO] NO se creo recaudo en regalias.");
                    }
                }
            } else {
                $observaciones_deb = "débito sin identificar";

                //no debe crear recaudo
                $recaudo = false;
            }

            //Se deja la observacion por defecto, y se coloca la que envian al final - 20160601
            $observaciones = "CARTERA CIA:" . $nombre_pv . " - NC. " . $sec_credito . ", abona a la(s) " . $observaciones_deb . "";
            if (isset($request['observaciones'])) {
                $observaciones .= ", " . $request['observaciones'] . "";
            }
            $observaciones = "'" . $observaciones . "'";

            $id_bn = 'null';
            if (isset($request['id_bn'])) {
                $id_bn = $request['id_bn'];
            }
            $id_cb = 'null';
            if (isset($request['id_cb'])) {
                $id_cb = $request['id_cb'];
            }

            $id_ts_mb = 17;
            if (isset($request['id_ts_mb'])) {
                $id_ts_mb = $request['id_ts_mb'];
            }

            $consecutivo = 0;



            //sentencia sql
            $sql = <<<EOD
select * from ca_con_credito where id_con_credito = $id_con_credito    
EOD;
            //ejecuta el sql
            $result = CN_TABLE::executeSQL($sql);

            $aplica_bn = $result[0]['aplica_bn'];

            /*
             * Validar que aplica BN
             */
            if ($aplica_bn == 1) {

                /*
                 * 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;

                /*
                 * 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('$fecha','yyyy-mm-dd'),to_date('$fecha_proceso','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);


                /*
                 * Se corren SALDOS DE BANCO
                 */

                //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 = nvl('$id_saldo_banc',0)
EOD;
                //ejecuta el sql
                $ts_saldo_banc = CN_TABLE::executeSQL($sql);

                //valida que hay saldos - 20160222
                if (count($ts_saldo_banc) > 0) {


//                    $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);

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

                    //Validar si hay saldo - 20180117
                    if (count($conceptoMB) > 0) {

                        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] Creado movimiento de banco.");
                    if ($tag_portal_web == 1) {
                        die();
                    }
                } else {
                    //Resultado para el Template
                    $this->list_data = array();
                    $this->logMessage("[MOVIMIENTO_BANCO] Creado movimiento de banco, sin saldos.");
                    if ($tag_portal_web == 1) {
                        die();
                    }
                }
            } else {

                $mensaje = "[MOVIMIENTO_BANCO] No se aplica para movimiento de 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] ERROR!!!";
            $this->list_data = array();
            $this->logMessage("[MOVIMIENTO_BANCO] ERROR!!!");
            $this->logMessage($e->getMessage());
            if ($tag_portal_web == 1) {
                die();
            }
        }
    }

}
