0) { $canGenerate = 0; } else { $nbLots = Prize::count(); if (intval($nbLots) > 0) { $canGenerate = 1; } else { $canGenerate = 0; } } $instantWin = InstantWin::orderBy('appear_date')->get(); return view('back::pages.instant-win.index', [ 'can_generate' => $canGenerate, 'instant_win' => $instantWin ]); } /** * Returns generated instant win. * * @return string|false */ public function instantWinGenerate() { /** @var \App\Models\Settings */ $settings = app(Settings::class); $start_date = $settings->start_date; $end_date = $settings->end_date; $lots = Prize::all(); $begin = new \DateTime($start_date); $end = new \DateTime($end_date); $interval = new \DateInterval('P1D'); $daterange = new \DatePeriod($begin, $interval, $end); $dateGlobal = []; $lotsGlobal = []; foreach ($lots as $k => $lot) { for ($i = 0; $i < $lot->quantity; $i++) { $lotsGlobal[] = [ 'id' => $lot->id, 'name' => $lot->label_one, 'hour' => str_pad(mt_rand(6, 22), 2, "0", STR_PAD_LEFT) . ":" . str_pad(mt_rand(0, 59), 2, "0", STR_PAD_LEFT) . ":00" ]; } } shuffle($lotsGlobal); foreach ($daterange as $date) { array_push($dateGlobal, ['date' => $date->format("Y-m-d"), 'lots' => []]); } $res = $this->generate($lotsGlobal, $dateGlobal, 0); foreach ($res as $date) { foreach ($date['lots'] as $lot) { $iw = new InstantWin(); $iw->prize_id = $lot['id']; $iw->appear_date = date('Y-m-d H:i:s', strtotime($date['date'] . " " . $lot['hour'])); $iw->save(); } } $instantWins = InstantWin::all(); return json_encode($instantWins); } /** * Generate instant win. * * @param array $lotsGlobal * @param array $dateGlobal * @param integer $lotsDone * @return array */ private function generate(array $lotsGlobal, array $dateGlobal, int $lotsDone): array { $rKey = array_rand($dateGlobal, 1); if ($lotsDone < count($dateGlobal)) { if (count($dateGlobal[$rKey]['lots']) > 0) { return $this->generate($lotsGlobal, $dateGlobal, $lotsDone); } } array_push($dateGlobal[$rKey]['lots'], $lotsGlobal[$lotsDone++]); if ($lotsDone < count($lotsGlobal)) { return $this->generate($lotsGlobal, $dateGlobal, $lotsDone); } foreach ($dateGlobal as $k => $date) { usort($dateGlobal[$k]['lots'], [$this, 'sortFunction']); } return $dateGlobal; } /** * Callback to sort 2 items by their hour. * * @param array $a * @param array $b * @return integer|float */ private function sortFunction(array $a, array $b): int|float { return strtotime($a["hour"]) - strtotime($b["hour"]); } }