--- /dev/null
+<?php
+
+namespace yii_app\actions\bonus;
+
+use yii\base\Action;
+use yii\data\ActiveDataProvider;
+use yii\helpers\ArrayHelper;
+use yii_app\records\Sales;
+use yii_app\records\UsersBonus;
+
+class AddBonuses extends Action
+{
+ public function run()
+ {
+ $action = \Yii::$app->request->post('action');
+
+ $query = Sales::find()
+ ->leftJoin('users_bonus us', 'us.check_id = sales.id')
+ ->leftJoin('users u', 'u.phone::bigint = sales.phone')
+ ->andWhere(['operation' => Sales::OPERATION_SALE])
+ ->andWhere(['>=', 'sales.date', '2024-04-27'])
+ ->andWhere(['!=', 'sales.phone', '0'])
+ ->andWhere(['is not', 'u.id', null])
+ ->andWhere(['not in', 'sales.id', ArrayHelper::getColumn(Sales::find()->andWhere(['operation' => Sales::OPERATION_RETURN])->all(), 'sales_check')])
+ ->andWhere(['us.check_id' => null]);
+
+ $query->addSelect(['sales.*',
+ new \yii\db\Expression('CASE WHEN (
+ SELECT true
+ FROM sales s2
+ WHERE s2.phone = sales.phone
+ AND s2.date < sales.date
+ order by s2.date asc
+ limit 1
+ ) THEN false ELSE true END AS is_first')
+ ]);
+
+
+ if ($action == 'showPlus') {
+
+ $query->addSelect(['sales.*',
+ new \yii\db\Expression('CASE WHEN EXISTS (
+ SELECT 1
+ FROM users_bonus us
+ WHERE us.phone::int = sales.phone
+ AND us.check_id = sales.id
+ ) THEN TRUE ELSE FALSE END AS is_success')
+ ]);
+ }
+
+ if ($action == 'applyPlus') {
+
+ $sales = $query->all();
+
+ foreach ($sales as $sale) {
+ if ($sale->is_first) {
+ $twentyPercent = new UsersBonus();
+ $twentyPercent->phone = strval($sale->phone);
+ $twentyPercent->date = date('Y-m-d H:i:s');
+ $twentyPercent->site_id = 1;
+ $twentyPercent->setka_id = 1;
+ $twentyPercent->tip = 'plus';
+ $twentyPercent->tip_sale = 'sale';
+ $twentyPercent->check_id = $sale->id;
+ $twentyPercent->price = $sale->summ;
+ $twentyPercent->admin_id = 1294;
+ $twentyPercent->store_id = $sale->store_id;
+ $twentyPercent->date_start = $sale->date;
+ $twentyPercent->name = "Возврат с покупки 20%. Чек " . $sale->number . " от "
+ . date("d.m.Y H:i:s", strtotime($sale->date)) . ". Сумма чека " . $sale->summ;
+ $sale->date = date('Y-m-d H:i:s');
+ $twentyPercent->bonus = floor($sale->summ * 0.2);
+ $twentyPercent->date_end = date('Y-m-d H:i:s', strtotime('+90 day', strtotime($sale->date)));
+ $twentyPercent->save();
+ }
+
+ $userBonus = new UsersBonus();
+ $userBonus->phone = strval($sale->phone);
+ $userBonus->name = "Возврат с покупки 10%. Чек " . $sale->number . " от "
+ . date("d.m.Y H:i:s", strtotime($sale->date)) . ". Сумма чека " . $sale->summ;
+ $userBonus->date = date('Y-m-d H:i:s');
+ $userBonus->site_id = 1;
+ $userBonus->setka_id = 1;
+ $userBonus->tip = 'plus';
+ $userBonus->tip_sale = 'sale';
+ $userBonus->check_id = $sale->id;
+ $userBonus->price = $sale->summ;
+ $userBonus->admin_id = 1294;
+ $userBonus->store_id = $sale->store_id;
+ $userBonus->bonus = floor($sale->summ * 0.1);
+ $userBonus->date_start = $sale->date;
+ $userBonus->date_end = date('Y-m-d H:i:s', strtotime('+365 day', strtotime($userBonus->date)));
+ $userBonus->save();
+ }
+ }
+
+ $dataProvider = new ActiveDataProvider([
+ 'query' => $query,
+ 'pagination' => false,
+ ]);
+
+ return $this->controller->render('add-bonuses', [
+ 'action' => $action,
+ 'dataProvider' => $dataProvider
+ ]);
+ }
+}
+
+
+
--- /dev/null
+<?php
+
+use yii\grid\GridView;
+use \yii\helpers\Html;
+use \yii\widgets\ActiveForm;
+
+/** @var $action string */
+/** @var $dataProvider */
+
+?>
+
+<?php $columns = array(
+ ['class' => 'yii\grid\SerialColumn'],
+
+ [
+ 'attribute' => 'date',
+ 'format' => 'date',
+ 'label' => 'Дата',
+ ],
+ [
+ 'attribute' => 'number',
+ 'format' => 'raw',
+ 'label' => 'Номер чека',
+ ],
+ [
+ 'attribute' => 'phone',
+ 'label' => 'Пользователь',
+ ],
+ [
+ 'attribute' => 'summ',
+ 'label' => 'Сумма',
+ ],
+ [
+ 'attribute' => 'is_first',
+ 'label' => 'Это первая покупка?',
+ 'value' => function ($data) {
+ return $data['is_first'] ? 'Да' : 'Нет';
+ }
+ ],
+ [
+ 'attribute' => 'bonus_type',
+ 'label' => 'Сколько процентов?',
+ 'value' => function ($data) {
+ return $data['is_first'] ? '10 + 20' : '10';
+ }
+ ],
+ [
+ 'attribute' => 'bonus_type',
+ 'label' => 'Сколько начисляем?',
+ 'value' => function ($data) {
+ return $data['is_first'] ? $data->summ * 0.1 . " + " . $data->summ * 0.2 : $data->summ * 0.1;
+ }
+ ]
+);
+
+?>
+
+
+<div class="bonusAdd m-5">
+
+ <?php ActiveForm::begin() ?>
+
+ <?= Html::submitButton('Показать кому начислять', ['class' => 'btn btn-success btn-lg', 'name' => 'action', 'value' => 'showPlus']) ?>
+
+ <?= Html::submitButton('Начислить', ['class' => 'btn btn-warning btn-lg', 'name' => 'action', 'value' => 'applyPlus']) ?>
+
+ <?php ActiveForm::end() ?>
+ <pre>
+
+<!-- --><?php //= Html::label("Начисляем: $dataProvider->count"); ?>
+
+ <?= GridView::widget([
+ 'dataProvider' => $dataProvider,
+ 'columns' => $columns,
+ ]);; ?>
+ </pre>
+</div>