From 6c2516a35c874896b3d95161b1477642529c88a8 Mon Sep 17 00:00:00 2001 From: marina Date: Tue, 22 Jul 2025 11:30:32 +0300 Subject: [PATCH] =?utf8?q?ERP-438=20=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?utf8?q?=D1=82=D0=BA=D0=B0=20=D1=8D=D0=BD=D0=B4=D0=BF=D0=BE=D0=B9=D0=BD?= =?utf8?q?=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- erp24/api2/controllers/ClientController.php | 136 +++++++++++--------- 1 file changed, 76 insertions(+), 60 deletions(-) diff --git a/erp24/api2/controllers/ClientController.php b/erp24/api2/controllers/ClientController.php index 98805937..31ba2e64 100644 --- a/erp24/api2/controllers/ClientController.php +++ b/erp24/api2/controllers/ClientController.php @@ -694,41 +694,56 @@ class ClientController extends BaseController 'pages' => ['totalCount' => (int)$pages->totalCount, 'page' => $pages->page, 'per-page' => $pages->pageSize] ]]); } - public function actionUseBonuses() { Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; - $clientId = Yii::$app->request->getQueryParam('client_id'); - $orderId = Yii::$app->request->getQueryParam('order_id'); - $clientPhone = Yii::$app->request->getQueryParam('client_phone'); - $pointsToAdd = Yii::$app->request->getQueryParam('points_to_add'); - $comment = Yii::$app->request->getQueryParam('comment'); + $data = json_decode(Yii::$app->request->getRawBody(), true); + $clientId = $data['client_id'] ?? null; + $orderId = $data['order_id'] ?? null; + $phone = $data['phone'] ?? null; + $pointsToUse = $data['points_to_use'] ?? null; + $comment = $data['comment'] ?? null; - $sale = Sales::findOne(['number' => $orderId]); + if (!$clientId || !$orderId || !$phone || !$pointsToUse) { + return $this->asJson(['error' => ['code' => 400, 'message' => 'Недостаточно параметров']]); + } + $sale = Sales::findOne(['number' => $orderId]); if (!$sale) { return $this->asJson(['error' => ['code' => 404, 'message' => 'Продажа не найдена']]); } - $bonusAmount = $pointsToAdd !== null ? (int)$pointsToAdd : floor($sale->summ * 0.1); + if (UsersBonus::findOne(['user_id' => $clientId, 'check_id' => $sale->id, 'phone' => $phone, 'tip' => 'minus'])) { + return $this->asJson([ + 'response' => [ + 'code' => 200, + 'status' => 'success', + 'data' => 'Бонусы за этот заказ уже списаны' + ] + ]); + } $userBonus = new UsersBonus(); - $userBonus->phone = strval($sale->phone); - $userBonus->name = $comment ?: ("Возврат с покупки 10%. Чек " . $sale->number . " от " . - date("d.m.Y H:i:s", strtotime($sale->date)) . ". Сумма чека " . $sale->summ); + $userBonus->phone = $phone; + $userBonus->name = $comment ?? sprintf( + 'Возврат с покупки 10%%. Чек %s от %s. Сумма чека %s', + $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 = 'minus'; $userBonus->tip_sale = 'sale'; + $userBonus->user_id = $clientId; $userBonus->check_id = $sale->id; $userBonus->price = $sale->summ; - $userBonus->admin_id = Yii::$app->user->id ?? null; $userBonus->store_id = $sale->store_id; - $userBonus->bonus = $bonusAmount; + $userBonus->bonus = $pointsToUse; $userBonus->date_start = $sale->date; - $userBonus->date_end = date('Y-m-d H:i:s', strtotime('+365 day', strtotime($userBonus->date))); + $userBonus->date_end = date('Y-m-d H:i:s', strtotime('+365 day', strtotime($sale->date))); try { if (!$userBonus->save()) { @@ -738,11 +753,9 @@ class ClientController extends BaseController return $this->asJson(['error' => ['code' => 500, 'message' => 'Ошибка при сохранении бонуса: ' . $ex->getMessage()]]); } - $totalBonus = UsersBonus::find() - ->select([ - new \yii\db\Expression("SUM(CASE WHEN tip = 'plus' THEN bonus ELSE 0 END) - SUM(CASE WHEN tip = 'minus' THEN bonus ELSE 0 END) AS total") - ]) - ->where(['phone' => $clientPhone]) + $totalBonus = (int)UsersBonus::find() + ->select([new \yii\db\Expression("SUM(CASE WHEN tip = 'plus' THEN bonus ELSE 0 END) - SUM(CASE WHEN tip = 'minus' THEN bonus ELSE 0 END)")]) + ->where(['phone' => $phone]) ->scalar(); return $this->asJson([ @@ -752,8 +765,8 @@ class ClientController extends BaseController 'data' => [ 'client_id' => $clientId, 'order_id' => $orderId, - 'addedPoints' => $bonusAmount, - 'totalPoints' => (int)$totalBonus, + 'addedPoints' => $pointsToUse, + 'remainingPoints' => $totalBonus ] ] ]); @@ -763,36 +776,42 @@ class ClientController extends BaseController { Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; - $clientId = Yii::$app->request->getQueryParam('client_id'); - $orderId = Yii::$app->request->getQueryParam('order_id'); - $clientPhone = Yii::$app->request->getQueryParam('client_phone'); - $pointsToAdd = Yii::$app->request->getQueryParam('points_to_add'); - $comment = Yii::$app->request->getQueryParam('comment'); + $data = json_decode(Yii::$app->request->getRawBody(), true); + $clientId = $data['client_id'] ?? null; + $orderId = $data['order_id'] ?? null; + $phone = $data['phone'] ?? null; + $pointsToAdd = $data['points_to_add'] ?? null; + $comment = $data['comment'] ?? null; + + if (!$clientId || !$orderId || !$phone || !$pointsToAdd) { + return $this->asJson(['error' => ['code' => 400, 'message' => 'Недостаточно параметров']]); + } $sale = Sales::findOne(['number' => $orderId]); - if (!$sale) { return $this->asJson(['error' => ['code' => 404, 'message' => 'Продажа не найдена']]); } - $bonusAmount = $pointsToAdd !== null ? (int)$pointsToAdd : floor($sale->summ * 0.1); - $userBonus = new UsersBonus(); - $userBonus->phone = strval($sale->phone); - $userBonus->name = $comment ?: ("Возврат с покупки 10%. Чек " . $sale->number . " от " . - date("d.m.Y H:i:s", strtotime($sale->date)) . ". Сумма чека " . $sale->summ); + $userBonus->phone = $phone; + $userBonus->name = $comment ?? sprintf( + 'Возврат с покупки 10%%. Чек %s от %s. Сумма чека %s', + $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->user_id = $clientId; $userBonus->check_id = $sale->id; $userBonus->price = $sale->summ; - $userBonus->admin_id = Yii::$app->user->id ?? null; $userBonus->store_id = $sale->store_id; - $userBonus->bonus = $bonusAmount; + $userBonus->bonus = $pointsToAdd; $userBonus->date_start = $sale->date; - $userBonus->date_end = date('Y-m-d H:i:s', strtotime('+365 day', strtotime($userBonus->date))); + $userBonus->date_end = date('Y-m-d H:i:s', strtotime('+365 day', strtotime($sale->date))); try { if (!$userBonus->save()) { @@ -802,11 +821,9 @@ class ClientController extends BaseController return $this->asJson(['error' => ['code' => 500, 'message' => 'Ошибка при сохранении бонуса: ' . $ex->getMessage()]]); } - $totalBonus = UsersBonus::find() - ->select([ - new \yii\db\Expression("SUM(CASE WHEN tip = 'plus' THEN bonus ELSE 0 END) - SUM(CASE WHEN tip = 'minus' THEN bonus ELSE 0 END) AS total") - ]) - ->where(['phone' => $clientPhone]) + $totalBonus = (int)UsersBonus::find() + ->select([new \yii\db\Expression("SUM(CASE WHEN tip = 'plus' THEN bonus ELSE 0 END) - SUM(CASE WHEN tip = 'minus' THEN bonus ELSE 0 END)")]) + ->where(['phone' => $phone]) ->scalar(); return $this->asJson([ @@ -816,8 +833,8 @@ class ClientController extends BaseController 'data' => [ 'client_id' => $clientId, 'order_id' => $orderId, - 'addedPoints' => $bonusAmount, - 'totalPoints' => (int)$totalBonus, + 'addedPoints' => $pointsToAdd, + 'totalPoints' => $totalBonus ] ] ]); @@ -831,17 +848,16 @@ class ClientController extends BaseController $clientId = $data['client_id'] ?? null; $phone = $data['phone'] ?? null; - if (empty($clientId) || empty($phone)) { - return $this->asJson(['error' => ['code' => 400, 'message' => 'Uncorrect params']]); + if (!$clientId || !$phone) { + return $this->asJson(['error' => ['code' => 400, 'message' => 'Недостаточно параметров']]); } $user = UsersBonus::find() - ->andFilterWhere(['id' => $clientId]) - ->andFilterWhere(['phone' => $phone]) + ->where(['id' => $clientId, 'phone' => $phone]) ->one(); if (!$user) { - return $this->asJson(['error' => ['code' => 404, 'message' => 'User not found']]); + return $this->asJson(['error' => ['code' => 404, 'message' => 'Пользователь не найден']]); } $bonusLevel = UsersBonusLevels::find() @@ -849,7 +865,7 @@ class ClientController extends BaseController ->select([ 'bl.name as bonus_level', 'bl.bonus_rate as discount_percent', - 'bl.current_points', + 'bl.threshold as current_points', 'bl.id as level_id' ]) ->leftJoin('bonus_levels bl', 'bl.alias = ubl.bonus_level AND bl.active = 1') @@ -858,24 +874,24 @@ class ClientController extends BaseController ->one(); if (!$bonusLevel) { - return $this->asJson(['error' => ['code' => 404, 'message' => 'Bonus level not found']]); + return $this->asJson(['error' => ['code' => 404, 'message' => 'Уровень бонусов не найден']]); } $nextLevel = BonusLevels::find() - ->select(['current_points as next_points']) + ->select(['threshold as next_points']) ->where(['id' => $bonusLevel['level_id'] + 1, 'active' => 1]) ->asArray() ->one(); - $data = [ - 'client_id' => $clientId, - 'bonus_level' => $bonusLevel['bonus_level'], - 'current_points' => $bonusLevel['current_points'], - 'next_points' => $nextLevel['next_points'] ?? null, - 'discount_percent' => $bonusLevel['discount_percent'], - ]; - - return $this->asJson(['response' => $data]); + return $this->asJson([ + 'response' => [ + 'client_id' => $clientId, + 'bonus_level' => $bonusLevel['bonus_level'], + 'current_points' => $bonusLevel['current_points'], + 'next_points' => $nextLevel['next_points'] ?? null, + 'discount_percent' => $bonusLevel['discount_percent'] + ] + ]); } public function actionMemorableDates() -- 2.39.5