M3 Integration fixes

This commit is contained in:
Mark Gregory
2026-09-22 11:56:38 +01:00
parent 9f69743dd6
commit 17cfcf44b2
3 changed files with 449 additions and 485 deletions
@@ -12,169 +12,161 @@ class M3GetPDFFromCacheController extends Controller
{
public static function index(Request $request)
{
// Parse PDF file and build necessary objects.
$state = self::initialState();
$aggno = $aggmsg = '';
$iC670M = $pDFArray = $carrier = $trackingno = $iCM688M1 = [];
$aYMACPKR = $wHDDA = $cOMPANY = $pLANT = $wHS = '';
// PDF File PATH
$pdfFilePath = Config::get('arrays.PdfPath');
try {
// Initialise Vars
$pDFArray = $trackingno = $carrier = $iCM688M1 = [];
$sHUSER = m3User() !== '' ? Str::upper(trim(m3User())) : '';
if ($sHUSER != '') {
// Get User CO & WH
// Get user from ICM428M
$iCM428M = DB::connection(config('m3.connection', 'pgsql'))->table('icm428m')
->select('R428US', 'R428CO', 'R428WH', 'R428PL')
->where('R428US', '=', $sHUSER)
->first();
$cOMPANY = isset($iCM428M->R428CO) ? $iCM428M->R428CO : ''; // Company
$pLANT = isset($iCM428M->R428PL) ? $iCM428M->R428PL : ''; // Plant
$wHS = isset($iCM428M->R428WH) ? $iCM428M->R428WH : ''; // WareHouse
}
// Warehouse Table
$iC670M = DB::connection(config('m3.connection', 'pgsql'))->table('ic670m')->get();
// ->where('WDCO',$userCO)->where('WDPL',$userPL)->where('WDWHS',$userWH)
// Get URL PARAMS
$urlParams = count($request->all()) > 0 ? $request->all() : '';
// dump($urlParams);
$aYMACPKR = isset($urlParams['MACPKR']) ? trim($urlParams['MACPKR']) : ''; // Delivery note number
$dOCTYPE = isset($urlParams['DOCTYPE']) ? trim($urlParams['DOCTYPE']) : ''; // Document type (PackingList, CarrierLabel, ContentLabel)
$wHDDA = $cOMPANY . $pLANT . $wHS;
// Check Doctype fisrt
$docTypes = $dOCTYPE != '' ? [$dOCTYPE] : ['PackingList', 'ContentLabel', 'CarrierLabel', 'GSLabel']; // document type (PackingList, CarrierLabel, ContentLabel)
if ($urlParams != '') {
// dump($urlParams);
// document number (ie the internal box number, the pick list number)
// Key Combination : COMPANY WHS A4MACPKR DOCTYPE DOCNUM
// Document type (PackingList, CarrierLabel, ContentLabel)
// Get Aggregation Number if it exists
$iCM695M1Agg = DB::connection(config('m3.connection', 'pgsql'))->table('icm695m1')
->select('AYTRUCK')
->where('AYCO', $cOMPANY)
->where('AYWHS', $wHS)
->where('AYMACPKR', $aYMACPKR)
->first();
$aggno = isset($iCM695M1Agg->AYTRUCK) ? trim($iCM695M1Agg->AYTRUCK) : '';
if ($aggno != '' && $aggno != '0') {
$aggmsg = "This delivery note is part of aggregation $aggno ";
$iCM688M1 = DB::connection(config('m3.connection', 'pgsql'))->select("select A4MACPKR from ICM688M1 where A4SHPAGGCD='$aggno'");
// 654 add 'AYSPR15A01', 'AYSPR30A01', 'AYTRUCK' carrier and tracking# and agg#
$iCM695M1 = DB::connection(config('m3.connection', 'pgsql'))->table('icm695m1')
->select('AYCO', 'AYWHS', 'AYMACPKR', 'AYINTBOX', 'AYSPR15A01', 'AYSPR30A01', 'AYTRUCK')
->distinct()
->where('AYCO', $cOMPANY)
->where('AYWHS', $wHS)
// ->where('AYMACPKR',$aYMACPKR)
->where('AYTRUCK', $aggno)
->orderBy('AYMACPKR')
->get();
} else {
// 654 add 'AYSPR15A01', 'AYSPR30A01', 'AYTRUCK' carrier and tracking# and agg#
$iCM695M1 = DB::connection(config('m3.connection', 'pgsql'))->table('icm695m1')
->select('AYCO', 'AYWHS', 'AYMACPKR', 'AYINTBOX', 'AYSPR15A01', 'AYSPR30A01', 'AYTRUCK')
->distinct()
->where('AYCO', $cOMPANY)
->where('AYWHS', $wHS)
->where('AYMACPKR', $aYMACPKR)
->orderBy('AYMACPKR')
->get();
}
if (count($iCM695M1) > 0) {
$tmpCacheArr = $carrier = $trackingno = [];
// Loop the Results from $ICM595M1TMP
foreach ($iCM695M1 as $ICM695M1R) {
$wHS = trim($ICM695M1R->AYWHS);
$cOMPANY = trim($ICM695M1R->AYCO);
$aYMACPKR = trim($ICM695M1R->AYMACPKR);
$dOCNUM = trim($ICM695M1R->AYINTBOX);
// 654
$carrier[] = trim($ICM695M1R->AYSPR15A01);
$trackingno[] = trim($ICM695M1R->AYSPR30A01);
$aggno = trim($ICM695M1R->AYTRUCK);
// Make Key and Test Validity
if ($aYMACPKR != '' && $cOMPANY != '' && $wHS != '') {
$contentLabel = '';
// Get Unique Keys
foreach ($docTypes as $value) {
// Check Parcel vs LTL
if ($value == 'ContentLabel') {
$dOCNUMT = $dOCNUM;
$contentLabel = ! is_numeric($dOCNUM) ? 'LTL' : '';
}
if ($value == 'CarrierLabel') {
$dOCNUMT = $dOCNUM;
// Keep Solon Logic to read LTL
$dOCNUMT2 = $contentLabel == 'LTL' ? $aYMACPKR : $dOCNUM;
if ($dOCNUMT2 != $dOCNUMT) {
$pDFKey2 = $value . '/' . $value . '_' . $aYMACPKR . '_' . $dOCNUMT2 . '_' . $cOMPANY . '_' . $wHS;
$tmpCacheArr[] = $pDFKey2;
}
}
if ($value == 'PackingList') {
$dOCNUMT = $aYMACPKR;
}
// Get GS1 Labels
if ($value == 'GSLabel') {
$pDFKey = $value . '/' . $value . '_' . $aYMACPKR . '_' . $cOMPANY . '_' . $wHS . '_' . $dOCNUM;
// $pDFKey = $value.'/'.$value.'_'.$aYMACPKR.'_'.$cOMPANY.'_'.$wHS;
// }
// else{
// $pDFKey = $value.'/'.$value.'_'.$aYMACPKR.'_'.$cOMPANY.'_'.$wHS.'_'.$dOCNUM;
// }
} else {
$pDFKey = $value . '/' . $value . '_' . $aYMACPKR . '_' . $dOCNUMT . '_' . $cOMPANY . '_' . $wHS;
}
$tmpCacheArr[] = $pDFKey;
}
}
}
// Get unique values from array $pDFArray
$tmpCacheArr = collect($tmpCacheArr)->unique();
foreach ($tmpCacheArr as $value) {
$pdfFileName = $pdfFilePath . $value . '.pdf';
if (File::exists($pdfFileName)) {
$pdfFile = File::get($pdfFileName);
// Transform content to base64
// $base64PDF = $pdfFile;
$base64PDF = base64_encode($pdfFile);
$pDFArray[] = $base64PDF;
}
}
} else {
// Nothing Found
}
}
} catch (\Throwable $th) {
report($th);
self::loadUserContext($state);
self::loadDocuments($request, $state);
} catch (\Throwable $throwable) {
report($throwable);
}
return view('m3::liberty-theme.pages.M3GetPDF', ['IC670M' => $iC670M, 'PDFArray' => $pDFArray, 'AYMACPKR' => $aYMACPKR, 'WHDDA' => $wHDDA, 'aggmsg' => $aggmsg, 'carrier' => $carrier, 'trackingno' => $trackingno, 'ICM688M1' => $iCM688M1, 'COMPANY' => $cOMPANY, 'PLANT' => $pLANT, 'WHS' => $wHS]);
// compact('IC670M','ViewTitle')
return view('m3::liberty-theme.pages.M3GetPDF', self::viewData($state));
}
private static function initialState(): array
{
return [
'aggmsg' => '', 'IC670M' => collect(), 'PDFArray' => [], 'carrier' => [],
'trackingno' => [], 'ICM688M1' => [], 'AYMACPKR' => '', 'WHDDA' => '',
'COMPANY' => '', 'PLANT' => '', 'WHS' => '',
];
}
private static function loadUserContext(array &$state): void
{
$user = m3User() !== '' ? Str::upper(trim(m3User())) : '';
if ($user !== '') {
$profile = DB::connection(config('m3.connection', 'pgsql'))->table('icm428m')
->select('R428US', 'R428CO', 'R428WH', 'R428PL')->where('R428US', $user)->first();
$state['COMPANY'] = $profile->R428CO ?? '';
$state['PLANT'] = $profile->R428PL ?? '';
$state['WHS'] = $profile->R428WH ?? '';
}
$state['WHDDA'] = $state['COMPANY'] . $state['PLANT'] . $state['WHS'];
$state['IC670M'] = DB::connection(config('m3.connection', 'pgsql'))->table('ic670m')->get();
}
private static function loadDocuments(Request $request, array &$state): void
{
$params = $request->all();
if ($params === []) {
return;
}
$state['AYMACPKR'] = trim((string) ($params['MACPKR'] ?? ''));
$documentType = trim((string) ($params['DOCTYPE'] ?? ''));
$documentTypes = $documentType !== '' ? [$documentType] : ['PackingList', 'ContentLabel', 'CarrierLabel', 'GSLabel'];
$aggregation = self::aggregationNumber($state);
$rows = self::documentRows($state, $aggregation);
if ($rows->isEmpty()) {
return;
}
$keys = self::cacheKeys($rows, $documentTypes, $state);
$state['PDFArray'] = self::readCachedPdfs($keys);
}
private static function aggregationNumber(array &$state): string
{
$row = DB::connection(config('m3.connection', 'pgsql'))->table('icm695m1')
->select('AYTRUCK')->where('AYCO', $state['COMPANY'])->where('AYWHS', $state['WHS'])
->where('AYMACPKR', $state['AYMACPKR'])->first();
$aggregation = trim((string) ($row->AYTRUCK ?? ''));
if ($aggregation !== '' && $aggregation !== '0') {
$state['aggmsg'] = "This delivery note is part of aggregation $aggregation ";
$state['ICM688M1'] = DB::connection(config('m3.connection', 'pgsql'))
->table('icm688m1')->select('A4MACPKR')->where('A4SHPAGGCD', $aggregation)->get()->all();
}
return $aggregation;
}
private static function documentRows(array $state, string $aggregation)
{
$query = DB::connection(config('m3.connection', 'pgsql'))->table('icm695m1')
->select('AYCO', 'AYWHS', 'AYMACPKR', 'AYINTBOX', 'AYSPR15A01', 'AYSPR30A01', 'AYTRUCK')
->distinct()->where('AYCO', $state['COMPANY'])->where('AYWHS', $state['WHS']);
$aggregation !== '' && $aggregation !== '0'
? $query->where('AYTRUCK', $aggregation)
: $query->where('AYMACPKR', $state['AYMACPKR']);
return $query->orderBy('AYMACPKR')->get();
}
private static function cacheKeys(iterable $rows, array $documentTypes, array &$state): array
{
$keys = [];
foreach ($rows as $row) {
self::appendRowKeys($keys, $row, $documentTypes, $state);
}
return array_values(array_unique($keys));
}
private static function appendRowKeys(array &$keys, object $row, array $documentTypes, array &$state): void
{
$warehouse = trim((string) $row->AYWHS);
$company = trim((string) $row->AYCO);
$picker = trim((string) $row->AYMACPKR);
$documentNumber = trim((string) $row->AYINTBOX);
$state['WHS'] = $warehouse;
$state['COMPANY'] = $company;
$state['AYMACPKR'] = $picker;
$state['carrier'][] = trim((string) $row->AYSPR15A01);
$state['trackingno'][] = trim((string) $row->AYSPR30A01);
if ($picker === '' || $company === '' || $warehouse === '') {
return;
}
$contentLabel = '';
foreach ($documentTypes as $type) {
[$key, $extraKey, $contentLabel] = self::documentKey($type, $picker, $documentNumber, $company, $warehouse, $contentLabel);
if ($extraKey !== null) {
$keys[] = $extraKey;
}
$keys[] = $key;
}
}
private static function documentKey(string $type, string $picker, string $number, string $company, string $warehouse, string $contentLabel): array
{
$documentNumber = $number;
$extraKey = null;
if ($type === 'ContentLabel') {
$contentLabel = is_numeric($number) ? '' : 'LTL';
} elseif ($type === 'PackingList') {
$documentNumber = $picker;
} elseif ($type === 'CarrierLabel' && $contentLabel === 'LTL') {
$extraKey = "$type/{$type}_{$picker}_{$picker}_{$company}_{$warehouse}";
}
$key = $type === 'GSLabel'
? "$type/{$type}_{$picker}_{$company}_{$warehouse}_{$number}"
: "$type/{$type}_{$picker}_{$documentNumber}_{$company}_{$warehouse}";
return [$key, $extraKey, $contentLabel];
}
private static function readCachedPdfs(array $keys): array
{
$result = [];
$path = (string) Config::get('arrays.PdfPath');
foreach ($keys as $key) {
$fileName = $path . $key . '.pdf';
if (File::exists($fileName)) {
$result[] = base64_encode(File::get($fileName));
}
}
return $result;
}
private static function viewData(array $state): array
{
return $state;
}
}