<?php

/**
 * dias_habiles_cant actions.
 *
 * @package    nomina
 * @subpackage dias_habiles_cant
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class diferencia_entre_fechasActions extends sfQuery {

    /**
     * Executes list action
     *
     * @param sfRequest $request A request object
     */
    //Calcula la fecha final sumando una cantidad de dias habiles
    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");

        /*
         * Manejo de errores
         */
        try {

            /*
             * variables de filtro
             */
            /*$addDays = 0;
            $fecha_ini = $request['fecha_ini'];//Fecha Inicial
            $fecha_fin = $request['fecha_fin'];//Dias habiles a Adicionar
            $fecha_ini = new DateTime($fecha_ini);
            $fecha_fin = new DateTime($fecha_fin);
            // Condiciones para dias a adicionar
            if($fecha_ini->format('Y-m-01') != $fecha_ini->format('Y-m-d')) {
                  $addDays++;
            }
            if($fecha_fin->format('Y-m-t') != $fecha_fin->format('Y-m-d')) {
                  $addDays++;
            }
            $diferencia = $fecha_ini->diff($fecha_fin);
            //execute sql
            $record = array();
            $record[0]['anhos'] = $diferencia->y;
            $record[0]['meses'] = $diferencia->m;
            $record[0]['dias'] = $diferencia->d + $addDays;
            if($record[0]['dias'] >= 30) {
                $record[0]['meses'] = $diferencia->m + 1;
                $record[0]['dias'] = 0;
            }
            // comentario 2
            $record[0]['fecha_ini'] = $request['fecha_ini'];
            $record[0]['fecha_fin'] = $request['fecha_fin'];*/
            
            // 20240301 Se comenta metodo anterio y se realiza nuevo calculo #37710
            $addDays = 0;
            $fecha_ini = $request['fecha_ini']; // Fecha Inicial
            $fecha_fin = $request['fecha_fin']; // Dias hábiles a Adicionar
            $fecha_ini = new DateTime($fecha_ini);
            $fecha_fin = new DateTime($fecha_fin);
            $dias_inicio = 0;
            $minusMonth = 0;
            $addMonth = 0;
            $minusDays = 0;
            // 20240229 Condiciones basadas en ticket #37710
            // Si la fecha de inicio es mayor al inicio de mes, se realiza el siguiente calculo
            // se obtiene los numero de dias del mes inicial  con la siguiente formula 30 - dias +1
            // se establece fecha inicial el primer dia del mes
            // se resta u mes ya que se van a usar los dias de la fecha inicial
            if($fecha_ini->format('Y-m-01') != $fecha_ini->format('Y-m-d')) {
                $dias = $fecha_ini->format('d');
                $dias = ($dias == 31) ? 30 : $dias;
                $addDays += (30 - $dias) + 1;
                $minusMonth ++;
                $fecha_ini = new DateTime($fecha_ini->format('Y-m-01'));
            }
            if($fecha_fin->format('m') == '02') {
                // Si la fecha fin es el ultimo de febrero establece la fecha final al 31 de enero
                // y se suma un mes
                if($fecha_fin->format('Y-m-t') == $fecha_fin->format('Y-m-d')) {
                    $fecha_fin = new DateTime($fecha_fin->format('Y-01-31'));
                    $addMonth ++;
                }
            }
            // Si fecha no es final de mes se obtienen los dias
            // se coloca fecha fin final de mes y se resta un mes a menos que sea febrero donde
            // se coloca fecha final mes 31 de enero y no se resta ningun mes
            if($fecha_fin->format('Y-m-t') != $fecha_fin->format('Y-m-d')) {
                if($fecha_fin->format('m') == '02') {
                    $addDays += $fecha_fin->format('d');
                    $fecha_fin = new DateTime($fecha_fin->format('Y-01-31'));
                } else {
                    $addDays += $fecha_fin->format('d');
                    $fecha_fin = new DateTime($fecha_fin->format('Y-m-t'));
                    $minusMonth ++;
                }
            }
            $diferencia = $fecha_ini->diff($fecha_fin);
            //execute sql
            $record = array();
            if( ($diferencia->d + 1) >= 30) {
                $addMonth ++;
            }
            // Calculamos dias final y agregamos meses si son mas de 30
            $addMonth += floor($addDays/30);
            $dias_totales= $addDays -(floor($addDays/30) * 30);
            /* Calculamos años y meses finales */
            $meses_totales = ($diferencia->y * 12) + $diferencia->m + $addMonth - $minusMonth;
            $anhos_totales = floor($meses_totales/12);
            $meses_totales = $meses_totales - ($anhos_totales * 12);
            // comentario 2
            $record[0]['anhos'] = $anhos_totales;
            $record[0]['meses'] = $meses_totales;
            $record[0]['dias'] = $dias_totales;
            $record[0]['fecha_ini'] = $request['fecha_ini'];
            $record[0]['fecha_fin'] = $request['fecha_fin'];

            $this->totalRows = 0;
            $this->startRow = 0;
            $this->endRow = 0;
            $this->status = 0;
            $this->list_data = $record;
            $this->logMessage("[DIFERENCIA_ENTRE_FECHAS] Consulta exitosa.");
        } catch (Exception $e) {
            $this->status = 1;
            $this->mensajeError = "ERROR!!!";
            $this->list_data = array();
            $this->logMessage("ERROR!!!");
            $this->logMessage("Error: " . $e->getMessage());
        }
    }

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


        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") {
            
        }

        //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") {
            
        }

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

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

        return $request;
    }

}
