/**
  * @inheritdoc
  */
 public function rules()
 {
     $rulesArray = [[['user_id', 'startdate'], 'required'], [['user_id', 'ticket_id'], 'integer'], [['cash', 'bonus_cash'], 'number', 'min' => 0, 'max' => 100000000], [['create_at', 'current_cost', 'residual'], 'safe'], [['residual'], 'safe', 'on' => 'pay-create'], [['residual'], 'integer', 'integerOnly' => true, 'min' => 0, 'on' => 'pay-edit'], [['comment'], 'string', 'max' => 255], ['user_id', 'exist', 'targetAttribute' => 'user_id', 'targetClass' => Profile::className()], ['ticket_id', 'exist', 'targetAttribute' => 'id', 'targetClass' => SeasonTicket::className()], ['ticket_id', 'notEmptyBoth'], ['groups', 'in', 'range' => array_keys(Group::getGroupArray()), 'allowArray' => true], ['startdate', 'date', 'format' => 'php:d.m.Y'], [['cash', 'bonus_cash'], 'default', 'value' => '0.00']];
     if ($this->maxBonusBalance) {
         $rulesArray[] = ['bonus_cash', 'number', 'min' => 0, 'max' => $this->maxBonusBalance, 'tooBig' => Module::t('pay-admin', 'Insufficient funds in the bonus account')];
     } else {
         $rulesArray[] = ['bonus_cash', 'validateBonusCash'];
     }
     return $rulesArray;
 }
 /**
  * Lists all PaidEmployment models.
  * @return mixed
  */
 public function actionIndex()
 {
     $groupsArray = ArrayHelper::map(Group::find()->asArray()->select('id, name')->orderBy('name')->all(), 'id', 'name');
     $searchModel = new EmploymentSearch();
     $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
     if (!empty($searchModel->userFullName)) {
         $filterUserDataArray = [$searchModel->userFullName => \common\models\Profile::getFullNameByUserId($searchModel->userFullName)];
     } else {
         $filterUserDataArray = [];
     }
     return $this->render('index', compact(['searchModel', 'dataProvider', 'groupsArray', 'filterUserDataArray']));
 }
 /**
  * Creates data provider instance with search query applied
  *
  * @param array $params
  *
  * @return ActiveDataProvider
  */
 public function search($params)
 {
     $query = Group::find();
     $dataProvider = new ActiveDataProvider(['query' => $query]);
     $this->load($params);
     if (!$this->validate()) {
         // uncomment the following line if you do not want to any records when validation fails
         // $query->where('0=1');
         return $dataProvider;
     }
     $query->andFilterWhere(['id' => $this->id, 'status' => $this->status]);
     $query->andFilterWhere(['like', 'name', $this->name])->andFilterWhere(['like', 'description', $this->description]);
     return $dataProvider;
 }
 /**
  * Creates data provider instance with search query applied
  *
  * @param array $params
  *
  * @return ActiveDataProvider
  */
 public function search($params)
 {
     $query = PaidEmployment::find()->joinWith(['pay.profile', 'pay', 'timetable', 'timetable.group']);
     $dataProvider = new ActiveDataProvider(['query' => $query, 'sort' => ['defaultOrder' => ['date' => SORT_DESC]]]);
     $dataProvider->sort->attributes['pay.profile.fullName'] = ['asc' => [Profile::tableName() . '.name' => SORT_ASC, Profile::tableName() . '.surname' => SORT_ASC], 'desc' => [Profile::tableName() . '.name' => SORT_DESC, Profile::tableName() . '.surname' => SORT_DESC]];
     $dataProvider->sort->attributes['timetable.group.name'] = ['asc' => [Group::tableName() . '.name' => SORT_ASC], 'desc' => [Group::tableName() . '.name' => SORT_DESC]];
     $dataProvider->sort->attributes['timetable.start'] = ['asc' => [Timetable::tableName() . '.start' => SORT_ASC], 'desc' => [Timetable::tableName() . '.start' => SORT_DESC]];
     $dataProvider->sort->attributes['timetable.end'] = ['asc' => [Timetable::tableName() . '.end' => SORT_ASC], 'desc' => [Timetable::tableName() . '.end' => SORT_DESC]];
     $this->load($params);
     if (!$this->validate()) {
         // uncomment the following line if you do not want to any records when validation fails
         // $query->where('0=1');
         return $dataProvider;
     }
     $query->andFilterWhere(['id' => $this->id, 'date' => $this->date, 'pay_id' => $this->pay_id, 'pay.user_id' => $this->userFullName, 'timetable.group_id' => $this->timetableGroupId]);
     return $dataProvider;
 }
?>

        </div>
    </div>
    <div class="row">
        <div class="col-sm-12">
            <?php 
echo $form->field($model, 'description')->textArea(['maxlength' => 255]);
?>

        </div>
    </div>
    <div class="row">
        <div class="col-sm-12">
            <?php 
echo $form->field($model, 'status')->dropDownList(\backend\modules\group\models\Group::getStatusArray());
?>

        </div>
    </div>
    <div class="form-group">
        <?php 
echo Html::submitButton($model->isNewRecord ? Module::t('group-admin', 'Create') : Module::t('group-admin', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-primary btn-large' : 'btn btn-success btn-large']);
?>
    </div>

    <?php 
ActiveForm::end();
?>

</div>
<?php

use backend\modules\timetable\widgets\GroupGridView as GridView;
use backend\modules\group\models\Group;
echo GridView::widget(['id' => 'show-timetable', 'dataProvider' => $dataProvider, 'layout' => '{items}', 'tableOptions' => ['class' => 'table table-bordered text-center'], 'headerRowOptions' => ['class' => 'active'], 'mergeColumns' => ['week_day'], 'columns' => [['attribute' => 'week_day', 'options' => ['class' => 'col-xs-3'], 'contentOptions' => ['style' => 'vertical-align: middle;'], 'value' => function ($model) {
    return $model->weekArray[$model->week_day];
}], ['attribute' => 'start', 'options' => ['class' => 'col-xs-2'], 'contentOptions' => ['style' => 'vertical-align: middle;']], ['attribute' => 'end', 'options' => ['class' => 'col-xs-2'], 'contentOptions' => ['style' => 'vertical-align: middle;']], ['attribute' => 'group_id', 'options' => ['class' => 'col-xs-5'], 'value' => function ($model) {
    return Group::getGroupArray()[$model->group_id];
}]]]);
 /**
  * Creates a new Pay model.
  * If creation is successful, the browser will be redirected to the 'view' page.
  * @param integer $user_id
  * @return mixed
  */
 public function actionCreate($user_id = false)
 {
     if ($user_id) {
         $profile = Profile::findOne(['user_id' => $user_id]);
         if (!$profile) {
             throw new HttpException(404);
         }
         $model = new Pay();
         $model->setScenario('pay-create');
         $model->maxBonusBalance = $profile->bonus_balance;
         $tickets = SeasonTicket::getTicketArray();
         //ajax validation
         if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
             Yii::$app->response->format = Response::FORMAT_JSON;
             return ActiveForm::validate($model);
         }
         if ($model->load(Yii::$app->request->post()) && $model->save()) {
             return $this->redirect(['view', 'id' => $model->id]);
         } else {
             $groups = Group::getGroupArray();
             return $this->render('create', ['model' => $model, 'profile' => $profile, 'tickets' => $tickets, 'groups' => $groups]);
         }
     } else {
         $searchModel = new UserSearch();
         $dataProvider = $searchModel->search(Yii::$app->request->get());
         return $this->render('listusers', ['dataProvider' => $dataProvider, 'searchModel' => $searchModel]);
     }
 }
 /**
  * Finds the Group model based on its primary key value.
  * If the model is not found, a 404 HTTP exception will be thrown.
  * @param integer $id
  * @return Group the loaded model
  * @throws NotFoundHttpException if the model cannot be found
  */
 protected function findModelAll($id)
 {
     if (($model = Group::find()->where(['id' => $id])->all()) !== null) {
         return $model;
     } else {
         throw new HttpException(404);
     }
 }
 /**
  * @return \yii\db\ActiveQuery
  */
 public function getGroup()
 {
     return $this->hasOne(Group::className(), ['id' => 'group_id']);
 }
                <?php 
echo Html::a('<i class="fa fa-eye"></i>', ['view'], ['class' => 'btn btn-default btn-sm', 'title' => Module::t('timetable-admin', 'View')]);
?>
                <?php 
echo Html::a('<i class="fa fa-leanpub"></i>', ['publish'], ['class' => 'btn btn-warning btn-sm', 'title' => Module::t('timetable-admin', 'Publish')]);
?>
                <?php 
echo Html::a('<i class="fa fa-plus"></i>', ['create'], ['class' => 'btn btn-primary btn-sm', 'title' => Module::t('timetable-admin', 'Create')]);
?>
                <?php 
echo Html::a('<i class="fa fa-ban"></i>', ['cancel-lessons'], ['class' => 'btn btn-danger btn-sm', 'title' => Module::t('timetable-admin', 'Cancel lessons')]);
?>
                <?php 
echo Html::a('<i class="fa fa-trash"></i>', ['batch-delete'], ['class' => 'btn btn-danger btn-sm', 'id' => 'batch-delete', 'title' => Module::t('timetable-admin', 'Delete selected')]);
?>
            </div>
        </div>
        <div class="box-body">
            <?php 
echo GridView::widget(['dataProvider' => $dataProvider, 'id' => $gridId, 'filterModel' => $searchModel, 'export' => false, 'columns' => [['class' => CheckboxColumn::classname()], ['attribute' => 'week_day', 'pageSummary' => true, 'class' => 'kartik\\grid\\EditableColumn', 'editableOptions' => ['inputType' => 'dropDownList', 'type' => 'post', 'formOptions' => ['action' => Url::toRoute('edit'), 'id' => 'timetable-form'], 'data' => Timetable::getWeekArray()], 'value' => function ($model) {
    return $model->weekArray[$model->week_day];
}, 'filter' => Html::activeDropDownList($searchModel, 'week_day', Timetable::getWeekArray(), ['class' => 'form-control', 'prompt' => ''])], ['attribute' => 'start', 'filter' => false, 'class' => 'kartik\\grid\\EditableColumn', 'editableOptions' => ['inputType' => 'textInput', 'type' => 'post', 'formOptions' => ['action' => Url::toRoute('edit'), 'id' => 'timetable-form']]], ['attribute' => 'end', 'filter' => false, 'class' => 'kartik\\grid\\EditableColumn', 'editableOptions' => ['inputType' => 'textInput', 'type' => 'post', 'formOptions' => ['action' => Url::toRoute('edit'), 'id' => 'timetable-form']]], ['attribute' => 'group_id', 'class' => 'kartik\\grid\\EditableColumn', 'format' => 'html', 'editableOptions' => ['inputType' => 'dropDownList', 'data' => Group::getGroupArray(), 'type' => 'post', 'formOptions' => ['action' => Url::toRoute('edit'), 'id' => 'timetable-form']], 'value' => function ($model) {
    return Group::getGroupArray()[$model->group_id];
}, 'filter' => Html::activeDropDownList($searchModel, 'group_id', Group::getGroupArray(), ['class' => 'form-control', 'prompt' => ''])], ['class' => 'yii\\grid\\ActionColumn', 'buttons' => ['clone' => function ($url) {
    return Html::a('<i class="fa fa-files-o"></i>', $url, ['title' => Module::t('timetable-admin', 'Clone row'), 'class' => 'btn btn-default btn-xs']);
}], 'template' => '{clone} {update} {delete}', 'buttonOptions' => ['class' => 'btn btn-default btn-xs'], 'headerOptions' => ['style' => 'width:100px;'], 'header' => Module::t('timetable-admin', 'Actions')]]]);
?>
        </div>
    </div>
</div>
$this->registerJs("jQuery(document).on('click', '#batch-delete', function (evt) {" . "evt.preventDefault();" . "var keys = jQuery('#" . $gridId . "').yiiGridView('getSelectedRows');" . "if (keys == '') {" . "alert('" . Module::t('group-admin', 'You need to select at least one item.') . "');" . "} else {" . "if (confirm('" . Module::t('group-admin', 'Are you sure you want to delete selected items?') . "')) {" . "jQuery.ajax({" . "type: 'POST'," . "url: jQuery(this).attr('href')," . "data: {ids: keys}" . "});" . "}" . "}" . "});");
?>
<div class="<?php 
echo $gridId;
?>
">
    <div class="box box-default">
        <div class="box-header">
            <div class="pull-right">
                <?php 
echo Html::a('<i class="fa fa-plus"></i>', ['create'], ['class' => 'btn btn-primary btn-sm', 'title' => Module::t('group-admin', 'Create')]);
?>
                <?php 
echo Html::a('<i class="fa fa-trash"></i>', ['batch-delete'], ['class' => 'btn btn-danger btn-sm', 'id' => 'batch-delete', 'title' => Module::t('group-admin', 'Delete selected')]);
?>
            </div>
        </div>
        <div class="box-body">
            <?php 
// echo $this->render('_search', ['model' => $searchModel]);
?>

            <?php 
echo GridView::widget(['dataProvider' => $dataProvider, 'id' => $gridId, 'filterModel' => $searchModel, 'columns' => [['class' => CheckboxColumn::classname()], 'name', 'description:html', ['attribute' => 'status', 'value' => function ($data) {
    return Group::getStatusArray()[$data->status];
}, 'filter' => Html::activeDropDownList($searchModel, 'status', Group::getStatusArray(), ['class' => 'form-control', 'prompt' => ''])], ['class' => 'yii\\grid\\ActionColumn', 'buttonOptions' => ['class' => 'btn btn-default btn-xs'], 'headerOptions' => ['style' => 'width:95px;'], 'header' => Module::t('group-admin', 'Actions')]]]);
?>
        </div>
    </div>
</div>
 /**
  * Updates an existing Timetable model.
  * If update is successful, the browser will be redirected to the 'view' page
  * @return mixed
  */
 public function actionEdit()
 {
     if (Yii::$app->request->post('hasEditable') && Yii::$app->request->post('editableKey')) {
         $model = $this->findModel(Yii::$app->request->post('editableKey'));
         $model->setScenario('timetable-edit');
         $postEditableIndex = Yii::$app->request->post('editableIndex');
         $postTimetable = Yii::$app->request->post('Timetable')[$postEditableIndex];
         $output = '';
         $message = '';
         if (is_array($postTimetable)) {
             foreach ($postTimetable as $key => $value) {
                 if (isset($model->{$key})) {
                     $model->{$key} = $output = $value;
                     if ('week_day' === (string) $key) {
                         $output = Timetable::getWeekArray()[$value];
                     }
                     if ('group_id' === (string) $key) {
                         $output = Group::getGroupArray()[$value];
                     }
                     if (!$model->validate() || !$model->save(false)) {
                         echo Json::encode(['output' => $output, 'message' => $model->errors[$key]]);
                     } else {
                         echo Json::encode(['output' => $output, 'message' => '']);
                     }
                     break;
                 }
             }
         }
     }
 }