<?php

class ReporteHaberesController extends Controller {

    /**
     * @var string the default layout for the views. Defaults to '//layouts/column2', meaning
     * using two-column layout. See 'protected/views/layouts/column2.php'.
     */
    public $layout = '//layouts/column2';

    /**
     * @return array action filters
     */
	public function filters()
	{
		return array(
			'accessControl', // perform access control for CRUD operations
                        'postOnly + delete',
                         array('CrugeAccessControlFilter')
		);
	}

    /**
     * Specifies the access control rules.
     * This method is used by the 'accessControl' filter.
     * @return array access control rules
     */
    public function accessRules() {
        return array(
            array('allow', // allow all users to perform 'index' and 'view' actions
                'actions' => array('index', 'view'),
                'users' => array('@'),
            ),
            array('allow', // allow authenticated user to perform 'create' and 'update' actions
                'actions' => array('create', 'update'),
                'users' => array('@'),
            ),
            array('allow', // allow admin user to perform 'admin' and 'delete' actions
                'actions' => array('admin', 'delete'),
                'users' => array('admin'),
            ),
            array('deny', // deny all users
                'users' => array('*'),
            ),
        );
    }

    /**
     * Displays a particular model.
     * @param integer $id the ID of the model to be displayed
     */
    public function actionView($id) {
        $this->render('view', array(
            'model' => $this->loadModel($id),
        ));
    }

    public function actionCreate()
    {
        $model = new ReporteHaberes;
        $model->unsetAttributes();

        if (isset($_POST['ReporteHaberes'])) {
            $model->desdeH = $_POST['ReporteHaberes']['desdeH'];
            $model->hastaH = $_POST['ReporteHaberes']['hastaH'];
            $model->estatus_aporte = 0; // solo los pagados
            if (isset($_POST['yt1'])) {
                $model->attributes = $_POST['ReporteHaberes'];

                if ($model->validate()) {
                    if ($model->hasPorcentajeInteres()) {
                        $columns = $_POST['columnas'];
                        array_push($columns, ['interes_calculado' => 1]);

                        $model->setAttribute('columnas', $columns);
                    } else {
                        $model->setAttribute('columnas', $_POST['columnas']);
                    }

                    $reporte = $model->getReporteHaberesSQL();

                    $total = count($reporte);
                    if ($total > 0) {
                        $this->render('reporteHaberes', array('model'=>$model));
                        echo "<script type=\"text/javascript\">
    					$('#carga').show();
    					$('#formulario').hide();
    					</script>";
                        $this->mensajeCarga($mensaje = "<b>Generando Resumen:</b> .....");

                        $filas=array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
                        'AA','AB','AC','AD','AE','AF','AG','AH','AI','AJ','AK','AL','AM','AN','AO','AP','AQ','AR','AS','AT','AU','AV','AW','AX','AY','AZ');

                        $phpExcelPath = Yii::getPathOfAlias('ext.Excel.PHPExcel.Classes');
                        $phpExcelPath2 = Yii::getPathOfAlias('application.extensions.Excel.PHPExcel.Classes.PHPExcel');

                        spl_autoload_unregister(array('YiiBase','autoload'));

                        include($phpExcelPath . DIRECTORY_SEPARATOR . 'PHPExcel.php');
                        include($phpExcelPath2 . DIRECTORY_SEPARATOR . 'IOFactory.php');
                        spl_autoload_register(array('YiiBase','autoload'));

                        $objPHPExcel = new PHPExcel();

                        $objPHPExcel->getProperties()->setCreator("RORAIMASOFTWARE")
                            ->setLastModifiedBy("RORAIMASOFTWARE")
                            ->setTitle("RORAIMASOFTWARE")
                            ->setSubject("RORAIMASOFTWARE")
                            ->setDescription("RORAIMASOFTWARE")
                            ->setKeywords("RORAIMASOFTWARE")
                            ->setCategory("RORAIMASOFTWARE");

                        $objPHPExcel->setActiveSheetIndex(0);

                        $this->mensajeCarga($mensaje = "<b>Creando Cintillo:</b> .....");
                        $numtemo=0;
                        $objPHPExcel->getActiveSheet()->freezePaneByColumnAndRow(0, 2);
                        $rangoTotales = [];
                        $letraTotal = [];
                        foreach (array_keys($model->getColumnsKeys()) as $name) {
                            $cintillo = $model->configuracionCampo($name);

                            if ($cintillo != 0 && $model->hasColumn($name)) {
                                $objPHPExcel->getActiveSheet()->setCellValue($filas[$numtemo].'1', $model->getAttributeLabel($name));
                                $objPHPExcel->getActiveSheet()->getColumnDimension($filas[$numtemo])->setAutoSize(true);

                                $objPHPExcel->getActiveSheet()->getStyle($filas[$numtemo].'1')->getFont()->setBold(true);                    //stylo
                                $objPHPExcel->getActiveSheet()->getStyle($filas[$numtemo].'1')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
                                $objPHPExcel->getActiveSheet()->getStyle($filas[$numtemo].'1')->getFill()->getStartColor()->setARGB($cintillo['color']);
                                $objPHPExcel->getActiveSheet()->getStyle($filas[$numtemo].'1')->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_WHITE);
                                $objPHPExcel->getActiveSheet()->getStyle($filas[$numtemo].'1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);

                                if ($cintillo['total']) {
                                    array_push($rangoTotales, $filas[$numtemo]);
                                } else {
                                    array_push($letraTotal, $filas[$numtemo]);
                                }

                                $numtemo=$numtemo+1;
                            }
                        }

                        $cintillo = $model->configuracionCampo('porcentaje_disponible');
                        if ($cintillo !=0) {
                            $objPHPExcel->getActiveSheet()->setCellValue($filas[$numtemo].'1', $model->getAttributeLabel('porcentaje_disponible'));
                            $objPHPExcel->getActiveSheet()->getColumnDimension($filas[$numtemo])->setAutoSize(true);

                            $objPHPExcel->getActiveSheet()->getStyle($filas[$numtemo].'1')->getFont()->setBold(true);         //stylo
                            $objPHPExcel->getActiveSheet()->getStyle($filas[$numtemo].'1')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
                            $objPHPExcel->getActiveSheet()->getStyle($filas[$numtemo].'1')->getFill()->getStartColor()->setARGB($cintillo['color']);
                            $objPHPExcel->getActiveSheet()->getStyle($filas[$numtemo].'1')->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_WHITE);
                            $objPHPExcel->getActiveSheet()->getStyle($filas[$numtemo].'1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);

                            $numtemo=$numtemo+1;
                        }

                        $numfila=2;

                        $this->mensajeCarga($mensaje = "<b>Registrando datos en la celda:</b> .....");
                        foreach ($reporte as $i => $data) {
                            $this->barraProgreso(($i * 100) / $total);
                            $numtemo=0;
                            foreach (array_keys($model->getColumnsKeys()) as $name) {
                                if ($name == 'id_unidad') {
                                    $datofila = $data->nombre_unidad;
                                } else {
                                    $datofila = $data->{$name};
                                }

                                $camposConfigurado = $model->configuracionCampo($name);
                                if ($camposConfigurado != 0 && $model->hasColumn($name)) {
                                    if (array_key_exists('alineacion', $camposConfigurado)) {
                                        $objPHPExcel->getActiveSheet()->getStyle($filas[$numtemo].$numfila)->getAlignment()->setHorizontal($camposConfigurado['alineacion']);
                                    }

                                    if (array_key_exists('formato', $camposConfigurado)) {
                                        $objPHPExcel->getActiveSheet()->getStyle($filas[$numtemo].$numfila)->getNumberFormat()->setFormatCode($camposConfigurado['formato']);
                                    }

                                    if (array_key_exists('raw', $camposConfigurado)) {
                                        $objPHPExcel->getActiveSheet()->setCellValueExplicit($filas[$numtemo].$numfila, $datofila);
                                    } else {
                                        $objPHPExcel->getActiveSheet()->setCellValue($filas[$numtemo].$numfila, $datofila);
                                    }

                                    $numtemo++;
                                }
                            }

                            $numfila=$numfila+1;
                        }

                        if (count($letraTotal) > 0) {
                            $ultimaLetra = array_pop($letraTotal);
                            $objPHPExcel->setActiveSheetIndex(0)->mergeCells('A'.$numfila.":{$ultimaLetra}".$numfila);
                            $objPHPExcel->getActiveSheet()->getStyle('A'.$numfila)->getFont()->setBold(true);
                            $objPHPExcel->getActiveSheet()->getStyle('A'.$numfila)->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
                            $objPHPExcel->getActiveSheet()->getStyle('A'.$numfila)->getFill()->getStartColor()->setARGB('0B610B');
                            $objPHPExcel->getActiveSheet()->getStyle('A'.$numfila)->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_WHITE);
                            $objPHPExcel->getActiveSheet()->getStyle('A'.$numfila)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                            $objPHPExcel->getActiveSheet()->getStyle('A'.$numfila)->getNumberFormat()->setFormatCode('#,##0.00');
                            $objPHPExcel->getActiveSheet()->setCellValue('A'.$numfila, 'TOTALES');
                        }

                        foreach ($rangoTotales as $letra) {
                            $objPHPExcel->getActiveSheet()->getStyle("{$letra}{$numfila}")->getFont()->setBold(true);
                            $objPHPExcel->getActiveSheet()->getStyle("{$letra}{$numfila}")->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);
                            $objPHPExcel->getActiveSheet()->getStyle("{$letra}{$numfila}")->getFill()->getStartColor()->setARGB('00FF00');
                            $objPHPExcel->getActiveSheet()->getStyle("{$letra}{$numfila}")->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_BLACK);
                            $objPHPExcel->getActiveSheet()->getStyle("{$letra}{$numfila}")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
                            $objPHPExcel->getActiveSheet()->getStyle("{$letra}{$numfila}")->getNumberFormat()->setFormatCode('#,##0.00');
                            $objPHPExcel->getActiveSheet()->setCellValue("{$letra}{$numfila}", "=SUM({$letra}2:{$letra}".($numfila-1).')');
                        }

                        $this->mensajeCarga($mensaje = "<b>Guardando en el buffer:</b> .....");
                        echo "<script type=\"text/javascript\">
    					$('#resultado').show();
    					$('#barraEstado').show();
    					</script>";
                        $this->barraProgreso(0, $barraProgresoId='barraEstado');
                        // Rename sheet
                        $objPHPExcel->getActiveSheet()->setTitle('Reporte de Haberes');
                        $objPHPExcel->setActiveSheetIndex(0);

                        $this->barraProgreso(33, $barraProgresoId = 'barraEstado');

                        $this->mensajeCarga($mensaje = "<b>Generando Resumen:</b>  Generado.", $contenedorMensajeId='mensajeResultado');
                        $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
                        $objWriter->save("doc/ReporteHaberes.xlsx");
                        $this->mensajeCarga($mensaje = "<b>Guardando Archivo</b> .....", $contenedorMensajeId='mensajeResultado');
                        $this->barraProgreso(66, $barraProgresoId = 'barraEstado');

                        echo "<script type=\"text/javascript\">
    					$('#archivos').append('<b></b> Descargar Excel <b>".CHtml::link('aquí', "doc/ReporteHaberes.xlsx", array('target'=>'_blank'))."</b><br>');
    					$('#boton').show();
    					</script>";
                        $this->mensajeCarga($mensaje = "<b>Archivo listo</b> .....", $contenedorMensajeId='mensajeResultado');
                        $this->barraProgreso(100, $barraProgresoId = 'barraEstado');
                        flush();
                        ob_flush();
                        exit;
                    } else {
                        Yii::app()->user->setFlash('info', '<strong>Información:</strong> no hay aportes en la fecha seleccionada.');
                        return $this->redirect(['create']);
                    }
                } else {
                    Yii::app()->user->setFlash('error', '<strong>Información:</strong> los datos suministrados son incorrectos, intente de nuevo.');
                    return $this->redirect(['create']);
                }
            } elseif (isset($_POST['yt0'])) {
                unlink('doc/ReporteHaberes.xlsx');
            }
        }

        $this->render('create', array(
            'model'=>$model,
        ));
    }

    /**
     * Updates a particular model.
     * If update is successful, the browser will be redirected to the 'view' page.
     * @param integer $id the ID of the model to be updated
     */
    public function actionUpdate($id) {
        $model = $this->loadModel($id);

        // Uncomment the following line if AJAX validation is needed
        // $this->performAjaxValidation($model);

        if (isset($_POST['ReporteHaberes'])) {
            $model->attributes = $_POST['ReporteHaberes'];
            if ($model->save())
                $this->redirect(array('view', 'id' => $model->cedula));
        }

        $this->render('update', array(
            'model' => $model,
        ));
    }

    /**
     * Deletes a particular model.
     * If deletion is successful, the browser will be redirected to the 'admin' page.
     * @param integer $id the ID of the model to be deleted
     */
    public function actionDelete($id) {
        if (Yii::app()->request->isPostRequest) {
            // we only allow deletion via POST request
            $this->loadModel($id)->delete();

            // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
            if (!isset($_GET['ajax']))
                $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
        } else
            throw new CHttpException(400, 'Invalid request. Please do not repeat this request again.');
    }

    /**
     * Lists all models.
     */
    public function actionIndex() {
        $dataProvider = new CActiveDataProvider('ReporteHaberes');
        $this->render('index', array(
            'dataProvider' => $dataProvider,
        ));
    }

    /**
     * Manages all models.
     */
    public function actionAdmin() {
        $model = new ReporteHaberes('search');
        $model->unsetAttributes();  // clear any default values
        if (isset($_GET['ReporteHaberes']))
            $model->attributes = $_GET['ReporteHaberes'];

        $this->render('admin', array(
            'model' => $model,
        ));
    }

    protected function mensajeCarga($mensaje, $contenedorMensajeId=''){
    	if($contenedorMensajeId=='')
    	$contenedorMensajeId ='mensajes';

    	echo "	<script type=\"text/javascript\">
    	$('#".$contenedorMensajeId."').html('".$mensaje."');
    	</script>";
    	flush();ob_flush();flush();ob_flush();
    }
    protected function barraProgreso($count, $barraProgresoId= ''){
    	if($barraProgresoId=='')
    	$barraProgresoId ='barraProgreso';

    	echo "<script type=\"text/javascript\">
    	$('#".$barraProgresoId."').css('width','".$count."%' );
    	</script>";
    	flush();ob_flush();
    }
    /**
     * Returns the data model based on the primary key given in the GET variable.
     * If the data model is not found, an HTTP exception will be raised.
     * @param integer the ID of the model to be loaded
     */
    public function loadModel($id) {
        $model = ReporteHaberes::model()->findByPk($id);
        if ($model === null)
            throw new CHttpException(404, 'The requested page does not exist.');
        return $model;
    }

    /**
     * Performs the AJAX validation.
     * @param CModel the model to be validated
     */
    protected function performAjaxValidation($model) {
        if (isset($_POST['ajax']) && $_POST['ajax'] === 'reporte-haberes-form') {
            echo CActiveForm::validate($model);
            Yii::app()->end();
        }
    }

}
