Files
WMS/Modules/M3/Http/Controllers/API/CloseShipment.php
T
2026-09-16 17:14:26 +01:00

1101 lines
60 KiB
PHP

<?php
namespace Modules\M3\Http\Controllers\API;
use Modules\M3\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use DB;
use Config;
use Str;
use Log;
use Http;
use File;
use Modules\M3\Helpers\Helper;
use Modules\M3\Http\Controllers\GetContentsController;
//use Request;
class CloseShipment extends Controller
{
# CloseShipmentCoChargeAPI : with URL PARAMS COCharge
public static function CloseShipmentCoChargeAPI(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'));
// dump($request->all());
$NODEBUG = TRUE; # ALWAYS set TRUE in Production
$PACKAGES = [];
$JSONCoCharge = [];
$JSONCS = [];
# Get the Calling User
$SHUSER = m3_user() !== '' ? Str::upper(m3_user()) : 'WebUser';
$SHSOURCE = 'CloseShipmentCoChargeAPI';
try {
# Get URL PARAMS
$urlParams = count($request->all()) > 0 ? $request->all() : '';
$WHS = isset($urlParams["WHS"]) ? $urlParams["WHS"] : '';
$COMPANY = isset($urlParams["COMPANY"]) ? $urlParams["COMPANY"] : '';
$MANIFEST = isset($urlParams["MANIFEST"]) ? $urlParams["MANIFEST"] : '';
$TRANSTYPE = isset($urlParams["TRANSTYPE"]) ? $urlParams["TRANSTYPE"] : 'M'; # M , P , Z
$TRANSTYPE = $TRANSTYPE != '' ? $TRANSTYPE : 'M'; # M , P , Z
$SHDT = isset($urlParams["SHDT"]) ? $urlParams["SHDT"] : '';
$SHTIME = isset($urlParams["SHTIME"]) ? $urlParams["SHTIME"] : '';
$SHTYPE = isset($urlParams["SHTYPE"]) ? $urlParams["SHTYPE"] : '';
$allErrMsgs = '';
$LineAck = [];
# PDF File PATH
$pdfFilePath = Config::get('arrays.PdfPath');
$DELIVERYNO = $MANIFEST != '' ? $MANIFEST : '000000';
// Log::channel('dailyCron')->info("Close Manifest:".$MANIFEST.'-WHS: '.$WHS."-CO:".$COMPANY);
if ($urlParams != '') {
# Write to Logs : JSON
$JSONIN = json_encode([
"WHS" => $WHS,
"COMPANY" => $COMPANY,
"MANIFEST-MACPKR" => $MANIFEST,
"TRANSTYPE" => $TRANSTYPE
]);
// dd($JSONIN);
$data = [
'SHMACPKR' => $DELIVERYNO,
'SHDT' => date('Y-m-d'),
'SHTIME' => date('H:i:s'),
'SHERROR' => '',
'SHINTBOX' => '',
'SHTYPE' => 'M3-Req-out',
'SHDATA' => $JSONIN,
'SHUSER' => $SHUSER,
'SHSOURCE' => $SHSOURCE,
'SHCO' => $COMPANY,
'SHWHS' => $WHS
];
Helper::logToICM699M($data);
// dd($JSONIN);
# Get Token
$tokenResponse = Helper::checkReceiveTokenV2();
$tokenData = $tokenResponse->getData();
// dd($IonToken->code);
if ($tokenData->code == '200') {
$IonToken = isset($tokenData->token) ? $tokenData->token : '';
}
else {
$SHDATA = isset($tokenData->message) ? $tokenData->message : '';
$DELIVERYNO = isset($AYMACPKR) ? $AYMACPKR : '000000';
# Write to Logs : Error
$data = [
'SHMACPKR' => $DELIVERYNO,
'SHDT' => date('Y-m-d'),
'SHTIME' => date('H:i:s'),
'SHERROR' => 'X',
'SHINTBOX' => '',
'SHTYPE' => 'M3-Res-out',
'SHDATA' => $SHDATA,
'SHUSER' => $SHUSER,
'SHSOURCE' => $SHSOURCE,
'SHCO' => $COMPANY,
'SHWHS' => $WHS
];
Helper::logToICM699M($data);
return $tokenResponse;
}
# Set Endpoint URL
$endPointURL = env('ENDPOINTURL').'APIFLOWS/Sentinel/TransferAPI?ionapiRespStyle=sync';
$token = $IonToken;
# Read from ICM695M1
if ($TRANSTYPE == 'M') {
$ICM695M1PREP = DB::connection(config('m3.connection', 'pgsql'))->table('icm695m1')
->select('AYCO', 'AYWHS', 'AYMACPKR', 'AYRLNO', 'AYAPRF1551')
->distinct()
->where('AYCO', $COMPANY)
->where('AYAPRF1551', $MANIFEST)
->where('AYWHS', $WHS)
->orderBy('AYMACPKR');
}
else if($TRANSTYPE=='P'){
$ICM695M1PREP = DB::connection(config('m3.connection', 'pgsql'))->table('icm695m1')
->select('AYCO','AYWHS','AYMACPKR','AYRLNO','AYAPRF1551')
->distinct()
->where('AYCO',$COMPANY)
->where('AYMACPKR',$MANIFEST)
->where('AYWHS',$WHS)
->orderBy('AYMACPKR');
# Check Date & Time Before Updating ICM699M
if ($SHDT!='' && $SHTIME!='' && $SHTYPE!='' && $NODEBUG) {
$ICM699MU = DB::connection(config('m3.connection', 'pgsql'))->table('icm699m')
->where('SHMACPKR',$MANIFEST)
->where('SHDT',$SHDT)
->where('SHTIME',$SHTIME)
->where('SHCO',$COMPANY)
->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')]);
}
# Get Acknowledged Record for M3-QtyChg PackSyst4tray
$ICM699MQtyChg = DB::connection(config('m3.connection', 'pgsql'))->table('icm699m')
->select()
->where('SHMACPKR',$MANIFEST)
->where('SHCO',$COMPANY)
->where('SHWHS',$WHS)
->where('SHSOURCE','PackSyst4tray')
->where('SHERROR','Z')
->where('SHTYPE','M3-QtyChg')
->get();
// dd($ICM699MQtyChg);
foreach ($ICM699MQtyChg as $key => $ICM699MQtyChgR) {
$string = $ICM699MQtyChgR->SHDATA;
$start = "PickerLine:";
$end = " -";
$LineAck[] = Helper::getSubstringBetween($string, $start, $end);
}
// dd($LineAck);
}
else if($TRANSTYPE=='Z'){
$ICM695M1PREP = DB::connection(config('m3.connection', 'pgsql'))->table('icm688m1')
->select()
->distinct()
->where('A4CO',$COMPANY)
->where('A4WHS',$WHS)
->where('A4MACPKR',$MANIFEST)
->orderBy('A4MACPKR');
}
$ICM695M1TMP = $ICM695M1PREP->get();
// dump($ICM695M1TMP);
// Log::channel('dailyCron')->info($ICM695M1TMP);
# PFC if MACKPKR already Closed : Case 671
$ICM695M1TMPCOL = collect($ICM695M1TMP);
if ($TRANSTYPE=='Z') {
$ICM695M1TMPCOLF = $ICM695M1TMPCOL->map(function ($post) {
return trim($post->A4MACPKR);
});
}
else{
$ICM695M1TMPCOLF = $ICM695M1TMPCOL->map(function ($post) {
return trim($post->AYMACPKR);
});
}
// dump($ICM695M1TMPCOLF);
$ICM695M1TMPCOLFA = $ICM695M1TMPCOLF->toArray();
// dump($ICM695M1TMPCOLFA);
$ICM699MSuccess = DB::connection(config('m3.connection', 'pgsql'))->table('icm699m')
->select('SHMACPKR')
->whereIn('SHMACPKR',$ICM695M1TMPCOLFA)
->where('SHCO',$COMPANY)
->where('SHWHS',$WHS)
->where('SHSOURCE','CloseShipmentCoChargeAPI')
->where('SHERROR','')
->where('SHTYPE','M3-Res-out')
->where('SHDATA', 'like', '%Success%')
->get();
// dump($ICM699MSuccess);
$ICM699MSuccessCol = collect($ICM699MSuccess);
$ICM699MSuccessColF = $ICM699MSuccessCol->map(function ($post) {
return $post->SHMACPKR;
});
// dump($ICM699MSuccessColF);
$ICM699MSuccessColFAr = $ICM699MSuccessColF->toArray();
if ($TRANSTYPE=='Z') {
# Use the reject method to remove items based on the condition
$ICM695M1TMPF = $ICM695M1TMP->reject(function ($post) use ($ICM699MSuccessColFAr) {
return in_array($post->A4MACPKR, $ICM699MSuccessColFAr);
});
}
else{
# Use the reject method to remove items based on the condition
$ICM695M1TMPF = $ICM695M1TMP->reject(function ($post) use ($ICM699MSuccessColFAr) {
return in_array($post->AYMACPKR, $ICM699MSuccessColFAr);
});
}
$ICM695M1TMP = $ICM695M1TMPF;
// Log::channel('dailyCron')->info($ICM695M1TMP);
// dd($ICM695M1TMP);
$FreightTermsTMP = DB::connection(config('m3.connection', 'pgsql'))->table('icm321m')
->selectRaw("TRIM(ARCODE) as FREIGHTTERMS,ARCHARGE as BILLABLE")
->get();
# Close Shipment for Manifest or Single MacPKR
if (count($ICM695M1TMP)>0 && ($TRANSTYPE=='M' || $TRANSTYPE=='P')) {
# Loop the Results from $ICM595M1TMP
foreach ($ICM695M1TMP as $key => $ICM695M1R) {
$PACKAGES = [];
$AYWHS = trim($ICM695M1R->AYWHS);
$AYCO = trim($ICM695M1R->AYCO);
$AYMACPKR = trim($ICM695M1R->AYMACPKR);
$AYRLNO = trim($ICM695M1R->AYRLNO);
$MANIFEST = trim($ICM695M1R->AYAPRF1551);
# Reset Errors after each Loop
$ErrorMsgs = "";
# Set Endflag for Short pick after each Loop
$EndFlag = 0;
# Precheck All Qty are Equal before Proceeding to Close
# Get Parts And Lots from ICM688M2
$ICM688M2SL = DB::connection(config('m3.connection', 'pgsql'))->table('icm688m2')
->select('A5PART','A5PACKED','A5PICKED','A5PKLN','A5RSVQTY')
->distinct()
->where('A5CO', $AYCO)
->where('A5WHS', $AYWHS)
->where('A5MACPKR', $AYMACPKR)
->where('A5RLNO', $AYRLNO)
->orderBy('A5PART')
->get();
// dump($ICM688M2SL);
# Get PACK/Dock from ICM799M
// $ICM799MSEL = DB::connection(config('m3.connection', 'pgsql'))->table('icm799m')
// ->groupBy('IMTOLOC')
// ->select('IMTOLOC',DB::raw('SUM(IMQTY) as IMQTYTOT') )
// ->where('IMDIV',$AYCO)
// ->where('IMWHS',$AYWHS)
// ->where('IMDELNO',$AYMACPKR)
// ->where('IMLINE',$AYRLNO)
// ->whereIn('IMTOLOC',['DOCK','PACK'])
// ->get();
# PFC : Check that Picked / Packed are all Equal
foreach ($ICM688M2SL as $key => $ICM688M2SLR) {
$A5PACKED = isset($ICM688M2SLR->A5PACKED) ? $ICM688M2SLR->A5PACKED : 0;
$A5PICKED = isset($ICM688M2SLR->A5PICKED) ? $ICM688M2SLR->A5PICKED : 0;
$A5PKLN = isset($ICM688M2SLR->A5PKLN) ? $ICM688M2SLR->A5PKLN : 0;
$A5RSVQTY = isset($ICM688M2SLR->A5RSVQTY) ? $ICM688M2SLR->A5RSVQTY : 0;
$A5ShortShipQty = (int) $A5RSVQTY - (int) $A5PICKED;
# Set EndFLag=1 for short picks
if ($A5ShortShipQty > 0) {
$EndFlag = 1;
}
}
# Get TRAILERNUMBER SELECT APTRUCKID FROM ICM705M1 WHERE APCO=110 AND APWHS=321 AND APMANIFEST=22
$TRAILERNUMBERS = DB::connection(config('m3.connection', 'pgsql'))->table('icm705m1')
->select('APTRUCKID','APTRACKNO','APMANIFEST')
->where('APCO',$COMPANY)
->where('APMANIFEST',$MANIFEST)
->where('APWHS',$WHS)
->first();
$TRAILERNUMBER = isset($TRAILERNUMBERS->APTRUCKID) ? trim($TRAILERNUMBERS->APTRUCKID) : '';
$PRONUMBER = isset($TRAILERNUMBERS->APTRACKNO) ? trim($TRAILERNUMBERS->APTRACKNO) : '';
$ICM695M1JOINTMP = DB::connection(config('m3.connection', 'pgsql'))->table('icm695m1')
->selectRAW("AYMACPKR,AYINTBOX,AYHEIGHT,AYWIDTH,AYDEPTH,AYTYPE,AYLNWGHT,AYID,AYSPR1A01,TRIM(AYSPR15A01) AS SCAC , TRIM(AYSPR30A01) AS TRACKING,AYTRUCK AS AGGREGATION,A4RATETCP AS FREIGHT, A4OFSTRM AS FREIGHTTERMS,A4RATEM3,A4CLOSEM3, A4SHIPTYPE, A4REFORD,A4ONO,A4SHIPVIA,A42SSVCNAM,A4SHIPVIA1")
->leftJoin('ICM688M1',function($join){
$join->on('AYCO', '=','A4CO');
$join->on('AYWHS','=','A4WHS');
$join->on('AYMACPKR','=','A4MACPKR');
})
->where('AYMACPKR',$AYMACPKR)
->where('AYCO',$AYCO)
->where('AYWHS',$AYWHS)
->orderBy('AYINTBOX')
->get();
// dd($ICM695M1JOINTMP);
foreach ($ICM695M1JOINTMP as $key => $ICM695M1JOINR) {
$A4SHIPVIA = isset($ICM695M1JOINR->A4SHIPVIA) ? trim(str_replace("&", "_",$ICM695M1JOINR->A4SHIPVIA)) : '';
$SHIPTYPE = trim($ICM695M1JOINR->A4SHIPTYPE);
$A42SSVCNAM = trim($ICM695M1JOINR->A42SSVCNAM);
$A4SHIPVIA1 = trim($ICM695M1JOINR->A4SHIPVIA1);
$FREIGHTTERMS = trim($ICM695M1JOINR->FREIGHTTERMS);
$A4RATEM3 = trim($ICM695M1JOINR->A4RATEM3);
$FREIGHT = trim($ICM695M1JOINR->FREIGHT);
$A4REFORD = trim($ICM695M1JOINR->A4REFORD);
$A4ONO = trim($ICM695M1JOINR->A4ONO);
$AYMACPKR = trim($ICM695M1JOINR->AYMACPKR);
$AYINTBOX = trim($ICM695M1JOINR->AYINTBOX);
$A4CLOSEM3 = trim($ICM695M1JOINR->A4CLOSEM3);
$TRACKING = trim($ICM695M1JOINR->TRACKING);
$SCAC = trim($ICM695M1JOINR->SCAC);
$CARRIER = '';
$AYTYPE = trim($ICM695M1JOINR->AYID)!='' ? trim($ICM695M1JOINR->AYID) : '';
$AYLNWGHT = trim($ICM695M1JOINR->AYLNWGHT);
$AYHEIGHT = trim($ICM695M1JOINR->AYHEIGHT);
$AYWIDTH = trim($ICM695M1JOINR->AYWIDTH);
$AYDEPTH = trim($ICM695M1JOINR->AYDEPTH);
$BILLOFLADING = isset($ICM695M1JOINR->AYSPR1A01) ? trim($ICM695M1JOINR->AYSPR1A01) : '';
$TRANSPORTMODE= $A4SHIPVIA;
$SERVICETYPE = $A4SHIPVIA;
# Get Carrier Name from ICM160M
if($SCAC!=''){
$SCACSub = substr($SCAC,0,4);
$ICM160M = DB::connection(config('m3.connection', 'pgsql'))->table('icm160m')
->select('CANAM')
->where('CANUM',$SCACSub)
->where('CACO',$COMPANY)
->first();
$CARRIER = isset($ICM160M->CANAM) ? trim(str_replace("&", "_",$ICM160M->CANAM)) : '';
}
# PFC Check BOL for LTL
if ($SHIPTYPE=='LTL') {
$ErrorMsgs = $BILLOFLADING=='' || $SCAC=='' || $TRACKING=='' ?
$ErrorMsgs . " Missing one or more of tracking number, BOL, or carrier. Please enter this data manually in 'invoicing' screen and retry this API call;" : $ErrorMsgs .'';
}
else{
$ErrorMsgs = $SCAC=='' || $TRACKING=='' ?
$ErrorMsgs . " Missing one or more of tracking number, BOL, or carrier. Please enter this data manually in 'invoicing' screen and retry this API call; " : $ErrorMsgs .'';
}
if ($PRONUMBER=='' && $SCAC=='RETR') {
$ErrorMsgs = $ErrorMsgs.' Missing PARS info for this RETRans order. Please contact MPBA to ask them to enter the value for you, and then you can retry; ';
}
# MAK : PFC Check for GS1-Label A1SPR1A01 in ICM666M and ICM695M3
$GS1Label = '';
# First Check if GS1 Label is required in ICM666M
$ICM666MSQLSel = DB::connection(config('m3.connection', 'pgsql'))->table('icm666m')
->select('A1SPR1A01')
->where('A1CO',$AYCO)
->where('A1WHS',$AYWHS)
->where('A1DELNO',$AYMACPKR)
->first();
$GS1LabelExist = isset($ICM666MSQLSel->A1SPR1A01) ? trim($ICM666MSQLSel->A1SPR1A01) : 0;
# Case #566: BOL = PRONUMBER For SCAC=='RETR'
if ($SCAC=='RETR') {
$BILLOFLADING = $PRONUMBER;
}
# Get Commodities
$myRequest = new Request();
$myRequest->setMethod('POST');
$myRequest->request->add([
'MACPKR' => $AYMACPKR
]);
# Call processShipment
$controller = new GetContentsController();
$response = $controller->processShipment($myRequest);
$responseData = $response->getData();
$error = isset($responseData->error) ? $responseData->error : '';
if ($error=='') {
// $commodities = json_encode($responseData->commodities);
# Get Commodities
$commoditiesTmp = isset($responseData->commodities) ? $responseData->commodities : '';
if ($commoditiesTmp!='') {
$commodities = $commoditiesTmp; //json_encode($commoditiesTmp);
// dump( $commodities);
}
else{
$commodities = '';
$ErrorMsgs = $ErrorMsgs ." Could not find Commodities; ";
}
}
else{
$commodities = '';
$ErrorMsgs = $ErrorMsgs ." Could not find Commodities; ";
}
# End Commodities
# Check ICM699M for SHERROR=X
$ICM699MS = DB::connection(config('m3.connection', 'pgsql'))->table('icm699m')
->select('SHMACPKR')
->where('SHMACPKR',$AYMACPKR)
->where('SHCO',$AYCO)
->where('SHWHS',$AYWHS)
->whereIn('SHSOURCE',['TransferAPIURL','CloseShipmentCoChargeAPI','PackSyst4tray'])
->where('SHERROR','X')
->whereIn('SHTYPE',['M3-Res-out','M3-QtyChg'])
->first();
$AlreadySentToM3 = isset($ICM699MS->SHMACPKR) ? trim($ICM699MS->SHMACPKR) : "";
// dump($AlreadySentToM3);
if($AlreadySentToM3!=''){
# Add Message
$ErrorMsgs = $ErrorMsgs ." There are previous M3 transmissions in error for this delivery note that have not been addressed; ";
}
if($AYTYPE==""){
# Get AETYPE SELECT APTRUCKID FROM ICM705M1 WHERE APCO=110 AND APWHS=321 AND APMANIFEST=22
$ICM693MS = DB::connection(config('m3.connection', 'pgsql'))->table('icm693m')
->select('AEID')
->where('AESPR1A01','D')
->where('AETYPE',trim($ICM695M1JOINR->AYTYPE))
->first();
$AYTYPE = isset($ICM693MS->AEID) ? trim($ICM693MS->AEID) : '';
}
$CurrentFreightTerms = $FreightTermsTMP->where('FREIGHTTERMS',$FREIGHTTERMS)->first();
$BILLABLE = isset($CurrentFreightTerms->BILLABLE) ? trim($CurrentFreightTerms->BILLABLE) : 'N';
# If billable=Y and a4ratetcp(FREIGHT)>0 and a4ratem3=blank, then call the freight API CoCharge
if ($BILLABLE=='Y' && $FREIGHT>0 && $A4RATEM3=='') {
$DELIVERYNO = isset($AYMACPKR) ? $AYMACPKR : '000000';
if($SHIPTYPE=='LTL') {
$shippingToBill = $FREIGHT*(100.00 - Config::get('arrays.misc.discountCarrierRateForCustomerPriceLTL'))/100;
} else {
$shippingToBill = $FREIGHT*(100.00 - Config::get('arrays.misc.discountCarrierRateForCustomerPriceParcel') )/100;
}
# Construct Json for COCharge
$JSONCoCharge = [
"QUANTITY" => round($shippingToBill,2), # $FREIGHT with modified Params
"ORDERCATEGORY" => $A4REFORD,
"CONUMBER" => $A4ONO
];
}
else {
$JSONCoCharge = [];
}
# If billable=Y and a4ratetcp(FREIGHT)=0 and a4ratem3=blank, then we need to:
# Write a record to ICM699M to indicate that we are not calling the rate API because the $ are 0
if ($BILLABLE=='Y' && $FREIGHT==0 && $A4RATEM3=='') {
# Add Message
$ErrorMsgs = $ErrorMsgs ." Please manually add a freight charge for this Prepaid and Add order; ";
}
# Close Shipment
# If ( (billable=Y and a4RATEM3 (from array in memory)="X") OR (billable=N) ) and a4closeM3="" then call the close API
# Set PDF URLs for Labels
$CarrierLabel = '';
$ContentLabel = '';
$docTypes = ['ContentLabel','CarrierLabel'];
foreach ($docTypes as $key => $value) {
switch ($value) {
case 'CarrierLabel':
$DOCTYPE = 'CarrierLabel';
$DOCNUMT = $AYINTBOX;
$PDFKey = $value.'/'.$value.'_'.$AYMACPKR.'_'.$DOCNUMT.'_'.$COMPANY.'_'.$WHS;
$pdfFileName = $pdfFilePath.$PDFKey.'.pdf';
// dd($pdfFileName);
if(File::exists($pdfFileName)){
$CarrierLabel = route('m3.M3GetPDFFromCache.index',['MACPKR'=>$AYMACPKR, 'DOCTYPE'=>$DOCTYPE ]);
}
break;
case 'ContentLabel':
$DOCTYPE = 'ContentLabel';
$DOCNUMT = $AYINTBOX;
$PDFKey = $value.'/'.$value.'_'.$AYMACPKR.'_'.$DOCNUMT.'_'.$COMPANY.'_'.$WHS;
$pdfFileName = $pdfFilePath.$PDFKey.'.pdf';
// dd($pdfFileName);
if(File::exists($pdfFileName)){
$ContentLabel = route('m3.M3GetPDFFromCache.index',['MACPKR'=>$AYMACPKR, 'DOCTYPE'=>$DOCTYPE ]);
}
break;
}
}
# Second Check GS1 Label existence in ICM695M3
if ($GS1LabelExist==1) {
$ICM695M3SQLSel = DB::connection(config('m3.connection', 'pgsql'))->table('icm695m3')
->select('A2GS1LABEL')
->where('A2CO',$AYCO)
->where('A2WHS',$AYWHS)
// ->where('A2MACPKR',$AYMACPKR)
->where('A2INTBOX',$AYINTBOX)
->first();
$GS1Label = isset($ICM695M3SQLSel->A2GS1LABEL) ? trim($ICM695M3SQLSel->A2GS1LABEL) : '';
if ($GS1Label=='') {
$ErrorMsgs = $ErrorMsgs.' Missing G1-128 Label. Please contact MPBA to ask them to enter the value for you, and then you can retry; ';
}
}
# Get Packages Array
$PACKAGES[]=[
"TRACKINGID" => $TRACKING,
"BUNDLES" => $AYTYPE,
"WEIGHT" => $AYLNWGHT,
"HEIGHT" => $AYHEIGHT,
"WIDTH" => $AYWIDTH,
"LENGTH" => $AYDEPTH,
"SSCC" => $GS1Label,
"SHIPLABELDOC" => $CarrierLabel,
"CONTENTLABELDOC" => $ContentLabel
];
}
// dump($PACKAGES);
# Check Packages array before proceeding with CloseShipment
if ( count($PACKAGES)>0 ) {
# Get Packlist
$PackingList = '';
$DOCTYPE = 'PackingList';
$DOCNUMT = $AYMACPKR;
$PDFKey = $DOCTYPE.'/'.$DOCTYPE.'_'.$AYMACPKR.'_'.$DOCNUMT.'_'.$COMPANY.'_'.$WHS;
$pdfFileName = $pdfFilePath.$PDFKey.'.pdf';
// dd($pdfFileName);
if(File::exists($pdfFileName)){
$PackingList = route('m3.M3GetPDFFromCache.index',['MACPKR'=>$AYMACPKR, 'DOCTYPE'=>$DOCTYPE ]);
}
// dd($PackingList);
# Add Cocharge
if (count($JSONCoCharge)>0) {
# Construct Json for CloseShipment With PDF Files
$tempClose =[
"DIVI" => $AYCO,
"WHS" => $AYWHS,
"DELIVERYNO" => $AYMACPKR,
"PICKLISTSUFFIX" => $AYRLNO,
"TYPE" => 'CloseShipment',
"SCAC" => $SCAC,
"CARRIER" => $CARRIER,
"TRANSPORTMODE" => $TRANSPORTMODE,
"SERVICETYPE" => $SERVICETYPE,
"TRACKINGNUMBER" => $TRACKING,
"PRONUMBER" => $PRONUMBER,
"BILLOFLADING" => $BILLOFLADING,
"TRAILERNUMBER" => $TRAILERNUMBER,
"PACKAGES" => $PACKAGES,
"DELIVERYNOTEDOC" => $PackingList,
"shipType" => $SHIPTYPE,
"carrierServiceDescription" => $A42SSVCNAM,
"modeOfTransport" => $A4SHIPVIA1,
"COMMODITIES" => $commodities,
"ENDFLAG" => $EndFlag
];
$JSONCoChargeCS = array_merge($JSONCoCharge,$tempClose);
$JSONCS = json_encode($JSONCoChargeCS);
}
else{
# Construct Json for CloseShipment With PDF Files
$JSONCS = json_encode([
"DIVI" => $AYCO,
"WHS" => $AYWHS,
"DELIVERYNO" => $AYMACPKR,
"PICKLISTSUFFIX" => $AYRLNO,
"TYPE" => 'CloseShipment',
"SCAC" => $SCAC,
"CARRIER" => $CARRIER,
"TRANSPORTMODE" => $TRANSPORTMODE,
"SERVICETYPE" => $SERVICETYPE,
"TRACKINGNUMBER" => $TRACKING,
"PRONUMBER" => $PRONUMBER,
"BILLOFLADING" => $BILLOFLADING,
"TRAILERNUMBER" => $TRAILERNUMBER,
"PACKAGES" => $PACKAGES,
"DELIVERYNOTEDOC" => $PackingList,
"ServiceType" => $SHIPTYPE,
"ServiceLevelCode" => $A42SSVCNAM,
"TransportationMode" => $A4SHIPVIA1,
"COMMODITIES" => $commodities,
"ENDFLAG" => $EndFlag
]);
}
// dump($JSONCS);
# No Errors Proceed in Calling M3 CLose API
if ($ErrorMsgs=='') {
# Write to Logs Out : Send JSON Request To M3
$DELIVERYNO = isset($AYMACPKR) ? $AYMACPKR : '000000';
// dump($DELIVERYNO);
# MAK : Log JSON Manifest # and MACKPKR #
// Log::channel('dailyCron')->info('1 >>> JSON Sent for Manifest: '.$MANIFEST.' ,Macpicker: '.$AYMACPKR);
Log::channel('dailyCron')->info('1 >>> JSON Sent for Manifest: '.(string)(int)$MANIFEST.' ,Macpicker: '.$AYMACPKR);
$data = [
'SHMACPKR' => $DELIVERYNO,
'SHDT' => date('Y-m-d'),
'SHTIME' => date('H:i:s'),
'SHERROR' => '',
'SHINTBOX' => '',
'SHTYPE' => 'M3-JSN-out',
'SHDATA' => $JSONCS,
'SHUSER' => $SHUSER,
'SHSOURCE' => $SHSOURCE,
'SHCO' => $COMPANY,
'SHWHS' => $WHS
];
Helper::logToICM699M($data);
$response = Http::
withHeaders([
'accept' => 'application/json',
'Content-Type' => 'application/json',
'Connection' => 'close'
])
->withToken($token)
->withBody($JSONCS, 'application/json')
->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';
$responseJSON = $response->getBody()->getContents();
$JsonSanytized = Helper::sanityzeString($responseJSON);
$responseContents = json_decode($JsonSanytized);
# MAK : Add response Time
// $M3ResponseTimeTmp = $response->hasHeader('x-response-time') ? ltrim($response->header('x-response-time'),"-") : '';
// $M3ResponseTimeTmp2 = $M3ResponseTimeTmp /1000;
// $dateTime = new DateTime();
// $dateTime->setTimestamp($M3ResponseTimeTmp2);
// // dump( $dateTime->format('d/m/Y H:i:s.v') );
// $M3ResponseTime = $M3ResponseTimeTmp != '' ? '-M3ResponseTime:' . $dateTime->format('d/m/Y H:i:s.v') : '-M3ResponseTime';
// // dump($M3ResponseTime);
// $transferStats = $response->transferStats;
// $M3transferTime = $transferStats->getTransferTime()!=null ? "-M3transferTime:".$transferStats->getTransferTime() : "-M3transferTime";
// dd($M3transferTime);
# Log M3 response
Log::channel('dailyCron')->info("2 >>> Close API M3 Responded...");
if ($responseContents!=null && $responseStatusCode=='200') {
$responseMsg = $responseContents->result->CloseShipment;
$M3APIRESULT = $responseMsg->PickingListClose->Result;
$M3APIRESULTMsg = isset($responseMsg->PickingListClose->ErrorMessage) ? $responseMsg->PickingListClose->ErrorMessage: '';
# Check M3 Response for Errors
$responseResult = $responseContents->result;
$M3Errors = Helper::checkM3Errors($responseResult);
// dd($M3Errors);
# If you get a successful response, update database file ICM688M1/A4RATEm3=X
# Update ICM688M1 : Change A4RATEM3
if (count($JSONCoCharge)>0 && $M3APIRESULT != 'Error') {
DB::connection(config('m3.connection', 'pgsql'))->table('icm688m1')
->where('A4MACPKR',$AYMACPKR)
->where('A4CO',$AYCO)
->where('A4WHS',$AYWHS)
->update(['A4RATEM3'=>'X' ,'A4PICKSTS'=>'A']);
}
else if(count($JSONCoCharge)==0 && $M3APIRESULT != 'Error'){
# Update ICM688M1 : Change A4RATEM3
DB::connection(config('m3.connection', 'pgsql'))->table('icm688m1')
->where('A4MACPKR',$AYMACPKR)
->where('A4CO',$AYCO)
->where('A4WHS',$AYWHS)
->update(['A4PICKSTS'=>'A']);
}
}
else{
$M3APIRESULT = 'Error';
$responseMsg = 'M3 API responded with null value';
$M3APIRESULTMsg = 'M3 API responded with null value';
$responseResult = '';
$M3Errors = $responseStatusCode;
}
# If you get a successful response
if($M3APIRESULT != 'Error'){
# Write to Logs Out : Success
$DELIVERYNO = isset($AYMACPKR) ? $AYMACPKR : '000000';
$data = [
'SHMACPKR' => $DELIVERYNO,
'SHDT' => date('Y-m-d'),
'SHTIME' => date('H:i:s'),
'SHERROR' => '',
'SHINTBOX' => '',
'SHTYPE' => 'M3-Res-out',
'SHDATA' => 'Success...' . json_encode($responseResult) . $M3SessionId,
'SHUSER' => $SHUSER,
'SHSOURCE' => $SHSOURCE,
'SHCO' => $COMPANY,
'SHWHS' => $WHS
];
Helper::logToICM699M($data);
}
# If you get a failure, write a record to ICM699M to indicate that the CLOSE API call failed
else{
# Update ICM688M1 : Change A4PICKSTS
DB::connection(config('m3.connection', 'pgsql'))->table('icm688m1')
->where('A4MACPKR',$AYMACPKR)
->where('A4CO',$AYCO)
->where('A4WHS',$AYWHS)
->update(['A4PICKSTS'=>'a']);
# Write to Logs Out : Error
$DELIVERYNO = isset($AYMACPKR) ? $AYMACPKR : '000000';
$data = [
'SHMACPKR' => $DELIVERYNO,
'SHDT' => date('Y-m-d'),
'SHTIME' => date('H:i:s'),
'SHERROR' => 'X',
'SHINTBOX' => '',
'SHTYPE' => 'M3-Res-out',
'SHDATA' => 'Important-Error: ' . $M3Errors . json_encode($responseMsg) . $M3SessionId,
'SHUSER' => $SHUSER,
'SHSOURCE' => $SHSOURCE,
'SHCO' => $COMPANY,
'SHWHS' => $WHS
];
Helper::logToICM699M($data);
# Add Message
$ErrorMsgs = $ErrorMsgs .$M3Errors." ";
}
}
# Errors found Log to ICM699M and update A4PICKSTS
else{
# Write to Logs : Error
# Clear Duplicate messages
$ErrorMsgsC = Helper::removeDuplicateSubstrings($ErrorMsgs);
$DELIVERYNO = isset($AYMACPKR) ? $AYMACPKR : '000000';
$data = [
'SHMACPKR' => $DELIVERYNO,
'SHDT' => date('Y-m-d'),
'SHTIME' => date('H:i:s'),
'SHERROR' => 'X',
'SHINTBOX' => '',
'SHTYPE' => 'M3-Res-out',
'SHDATA' => $ErrorMsgsC,
'SHUSER' => $SHUSER,
'SHSOURCE' => $SHSOURCE,
'SHCO' => $COMPANY,
'SHWHS' => $WHS
];
Helper::logToICM699M($data);
}
}
$allErrMsgs = $allErrMsgs . $ErrorMsgs;
}
# Update ICM699M : Look for CommTCP_read and set SHERROR to Z Case # 580
$SHACKNOTE = 'Sentinel automatically closed the error (false positive CommTCP_read)';
$ICM699MUZ = DB::connection(config('m3.connection', 'pgsql'))->table('icm699m')
->where('SHMACPKR',$AYMACPKR)
->where('SHCO',$COMPANY)
->where('SHWHS',$WHS)
->where('SHSOURCE',$SHSOURCE)
->where('SHERROR','X')
->where('SHTYPE','M3-General')
->where('SHDATA','like','%CommTCP_read%')
->update(["SHERROR"=>"Z","SHACKUSER"=>$SHUSER,"SHACKDATE"=>date('Y-m-d'),"SHACKTIME"=>date('H:i:s'),"SHACKNOTE"=> $SHACKNOTE]);
# Update ICM705M1 to say that we have processed this manifest (set APSPARE2='X' )
if ($TRANSTYPE == 'M') {
$ICM705M1U = DB::connection(config('m3.connection', 'pgsql'))->table('icm705m1')
->where('APMANIFEST',$MANIFEST)
->where('APCO',$COMPANY)
->where('APWHS',$WHS)
->update(["APSPARE2"=>"X"]);
}
# Send Response
if ($allErrMsgs=='') {
return response()->json([
'code' => '200',
'status' => 'Success',
'message'=> 'All Operations Successful'
]);
}
else{
$allErrMsgsC = Helper::removeDuplicateSubstrings($allErrMsgs);
return response()->json([
'code' => '206',
'status' => 'Success With Warnings',
'message'=> $allErrMsgsC ."; Check Transaction Logs for Errors or Warnings."
]);
}
}
# Close Shipment for Zero Picks
else if (count($ICM695M1TMP)>0 && $TRANSTYPE=='Z') {
// dd($ICM695M1TMP);
$ErrorMsgs = "";
foreach ($ICM695M1TMP as $key => $ICM695M1JOINR) {
$SHIPTYPE = trim($ICM695M1JOINR->A4SHIPTYPE);
$FREIGHTTERMS = trim($ICM695M1JOINR->A4OFSTRM);
$A4RATEM3 = trim($ICM695M1JOINR->A4RATEM3);
$FREIGHT = trim($ICM695M1JOINR->A4RATETCP);
$A4REFORD = trim($ICM695M1JOINR->A4REFORD);
$A4ONO = trim($ICM695M1JOINR->A4ONO);
$AYMACPKR = trim($ICM695M1JOINR->A4MACPKR);
$A4CLOSEM3 = trim($ICM695M1JOINR->A4CLOSEM3);
$AYWHS = trim($ICM695M1JOINR->A4WHS);
$AYCO = trim($ICM695M1JOINR->A4CO);
// dump($AYMACPKR);
# Construct Json for CloseShipment Without PDF Files
$JSONCS = json_encode([
"DIVI" => $AYCO,
"WHS" => $AYWHS,
"DELIVERYNO" => $AYMACPKR,
"TYPE" => 'CloseShipment',
"PICKLISTSUFFIX" => '1',
"ENDFLAG" => '1'
]);
# Write to Logs Out : JSON Request To M3
$DELIVERYNO = isset($AYMACPKR) ? $AYMACPKR : '000000';
$data = [
'SHMACPKR' => $DELIVERYNO,
'SHDT' => date('Y-m-d'),
'SHTIME' => date('H:i:s'),
'SHERROR' => '',
'SHINTBOX' => '',
'SHTYPE' => 'M3-JSN-out',
'SHDATA' => $JSONCS,
'SHUSER' => $SHUSER,
'SHSOURCE' => $SHSOURCE,
'SHCO' => $COMPANY,
'SHWHS' => $WHS
];
Helper::logToICM699M($data);
$response = Http::
withHeaders([
'accept' => 'application/json',
'Content-Type' => 'application/json',
'Connection' => 'close'
])
->withToken($token)
->withBody($JSONCS, 'application/json')
->timeout(Config::get('arrays.curlTimeOut'))
->retry(2, 100)
->post($endPointURL);
$responseContents = json_decode($response->getBody()->getContents());
$M3SessionId = $response->hasHeader('x-transaction-id') ? "-sessionID:". $response->header('x-transaction-id') : '-sessionID';
$M3Errors = '';
if ($responseContents!=null) {
$responseMsg = $responseContents->result->CloseShipment;
$M3APIRESULT = $responseMsg->PickingListClose->Result;
$M3APIRESULTMsg = isset($responseMsg->PickingListClose->ErrorMessage) ? $responseMsg->PickingListClose->ErrorMessage: '';
# Check M3 Response for Errors
$responseResult = $responseContents->result;
$M3Errors = Helper::checkM3Errors($responseResult);
# If you get a successful response, update database file ICM688M1/A4PICKSTS=A
if( $M3APIRESULT != 'Error'){
# Update ICM688M1 : Change A4RATEM3
DB::connection(config('m3.connection', 'pgsql'))->table('icm688m1')
->where('A4MACPKR',$AYMACPKR)
->where('A4CO',$AYCO)
->where('A4WHS',$AYWHS)
->where('A4PICKSTS','!=','X')
->update(['A4PICKSTS'=>'A']);
}
}
else{
$M3APIRESULT = 'Error';
$responseMsg = 'M3 API responded with null value';
$M3APIRESULTMsg = 'M3 API responded with null value';
}
# If you get a successful response
if($M3APIRESULT != 'Error'){
# Write to Logs Out : Success
$DELIVERYNO = isset($AYMACPKR) ? $AYMACPKR : '000000';
$data = [
'SHMACPKR' => $DELIVERYNO,
'SHDT' => date('Y-m-d'),
'SHTIME' => date('H:i:s'),
'SHERROR' => '',
'SHINTBOX' => '',
'SHTYPE' => 'M3-Res-out',
'SHDATA' => 'Success' . $M3SessionId,
'SHUSER' => $SHUSER,
'SHSOURCE' => $SHSOURCE,
'SHCO' => $COMPANY,
'SHWHS' => $WHS
];
Helper::logToICM699M($data);
}
# If you get a failure, write a record to ICM699M to indicate that the CLOSE API call failed
else{
# Update ICM688M1 : Change A4PICKSTS
DB::connection(config('m3.connection', 'pgsql'))->table('icm688m1')
->where('A4MACPKR',$AYMACPKR)
->where('A4CO',$AYCO)
->where('A4WHS',$AYWHS)
->where('A4PICKSTS','!=','X')
->update(['A4PICKSTS'=>'a']);
# Write to Logs Out : Error
$DELIVERYNO = isset($AYMACPKR) ? $AYMACPKR : '000000';
$data = [
'SHMACPKR' => $DELIVERYNO,
'SHDT' => date('Y-m-d'),
'SHTIME' => date('H:i:s'),
'SHERROR' => 'X',
'SHINTBOX' => '',
'SHTYPE' => 'M3-Res-out',
'SHDATA' => 'Important-Error: ' . $M3Errors . json_encode($responseMsg) . $M3SessionId,
'SHUSER' => $SHUSER,
'SHSOURCE' => $SHSOURCE,
'SHCO' => $COMPANY,
'SHWHS' => $WHS
];
// dump($data);
Helper::logToICM699M($data);
# Add Message
$ErrorMsgs = $ErrorMsgs .$M3Errors."-";
}
# Update ICM699M : Look for CommTCP_read and set SHERROR to Z Case # 580
$SHACKNOTE = 'Sentinel automatically closed the error (false positive CommTCP_read)';
$ICM699MUZ = DB::connection(config('m3.connection', 'pgsql'))->table('icm699m')
->where('SHMACPKR',$AYMACPKR)
->where('SHCO',$COMPANY)
->where('SHWHS',$WHS)
->where('SHSOURCE',$SHSOURCE)
->where('SHERROR','X')
->where('SHTYPE','M3-General')
->where('SHDATA','like','%CommTCP_read%')
->update(["SHERROR"=>"Z","SHACKUSER"=>$SHUSER,"SHACKDATE"=>date('Y-m-d'),"SHACKTIME"=>date('H:i:s'),"SHACKNOTE"=> $SHACKNOTE]);
}
# Send Response
if ($ErrorMsgs=='') {
return response()->json([
'code' => '200',
'status' => 'Success',
'message'=> 'All Operations Successful'
]);
}
else{
return response()->json([
'code' => '206',
'status' => 'Success With Warnings',
'message'=> $ErrorMsgs ."; Check The Logs for Errors or Warnings."
]);
}
}
### End Zero Pick
else{
$DELIVERYNO = isset($MANIFEST) ? $MANIFEST : '000000';
// # Set SHDATA Message
$SHDATAMSG = 'No records found in ICM695M1,or URL parameters incomplete';
# count($ICM695M1TMP)==0 ? 'MacPkr already closed' :
$SHERROR = 'X';
# count($ICM695M1TMP)==0 ? 'Z' :
# Write to Logs Out : Error
$data = [
'SHMACPKR' => $DELIVERYNO,
'SHDT' => date('Y-m-d'),
'SHTIME' => date('H:i:s'),
'SHERROR' => $SHERROR,
'SHINTBOX' => '',
'SHTYPE' => 'M3-Req-out',
'SHDATA' => $SHDATAMSG,
'SHUSER' => $SHUSER,
'SHSOURCE' => $SHSOURCE,
'SHCO' => $COMPANY,
'SHWHS' => $WHS
];
Helper::logToICM699M($data);
# Return Error
return response()->json([
'code' => '405',
'status' => 'Error',
'message' => 'No records found in ICM695M1,or URL parameters incomplete For MacPkr/Manifest:' . $DELIVERYNO
]);
}
}
else {
# Write to Logs Out : Error
$DELIVERYNO = isset($AYMACPKR) ? $AYMACPKR : '000000';
$data = [
'SHMACPKR' => $DELIVERYNO,
'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' => $COMPANY,
'SHWHS' => $WHS
];
Helper::logToICM699M($data);
# Return Error
return response()->json([
'code' => '405',
'status' => 'Error',
'message'=> 'No URL Parameters Sent'
]);
}
}
catch (\Throwable $th) {
// Log::error($th);
$getCurlErrors = str_contains($th->getMessage(), 'cURL error');
if($getCurlErrors){
// dd($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' => $COMPANY,
'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($AYMACPKR) ? $AYMACPKR : '000000';
$data = [
'SHMACPKR' => $DELIVERYNO,
'SHDT' => date('Y-m-d'),
'SHTIME' => date('H:i:s'),
'SHERROR' => 'X',
'SHINTBOX' => '',
'SHTYPE' => 'M3-Res-out',
'SHDATA' => 'An Error Occured - ' . substr($th, 0, 300),
'SHUSER' => $SHUSER,
'SHSOURCE' => $SHSOURCE,
'SHCO' => $COMPANY,
'SHWHS' => $WHS
];
Helper::logToICM699M($data);
Log::error($th);
return response()->json([
'code'=>'405',
'status'=>'error',
'message'=>'Catched Error: '.$th
]);
}
}
}
# End CloseShipmentCoChargeAPI
}