From bd6e96d1321818e302a43b11e0924ad529365711 Mon Sep 17 00:00:00 2001 From: Rustem Date: Sat, 22 Feb 2025 20:06:12 +0500 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B0=D0=BF=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/MobileApiController.php | 145 ++++++++++++++++--- routes/api.php | 2 + 2 files changed, 130 insertions(+), 17 deletions(-) diff --git a/app/Http/Controllers/MobileApiController.php b/app/Http/Controllers/MobileApiController.php index 2d59aee..d695b69 100644 --- a/app/Http/Controllers/MobileApiController.php +++ b/app/Http/Controllers/MobileApiController.php @@ -5,6 +5,8 @@ namespace App\Http\Controllers; use A7kz\Platform\Models\UniModel; use A7kz\Platform\Modules\Platform\Segment\Facades\Segment; use App\Modules\applications\Enum\ApplicationStatus; +use App\Modules\auto\Enums\AutoStatusEnums; +use Carbon\CarbonPeriod; use Exception; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -14,6 +16,7 @@ use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Notification; use Illuminate\Support\Facades\Storage; use Mpdf\Tag\Mark; +use function PHPUnit\Framework\isEmpty; class MobileApiController extends Controller { @@ -26,6 +29,7 @@ class MobileApiController extends Controller foreach ($marks as $mark) { $brand = UniModel::model('pipi_auto_brands')->find($mark->brand_id); $tariffs = UniModel::model('pipi_auto_tariffs')->where('model_id', $mark->id)->get(); + $equipment = UniModel::model('pipi_auto_equipment')->where('id', $mark->equipment_id)->first(); if ($mark->name != 'Ввод остатков') { foreach ($tariffs as $tariff) { $tariffs_new[$tariff?->day_range_start . '-' . $tariff->day_range_end] = [ @@ -36,11 +40,12 @@ class MobileApiController extends Controller ]; } $data[$mark->name . '-' . $mark->year] = [ - 'id' => $mark->id, - 'brand' => $brand->name, - 'mark' => $mark->name, - 'year' => $mark->year, - 'tariffs' => $tariffs_new + 'id' => $mark->id, + 'brand' => $brand->name, + 'mark' => $mark->name, + 'year' => $mark->year, + 'configuration' => $equipment?->name, + 'tariffs' => $tariffs_new ]; } } @@ -70,6 +75,34 @@ class MobileApiController extends Controller } } + + $response = [ + 'status' => 'OK', + 'message' => 'Заявка создана', + ]; + + if ($authToken) { + $car = $this->getAvailableCar($data['started_at'], $data['ended_at'], $data['mark_id']); + if (isEmpty($car)) { + return response()->json('Нет свободных машин'); + } + $period = CarbonPeriod::create($data['started_at'], $data['ended_at']); + + $dates = array_map(fn($date) => $date->toDateString(), iterator_to_array($period)); + + foreach ($dates as $date) { + UniModel::model('pipi_auto_calendar')->create([ + 'auto_id' => $car->id, + 'date' => $date, + 'status' => AutoStatusEnums::Rent->name + ]); + } + $response['auth_token'] = $authToken; + $response['message'] = 'Заявка создана, и вы были автоматически авторизованы'; + } elseif (!isset($data['user_id'])) { + $response['message'] = 'Заявка создана, с вами свяжется наш оператор'; + } + UniModel::model('pipi_applications')->create([ 'rent_day' => $data['rent_day'], 'started_at' => $data['started_at'], @@ -83,18 +116,6 @@ class MobileApiController extends Controller 'status' => ApplicationStatus::pending->value ]); - $response = [ - 'status' => 'OK', - 'message' => 'Заявка создана', - ]; - - if ($authToken) { - $response['auth_token'] = $authToken; - $response['message'] = 'Заявка создана, и вы были автоматически авторизованы'; - } elseif (!isset($data['user_id'])) { - $response['message'] = 'Заявка создана, с вами свяжется наш оператор'; - } - return response()->json($response); } @@ -126,4 +147,94 @@ class MobileApiController extends Controller return response()->json(['error' => 'Unauthorized'], 401); } } + + public function checkAvailableCar($started_at = null, $ended_at = null, $modelId = null): bool { + if (!$started_at || !$ended_at || !$modelId) { + $request = request(); + $started_at = $started_at ?? $request->input('started_at'); + $ended_at = $ended_at ?? $request->input('ended_at'); + $modelId = $modelId ?? $request->input('model_id'); + } + + if (!$started_at || !$ended_at || !$modelId) { + return false; + } + + $started_at = Carbon::parse($started_at)->format('Y-m-d'); + $ended_at = Carbon::parse($ended_at)->format('Y-m-d'); + $cars = UniModel::model('pipi_auto')->where('model_id', $modelId)->get(); + $busyCars = UniModel::model('pipi_auto_calendar') + ->whereBetween('date', [$started_at, $ended_at]) + ->pluck('auto_id') + ->toArray(); + + $availableCars = $cars->reject(fn($car) => in_array($car->id, $busyCars)); + + return $availableCars->isNotEmpty(); + } + + + + public function getAvailableMarksList(Request $request): JsonResponse + { + $started_at = $request->query('started_at'); + $ended_at = $request->query('ended_at'); + + $marks = UniModel::model('pipi_brand_models')->get(); + $availableMarks = []; + + foreach ($marks as $mark) { + if ($mark->name === 'Ввод остатков') { + continue; + } + + if (!$this->checkAvailableCar($started_at, $ended_at, $mark->id)) { + continue; + } + + $brand = UniModel::model('pipi_auto_brands')->find($mark->brand_id); + $tariffs = UniModel::model('pipi_auto_tariffs')->where('model_id', $mark->id)->get(); + $equipment = UniModel::model('pipi_auto_equipment')->where('id', $mark->equipment_id)->first(); + + $tariffs_new = []; + foreach ($tariffs as $tariff) { + $tariffs_new[$tariff?->day_range_start . '-' . $tariff->day_range_end] = [ + 'name' => $tariff?->name, + 'price' => $tariff?->base_rate, + 'min' => $tariff?->day_range_start, + 'max' => $tariff?->day_range_end, + ]; + } + + $availableMarks[$mark->name . '-' . $mark->year] = [ + 'id' => $mark->id, + 'brand' => $brand->name ?? null, + 'mark' => $mark->name, + 'year' => $mark->year, + 'configuration' => $equipment?->name, + 'tariffs' => $tariffs_new, + ]; + } + + return response()->json($availableMarks); + } + + public function getAvailableCar($started_at, $ended_at, $modelId) + { + $started_at = Carbon::parse($started_at)->format('Y-m-d'); + $ended_at = Carbon::parse($ended_at)->format('Y-m-d'); + $cars = UniModel::model('pipi_auto')->where('model_id', $modelId)->get(); + $busyCars = UniModel::model('pipi_auto_calendar') + ->whereBetween('date', [$started_at, $ended_at]) + ->pluck('auto_id') + ->toArray(); + + $availableCars = $cars->reject(fn($car) => in_array($car->id, $busyCars)); + + if ($availableCars->isNotEmpty()) { + return $availableCars->first(); + } else { + return (object) []; + } + } } diff --git a/routes/api.php b/routes/api.php index 9b5e701..cec876e 100644 --- a/routes/api.php +++ b/routes/api.php @@ -25,6 +25,8 @@ Route::prefix('1c')->group(function () { Route::prefix('mobile')->group(function () { Route::get('getMarks', [MobileApiController::class, 'getMarks']); + Route::get('getAvailableMarksList', [MobileApiController::class, 'getAvailableMarksList']); + Route::post('checkAvailableCar', [MobileApiController::class, 'checkAvailableCar']); Route::post('sendApplication', [MobileApiController::class, 'sendApplication']); Route::post('getApplications', [MobileApiController::class, 'getApplications']); Route::post('login', [MobileApiController::class, 'login']);