Files
WMS/Modules/M3/Http/Controllers/UserPickingStats5.php
T
2026-09-21 12:05:53 +01:00

153 lines
5.1 KiB
PHP
Executable File

<?php
namespace Modules\M3\Http\Controllers;
use DateTime;
use DB;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Schema;
use Symfony\Component\HttpFoundation\Request;
class UserPickingStats5 extends Controller
{
public static function index(Request $request)
{
[$userArray] = self::loadUsers();
[$starting, $ending, $days] = self::dateRange($request);
$user = $request->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) m3_user()))
->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);
}
}
}