Файл: silawar.ru/protected/controllers/AuctionController.php
Строк: 199
<?php
class AuctionController extends Controller {
    public function accessRules() {
        return array(
            array('deny',
                'roles' => array('banned'),
                'deniedCallback' => array(Yii::app()->controller, 'redirectToHome'),
            ),
            array('allow',
                'actions' => array('index', 'back', 'in', 'out', 'step', 'view'),
                'users' => array('@'),
            ),
            array('deny',
                'users' => array('*'),
                'deniedCallback' => array(Yii::app()->controller, 'redirectToHome'),
            )
        );
    }
    
    public function actionIndex() {
        $model = new Auction('search');
        $model->unsetAttributes();
        $filter = FuncHelper::auctionFilters();
        if (isset($_POST['Auction'])) {
            $model->attributes = $_POST['Auction'];
            if ($model->level) {
                $model->max_level = $model->level + 4;
            }
        }
        $this->render('index', array('model' => $model, 'filter' => $filter,));
    }
    /*
     * Продаем предмет на аук
     */
    public function actionIn($id) {
        $model = new Auction;
        $user = Users::findUser();
        $criteria = new CDbCriteria;
        $criteria->addInCondition('status', array(ITEM_IN_BACKPACK, ITEM_IN_STORE));
        $criteria->compare('id_item', $id);
        $criteria->compare('id_user', Yii::app()->user->id);
        $criteria->addCondition('personal = 0');
        $item = UserItems::model()->find($criteria);
        if (!$item) {
            $this->redirect(Yii::app()->user->returnUrl);
            Yii::app()->end();
        }
        $item->user = Users::getLoginWithLink($item->id_user);
        if (isset($_POST['Auction'])) {
            $model->attributes = $_POST['Auction'];
            $model->lot = AUCTION_ITEM;
            $model->id_item = $id;
            $model->price = $model->min_price_gold * 100 + $model->min_price_silver;
            $model->price_out = $model->max_price_gold * 100 + $model->max_price_silver;
            if ($model->save()) {
                $item->status = ITEM_IN_AUCTION;
                if (!$item->save(false)) {
                    throw new CHttpException(500, Yii::t('layout', 'Ошибка при сохранении предмета!'));
                }
//                $user->money -= 5;
//                if (!$user->save(false)) {
//                    throw new CHttpException(500, Yii::t('layout', 'Ошибка при сохранении пользователя!'));
//                }
                Yii::app()->user->setFlash('info', 'Ваш товар выставлен на аукцион.');
                $this->redirect(array('/auction/index'));
                Yii::app()->end();
            }
        }
        $this->render('in', array(
            'model' => $model,
            'item' => $item,
            'user' => $user)
        );
    }
    /*
     * Выводит информацию о предмете
     */
    public function actionView($id) {
        $model = Auction::model()->findByPk($id);
        if (!$model || $model->time < time()) {
            $this->redirect(Yii::app()->user->returnUrl);
            Yii::app()->end();
        }
        if (isset($_POST['Auction'])) {
            $model->attributes = $_POST['Auction'];
            $user = Users::findUser();
            $money = $model->price_step_gold * 100 + $model->price_step_silver;
            if ($money > $model->price_out)
                $money = $model->price_out;
            if ($user->money < $money) {
                Yii::app()->user->setFlash('error', 'У вас недостаточно денег.');
                $this->redirect(Yii::app()->request->urlReferrer);
                Yii::app()->end();
            }
            if ($model->last) {
                $id_dialog = Users::checkDialog($model->last, 100);
                $mail = new UsersMessages();
                $mail->id_dialog = $id_dialog;
                $mail->id_user = 100;
                $mail->users = $model->last;
                $mail->type = 1;
                $mail->message = 'Вашу ставку перебили';
                $mail->money = $model->price;
                if (!$mail->save(false)) {
                    throw new CHttpException(500, Yii::t('layout', 'Ошибка при отправке почты!'));
                }
            }
            $model->last = Yii::app()->user->id;
            $model->price = $money;
            if (!$model->save()) {
                throw new CHttpException(500, Yii::t('layout', 'Ошибка при сохранении действий аукциона!'));
            }
            $user->money -= $money;
            if (!$user->save(false)) {
                throw new CHttpException(500, Yii::t('layout', 'Ошибка при сохранении пользователя!'));
            }
            Yii::app()->user->setFlash('info', 'Вы успешно повысили ставку.');
            $this->redirect(Yii::app()->request->urlReferrer);
            Yii::app()->end();
        }
        $auction['nextStep'] = FuncHelper::auctionNextStep($model);
        $model->price_step_gold = $auction['nextStep']['gold'];
        $model->price_step_silver = $auction['nextStep']['silver'];
        $auction['step'] = FuncHelper::money($auction['nextStep']['step']);
        $auction['price'] = FuncHelper::money($model->price);
        $auction['price_out'] = FuncHelper::money($model->price_out);
        $auction['timeLeft'] = FuncHelper::auctionTimeLeft($model->time);
        $user_item = UserItems::findUserItem($model->idItem);        
        $this->render('view', array(
            'model' => $model, 
            'auction' => $auction, 
            'user_item' => $user_item,
        ));
    }
    /*
     * Забираем вещь с аука
     */
    public function actionBack($id) {
        $model = Auction::model()->findByPk($id);
        if (!$model || $model->last > 0) {
            $this->redirect(Yii::app()->user->returnUrl);
            Yii::app()->end();
        }
        if (Auction::backItem($model)) {
            if (!$model->delete()) {
                throw new CHttpException(500, Yii::t('layout', 'Ошибка при операции с аукционом!'));
            }
        }
        Yii::app()->user->setFlash('info', 'Вы забрали свою вещь с аукциона.');
        $this->redirect(array('/auction/index'));
        Yii::app()->end();
    }
    /*
     * Повышаем ставку через ссылку
     */
    public function actionStep($id) {
        $model = Auction::model()->findByPk($id);
        if (!$model) {
            $this->redirect(Yii::app()->user->returnUrl);
            Yii::app()->end();
        }
        $user = Users::findUser();
        $money = FuncHelper::auctionNextStep($model, true);
        if ($user->money < $money) {
            Yii::app()->user->setFlash('error', 'У вас недостаточно денег.');
            $this->redirect(Yii::app()->request->urlReferrer);
            Yii::app()->end();
        }
        if ($model->last) {
            $id_dialog = Users::checkDialog($model->last, 100);
            $mail = new UsersMessages();
            $mail->id_dialog = $id_dialog;
            $mail->id_user = 100;
            $mail->users = $model->last;
            $mail->type = 1;
            $mail->message = 'Вашу ставку перебили';
            $mail->money = $model->price;
            if (!$mail->save(false)) {
                throw new CHttpException(500, Yii::t('layout', 'Ошибка при отправке почты!'));
            }
        }
        $model->last = Yii::app()->user->id;
        $model->price = $money;
        if (!$model->save(false)) {
            throw new CHttpException(500, Yii::t('layout', 'Ошибка при сохранении действий аукциона!'));
        }
        $user->money -= $money;
        if (!$user->save(false)) {
            throw new CHttpException(500, Yii::t('layout', 'Ошибка при сохранении пользователя!'));
        }
        Yii::app()->user->setFlash('info', 'Вы успешно повысили ставку.');
        $this->redirect(Yii::app()->request->urlReferrer);
        Yii::app()->end();
    }
    /*
     * Выкупаем товар
     */
    public function actionOut($id) {
        $model = Auction::model()->findByPk($id);
        if (!$model) {
            $this->redirect(Yii::app()->user->returnUrl);
            Yii::app()->end();
        }
        $user = Users::findUser();
        if ($user->money < $model->price_out) {
            Yii::app()->user->setFlash('error', 'У вас недостаточно денег.');
            $this->redirect(Yii::app()->request->urlReferrer);
            Yii::app()->end();
        }
        $user->money -= $model->price_out;
        if (!$user->save(false)) {
            throw new CHttpException(500, Yii::t('layout', 'Ошибка при сохранении пользователя!'));
        }
        if ($model->last) {
            $id_dialog = Users::checkDialog($model->last, 100);
            $mail = new UsersMessages();
            $mail->id_dialog = $id_dialog;
            $mail->id_user = 100;
            $mail->users = $model->last;
            $mail->type = 1;
            $mail->message = 'Ваша ставка возвращена, лот выкупили';
            $mail->money = $model->price;
            if (!$mail->save(false)) {
                throw new CHttpException(500, Yii::t('layout', 'Ошибка при отправке почты!'));
            }
        }
        $id_dialog = Users::checkDialog(Yii::app()->user->id, 100);
        $mail = new UsersMessages();
        $mail->id_dialog = $id_dialog;
        $mail->id_user = 100;
        $mail->users = Yii::app()->user->id;
        $mail->type = 3;
        $mail->message = 'Покупка лота';
        $mail->item = $model->id_item;
        if (!$mail->save(false)) {
            throw new CHttpException(500, Yii::t('layout', 'Ошибка при отправке почты!'));
        }
        //Назначаем вещи нового владельца
        $item = UserItems::model()->findByPk($model->id_item);
        $item->id_user = Yii::app()->user->id;
        $item->status = ITEM_IN_MAIL;
        if (!$item->save(false)) {
            throw new CHttpException(500, Yii::t('layout', 'Ошибка при отправке предмета!'));
        }
        //Забираем процент
        $price = $model->price_out;
        $percent = (round($price / 20) < 5 ? 5 : round($price / 20));
        $price -= $percent;
        //Отправляем почту продавцу
        $id_dialog = Users::checkDialog($model->id_user, 100);
        $mail = new UsersMessages();
        $mail->id_dialog = $id_dialog;
        $mail->id_user = 100;
        $mail->users = $model->id_user;
        $mail->type = 1;
        $mail->message = 'Лот выкуплен';
        $mail->money = $price;
        if (!$mail->save(false)) {
            throw new CHttpException(500, Yii::t('layout', 'Ошибка при отправке почты!'));
        }
        if (!$model->delete()) {
            throw new CHttpException(500, Yii::t('layout', 'Ошибка при удалении аукциона!'));
        }
        Yii::app()->user->setFlash('info', 'Предмет отправлен на почту.');
        $this->redirect('/auction/index');
        Yii::app()->end();
    }
}