<?php

/**
 * This is the model class for table "retiro.conf_retiro_parcial".
 * The followings are the available columns in table 'retiro.conf_retiro_parcial':.
 *
 * @property int    $id
 * @property int    $tiempo_asociado
 * @property int    $tiempo_retiro_parcial
 * @property string $gastos_administrativo
 * @property bool   $blnborrado
 *
 * The followings are the available model relations:
 * @property Periodicidad[] $retiro.periodicidads
 */
class ConfRetiroParcial extends CActiveRecord
{
    public $tipo_gasto;
    public $periodicidad;
    public $tipo_comision;
    public $opcion_asociado = 1;
    public $monto_maximo_asociado;
    public $comision_bancaria_monto;
    public $opcion_administrador = 1;
    public $opcion_comision_bancaria;
    public $porcentaje_maximo_asociado;
    public $monto_maximo_administrador;
    public $gasto_administrativo_monto;
    public $opcion_haberes_asociado = 1;
    public $opcion_gasto_administrativo;
    public $comision_bancaria_porcentaje;
    public $monto_bloqueo_haberes_asociado;
    public $porcentaje_maximo_administrador;
    public $gasto_administrativo_porcentaje;
    public $opcion_haberes_administrador = 1;
    public $porcentaje_bloqueo_haberes_asociado;
    public $monto_bloqueo_haberes_administrador;
    public $porcentaje_bloqueo_haberes_administrador;
    public $pago_prestamo_retiro_administrador = 0;
    public $metodo_seleccion_prestamo_administrador;
    public $pago_prestamo_retiro_asociado = 0;
    public $metodo_seleccion_prestamo_asociado;

    /**
     * @return string the associated database table name
     */
    public function tableName()
    {
        return 'retiro.conf_retiro_parcial';
    }

    /**
     * @return array validation rules for model attributes
     */
    public function rules()
    {
        return [
            ['periodicidad', 'required'],
            ['estatus_tiempo_retiro_parcial,estatus_tiempo_retiro_parcial_administrador', 'required', 'on' => 'EvalucionUltimoEstatus'],
            ['tiempo_retiro_parcial_administrador,tiempo_asociado_administrador,estatus_tiempo_retiro_parcial,tiempo_asociado, tiempo_retiro_parcial', 'numerical', 'integerOnly' => true],
            ['porcentaje_tope, porcentaje_maximo_administrador, porcentaje_maximo_asociado', 'match',  'pattern' => '/^[0-9]\d{0,2}(\.[0-9]\d{2,2})*(\,\d{1,2})?$/', 'message' => 'El valor del campo debe tener un formato 100.000,00'],
            ['gastos_administrativo', 'validateGasto'],
            ['pago_prestamo_retiro_administrador', 'ValidarPagarPrestamoRetiroAdm'],
            ['pago_prestamo_retiro_asociado', 'ValidarPagarPrestamoRetiroAsc'],
            ['porcentaje_maximo_administrador, porcentaje_maximo_asociado', 'validarPorcentaje'],
            [
                'monto_bloqueo_haberes_administrador, porcentaje_bloqueo_haberes_administrador, opcion_haberes_administrador,
                monto_bloqueo_haberes_asociado, porcentaje_bloqueo_haberes_asociado, opcion_haberes_asociadoopcion_asociado, opcion_administrador,
                porcentaje_maximo_administrador, porcentaje_maximo_asociado, monto_maximo_administrador, monto_maximo_asociado, restriccion_solicitud_hora,
                blnborrado,periodicidad,porcentaje_top,gastos_administrativo,periodicidad,metodo_evaluacion_solicitud,limitar_solicitud_administrardor,
                tiempo_retiro_parcial_administrador,tiempo_asociado_administrador,estatus_tiempo_retiro_parcial,estatus_tiempo_retiro_parcial_administrador,creditos_permitidos
                opcion_gasto_administrativo, gasto_administrativo_monto, gasto_administrativo_porcentaje,id_tipo_gasto_administrativo, pago_prestamo_retiro_administrador, pago_prestamo_retiro_asociado,
                metodo_seleccion_prestamo_administrador, metodo_seleccion_prestamo_asociado, pagar_prestamo_retiro_adm, pagar_prestamo_retiro_asc ', 'safe', ],
            ['id, tiempo_asociado, tiempo_retiro_parcial, gastos_administrativo, blnborrado', 'safe', 'on' => 'search'],
        ];
    }

    /**
     * @return array relational rules
     */
    public function relations()
    {
        return [
            'solicitudes' => [self::HAS_MANY, 'PeriodicidadRetiroParcial', 'id_conf_retiro_parcial'],
            'periodicidads' => [self::MANY_MANY, 'Periodicidad', 'periodicidad_retiro_parcial(id_conf_retiro_parcial, id_periodicidad)'],
        ];
    }

    /**
     * @return array customized attribute labels (name=>label)
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'tiempo_asociado' => 'Tiempo como asociado (asociado)',
            'tiempo_retiro_parcial' => 'Tiempo transcurrido del último retiro parcial (asociado)',
            'gastos_administrativo' => 'Gasto administrativo',
            'periodicidad' => 'Disponibilidad para solicitudes',
            'blnborrado' => 'Blnborrado',
            'porcentaje_tope' => 'Porcentaje tope',
            'tiempo_retiro_parcial_administrador' => 'Tiempo transcurrido del último retiro parcial (administrador)',
            'tiempo_asociado_administrador' => 'Tiempo como asociado (administrador)',
            'estatus_tiempo_retiro_parcial' => 'Estatus para evaluar el tiempo de retiro parcial (asociado)',
            'estatus_tiempo_retiro_parcial_administrador' => 'Estatus para evaluar el tiempo de retiro parcial (administrador)',
            'gasto_administrativo_monto' => 'Gasto administrativo monto',
            'gasto_administrativo_porcentaje' => 'Gasto administrativo porcenje',
            'id_tipo_gasto_administrativo' => 'Tipo gasto administrativo',
            'id_tipo_comision_bancaria' => 'Tipo gasto comisión',
            'comision_bancaria_porcentaje' => 'Comisión bancaria porcentaje',
            'comision_bancaria_monto' => 'Comisión bancaria monto',
            'comision_bancaria' => 'Comisión bancaria',
            'metodo_seleccion_prestamo_administrador' => 'Método de selección de préstamo',
            'metodo_seleccion_prestamo_asociado' => 'Método de selección de préstamo',
        ];
    }

    public function validateGasto()
    {
        if ($this->hasErrors('id_tipo_gasto_administrativo') && $this->hasErrors('gastos_administrativo')) {
            return;
        }

        if ($this->id_tipo_gasto_administrativo == 1 && str_replace(',', '.', $this->gastos_administrativo) > 100) {
            $this->addError('gastos_administrativo', 'El monto del gasto administrativo no puede ser mayor a 100 %.');
        }
    }

    public function validarPorcentaje()
    {
        if (! $this->hasErrors('porcentaje_maximo_administrador')) {
            $porcentaje_maximo_administrador = str_replace('.', '', $this->porcentaje_maximo_administrador);
            $porcentaje_maximo_administrador = str_replace(',', '.', $porcentaje_maximo_administrador);
            if ($porcentaje_maximo_administrador > 100) {
                $this->addError('porcentaje_maximo_administrador', 'El porcentaje máximo por administrador no puede ser mayor 100%');
            }
        }
        if (! $this->hasErrors('porcentaje_maximo_asociado')) {
            $porcentaje_maximo_asociado = str_replace('.', '', $this->porcentaje_maximo_asociado);
            $porcentaje_maximo_asociado = str_replace(',', '.', $porcentaje_maximo_asociado);
            if ($porcentaje_maximo_asociado > 100) {
                $this->addError('porcentaje_maximo_asociado', 'El porcentaje máximo por asociado no puede ser mayor 100%');
            }
        }

        if (! $this->hasErrors('porcentaje_bloqueo_haberes_administrador')) {
            $porcentaje_bloqueo_haberes_administrador = str_replace('.', '', $this->porcentaje_bloqueo_haberes_administrador);
            $porcentaje_bloqueo_haberes_administrador = str_replace(',', '.', $porcentaje_bloqueo_haberes_administrador);
            if ($porcentaje_bloqueo_haberes_administrador > 100) {
                $this->addError('porcentaje_bloqueo_haberes_administrador', 'El bloqueo de haberes por administrador no puede ser mayor 100%');
            }
        }
        if (! $this->hasErrors('porcentaje_bloqueo_haberes_asociado')) {
            $porcentaje_bloqueo_haberes_asociado = str_replace('.', '', $this->porcentaje_bloqueo_haberes_asociado);
            $porcentaje_bloqueo_haberes_asociado = str_replace(',', '.', $porcentaje_bloqueo_haberes_asociado);
            if ($porcentaje_bloqueo_haberes_asociado > 100) {
                $this->addError('porcentaje_bloqueo_haberes_asociado', 'El bloqueo de haberes por asociado no puede ser mayor 100%');
            }
        }
    }

    public function ValidarPagarPrestamoRetiroAdm()
    {
        if ($this->pago_prestamo_retiro_administrador == 1) {
            if ($this->metodo_seleccion_prestamo_administrador == 0) {
                $this->addError('metodo_seleccion_prestamo_administrador', 'Debe seleccionar una método de pago de préstamo (Adm)');
            }
        } else {
            $this->metodo_seleccion_prestamo_administrador = 0;
        }
    }

    public function ValidarPagarPrestamoRetiroAsc()
    {
        if ($this->pago_prestamo_retiro_asociado == 1) {
            if ($this->metodo_seleccion_prestamo_asociado == 0) {
                $this->addError('metodo_seleccion_prestamo_asociado', 'Debe seleccionar una método de pago de préstamo (Aso)');
            }
        } else {
            $this->metodo_seleccion_prestamo_asociado = 0;
        }
    }

    public function search()
    {
        $criteria = new CDbCriteria();
        $criteria->select = 't.id,
                             t.tiempo_asociado,
                             t.tiempo_retiro_parcial,
                             t.id_tipo_gasto_administrativo,
                             t.gastos_administrativo,
                             tga.nombre as tipo_gasto,
                             tgac.nombre as tipo_comision,
                             t.comision_bancaria,
                             t.id_tipo_comision_bancaria';
        $criteria->join = 'left join retiro.tipos_gastos_administrativos tga on tga.id=t.id_tipo_gasto_administrativo
                           left join retiro.tipos_gastos_administrativos tgac on tgac.id=t.id_tipo_comision_bancaria';
        $criteria->compare('id', $this->id);
        $criteria->compare('tiempo_asociado', $this->tiempo_asociado);
        $criteria->compare('id_tipo_gasto_administrativo', $this->id_tipo_gasto_administrativo);
        $criteria->compare('tiempo_retiro_parcial', $this->tiempo_retiro_parcial);
        $criteria->compare('gastos_administrativo', $this->gastos_administrativo, true);
        $criteria->compare('blnborrado', $this->blnborrado);

        return new CActiveDataProvider($this, [
            'criteria' => $criteria,
        ]);
    }

    public function afterFind()
    {
        if ($this->monto_disponibilidad_solicitudes != '') {
            $montos = json_decode($this->monto_disponibilidad_solicitudes, true);
            if (isset($montos['monto_maximo_administrador'])) {
                $this->monto_maximo_administrador = $montos['monto_maximo_administrador'];
                $this->opcion_administrador = 1;
            }
            if (isset($montos['porcentaje_maximo_administrador'])) {
                $this->porcentaje_maximo_administrador = $montos['porcentaje_maximo_administrador'];
                $this->opcion_administrador = 0;
            }
            if (isset($montos['monto_maximo_asociado'])) {
                $this->monto_maximo_asociado = $montos['monto_maximo_asociado'];
                $this->opcion_asociado = 1;
            }
            if (isset($montos['porcentaje_maximo_asociado'])) {
                $this->porcentaje_maximo_asociado = $montos['porcentaje_maximo_asociado'];
                $this->opcion_asociado = 0;
            }
            if (isset($montos['monto_bloqueo_haberes_administrador'])) {
                $this->monto_bloqueo_haberes_administrador = $montos['monto_bloqueo_haberes_administrador'];
                $this->opcion_haberes_administrador = 1;
            }
            if (isset($montos['porcentaje_bloqueo_haberes_administrador'])) {
                $this->porcentaje_bloqueo_haberes_administrador = $montos['porcentaje_bloqueo_haberes_administrador'];
                $this->opcion_haberes_administrador = 0;
            }
            if (isset($montos['monto_bloqueo_haberes_asociado'])) {
                $this->monto_bloqueo_haberes_asociado = $montos['monto_bloqueo_haberes_asociado'];
                $this->opcion_haberes_asociado = 1;
            }
            if (isset($montos['porcentaje_bloqueo_haberes_asociado'])) {
                $this->porcentaje_bloqueo_haberes_asociado = $montos['porcentaje_bloqueo_haberes_asociado'];
                $this->opcion_haberes_asociado = 0;
            }
        }

        if ($this->id_tipo_gasto_administrativo == 1) {
            $this->opcion_gasto_administrativo = 0;
            $this->gasto_administrativo_porcentaje = $this->gastos_administrativo;
        }

        if ($this->id_tipo_gasto_administrativo == 2) {
            $this->opcion_gasto_administrativo = 1;
            $this->gasto_administrativo_monto = number_format($this->gastos_administrativo, 2, '.', '');
        }

        if ($this->id_tipo_comision_bancaria == 1) {
            $this->opcion_comision_bancaria = 0;
            $this->comision_bancaria_porcentaje = $this->comision_bancaria;
        }

        if ($this->id_tipo_comision_bancaria == 2) {
            $this->opcion_comision_bancaria = 1;
            $this->comision_bancaria_monto = number_format($this->comision_bancaria, 2, '.', '');
        }

        if ($this->metodo_pago_prestamos_retiro != '') {
            $metodo_pago_prestamos_retiro = json_decode($this->metodo_pago_prestamos_retiro, true);

            if (isset($metodo_pago_prestamos_retiro['pago_prestamo_retiro_administrador'])) {
                $this->metodo_seleccion_prestamo_administrador = $metodo_pago_prestamos_retiro['pago_prestamo_retiro_administrador'];

                if ($this->metodo_seleccion_prestamo_administrador != 0) {
                    $this->pago_prestamo_retiro_administrador = 1;
                }
            }

            if (isset($metodo_pago_prestamos_retiro['pago_prestamo_retiro_asociado'])) {
                $this->metodo_seleccion_prestamo_asociado = $metodo_pago_prestamos_retiro['pago_prestamo_retiro_asociado'];

                if ($this->metodo_seleccion_prestamo_asociado != 0) {
                    $this->pago_prestamo_retiro_asociado = 1;
                }
            }
        } else {
            $this->pago_prestamo_retiro_asociado = 0;

            $this->pago_prestamo_retiro_administrador = 0;
        }

        return parent::afterFind();
    }

    public function beforeSave()
    {
        if ($this->tiempo_asociado == '') {
            $this->tiempo_asociado = null;
        }

        if ($this->tiempo_retiro_parcial == '') {
            $this->tiempo_retiro_parcial = null;
        }

        $montos = [];
        //################################## MONTO TOPE DE SOLICITUD #######################################
        if ($this->monto_maximo_administrador != '') {
            $this->monto_maximo_administrador = str_replace('.', '', $this->monto_maximo_administrador);
            $this->monto_maximo_administrador = str_replace(',', '.', $this->monto_maximo_administrador);
            $montos['monto_maximo_administrador'] = $this->monto_maximo_administrador;
            unset($montos['porcentaje_maximo_administrador']);
        }
        if ($this->porcentaje_maximo_administrador != '') {
            $this->porcentaje_maximo_administrador = str_replace('.', '', $this->porcentaje_maximo_administrador);
            $this->porcentaje_maximo_administrador = str_replace(',', '.', $this->porcentaje_maximo_administrador);
            $montos['porcentaje_maximo_administrador'] = $this->porcentaje_maximo_administrador;
            unset($montos['monto_maximo_administrador']);
        }
        if ($this->monto_maximo_asociado != '') {
            $this->monto_maximo_asociado = str_replace('.', '', $this->monto_maximo_asociado);
            $this->monto_maximo_asociado = str_replace(',', '.', $this->monto_maximo_asociado);
            array_push($montos, ['monto_maximo_asociado' => $this->monto_maximo_asociado]);
            $montos['monto_maximo_asociado'] = $this->monto_maximo_asociado;
            unset($montos['porcentaje_maximo_asociado']);
        }
        if ($this->porcentaje_maximo_asociado != '') {
            $this->porcentaje_maximo_asociado = str_replace('.', '', $this->porcentaje_maximo_asociado);
            $this->porcentaje_maximo_asociado = str_replace(',', '.', $this->porcentaje_maximo_asociado);
            $montos['porcentaje_maximo_asociado'] = $this->porcentaje_maximo_asociado;
            unset($montos['monto_maximo_asociado']);
        }
        if (count($montos) > 0) {
            $this->monto_disponibilidad_solicitudes = json_encode($montos);
        }
        //################################## FIN MONTO TOPE DE SOLICITUD ####################################
        //################################## BLOQUEDO DE HABERES #######################################
        if ($this->monto_bloqueo_haberes_administrador != '') {
            $this->monto_bloqueo_haberes_administrador = str_replace('.', '', $this->monto_bloqueo_haberes_administrador);
            $this->monto_bloqueo_haberes_administrador = str_replace(',', '.', $this->monto_bloqueo_haberes_administrador);
            $montos['monto_bloqueo_haberes_administrador'] = $this->monto_bloqueo_haberes_administrador;
            unset($montos['porcentaje_bloqueo_haberes_administrador']);
        }
        if ($this->porcentaje_bloqueo_haberes_administrador != '') {
            $this->porcentaje_bloqueo_haberes_administrador = str_replace('.', '', $this->porcentaje_bloqueo_haberes_administrador);
            $this->porcentaje_bloqueo_haberes_administrador = str_replace(',', '.', $this->porcentaje_bloqueo_haberes_administrador);
            $montos['porcentaje_bloqueo_haberes_administrador'] = $this->porcentaje_bloqueo_haberes_administrador;
            unset($montos['monto_bloqueo_haberes_administrador']);
        }
        if ($this->monto_bloqueo_haberes_asociado != '') {
            $this->monto_bloqueo_haberes_asociado = str_replace('.', '', $this->monto_bloqueo_haberes_asociado);
            $this->monto_bloqueo_haberes_asociado = str_replace(',', '.', $this->monto_bloqueo_haberes_asociado);
            array_push($montos, ['monto_bloqueo_haberes_asociado' => $this->monto_bloqueo_haberes_asociado]);
            $montos['monto_bloqueo_haberes_asociado'] = $this->monto_bloqueo_haberes_asociado;
            unset($montos['porcentaje_bloqueo_haberes_asociado']);
        }
        if ($this->porcentaje_bloqueo_haberes_asociado != '') {
            $this->porcentaje_bloqueo_haberes_asociado = str_replace('.', '', $this->porcentaje_bloqueo_haberes_asociado);
            $this->porcentaje_bloqueo_haberes_asociado = str_replace(',', '.', $this->porcentaje_bloqueo_haberes_asociado);
            $montos['porcentaje_bloqueo_haberes_asociado'] = $this->porcentaje_bloqueo_haberes_asociado;
            unset($montos['monto_bloqueo_haberes_asociado']);
        }
        if (count($montos) > 0) {
            $this->monto_disponibilidad_solicitudes = json_encode($montos);
        }
        //################################## FIN BLOQUEDO DE HABERES ####################################
        $this->porcentaje_tope = str_replace('.', '', $this->porcentaje_tope);
        $this->porcentaje_tope = str_replace(',', '.', $this->porcentaje_tope);

        if ($this->porcentaje_tope == '') {
            $this->porcentaje_tope = null;
        }

        $metodo_pago_prestamos_retiro = [];
        $metodo_pago_prestamos_retiro['pago_prestamo_retiro_administrador'] = $this->metodo_seleccion_prestamo_administrador;
        $metodo_pago_prestamos_retiro['pago_prestamo_retiro_asociado'] = $this->metodo_seleccion_prestamo_asociado;

        $this->metodo_pago_prestamos_retiro = json_encode($metodo_pago_prestamos_retiro);

        return parent::beforeSave();
    }

    public function setGastoAdministrativo($datos)
    {
        $this->opcion_gasto_administrativo = $datos['opcion_gasto_administrativo'];

        switch ($this->opcion_gasto_administrativo) {
            case 0:
                $this->id_tipo_gasto_administrativo = 1;
                break;
            case 1:
                $this->id_tipo_gasto_administrativo = 2;
                break;
        }

        $this->gastos_administrativo = 0;

        if ($this->id_tipo_gasto_administrativo == 2 && $datos['gasto_administrativo_monto'] != '') {
            $this->gastos_administrativo = str_replace('.', '', $datos['gasto_administrativo_monto']);
            $this->gastos_administrativo = str_replace(',', '.', $this->gastos_administrativo);
        } elseif ($this->id_tipo_gasto_administrativo == 1 && $datos['gasto_administrativo_porcentaje'] != '') {
            $this->gastos_administrativo = str_replace(',', '.', $datos['gasto_administrativo_porcentaje']);
        }
    }

    public function setComisionBancaria($datos)
    {
        $this->opcion_comision_bancaria = $datos['opcion_comision_bancaria'];

        switch ($this->opcion_comision_bancaria) {
            case 0:
                $this->id_tipo_comision_bancaria = 1;
                break;
            case 1:
                $this->id_tipo_comision_bancaria = 2;
                break;
        }

        if ($this->id_tipo_comision_bancaria == 1) {
            $this->comision_bancaria = str_replace(',', '.', $datos['comision_bancaria_porcentaje']);
        } elseif ($this->id_tipo_comision_bancaria == 2) {
            $this->comision_bancaria = str_replace('.', '', $datos['comision_bancaria_monto']);
            $this->comision_bancaria = str_replace(',', '.', $this->comision_bancaria);
        }
    }

    public function calcularGasto($monto)
    {
        if ($this->gastos_administrativo == '') {
            return 0;
        }

        if ($this->id_tipo_gasto_administrativo == 1) {
            return bcmul($monto, ($this->gastos_administrativo / 100), 2);
        }

        if ($monto < $this->gastos_administrativo) {
            throw new Exception("El monto aprobado para el retiro es menor al gasto administrativo {$this->gastos_administrativo}");
        }

        return $this->gastos_administrativo;
    }

    public function calcularComision($monto)
    {
        if ($this->comision_bancaria == '') {
            return 0;
        }

        if ($this->id_tipo_comision_bancaria == 1) {
            return bcmul($monto, ($this->comision_bancaria / 100), 2);
        }

        if ($monto < $this->comision_bancaria) {
            throw new Exception("El monto aprobado para el retiro es menor al gasto administrativo {$this->comision_bancaria}");
        }

        return $this->comision_bancaria;
    }

    /**
     * Returns the static model of the specified AR class.
     * Please note that you should have this exact method in all your CActiveRecord descendants!
     *
     * @param string $className active record class name
     *
     * @return ConfRetiroParcial the static model class
     */
    public static function model($className = __CLASS__)
    {
        return parent::model($className);
    }

    public static function configPagarPrestamoConRetiro()
    {
        return json_decode(self::model()->find()->getAttribute('metodo_pago_prestamos_retiro'));
    }

    public static function getPorcentajeDisponibilidad()
    {
        $model = self::model()->find();

        if (! $model) {
            return 80;
        }

        return $model->porcentaje_tope;
    }
}
