MACPKR) ? trim($request->MACPKR) : ''; // ESN1 // $macpacPicker='888568'; // LTL example // $macpacPicker='894337'; // another LTL example with smaller orders, therefore pallets are more mixed // $macpacPicker='1225311'; // parcel example // ESN2 // $macpacPicker='748101'; // LTL example try { $icm704mArray = $this->buildNMFCCodesArray(); $shipmentData = $this->getShipmentData($macpacPicker); if (empty($shipmentData['orderNumber'])) { return response()->json(['error' => "Picker {$macpacPicker} was not found in ICM688M1"]); } // Get Packages $packages = $this->getPackagesData($shipmentData['macpkr_list']); // Add NMFC to Packages $packagesWithNMFC = $this->addNMFCDataToPackages($packages, $macpacPicker, $icm704mArray); // Get Commodities $commodities = $this->getCommoditiesData( $shipmentData['company'], $shipmentData['warehouse'], $macpacPicker, $packages['package_595m1'], $icm704mArray, ); return response()->json([ 'error' => '', 'shipmentData' => $shipmentData, 'packages' => $packagesWithNMFC, 'commodities' => $commodities, ]); } catch (\Exception $e) { return response()->json(['error' => $e->getMessage()], 500); } } protected function buildNMFCCodesArray() { $results = DB::table('ICM704M')->get(); return $results->mapWithKeys(function ($row) { return [ trim($row->AONMIT) => [ 'LTLClassId' => number_format(trim($row->AOFCID), 1), 'NMFCItem' => trim($row->AONMIT), 'NMFCSub' => trim($row->AONMSB), 'SkidDescription' => trim($row->AOSKDE), ], ]; })->all(); } protected function getShipmentData($macpacPicker) { $result = DB::select( ' SELECT SUM(A4TPCKWGHT) as total_weight, A4MACPKR, A4SHSHA1, A4SHSHA2, A4SHSHCI, A4SHSHNM, A4SHSHCT, A4SHSHZP, A4SHSHST, A4ONO, A4STCN, A4CO, A4WHS, A4SHIPVIA, A4SLCO, A4SLWHS, A4CATPID, A42SSVCCOD, A4CARRIER, A4SHPAGGCD, A4SALESLOC, A4SHCSPO, A4OFSTRM, A4SCAC, A4PLANT FROM ICM688M1 WHERE A4MACPKR = ? GROUP BY A4MACPKR, A4SHSHA1, A4SHSHA2, A4SHSHCI, A4SHSHNM, A4SHSHCT, A4SHSHZP, A4SHSHST, A4ONO, A4RLNO, A4SHNO, A4STCN, A4CO, A4WHS, A4SHIPVIA, A4SLCO, A4SLWHS, A4CATPID, A42SSVCCOD, A4CARRIER, A4SHPAGGCD, A4SALESLOC, A4SHCSPO, A4OFSTRM, A4SCAC, A4PLANT', [$macpacPicker], ); if (empty($result)) { return []; } $row = $result[0]; return [ 'orderNumber' => trim($row->A4MACPKR), 'recipient' => [ 'address1' => trim($row->A4SHSHA1), 'address2' => trim($row->A4SHSHA2), 'city' => trim($row->A4SHSHCI), 'companyName' => trim($row->A4SHSHNM), 'country' => trim($row->A4SHSHCT), 'postalCode' => trim($row->A4SHSHZP), 'state' => trim($row->A4SHSHST), ], 'shipmentReference' => trim($row->A4ONO), 'company' => trim($row->A4CO), 'warehouse' => trim($row->A4WHS), 'macpkr_list' => $macpacPicker, 'shipment_list' => "'" . trim($row->A4ONO) . "'", 'po_list' => "'" . trim($row->A4SHCSPO) . "'", 'order_list' => "'" . trim($row->A4ONO) . "'", ]; } protected function getPackagesData($macpkrList) { $results = DB::select( ' SELECT AYINTBOX, MAX(AYHEIGHT) as height, MAX(AYWIDTH) as width, MAX(AYDEPTH) as depth, SUM(AYLNWGHT) as weight FROM ICM695M1 WHERE AYMACPKR IN (?) GROUP BY AYINTBOX ORDER BY AYINTBOX', [$macpkrList], ); $packages = []; $package595m1 = []; $packagesGS1Array = []; foreach ($results as $index => $row) { $internalBox = trim($row->AYINTBOX); $package595m1[$internalBox] = [ 'INDEX' => $index, 'HEIGHT' => $row->HEIGHT, 'WIDTH' => $row->WIDTH, 'DEPTH' => $row->DEPTH, 'WEIGHT' => $row->WEIGHT, ]; $packages[] = [ 'Width' => $row->WIDTH, 'Height' => $row->HEIGHT, 'Length' => $row->DEPTH, 'Weight' => $row->WEIGHT, 'LicencePlate' => $internalBox, 'Reference1' => $internalBox, 'WeightType' => 0, 'DimensionType' => 0, ]; $packagesGS1Array[] = $internalBox; } return [ 'packages' => $packages, 'package_595m1' => $package595m1, 'packagesGS1Array' => $packagesGS1Array, ]; } protected function addNMFCDataToPackages($packages, $macpkrList, $icm704mArray) { $nmfcResults = DB::select( ' WITH tempfile AS ( SELECT (SELECT A5WBFRCT FROM ICM688M2 WHERE A5MACPKR IN (?) AND A5PART=AZPART FETCH FIRST 1 ROWS ONLY) as WBFRCT, az.* FROM ICM695M2 az WHERE AZMACPKR IN (?) ) SELECT azintbox, MIN(WBFRCT) as MIN_WBFRCT FROM tempfile GROUP BY azintbox ORDER BY 1', [$macpkrList, $macpkrList], ); foreach ($nmfcResults as $index => $row) { $wbfrct = trim($row->MIN_WBFRCT); $packages['packages'][$index]['SkidDesc'] = $icm704mArray[$wbfrct]['SkidDescription'] ?? 'CLIPS, FASTENERS OR MOUNTS'; } return $packages; } protected function getCommoditiesData($company, $warehouse, $macpkrList, $package595m1, $icm704mArray) { $results = DB::select( ' WITH tempfile1 AS ( SELECT A5PART, MAX(A5CMDESC) as A5CMDESC, MAX(A5MUTMS) as A5MUTMS, MAX(A5PMPWHT) as A5PMPWHT, MAX(A5SLUNPR) as A5SLUNPR, TRIM(MIN(A5WBFRCT)) as A5WBFRCT FROM ICM688M2 WHERE A5CO = ? AND A5WHS = ? AND A5MACPKR IN (?) AND A5PACKED > 0 GROUP BY A5PART ), tempfile2 AS ( SELECT AZINTBOX, AZPART, SUM(AZPACKED) as AZPACKED, MAX(SUBSTR(AZSPR15A01,1,4)) as HAZARDOUS FROM ICM695M2 WHERE AZCO = ? AND AZWHS = ? AND AZMACPKR IN (?) AND AZPACKED <> 0 GROUP BY AZINTBOX, AZPART ) SELECT A5PART, A5CMDESC, A5MUTMS, A5PMPWHT * AZPACKED as WEIGHt, AZPACKED, AZINTBOX, A5WBFRCT, HAZARDOUS, A5SLUNPR FROM tempfile1 LEFT JOIN tempfile2 ON AZPART = A5PART ORDER BY A5PART', [$company, $warehouse, $macpkrList, $company, $warehouse, $macpkrList], ); $commodities = []; $prevPartNumber = ''; $index = -1; foreach ($results as $row) { $partNumber = trim($row->A5PART); if ($partNumber !== $prevPartNumber) { $index++; $quantityIndex = 0; $wbfrct = trim($row->A5WBFRCT); $nmfcData = $icm704mArray[$wbfrct] ?? [ 'LTLClassId' => '50', 'NMFCItem' => '93490', 'NMFCSub' => '', ]; $commodities[] = [ 'Description' => trim($row->A5CMDESC), 'PartNumber' => $partNumber, 'SKUOrItemOrUPC' => $partNumber, 'MadeInCountryCode' => 'US', 'UnitValue' => $row->A5SLUNPR == '.000' ? 1 : (float) $row->A5SLUNPR, 'TotalWeight' => (float) $row->WEIGHT, 'QuantityUnitOfMeasure' => trim($row->A5MUTMS) ?: 'EA', 'Quantity' => (float) $row->AZPACKED, 'LTLClassId' => $nmfcData['LTLClassId'], 'NMFCItem' => $nmfcData['NMFCItem'], 'NMFCSub' => $nmfcData['NMFCSub'], 'DangerousGoodsInfo' => [ 'ContainsDangerousGoods' => trim($row->HAZARDOUS) === 'H4.1', ], 'QuantityAssignment' => [ [ 'PackageIndex' => $package595m1[trim($row->AZINTBOX)]['INDEX'], 'Quantity' => (float) $row->AZPACKED, ], ], ]; } else { $quantityIndex++; $commodities[$index]['TotalWeight'] += (float) $row->WEIGHT; $commodities[$index]['Quantity'] += (float) $row->AZPACKED; $commodities[$index]['QuantityAssignment'][] = [ 'PackageIndex' => $package595m1[trim($row->AZINTBOX)]['INDEX'], 'Quantity' => (float) $row->AZPACKED, ]; } $prevPartNumber = $partNumber; } return $commodities; } }