298 lines
10 KiB
PHP
Executable File
298 lines
10 KiB
PHP
Executable File
<?php
|
|
|
|
namespace Modules\M3\Http\Controllers;
|
|
|
|
use DB;
|
|
use Illuminate\Http\Request;
|
|
|
|
//
|
|
|
|
class GetContentsController extends Controller
|
|
{
|
|
public function processShipment(Request $request)
|
|
{
|
|
// Get Mackpkr from Request
|
|
$macpacPicker = isset($request->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;
|
|
}
|
|
}
|