public function getAddBet($id) { // Проверка, является ли текущий пользователь участником $haveAccess = Bidders::where(['user_id' => Auth::user()->id, 'auction_id' => $id, 'status' => 1])->get(); // Экземпляр лота $auction = Auction::find($id); // Список ставок $thisBids = Bets::where('auction_id', '=', $id)->orderBy('created_at', 'desc')->get(); // Если пользователь не является участником - редиректим на главную страницу if ($haveAccess->count() == 0) { return redirect('/auctions'); } else { // Если данный пользователь является последним, кто сделал ставку и пытается сделать ее еще раз - редиректим назад и показываем ошибку if ($thisBids->count() > 0 && $thisBids->first()->user_id == Auth::user()->id) { return redirect()->back()->with('bit_error', 'Ви вже зробили ставку!'); } // Если пользователь не делал ставок, но имеет доступ $bet = new Bets(); // Создаем экземпляр ставки $bet->auction_id = $id; // Указываем id аукциона $bet->user_id = Auth::user()->id; // Указываем id пользователя // Если это первая ставка - складываем стартовую цену и цену за шаг if ($thisBids->count() == 0) { $bet->bet = $auction->starting_price + $auction->bid_price; } else { // Добавляем цену за шаг к последнему ценовому предложению $bet->bet = $thisBids->first()->bet + $auction->bid_price; } // Продлеваем аукцион еще на 15 минут $auction->date_end = Carbon::parse($auction->date_end)->addMinutes(15); $auction->save(); $bet->save(); } // В случае успеха - редиректим назад и передаем flash переменную return redirect()->back()->with('bit_success', '1'); }
<p><i class="icon icon-4"></i>Стан аукціону: <b>{{ trans('theme.statuses.'.$auction->status) }}</b></p> <div class="buttons" style="padding-top: 10px"> <a href="{{action('AuctionsController@getAuctionPageBySlug', ['id' => $auction->id, 'slug' => $auction->slug])}}" class="btn btn-primary">Переглянути лот</a> @if($auction->status == 2)<a href="{{ action('BiddersController@getAddBidder', ['id' => $auction->id]) }}" class="btn btn-warning">Подати заявку</a>@endif {{-- Проверка, имеет ли аукцион статус "Відбуваються торги" --}} @if($auction->status == 3) @if(!Auth::check()) {{-- Если пользователь не авторизован, при нажатии открываем окно для входа --}} <a href="#" data-toggle="modal" data-target="#LoginModal" class="btn btn-warning">Зробити ставку</a> @else <?php // Запрос к списку участников (проверка, имеет ли текущий авторизованных пользователь статус Допущен до аукциона) // Вовзращает: 1 - если текущий пользователь успешно допущен (его заявка одобрена администрацией) // или 0 - если заявка не допущена или пользователь не подавал её вовсе $ee = \App\Bidders::where(['user_id' => Auth::user()->id, 'auction_id' => $auction->id, 'status' => 1])->get(); ?> @if($ee->count() == 1) <a href="#" class="btn btn-warning" data-toggle="modal" data-target="#doBet">Зробити ставку</a> @endif @endif{{-- Auth::check --}} @endif{{-- $auction->status == 3 --}} </div> </div> <div class="col-xs-5"> <p class="b"><i class="icon icon-5"></i>Стартова ціна:</p> <p class="price"><span>{{ number_format($auction->starting_price, 2, ',', ' ') }} грн. </span></p> <p class="date_start"><span><i class="icon icon-6"></i>Дата аукціону:</span><b>{{ Carbon\Carbon::parse($auction->data_start)->format('d.m.Y в H:i') }}</b></p>
public function getDeleteLot($id) { // Удаляем файлы $deleteFiles = App\Uploads::where('auction_id', $id)->get(); if ($deleteFiles->count() > 0) { setlocale(LC_ALL, 'ru_RU.utf8'); foreach ($deleteFiles as $b) { //dd($b); // //$e = substr(strrchr($fname,'.'),1); //$n = preg_replace('/.[^.]*$/', '', $fname); if ($b->type == 'image') { $extension = substr(strrchr($b->name, '.'), 1); $cutName = preg_replace('/.[^.]*$/', '', $b->name); Storage::disk('upload_images')->delete($b->name); Storage::disk('upload_images')->delete($cutName . '-sm.' . $extension); } elseif ($b->type == 'doc') { $fname = pathinfo($b->link); Storage::disk('upload_docs')->delete($fname['basename']); } $b->delete(); } } // Удаляем аукцион $delete = Auction::find($id); $delete->delete(); // Удаляем участников аукциона $deleteBidders = App\Bidders::where('auction_id', $id)->get(); if ($deleteBidders->count() > 0) { foreach ($deleteBidders as $b) { $b->delete(); } } // Удаляем ставки $deleteBets = App\Bets::where('auction_id', $id)->get(); if ($deleteBets->count() > 0) { foreach ($deleteBets as $b) { $b->delete(); } } // Сбрасываем закешированные данные виджета "Останні надходження" if (Cache::has('last_lots')) { Cache::forget('last_lots'); } return redirect()->back(); }
/** * Производит добавление участника */ public function postAddBidder(Request $request, $id) { $messages = array('required' => trans('theme.reg.required'), 'mimes' => trans('theme.reg.mimes'), 'rules_agree.required' => 'Необхідно погодитися з правилами'); $rules = ['first_name' => 'required', 'last_name' => 'required', 'middle_name' => 'required', 'phone' => 'required', 'bank_name' => 'required', 'account_number' => 'required', 'bank_code' => 'required', 'passport_series' => 'required', 'passport_number' => 'required', 'passport_issue' => 'required', 'passport_issued' => 'required', 'adress_postcode' => 'required', 'adress_region' => 'required', 'adress_city' => 'required', 'adress_full' => 'required', 'rules_agree' => 'required', 'file1' => 'required|mimes:jpeg,bmp,png,pdf,doc,docx', 'file2' => 'required|mimes:jpeg,bmp,png,pdf,doc,docx', 'file3' => 'mimes:jpeg,bmp,png,pdf,doc,docx', 'file4' => 'required|mimes:jpeg,bmp,png,pdf,doc,docx']; if ($request->payment_type == 2) { $rules = array_add($rules, 'payment_card', 'required'); $rules = array_add($rules, 'payment_code', 'required'); } if (!Auth::check()) { $rules = array_add($rules, 'email', 'required'); } // Если у пользователя нет отказа от ИНН if (!$request->has('inn_waiver')) { $rules = array_add($rules, 'passport_inn', 'required'); } // Валидатор $this->validate($request, $rules, $messages); $request->flash(); $add = new Bidders(); $add->auction_id = $id; // Если пользователь авторизован if (Auth::check()) { $add->user_id = Auth::user()->id; } else { $createUser = new User(); $createUser->first_name = $request->first_name; $createUser->last_name = $request->last_name; $createUser->middle_name = $request->middle_name; $createUser->email = $request->email; $createUser->phone = $request->phone; $genPass = str_random(8); // Случаные 8 символов в качестве пароля $createUser->password = bcrypt($genPass); $createUser->user_group = 1; // По-умолчанию регистрируется как физическое лицо $createUser->save(); $add->user_id = $createUser->id; $sendTo = $request->email; // Отправка письма об успешной регистрации Mail::send('emails.register', array('first_name' => $request->first_name, 'last_name' => $request->last_name, 'email' => $request->email, 'pass' => $genPass), function ($message) use($sendTo) { $message->to($sendTo)->subject('Успешная регистрация'); }); } // Информация о лице $add->first_name = $request->first_name; $add->last_name = $request->last_name; $add->middle_name = $request->middle_name; $add->phone = $request->phone; $add->dop_phone = $request->dop_phone; // Банковские реквизиты $add->payment_type = $request->payment_type; $add->bank_name = $request->bank_name; // Дополнительные поля при оплате картой if ($request->payment_type == 2) { $add->payment_card = $request->payment_card; $add->payment_code = $request->payment_code; } $add->account_number = $request->account_number; $add->bank_code = $request->bank_code; // Паспортные данные $add->passport_series = $request->passport_series; $add->passport_number = $request->passport_number; $add->passport_issue = $request->passport_issue; $add->passport_issued = $request->passport_issued; // Если у пользователя нет отказа от ИНН if (!$request->has('inn_waiver')) { $add->passport_inn = $request->passport_inn; } // Адрес $add->adress_postcode = $request->adress_postcode; $add->adress_region = $request->adress_region; $add->adress_city = $request->adress_city; $add->adress_full = $request->adress_full; $add->status = 0; $surl = $this->globalSiteSettings['site_url']; // Домен сайта из конфигов // Файл 1 if ($request->hasFile('file1')) { $file1 = $request->file('file1'); $filename = str_random(10) . '.' . $file1->getClientOriginalExtension(); $imgurl = $surl . '/userfiles/' . $filename; $file1->move(public_path() . '/userfiles/', $filename); $add->file1 = $imgurl; } // Файл 2 if ($request->hasFile('file2')) { $file2 = $request->file('file2'); $filename = str_random(10) . '.' . $file2->getClientOriginalExtension(); $imgurl = $surl . '/userfiles/' . $filename; $file2->move(public_path() . '/userfiles/', $filename); $add->file2 = $imgurl; } // Файл 3 if ($request->hasFile('file3')) { $file3 = $request->file('file3'); $filename = str_random(10) . '.' . $file3->getClientOriginalExtension(); $imgurl = $surl . '/userfiles/' . $filename; $file3->move(public_path() . '/userfiles/', $filename); $add->file3 = $imgurl; } // Файл 4 if ($request->hasFile('file4')) { $file4 = $request->file('file4'); $filename = str_random(10) . '.' . $file4->getClientOriginalExtension(); $imgurl = $surl . '/userfiles/' . $filename; $file4->move(public_path() . '/userfiles/', $filename); $add->file4 = $imgurl; } $add->save(); $auction = Auction::find($id); $adminEmail = $this->globalSiteSettings['admin_email']; Mail::send('emails.admin-new-bidder', ['lot_title' => $auction->title, 'lot_id' => $auction->id], function ($message) use($adminEmail) { $message->to($adminEmail)->subject('Новий учасник'); }); if (!Auth::check()) { Auth::loginUsingId($createUser->id); } Session::flash('gAnalyticsReachGoal', 'NEW_BIDDER'); Session::flash('YaMetrikaReachGoal', 'NEW_BIDDER'); // Отправка данных о достижении цели в Яндекс Метрику return redirect('/auctions')->with('success_bidders_add', 'Ваша заявка успішно додано. Після перевірки даних адміністрацією, вона буде допущена до системи.'); }
/** * Define the application's command schedule. * * @param \Illuminate\Console\Scheduling\Schedule $schedule * @return void */ protected function schedule(Schedule $schedule) { $schedule->command('inspire')->hourly(); $schedule->call(function () { // Ищем аукционы, дата завершения которых подошла к концу $auctionsEnd = Auction::where('date_end', '=', Carbon::parse(Carbon::now())->format('Y-m-d H:i'))->where('status', '=', 3)->with('bidders')->get(); // Если такие аукционы есть if ($auctionsEnd->count() > 0) { foreach ($auctionsEnd as $auction) { // Данные пользователя создавшего аукцион $user = User::find($auction->user); // Определяем победителя по наибольшей ставке $win = Bets::where('auction_id', '=', $auction->id)->orderBy('created_at', 'desc')->first(); // Помещаем аукцион в Архив $auction->in_archive = 1; /* * Если победитель есть */ if ($win) { // Загружаем информацию о победителе $win_user = User::find($win->user_id); // Присваиваем участнику статус "Победитель" $win_status = Bidders::where('auction_id', '=', $auction->id)->where('user_id', '=', $win->user_id)->first(); $win_status->status = 2; $win_status->save(); // Смена статуса на "Торги відбулися" $auction->status = 7; $auction->final_price = $win->bet; // Окончательная цена $auction->save(); // Отправка письма создателю аукциона Mail::queue('emails.auction-end', ['first_name' => $user->first_name, 'last_name' => $user->last_name, 'middle_name' => $user->middle_name, 'auction_id' => $auction->id, 'auction_title' => $auction->title, 'auction_cyr' => $auction->currency, 'auction_status' => 7, 'win_first_name' => $win_user->first_name, 'win_last_name' => $win_user->last_name, 'win_middle_name' => $win_user->middle_name, 'win_email' => $win_user->email, 'win_phone' => $win_user->phone, 'win_cost' => $win->bet], function ($message) use($user) { $message->to($user->email, $user->first_name . ' ' . $user->last_name)->subject('Аукціон завершено'); }); // Отправка письма победителю аукциона Mail::queue('emails.auction-end-winner', ['first_name' => $win_user->first_name, 'last_name' => $win_user->last_name, 'auction_id' => $auction->id, 'auction_title' => $auction->title, 'auction_cyr' => $auction->currency, 'auction_status' => 7, 'win_cost' => $win->bet], function ($message) use($win_user) { $message->to($win_user->email, $win_user->first_name . ' ' . $win_user->last_name)->subject('Аукціон завершено'); }); // Отправка письма администратору $adminEmail = Config::get('app.admin_email'); Mail::queue('emails.auction-end-admin', ['auction_id' => $auction->id, 'auction_title' => $auction->title, 'auction_status' => 7, 'auction_cyr' => $auction->currency, 'win_first_name' => $win_user->first_name, 'win_last_name' => $win_user->last_name, 'win_middle_name' => $win_user->middle_name, 'win_email' => $win_user->email, 'win_phone' => $win_user->phone, 'win_cost' => $win->bet], function ($message) use($adminEmail) { $message->to($adminEmail)->subject('Аукціон завершено'); }); } else { $auction->status = 8; // Смена статуса на "Торги не відбулися" $auction->save(); // Отправка письма создателю аукциона Mail::queue('emails.auction-end', ['first_name' => $user->first_name, 'last_name' => $user->last_name, 'middle_name' => $user->middle_name, 'auction_id' => $auction->id, 'auction_title' => $auction->title, 'auction_status' => 8], function ($message) use($user) { $message->to($user->email, $user->first_name . ' ' . $user->last_name)->subject('Аукціон завершено'); }); // Отправка письма администратору $adminEmail = Config::get('app.admin_email'); Mail::queue('emails.auction-end-admin', ['auction_id' => $auction->id, 'auction_title' => $auction->title, 'auction_status' => 8], function ($message) use($adminEmail) { $message->to($adminEmail)->subject('Аукціон завершено'); }); } } } })->everyMinute(); $schedule->call(function () { // Ищем аукционы, которые должны начаться $auctions = Auction::where('data_start', '=', Carbon::parse(Carbon::now())->format('Y-m-d H:i'))->where('status', '=', 2)->with('bidders')->get(); // Если количество аукционов больше нуля, выполняем скрипт if ($auctions->count() > 0) { foreach ($auctions as $auction) { $user = User::find($auction->user); // Информация о создателе аукциона // Если к началу аукциона есть участники - выполняем if ($auction->bidders->count() > 0) { $array[$auction->id] = []; $bid = []; $auction->status = 3; $auction->save(); foreach ($auction->bidders as $bidder) { // Если статус участника "Допущено" if ($bidder->status == 1) { $array[$auction->id] = array_add($array[$auction->id], 'id', $auction->id); $array[$auction->id] = array_add($array[$auction->id], 'title', $auction->title); array_push($bid, $bidder->user_id); } } $array[$auction->id] = array_add($array[$auction->id], 'bidders', $bid); // Получаем доступ к информации о каждом участнике $users[$auction->id] = User::find($array[$auction->id]['bidders']); foreach ($users[$auction->id] as $user) { Mail::queue('emails.auctionstart', ['first_name' => $user->first_name, 'last_name' => $user->last_name, 'auction_id' => $auction->id, 'auction_title' => $auction->title], function ($message) use($user) { $message->to($user->email, $user->first_name . ' ' . $user->last_name)->subject('Розпочато аукціон'); }); } } else { $auction->status = 8; // Смена статуса на "Торги не відбулися" $auction->in_archive = 1; // Помещаем аукцион в Архив $auction->save(); // Отправка письма создателю аукциона Mail::queue('emails.auction-end', ['first_name' => $user->first_name, 'last_name' => $user->last_name, 'middle_name' => $user->middle_name, 'auction_id' => $auction->id, 'auction_title' => $auction->title, 'auction_status' => 8], function ($message) use($user) { $message->to($user->email, $user->first_name . ' ' . $user->last_name)->subject('Аукціон завершено'); }); // Отправка письма администратору $adminEmail = Config::get('app.admin_email'); Mail::queue('emails.auction-end-admin', ['auction_id' => $auction->id, 'auction_title' => $auction->title, 'auction_status' => 8], function ($message) use($adminEmail) { $message->to($adminEmail)->subject('Аукціон завершено'); }); } } } })->everyMinute(); $schedule->call(function () { // Ищем аукционы, которые должны начаться через 10 минут $auctions = Auction::where('data_start', '=', Carbon::parse(Carbon::now())->addMinutes(10)->format('Y-m-d H:i'))->where('status', '=', 2)->with('bidders')->get(); // Если количество аукционов больше нуля, выполняем скрипт if ($auctions->count() > 0) { foreach ($auctions as $auction) { // Если к началу аукциона есть участники - выполняем if ($auction->bidders->count() > 0) { $array[$auction->id] = []; $bid = []; foreach ($auction->bidders as $bidder) { // Если статус участника "Допущено" if ($bidder->status == 1) { $array[$auction->id] = array_add($array[$auction->id], 'id', $auction->id); $array[$auction->id] = array_add($array[$auction->id], 'title', $auction->title); array_push($bid, $bidder->user_id); } } $array[$auction->id] = array_add($array[$auction->id], 'bidders', $bid); // Получаем доступ к информации о каждом участнике $users[$auction->id] = User::find($array[$auction->id]['bidders']); foreach ($users[$auction->id] as $user) { Mail::queue('emails.auctionstart10', ['first_name' => $user->first_name, 'last_name' => $user->last_name, 'auction_id' => $auction->id, 'auction_title' => $auction->title], function ($message) use($user) { $message->to($user->email, $user->first_name . ' ' . $user->last_name)->subject('Аукціон розпочнеться через 10 хвилин'); }); } $user = User::find($auction->user); // Информация о создателе аукциона // Отправка письму о начале через 10 минут создателю аукциона Mail::queue('emails.auctionstart10creator', ['first_name' => $user->first_name, 'last_name' => $user->last_name, 'auction_id' => $auction->id, 'auction_title' => $auction->title], function ($message) use($user) { $message->to($user->email, $user->first_name . ' ' . $user->last_name)->subject('Ваш аукціон розпочнеться через 10 хвилин'); }); } } } })->everyMinute(); /* * Ежедневная проверка курса доллара и евро * В случае несовпадения курса банка с курсом на сайте - курс изменяется */ $schedule->call(function () { $currentUSD = \App\Settings::where(['name' => 'usd_cyr'])->first(); // Текущий курс доллара $currentEUR = \App\Settings::where(['name' => 'eur_cyr'])->first(); // Текущий курс евро $currentUSDval = $currentUSD->value; $currentEURval = $currentEUR->value; $get_currency = 'https://api.privatbank.ua/p24api/pubinfo?exchange&json&coursid=11'; $currency = file_get_contents($get_currency); $currency = json_decode($currency); $newCurrencyUSD = number_format($currency[0]->sale, 2, '.', ' '); // Новый курс доллара $newCurrencyEUR = number_format($currency[1]->sale, 2, '.', ' '); // Новый курс евро if ($currentUSDval != $newCurrencyUSD) { $currentUSD->value = $newCurrencyUSD; $currentUSD->save(); } if ($currentEURval != $newCurrencyEUR) { $currentEUR->value = $newCurrencyEUR; $currentEUR->save(); } })->daily(); }