<?php

namespace app\models;

use Yii;

/**
 * This is the model class for table "registros".
 *
 * @property string $id
 * @property string $numero
 * @property string $nombre
 * @property string $apellidop
 * @property string $apellidom
 * @property string $genero
 * @property string $nip
 * @property string $fechanac
 * @property string $lugarnac
 * @property string $curp
 * @property string $dnref
 * @property string $correo
 * @property string $entrega
 * @property string $modelo
 * @property string $sim_id
 * @property string $telefono_id
 * @property string $created
 * @property string $modified
 * @property string $created_by
 * @property integer $modified_by
 * @property string $aceptado
 * @property integer $aceptado_by
 *
 * @property Comentarios[] $comentarios
 * @property Sim $sim
 * @property Telefono $telefono
 * @property User $createdBy
 */
class Registros extends \yii\db\ActiveRecord {

    public $from;
    public $to;
    public $registros;
    public $agente;
    public $comentario;

    /**
     * @inheritdoc
     */
    public static function tableName() {
        return 'registros';
    }

    /**
     * @inheritdoc
     */
    public function rules() {
        return [
            [['numero', 'sim_id', 'fechanac', 'curp', 'nip', 'genero', 'telefono_id', 'dnref', 'nombre', 'apellidop', 'apellidom'], 'required'],
            [['dnref', 'numero'], 'string', 'length' => [12, 13], 'message' => 'Telefono debe ser al menos de 10 dígitos'],
            [['fechanac', 'created', 'comentario', 'modified'], 'safe'],
            [['sim_id', 'telefono_id', 'created_by', 'modified_by', 'aceptado_by'], 'integer'],
            [['numero', 'nombre', 'apellidop', 'apellidom', 'aceptado'], 'string', 'max' => 45],
            [['nombre', 'apellidop', 'apellidom', 'genero', 'curp', 'lugarnac'], 'filter', 'filter' => 'strtoupper'],
            [['genero', 'lugarnac', 'curp', 'correo', 'entrega', 'modelo'], 'string', 'max' => 255],
            [['nip'], 'string', 'max' => 4],
            [['nip'], 'string', 'min' => 4],
            [['curp'], 'string', 'min' => 18],
            [['sim_id'], 'exist', 'skipOnError' => true, 'targetClass' => Sim::className(), 'targetAttribute' => ['sim_id' => 'id']],
            [['telefono_id'], 'exist', 'skipOnError' => true, 'targetClass' => Telefono::className(), 'targetAttribute' => ['telefono_id' => 'id']],
            [['created_by'], 'exist', 'skipOnError' => true, 'targetClass' => \common\models\User::className(), 'targetAttribute' => ['created_by' => 'id']],
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels() {
        return [
            'id' => 'ID',
            'numero' => 'Numero',
            'nombre' => 'Nombre',
            'apellidop' => 'Apellido Paterno',
            'apellidom' => 'Apellido Materno',
            'genero' => 'Genero',
            'nip' => 'Nip',
            'aceptado' => 'Status',
            'fechanac' => 'Fecha Nacimiento',
            'lugarnac' => 'Estado Nacimiento',
            'curp' => 'Curp',
            'dnref' => 'Referencia',
            'correo' => 'Correo',
            'entrega' => 'Punto de Entrega',
            'modelo' => 'Modelo Telefono',
            'sim_id' => 'Tipo de Sim',
            'telefono_id' => 'Compañia',
            'created' => 'Fecha creación',
            'modified' => 'Fecha modificación',
            'created_by' => 'Creado por',
            'modified_by' => 'Modificado por',
            'from' => 'Desde',
            'to' => 'Hasta',
            'aceptado' => 'Razon',
            'status_id' => 'Status',
            'aceptado_by' => 'Aceptado por',
        ];
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getComentarios() {
        return $this->hasMany(Comentarios::className(), ['registro_id' => 'id']);
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getSim() {
        return $this->hasOne(Sim::className(), ['id' => 'sim_id']);
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getTelefono() {
        return $this->hasOne(Telefono::className(), ['id' => 'telefono_id']);
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getStatusr() {
        return $this->hasOne(Registros::className(), ['id' => 'status_id']);
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getCreatedBy() {
        return $this->hasOne(\common\models\User::className(), ['id' => 'created_by']);
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getModifiedBy() {
        return $this->hasOne(\common\models\User::className(), ['id' => 'modified_by']);
    }

    /**
     * Devuelve los Aceptados por ABD segun la fecha desde/hasta que se crearos y el 
     * usuario que lo creo.
     * 
     * @var date $desde Fecha desde la cual vamo a buscar
     * @var date $hasta Fecha hasta desde la cual vamo a buscar

     * DB de Registros
     *      1) En Proceso
     *      2) Validado CURP
     *      3) Rechazado CURP
     *      4) Validado ABD
     *      5) Rechazado ABD
     *      6) Reingresado
     * 
     * @return \yii\db\ActiveQuery
     * 
     */
    static function getTodosTramites($desde, $hasta) {
        if (\Yii::$app->user->can('isAdmin')) {
            return \app\models\Registros::find()->
                            innerJoin('statusr', 'registros.status_id = statusr.id')->
                            select("statusr.status as comentario, count(*) as registros")->
                            andFilterWhere(['between', 'registros.created', $desde, $hasta])->
                            groupBy('statusr.status')->
                            all();
        }
        return \app\models\Registros::find()->
                        innerJoin('statusr', 'registros.status_id = statusr.id')->
                        select("statusr.status as comentario, count(*) as registros")->
                        andFilterWhere(['between', 'registros.created', $desde, $hasta])->
                        andFilterWhere(['registros.created_by' => Yii::$app->user->identity->id])->
                        groupBy('statusr.status')->
                        all();
    }

    /**
     * Devuelve los Registros por Agente segun la fecha desde/hasta que se crearos y el 
     * usuario que lo creo.
     * 
     * @var date $desde Fecha desde la cual vamo a buscar
     * @var date $hasta Fecha hasta desde la cual vamo a buscar

     * DB de Registros
     *      1) En Proceso
     *      2) Validado CURP
     *      3) Rechazado CURP
     *      4) Validado ABD
     *      5) Rechazado ABD
     *      6) Reingresado
     * 
     * @return \yii\db\ActiveQuery
     * 
     */
    static function getTodosTramitesByAgente($desde, $hasta) {
        if (\Yii::$app->user->can('isAdmin')) {
            return \app\models\Registros::find()->
                            innerJoin('user', 'registros.created_by = user.id')->
                            select("registros.created_by, user.agente as agente, count(*) as registros")->
                            andFilterWhere(['between', 'registros.created', $desde, $hasta])->
                            groupBy('user.agente')->
                            all();
        }
        return \app\models\Registros::find()->
                        innerJoin('user', 'registros.created_by = user.id')->
                        select("user.agente as agente, count(*) as registros")->
                        andFilterWhere(['between', 'registros.created', $desde, $hasta])->
                        andFilterWhere(['registros.created_by' => Yii::$app->user->identity->id])->
                        groupBy('user.agente')->
                        all();
    }

    /**
     * Devuelve los tramites  segun la fecha desde/hasta que se crearon, el id de status y el 
     * usuario que lo creo.
     * 
     * @var date $desde Fecha desde la cual vamo a buscar
     * @var date $hasta Fecha hasta desde la cual vamo a buscar

     * DB de Registros
     *      1) En Proceso
     *      2) Validado CURP
     *      3) Rechazado CURP
     *      4) Validado ABD
     *      5) Rechazado ABD
     *      6) Reingresado
     * 
     * @return \yii\db\ActiveQuery
     * 
     */
    static function getTramiteById($desde, $hasta, $status, $userID = false) {
        if ($userID) {
            return \app\models\Registros::find()
                            ->andFilterWhere(['between', 'created', $desde, $hasta])
                            ->andFilterWhere(['status_id' => $status])
                            ->andFilterWhere(['created_by' => $userID])
                            ->count();
        }
        if (\Yii::$app->user->can('isAdmin')) {
            return \app\models\Registros::find()
                            ->andFilterWhere(['between', 'created', $desde, $hasta])
                            ->andFilterWhere(['status_id' => $status])
                            ->count();
        }
        return \app\models\Registros::find()
                        ->andFilterWhere(['between', 'created', $desde, $hasta])
                        ->andFilterWhere(['status_id' => $status])
                        ->andFilterWhere(['created_by' => Yii::$app->user->identity->id])
                        ->count();
    }

    /**
     * Devuelve registros dependiendo la fecha dada Desde/Hasta.
     * 
     * @var date $desde 
     *      Fecha desde la cual vamo a buscar
     * @var date $hasta 
     *      Fecha hasta desde la cual vamo a buscar
     * 
     * @return \yii\db\ActiveQuery
     * 
     */
    public static function getRegistrosByDate($desde, $hasta) {
        if (\Yii::$app->user->can('isAdmin')) {
            return \app\models\Registros::find()->andFilterWhere(['between', 'created', $desde, $hasta])->count();
        }
        return \app\models\Registros::find()->where(['created_by' => Yii::$app->user->identity->id])->andFilterWhere(['between', 'created', $desde, $hasta])->count();
    }

    public
            function beforeSave($insert) {
        if (parent::beforeSave($insert)) {
            if ($this->isNewRecord) {
                $this->created = date_create()->format('Y-m-d H:i:s');
                $this->modified = date_create()->format('Y-m-d H:i:s');
                $this->fechanac = date_create($this->fechanac)->format('Y-m-d H:i:s');
                $this->created_by = Yii::$app->user->identity->id;
                $this->modified_by = Yii::$app->user->identity->id;
            } else {
                $this->fechanac = date_create($this->fechanac)->format('Y-m-d H:i:s');
                $this->modified = date_create()->format('Y-m-d H:i:s');
                $this->modified_by = Yii::$app->user->identity->id;
            }
            return true;
        }
        return false;
    }

}
