first(); return $taxiOrder; } /** * Получение адресов офисов для подстановки в запросы такси * * @return array */ public function getOfficeAddress() { $taxiAddress = TaxiModels\OfficeAddress::all(); return $taxiAddress; } /** * Получение всех активных заказов * * @return array */ public function getActiveOrders() { $todaydate = new DateTime(); $todaydate->setTime(00, 00, 00); $todaydate = $todaydate->format('Y-m-d'); $orders = TaxiModels\TaxiMain::where('taxi_date', '>=', $todaydate) ->get(); return $orders; } /** * Метод получения заказов по условиям фильтра * * @param Request $rqst запрос с параметрами поиска * @return string */ public function getFilterOrders(Request $rqst) { $rqstCond = []; foreach ($rqst->all() as $fieldName => $fieldVal) { if (!$fieldVal) continue; $rqstCond[] = [$fieldName, '=', $fieldVal]; } $filterRqst = TaxiModels\TaxiMain::where($rqstCond)->get(); return json_encode($filterRqst->toArray()); } //ГАВРИЛОВ используй транзакцию, а то создается запрос, не отправляется письмо и сообщение об ошибке /** * Show the form for creating a new resource. */ public function createTaxiOrder(TaxiOrderRequest $rqst) { $validateData = TaxiOrderDTO::setTaxiOrderDTO($rqst, $rqst->method()); //Пытаемся найти уже существующий запрос на этот же логин и эту же дату. Если запрос найден, возвращаем ошибку. $searchExistsOrder = TaxiModels\TaxiMain::where([ ['emp_login', '=', $validateData->emp_login], ['taxi_date', '=', $validateData->taxi_date] ])->take(1)->get(); if (count($searchExistsOrder)) { return response()->json(['message' => "Ошибка! Заявка для сотрудника $validateData->emp_login на дату $validateData->taxi_date уже существует"], 400); } // $createRqstMsg; try { $newOrderId = (new TaxiModels\TaxiMain())->createOrder($validateData); //$newOrderId = $this->orderService->createOrder($validateData); $createRqstMsg = "Заявка успешно создана. Номер $newOrderId"; #Гаврилов //ПРОВЕРЬ, ЧТОБЫ ПИСЬМО НЕ ОТПРАВЛЯЛОСЬ, ЕСЛИ ВОЗНИКАЕТ ОШИБКА НА ЭТАПЕ СОЗДАНИЯ ЗАЯВКИ //Один метод отправки письма для всех методов работы с заказом: создание, редактирование, отмена $this->sendMailService->sendMail(new NewOrderMail($validateData, $newOrderId)); // SendMailNewOrder::dispatch(json_decode(json_encode($validateData), true), $newOrderId)->onQueue('emails')->delay(10); // Mail::send(new Mailer( // [$validateData->emp_login], // 'Создание заказа на такси', // "Для вас создана заявка на заказ такси на дату {$validateData->taxi_date} и время {$validateData->taxi_time}. Номер заказа {$newOrderId}", // #Гаврилов // //ЗДЕСЬ НЕПОНЯТНО ОТКУДА ВЗЯТЬ ЗНАЧЕНИЕ. ОБРАТИТЬСЯ К ЛОКАЛЬНО МОДУЛЬНОМУ ENV? // config('taxi.name_ru'), // )); return response()->json( ['message' => "Заявка успешно создана. Номер заявки $newOrderId"] ); } catch (\Throwable $t) { #Гаврилов //ОТПРАВКА СООБЩЕНИЯ С ОШИБКОЙ. ЗАТЕСТИ и отправляй response //ОШИБКИ $T->GETmESSAGE НУЖНО ЛОГИРОВАТЬ, НО ПОЛЬЗОВАТЕЛЯМ ВЫВОДИТЬ ПРОСТО СООБЩЕНИЕ оШИБКА, ИНАЧЕ ОНИ ВИДЯТ ТЕХН ЧЕСКИЙ ТЕКСТ //СНАЧАЛА ПЕРЕХВАТЫЙ EXCEPTION, ПОТОМ УЖЕ THOWBLE. EXCEPTION ВЫВОДИ ПОЛЬЗОВАТЕЛЮ, THORWBLE ЛОГИРУЙ ОТДЕЛЬНО echo '
'; var_dump($t->getMessage()); echo''; echo '
'; var_dump($t->getTrace()); echo''; $createRqstMsg = "Ошибка!" . $t->getMessage() . ". Заявка не создана"; return response()->json(['message' => $createRqstMsg], 400); } //ГАВРИЛОВ //ДОБАВЬ ФОРМИРОВАНИЕ ОТВЕТА ЧЕРЕЗ ГЕНЕРАЦИЮ РЕСУРСА, а не через response() } #Гаврилов //ИСПОЛЬЗУЙ TaxiOrderRequest ПРИ ОБРАБОТКЕ ЗАЯВОК НА ТАКСИ /** * Метод отмены запроса * * @param integer $rqstId идентификатор запроса * @return string */ public function cancelRqst(int $rqstId): string { #Гаврилов //ПОПРОБУЙ ОТПРАВИТЬ ЗАПРОС К API ЕНДПОИНТУ (ОТМЕНА ЗАПРОСА НА ТАКСИ) ЧЕРЕЗ POSTMAN С ПЕРЕДАЧЕЙ ЗАГОЛОВКА АУТЕНТИФИКАЦИИ С SANCTUM ТОКЕНОМ. ДОЛЖЕН ПРОПУСТИТЬ, А БЕЗ ЗАГОЛОВКА НЕ ДОЛЖЕН $rqstData = $this->getOrderById($rqstId); try { #Гаврилов //ПЕРЕНЕСИ ЭТУ ПРОВЕРКУ В РОУТИНГ? FINDORFAIL С РЕДИРЕКТОМ И ОШИБКОЙ if (!$rqstData) { throw new \Exception("Запрос $rqstId не существует"); } if (!$this->checkRqstDate($rqstData->taxi_date)) { throw new \Exception("Дата запроса $rqstId уже прошла"); } } catch (\Throwable $t) { return response()->json([ 'errorMsg' => "Ошибка: $t->getMessage(). Заявка не отменена", ], 400); } $rqstData['cancel_rqst'] = 1; $rqstData->save(); $this->sendMailService->sendCancelOrderMail($validateData, $newOrderId); // Mail::send(new Mailer( // [$rqstData->emp_login], // 'Отмена заказа на такси', // "Заказ номер $rqstId на дату $rqstData->taxi_date и время $rqstData->taxi_time отменен", // $this->appName)); return redirect('/taxi/home')->with([ 'notification' => "Запрос $rqstId отменен", 'notification_err' => false ]); } /** * Проверяем находится ли дата запроса на такси в диапазоне сегодняшнего или завтрашнего дня. * * @param string $rqstDate дата запроса на такси * @return boolean */ private function checkRqstDate($rqstDate): bool { $todaydate = new DateTime(); $todaydate->setTime(00, 00, 00); return new DateTime($rqstDate) >= $todaydate; } /** * Получаем временные промежутки * * @return array */ public function getTimePeriods() { $empAllData = TaxiModels\TaxiTimePeriod::select('time_period', 'is_morning_time') ->where('archive', 0) ->get(); return $empAllData; } /** * Метод получает информацию по всем активным пользователям * * @return array */ public function getActiveUsersInfo() { $empAllData = OldMagicModels\CcEmp::whereIn('emp_area', ['Курск', 'Пенза']) ->whereNotIn('emp_state', ['Уволен', 'Декрет', 'Перевод на позицию', 'Перевод в ГРАН']) ->get(); foreach ($empAllData as &$empData) { $empData['full_name'] = $empData['emp_surname'] . " " . $empData['emp_name'] . " " . $empData['emp_surname']; $empData['extension_number'] = $empData['emp_phone']; $empData['emp_phone'] = $empData['emp_mob_phone']; } return $empAllData; } /** * Метод получает информацию по конкретному пользователю * * @return array */ public function getUserInfoByLogin(string $userLogin) { $empLoginData = OldMagicModels\CcEmp::where('emp_login', $userLogin) ->get(); // dd($empLoginData); $empLoginData[0]['full_name'] = $empLoginData[0]['emp_surname'] . " " . $empLoginData[0]['emp_name'] . " " . $empLoginData[0]['emp_surname']; $empLoginData[0]['extension_number'] = $empLoginData[0]['emp_phone']; $empLoginData[0]['emp_phone'] = $empLoginData[0]['emp_mob_phone']; return $empLoginData; } #Гаврилов //НЕ ЗАБУДЬ УДАЛИТЬ public function testRedisMethod() { RedisNotifications::module('taxi') ->notifications(['текст1', 'tеуые2']) ->types(['error', 'success']) ->put(); } /** * Обновление заявки на такси * * @param TaxiOrderRequest $rqst информация по измененному запросу * @return response */ public function updateTaxiOrder(TaxiOrderRequest $rqst) { try { DB::beginTransaction(); #Гаврилов //ЕЩЕ РАЗ, ЧТО ЗА LOCKFORUPDATE $orderData = TaxiModels\TaxiMain::lockForUpdate()->find($rqst->id); $oldOrderData = TaxiModels\TaxiMain::find($rqst->id); if (!$orderData) { throw new Exception("Заказ номер " . $rqst->id . " не найден"); //return response()->json(['message' => 'Заказ номер ' . $rqst->id . ' не найден'], 400); } $editOrderData = TaxiOrderDTO::setTaxiOrderDTO($rqst, $rqst->method()); #Гаврилов //НА ДОМАШНЕЙ СТРАНИЦЕ ПОКАЗЫВАТЬ ТОЛЬКО ТЕ ЗАПРОСЫ, ДАТА КОТОРЫХ СЕГОДНЯ ИЛИ ЗАВТРА $dateInterval = (new DateTime())->diff(new DateTime($orderData->taxi_date)); if ($dateInterval->format('%R') == '-' && $dateInterval->format('%a') >= 1) { throw new Exception("Нельзя менять заявки, дата которых уже прошла"); // return response()->json(['message' => 'Нельзя менять заявки, дата которых уже прошла'], 400); } foreach($editOrderData as $fieldName => $fieldVal) { if (isset($orderData->$fieldName)) { $orderData[$fieldName] = $fieldVal; } } $orderDataDiff = $orderData->getDirty(); if (empty($orderDataDiff)) { throw new Exception("Вы не внесли никаких изменений"); //return response()->json(['message' => 'Вы не внесли никаких изменений'], 400); } $orderData->save(); $this->sendMailService->sendEditOrderMail($oldOrderData->toArray(), $orderDataDiff, $orderData['id']); DB::commit(); return response()->json(['message' => 'Заявка успешно изменена'], 200); } catch (\Exception $e) { DB::rollBack(); return response()->json(['message' => "Ошибка." . $e->getMessage() . ". Не удалось обновить заявку"], 400); } //ГАВРИЛОВ. ДОБАВЬ БЛОКИРОВКУ В МОМЕНТ ПОЛУЧЕНИЯ ДАННЫХ ПО РЕДАКТИРУЕМОМУ ЗАПРОСУ И ДО МОМЕНТА ЕГО ОБНОВЛЕНИЯ. ЛИБО ЧЕРЕЗ УСТАНОВКУ УРОВНЯ ИЗОЛЯЦИИ //ГАВРИЛОВ. ДОБАВЬ В DTO НЕ ОБНУЛЕНИЕ НЕНУЖНЫХД ДАННЫХ, А ПРИНУДИТЕЬНАЯ ИХ УСТАНОВКА. НАПРИМЕР ПРИ ОБНОВЛЕНИИ ЗАПРОСА НА ТАКСИ, УСТАНАВЛИВАТЬ EMP_LOGIN = ПЕРЕДАННОМУ ЗНАЧЕНИЮ, ВЗЯТОМУ ИЗ СУЩЕСТВУЮЩЕГО ЗАПРОСА. //Обновляем текущую модель, добавляя туда измененные значения, затем проверяем есть ли измененные значения через getDirty() //ГАВРИЛОВ. убрать поле Запрос актуален? и при отмене заявки убирать ее из таблицы Активные заявки //гаврилов. СДЕЛАТЬ ВОЗМОЖНОСТЬ ВЫГРУЗИТЬ В ОТЧЕТНОСТЬ ВСЕ ИМЕЮЩИЕСЯ ЗАЯВКИ В CSV ФАЙЛ. } }