149 lines
5.0 KiB
PHP
Executable File
149 lines
5.0 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 = $response->successful() ? (json_decode($response->body(), true) ?: []) : [];
|
|
} 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);
|
|
}
|
|
}
|
|
}
|