macpkr) ? trim($request->macpkr) : ''; $shsource = isset($request->shsource) ? trim($request->shsource) : ''; $showerrors = isset($request->showerrors) ? trim($request->showerrors) : 'N'; $skipdates = isset($request->skipdates) ? trim($request->skipdates) : 'N'; // Get users from ICM428M $connection = config('m3.connection', 'pgsql'); $iCM428M = Schema::connection($connection)->hasTable('icm428m') ? DB::connection($connection)->table('icm428m')->select('R428US', 'R428FIRST', 'R428FAMILY')->get() : collect(); $iCM428MCOL = collect($iCM428M); $iCM428MCOL->filter(function ($value) { return $value->R428US = trim($value->R428US); }); $iCM428MCOL->filter(function ($value) { return $value->R428FIRST = trim($value->R428FIRST); }); $iCM428MCOL->filter(function ($value) { return $value->R428FAMILY = trim($value->R428FAMILY); }); return view('m3::liberty-theme.pages.M3ErrorsDisplay', ['macpkr' => $macpkr, 'shsource' => $shsource, 'showerrors' => $showerrors, 'skipdates' => $skipdates, 'ICM428MCOL' => $iCM428MCOL]); } public function datatables(Request $request) { $this->configureDataTableRuntime(); $filters = $this->dataTableFilters($request); $connection = config('m3.connection', 'pgsql'); if (! Schema::connection($connection)->hasTable('icm699m')) { return Datatables::of(collect())->addIndexColumn()->make(true); } $profile = $this->findM3Profile($connection, $filters['SHUSER']); $query = $this->buildM3LogQuery($connection); $this->applyM3LogFilters($query, $filters, $profile); return Datatables::of($query)->addIndexColumn()->make(true); } private function configureDataTableRuntime(): void { $timeout = (string) Config::get('arrays.PHPTimeOut'); ini_set('max_execution_time', $timeout); ini_set('max_input_time', $timeout); ini_set('default_socket_timeout', $timeout); ini_set('memory_limit', '1024M'); } private function dataTableFilters(Request $request): array { return [ 'SHMACPKR' => trim((string) $request->input('SHMACPKR', '')), 'SHSOURCE' => trim((string) $request->input('SHSOURCE', '')), 'STARTDATE' => trim((string) $request->input('STARTDATE', today()->subDays(1)->format('Y-m-d'))), 'ENDDATE' => trim((string) $request->input('ENDDATE', today()->format('Y-m-d'))), 'SHOWERRORS' => trim((string) $request->input('SHOWERRORS', 'N')), 'SHUSER' => m3_user() !== '' ? Str::upper(trim(m3_user())) : '', 'SKIPDATES' => trim((string) $request->input('SKIPDATES', 'N')), ]; } private function findM3Profile(string $connection, string $user): ?object { if ($user === '' || ! Schema::connection($connection)->hasTable('icm428m')) { return null; } return DB::connection($connection)->table('icm428m') ->select('R428US', 'R428CO', 'R428WH') ->where('R428US', $user) ->first(); } private function buildM3LogQuery(string $connection) { $query = DB::connection($connection)->table('icm699m') ->select('ICM699M.*', DB::raw("ICM699M.SHDT || ' ' || ICM699M.SHTIME AS SHDATETIME")) ->distinct(); if (Schema::connection($connection)->hasTable('icm428m')) { $query->addSelect('ICM428M.R428FIRST', 'ICM428M.R428FAMILY') ->leftJoin('ICM428M', 'ICM699M.SHUSER', '=', 'ICM428M.R428US'); } if (Schema::connection($connection)->hasTable('icm688m1')) { $query->addSelect('ICM688M1.A4ONO', 'ICM688M1.A4SHSHNM') ->leftJoin('ICM688M1', 'ICM699M.SHMACPKR', '=', 'ICM688M1.A4MACPKR'); } if (Schema::connection($connection)->hasTable('icm666m')) { $query->addSelect('ICM666M.A1ONO', 'ICM666M.A1SHSHNM') ->leftJoin('ICM666M', 'ICM699M.SHMACPKR', '=', 'ICM666M.A1DELNO'); } return $query; } private function applyM3LogFilters($query, array $filters, ?object $profile): void { if ($profile !== null) { $query->whereIn('SHCO', [trim((string) ($profile->R428CO ?? '')), '']) ->whereIn('SHWHS', [trim((string) ($profile->R428WH ?? '')), '']); } else { $query->whereNull('SHCO')->whereNull('SHWHS'); } foreach (['SHMACPKR', 'SHSOURCE'] as $field) { if ($filters[$field] !== '') { $query->where($field, $filters[$field]); } } $query->where('SHSOURCE', '!=', 'PdfStorageAPI'); if ($filters['SHMACPKR'] === '' && $filters['SKIPDATES'] === 'N') { $query->whereBetween('SHDT', [$filters['STARTDATE'], $filters['ENDDATE']]); } if ($filters['SHOWERRORS'] === 'Y') { $query->where('SHERROR', 'X'); } $query->where('SHTYPE', 'like', '%M3%'); } public static function update699M(Request $request) { $sHMACPKR = $request->SHMACPKR != null ? trim($request->SHMACPKR) : ''; $sHSOURCE = $request->SHSOURCE != null ? trim($request->SHSOURCE) : ''; $sHCO = $request->SHCO != null ? trim($request->SHCO) : ''; $sHWHS = $request->SHWHS != null ? trim($request->SHWHS) : ''; $sHDT = $request->SHDT != null ? trim($request->SHDT) : ''; $sHTIME = $request->SHTIME != null ? trim($request->SHTIME) : ''; $sHTYPE = $request->SHTYPE != null ? trim($request->SHTYPE) : ''; $sHACKNOTE = $request->SHACKNOTE != null ? trim(substr($request->SHACKNOTE, 0, 99)) : ''; $sHUSER = m3_user() !== '' ? Str::upper(m3_user()) : ''; $cLOSESIM = $request->CLOSESIM != null ? trim($request->CLOSESIM) : 'N'; if ($cLOSESIM == 'N') { DB::connection(config('m3.connection', 'pgsql'))->table('icm699m') ->where('SHMACPKR', $sHMACPKR) ->where('SHDT', $sHDT) ->where('SHTIME', $sHTIME) ->where('SHCO', $sHCO) ->where('SHWHS', $sHWHS) ->where('SHSOURCE', $sHSOURCE) ->where('SHERROR', 'X') ->where('SHTYPE', $sHTYPE) ->update(['SHERROR' => 'Z', 'SHACKUSER' => $sHUSER, 'SHACKDATE' => date('Y-m-d'), 'SHACKTIME' => date('H:i:s'), 'SHACKNOTE' => $sHACKNOTE]); } else { DB::connection(config('m3.connection', 'pgsql'))->table('icm699m') ->where('SHCO', $sHCO) ->where('SHWHS', $sHWHS) ->where('SHSOURCE', $sHSOURCE) ->where('SHERROR', 'X') ->where('SHTYPE', $sHTYPE) ->update(['SHERROR' => 'Z', 'SHACKUSER' => $sHUSER, 'SHACKDATE' => date('Y-m-d'), 'SHACKTIME' => date('H:i:s'), 'SHACKNOTE' => $sHACKNOTE]); } if ($sHSOURCE == 'CloseShipmentCoChargeAPI') { // Update ICM688M1 : Change A4PICKSTS DB::connection(config('m3.connection', 'pgsql'))->table('icm688m1') ->where('A4MACPKR', $sHMACPKR) ->where('A4CO', $sHCO) ->where('A4WHS', $sHWHS) ->update(['A4PICKSTS' => 'a']); } return response()->json(['success' => true]); } // Export To Excel public static function exporttoExcel(Request $request) { self::configureExportRuntime(); try { $filters = self::exportFiltersFromRequest($request); [$profileUser, $company, $warehouse] = self::exportUserScope($filters['user']); $users = self::exportUsers(); [$query, $countQuery] = self::exportQueries(); self::applyExportFilters($query, $countQuery, [ 'profileUser' => $profileUser, 'company' => $company, 'warehouse' => $warehouse, 'manifest' => $filters['manifest'], 'source' => $filters['source'], 'startDate' => $filters['startDate'], 'endDate' => $filters['endDate'], 'skipDates' => $filters['skipDates'], 'showErrors' => $filters['showErrors'], ]); $limitResponse = self::validateExportCount($countQuery->count()); if ($limitResponse !== null) { return $limitResponse; } $rows = self::prepareExportRows($query->get(), $users); return app(SpreadsheetExport::class)->download( $rows, 'transactionLog_' . $filters['startDate'] . '-' . $filters['endDate'] . '.xlsx', ); } catch (\Throwable $th) { Log::error($th); return redirect()->back()->withInput()->with('message', 'Unable to export the transaction log.'); } } private static function configureExportRuntime(): void { ini_set('max_execution_time', Config::get('arrays.PHPTimeOut')); ini_set('max_input_time', Config::get('arrays.PHPTimeOut')); ini_set('default_socket_timeout', Config::get('arrays.PHPTimeOut')); ini_set('memory_limit', '1024M'); } private static function exportFiltersFromRequest(Request $request): array { return [ 'manifest' => trim((string) $request->input('SHMACPKR', '')), 'source' => trim((string) $request->input('SHSOURCE', '')), 'startDate' => trim((string) $request->input('STARTDATE', today()->subDays(1)->format('Y-m-d'))), 'endDate' => trim((string) $request->input('ENDDATE', today()->format('Y-m-d'))), 'showErrors' => trim((string) $request->input('SHOWERRORS', 'N')), 'skipDates' => trim((string) $request->input('SKIPDATES', 'N')), 'user' => Str::upper(trim(m3_user())), ]; } private static function exportUserScope(string $user): array { $profile = DB::connection(config('m3.connection', 'pgsql'))->table('icm428m') ->select('R428US', 'R428CO', 'R428WH') ->where('R428US', $user) ->first(); return [ trim((string) ($profile->R428US ?? '')), trim((string) ($profile->R428CO ?? '')), trim((string) ($profile->R428WH ?? '')), ]; } private static function exportUsers() { return DB::connection(config('m3.connection', 'pgsql'))->table('icm428m') ->select('R428US', 'R428FIRST', 'R428FAMILY') ->get() ->each(function ($value): void { $value->R428US = trim((string) $value->R428US); $value->R428FIRST = trim((string) $value->R428FIRST); $value->R428FAMILY = trim((string) $value->R428FAMILY); }); } private static function exportQueries(): array { $query = DB::connection(config('m3.connection', 'pgsql'))->table('icm699m') ->select( DB::raw('COALESCE(ICM688M1.A4ONO, ICM666M.A1ONO) AS DELIVERY_NUM '), 'ICM699M.SHMACPKR', DB::raw('COALESCE(ICM688M1.A4SHSHNM, ICM666M.A1SHSHNM) AS CUSTOMER '), DB::raw(" ICM699M.SHDT || ' ' || ICM699M.SHTIME AS SHDATETIME"), DB::raw("CASE WHEN ICM699M.SHERROR !='Z' THEN TRIM(ICM699M.SHERROR) ELSE 'Closed' END AS ERROR"), 'ICM699M.SHTYPE', 'ICM699M.SHSOURCE', DB::raw("CASE WHEN ICM428M.R428FIRST IS NOT NULL THEN TRIM(ICM428M.R428FIRST) ||' '|| TRIM(ICM428M.R428FAMILY) ELSE TRIM(ICM699M.SHUSER) END AS USER"), 'ICM699M.SHCODE', 'ICM699M.SHCO', 'ICM699M.SHWHS', DB::raw(" ICM699M.SHACKDATE ||' '||ICM699M.SHACKTIME AS ACKDATE"), 'ICM699M.SHACKUSER', 'ICM699M.SHINTBOX', 'ICM699M.SHACKNOTE', DB::raw('SUBSTR(ICM699M.SHDATA, 1, 200)'), ) ->distinct() ->leftJoin('ICM428M', 'ICM699M.SHUSER', '=', 'ICM428M.R428US') ->leftJoin('ICM688M1', 'ICM699M.SHMACPKR', '=', 'ICM688M1.A4MACPKR') ->leftJoin('ICM666M', 'ICM699M.SHMACPKR', '=', 'ICM666M.A1DELNO'); return [$query, DB::connection(config('m3.connection', 'pgsql'))->table('icm699m')]; } private static function validateExportCount(int $count) { $maxRecords = (int) Config::get('arrays.maxRecDL'); if ($count <= $maxRecords) { return null; } return redirect()->back()->withInput()->with( 'message', 'Maximum allowed records for Excel Download is: ' . number_format($maxRecords) . ' current records: ' . number_format($count) . ' , change your search criteria.', ); } private static function prepareExportRows($records, $users) { $transactionTypes = Config::get('arrays.transxTypes'); $rows = collect($records)->each(function ($value) use ($transactionTypes, $users): void { $source = trim((string) $value->SHSOURCE); $value->SHSOURCE = $transactionTypes[$source] ?? $source; $user = $users->firstWhere('R428US', trim((string) $value->SHACKUSER)); $value->SHACKUSER = $user ? trim($user->R428FIRST . ' ' . $user->R428FAMILY) : trim((string) $value->SHACKUSER); }); $rows->prepend([ 'SHMACPKR' => 'Delivery Note', 'DELIVERY_NUM' => 'Order #', 'CUSTOMER' => 'Customer', 'SHDATETIME' => 'Date', 'ERROR' => 'Error', 'SHTYPE' => 'Request Type', 'SHSOURCE' => 'Source of transaction', 'USER' => 'User', 'SHCODE' => 'Request or Response Data', 'SHCO' => 'Division', 'SHWHS' => 'Warehouse', 'ACKDATE' => 'Acknowledge/Retry Date', 'SHACKUSER' => 'Acknowledged/Retried by User', 'SHINTBOX' => 'Internal Box Number', 'SHACKNOTE' => 'Note', 'SHDATA' => 'Error description', ]); return $rows; } private static function applyExportFilters($query, $countQuery, array $filters): void { $queries = [$query, $countQuery]; foreach ($queries as $builder) { if ($filters['profileUser'] !== '') { $builder->whereIn('SHCO', [$filters['company'], ''])->whereIn('SHWHS', [$filters['warehouse'], '']); } else { $builder->whereNull('SHCO')->whereNull('SHWHS'); } if ($filters['manifest'] !== '') { $builder->where('SHMACPKR', $filters['manifest']); } if ($filters['source'] !== '') { $builder->where('SHSOURCE', $filters['source']); } $builder->where('SHSOURCE', '!=', 'PdfStorageAPI'); if ($filters['manifest'] === '' && $filters['skipDates'] === 'N') { $builder->whereBetween('SHDT', [$filters['startDate'], $filters['endDate']]); } if ($filters['showErrors'] === 'Y') { $builder->where('SHERROR', 'X'); } $builder->where('SHTYPE', 'like', '%M3%'); } } }