<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of actions
 *
 * @author ManuelEnriqueParedesLopez
 */
class formato_pago_contratista_val_menActions extends sfActions {

    /**
     * 
     * @param sfWebRequest $request
     */
    public function executeList(sfWebRequest $request) {

        $this->logMessage("---function executeList");
        $this->logMessage("---BEGIN Logging request");

        $status = 0;

        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");
        $array = sfYaml::load(dirname(__FILE__) . '/../../../../api/config/app-gwt.yml');
        $int = 0;
        foreach ($array as $routeName => $routeData) {
            //echo $routeName . "\n";
            if ('entidad_cliente' == $routeName) {
                foreach ($routeData as $key => $value) {
                    //echo $value . "\n";
                    if ($key == 'value') {
                        $entidadCliente = $value;
                    }
                }
            }
            $int++;
        }

        $records = array();

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

        /*
         * Formato de fecha
         */
        //Sql
        $sql = <<<EOD
ALTER SESSION SET NLS_DATE_FORMAT = "YYYY-MM-DD HH24:MI:SS" 
EOD;
        //Ejecutar SQL
        CN_TABLE::executeSQL($sql);



        try {


            //id del contrato
            $id_contrato;
            if (isset($request['id_contrato'])) {
                $id_contrato = $request['id_contrato'];
            }


            //id del contratista
            $id_contratista;
            if (isset($request['id_contratista'])) {
                $id_contratista = $request['id_contratista'];
            }


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


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

            /**
             * Solo valida formatos aprobados y en estado != 0, se valida por codigo de contrato y no id - 20200331::LAVILA
             * Se comenta esta linea, no veo funcionaldiad : AND tab13.val< tab13.n_valor_mensual
             *
             * * Verifico es el total del contrato vs el total pagado, mas 1 cuota que es la que estan generando
             * Se verifica que el sistema actualice correctamente los valores de saldo si es la ultima cuota segun CODIGO de contrato - 20200331::LAVILA
             * Se toma valor del contrato de los RPs asociados y no de los formatos pagados, ya no se suma lo adicional de novedades - 20200403::LAVILA
             * 
             * 20200917 - DORTEGA Se descomento linea con filtro de contratista para que solo considere los pagos del contratista ya que en la sesion
             * al sumar los pagos a otros contratistas excedia el valor y retornaba menos valor a pagar que el disponible
             * Incidente #32040, se deja efectivamente el filtro de id_contratista, ya que el total del contrato es por RPS, 
             * y este sol odebe tener el valor que le corresponde al nuevo funcionario - 20220922::LAVILA
             */
            /* 20221216 se añade condicion para que en el SGC evalue desde los formatos radicados*/
            if ($entidadCliente == "2") {
                $evalCondition = 'tab.aprobado = 1';
            } else {
                $evalCondition = 'tab.radicado = 1';
            }
            //Sql
            $sql = <<<EOD
SELECT
tab13.*
FROM (
        SELECT 
        max(tab12.valor_contrato) as valor_contrato,
        --sum(tab12.valor_mensual) + max(tab12.valor_mensual) as valor_mensual,
        sum(tab12.valor_mensual) + max(tab12.valor_mensualizado) as valor_mensual,
        sum(tab12.valor_mensual) as valor_mensual_pagado,
        
        max(tab12.valor_contrato) - sum(tab12.valor_mensual) as valor_saldo,
        max(tab12.valor_mensual) as n_valor_mensual
                    
        FROM (
                SELECT
                tab0.id_formato_pago,
                tab0.id_contrato,
                tab0.id_contratista,
                tab0.num_contrato,
                tab0.valor_mensualizado,
                tab0.estado,
                tab0.adic,
                rnp.numero,
                ta.razon_social,
                tab0.numero_pago,
                TO_CHAR(tab0.fecha_ini_pago,'yyyy-mm-dd') as fecha_ini,
                TO_CHAR(tab0.fecha_fin_pago,'yyyy-mm-dd') as fecha_fin,
                tab0.valor_mensual,
                --(tab0.valor_contrato + tab0.adic) as valor_contrato, --20212411 Se quita la adicion al parecer estarla tomando dos veces
                (tab0.valor_contrato) as valor_contrato,
                (tab0.valor_sgr+tab0.valor_anm) as valor_contrato_c
                FROM (SELECT num_contrato, LISTAGG(id_contrato ,', ') WITHIN GROUP (ORDER BY num_contrato) as id_contrato FROM RVC_CONTRATO  GROUP BY num_contrato) contrato
                LEFT JOIN (SELECT tab0.id_contrato,
                    tab0.id_contratista,
                    tab0.num_contrato,
                    tab0.estado,
                    tab0.numero_pago,
                    tab0.valor_mensualizado,
                    tab0.valor_sgr,
                    tab0.valor_anm,
                    nvl(tab1.valor_anm_new,0) + nvl(tab1.valor_sgr_new,0) * 0 as adic,
                    tab.id_formato_pago,
                    tab.valor_mensual,
                    nvl(valcont.sum_rp_detalles,tab.valor_contrato) as valor_contrato,
                    tab.id_numero_pago,
                    tab.fecha_ini_pago,
                    tab.fecha_fin_pago
                    FROM RVC_CONTRATO tab0
                    LEFT JOIN RVC_FORMATO_PAGO tab ON tab.id_contrato=tab0.id_contrato
                    LEFT JOIN RVC_NOVEDAD_PRORR_TERMI tab1 ON tab1.id_contrato=tab0.id_contrato and tab1.ID_TIPO_NOVEDAD_CONT = 2
                    left join RVC_CONTRATO_RPS_SUM_V valcont on valcont.id_contrato = $id_contrato
                    where
                    tab.estado != 0 and $evalCondition
                ) tab0 ON to_char(tab0.num_contrato) IN (contrato.num_contrato)
                LEFT JOIN RVC_CONTRATISTA ta ON ta.id_contratista=tab0.id_contratista
                LEFT JOIN RVC_NUMERO_PAGO rnp ON tab0.id_numero_pago= rnp.id_numero_pago
                where
                1=1
                AND tab0.id_contratista=$id_contratista
                --AND tab0.id_contrato=$id_contrato
                and tab0.num_contrato = (select num_contrato from rvc_contrato where id_contrato=$id_contrato )
                ORDER BY tab0.id_contrato,tab0.num_contrato, rnp.numero,tab0.fecha_ini_pago
        )tab12
)tab13
WHERE
1=1
AND tab13.valor_contrato < tab13.valor_mensual
EOD;
//AND tab13.valor_contrato > tab13.valor_mensual
//--AND tab13.val< tab13.n_valor_mensual
            //Ejecutar SQL
            $resultado = CN_TABLE::executeSQL($sql);

            //Se valida si hay registros que superan el valor del contrato total vs la suma de los formatos mensuales - 20200331::LAVILA
            if (count($resultado) > 0) {
                //if ($valor != null) {

                $valor_saldo = $resultado[0]['valor_saldo'];

                $records[0]['paso'] = true;
                $records[0]['valor_mensual'] = $valor_saldo;
            } else {
                //No debe tener encuetna el GWT sino proceder como esta
                $records[0]['paso'] = false;
                $records[0]['valor_mensual'] = 0;
            }

            $mensaje = "Error";

            if ($status == 0) {
                $this->conn->commit();
                $this->status = 0;
                $this->list_data = $records;
                $this->logMessage("[formato_pago_contratista_valor] Exitoso");
            } else {
                $this->conn->rollback();
                $this->status = 1;
                $this->mensajeError = $mensaje;
                $this->list_data = array();
                $this->logMessage("[formato_pago_contratista_valor] ERROR!");
                $this->logMessage($mensaje);
            }
        } catch (Exception $e) {

            /*
             * ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
             */
            $this->conn->rollback();
            $this->status = 1;
            $this->mensajeError = "[formato_pago_contratista_valor] Ocurrio un error: " . $e->getMessage();
            $this->list_data = array();
            $this->logMessage("[formato_pago_contratista_valor] ERROR!");
            $this->logMessage($e->getMessage());
        }
    }

}
