user; $statistics = []; $totals = self::emptyTotals(); if (isset($request->dates)) { [$statistics, $totals] = self::collectDailyStatistics($request, $starting, $days, $totals); } if ($request->format === 'json') { return response()->json($statistics); } $statistic5 = $statistics; $totals_array = $totals; $user_array = $userArray; return view('m3::liberty-theme.pages.UserPickingStats5', compact( 'statistic5', 'totals_array', 'user_array', 'user', 'starting', 'ending', 'request', )); } private static function loadUsers(): array { $users = []; $co = ''; $whs = ''; try { $connection = config('m3.connection', 'pgsql'); if (! Schema::connection($connection)->hasTable('icm428m')) { return [$users, $co, $whs]; } $profile = DB::connection($connection)->table('icm428m') ->select('R428CO', 'R428WH') ->where('R428US', strtoupper((string) m3User())) ->first(); $co = trim((string) ($profile->R428CO ?? '')); $whs = trim((string) ($profile->R428WH ?? '')); if ($co === '' || $whs === '') { return [$users, $co, $whs]; } $rows = DB::connection($connection)->table('icm428m') ->selectRaw("R428US as userprf, (trim(R428FIRST) || ' ' || trim(R428FAMILY)) as name, R428EMPCDE as empno") ->where('R428EMPCDE', '!=', 0)->where('R428CO', $co)->where('R428WH', $whs)->get(); foreach ($rows as $row) { $users[] = ['userprf' => trim((string) $row->userprf), 'name' => trim((string) $row->name), 'empno' => $row->empno]; } array_multisort(array_column($users, 'name'), SORT_ASC, $users); } catch (\Throwable $e) { Log::warning('M3 picking user list unavailable', ['exception' => $e->getMessage()]); } return [$users, $co, $whs]; } private static function dateRange(Request $request): array { if (isset($request->dates)) { $dates = explode(' - ', (string) $request->dates); $starting = $dates[0] ?? date('Y-m-d'); $ending = $dates[1] ?? $starting; } else { $starting = date('Y-m-d', strtotime('-5 days')); $ending = date('Y-m-d'); } $days = (int) (new DateTime($starting))->diff(new DateTime($ending))->format('%a'); return [$starting, $ending, $days]; } private static function emptyTotals(): array { return ['performance' => 0, 'blendedTargetLPH' => 0, 'actualLPH' => 0, 'grossHours' => 0]; } private static function collectDailyStatistics(Request $request, string $starting, int $days, array $totals): array { $statistics = []; $count = 0; $url = $request->getSchemeAndHttpHost() . '/UserPickingStats4'; for ($day = 0; $day <= $days; $day++) { $date = date('Y-m-d', strtotime($starting . "+$day days")); $statistics[$day] = self::fetchStatistic($request, $url, $date); self::addTotals($totals, $statistics[$day]); if (($statistics[$day]['performance'] ?? 0) > 0) { $count++; } } if ($count > 0) { foreach (array_keys($totals) as $key) { $totals[$key] /= $count; } } return [$statistics, $totals]; } private static function fetchStatistic(Request $request, string $url, string $date): array { try { $response = Http::withBasicAuth((string) $request->header('php-auth-user'), (string) $request->header('php-auth-pw')) ->get($url, ['dates' => $date, 'user' => $request->user, 'format' => 'json']); $data = []; if ($response->successful()) { $decoded = json_decode($response->body(), true); $data = is_array($decoded) ? $decoded : []; } } catch (\Throwable $e) { Log::warning('M3 picking statistics unavailable', ['date' => $date, 'exception' => $e->getMessage()]); $data = []; } $data['day'] = $data['day'] ?? $date; $data['performance'] = $data['performance'] ?? 0; return $data; } private static function addTotals(array &$totals, array $statistic): void { foreach (array_keys($totals) as $key) { $totals[$key] += (float) ($statistic[$key] ?? 0); } } }