Files
WMS/Modules/M3/Http/Controllers/GetContentsController.php
T
2026-09-21 10:14:57 +01:00

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;
}
}