M3 Integration fixes

This commit is contained in:
Mark Gregory
2026-09-21 10:14:57 +01:00
parent 4af997c465
commit 6d60cbff84
5853 changed files with 79032 additions and 1825 deletions
File diff suppressed because it is too large Load Diff
+535
View File
@@ -0,0 +1,535 @@
<?php
namespace Modules\M3\Http\Controllers\API;
use Config;
use DB;
use Illuminate\Http\Request;
use Modules\M3\Helpers\Helper;
use Modules\M3\Http\Controllers\Controller;
use Modules\M3\Services\PostgresProgramBridge;
use Str;
class M3Controller extends Controller
{
private const FIELD_PREFIX = 'Field: ';
private const M3_LIST_SUFFIX = ' M3-Lis-JSN';
// Split Data and Write to ICM666M2
public function insertToICM666M2($dataSplit, $commentData)
{
$commentDataSS = explode("\n", $dataSplit);
$aXLINENO = 1;
foreach ($commentDataSS as $substring) {
// Process each substring
$fullData = $commentData;
$fullData['AXCOMMENT'] = $substring;
$fullData['AXLINENO'] = $aXLINENO;
DB::connection(config('m3.connection', 'pgsql'))->table('icm666m2')->insert($fullData);
$aXLINENO++;
// AXCO ICM666M2 CHARACTER 3
// AXWHS ICM666M2 CHARACTER 3
// AXPLANT ICM666M2 CHARACTER 3
// AXDOCUMENT ICM666M2 CHARACTER 15
// AXCOMMENT ICM666M2 CHARACTER 60
// AXLINENO DECIMAL(3,0)
}
}
public function index()
{
dd('Index');
}
public function create()
{
// This API controller does not expose a create form.
}
public function store(Request $request)
{
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'));
$rEQKPKUS = m3_user() !== '' ? Str::upper(m3_user()) : 'WEBUSER';
$sHSOURCE = 'M3ReceiverAPI';
$iCM666MFields = [
'Company' => ['A1CO', 3, 'string'],
'Warehouse' => ['A1WHS', 3, 'string'],
'Plant' => ['A1PLANT', 3, 'string'],
'PickerNumber' => ['A1DELNO', 11, 'integer'],
'OrderNumber' => ['A1ONO', 10, 'string'],
'ReleaseNumber' => ['A1RLNO', 3, 'string'], // Pick list suffix in ICM666M
'ShipmentNumber' => ['A1SHNO', 7, 'string'],
'OrderLine' => ['A1PKLN', 6, 'integer'],
'PartNumber' => ['A1PART', 15, 'string'],
'Description' => ['A1PARTDES', 120, 'string'],
'Quantity' => ['A1RSVQTY', 22, 'DEC'],
'BaseUnitPrice' => ['A1SLUNPR', 22, 'DEC'],
'Currency' => ['A1SHCURR', 3, 'string'],
'Zone' => ['A1LVZONE', 2, 'string'],
'PromDate' => ['A1PROMDTE', 8, 'integer'],
'RouteCode' => ['A1SHSRT', 6, 'string'],
'BillToId' => ['A1BILLTO', 10, 'string'],
'ShipToId' => ['A1SHIPTO', 10, 'string'],
'CompanyName' => ['A1SHSHNM', 36, 'string'],
'Address1' => ['A1SHSHA1', 36, 'string'],
'Address2' => ['A1SHSHA2', 36, 'string'],
'Address3' => ['A1SHSHA3', 36, 'string'],
'Address4' => ['A1SHSHA4', 36, 'string'],
'City' => ['A1SHSHCI', 20, 'string'],
'State' => ['A1SHSHST', 2, 'string'],
'PostalCode' => ['A1SHSHZP', 10, 'string'],
'Country' => ['A1SHSHCT', 3, 'string'],
'CountryName' => ['A1SHP2CNTY', 40, 'string'],
'PartWeight' => ['A1PRTWGT', 15, 'integer'],
'SellUOM' => ['A1SLUOM', 3, 'string'],
'PartConv' => ['A1PARTCONV', 25, 'DEC'],
'CarrierCode' => ['A1CARRIER', 6, 'string'],
'ShipVia' => ['A1SHPVIA', 3, 'string'],
'PrimaryLocation' => ['A1PRIMLOC', 10, 'string'],
'Allocation' => ['A1SPR10A01', 10, 'string'],
'AllocatedTo' => ['A1SPR15A01', 10, 'string'],
'LocationSeq' => ['A1LOCSEQ', 10, 'string'],
'UOM' => ['A1UOM', 3, 'string'],
'HazMat' => ['A1MATWRN', 4, 'string'],
'PartUPC' => ['A1UPC', 30, 'string'],
'PartEAN' => ['A1EAN', 30, 'string'],
'LotFlag' => ['A1IZLCF', 1, 'string'],
'ManOrd' => ['A1MONUM', 30, 'string'],
'LotNumber' => ['A1LOTNUM', 30, 'string'],
'ProductArea' => ['A1LVUSD1', 15, 'string'],
'FreightClass' => ['A1WBFRCT', 10, 'string'],
'ShipmentPONumber' => ['A1SOPONO', 20, 'string'],
'ShipmentPOLine' => ['A1SOPOLN', 7, 'integer'],
'ShipTerms' => ['A1OFSTRM', 3, 'string'],
// 'ExchangeRate' =>[ 'A1EXGRATE', 18,'DEC'],
'OrderClass' => ['A1SHORCL', 3, 'string'],
'LocationType' => ['A1LVUSD2', 2, 'string'],
'PallSize' => ['A1LVUSD3', 10, 'string'],
'MasterCarton' => ['A1USRLD1', 30, 'string'],
'MasterQty' => ['A1WBSHQY', 25, 'DEC'],
'InnerQty' => ['A1WBPKQY', 25, 'DEC'],
'PalletQty' => ['A1USRN01', 24, 'DEC'],
'CartonQty' => ['A1USRN31', 25, 'DEC'],
'PersonName' => ['A1PERNAME', 30, 'string'],
'AccountNo' => ['A1ACCNUM', 20, 'string'],
'Email' => ['A1EMAIL', 100, 'string'],
'OrderCategory' => ['A1REFORD', 1, 'string'],
'A1DATEADD' => ['A1DATEADD', 12, 'string'],
'A1TIMEADD' => ['A1TIMEADD', 12, 'string'],
'KitPartNumber' => ['A1KITPART', 15, 'string'],
'OrderLineSuffix' => ['A1PKSFX', 6, 'DEC'],
'CustomerPartNumber' => ['A1CUSTPART', 20, 'string'],
'GS1Label' => ['A1SPR1A01', 1, 'string'],
'CurrencyExchangeRate' => ['A1EXGRATE', 18, 'DEC'],
];
try {
$jsonFile = count($request->json()->all()) > 0 ? $request->json()->all() : '';
// Root
$company = isset($jsonFile['Company']) ? $jsonFile['Company'] : '';
$plant = isset($jsonFile['Plant']) ? $jsonFile['Plant'] : '';
$warehouse = isset($jsonFile['Warehouse']) ? $jsonFile['Warehouse'] : '';
$orderNumber = isset($jsonFile['OrderNumber']) ? $jsonFile['OrderNumber'] : '';
$pickerNumber = isset($jsonFile['PickerNumber']) ? $jsonFile['PickerNumber'] : '';
$promDate = isset($jsonFile['PromDate']) ? $jsonFile['PromDate'] : '';
$routeCode = isset($jsonFile['RouteCode']) ? $jsonFile['RouteCode'] : '';
$orderCategory = isset($jsonFile['OrderCategory']) ? $jsonFile['OrderCategory'] : '';
$releaseNumber = isset($jsonFile['ReleaseNumber']) ? $jsonFile['ReleaseNumber'] : '';
$shipmentNumber = isset($jsonFile['ShipmentNumber']) ? $jsonFile['ShipmentNumber'] : '';
$currency = isset($jsonFile['Currency']) ? $jsonFile['Currency'] : '';
$carrierCode = isset($jsonFile['CarrierCode']) ? $jsonFile['CarrierCode'] : '';
$shipmentPONumber = isset($jsonFile['ShipmentPONumber']) ? $jsonFile['ShipmentPONumber'] : ''; // CustPo
$shipTerms = isset($jsonFile['ShipTerms']) ? $jsonFile['ShipTerms'] : '';
$orderClass = isset($jsonFile['OrderClass']) ? $jsonFile['OrderClass'] : '';
$gS1Label = isset($jsonFile['GS1-128Label']) ? $jsonFile['GS1-128Label'] : '0';
$currencyExchangeRate = isset($jsonFile['CurrencyExchangeRate']) ? $jsonFile['CurrencyExchangeRate'] : '';
// Set Carrier BWAY if it's empty for Tilburg only
if (($carrierCode == '' || $carrierCode == null) && $warehouse == '111' && $company == '410' && $plant == '410') {
$carrierCode = 'BWAY';
}
$sHMACPKR = $pickerNumber != '' ? $pickerNumber : '000000';
if ($jsonFile != '') {
// Order Category
/*
1 = Material to manufacturing order
3 = Customer Order
4 = Requisition Order
5 = Distribution Order
9 = Move order / Replenishment
*/
// Recipient
$recipient = $jsonFile['Recipient'];
$companyName = isset($recipient['CompanyName']) ? $recipient['CompanyName'] : '';
$address1 = isset($recipient['Address1']) ? $recipient['Address1'] : '';
$address2 = isset($recipient['Address2']) ? $recipient['Address2'] : '';
$city = isset($recipient['City']) ? $recipient['City'] : '';
$state = isset($recipient['State']) ? $recipient['State'] : '';
$postalCode = isset($recipient['PostalCode']) ? $recipient['PostalCode'] : '';
$country = isset($recipient['Country']) ? $recipient['Country'] : '';
$postalCode = isset($recipient['PostalCode']) ? $recipient['PostalCode'] : '';
$billToId = isset($recipient['BillToId']) ? $recipient['BillToId'] : '';
$shipToId = isset($recipient['ShipToId']) ? $recipient['ShipToId'] : '';
$address3 = isset($recipient['Address3']) ? $recipient['Address3'] : '';
$address4 = isset($recipient['Address4']) ? $recipient['Address4'] : '';
$countryName = isset($recipient['CountryName']) ? $recipient['CountryName'] : '';
$personName = isset($recipient['PersonName']) ? $recipient['PersonName'] : '';
$accountNo = isset($recipient['AccountNo']) ? $recipient['AccountNo'] : '';
$email = isset($recipient['Email']) ? $recipient['Email'] : '';
$a1DATEADD = date('Ymd');
$a1TIMEADD = date('His');
// MycarrierDetails
$shipVia = isset($jsonFile['ShipVia']) ? $jsonFile['ShipVia'] : '';
// Comments
$picker = $packer = $carrier = $other = '';
$aXCO = $company;
$aXPLANT = $plant;
$aXWHS = $warehouse;
$aXDELNO = $pickerNumber;
$aXONO = $orderNumber;
$aXRLNO = $releaseNumber;
$aXSHNO = $shipmentNumber;
$comments = isset($jsonFile['Comments']) ? $jsonFile['Comments'] : '';
if ($comments != '') {
foreach ($comments as $key => $comment) {
$commentData = [];
$aXDOCUMENT = Helper::sanityzeString($key);
$commentData = ['AXCO' => $aXCO, 'AXPLANT' => $aXPLANT, 'AXWHS' => $aXWHS, 'AXDELNO' => $aXDELNO, 'AXONO' => $aXONO,
'AXRLNO' => $aXRLNO, 'AXSHNO' => $aXSHNO, 'AXDOCUMENT' => $aXDOCUMENT];
switch ($aXDOCUMENT) {
case 'Picker':
$picker = isset($comment) ? Helper::sanityzeString($comment) : 'null';
if ($picker != 'null') {
$this->insertToICM666M2($picker, $commentData);
}
break;
case 'Packer':
$packer = isset($comment) ? Helper::sanityzeString($comment) : 'null';
if ($packer != 'null') {
$this->insertToICM666M2($packer, $commentData);
}
break;
case 'Carrier':
$carrier = isset($comment) ? Helper::sanityzeString($comment) : 'null';
if ($carrier != 'null') {
$this->insertToICM666M2($carrier, $commentData);
}
break;
case 'Other':
$other = isset($comment) ? Helper::sanityzeString($comment) : 'null';
if ($other != 'null') {
$this->insertToICM666M2($other, $commentData);
}
break;
default:
break;
}
}
}
// Get Products : commodities And Write ICM666M
$products = $jsonFile['Contents']['Commodities'];
foreach ($products as $key => $product) {
$quantity = isset($product['Quantity']) ? $product['Quantity'] : '';
$description = isset($product['Description']) ? Str::limit($product['Description'], 25, '') : '';
$partNumber = isset($product['PartNumber']) ? $product['PartNumber'] : '';
$orderLine = isset($product['OrderLine']) ? $product['OrderLine'] : '';
$partWeight = isset($product['PartWeight']) ? $product['PartWeight'] : '';
$primaryLocation = isset($product['PrimaryLocation']) ? $product['PrimaryLocation'] : '';
$allocation = isset($product['Allocation']) ? $product['Allocation'] : '';
$allocatedTo = isset($product['AllocatedTo']) ? $product['AllocatedTo'] : '';
$locationSeq = isset($product['LocationSeq']) ? $product['LocationSeq'] : '';
$zone = isset($product['Zone']) ? $product['Zone'] : '';
$baseUnitPrice = isset($product['BaseUnitPrice']) ? $product['BaseUnitPrice'] : '';
$sellUOM = isset($product['SellUOM']) ? $product['SellUOM'] : '';
$partConv = isset($product['PartConv']) ? $product['PartConv'] : '';
$uOM = isset($product['UOM']) ? $product['UOM'] : '';
$hazMat = isset($product['HazMat']) ? $product['HazMat'] : '';
$partUPC = isset($product['PartUPC']) ? $product['PartUPC'] : '';
$partEAN = isset($product['PartEAN']) ? $product['PartEAN'] : '';
$lotFlag = isset($product['LotFlag']) ? $product['LotFlag'] : '';
$manOrd = isset($product['ManOrd']) ? $product['ManOrd'] : '';
$lotNumber = isset($product['LotNumber']) ? $product['LotNumber'] : '';
$productArea = isset($product['ProductArea']) ? $product['ProductArea'] : '';
$freightClass = isset($product['FreightClass']) ? $product['FreightClass'] : '';
$shipmentPOLine = isset($product['ShipmentPOLine']) ? $product['ShipmentPOLine'] : '';
$locationType = isset($product['LocationType']) ? $product['LocationType'] : '';
$pallSize = isset($product['PallSize']) ? $product['PallSize'] : '';
$masterCarton = isset($product['MasterCarton']) ? $product['MasterCarton'] : '';
$masterQty = isset($product['MasterQty']) ? $product['MasterQty'] : '';
$innerQty = isset($product['InnerQty']) ? $product['InnerQty'] : '';
$sonar_pallet_qty = isset($product['PalletQty']) ? $product['PalletQty'] : '';
$cartonQty = isset($product['CartonQty']) ? $product['CartonQty'] : '';
$kitPartNumber = isset($product['KitPartNumber']) ? $product['KitPartNumber'] : '';
$orderLineSuffix = isset($product['OrderLineSuffix']) ? $product['OrderLineSuffix'] : '';
$customerPartNumber = isset($product['CustomerPartNumber']) ? substr($product['CustomerPartNumber'], 0, 20) : ''; // Limit to 20 Chars
// Initialise Table Fields to be filled
$insertArray = [];
$fieldValues = [
'Company' => $company,
'Warehouse' => $warehouse,
'Plant' => $plant,
'PickerNumber' => $pickerNumber,
'OrderNumber' => $orderNumber,
'ReleaseNumber' => $releaseNumber,
'ShipmentNumber' => $shipmentNumber,
'OrderLine' => $orderLine,
'PartNumber' => $partNumber,
'Description' => $description,
'Quantity' => $quantity,
'BaseUnitPrice' => $baseUnitPrice,
'Currency' => $currency,
'Zone' => $zone,
'PromDate' => $promDate,
'RouteCode' => $routeCode,
'BillToId' => $billToId,
'ShipToId' => $shipToId,
'CompanyName' => $companyName,
'Address1' => $address1,
'Address2' => $address2,
'Address3' => $address3,
'Address4' => $address4,
'City' => $city,
'State' => $state,
'PostalCode' => $postalCode,
'Country' => $country,
'CountryName' => $countryName,
'PartWeight' => $partWeight,
'SellUOM' => $sellUOM,
'PartConv' => $partConv,
'CarrierCode' => $carrierCode,
'ShipVia' => $shipVia,
'PrimaryLocation' => $primaryLocation,
'Allocation' => $allocation,
'AllocatedTo' => $allocatedTo,
'LocationSeq' => $locationSeq,
'UOM' => $uOM,
'HazMat' => $hazMat,
'PartUPC' => $partUPC,
'PartEAN' => $partEAN,
'LotFlag' => $lotFlag,
'ManOrd' => $manOrd,
'LotNumber' => $lotNumber,
'ProductArea' => $productArea,
'FreightClass' => $freightClass,
'ShipmentPONumber' => $shipmentPONumber,
'ShipmentPOLine' => $shipmentPOLine,
'ShipTerms' => $shipTerms,
'OrderClass' => $orderClass,
'LocationType' => $locationType,
'PallSize' => $pallSize,
'MasterCarton' => $masterCarton,
'MasterQty' => $masterQty,
'InnerQty' => $innerQty,
'PalletQty' => $sonar_pallet_qty,
'CartonQty' => $cartonQty,
'PersonName' => $personName,
'AccountNo' => $accountNo,
'Email' => $email,
'OrderCategory' => $orderCategory,
'A1DATEADD' => $a1DATEADD,
'A1TIMEADD' => $a1TIMEADD,
'KitPartNumber' => $kitPartNumber,
'OrderLineSuffix' => $orderLineSuffix,
'CustomerPartNumber' => $customerPartNumber,
'GS1Label' => $gS1Label,
'CurrencyExchangeRate' => $currencyExchangeRate,
];
// Check JSON fields if empty or > DB Fields
foreach ($iCM666MFields as $key => $value) {
// Sanitize String
$fieldValue = Helper::sanityzeString($fieldValues[$key] ?? '');
// Check Var Types & Length
$lengthTest = Helper::checkLength($fieldValue, $value[1], $value[2]);
if (! $lengthTest[413] || ! $lengthTest[411] || ! $lengthTest[417]) {
if (! $lengthTest[413]) {
$message[] = ['code' => '413', 'status' => 'error', 'message' => self::FIELD_PREFIX . $key . ' is larger then expected'];
}
if (! $lengthTest[411]) {
$message[] = ['code' => '411', 'status' => 'error', 'message' => self::FIELD_PREFIX . $key . ' is empty'];
}
if (! $lengthTest[417]) {
$message[] = ['code' => '417', 'status' => 'error', 'message' => self::FIELD_PREFIX . $key . 'type is different then Expected type: ' . $value[2]];
}
// Write to Logs Out : Error & JSON
$data = ['SHMACPKR' => $sHMACPKR, 'SHDT' => date('Y-m-d'), 'SHTIME' => date('H:i:s'), 'SHERROR' => 'X', 'SHINTBOX' => '', 'SHTYPE' => 'M3-Lis-spl',
'SHDATA' => json_encode($message) . self::M3_LIST_SUFFIX . json_encode($jsonFile), 'SHUSER' => $rEQKPKUS, 'SHSOURCE' => $sHSOURCE, 'SHCO' => $company, 'SHWHS' => $warehouse];
Helper::logToICM699M($data);
return response()->json($message);
} elseif ($fieldValue != '') {
$insertArray[$value[0]] = $fieldValue;
}
}
// Check ICM709M
$iCM709MSEL = DB::connection(config('m3.connection', 'pgsql'))->table('icm709m')
->select()
->where('AT9CO', $aXCO)
->where('AT9PLT', $aXPLANT)
->where('AT9WHS', $aXWHS)
->where('AT9PART', $partNumber)
->first();
$palletQty = isset($iCM709MSEL->AT9QTY) ? $iCM709MSEL->AT9QTY : 0;
// dd($palletQty);
// Get Pallet Qty
$insertArray['A1USRN01'] = $palletQty;
// Hazard Material
$hazMat = isset($iCM709MSEL->AT9WRN) ? $iCM709MSEL->AT9WRN : '';
$insertArray['A1MATWRN'] = $hazMat;
// }
// SQL Insert to ICM666M
DB::connection(config('m3.connection', 'pgsql'))->table('icm666m')->insert($insertArray);
}
// Call PGM ICM700CSBM
if ($warehouse != '' && $pickerNumber != '' && $company != '') {
$pGMERRORS = '';
// connect to toolkit using DB2 credentials (can also leave blank for default authority)
try {
$conn = app(PostgresProgramBridge::class);
} catch (\Throwable $e) {
// Determine reason for failure.
// Probably database authentication error or invalid or unreachable database.
$code = $e->getCode();
$msg = $e->getMessage();
switch ($code) {
case 8001:
// "Authorization failure on distributed database connection attempt"
// Usually means a wrong DB2 user or password
$pGMERRORS = 'Could not connect due to wrong user or password.';
break;
case 42705:
$pGMERRORS = 'Database not found. Try WRKRDBDIRE to check.';
break;
default:
$pGMERRORS = 'Could not connect. Error: ' . $code . ' ' . $msg;
break;
}
}
$conn->setOptions(['persistent' => false, 'stateless' => true, 'debug' => true, 'debugLogFile' => env('TOOLKIT_DEBUG_LOG')]);
// Add LIB
// $result = $conn->CLCommand('ADDLIBLE LIB(MPDAT10)');
// define several input/output params
$params = [];
// AddParameterChar($io, $size, $comment, $varName, $value, $varying, $dimension)
// Add Warehouse Param
$params[] = $conn->AddParameterChar('in', 3, 'Company', '', $company);
$params[] = $conn->AddParameterChar('in', 3, 'Warehouse', '', $warehouse);
// AddParameterPackDec($io, $length, $scale, $comment, $varName, $value,$dimension)
// Add Delivery Note Param
$pickerNumberNoZero = ltrim(strval($pickerNumber), '0');
$params[] = $conn->AddParameterChar('in', 11, 'PickerNumber', '', $pickerNumberNoZero);
// Start Time Tracking
// ICM700C EWOBJTST ICM700C ICM700CSBM
$result = $conn->PgmCall('ICM700CSBM', env('OBJLIB'), $params, [], []);
if (! $result) {
$pGMERRORS = 'Error calling program. Code: ' . $conn->getErrorCode() . ' - Msg: ' . $conn->getErrorMsg();
}
if ($pGMERRORS != '') {
// Write to Logs Out : Error & JSON
$data = ['SHMACPKR' => $sHMACPKR, 'SHDT' => date('Y-m-d'), 'SHTIME' => date('H:i:s'), 'SHERROR' => 'X', 'SHINTBOX' => '', 'SHTYPE' => 'M3-Lis-spl',
'SHDATA' => $pGMERRORS . self::M3_LIST_SUFFIX . json_encode($jsonFile), 'SHUSER' => $rEQKPKUS, 'SHSOURCE' => $sHSOURCE, 'SHCO' => $company, 'SHWHS' => $warehouse];
Helper::logToICM699M($data);
}
}
// Write to Logs Out : Success
$data = ['SHMACPKR' => $sHMACPKR, 'SHDT' => date('Y-m-d'), 'SHTIME' => date('H:i:s'), 'SHERROR' => '', 'SHINTBOX' => '', 'SHTYPE' => 'M3-Lis-in',
'SHDATA' => json_encode($jsonFile), 'SHUSER' => $rEQKPKUS, 'SHSOURCE' => $sHSOURCE, 'SHCO' => $company, 'SHWHS' => $warehouse];
Helper::logToICM699M($data);
return response()->json([
'code' => '200',
'status' => 'success',
'message' => 'File Received, DB Updated',
]);
} else {
// Write to Logs Out : Error & JSON
$sHACKNOTE = 'Sentinel automatically closed the error related to this empty data set sent by M3';
$data = ['SHMACPKR' => $sHMACPKR, 'SHDT' => date('Y-m-d'), 'SHTIME' => date('H:i:s'), 'SHERROR' => 'Z', 'SHINTBOX' => '', 'SHTYPE' => 'M3-Lis-in',
'SHDATA' => 'No Json File Found...', 'SHUSER' => $rEQKPKUS, 'SHSOURCE' => $sHSOURCE, 'SHCO' => $company, 'SHWHS' => $warehouse, 'SHACKNOTE' => $sHACKNOTE];
Helper::logToICM699M($data);
return response()->json([
'code' => '415',
'status' => 'error',
'message' => 'No Json File Found',
]);
}
} catch (\Throwable $th) {
// Write to Logs Out : Error & JSON
$data = ['SHMACPKR' => $sHMACPKR, 'SHDT' => date('Y-m-d'), 'SHTIME' => date('H:i:s'), 'SHERROR' => 'X', 'SHINTBOX' => '', 'SHTYPE' => 'M3-Lis-in',
'SHDATA' => 'General Catchable Error - ' . substr($th, 0, 300) . self::M3_LIST_SUFFIX . json_encode($jsonFile), 'SHUSER' => $rEQKPKUS, 'SHSOURCE' => $sHSOURCE, 'SHCO' => $company, 'SHWHS' => $warehouse];
Helper::logToICM699M($data);
return response()->json([
'code' => '405',
'status' => 'error',
'message' => 'An Error Occured...',
]);
}
}
public function show($id)
{
// This resource endpoint is intentionally unsupported.
}
public function edit($id)
{
// This resource endpoint is intentionally unsupported.
}
public function update(Request $request, $id)
{
// This resource endpoint is intentionally unsupported.
}
public function destroy($id)
{
// This resource endpoint is intentionally unsupported.
}
}
+150
View File
@@ -0,0 +1,150 @@
<?php
namespace Modules\M3\Http\Controllers\API;
use Cache;
use Config;
use File;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Modules\M3\Helpers\Helper;
use Modules\M3\Http\Controllers\Controller;
use Str;
class PdfStorage extends Controller
{
private const ZERO_PAD = '000000';
public function PdfStorageAPI(Request $request): JsonResponse
{
$this->configureTimeouts();
$context = $this->requestContext($request);
if ($context === null) {
return $this->errorResponse('No URL Parameters Sent', self::ZERO_PAD, '', '', '');
}
try {
$this->logRequest($context);
$cacheKey = $this->buildCacheKey($context);
$pdfFileName = (string) Config::get('arrays.PdfPath') . $context['FILENAME'] . '.pdf';
$error = $this->validateStorageRequest($pdfFileName, $cacheKey);
if ($error !== null) {
return $this->errorResponse($error, $context['DELIVERYNO'], $context['DOCNUM'], $context['COMPANY'], $context['WHS']);
}
Cache::forever($cacheKey, base64_encode(File::get($pdfFileName)));
$this->logResult($context, 'PDF File converted to Base64 and Saved to Cache.Key: ' . $cacheKey);
return response()->json(['code' => '200', 'status' => 'Success', 'cacheKey' => $cacheKey]);
} catch (\Throwable $exception) {
$message = 'An Error Occured - ' . substr($exception->getMessage(), 0, 300);
$this->safeLog($context, $message, true);
return response()->json([
'code' => '405',
'status' => 'error',
'message' => 'Catched Error: ' . $exception->getMessage(),
]);
}
}
private function configureTimeouts(): 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);
}
private function requestContext(Request $request): ?array
{
if ($request->all() === []) {
return null;
}
$context = [];
foreach (['COMPANY', 'WHS', 'DOCTYPE', 'FILENAME', 'DOCNUM', 'A4MACPKR'] as $key) {
$context[$key] = trim((string) $request->input($key, ''));
}
$context['DELIVERYNO'] = $context['A4MACPKR'] !== '' ? $context['A4MACPKR'] : self::ZERO_PAD;
$context['SHUSER'] = m3_user() !== '' ? Str::upper(m3_user()) : 'WebUser';
$context['SHSOURCE'] = 'PdfStorageAPI';
return $context;
}
private function buildCacheKey(array $context): string
{
foreach (['A4MACPKR', 'DOCTYPE', 'DOCNUM', 'COMPANY', 'WHS'] as $required) {
if ($context[$required] === '') {
return '';
}
}
return $context['A4MACPKR'] . $context['DOCTYPE'] . $context['DOCNUM'] . $context['COMPANY'] . $context['WHS'];
}
private function validateStorageRequest(string $pdfFileName, string $cacheKey): ?string
{
$messages = [];
if (! File::exists($pdfFileName)) {
$messages[] = 'PDF File Not Found-';
}
if ($cacheKey === '') {
$messages[] = 'Cache Key is missing Params';
}
return $messages === [] ? null : implode('', $messages);
}
private function logRequest(array $context): void
{
$params = array_intersect_key($context, array_flip(['COMPANY', 'WHS', 'DOCTYPE', 'FILENAME', 'A4MACPKR', 'DOCNUM']));
$this->safeLog($context, json_encode($params, JSON_THROW_ON_ERROR), false, 'M3-Req-out');
}
private function logResult(array $context, string $message): void
{
$this->safeLog($context, $message);
}
private function safeLog(array $context, string $message, bool $error = false, string $type = 'M3-Res-out'): void
{
try {
Helper::logToICM699M([
'SHMACPKR' => $context['DELIVERYNO'] ?? self::ZERO_PAD,
'SHDT' => date('Y-m-d'),
'SHTIME' => date('H:i:s'),
'SHERROR' => $error ? 'X' : '',
'SHINTBOX' => $context['DOCNUM'] ?? '',
'SHTYPE' => $type,
'SHDATA' => $message,
'SHUSER' => $context['SHUSER'] ?? (m3_user() !== '' ? Str::upper(m3_user()) : 'WebUser'),
'SHSOURCE' => $context['SHSOURCE'] ?? 'PdfStorageAPI',
'SHCO' => $context['COMPANY'] ?? '',
'SHWHS' => $context['WHS'] ?? '',
]);
} catch (\Throwable) {
// Logging must never turn an API response into a 500 error.
}
}
private function errorResponse(string $message, string $deliveryNo, string $docNum, string $company, string $warehouse): JsonResponse
{
$context = [
'DELIVERYNO' => $deliveryNo,
'DOCNUM' => $docNum,
'COMPANY' => $company,
'WHS' => $warehouse,
'SHUSER' => m3_user() !== '' ? Str::upper(m3_user()) : 'WebUser',
'SHSOURCE' => 'PdfStorageAPI',
];
$this->safeLog($context, 'An Error Occured -' . $message, true);
return response()->json(['code' => '405', 'status' => 'Error', 'message' => $message]);
}
}
+276
View File
@@ -0,0 +1,276 @@
<?php
namespace Modules\M3\Http\Controllers\API;
use Config;
use DB;
use Http;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Log;
use Modules\M3\Helpers\Helper;
use Modules\M3\Http\Controllers\Controller;
use Str;
class ReplenAPI extends Controller
{
private const ZERO_PAD = '000000';
private const JSON_CONTENT_TYPE = 'application/json';
// M3Replenishement with URL Params
public function M3InventoryReportReplen(Request $request)
{
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'));
// dd($request->all());
// Log::info( $request->all() );
// Get The Calling User
$sHUSER = m3_user() !== '' ? Str::upper(m3_user()) : 'WebUser';
$mACPKR = isset($mACPKR) ? $mACPKR : self::ZERO_PAD;
$sHSOURCE = 'M3InventoryReportReplen';
$m3Errors = '';
try {
// Get Json Contents
$urlParams = count($request->all()) > 0 ? $request->all() : '';
$cO = isset($urlParams['CO']) ? $urlParams['CO'] : '';
$wHS = isset($urlParams['WHS']) ? $urlParams['WHS'] : '';
$pARTNO = isset($urlParams['PARTNO']) ? $urlParams['PARTNO'] : '';
$pKLN = isset($urlParams['PKLN']) ? $urlParams['PKLN'] : '';
$rEQPKWS = isset($urlParams['REQPKWS']) ? $urlParams['REQPKWS'] : '';
$rEQKPKUS = isset($urlParams['REQKPKUS']) ? $urlParams['REQKPKUS'] : 'WebUser';
if ($urlParams != '') {
$incomingParams = ['CO' => $cO, 'WHS' => $wHS, 'PARTNO' => $pARTNO, 'PKLN' => $pKLN, 'REQPKWS' => $rEQPKWS, 'REQKPKUS' => $rEQKPKUS];
$incomingParams = json_encode($incomingParams);
// Write to Logs : Params In
$data = ['SHMACPKR' => $mACPKR, 'SHDT' => date('Y-m-d'), 'SHTIME' => date('H:i:s'), 'SHERROR' => '', 'SHINTBOX' => '', 'SHTYPE' => 'M3-Req-out',
'SHDATA' => $incomingParams, 'SHUSER' => $sHUSER, 'SHSOURCE' => $sHSOURCE, 'SHCO' => $cO, 'SHWHS' => $wHS];
Helper::logToICM699M($data);
$pART = explode(',', $pARTNO);
foreach ($pART as $value) {
$pARTS[] = ['PART' => $value, 'LOT' => ''];
}
$jSON = json_encode(['WHS' => $wHS, 'PARTS' => $pARTS]);
// Write to Logs : Params Sent To M3
$data = ['SHMACPKR' => $mACPKR, 'SHDT' => date('Y-m-d'), 'SHTIME' => date('H:i:s'), 'SHERROR' => '', 'SHINTBOX' => '', 'SHTYPE' => 'M3-Req-out',
'SHDATA' => 'Sent To M3-' . $jSON, 'SHUSER' => $sHUSER, 'SHSOURCE' => $sHSOURCE, 'SHCO' => $cO, 'SHWHS' => $wHS];
Helper::logToICM699M($data);
// Get Token
$tokenResponse = Helper::checkReceiveTokenV2();
$tokenData = $tokenResponse->getData();
if ($tokenData->code == '200') {
$ionToken = isset($tokenData->token) ? $tokenData->token : '';
} else {
$sHDATA = isset($tokenData->message) ? $tokenData->message : '';
// Write to Logs : Error
$data = ['SHMACPKR' => $mACPKR, 'SHDT' => date('Y-m-d'), 'SHTIME' => date('H:i:s'), 'SHERROR' => 'X', 'SHINTBOX' => '', 'SHTYPE' => 'M3-Res-out',
'SHDATA' => $sHDATA, 'SHUSER' => $sHUSER, 'SHSOURCE' => $sHSOURCE, 'SHCO' => $cO, 'SHWHS' => $wHS];
Helper::logToICM699M($data);
return $tokenResponse;
}
// Call ionapi with Params
$endPointURL = env('ENDPOINTURL') . 'APIFLOWS/Sentinel/M3InventoryReportList?ionapiRespStyle=sync';
$token = $ionToken;
$response = Http::withHeaders([
'accept' => self::JSON_CONTENT_TYPE,
'Content-Type' => self::JSON_CONTENT_TYPE,
])
->withToken($token)
->withBody($jSON, self::JSON_CONTENT_TYPE)
->timeout(Config::get('arrays.curlTimeOut'))
->retry(3, 100)
->post($endPointURL);
$responseStatusCode = $response->getStatusCode();
$m3SessionId = $response->hasHeader('x-transaction-id') ? '-sessionID:' . $response->header('x-transaction-id') : '-sessionID';
if ($responseStatusCode == '200') {
// Check M3 Response for Errors
$m3Errors = '';
$responseJSON = $response->getBody()->getContents();
$jsonSanytized = Helper::sanityzeString($responseJSON);
// Array
$responseArray = json_decode($jsonSanytized, true);
$responseTMP = $responseArray['result'];
} else {
$m3Errors = 'Error: No Response from M3';
}
// Validate response From M3
if ($m3Errors != '') {
// Write to Logs : Error
$data = ['SHMACPKR' => $mACPKR, 'SHDT' => date('Y-m-d'), 'SHTIME' => date('H:i:s'), 'SHERROR' => 'X', 'SHINTBOX' => '', 'SHTYPE' => 'M3-Res-out',
'SHDATA' => $responseStatusCode . '-' . $m3Errors . $m3SessionId, 'SHUSER' => $sHUSER, 'SHSOURCE' => $sHSOURCE, 'SHCO' => $cO, 'SHWHS' => $wHS];
Helper::logToICM699M($data);
// Send Response
return response()->json([
'code' => '405',
'status' => 'error',
'message' => 'Error: No Response from M3',
]);
} else {
// Write to Logs : JSON
$data = ['SHMACPKR' => $mACPKR, 'SHDT' => date('Y-m-d'), 'SHTIME' => date('H:i:s'), 'SHERROR' => '', 'SHINTBOX' => '', 'SHTYPE' => 'M3-Res-out',
'SHDATA' => $responseStatusCode . '-' . $jsonSanytized . $m3SessionId, 'SHUSER' => $sHUSER, 'SHSOURCE' => $sHSOURCE, 'SHCO' => $cO, 'SHWHS' => $wHS];
Helper::logToICM699M($data);
}
$dataToWrite2 = [];
foreach ($responseTMP as $value) {
$dataToWrite = [];
foreach ($value as $key2 => $content) {
if ($key2 != 'Locations') {
$dataToWrite[$key2] = $content;
} else {
foreach ($content as $content2) {
$dataToWrite2[] = array_merge($dataToWrite, $content2);
}
}
}
}
// Delete Old Records from IC630M
foreach ($dataToWrite2 as $value) {
DB::connection(config('m3.connection', 'pgsql'))->table('ic630m')
->where('LLCO', $cO)
->where('LLWHNO', $wHS)
->where('LLPPN', trim($value['PartNumber']))
->delete();
}
foreach ($dataToWrite2 as $value) {
// Check if Location exist in DE640M $value['Location']
$dE640MSQLSEL = DB::connection(config('m3.connection', 'pgsql'))->table('de640m')
->where('LVCO', $cO)
->where('WSELOC', $value['Warehouse'])
->where('VLOCID', $value['Location'])
->first();
$locationExist = isset($dE640MSQLSEL->VLOCID) ? trim($dE640MSQLSEL->VLOCID) : '';
$wHExist = isset($dE640MSQLSEL->WSELOC) ? trim($dE640MSQLSEL->WSELOC) : '';
$cOExist = isset($dE640MSQLSEL->LVCO) ? trim($dE640MSQLSEL->LVCO) : '';
// if No records Founds insert New Record
if ($locationExist == '' && $wHExist == '' && $cOExist == '') {
$sQLInsertPrep640M['LVCO'] = $cO; // Company
$sQLInsertPrep640M['WSELOC'] = $value['Warehouse'];
// $sQLInsertPrep640M['LVUSD3'] = $value['']; // Pallet Size : Not Found in M3 JSON
$sQLInsertPrep640M['VLOCID'] = $value['Location']; // Stock location
$sQLInsertPrep640M['LVSEQN'] = $value['LocationSeq'];
$sQLInsertPrep640M['LVUSD2'] = $value['LocationType'];
$sQLInsertPrep640M['LVZONE'] = $value['Zone']; // Warehouse zone
$sQLInsertPrep640M['LVMAINTTS'] = now(); // Last maintained time stamp
DB::connection(config('m3.connection', 'pgsql'))->table('de640m')->insert($sQLInsertPrep640M);
}
// Update
else {
$sQLUpdatePrep640M['LVSEQN'] = $value['LocationSeq'];
$sQLUpdatePrep640M['LVUSD2'] = $value['LocationType'];
$sQLUpdatePrep640M['LVZONE'] = $value['Zone'];
$sQLUpdatePrep640M['LVMAINTTS'] = now();
DB::connection(config('m3.connection', 'pgsql'))->table('de640m')
->where('LVCO', $cO)
->where('WSELOC', $value['Warehouse'])
->where('VLOCID', $value['Location'])
->update($sQLUpdatePrep640M);
}
// Insert New Records to IC630M
$sQLInsertPrep630M = [];
$sQLInsertPrep630M['LLCO'] = $cO; // Company
$sQLInsertPrep630M['LLWHNO'] = $value['Warehouse']; // Warehouse
$sQLInsertPrep630M['LLPPN'] = $value['PartNumber']; // Part Number
$sQLInsertPrep630M['LLBALANCE'] = $value['Quantity']; // Quantity
$sQLInsertPrep630M['LLSTLC'] = $value['Location']; // Stock location
$sQLInsertPrep630M['LLLTNO'] = $value['LotNumber']; // Lot Number
$sQLInsertPrep630M['LLMAINTTS'] = now(); // Request time timestamp
$sQLInsertPrep630M['LLIZLCF'] = trim($value['LotNumber']) != '' ? '1' : ''; // Lot control flag
$sQLInsertPrep630M['LLSPR10A01'] = $value['Allocation']; // Allocation
$sQLInsertPrep630M['LLSPR15A01'] = $value['AllocatedTo']; // AllocatedTo
$descSanytized = Helper::sanityzeString($value['Description']);
// $descSanytized = str_replace(['–','\u20131'], '-',$value['Description']);
$sQLInsertPrep630M['LLCMDESC'] = $descSanytized; // Description
DB::connection(config('m3.connection', 'pgsql'))->table('ic630m')->insert($sQLInsertPrep630M);
}
// Send Response
return response()->json([
'code' => '200',
'status' => 'Success',
]);
} else {
// Write to Logs Out : Error
$mACPKR = isset($mACPKR) ? $mACPKR : self::ZERO_PAD;
$data = ['SHMACPKR' => $mACPKR, 'SHDT' => date('Y-m-d'), 'SHTIME' => date('H:i:s'), 'SHERROR' => 'X', 'SHINTBOX' => '', 'SHTYPE' => 'M3-Res-out',
'SHDATA' => 'No URL Parameters Sent', 'SHUSER' => $sHUSER, 'SHSOURCE' => $sHSOURCE, 'SHCO' => $cO, 'SHWHS' => $wHS];
Helper::logToICM699M($data);
// Return Error
return response()->json([
'code' => '405',
'status' => 'Error',
'message' => 'No URL Parameters Sent',
]);
}
} catch (\Throwable $th) {
// Write to Logs Out : Error
$mACPKR = isset($mACPKR) ? $mACPKR : self::ZERO_PAD;
$getCurlErrors = str_contains($th->getMessage(), 'cURL error');
if ($getCurlErrors) {
// dd($getCurlErrors);
// Write to Logs Out : Failed
$data = ['SHMACPKR' => $mACPKR, 'SHDT' => date('Y-m-d'), 'SHTIME' => date('H:i:s'), 'SHERROR' => 'X', 'SHINTBOX' => '', 'SHTYPE' => 'M3-Res-out',
'SHDATA' => 'Curl Error: Communication with M3 Timed Out' . ' M3-JSN-out' . $incomingParams, 'SHUSER' => $sHUSER, 'SHSOURCE' => $sHSOURCE, 'SHCO' => $cO, 'SHWHS' => $wHS];
Helper::logToICM699M($data);
return response()->json([
'code' => '405',
'status' => 'error',
'message' => 'Curl Error: Communication with M3 Timed Out.',
]);
} else {
// Set SHERROR To Z if Duplicate Key Detected $th
// Read The substring from SHDATA after M3-JSN-out
$sHERROR = 'X';
$word = 'Duplicate key value specified';
$position = strpos($th, $word);
if ($position !== false) {
$sHERROR = 'Z';
}
$data = ['SHMACPKR' => $mACPKR, 'SHDT' => date('Y-m-d'), 'SHTIME' => date('H:i:s'), 'SHERROR' => $sHERROR, 'SHINTBOX' => '', 'SHTYPE' => 'M3-Res-out',
'SHDATA' => 'An Error Occured - ' . substr($th, 0, 300), 'SHUSER' => $sHUSER, 'SHSOURCE' => $sHSOURCE, 'SHCO' => $cO, 'SHWHS' => $wHS];
Helper::logToICM699M($data);
return response()->json([
'code' => '405',
'status' => 'error',
'message' => 'Catched Error: ' . $th,
]);
}
}
}
// End M3InventoryReportReplen
}
+698
View File
@@ -0,0 +1,698 @@
<?php
namespace Modules\M3\Http\Controllers\API;
use Config;
use DateTime;
use DB;
use Http;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Log;
use Modules\M3\Helpers\Helper;
use Modules\M3\Http\Controllers\Controller;
use Str;
class TransferAPI extends Controller
{
private const ZERO_PAD = '000000';
private const JSON_CONTENT_TYPE = 'application/json';
private const ORDER_CATEGORY_LABEL = ' Order Category: ';
private const NO_URL_PARAMETERS = 'No URL Parameters Sent';
// TransferAPIURL : with URL PARAMS
public function TransferAPIURL(Request $request)
{
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'));
// Get the Calling User
$sHUSER = m3_user() !== '' ? Str::upper(m3_user()) : 'WebUser';
// Set SHSOURCE
$sHSOURCE = 'TransferAPIURL';
$m3Errors = '';
// Get URL PARAMS
$urlParams = count($request->all()) > 0 ? $request->all() : '';
$dIVI = isset($urlParams['COMPANY']) ? $urlParams['COMPANY'] : '';
$wHS = isset($urlParams['WHS']) ? $urlParams['WHS'] : '';
try {
if ($urlParams != '') {
$pART = isset($urlParams['PART']) ? $urlParams['PART'] : '';
$lOCATIONFROM = isset($urlParams['LOCATIONFROM']) ? $urlParams['LOCATIONFROM'] : '';
$lOCATIONTO = isset($urlParams['LOCATIONTO']) ? $urlParams['LOCATIONTO'] : '';
$qUANTITY = isset($urlParams['QUANTITY']) ? $urlParams['QUANTITY'] : '';
$oRDERCATEGORY = isset($urlParams['ORDERCATEGORY']) ? $urlParams['ORDERCATEGORY'] : '';
$lOTNUMBER = isset($urlParams['LOTNUMBER']) ? $urlParams['LOTNUMBER'] : '';
$cONUMBER = isset($urlParams['CONUMBER']) ? $urlParams['CONUMBER'] : '';
$cOLINENO = isset($urlParams['COLINENO']) ? $urlParams['COLINENO'] : '';
$dELIVERYNO = isset($urlParams['DELIVERYNO']) ? $urlParams['DELIVERYNO'] : self::ZERO_PAD;
$pICKLISTSUFFIX = isset($urlParams['PICKLISTSUFFIX']) ? $urlParams['PICKLISTSUFFIX'] : '';
$eNDFLAG = isset($urlParams['ENDFLAG']) ? $urlParams['ENDFLAG'] : '';
$tYPE = isset($urlParams['TYPE']) ? $urlParams['TYPE'] : '';
$cOLINESUFFIX = isset($urlParams['COLINESUFFIX']) ? $urlParams['COLINESUFFIX'] : '';
// TYPE :
// DeliveryNote
// S15
// CloseShipment
// COCharge
// Replenishment
// Move
// ORDERCATEGORY : Order Category
// 1 = Material to manufacturing order
// 3 = Customer Order
// 4 = Requisition Order
// 5 = Distribution Order
// 9 = Move order
$dELIVERYNO = isset($dELIVERYNO) ? $dELIVERYNO : self::ZERO_PAD;
$tRANSTYPE = isset($urlParams['TRANSTYPE']) ? $urlParams['TRANSTYPE'] : ''; // R for Retry
$sHDT = isset($urlParams['SHDT']) ? $urlParams['SHDT'] : '';
$sHTIME = isset($urlParams['SHTIME']) ? $urlParams['SHTIME'] : '';
$sHTYPE = isset($urlParams['SHTYPE']) ? $urlParams['SHTYPE'] : '';
// Retry Transfer
if ($tRANSTYPE == 'R') {
// $t = strtotime($sHTIME);
// $SHTIMEHM = date('H:i',$t);
// dd($SHTIMEHM);
// Get the record that contain the payload
$iCM699MS = DB::connection(config('m3.connection', 'pgsql'))->table('icm699m')
->select('SHDATA')
->where('SHMACPKR', $dELIVERYNO)
->where('SHDT', $sHDT)
->where('SHTIME', $sHTIME)
// ->whereRaw("VARCHAR_FORMAT (TIMESTAMP (CURRENT DATE) + MIDNIGHT_SECONDS (SHTIME) SECONDS, 'HH24:MI') = ?", [$SHTIMEHM])
->where('SHCO', $dIVI)
->where('SHWHS', $wHS)
->where('SHSOURCE', $sHSOURCE)
->where('SHERROR', 'X')
->where('SHTYPE', $sHTYPE)
->first();
// Read The substring from SHDATA after M3-JSN-out
$word = 'M3-JSN-out';
$sHDATA = isset($iCM699MS->SHDATA) ? $iCM699MS->SHDATA : '';
$sHDATAJSON = '';
$position = strpos($sHDATA, $word);
// Also Read CommTCP_read
$word2 = 'url:http://127.0.0.1:10005/api/TransferAPIURL?';
$sHDATA2 = isset($iCM699MS->SHDATA) ? $iCM699MS->SHDATA : '';
$position2 = strpos($sHDATA2, $word2);
if ($position !== false) {
$sHDATAJSON = substr($sHDATA, $position + strlen($word));
} elseif ($position2 !== false) {
$sHDATAJSONS = substr($sHDATA2, $position2 + strlen($word2));
$sHDATAJSONA = [];
parse_str($sHDATAJSONS, $sHDATAJSONA);
$sHDATAJSON = json_encode($sHDATAJSONA);
}
// Find the position of the opening and closing curly braces
$startPos = strpos($sHDATAJSON, '{');
$endPos = strrpos($sHDATAJSON, '}');
// Extract the substring within the curly braces
$sHDATAJSON = substr($sHDATAJSON, $startPos, $endPos - $startPos + 1);
$jSONTR = $sHDATAJSON != '' ? json_decode($sHDATAJSON) : '';
if ($jSONTR != '') {
$pART = isset($jSONTR->PART) ? $jSONTR->PART : '';
$lOCATIONFROM = isset($jSONTR->LOCATIONFROM) ? $jSONTR->LOCATIONFROM : '';
$lOCATIONTO = isset($jSONTR->LOCATIONTO) ? $jSONTR->LOCATIONTO : '';
$qUANTITY = isset($jSONTR->QUANTITY) ? $jSONTR->QUANTITY : '';
$oRDERCATEGORY = isset($jSONTR->ORDERCATEGORY) ? $jSONTR->ORDERCATEGORY : '';
$lOTNUMBER = isset($jSONTR->LOTNUMBER) ? $jSONTR->LOTNUMBER : '';
$cONUMBER = isset($jSONTR->CONUMBER) ? $jSONTR->CONUMBER : '';
$cOLINENO = isset($jSONTR->COLINENO) ? $jSONTR->COLINENO : '';
$dELIVERYNO = isset($jSONTR->DELIVERYNO) ? $jSONTR->DELIVERYNO : self::ZERO_PAD;
$pICKLISTSUFFIX = isset($jSONTR->PICKLISTSUFFIX) ? $jSONTR->PICKLISTSUFFIX : '';
$eNDFLAG = isset($jSONTR->ENDFLAG) ? $jSONTR->ENDFLAG : '';
$tYPE = isset($jSONTR->TYPE) ? $jSONTR->TYPE : '';
$cOLINESUFFIX = isset($jSONTR->COLINESUFFIX) ? $jSONTR->COLINESUFFIX : '';
}
// Set SHERROR to Z in ICM699M
DB::connection(config('m3.connection', 'pgsql'))->table('icm699m')
->where('SHMACPKR', $dELIVERYNO)
->where('SHDT', $sHDT)
->where('SHTIME', $sHTIME)
->where('SHCO', $dIVI)
->where('SHWHS', $wHS)
->where('SHSOURCE', $sHSOURCE)
->where('SHERROR', 'X')
->where('SHTYPE', $sHTYPE)
->update(['SHERROR' => 'Z', 'SHACKUSER' => $sHUSER, 'SHACKDATE' => date('Y-m-d'), 'SHACKTIME' => date('H:i:s')]);
}
// Part Exists : proceed
if ($pART != '') {
// Read from ICM688M2
// Get Parts And Lots from ICM688M2
$iCM688M2SLTMP = DB::connection(config('m3.connection', 'pgsql'))->table('icm688m2')
->select('A5BRADLN', 'A5PKSFX', 'A5PLANT', 'A5SENTPKR')
->distinct()
->where('A5CO', $dIVI)
->where('A5WHS', $wHS)
->where('A5MACPKR', $dELIVERYNO);
// Get Pack Lines
if ($cOLINENO != '') {
$iCM688M2SLTMP->where('A5PKLN', $cOLINENO);
}
$iCM688M2SL = $iCM688M2SLTMP->first();
$a5BRADLINE = isset($iCM688M2SL->A5BRADLN) ? $iCM688M2SL->A5BRADLN : '';
$cOLINESUFFIX = isset($iCM688M2SL->A5PKSFX) ? $iCM688M2SL->A5PKSFX : ''; // Case 551 : $cOLINESUFFIX
$a5PLANT = isset($iCM688M2SL->A5PLANT) ? $iCM688M2SL->A5PLANT : '';
$a5SENTPKR = isset($iCM688M2SL->A5SENTPKR) ? $iCM688M2SL->A5SENTPKR : '';
$jSONIN = json_encode([
'DIVI' => $dIVI,
'WHS' => $wHS,
'PART' => $pART,
'LOCATIONFROM' => $lOCATIONFROM,
'LOCATIONTO' => $lOCATIONTO,
'QUANTITY' => $qUANTITY,
'ORDERCATEGORY' => $oRDERCATEGORY,
'LOTNUMBER' => $lOTNUMBER,
'CONUMBER' => $cONUMBER,
'COLINENO' => $cOLINENO,
'DELIVERYNO' => $dELIVERYNO,
'PICKLISTSUFFIX' => $pICKLISTSUFFIX,
'ENDFLAG' => $eNDFLAG,
'TYPE' => $tYPE,
'COLINESUFFIX' => $cOLINESUFFIX,
], JSON_UNESCAPED_SLASHES);
$jSON = json_encode([
'DIVI' => $dIVI,
'WHS' => $wHS,
'PART' => $pART,
'LOCATIONFROM' => $lOCATIONFROM,
'LOCATIONTO' => $lOCATIONTO,
'QUANTITY' => $qUANTITY,
'ORDERCATEGORY' => $oRDERCATEGORY,
'LOTNUMBER' => $lOTNUMBER,
'CONUMBER' => $cONUMBER,
'COLINENO' => $a5BRADLINE,
'DELIVERYNO' => $dELIVERYNO,
'PICKLISTSUFFIX' => $pICKLISTSUFFIX,
'ENDFLAG' => $eNDFLAG,
'TYPE' => $tYPE,
'COLINESUFFIX' => $cOLINESUFFIX,
], JSON_UNESCAPED_SLASHES);
// Write JSON Params to Logs Out
$data = ['SHMACPKR' => $dELIVERYNO,
'SHDT' => date('Y-m-d'),
'SHTIME' => date('H:i:s'),
'SHERROR' => '',
'SHINTBOX' => '',
'SHTYPE' => 'M3-Req-out',
'SHDATA' => $jSON,
'SHUSER' => $sHUSER,
'SHSOURCE' => $sHSOURCE,
'SHCO' => $dIVI,
'SHWHS' => $wHS,
];
Helper::logToICM699M($data);
// Get Token
$tokenResponse = Helper::checkReceiveTokenV2();
$tokenData = $tokenResponse->getData();
if ($tokenData->code == '200') {
$ionToken = isset($tokenData->token) ? $tokenData->token : '';
} else {
$sHDATA = isset($tokenData->message) ? $tokenData->message : '';
// Write to Logs : Error
$data = ['SHMACPKR' => $dELIVERYNO,
'SHDT' => date('Y-m-d'),
'SHTIME' => date('H:i:s'),
'SHERROR' => '',
'SHINTBOX' => '',
'SHTYPE' => 'M3-Res-out',
'SHDATA' => $sHDATA,
'SHUSER' => $sHUSER,
'SHSOURCE' => $sHSOURCE,
'SHCO' => $dIVI,
'SHWHS' => $wHS,
];
Helper::logToICM699M($data);
return $tokenResponse;
}
// Call ionapi with Params
$endPointURL = env('ENDPOINTURL') . 'APIFLOWS/Sentinel/TransferAPI?ionapiRespStyle=sync';
$token = $ionToken;
$response = Http::withHeaders([
'accept' => self::JSON_CONTENT_TYPE,
'Content-Type' => self::JSON_CONTENT_TYPE,
])
->withToken($token)
->withBody($jSON, self::JSON_CONTENT_TYPE)
->timeout(Config::get('arrays.curlTimeOut'))
->post($endPointURL);
$responseStatusCode = $response->getStatusCode();
$m3SessionId = $response->hasHeader('x-transaction-id') ? '-sessionID:' . $response->header('x-transaction-id') : '-sessionID';
$m3ResponseTimeTmp = $response->hasHeader('x-response-time') ? ltrim($response->header('x-response-time'), '-') : '0';
$m3ResponseTimeTmp2 = floatval($m3ResponseTimeTmp) / 1000;
$dateTime = new DateTime;
$dateTime->setTimestamp($m3ResponseTimeTmp2);
$m3ResponseTime = $m3ResponseTimeTmp != '' ? '-M3ResponseTime:' . $dateTime->format('d/m/Y H:i:s.v') : '-M3ResponseTime';
$transferStats = $response->transferStats;
$m3transferTime = $transferStats->getTransferTime() != null ? '-M3transferTime:' . $transferStats->getTransferTime() : '-M3transferTime';
if ($responseStatusCode == '200') {
$responseContents = json_decode($response->getBody()->getContents());
$responseResult = $responseContents->result;
$m3JSONResponse = json_encode($responseContents);
// Check M3 Response for Errors
$m3Errors = Helper::checkM3Errors($responseResult);
} else {
$m3JSONResponse = '';
$m3Errors = 'Error: No Response from M3';
}
if ($m3Errors == '') {
// Write to Logs Out : Success
$data = ['SHMACPKR' => $dELIVERYNO,
'SHDT' => date('Y-m-d'),
'SHTIME' => date('H:i:s'),
'SHERROR' => '',
'SHINTBOX' => '',
'SHTYPE' => 'M3-Res-out',
'SHDATA' => $responseStatusCode . 'TYPE :' . $tYPE . self::ORDER_CATEGORY_LABEL . $oRDERCATEGORY . '-' . $m3JSONResponse . $m3SessionId . $m3ResponseTime . $m3transferTime,
'SHUSER' => $sHUSER,
'SHSOURCE' => $sHSOURCE,
'SHCO' => $dIVI,
'SHWHS' => $wHS,
];
Helper::logToICM699M($data);
// Log to ICM799M
DB::connection(config('m3.connection', 'pgsql'))->table('icm799m')
->insert(['IMDIV' => $dIVI,
'IMPLANT' => $a5PLANT,
'IMWHS' => $wHS,
'IMSENTPKR' => $a5SENTPKR,
'IMDELNO' => $dELIVERYNO,
'IMORDER' => $cONUMBER,
'IMLINE' => $cOLINENO,
'IMBRADLN' => $a5BRADLINE,
'IMSUFFIX' => $pICKLISTSUFFIX,
'IMPART' => $pART,
'IMLOT' => $lOTNUMBER,
'IMQTY' => $qUANTITY,
'IMFRLOC' => $lOCATIONFROM,
'IMTOLOC' => $lOCATIONTO,
'IMDATE' => date('Ymd'),
'IMTIME' => date('His'),
]);
return response()->json([
'code' => $responseStatusCode,
'status' => 'Success',
]);
} else {
// Write to Logs Out : Failed
$data = ['SHMACPKR' => $dELIVERYNO,
'SHDT' => date('Y-m-d'),
'SHTIME' => date('H:i:s'),
'SHERROR' => 'X',
'SHINTBOX' => '',
'SHTYPE' => 'M3-Res-out',
'SHDATA' => $responseStatusCode . '-' . $m3Errors . '-TYPE:' . $tYPE . self::ORDER_CATEGORY_LABEL . $oRDERCATEGORY . '-' . $m3JSONResponse .
'M3-JSN-out' . $jSONIN . $m3SessionId . $m3ResponseTime . $m3transferTime,
'SHUSER' => $sHUSER,
'SHSOURCE' => $sHSOURCE,
'SHCO' => $dIVI,
'SHWHS' => $wHS,
];
Helper::logToICM699M($data);
return response()->json([
'code' => '206',
'status' => 'Error',
'message' => $responseStatusCode . '-' . $m3Errors . '- TYPE :' . $tYPE . self::ORDER_CATEGORY_LABEL . $oRDERCATEGORY . '-' . $m3JSONResponse,
]);
}
}
// Part Does not Exist : Failure
else {
// Return Error
return response()->json([
'code' => '405',
'status' => 'Error',
'message' => 'Json Payload Not Valid, possible cause: Retry butto was clicked by another user.',
]);
}
} else {
// Write to Logs Out : Error
$dELIVERYNO = isset($dELIVERYNO) ? $dELIVERYNO : self::ZERO_PAD;
$data = ['SHMACPKR' => $dELIVERYNO,
'SHDT' => date('Y-m-d'),
'SHTIME' => date('H:i:s'),
'SHERROR' => 'X',
'SHINTBOX' => '',
'SHTYPE' => 'M3-Res-out',
'SHDATA' => self::NO_URL_PARAMETERS,
'SHUSER' => $sHUSER,
'SHSOURCE' => $sHSOURCE,
'SHCO' => $dIVI,
'SHWHS' => $wHS,
];
Helper::logToICM699M($data);
// Return Error
return response()->json([
'code' => '405',
'status' => 'Error',
'message' => self::NO_URL_PARAMETERS,
]);
}
} catch (\Throwable $th) {
$getCurlErrors = str_contains($th->getMessage(), 'cURL error');
if ($getCurlErrors) {
// Write to Logs Out : Failed
$data = ['SHMACPKR' => $dELIVERYNO,
'SHDT' => date('Y-m-d'),
'SHTIME' => date('H:i:s'),
'SHERROR' => 'X',
'SHINTBOX' => '',
'SHTYPE' => 'M3-Res-out',
'SHDATA' => 'Curl Error: Communication with M3 Timed Out' . ' M3-JSN-out' . $jSONIN,
'SHUSER' => $sHUSER,
'SHSOURCE' => $sHSOURCE,
'SHCO' => $dIVI,
'SHWHS' => $wHS,
];
Helper::logToICM699M($data);
return response()->json([
'code' => '405',
'status' => 'error',
'message' => 'Curl Error: Communication with M3 Timed Out.',
]);
} else {
// Write to Logs Out : Error
$dELIVERYNO = isset($dELIVERYNO) ? $dELIVERYNO : self::ZERO_PAD;
$data = ['SHMACPKR' => $dELIVERYNO,
'SHDT' => date('Y-m-d'),
'SHTIME' => date('H:i:s'),
'SHERROR' => 'X',
'SHINTBOX' => '',
'SHTYPE' => 'M3-Err-out',
'SHDATA' => 'An Error Occured - ' . substr($th, 0, 300),
'SHUSER' => $sHUSER,
'SHSOURCE' => $sHSOURCE,
'SHCO' => $dIVI,
'SHWHS' => $wHS,
];
Helper::logToICM699M($data);
Log::error($th);
return response()->json([
'code' => '405',
'status' => 'error',
'message' => 'Uncaught Error',
]);
}
}
}
// End TransferAPIURL
// UpdateShipmentNumber : with URL PARAMS
public function UpdateShipmentNumber(Request $request)
{
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'));
// Get the Calling User
$sHUSER = m3_user() !== '' ? Str::upper(m3_user()) : 'WebUser';
// Set SHSOURCE
$sHSOURCE = 'UpdateShipmentNumber';
$m3Errors = '';
// Get URL PARAMS
$urlParams = count($request->all()) > 0 ? $request->all() : '';
$dIVI = isset($urlParams['COMPANY']) ? $urlParams['COMPANY'] : '';
$wHS = isset($urlParams['WHS']) ? $urlParams['WHS'] : '';
$pLANT = isset($urlParams['PLANT']) ? $urlParams['PLANT'] : '';
try {
if ($urlParams != '') {
$a4SPR15A01 = isset($urlParams['A4SPR15A01']) ? $urlParams['A4SPR15A01'] : '';
$dELIVERYNO = isset($urlParams['DELIVERYNO']) ? $urlParams['DELIVERYNO'] : '';
$tYPE = 'UpdateShipmentNumber';
$allMacpkrs = [];
if ($a4SPR15A01 != '') {
// Read from ICM688M1
$iCM688M1SLTMP = DB::connection(config('m3.connection', 'pgsql'))->table('icm688m1')
->select('A4MACPKR')
->where('A4CO', $dIVI)
->where('A4WHS', $wHS)
->where('A4PLANT', $pLANT)
->where('A4SPR15A01', $a4SPR15A01);
// Get Macpikers also if sent as Parameter
if ($dELIVERYNO != '') {
$iCM688M1SLTMP->where('A4MACPKR', $dELIVERYNO);
}
$iCM688M1SL = $iCM688M1SLTMP->get();
// Loop ICM688M1 to get all A4MACPKR
foreach ($iCM688M1SL as $ICM688M1) {
$allMacpkrs[] = $ICM688M1->A4MACPKR;
}
}
// A4SPR15A01 Exists : proceed
if ($a4SPR15A01 != '' && ! empty($allMacpkrs)) {
$jSON = json_encode([
'DIVI' => $dIVI,
'WHS' => $wHS,
'ShipmentNumber' => [
'Number' => $a4SPR15A01,
'DeliveryNumbers' => $allMacpkrs,
],
'TYPE' => $tYPE,
'ENDFLAG' => '',
], JSON_UNESCAPED_SLASHES);
// Write JSON Params to Logs Out
$data = ['SHMACPKR' => $dELIVERYNO,
'SHDT' => date('Y-m-d'),
'SHTIME' => date('H:i:s'),
'SHERROR' => '',
'SHINTBOX' => '',
'SHTYPE' => 'M3-Req-out',
'SHDATA' => $jSON,
'SHUSER' => $sHUSER,
'SHSOURCE' => $sHSOURCE,
'SHCO' => $dIVI,
'SHWHS' => $wHS,
];
Helper::logToICM699M($data);
// Get Token
$tokenResponse = Helper::checkReceiveTokenV2();
$tokenData = $tokenResponse->getData();
if ($tokenData->code == '200') {
$ionToken = isset($tokenData->token) ? $tokenData->token : '';
} else {
$sHDATA = isset($tokenData->message) ? $tokenData->message : '';
// Write to Logs : Error
$data = ['SHMACPKR' => $dELIVERYNO,
'SHDT' => date('Y-m-d'),
'SHTIME' => date('H:i:s'),
'SHERROR' => '',
'SHINTBOX' => '',
'SHTYPE' => 'M3-Res-out',
'SHDATA' => $sHDATA,
'SHUSER' => $sHUSER,
'SHSOURCE' => $sHSOURCE,
'SHCO' => $dIVI,
'SHWHS' => $wHS,
];
Helper::logToICM699M($data);
return $tokenResponse;
}
// Call ionapi with Params
$endPointURL = env('ENDPOINTURL') . 'APIFLOWS/Sentinel/TransferAPI?ionapiRespStyle=sync';
$token = $ionToken;
$response = Http::withHeaders([
'accept' => self::JSON_CONTENT_TYPE,
'Content-Type' => self::JSON_CONTENT_TYPE,
])
->withToken($token)
->withBody($jSON, self::JSON_CONTENT_TYPE)
->timeout(Config::get('arrays.curlTimeOut'))
->post($endPointURL);
$responseStatusCode = $response->getStatusCode();
$m3SessionId = $response->hasHeader('x-transaction-id') ? '-sessionID:' . $response->header('x-transaction-id') : '-sessionID';
$m3ResponseTimeTmp = $response->hasHeader('x-response-time') ? ltrim($response->header('x-response-time'), '-') : '0';
$m3ResponseTimeTmp2 = floatval($m3ResponseTimeTmp) / 1000;
$dateTime = new DateTime;
$dateTime->setTimestamp($m3ResponseTimeTmp2);
$m3ResponseTime = $m3ResponseTimeTmp != '' ? '-M3ResponseTime:' . $dateTime->format('d/m/Y H:i:s.v') : '-M3ResponseTime';
$transferStats = $response->transferStats;
$m3transferTime = $transferStats->getTransferTime() != null ? '-M3transferTime:' . $transferStats->getTransferTime() : '-M3transferTime';
if ($responseStatusCode == '200') {
$responseContents = json_decode($response->getBody()->getContents());
$responseResult = $responseContents->result;
$m3JSONResponse = json_encode($responseContents);
// Check M3 Response for Errors
$m3Errors = Helper::checkM3Errors($responseResult);
} else {
$m3JSONResponse = '';
$m3Errors = 'Error: No Response from M3';
}
if ($m3Errors == '') {
// Write to Logs Out : Success
$data = ['SHMACPKR' => $dELIVERYNO,
'SHDT' => date('Y-m-d'),
'SHTIME' => date('H:i:s'),
'SHERROR' => '',
'SHINTBOX' => '',
'SHTYPE' => 'M3-Res-out',
'SHDATA' => $responseStatusCode . 'TYPE :' . $tYPE . '-' . $m3JSONResponse . $m3SessionId . $m3ResponseTime . $m3transferTime,
'SHUSER' => $sHUSER,
'SHSOURCE' => $sHSOURCE,
'SHCO' => $dIVI,
'SHWHS' => $wHS,
];
Helper::logToICM699M($data);
return response()->json([
'code' => $responseStatusCode,
'status' => 'Success',
]);
} else {
// Write to Logs Out : Failed
$data = ['SHMACPKR' => $dELIVERYNO,
'SHDT' => date('Y-m-d'),
'SHTIME' => date('H:i:s'),
'SHERROR' => 'X',
'SHINTBOX' => '',
'SHTYPE' => 'M3-Res-out',
'SHDATA' => $responseStatusCode . '-' . $m3Errors . '-TYPE:' . $tYPE . '-' . $m3JSONResponse .
'M3-JSN-out' . $jSON . $m3SessionId . $m3ResponseTime . $m3transferTime,
'SHUSER' => $sHUSER,
'SHSOURCE' => $sHSOURCE,
'SHCO' => $dIVI,
'SHWHS' => $wHS,
];
Helper::logToICM699M($data);
return response()->json([
'code' => '206',
'status' => 'Error',
'message' => $responseStatusCode . '-' . $m3Errors . '- TYPE :' . $tYPE . '-' . $m3JSONResponse,
]);
}
}
// A4SPR15A01 Does not Exist : Failure
else {
// Return Error
return response()->json([
'code' => '405',
'status' => 'Error',
'message' => 'Json Payload Not Valid, missing Parameter or no Macpicker # found.',
]);
}
} else {
// Write to Logs Out : Error
$dELIVERYNO = isset($dELIVERYNO) ? $dELIVERYNO : self::ZERO_PAD;
$data = ['SHMACPKR' => $dELIVERYNO,
'SHDT' => date('Y-m-d'),
'SHTIME' => date('H:i:s'),
'SHERROR' => 'X',
'SHINTBOX' => '',
'SHTYPE' => 'M3-Res-out',
'SHDATA' => self::NO_URL_PARAMETERS,
'SHUSER' => $sHUSER,
'SHSOURCE' => $sHSOURCE,
'SHCO' => $dIVI,
'SHWHS' => $wHS,
];
Helper::logToICM699M($data);
// Return Error
return response()->json([
'code' => '405',
'status' => 'Error',
'message' => self::NO_URL_PARAMETERS,
]);
}
} catch (\Throwable $th) {
$getCurlErrors = str_contains($th->getMessage(), 'cURL error');
if ($getCurlErrors) {
// Write to Logs Out : Failed
$data = ['SHMACPKR' => $dELIVERYNO,
'SHDT' => date('Y-m-d'),
'SHTIME' => date('H:i:s'),
'SHERROR' => 'X',
'SHINTBOX' => '',
'SHTYPE' => 'M3-Res-out',
'SHDATA' => 'Curl Error: Communication with M3 Timed Out' . ' M3-JSN-out' . $jSON,
'SHUSER' => $sHUSER,
'SHSOURCE' => $sHSOURCE,
'SHCO' => $dIVI,
'SHWHS' => $wHS,
];
Helper::logToICM699M($data);
return response()->json([
'code' => '405',
'status' => 'error',
'message' => 'Curl Error: Communication with M3 Timed Out.',
]);
} else {
// Write to Logs Out : Error
$dELIVERYNO = isset($dELIVERYNO) ? $dELIVERYNO : self::ZERO_PAD;
$data = ['SHMACPKR' => $dELIVERYNO,
'SHDT' => date('Y-m-d'),
'SHTIME' => date('H:i:s'),
'SHERROR' => 'X',
'SHINTBOX' => '',
'SHTYPE' => 'M3-Err-out',
'SHDATA' => 'An Error Occured - ' . substr($th, 0, 300),
'SHUSER' => $sHUSER,
'SHSOURCE' => $sHSOURCE,
'SHCO' => $dIVI,
'SHWHS' => $wHS,
];
Helper::logToICM699M($data);
Log::error($th);
return response()->json([
'code' => '405',
'status' => 'error',
'message' => 'Uncaught Error',
]);
}
}
}
// End UpdateShipmentNumber
}
+127
View File
@@ -0,0 +1,127 @@
<?php
namespace Modules\M3\Http\Controllers\API;
use Config;
use DB;
use Illuminate\Http\Client\Response as HttpResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
use Modules\M3\Helpers\Helper;
use Modules\M3\Http\Controllers\Controller;
use Str;
class TwoShipAPIs extends Controller
{
private const SOURCE = 'TwoShipUpdateHold';
private const RESPONSE_TYPE = 'AggStopRsp';
public function TwoShipUpdateHold(Request $request)
{
$this->configureTimeouts();
$user = m3_user() !== '' ? Str::upper(m3_user()) : 'WebUser';
$params = $request->all();
$whs = (string) ($params['WHS'] ?? '');
$co = (string) ($params['COMPANY'] ?? '');
$macpkr = (string) ($params['MACPKR'] ?? '');
if ($params === []) {
$this->log($macpkr ?: '000000', $co, $whs, $user, 'X', 'No URL Parameters Sent');
return response()->json(['code' => '405', 'status' => 'Error', 'message' => 'No URL Parameters Sent']);
}
try {
$this->logRequest($macpkr, $co, $whs, $user);
$orders = $this->aggregationOrders($macpkr, $co, $whs);
$response = $this->callTwoShip($orders);
$error = $this->responseError($response);
if ($error !== '') {
$this->log($macpkr, $co, $whs, $user, 'X', $response->status() . '-' . $error);
return response()->json(['code' => '405', 'status' => 'error', 'message' => 'Status: ' . $response->status() . '-' . $error]);
}
$this->log($macpkr, $co, $whs, $user, '', $response->body());
$this->markAggregationComplete($orders, $co, $whs);
return response()->json(['code' => '200', 'status' => 'Success']);
} catch (\Throwable $th) {
$message = str_contains($th->getMessage(), 'cURL error')
? 'Curl Error: Communication with 2Ship Timed Out.'
: '2Ship communication failed.';
$this->log($macpkr, $co, $whs, $user, 'X', $message);
return response()->json(['code' => '405', 'status' => 'error', 'message' => $message]);
}
}
private function configureTimeouts(): void
{
$timeout = Config::get('arrays.PHPTimeOut');
ini_set('max_execution_time', $timeout);
ini_set('max_input_time', $timeout);
ini_set('default_socket_timeout', $timeout);
}
private function logRequest(string $macpkr, string $co, string $whs, string $user): void
{
$data = json_encode(['CO' => $co, 'WHS' => $whs, 'MACPKR' => $macpkr]);
Helper::logToICM699M($this->logData($macpkr, $co, $whs, $user, '', (string) $data, 'AggStopReq'));
}
private function aggregationOrders(string $macpkr, string $co, string $whs): array
{
$aggregation = DB::connection(config('m3.connection', 'pgsql'))->table('icm688m1')
->where('A4MACPKR', $macpkr)->value('A4SHPAGGCD');
if (empty($aggregation) || (string) $aggregation === '0') {
return [$macpkr];
}
$orders = DB::connection(config('m3.connection', 'pgsql'))->table('icm688m1')
->where('A4SHPAGGCD', $aggregation)->where('A4SHPAGGCD', '<>', 0)->where('A4CONCMPLT', '<>', 'y')
->where('A4CO', $co)->where('A4WHS', $whs)->pluck('A4MACPKR')->all();
return $orders !== [] ? $orders : [$macpkr];
}
private function callTwoShip(array $orders): HttpResponse
{
$payload = [
'WS_Key' => Config::get('arrays.2Ship.TwoShip_Key'),
'OrderNumbers' => [implode(',', $orders)],
'FindBy' => 'ByMultipleOrderNumbers',
'DataToBeUpdated' => ['UpdateAggregationSettings' => true, 'OrderAggregationSettingsInfo' => ['NotConsideredAggregation' => true]],
];
return Http::acceptJson()->asJson()->timeout((int) Config::get('arrays.PHPTimeOut'))
->post(Config::get('arrays.2Ship.end_point') . Config::get('arrays.2Ship.hold_update'), $payload);
}
private function responseError(HttpResponse $response): string
{
if (! $response->successful()) {
return 'Error: No Response from 2Ship';
}
$body = $response->json();
return ($body['Success'] ?? true) === false ? '2Ship Error: ' . ($body['GlobalError'] ?? 'Unknown error') : '';
}
private function markAggregationComplete(array $orders, string $co, string $whs): void
{
DB::connection(config('m3.connection', 'pgsql'))->table('icm688m1')
->whereIn('A4MACPKR', $orders)->where('A4CO', $co)->where('A4WHS', $whs)->update(['A4CONCMPLT' => 'Y']);
}
private function log(string $macpkr, string $co, string $whs, string $user, string $error, string $message): void
{
Helper::logToICM699M($this->logData($macpkr, $co, $whs, $user, $error, $message, self::RESPONSE_TYPE));
}
private function logData(string $macpkr, string $co, string $whs, string $user, string $error, string $message, string $type): array
{
return ['SHMACPKR' => $macpkr, 'SHDT' => date('Y-m-d'), 'SHTIME' => date('H:i:s'), 'SHERROR' => $error,
'SHINTBOX' => '', 'SHTYPE' => $type, 'SHDATA' => $message, 'SHUSER' => $user, 'SHSOURCE' => self::SOURCE, 'SHCO' => $co, 'SHWHS' => $whs];
}
}