diff --git a/Modules/M3/Config/arrays.php b/Modules/M3/Config/arrays.php
new file mode 100644
index 00000000..c627eb8f
--- /dev/null
+++ b/Modules/M3/Config/arrays.php
@@ -0,0 +1,98 @@
+ ['73,85,89,90,91,92,86,99'],
+ 'autorefresh_all' => ['00:15'],
+ 'autorefresh_notall' => ['00:15'],
+
+ 'payrollCodes' => ['33,49,75,94,98,102,171'],
+
+ 'min_work_hours_for_break' => ['4'],
+
+ 'ignore_picks_that_last_longer_than_this_many_hours' => ['8'],
+
+ 'env_ports' => ['test'=>'10004','live'=>'10005'],
+
+ 'hold_code_array' => ['A'=>'Admin Hold',
+ 'C'=>'AR Past Due',
+ 'D'=>'Over Credit Limit',
+ 'E'=>'Over Order Limit',
+ 'F'=>'Address Check Fail',
+ 'Q'=>'Quote Hold',
+ 'H'=>'A/R Cust Hold',
+ 'I'=>'EDI Hold',
+ 'P'=>'EDI Price Hold',
+ 'Z'=>'Haz Hold',
+ 'X'=>'CID Hold',
+ 'W'=>'Web Hold',
+ 'T'=>'Duplicate Hold'],
+
+ 'user_array' => '', //$user_array,
+ 'misc' => [
+ 'discountCarrierRateForCustomerPriceLTL'=>0.00, # This is the percent off list that we want to charge customers
+ 'discountCarrierRateForCustomerPriceParcel'=>0.00, # This is the percent off list that we want to charge customers - to use in ship confirm
+ ],
+ 'transxTypes' =>[
+ 'ICM710E' => 'Splitting delivery orders',
+ 'ICM710E13' => 'Pre-Splitting interco delivery orders',
+ 'ICM710E12' => 'Pre-Splitting customer delivery orders',
+ 'M3InventoryReportListURL' => 'Retrieve inventory on hand',
+ 'M3InventoryReportReplen' => 'Retrieve Replenishments',
+ 'M3ReceiverAPI' => 'Post Splitting delivery orders',
+ 'PdfStorageAPI' => 'PDF document storage',
+ 'PackSyst4tray' => 'Change of qty picked after picking',
+ 'CloseShipmentCoChargeAPI' => 'Closing delivery orders',
+ 'TransferAPIURL' => 'Move goods to Pack/Dock locations',
+ 'OP705API' => 'Closing a manifest',
+ 'CloseShipmentCoChargeAPIMfest' => 'Batch closing for M3 manifests at night',
+ 'M3-General' => 'General - contact MPBA',
+ 'UpdateShipmentNumber' => 'Update Shipment Number',
+ ],
+ 'curlTimeOut' => 30,
+ 'PHPTimeOut' => 600,
+ 'PHPTimeOutCL'=> 1000,
+ 'maxRecDL' => 20000,
+ 'maxRecCL' => 55000,
+ 'BadChars' => ['–','\t','\n','\u20134807','\u20131','\u201333','\u2013671' ,'Ÿ','á', 'é', 'í', 'ó' ,'ú','“','”'],
+ 'PdfPath' => env('M3_LABELS_PATH', storage_path('app/m3/labels') . DIRECTORY_SEPARATOR), # Warning : The path for PDF storage is shared by all Instances and should not be altered
+ 'DUMMYPDF' => '',
+ 'uom_size' => ['110-142-303'=>'mm',
+ '110-143-321'=>'mm',
+ '110-143-322'=>'in'], # unit of mesure for boxes lengths mm or in
+ 'uom_wt' => ['110-142-303'=>'kg',
+ '110-143-321'=>'kg',
+ '110-143-322'=>'lbs'], # unit of mesure for boxes weight kg or lbs
+
+#STATUS ARRAY FOR ICM688M1
+'status_ICM688M1_array' => [
+ "P"=>"Pending error checking by splitting (OP510E2)",
+ "H"=>"Hold as error found (OP510E3)",
+ "L"=>"Ready to pick",
+ "I"=>"In picking",
+ "F"=>"In packing",
+ "X"=>"Cancelled",
+ "C"=>"Packed",
+ "B"=>"Loaded",
+ "a"=>"Manually removed from Sentinel ship confirm screen",
+ "A"=>"ShipConfirmed" ],
+
+ 'whsePerf_targets' => [
+ 'all_notes'=>'90', 'all_dollars'=>'85', 'all_weight'=>'90',
+ 'ltl_notes'=>'90', 'ltl_dollars'=>'95', 'ltl_weight'=>'99',
+ 'parcel_notes'=>'90', 'parcel_dollars'=>'75', 'parcel_weight'=>'80'
+ ],
+'2Ship' => [
+ # 2Ship WS_Key
+ # live $TwoShip_Key="FED945D1-5DC7-415E-BDAB-16347E7C1304";
+ # test $TwoShip_Key="45027F2A-EDA6-4C16-8AD4-9BC70CE94AB8";
+ 'TwoShip_Key' => "45027F2A-EDA6-4C16-8AD4-9BC70CE94AB8",
+ 'end_point' =>"https://euroapi.2ship.com/api/",
+ 'hold_update' =>"UpdateOnHoldOrder_V1",
+ ],
+
+];
+
\ No newline at end of file
diff --git a/Modules/M3/Config/arrays_custom.php b/Modules/M3/Config/arrays_custom.php
new file mode 100644
index 00000000..8ffea5c0
--- /dev/null
+++ b/Modules/M3/Config/arrays_custom.php
@@ -0,0 +1,40 @@
+ ['16'=>'30',
+ '33'=>'12',
+ '49'=>'25',
+ '66'=>'60',
+ '75'=>'15',
+ '94'=>'40',
+ '98'=>'8',
+ '102'=>'10',
+ '171'=>'17'
+ ]
+
+
+];
+# '75'=>'26',
+# '75'=>'23',
+# '33'=>'13', #2025-08-04
+
+# Found in BLDPERFST rpg pgm in EWRPGSRC / EWSRCTST
+# PICKING stats
+# when a5sentview in ('7','9') then 33
+# when a5sentview = 5 then 49
+# when a5sentview = 12 then 98
+# when a5sentview in ('2','10') then 75
+# when a5sentview in ('1','3','4','11') then 94
+# when a5sentview = 8 then 102
+# when a5sentview = 6 then 171
+# else 999
+
+# PACKING stats
+# case when (select AYTYPE from ICM695M1
+# where AYINTBOX=AZINTBOX
+# and AYSENTPKR=AZSENTPKR FETCH FIRST ROW ONLY)
+# in ('','BX') then '16' else '66' end as AYTYPE,
+
+?>
\ No newline at end of file
diff --git a/Modules/M3/Config/config.php b/Modules/M3/Config/config.php
index 02891d9d..350c3d25 100644
--- a/Modules/M3/Config/config.php
+++ b/Modules/M3/Config/config.php
@@ -2,6 +2,7 @@
return [
'name' => 'M3',
- 'features' => [
- ],
+ 'connection' => env('M3_DB_CONNECTION', env('DB_CONNECTION', 'pgsql')),
+ 'labels_path' => env('M3_LABELS_PATH', storage_path('app/m3/labels')),
+ 'closing_orders_path' => env('M3_CLOSING_ORDERS_PATH', storage_path('app/m3/closing-orders')),
];
diff --git a/Modules/M3/Console/CallCloseAPI.php b/Modules/M3/Console/CallCloseAPI.php
new file mode 100644
index 00000000..d9043c71
--- /dev/null
+++ b/Modules/M3/Console/CallCloseAPI.php
@@ -0,0 +1,144 @@
+info('Start CallCloseAPI...');
+ 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'));
+
+ try {
+ # Get the Calling User
+ $userId = $this->argument('user');
+ $SHUSER = isset($userId) ? $userId : (m3_user() !== '' ? Str::upper(trim(m3_user())) : '');
+
+ # Get the Manifest Number
+ $manifest = $this->argument('manifest');
+ $MANIFESTNum = isset($manifest) ? $manifest : '';
+ $co = $this->argument('co');
+ $APCO = isset($co) ? $co : '';
+ $whs = $this->argument('whs');
+ $APWHS = isset($whs) ? $whs : '';
+
+ // if ($SHUSER!='') {
+ // Log::channel('dailyCron')->info("Cron...Start CallCloseAPI...For Manifest#: ".$MANIFESTNum); // ".$SHUSER."
+
+ if( $MANIFESTNum==''){
+ # Get Macpickers from ICM705M1
+ $ICM705M1 = DB::connection(config('m3.connection', 'pgsql'))->table('icm705m1')
+ ->select('APMANIFEST','APCO','APWHS')
+ ->where('APSPARE2','')
+ ->where('APMANIFEST','!=','0')
+ ->whereRaw('EXTRACT(EPOCH FROM (CURRENT_TIMESTAMP - APLDCLOZ)) / 60 > 15')
+ ->orderBy('APMANIFEST','desc')
+ ->get();
+ // dump($ICM705M1);
+
+ if (count($ICM705M1)>0) {
+ # Loop the Results from $ICM705M1
+ foreach ($ICM705M1 as $key => $ICM705M1R) {
+ $MANIFESTNum = $ICM705M1R->APMANIFEST;
+
+ $USERCO = isset($ICM705M1R->APCO) ? $ICM705M1R->APCO : '';
+ $USERWH = isset($ICM705M1R->APWHS) ? $ICM705M1R->APWHS : '';
+
+ # Update ICM705M1 and set APSPARE2 to P
+ $ICM705M1U = DB::connection(config('m3.connection', 'pgsql'))->table('icm705m1')
+ ->where('APMANIFEST',$MANIFESTNum)
+ ->where('APCO',$USERCO)
+ ->where('APWHS',$USERWH)
+ ->update(["APSPARE2"=>"P"]);
+
+ $myRequest = new Request();
+ $myRequest->setMethod('POST');
+ $myRequest->request->add([
+ 'WHS' => $USERWH,
+ 'COMPANY' => $USERCO,
+ 'TRANSTYPE' => 'M',
+ 'MANIFEST' => $MANIFESTNum
+ ]);
+ $callCloseShipment = CloseShipment::CloseShipmentCoChargeAPI($myRequest);
+ $responseData = $callCloseShipment->getData();
+ $jsonData = json_encode($responseData);
+ Log::channel('dailyCron')->info("Close Shipment API Response for Manifest:".(string)(int)$MANIFESTNum.'-'.$jsonData);
+ }
+ }
+ }
+ # Call Closing for a specific Manifest
+ else{
+ # Get Macpickers from ICM705M1
+ $ICM705M1 = DB::connection(config('m3.connection', 'pgsql'))->table('icm705m1')
+ ->select('APMANIFEST','APCO','APWHS')
+ ->where('APSPARE2','')
+ ->where('APCO',$APCO)
+ ->where('APWHS',$APWHS)
+ ->where('APMANIFEST','=',$MANIFESTNum)
+ ->first();
+
+ # Update ICM705M1 and set APSPARE2 to P
+ $ICM705M1U = DB::connection(config('m3.connection', 'pgsql'))->table('icm705m1')
+ ->where('APMANIFEST',$MANIFESTNum)
+ ->where('APCO',$APCO)
+ ->where('APWHS',$APWHS)
+ ->update(["APSPARE2"=>"P"]);
+
+ $myRequest = new Request();
+ $myRequest->setMethod('POST');
+
+ $myRequest->request->add([
+ 'WHS' => $APWHS ,
+ 'COMPANY' => $APCO,
+ 'TRANSTYPE' => 'M',
+ 'MANIFEST' => $MANIFESTNum
+ ]);
+
+ $callCloseShipment = CloseShipment::CloseShipmentCoChargeAPI($myRequest);
+ $responseData = $callCloseShipment->getData();
+ $jsonData = json_encode($responseData);
+ Log::channel('dailyCron')->info("Close Shipment API Response for Manifest:".$MANIFESTNum.'-'.$jsonData);
+ return 1;
+ }
+ // }
+ // else{
+ // Log::channel('dailyCron')->error('A user must be defined...');
+
+ // $this->error('A user must be defined...');
+ // }
+
+ }
+ catch (\Throwable $th) {
+ // Log::error($th);
+ Log::channel('dailyCron')->error($th);
+ }
+ }
+}
diff --git a/Modules/M3/Console/ClosedOrderSaveXls.php b/Modules/M3/Console/ClosedOrderSaveXls.php
new file mode 100644
index 00000000..872b6bef
--- /dev/null
+++ b/Modules/M3/Console/ClosedOrderSaveXls.php
@@ -0,0 +1,261 @@
+info('Start CallCloseAPI...');
+ ini_set('max_execution_time', Config::get('arrays.PHPTimeOutCL'));
+ ini_set('max_input_time', Config::get('arrays.PHPTimeOutCL'));
+ ini_set('default_socket_timeout', Config::get('arrays.PHPTimeOutCL'));
+ ini_set('memory_limit', '1024M');
+
+ try {
+ Log::channel('dailyCron')->info("Cron...Start Save Orders Closed Lines to Excel");
+
+ # Get the Calling User
+ $userId = $this->argument('user');
+ $SHUSER = isset($userId) ? $userId : (m3_user() !== '' ? Str::upper(trim(m3_user())) : '');
+
+ $CO = $this->argument('co');
+ $COMPANY = isset($CO) ? trim($CO) : '';
+ $PWHS = $this->argument('whs');
+ $WHS = isset($PWHS) ? trim($PWHS) : '';
+ $PPL = $this->argument('pl');
+ $PLANT = isset($PPL) ? trim($PPL) : '';
+
+ # Generate last Month Report
+ $date = new \DateTime('FIRST DAY OF THIS MONTH');
+ $date->modify('-1 month');
+ $fromPreviousMonth = $date->format('Y-m-d');
+ $toPreviousMonth = $date->modify('last day of this month')->format('Y-m-d');
+ $reportDate = \DateTime::createFromFormat('Y-m-d', $fromPreviousMonth )->format('Ymd');
+ $toreportDate = \DateTime::createFromFormat('Y-m-d', $toPreviousMonth )->format('Ymd');
+ $reportDateWD = $fromPreviousMonth;
+ $toreportDateWD = $toPreviousMonth;
+
+ if ($WHS == '321') {
+ $prevMonthFile = 'Closedorderlinesreport_'.$reportDateWD.'-'.$toreportDateWD.'.xlsx';
+ }
+ else {
+ $prevMonthFile = $WHS.'/Closedorderlinesreport_'.$reportDateWD.'-'.$toreportDateWD.'-'.$WHS.'.xlsx';
+ }
+
+ $this->info("Generate Last Month Report...");
+ $this->info("From Date: ".$reportDate);
+ $this->info("To Date: ".$toreportDate);
+
+ # Check that the Excel file Exist
+ $prevMonthFileExist = Storage::disk('publicCL')->exists($prevMonthFile) ? false: true ;
+ $this->info("Prev Month File Exist: " .$prevMonthFileExist);
+
+ if($reportDate!='' && $COMPANY!='' && $WHS!='' && $PLANT!='' && $prevMonthFileExist ){
+ # Case 729: Add Currency code A1SHCURR FROM ICM666M
+ $ICM688M2 = DB::connection(config('m3.connection', 'pgsql'))
+ ->select("
+ SELECT (SHDT || ' ' || SHTIME) AS DATECLOSED, A5MACPKR, A5ONO,
+ A4OFSTRM,
+ A5PMPWHT*A5PACKED AS WEIGHT,
+ A4SCAC,
+ A4SHIPTYPE,
+ (SELECT A4REFORD FROM ICM688M1 WHERE A4MACPKR=A5MACPKR) AS A4REFORD,
+ A5PART, A5RSVQTY, A5PACKED, A5RSVQTY - A5PACKED AS CALCULATED_COLUMN,
+ A5SLUNPR * A5PACKED AS ANOTHER_CALCULATED_COLUMN,
+ (SELECT A4SHSHNM FROM ICM688M1 WHERE A4MACPKR=A5MACPKR) AS A4SHSHNM ,
+ CASE WHEN SHDT IS NULL THEN (SELECT SHDATA FROM ICM699M WHERE SHMACPKR=A5MACPKR AND SHTYPE='M3-Res-out' AND SHSOURCE='CloseShipmentCoChargeAPI' ORDER BY SHDT DESC, SHTIME DESC FETCH FIRST 1 ROWS ONLY) ELSE '' END AS REASON,
+ A1SHCURR,
+ CASE
+ WHEN (SELECT A4SHIPTYPE FROM ICM688M1 WHERE A4MACPKR=A5MACPKR) = 'LTL'
+ THEN (SELECT A4RATETCP FROM ICM688M1 WHERE A4MACPKR=A5MACPKR) * ".(100.00 - Config::get('arrays.misc.discountCarrierRateForCustomerPriceLTL'))/100 ."
+ ELSE (SELECT A4RATETCP FROM ICM688M1 WHERE A4MACPKR=A5MACPKR) * ".(100.00 - Config::get('arrays.misc.discountCarrierRateForCustomerPriceParcel') )/100 ."
+ END AS FREIGHT
+ FROM ICM688M2
+ LEFT JOIN ICM699M ON SHMACPKR=A5MACPKR AND SHTYPE='M3-Res-out' AND SHDATA LIKE 'Success%' AND SHSOURCE='CloseShipmentCoChargeAPI'
+ LEFT JOIN ICM666M ON A1DELNO=A5MACPKR AND A1ONO=A5ONO AND A1PKLN=A5BRADLN
+ LEFT JOIN ICM688M1 ON A4MACPKR=A5MACPKR
+ WHERE A5MACPKR IN (
+ SELECT DISTINCT AYMACPKR
+ FROM ICM695M1
+ WHERE AYSTATUS IN ('Z','z') AND AYAPR8N002 BETWEEN $reportDate AND $toreportDate
+ )
+ AND A5CO=$COMPANY AND A5WHS=$WHS AND A5PLANT=$PLANT
+ ");
+
+ // $newItem = ["A5MACPKR" => 'Delivery #', "A5ONO" => 'Order #', "A4REFORD" => 'Order Type',"A5PART" => 'Part #',"A5RSVQTY" => 'Reserved',
+ // "A5PACKED" => 'Packed',"CALCULATED_COLUMN" => 'Back Order Qty',"ANOTHER_CALCULATED_COLUMN" => 'Value Packed $',"A4SHSHNM" => 'Customer name',
+ // "SHDT" => 'Date',"SHTIME" => 'Time',"REASON" => 'Failure Reason','A1SHCURR'=> 'Currency Code','FREIGHT'=> 'Freight'];
+
+ $newItem = ["DATECLOSED" => 'Close Date',"A5MACPKR" => 'Delivery #', "A5ONO" => 'Order #',
+ "A4OFSTRM" => 'Terms',"WEIGHT" => 'Weight',"A4SCAC" => 'Carrier',"A4SHIPTYPE" => 'Mode (Parcel, Air, TL or LTL)',
+ "A4REFORD" => 'Order Type',"A5PART" => 'Part #',"A5RSVQTY" => 'Reserved',
+ "A5PACKED" => 'Packed',"CALCULATED_COLUMN" => 'Back Order Qty',"ANOTHER_CALCULATED_COLUMN" => 'Value Packed $',"A4SHSHNM" => 'Customer name',
+ "REASON" => 'Failure Reason','A1SHCURR'=> 'Currency Code','FREIGHT'=> 'Freight'];
+
+ $ICM688M2Col = collect($ICM688M2);
+ $ICM688M2Col->prepend($newItem);
+
+ # Count records before exporting to excel : Max 55K records are allowed
+ $ICM688M2Count = $ICM688M2Col->count();
+ # Set Max allowed records
+ $maxRecords = Config::get('arrays.maxRecCL');
+ if ($ICM688M2Count>$maxRecords) {
+ Log::channel('dailyCron')->info('Maximum allowed records for Excel export is: '.number_format($maxRecords).' current records: '.number_format($ICM688M2Count));
+ }
+ }
+ else{
+ $ICM688M2Col = collect();
+ }
+
+ if ($ICM688M2Col->count()>0) {
+ $this->info("Saving Last Month Excel Report to Disk");
+ Log::channel('dailyCron')->info("Saving Last Month Excel Report to Disk");
+
+ # Store the File to Storage
+ app(\Modules\M3\Services\SpreadsheetExport::class)->store($ICM688M2Col, $prevMonthFile, 'publicCL');
+ # Other File Formats : \Maatwebsite\Excel\Excel::CSV , ,\Maatwebsite\Excel\Excel::ODS
+ }
+ else{
+ Log::channel('dailyCron')->info("Monthly report, no records found: Nothing to save...");
+ }
+
+ # Generate current Month Report
+ $now = new \DateTime();
+ $first_day_of_month = $now->format('Y-m-01');
+ $current_date = $now->format('Y-m-d');
+ $reportDate2 = \DateTime::createFromFormat('Y-m-d', $first_day_of_month )->format('Ymd');
+ $toreportDate2 = \DateTime::createFromFormat('Y-m-d', $current_date )->format('Ymd');
+
+ if ($WHS == '321') {
+ $currentMonthFile = 'first_of_month_to_current_date.xlsx';
+ }
+ else{
+ $currentMonthFile = $WHS.'/first_of_month_to_current_date_'.$WHS.'.xlsx';
+ }
+
+ $this->info("Generate Current Month Report...");
+ $this->info("From Date: ".$reportDate2);
+ $this->info("To Date : ".$toreportDate2);
+
+ if($reportDate2!='' && $COMPANY!='' && $WHS!='' && $PLANT!=''){
+ $this->info(">>> Proceed...");
+
+ # Case 729: Add Currency code A1SHCURR FROM ICM666M
+ $ICM688M2 = DB::connection(config('m3.connection', 'pgsql'))
+ ->select("
+ SELECT (SHDT || ' ' || SHTIME) AS DATECLOSED, A5MACPKR, A5ONO,
+ A4OFSTRM,
+ A5PMPWHT*A5PACKED AS WEIGHT,
+ A4SCAC,
+ A4SHIPTYPE,
+ (SELECT A4REFORD FROM ICM688M1 WHERE A4MACPKR=A5MACPKR) AS A4REFORD,
+ A5PART, A5RSVQTY, A5PACKED, A5RSVQTY - A5PACKED AS CALCULATED_COLUMN,
+ A5SLUNPR * A5PACKED AS ANOTHER_CALCULATED_COLUMN,
+ (SELECT A4SHSHNM FROM ICM688M1 WHERE A4MACPKR=A5MACPKR) AS A4SHSHNM ,
+ CASE WHEN SHDT IS NULL THEN (SELECT SHDATA FROM ICM699M WHERE SHMACPKR=A5MACPKR AND SHTYPE='M3-Res-out' AND SHSOURCE='CloseShipmentCoChargeAPI' ORDER BY SHDT DESC, SHTIME DESC FETCH FIRST 1 ROWS ONLY) ELSE '' END AS REASON,
+ A1SHCURR,
+ CASE
+ WHEN (SELECT A4SHIPTYPE FROM ICM688M1 WHERE A4MACPKR=A5MACPKR) = 'LTL'
+ THEN (SELECT A4RATETCP FROM ICM688M1 WHERE A4MACPKR=A5MACPKR) * ".(100.00 - Config::get('arrays.misc.discountCarrierRateForCustomerPriceLTL'))/100 ."
+ ELSE (SELECT A4RATETCP FROM ICM688M1 WHERE A4MACPKR=A5MACPKR) * ".(100.00 - Config::get('arrays.misc.discountCarrierRateForCustomerPriceParcel') )/100 ."
+ END AS FREIGHT
+ FROM ICM688M2
+ LEFT JOIN ICM699M ON SHMACPKR=A5MACPKR AND SHTYPE='M3-Res-out' AND SHDATA LIKE 'Success%' AND SHSOURCE='CloseShipmentCoChargeAPI'
+ LEFT JOIN ICM666M ON A1DELNO=A5MACPKR AND A1ONO=A5ONO AND A1PKLN=A5BRADLN
+ LEFT JOIN ICM688M1 ON A4MACPKR=A5MACPKR
+ WHERE A5MACPKR IN (
+ SELECT DISTINCT AYMACPKR
+ FROM ICM695M1
+ WHERE AYSTATUS IN ('Z','z') AND AYAPR8N002 BETWEEN $reportDate2 AND $toreportDate2
+ )
+ AND A5CO=$COMPANY AND A5WHS=$WHS AND A5PLANT=$PLANT
+ ");
+
+ // $newItem2 = ["A5MACPKR" => 'Delivery #', "A5ONO" => 'Order #', "A4REFORD" => 'Order Type',"A5PART" => 'Part #',"A5RSVQTY" => 'Reserved',
+ // "A5PACKED" => 'Packed',"CALCULATED_COLUMN" => 'Back Order Qty',"ANOTHER_CALCULATED_COLUMN" => 'Value Packed $',"A4SHSHNM" => 'Customer name',
+ // "SHDT" => 'Date',"SHTIME" => 'Time',"REASON" => 'Failure Reason','A1SHCURR'=> 'Currency Code','FREIGHT'=> 'Freight'];
+
+ $newItem2 = ["DATECLOSED" => 'Close Date',"A5MACPKR" => 'Delivery #', "A5ONO" => 'Order #',
+ "A4OFSTRM" => 'Terms',"WEIGHT" => 'Weight',"A4SCAC" => 'Carrier',"A4SHIPTYPE" => 'Mode (Parcel, Air, TL or LTL)',
+ "A4REFORD" => 'Order Type',"A5PART" => 'Part #',"A5RSVQTY" => 'Reserved',
+ "A5PACKED" => 'Packed',"CALCULATED_COLUMN" => 'Back Order Qty',"ANOTHER_CALCULATED_COLUMN" => 'Value Packed $',"A4SHSHNM" => 'Customer name',
+ "REASON" => 'Failure Reason','A1SHCURR'=> 'Currency Code','FREIGHT'=> 'Freight'];
+
+ $ICM688M2Col2 = collect($ICM688M2);
+ $ICM688M2Col2->prepend($newItem2);
+
+ # Count records before exporting to excel : Max 55K records are allowed
+ $ICM688M2Count = $ICM688M2Col2->count();
+ # Set Max allowed records
+ $maxRecords = Config::get('arrays.maxRecCL');
+ if ($ICM688M2Count>$maxRecords) {
+ Log::channel('dailyCron')->info('Maximum allowed records for Excel export is: '.number_format($maxRecords).' current records: '.number_format($ICM688M2Count));
+ }
+ }
+ else{
+ $ICM688M2Col2 = collect();
+ }
+
+ if ($ICM688M2Col2->count()>0) {
+ $this->info("Saving Current Month Excel Report to Disk");
+ Log::channel('dailyCron')->info("Saving Current Month Excel Report to Disk");
+ # Store the File to Storage
+ app(\Modules\M3\Services\SpreadsheetExport::class)->store($ICM688M2Col2, $currentMonthFile, 'publicCL');
+ }
+ else{
+ Log::channel('dailyCron')->info("Daily Report, no records found: Nothing to save...");
+ }
+
+ Log::channel('dailyCron')->info("Cron...End Save Orders Closed Lines to Excel");
+ $this->info("Cron...End Save Orders Closed Lines to Excel");
+
+ }
+ catch (\Throwable $th) {
+ // Log::error($th);
+ Log::channel('dailyCron')->error($th);
+ }
+ }
+}
diff --git a/Modules/M3/Console/DeleteOldLabels.php b/Modules/M3/Console/DeleteOldLabels.php
new file mode 100644
index 00000000..cab162a2
--- /dev/null
+++ b/Modules/M3/Console/DeleteOldLabels.php
@@ -0,0 +1,108 @@
+info('Start CallCloseAPI...');
+ ini_set('max_execution_time', Config::get('arrays.PHPTimeOutCL'));
+ ini_set('max_input_time', Config::get('arrays.PHPTimeOutCL'));
+ ini_set('default_socket_timeout', Config::get('arrays.PHPTimeOutCL'));
+ ini_set('memory_limit', '1024M');
+
+ try {
+ $this->info("Start Delete Old Labels Command...");
+ Log::channel('dailyCron')->info("Cron...Start Delete Old Labels Command...");
+
+ $labelsDirectoryTmp = '/www/sentm3live/htdocs/labels/';
+ $subFolders = ['CarrierLabel/','ContentLabel/','PackingList/']; // ,'CarrierLabel/','ContentLabel','PackingList',''
+ $daysOld = 180; // Number of days to consider a file old : 180 =Six Months
+ $filesToDeleteArr = [];
+
+ foreach ($subFolders as $key => $subFolder) {
+ $labelsDirectory = $labelsDirectoryTmp.$subFolder;
+
+ $this->info("Getting Files From Directory: ".$labelsDirectory);
+ Log::channel('dailyCron')->info("Getting Files From Directory: ".$labelsDirectory);
+
+ exec('find '.$labelsDirectory.' -ctime +180 -type f -exec rm {} \;');
+ # exec('find '.$labelsDirectory.' -ctime +190 -type f -print | wc -l');
+ }
+
+ $labelsFolder = $labelsDirectoryTmp;
+ # Get Files from the specified Directory
+ $filesToDelete = File::allFiles($labelsFolder);
+
+ foreach ($filesToDelete as $file) {
+ $lastAccessTime = new \DateTime("@".$file->getATime());
+ $now = new \DateTime();
+ $diff = $now->diff($lastAccessTime)->days;
+
+ if ($diff >= $daysOld) {
+ $this->info("File: ".$file." is Days Old: ".$diff);
+ // Log::channel('dailyCron')->info("File: ".$file." is Days Old: ".$diff);
+ # Add the File to Array
+ $filesToDeleteArr[] = $file;
+ }
+ }
+
+ // $this->info("Files to Delete...");
+ // dump($filesToDeleteArr);
+
+ # Delete Old Files
+ File::delete($filesToDeleteArr);
+
+ Log::channel('dailyCron')->info("Cron...End Delete Old Labels Command...");
+ $this->info("End Delete Old Labels Command...");
+
+ }
+ catch (\Throwable $th) {
+ // Log::error($th);
+ Log::channel('dailyCron')->error($th);
+ }
+ }
+}
diff --git a/Modules/M3/Console/GenerateGS1Cmd.php b/Modules/M3/Console/GenerateGS1Cmd.php
new file mode 100644
index 00000000..efbdcaec
--- /dev/null
+++ b/Modules/M3/Console/GenerateGS1Cmd.php
@@ -0,0 +1,289 @@
+info('Start CallCloseAPI...');
+ ini_set('max_execution_time', Config::get('arrays.PHPTimeOutCL'));
+ ini_set('max_input_time', Config::get('arrays.PHPTimeOutCL'));
+ ini_set('default_socket_timeout', Config::get('arrays.PHPTimeOutCL'));
+ ini_set('memory_limit', '1024M');
+
+ try {
+ $this->info('>>> Run GS1 Label creation Command...');
+ Log::channel('LabelCron')->info(">>> Run GS1 Label creation Command...");
+
+ # Get the Calling User
+ $userId = $this->argument('user');
+ $SHUSER = isset($userId) ? $userId : (m3_user() !== '' ? Str::upper(trim(m3_user())) : 'TWOSHIP');
+ $this->info('User: '.$SHUSER);
+
+ # Get Manifest Array
+ $GSArray1 = $this->option('gsarray');
+ $GSArray = json_decode($GSArray1, true);
+ // dump($GSArray);
+
+ # MAK : Used for debug only
+ $GSArray = ["Macpkr"=> "55555","Recipient_Address1"=>"9571 Pan American DR", "Recipient_Address2"=>"C/O AEE Solar","Recipient_City"=>"El Paso",
+ "Recipient_CompanyName"=>"SNAPRACK EL PASO PRODUCTION","Recipient_CountryCode"=>"US","Recipient_PostalCode"=>"79927","Recipient_State"=>"TX",
+ "Sender_Address1"=>"6800 Arnold Miller Pkwy","Sender_Address2"=>"","Sender_City"=>"Solon",
+ "Sender_CompanyName"=>"Erico International","Sender_Country"=>"US","Sender_PostalCode"=>"44139","Sender_State"=>"OH",
+ "CarrierName"=>"R&L Carriers","trackingno"=>"306539838","BOLnumber"=>"693103848064454","ShipmentPONumber"=>"4523039092",
+ "PackagesArray"=> ["package 1" , "package 2"]
+ ];
+
+
+ if ($SHUSER!='') {
+ # Get User CO & WH from Table ICM428M
+ $ICM428M = DB::connection(config('m3.connection', 'pgsql'))->table('icm428m')
+ ->select('R428US','R428CO', 'R428WH','R428PL')
+ ->where('R428US','=',$SHUSER)
+ ->first();
+
+ $R428US = isset($ICM428M->R428US) ? $ICM428M->R428US : ''; # User
+ $COMPANY = isset($ICM428M->R428CO) ? $ICM428M->R428CO : ''; # Company
+ $PLANT = isset($ICM428M->R428PL) ? $ICM428M->R428PL : ''; # Plant
+ $WHS = isset($ICM428M->R428WH) ? $ICM428M->R428WH : ''; # WareHouse
+
+ $Macpkr = $GSArray['Macpkr'];
+ $packageType = '0';
+ $manufactID = '0826528'; # MAK : get ID from Nvent and save to Config File
+ $total_length = 9;
+
+ $html = '
+
+
+
+
+ ';
+
+ # Get number of Pallets
+ $packageCount = count($GSArray['PackagesArray']);
+ $packageNum = 1;
+ foreach ($GSArray['PackagesArray'] as $key => $value) {
+ $table_style = $packageNum < $packageCount ? ' style="page-break-after: always;" ' : '';
+
+ if (Cache::has('GS1SEQUENCE')) {
+ $GS1SEQUENCE = Cache::get('GS1SEQUENCE');
+ $GS1SEQUENCE++;
+ $GS1SEQUENCEID = str_pad($GS1SEQUENCE, $total_length, "0", STR_PAD_LEFT);
+ }
+ # Box Number Not Found Get it from DB
+ else{
+ $GS1SEQUENCE = 1;
+ $GS1SEQUENCEID = str_pad($GS1SEQUENCE, $total_length, "0", STR_PAD_LEFT);
+ }
+ Cache::forever('GS1SEQUENCE', $GS1SEQUENCEID);
+ $this->info(">>> GS1 sequence Id: ".$GS1SEQUENCEID);
+
+ $gs1_128_bc_1 = '00' .$packageType . $manufactID . $GS1SEQUENCEID;
+
+ # Calculate Check Digit
+ $digits = str_split($gs1_128_bc_1);
+ $sum = 0;
+ $length = count($digits);
+
+ # Loop through each digit starting from the right
+ for ($i = 0; $i < $length; $i++) {
+ $digit = $digits[$length - $i - 1];
+ # Assign a weight of 3 or 1 alternately
+ $weight = ($i % 2 == 0) ? 3 : 1;
+ # Add the product of the digit and its weight to the sum
+ $sum += $digit * $weight;
+ }
+ # Calculate the remainder when sum is divided by 10
+ $remainder = $sum % 10;
+ # If remainder is 0, check digit is 0; otherwise, subtract remainder from 10
+ $checkDigit = ($remainder == 0) ? 0 : 10 - $remainder;
+
+ $gs1_128_bc = $gs1_128_bc_1 . $checkDigit;
+ $gs1_128_bc_desc = '(00)' .$packageType . $manufactID . $GS1SEQUENCEID .$checkDigit;
+
+ $data = [
+ 'ship_to' => $GSArray["Recipient_CompanyName"].'
'.$GSArray["Recipient_Address1"].'
'.
+ $GSArray["Recipient_City"].','. $GSArray["Recipient_State"]
+ .'
'.$GSArray["Recipient_PostalCode"] ,
+ 'from' => $GSArray["Sender_CompanyName"].'
'.$GSArray["Sender_Address1"].'
'.
+ $GSArray["Sender_City"].','. $GSArray["Sender_State"]
+ .'
'.$GSArray["Sender_PostalCode"] ,
+ 'ship_to_lbl' => '420'.$GSArray["Recipient_PostalCode"],
+ 'ship_to_desc' => '(420)'.$GSArray["Recipient_PostalCode"],
+ 'pro' => '190071217845706',
+ 'item_number' => '10000B',
+ 'upc' => '098506095310',
+ 'quantity' => '1',
+ 'serial_shipping_container' => $gs1_128_bc_desc
+ ];
+
+ # Initialize barcode generator
+ $generator = new BarcodeGeneratorPNG();
+
+ # Generate barcodes
+ $shipToPostalCodeBarcode = $generator->getBarcode($data['ship_to_lbl'], $generator::TYPE_CODE_128);
+ $serialShippingContainerBarcode = $generator->getBarcode($data['serial_shipping_container'], $generator::TYPE_CODE_128, 2 ,50);
+
+ # HTML content for the label
+ $html .= '
+
+
+
+ FROM: ' . $data['from'] . '
+ |
+
+ SHIP TO: ' . $data['ship_to'] . '
+ |
+
+
+
+
+ ' . $data['ship_to_desc'] . '
+ |
+
+ Carrier: '.$GSArray["CarrierName"].'
+ PRO #: '.$GSArray["ShipmentPONumber"].'
+ B/L #: '.$GSArray["BOLnumber"].'
+ |
+
+
+
+ PURCHASE ORDER: '.$GSArray["Macpkr"].'
+ Vendor: ' . $manufactID . '
+ |
+
+ Pallet # : '.$packageNum.' of '.$packageCount.'
+ |
+
+
+
+  . ')
+ ' . $data['serial_shipping_container'] . '
+ |
+
+
';
+
+ $packageNum++;
+ }
+
+ $html .=' ';
+ // dump($html);
+ // App::call('App\Http\Controllers\utilitiesContoller@generateGS128');
+
+ ob_start();
+
+ # Initialize Dompdf
+ $dompdf = new Dompdf();
+ $dompdf->loadHtml($html);
+ $dompdf->setPaper('a6', 'portrait');
+ # Render the HTML as PDF
+ $dompdf->render();
+
+ # Output the generated PDF to Browser
+ // $dompdf->stream();
+
+ $pdfContent = $dompdf->output();
+ // dump($pdfContent);
+
+ $labelsPath = Config::get('arrays.PdfPath');
+ # Put the PDF in labels/CarrierLabel
+ $GSFolder = "GSLabel";
+ $carrierFileName = $GSFolder.'_'.$Macpkr.'_'.$COMPANY.'_'.$WHS;
+ file_put_contents($labelsPath.$GSFolder.'/'.$carrierFileName.'.pdf',$pdfContent);
+
+ # Check if the PDF was generated correctly
+ // if (!file_exists($tempPdfPath) || filesize($tempPdfPath) === 0) {
+ // throw new Exception('PDF generation failed.');
+ // }
+
+ ob_end_clean();
+ }
+
+ Log::channel('LabelCron')->info("<<< GS1-128...End of Label Creation");
+ $this->info("<<< GS1-128...End of Label Creation");
+
+ }
+ catch (\Throwable $th) {
+ // Log::error($th);
+ Log::channel('LabelCron')->error($th);
+ }
+ }
+}
diff --git a/Modules/M3/Console/UtilitiesCmd.php b/Modules/M3/Console/UtilitiesCmd.php
new file mode 100644
index 00000000..397d1d33
--- /dev/null
+++ b/Modules/M3/Console/UtilitiesCmd.php
@@ -0,0 +1,72 @@
+info('Start CallCloseAPI...');
+ ini_set('max_execution_time', Config::get('arrays.PHPTimeOutCL'));
+ ini_set('max_input_time', Config::get('arrays.PHPTimeOutCL'));
+ ini_set('default_socket_timeout', Config::get('arrays.PHPTimeOutCL'));
+ ini_set('memory_limit', '1024M');
+
+ try {
+ $this->info("Start Utilities Command...");
+
+ // $this->info('User: '.$SHUSER);
+ $myRequest = new Request();
+ utilitiesContoller::fixICM799MSentPKR($myRequest);
+
+ // Log::channel('dailyCron')->info("Cron...End Save Orders Closed Lines to Excel");
+ $this->info("End Utilities Command...");
+
+ }
+ catch (\Throwable $th) {
+ // Log::error($th);
+ Log::channel('dailyCron')->error($th);
+ }
+ }
+}
diff --git a/Modules/M3/Console/WHSMetricsSaveXls.php b/Modules/M3/Console/WHSMetricsSaveXls.php
new file mode 100644
index 00000000..d0f50c43
--- /dev/null
+++ b/Modules/M3/Console/WHSMetricsSaveXls.php
@@ -0,0 +1,195 @@
+info('Start CallCloseAPI...');
+ ini_set('max_execution_time', Config::get('arrays.PHPTimeOutCL'));
+ ini_set('max_input_time', Config::get('arrays.PHPTimeOutCL'));
+ ini_set('default_socket_timeout', Config::get('arrays.PHPTimeOutCL'));
+ ini_set('memory_limit', '1024M');
+
+ try {
+ Log::channel('dailyCron')->info("Cron...Start Save WHS Metrics to Excel");
+
+ # Get the Calling User
+ $userId = $this->argument('user');
+ $SHUSER = isset($userId) ? $userId : (m3_user() !== '' ? Str::upper(trim(m3_user())) : '');
+
+ $CO = $this->argument('co');
+ // $COMPANY = isset($CO) ? trim($CO) : '110';
+ $COMPANY = '110';
+ $PWHS = $this->argument('whs');
+ // $WHS = isset($PWHS) ? trim($PWHS) : '321';
+ $WHS = '321';
+ $PPL = $this->argument('pl');
+ // $PLANT = isset($PPL) ? trim($PPL) : '143';
+ $PLANT = '143';
+
+ $date = new \DateTime();
+ $DateToday = $date->format('Y-m-d');
+
+ # Define File Name
+ $whsPerfFile = 'WhsPerf/'.$WHS.'/WhsPerfMetrics_'.$DateToday.'-'.$WHS.'.xlsx';
+ Log::channel('dailyCron')->info(">>> File Name:");
+ Log::channel('dailyCron')->info($whsPerfFile);
+
+ $this->info("Generate Today WHS Performance Report...");
+
+ if( $COMPANY!='' && $WHS!='' && $PLANT!='' ){
+ # Get Header Content
+ $ICM700MHeadSel = DB::connection(config('m3.connection', 'pgsql'))
+ ->select("
+ WITH TEMPFILE AS (
+ SELECT A.*,A4TPCKWGHT,A4NOPICLNS,A4PICKSTS,
+ CASE WHEN UPPER(A4PICKSTS)<>'A' THEN 'Open' ELSE 'Closed' END AS STATUS,
+ CASE WHEN A4TPCKWGHT>16000 THEN 'FTL' ELSE A4SHIPTYPE END AS A4SHIPTYPE,
+ (SELECT SUM(A5RSVQTY*A5SLUNPR) FROM ICM688M2 WHERE A4MACPKR=A5MACPKR) AS DOLLARS
+ FROM ICM700M A LEFT JOIN ICM688M1 B ON A4MACPKR=A3MACPKR
+ WHERE A3MSMTDATE= (SELECT MAX(A3MSMTDATE) FROM ICM700M) AND A3CO='$COMPANY' AND A3WHS='$WHS' AND A3PLT='$PLANT'
+ )
+ SELECT A4SHIPTYPE,STATUS,SOURCE,COUNT(*) AS PICKERS, SUM(A4TPCKWGHT) AS WEIGHT,SUM(A4NOPICLNS) AS LINES,SUM(DOLLARS) AS DOLLARS
+ FROM TEMPFILE
+ GROUP BY A4SHIPTYPE,STATUS,SOURCE
+ ORDER BY 1,3,2
+ ");
+ // dd($ICM700MHeadSel);
+
+ $newItem = ["A4SHIPTYPE" => 'Method', "STATUS" => 'Status', "SOURCE" => 'Source', "PICKERS" => 'Pickers',
+ "WEIGHT" => 'Weight', "LINES" => 'Lines', "DOLLARS" => 'Dollars'];
+
+ # Trim All values
+ $ICM700MHeadCol = collect($ICM700MHeadSel)->map(function ($item) {
+ foreach ($item as $key => $value) {
+ if (is_string($value)) {
+ $item->{$key} = trim($value);
+ }
+ }
+ return $item;
+ });
+ # Prepend Header to Collection
+ $ICM700MHeadCol->prepend($newItem);
+
+ // $this->info($ICM700MHeadCol);
+ // Log::channel('dailyCron')->info(">>> Header Content");
+ // Log::channel('dailyCron')->info($ICM700MHeadCol);
+
+ # Count records before exporting to excel
+ $ICM700MHeadCount = $ICM700MHeadCol->count();
+
+ # Get Details Content
+ $ICM700MDetailsSel = DB::connection(config('m3.connection', 'pgsql'))
+ ->select("
+ WITH TEMPFILE AS (
+ SELECT A3CO,A3WHS,A3PLT,A3MACPKR,A4PICKCRTS,SOURCE,
+ (SELECT TO_TIMESTAMP(CAST(SHDT AS TEXT) || ' ' || CAST(SHTIME AS TEXT), 'YYYY-MM-DD HH24:MI:SS') FROM ICM699M WHERE SHMACPKR=A4MACPKR AND SHTYPE='Lisnr-Hold' ORDER BY SHDT DESC, SHTIME DESC FETCH FIRST 1 ROWS ONLY) AS CARRIERASSIGNED,
+ A4ONO,A4SHSHNM,A4SCAC,A42SSVCNAM,A4PICKSTS,
+ CASE WHEN UPPER(A4PICKSTS)<>'A' THEN 'Open' ELSE 'Closed' END AS STATUS,
+ CASE WHEN A4TPCKWGHT>16000 THEN 'FTL' ELSE A4SHIPTYPE END AS A4SHIPTYPE,
+ A4TPCKWGHT,A4NOPICLNS,
+ (SELECT SUM(A5RSVQTY*A5SLUNPR) FROM ICM688M2 WHERE A4MACPKR=A5MACPKR) AS DOLLARS
+ FROM ICM700M A
+ LEFT JOIN ICM688M1 B ON A4MACPKR=A3MACPKR
+ WHERE A3MSMTDATE=(SELECT MAX(A3MSMTDATE) FROM ICM700M) AND A3CO='$COMPANY' AND A3WHS='$WHS' AND A3PLT='$PLANT'
+ )
+ SELECT * FROM TEMPFILE
+ ");
+
+ $newItem2 = ["A3CO" => 'Co', "A3WHS" => 'Whs', "A3PLT" => 'Plt', "A3MACPKR" => 'Delivery No', "A4PICKCRTS" => 'Date Time Arrived in Sentinel',
+ "SOURCE" => 'Source', "CARRIERASSIGNED" => 'Date carrier Assigned', "A4ONO" => 'Order No', "A4SHSHNM" => 'Customer name',"A4SCAC" => 'Carrier',
+ "A42SSVCNAM" => 'Service', "A4PICKSTS" => 'Picker Status', "STATUS" => 'Open or Closed', "A4SHIPTYPE" => 'Method',
+ "A4TPCKWGHT" => 'Weight', "A4NOPICLNS" => 'Lines' , "DOLLARS" => 'Dollars' ];
+ # Trim all values
+ $ICM700MDetailsCol = collect($ICM700MDetailsSel)->map(function ($item) {
+ foreach ($item as $key => $value) {
+ if (is_string($value)) {
+ $item->{$key} = trim($value);
+ }
+ }
+ return $item;
+ });
+
+ # Prepend Header
+ $ICM700MDetailsCol->prepend($newItem2);
+
+ # Count records before exporting to excel
+ $ICM700MDetailsCount = $ICM700MDetailsCol->count();
+ }
+ else{
+ $ICM700MDetailsCol = collect();
+ }
+ // Log::channel('dailyCron')->info(">>> Detail Content");
+ // Log::channel('dailyCron')->info($ICM700MDetailsCol);
+
+ # Save Head and Details to XLS file
+ if ($ICM700MHeadCount>0 && $ICM700MDetailsCount>0) {
+ $this->info("Saving Today WHS Performance Report to Disk...");
+ Log::channel('dailyCron')->info("Saving Today WHS Performance Report to Disk...");
+
+ # Store both collections in one XLSX workbook using Core's PhpSpreadsheet dependency.
+ app(\Modules\M3\Services\SpreadsheetExport::class)->storeSheets([
+ 'Summary' => $ICM700MHeadCol,
+ 'Details' => $ICM700MDetailsCol,
+ ], $whsPerfFile, 'publicLabels');
+
+
+ }
+ else{
+ Log::channel('dailyCron')->info("Today WHS Performance Report, no records found: Nothing to save...");
+ }
+
+ Log::channel('dailyCron')->info("Cron...End Save Today WHS Performance Report to Excel");
+ $this->info("Cron...End Save Today WHS Performance Report to Excel");
+
+ }
+ catch (\Throwable $th) {
+ // Log::error($th);
+ Log::channel('dailyCron')->error($th);
+ }
+ }
+}
diff --git a/Modules/M3/Database/Migrations/2026_09_16_000001_create_m3_program_requests_table.php b/Modules/M3/Database/Migrations/2026_09_16_000001_create_m3_program_requests_table.php
new file mode 100644
index 00000000..c44bb9b0
--- /dev/null
+++ b/Modules/M3/Database/Migrations/2026_09_16_000001_create_m3_program_requests_table.php
@@ -0,0 +1,30 @@
+create('m3_program_requests', function (Blueprint $table): void {
+ $table->bigIncrements('id');
+ $table->string('type', 20);
+ $table->string('operation', 255);
+ $table->string('library', 255)->nullable();
+ $table->jsonb('payload')->nullable();
+ $table->string('requested_by', 255)->nullable();
+ $table->string('status', 30)->default('pending')->index();
+ $table->text('result')->nullable();
+ $table->text('error')->nullable();
+ $table->timestamp('processed_at')->nullable();
+ $table->timestamps();
+ });
+ }
+
+ public function down(): void
+ {
+ Schema::connection(config('m3.connection', 'pgsql'))->dropIfExists('m3_program_requests');
+ }
+};
diff --git a/Modules/M3/Database/Seeders/M3DatabaseSeeder.php b/Modules/M3/Database/Seeders/M3DatabaseSeeder.php
index 189d01c8..5d9bcb93 100644
--- a/Modules/M3/Database/Seeders/M3DatabaseSeeder.php
+++ b/Modules/M3/Database/Seeders/M3DatabaseSeeder.php
@@ -2,8 +2,8 @@
namespace Modules\M3\Database\Seeders;
-use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Seeder;
+use Illuminate\Database\Eloquent\Model;
class M3DatabaseSeeder extends Seeder
{
@@ -16,5 +16,6 @@ class M3DatabaseSeeder extends Seeder
{
Model::unguard();
+ // $this->call("OthersTableSeeder");
}
}
diff --git a/Modules/M3/Helpers/CAProvinces.php b/Modules/M3/Helpers/CAProvinces.php
new file mode 100644
index 00000000..6aeada1e
--- /dev/null
+++ b/Modules/M3/Helpers/CAProvinces.php
@@ -0,0 +1,25 @@
+ 'Alberta',
+ 'BC' => 'British Columbia',
+ 'MB' => 'Manitoba',
+ 'NB' => 'New Brunswick',
+ 'NL' => 'Newfoundland and Labrador',
+ 'NS' => 'Nova Scotia',
+ 'NT' => 'Northwest Territories',
+ 'NU' => 'Nunavut',
+ 'ON' => 'Ontario',
+ 'PE' => 'Prince Edward Island',
+ 'QC' => 'Quebec',
+ 'SK' => 'Saskatchewan',
+ 'YT' => 'Yukon'
+ ];
+ }
+}
diff --git a/Modules/M3/Helpers/Helper.php b/Modules/M3/Helpers/Helper.php
index a50232f3..27b62cb3 100644
--- a/Modules/M3/Helpers/Helper.php
+++ b/Modules/M3/Helpers/Helper.php
@@ -1,13 +1,382 @@
env('ENDPOINTURLSSO').env('URLTOKEN'),
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'POST',
+ CURLOPT_POSTFIELDS => 'grant_type='.env('GRANT_TYPE').'&password='.env('PASSWORD').'&username='.env('USERNAME').'&client_secret='.env('CLIENT_SECRET').
+ '&client_id='.env('CLIENT_ID'),
+ CURLOPT_HTTPHEADER => array(
+ 'Content-Type: application/x-www-form-urlencoded',
+ 'charset:UTF-8',
+ 'Accept: application/json'
+ ),
+ ));
+
+ $response = curl_exec($curl);
+ // dd($response);
+ $responseJ = json_decode($response);
+
+ if($response === false ){
+ return response()->json([
+ 'code' =>'400',
+ 'status' =>'Failed',
+ 'message' =>'Token Verification Error...'.curl_error($curl)
+ ]);
+ }
+ else if(isset($responseJ->access_token) ){
+ $IonToken = $responseJ->access_token;
+ // Log::info("New Token: " . $IonToken);
+
+ Cache::put('token', $IonToken, now()->addMinutes(59));
+ }
+ else{
+ // dd($response);
+ return response()->json([
+ 'code' =>'400',
+ 'status' =>'Failed',
+ 'message' =>'Token Verification Error...M3 response:'.$response
+ ]);
+ }
+
+ curl_close($curl);
+ }
+
+ return $IonToken;
+ // return response()->json([
+ // 'code' => '200',
+ // 'token' => $IonToken
+ // ]);
+ }
+
+ # Check M3 API Token V2
+ public static function checkReceiveTokenV2(){
+ ini_set('max_execution_time', Config::get('arrays.PHPTimeOut'));
+ ini_set('default_socket_timeout', Config::get('arrays.PHPTimeOut'));
+
+ # Clear Cache
+ // Cache::forget('token');
+
+ # Check if cached Token is still Valid
+ $token = Cache::get('token');
+
+ if (isset($token)) {
+ $IonToken = $token;
+ // Log::info("Cached Token: ".$IonToken);
+ }
+ else{
+ ### CURL
+ ### Generate Token
+ $curl = curl_init();
+
+ curl_setopt_array($curl, array(
+ CURLOPT_URL => env('ENDPOINTURLSSO').env('URLTOKEN'),
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_ENCODING => '',
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => 'POST',
+ CURLOPT_POSTFIELDS => 'grant_type='.env('GRANT_TYPE').'&password='.env('PASSWORD').'&username='.env('USERNAME').'&client_secret='.env('CLIENT_SECRET').
+ '&client_id='.env('CLIENT_ID'),
+ CURLOPT_HTTPHEADER => array(
+ 'Content-Type: application/x-www-form-urlencoded',
+ 'charset:UTF-8',
+ 'Accept: application/json'
+ ),
+ ));
+
+ $response = curl_exec($curl);
+ // dd($response);
+ $responseJ = json_decode($response);
+ curl_close($curl);
+
+ if($response === false ){
+ # Clear Cache
+ Cache::forget('token');
+ # Return Error
+ return response()->json([
+ 'code' =>'400',
+ 'status' =>'Failed',
+ 'message' =>'Token Verification Error...'.curl_error($curl)
+ ]);
+ }
+ else if(isset($responseJ->access_token) ){
+ $IonToken = $responseJ->access_token;
+ // Log::info("New Token: " . $IonToken);
+ Cache::put('token', $IonToken, now()->addMinutes(59));
+ }
+ else{
+ # Clear Cache
+ Cache::forget('token');
+ return response()->json([
+ 'code' =>'400',
+ 'status' =>'Failed',
+ 'message' =>'Token Verification Error...M3 response:'.$response
+ ]);
+ }
+ }
+
+ // return $IonToken;
+ return response()->json([
+ 'code' => '200',
+ 'token' => $IonToken
+ ]);
+ }
+
+ # Read M3 JSON and Analyse it for Errors
+ public static function checkM3Errors($responseResult){
+ // dd($responseResult);
+ # M3 Response Types
+ $M3TypesResponse = ['CloseShipment','Move','COCharge','Replenish','MoveDock'];
+ # CloseShipment Types And Contents
+ $M3CloseShipmentResp = ['AddPackage','PickingListClose','TrailerNo','TrackingNo','ContentLabel', 'DeliveryNote','ShipLabel'];
+ // 'ContentLabel', 'DeliveryNote','ShipLabel'
+ $ErrorMessages = '';
+
+ $typesErrors =0;
+
+ foreach ($M3TypesResponse as $key => $Type) {
+ // dump($responseResult->$Type);
+ if ($Type=='CloseShipment') {
+ // dump($Type);
+ $CloseShipmentErr = 0;
+ $M3RespClose = $responseResult->$Type;
+ foreach ($M3CloseShipmentResp as $key => $closeType) {
+ $ErrorMessage = $M3RespClose->$closeType->ErrorMessage;
+ $ErrorMessage = $ErrorMessage=="" ? "" : $ErrorMessage;
+ $Result = $M3RespClose->$closeType->Result;
+ $ResultT = $M3RespClose->$closeType->Result;
+ $Result = $Result=="N/A" || $Result=="OK" ? "" : $Result;
+ if ($ErrorMessage!='' || $Result!='') {
+ $ErrorMessages .= $closeType.'-'.$Result.'-'.$ErrorMessage.' ';
+ }
+ // dump($closeType);// dump($ErrorMessage);// dump($Result);
+
+ if ($ResultT=="N/A") {
+ $CloseShipmentErr++;
+ }
+ }
+ }
+ else if($Type=='MoveDock'){
+ $MoveDockRes = isset($responseResult->$Type->Move) ? $responseResult->$Type->Move : '';
+ $ErrorMessage = isset($MoveDockRes->ErrorMessage) ? $MoveDockRes->ErrorMessage :'';
+ $ErrorMessage = $ErrorMessage=="" ? "" : $ErrorMessage;
+ $Result = isset($MoveDockRes->Result) ? $MoveDockRes->Result : "";
+ $ResultT = $Result;
+ $Result = $Result=="N/A" || $Result=="OK" ? "" : $Result;
+ if ($ErrorMessage!='' || $Result!='') {
+ $ErrorMessages .= $Type.'-'.$Result.'-'.$ErrorMessage.' ';
+ }
+ // dump($Type);// dump($ErrorMessage);// dump($Result);// dump($responseResult->$Type);
+ if ($ResultT=="N/A") {
+ $typesErrors++;
+ }
+
+ }
+ else{
+ $ErrorMessage = isset($responseResult->$Type->ErrorMessage) ? $responseResult->$Type->ErrorMessage :'';
+ $ErrorMessage = $ErrorMessage=="" ? "" : $ErrorMessage;
+ $Result = isset($responseResult->$Type->Result) ? $responseResult->$Type->Result : "";
+ $ResultT = $Result;
+ $Result = $Result=="N/A" || $Result=="OK" ? "" : $Result;
+ if ($ErrorMessage!='' || $Result!='') {
+ $ErrorMessages .= $Type.'-'.$Result.'-'.$ErrorMessage.' ';
+ }
+ // dump($Type); // dump($ErrorMessage); // dump($Result); // dump($responseResult->$Type);
+ if ($ResultT=="N/A") {
+ $typesErrors++;
+ }
+ }
+ }
+ // dd($ErrorMessages);
+
+ if ($CloseShipmentErr == count($M3CloseShipmentResp) && $typesErrors == count($M3TypesResponse)-1) {
+ $ErrorMessages .= '-M3 did not call any method or type ';
+ }
+
+ return $ErrorMessages;
+ }
+
+ # Log All Success And Error to ICM699M
+ public static function logToICM699M($data){
+ ini_set('max_execution_time', Config::get('arrays.PHPTimeOut'));
+
+ $insertSQL = DB::connection(config('m3.connection', 'pgsql'))->table('ICM699M')->insert($data);
+ // dump($data);
+ // dump($insertSQL);
+ }
+
+ # Get Substring in string between 2 Substrings
+ public static function getSubstringBetween($string, $start, $end) {
+ $startPos = strpos($string, $start);
+ if ($startPos === false) {
+ return '';
+ }
+ $endPos = strpos($string, $end, $startPos + strlen($start));
+ if ($endPos === false) {
+ return '';
+ }
+ $substring = substr($string, $startPos + strlen($start), $endPos - ($startPos + strlen($start)));
+ return $substring;
+ }
+
+ public static function checkLength($JSONL,$DBL,$TYPE)
{
- return (bool) config(ModuleInfo::nameLower() . ".features.{$key}", false);
+ # Check type
+ $JSONType = gettype($JSONL);
+
+ switch ($JSONType) {
+ case 'string':
+ $JSONTypeConv = 'string';
+ break;
+ case 'double':
+ $JSONTypeConv = 'number';
+ break;
+ case 'integer':
+ $JSONTypeConv = 'number';
+ break;
+ default:
+ $JSONTypeConv = 'null';
+ break;
+ }
+
+ $TYPE = $TYPE == 'integer' || $TYPE == 'DEC' ? 'number' : $TYPE;
+ // Log::info( $JSONL .' L: '. strlen($JSONL) .' DBL: '. $DBL .' Type:'.$JSONType.':'.$TYPE );
+
+ // Check Json Field should be < DB Field
+ $LengthOK[413] = ( strlen($JSONL) <= $DBL ) ? true : false ;
+ // Empty Fields
+ $LengthOK[411] = true; //!empty($JSONL) ? true : false ;
+ // Wrong Types
+ $LengthOK[417] = true; //$JSONTypeConv == $TYPE ? true : false ;
+ // Log::info($LengthOK);
+
+ return $LengthOK;
+ }
+
+ public static function sanityzeString($StrTosanityze)
+ {
+ $badChars = Config::get('arrays.BadChars');
+
+ $goodString = trim($StrTosanityze);
+ $goodString = str_replace("'", "",$goodString);
+ $goodString = preg_replace('/\x{f0e0}/u', '', $goodString);
+ $goodString = preg_replace('/\\\\u201[0-9A-F]+/i', '', $goodString);
+ $goodString = str_replace($badChars, '',$goodString);
+ $goodString = iconv("UTF-8", "ISO-8859-1//IGNORE", $goodString);
+ $goodString = iconv("ISO-8859-1", "UTF-8", $goodString);
+
+ # MAK : New Automatic Detection for encoding and conversion
+ # Detect the encoding
+ // $encoding = mb_detect_encoding($goodString, mb_list_encodings(), true);
+ // Log::info($goodString);
+
+ # If encoding is detected, convert the string
+ // if ($encoding !== false) {
+ // // Log::info($encoding);
+ // // Log::info($goodString);
+
+ // $goodString = mb_convert_encoding($goodString, "UTF-8", $encoding);
+ // } else {
+ // $goodString = "";
+ // }
+
+ // dump($goodString);
+ return $goodString;
+ }
+
+ # Remove Duplicate SubString
+ public static function removeDuplicateSubstrings($str) {
+ $result = '';
+ $seenPhrases = [];
+
+ $phrases = explode(' ', $str);
+ foreach ($phrases as $phrase) {
+ if (!in_array($phrase, $seenPhrases)) {
+ $result .= $phrase . ' ';
+ $seenPhrases[] = $phrase;
+ }
+ }
+
+ return trim($result);
+ }
+
+public static function getUserCOWHSPLT(){
+ # Get Current USER
+ $loggedUser = strtoUpper(m3_user());
+ // dump($loggedUser);
+ $getUsers = DB::connection(config('m3.connection', 'pgsql'))->select("select R428US, R428ADMUSR, R428PWRUSR, R428CO, R428PL, R428WH, R42811A,R42821A from ICM428M where R428US='".$loggedUser."'");
+
+ foreach ($getUsers as $key=>$user) {
+ if(trim($user->R428ADMUSR)=="Y") {
+ # Different logic from Qinclude version : this not an Array
+ $admin_users=trim($user->R428ADMUSR);
+ }
+ if(trim($user->R428PWRUSR)=="Y") {
+ # Different logic from Qinclude version : this not an Array
+ $power_users=trim($user->R428PWRUSR);
+ }
+ if(trim($user->R42811A)=="C") {
+ $csr="Y";
+ }
+ if(trim($user->R42821A)=="Y") {
+ $execUser="Y";
+ }
+ $UserCO = $user->R428CO;
+ $UserWHS = $user->R428WH;
+ $UserPL = $user->R428PL;
+
+ $currentUser = [
+ 'UserCO' => $UserCO,
+ 'UserWHS' => $UserWHS,
+ 'UserPL' => $UserPL,
+ ];
+ return $currentUser;
}
}
+
+
+
+
+}
\ No newline at end of file
diff --git a/Modules/M3/Helpers/M3Auth.php b/Modules/M3/Helpers/M3Auth.php
new file mode 100644
index 00000000..6443abbd
--- /dev/null
+++ b/Modules/M3/Helpers/M3Auth.php
@@ -0,0 +1,36 @@
+user();
+
+ $value = $user?->username
+ ?? $user?->user_name
+ ?? $user?->name
+ ?? $user?->email
+ ?? request()->server('PHP_AUTH_USER')
+ ?? '';
+
+ if (str_contains((string) $value, '@')) {
+ $value = strstr((string) $value, '@', true) ?: $value;
+ }
+
+ return strtoupper(trim((string) $value));
+ }
+}
+
+if (! function_exists('m3_legacy_password')) {
+ /**
+ * Passwords are intentionally unavailable in Core. PostgreSQL access uses
+ * Laravel's configured connection and never reuses a user's login password.
+ */
+ function m3_legacy_password(): string
+ {
+ return '';
+ }
+}
diff --git a/Modules/M3/Helpers/SubdirectoryAssetsHelper.php b/Modules/M3/Helpers/SubdirectoryAssetsHelper.php
new file mode 100644
index 00000000..9ad53183
--- /dev/null
+++ b/Modules/M3/Helpers/SubdirectoryAssetsHelper.php
@@ -0,0 +1,11 @@
+ 'Alabama',
+ 'AK' => 'Alaska',
+ 'AZ' => 'Arizona',
+ 'AR' => 'Arkansas',
+ 'CA' => 'California',
+ 'CO' => 'Colorado',
+ 'CT' => 'Connecticut',
+ 'DE' => 'Delaware',
+ 'FL' => 'Florida',
+ 'GA' => 'Georgia',
+ 'HI' => 'Hawaii',
+ 'ID' => 'Idaho',
+ 'IL' => 'Illinois',
+ 'IN' => 'Indiana',
+ 'IA' => 'Iowa',
+ 'KS' => 'Kansas',
+ 'KY' => 'Kentucky',
+ 'LA' => 'Louisiana',
+ 'ME' => 'Maine',
+ 'MD' => 'Maryland',
+ 'MA' => 'Massachusetts',
+ 'MI' => 'Michigan',
+ 'MN' => 'Minnesota',
+ 'MS' => 'Mississippi',
+ 'MO' => 'Missouri',
+ 'MT' => 'Montana',
+ 'NE' => 'Nebraska',
+ 'NV' => 'Nevada',
+ 'NH' => 'New Hampshire',
+ 'NJ' => 'New Jersey',
+ 'NM' => 'New Mexico',
+ 'NY' => 'New York',
+ 'NC' => 'North Carolina',
+ 'ND' => 'North Dakota',
+ 'OH' => 'Ohio',
+ 'OK' => 'Oklahoma',
+ 'OR' => 'Oregon',
+ 'PA' => 'Pennsylvania',
+ 'RI' => 'Rhode Island',
+ 'SC' => 'South Carolina',
+ 'SD' => 'South Dakota',
+ 'TN' => 'Tennessee',
+ 'TX' => 'Texas',
+ 'UT' => 'Utah',
+ 'VT' => 'Vermont',
+ 'VA' => 'Virginia',
+ 'WA' => 'Washington',
+ 'WV' => 'West Virginia',
+ 'WI' => 'Wisconsin',
+ 'WY' => 'Wyoming',
+ 'DC' => 'District of Columbia'
+ ];
+ }
+}
diff --git a/Modules/M3/Http/Controllers/API/CloseShipment.php b/Modules/M3/Http/Controllers/API/CloseShipment.php
new file mode 100644
index 00000000..e6606ec5
--- /dev/null
+++ b/Modules/M3/Http/Controllers/API/CloseShipment.php
@@ -0,0 +1,1100 @@
+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
+}
diff --git a/Modules/M3/Http/Controllers/API/M3Controller.php b/Modules/M3/Http/Controllers/API/M3Controller.php
new file mode 100644
index 00000000..4511902b
--- /dev/null
+++ b/Modules/M3/Http/Controllers/API/M3Controller.php
@@ -0,0 +1,464 @@
+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(){}
+
+ 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"] : '';
+ // $ExchangeRate = isset($jsonFile["ExchangeRate"]) ? $jsonFile["ExchangeRate"] : '';
+ $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];
+ // dump($commentData);
+
+ switch ($AXDOCUMENT) {
+ case 'Picker':
+ $Picker = isset($comment) ? Helper::sanityzeString($comment) : 'null';
+ // dump($Picker);
+ if ($Picker!='null') {
+ $this->insertToICM666M2($Picker,$commentData);
+ }
+ break;
+
+ case 'Packer':
+ $Packer = isset($comment) ? Helper::sanityzeString($comment) : 'null';
+ // dump($Packer);
+ if ($Packer!='null') {
+ $this->insertToICM666M2($Packer,$commentData);
+ }
+ break;
+
+ case 'Carrier':
+ $Carrier = isset($comment) ? Helper::sanityzeString($comment) : 'null';
+ // dump($Carrier);
+ if ($Carrier!='null') {
+ $this->insertToICM666M2($Carrier,$commentData);
+ }
+ break;
+
+ case 'Other':
+ $Other = isset($comment) ? Helper::sanityzeString($comment) : 'null';
+ // dump($Other);
+ if ($Other!='null') {
+ $this->insertToICM666M2($Other,$commentData);
+ }
+ break;
+ }
+ }
+ }
+
+ # Get Products : commodities And Write ICM666M
+ $tmpProd = "";
+ $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']: '';
+ $PickerLine = isset($product['PickerLine']) ? $product['PickerLine']: '';
+ $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'] : '';
+ $FrgnUnitPrice = isset($product['FrgnUnitPrice']) ? $product['FrgnUnitPrice'] : '';
+ $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']: '';
+ $PalletQty = 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 = [];
+
+ # Check JSON fields if empty or > DB Fields
+ foreach ($ICM666MFields as $key => $value) {
+ $keyVar = $key;
+ # Sanitize String
+ $$keyVar = Helper::sanityzeString($$keyVar);
+ # Check Var Types & Length
+ $LengthTest = Helper::checkLength($$keyVar, $value[1], $value[2]);
+
+ if (!$LengthTest[413] || !$LengthTest[411] || !$LengthTest[417]) {
+ // Log::error($key .' :: '. $value[0].' :: '. $value[1] .' JSONF: '.$$keyVar .' Type: '.$value[2] );
+ if(!$LengthTest[413]){
+ $message[] = [ 'code'=>'413', 'status'=>'error', 'message'=>'Field: '.$key.' is larger then expected'];
+ }
+ if(!$LengthTest[411]){
+ $message[] = [ 'code'=>'411', 'status'=>'error', 'message'=>'Field: '.$key.' is empty'];
+ }
+ if(!$LengthTest[417]){
+ $message[] = [ 'code'=>'417', 'status'=>'error', 'message'=>'Field: '.$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).' M3-Lis-JSN'.json_encode($jsonFile) ,'SHUSER'=> $REQKPKUS,'SHSOURCE'=> $SHSOURCE,'SHCO'=>$Company,'SHWHS'=>$Warehouse ];
+ Helper::logToICM699M($data);
+
+ return response()->json($message);
+ } else if ($$keyVar != '') {
+ $InsertArray[$value[0]] = $$keyVar;
+ }
+ }
+ // Log::info($InsertArray);
+
+ # 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;
+
+ // if ($PalletQty!='') {
+ // $InsertArray['A1USRN01']=$palletQty;
+ // }
+
+ # SQL Insert to ICM666M
+ $insertSQL = DB::connection(config('m3.connection', 'pgsql'))->table('icm666m')->insert($InsertArray);
+ }
+
+ # Call PGM ICM700CSBM
+ if ($Warehouse!='' && $PickerNumber!='' && $Company!='') {
+ $PGMERRORS = '';
+ $AWREQN = '';
+
+ # connect to toolkit using DB2 credentials (can also leave blank for default authority)
+ try {
+ $conn = app(\Modules\M3\Services\PostgresProgramBridge::class);
+ } catch (Exception $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(array('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 = [];
+ # $params[] = $conn->AddParameterChar('out',7,'eqNumber');
+
+ # 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);
+ // $params[] = $conn->AddParameterZoned('in', 11, 0, 'ParamIn');
+
+ # Start Time Tracking
+ $start = microtime(true);
+
+ # ICM700C EWOBJTST ICM700C ICM700CSBM
+ $result = $conn->PgmCall('ICM700CSBM', env('OBJLIB'), $params, array(), array());
+
+ 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 .' M3-Lis-JSN'.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).' M3-Lis-JSN'.json_encode($jsonFile) ,'SHUSER'=> $REQKPKUS,'SHSOURCE'=> $SHSOURCE,'SHCO'=>$Company,'SHWHS'=>$Warehouse ];
+ Helper::logToICM699M($data);
+
+ // Log::error($th);
+ return response()->json([
+ 'code'=>'405',
+ 'status'=>'error',
+ 'message'=>'An Error Occured...'
+ ]);
+ }
+ }
+
+ public function show($id){}
+
+ public function edit($id){}
+
+ public function update(Request $request, $id){}
+
+ public function destroy($id){}
+}
diff --git a/Modules/M3/Http/Controllers/API/M3InventoryReport.php b/Modules/M3/Http/Controllers/API/M3InventoryReport.php
new file mode 100644
index 00000000..6b74ba0c
--- /dev/null
+++ b/Modules/M3/Http/Controllers/API/M3InventoryReport.php
@@ -0,0 +1,453 @@
+json()->all());
+
+ # Get the Calling User
+ $SHUSER = m3_user() !== '' ? Str::upper(m3_user()) : 'WEBUSER';
+ # Set SHSOURCE
+ $SHSOURCE = 'M3InventoryReport';
+ $M3Errors = '';
+ $DELIVERYNO = isset($DELIVERYNO) ? $DELIVERYNO : '000000';
+
+ try {
+ # Get Json Contents
+ $jsonFile = count($request->json()->all())>0 ? $request->json()->all() : '';
+ if($jsonFile!=''){
+ $WHS = isset($jsonFile["WHS"]) ? $jsonFile["WHS"] : '';
+ $PART = isset($jsonFile["PART"]) ? $jsonFile["PART"] : '';
+ $LOT = isset($jsonFile["LOT"]) ? $jsonFile["LOT"] : '';
+ }
+ else {
+ # code...
+ }
+
+ # 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'=>'000000','SHDT'=> date('Y-m-d'),'SHTIME'=> date('H:i:s') ,'SHERROR'=> '','SHINTBOX'=> '','SHTYPE'=> 'M3-Res-out' ,
+ 'SHDATA'=> $SHDATA ,'SHUSER'=> $SHUSER,'SHSOURCE'=> $SHSOURCE,'SHCO'=>'','SHWHS'=>$WHS];
+ Helper::logToICM699M($data);
+
+ return $tokenResponse;
+ }
+
+ # Call ionapi with Params
+ $endPointURL = env('ENDPOINTURL').'APIFLOWS/Sentinel/M3InventoryReport?ionapiRespStyle=sync';
+ $token = $IonToken;
+ $JSON = [
+ "WHS" => $WHS,
+ "PART"=> $PART,
+ "LOT" => $LOT
+ ];
+
+ $response = Http::withHeaders([
+ 'accept' => 'application/json',
+ 'Content-Type' => 'application/json'
+ ])
+ ->withToken($token)
+ ->timeout(Config::get('arrays.curlTimeOut'))
+ ->post($endPointURL, $JSON);
+ $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);
+ }
+ else{
+ $M3Errors = 'Error: No Response from M3';
+ }
+
+ if ($M3Errors!='') {
+ # 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'=>$responseStatusCode.$M3Errors.$M3SessionId ,'SHUSER'=> $SHUSER,'SHSOURCE'=> $SHSOURCE,'SHCO'=>'','SHWHS'=>$WHS ];
+ Helper::logToICM699M($data);
+
+ # Send Response
+ return response()->json([
+ 'code'=>'405',
+ 'status'=>'error',
+ 'message'=>$M3Errors
+ ]);
+ }
+ else{
+ # 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.$JsonSanytized.'-'.json_encode($JSON).$M3SessionId ,'SHUSER'=> $SHUSER,'SHSOURCE'=> $SHSOURCE,
+ 'SHCO'=>'','SHWHS'=>$WHS];
+ Helper::logToICM699M($data);
+
+ return response()->json([
+ 'code'=>$responseStatusCode,
+ 'status'=>'Success',
+ 'message'=>json_decode($JsonSanytized)
+ ]);
+ }
+ }
+ catch (\Throwable $th) {
+ // Log::error($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'=>'','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
+ $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];
+ Helper::logToICM699M($data);
+
+ return response()->json([
+ 'code'=>'405',
+ 'status'=>'error',
+ 'message'=>'Catched Error: '.$th
+ ]);
+ }
+
+ }
+ }
+ # End M3InventoryReport
+
+ # M3InventoryReportList with URL Params
+ public function M3InventoryReportListURL(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'));
+
+ # Set API Name
+ $SHSOURCE = 'M3InventoryReportListURL';
+ # Get The Calling User
+ $SHUSER = m3_user() !== '' ? Str::upper(m3_user()) : 'WebUser';
+ $M3Errors = '';
+
+ try {
+ # Get Json Contents
+ $urlParams = count($request->all())>0 ? $request->all() : '';
+
+ $REQPKWS = isset($urlParams["REQPKWS"]) ? $urlParams["REQPKWS"] : '';
+ $REQKPKUS = isset($urlParams["REQKPKUS"]) ? $urlParams["REQKPKUS"] : 'WebUser';
+ $CO = isset($urlParams["CO"]) ? $urlParams["CO"] : '';
+ $WHS = isset($urlParams["WHS"]) ? $urlParams["WHS"] : '';
+ $MACPKR = isset($urlParams["MACPKR"]) ? $urlParams["MACPKR"] : '000000'; # Delivery Number
+ $PKLN = isset($urlParams["PKLN"]) ? $urlParams["PKLN"] : '';
+
+ if($urlParams!=''){
+ $IncomingParams = ['CO'=> $CO,'WHS'=> $WHS,'MACPKR'=> $MACPKR,'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);
+
+ # Get Parts And Lots from ICM688M2
+ $ICM688M2SLTMP = DB::connection(config('m3.connection', 'pgsql'))->table('icm688m2')
+ ->select('A5WHS', 'A5PART','A5LOTNUM','A5SENTPKR')
+ ->distinct()
+ ->where('A5CO',$CO)
+ ->where('A5WHS',$WHS)
+ ->where('A5MACPKR',$MACPKR);
+
+ # Get Pack Lines
+ if($PKLN!=''){
+ $ICM688M2SLTMP->where('A5PKLN',$PKLN);
+ }
+ $ICM688M2SL = $ICM688M2SLTMP->get();
+ // dd($ICM688M2SL);
+
+ if( count($ICM688M2SL)>0 ){
+ # Update ICM688M1 : Add Timestamp
+ $ICM688M1TS = now();
+ DB::connection(config('m3.connection', 'pgsql'))->table('icm688m1')
+ ->where('A4MACPKR',$MACPKR)
+ ->update(['A4INRFSHTS'=>$ICM688M1TS]);
+
+ $PICKERARR = [];
+ foreach ($ICM688M2SL as $key => $ICM688M2) {
+ $PART = trim($ICM688M2->A5PART);
+ $LOT = trim($ICM688M2->A5LOTNUM);
+ $PARTS[] = ["PART"=> $PART , "LOT"=>$LOT];
+ $PICKERARR[$PART] = $ICM688M2->A5SENTPKR;
+ }
+ // Log::info($PARTS);
+ // dump($PARTS);
+ $JSON = json_encode( ["WHS" => $WHS,"PARTS"=> $PARTS ] );
+ // Log::info($JSON);
+
+ # 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' => 'application/json',
+ 'Content-Type' => 'application/json'
+ ])
+ ->withToken($token)
+ ->withBody($JSON, 'application/json')
+ ->timeout(Config::get('arrays.curlTimeOut'))
+ ->post($endPointURL);
+
+ $M3SessionId = $response->hasHeader('x-transaction-id') ? "-sessionID:". $response->header('x-transaction-id') : '-sessionID';
+
+ $responseStatusCode = $response->getStatusCode();
+ 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 $key => $value) {
+ // dump($value);
+ $dataToWrite = [];
+
+ foreach ($value as $key2 => $content) {
+ if($key2!='Locations'){
+ $dataToWrite[$key2] = $content;
+ }
+ else{
+ foreach ($content as $key3 => $content2) {
+ //dump($content2);
+ $dataToWrite2[] = array_merge($dataToWrite,$content2);
+ }
+ }
+ }
+ }
+ // LOG::info($dataToWrite2);
+
+ # Delete Old Records from IC630M
+ foreach ($dataToWrite2 as $key => $value) {
+ $ICM630MDeleteSQL = DB::connection(config('m3.connection', 'pgsql'))->table('ic630m')
+ ->where('LLCO',$CO)
+ ->where('LLWHNO',$WHS)
+ ->where('LLPPN',trim($value['PartNumber']))
+ ->delete();
+ }
+
+ foreach ($dataToWrite2 as $key => $value) {
+ # Check if Location exist in DE640M ("LVCO", "WSELOC", "VLOCID")
+ $DE640MSQLSEL = DB::connection(config('m3.connection', 'pgsql'))->table('de640m')
+ ->where('LVCO',$CO)
+ ->where('WSELOC',$value['Warehouse'])
+ ->where('VLOCID',$value['Location'])
+ ->first();
+ // dd($DE640MSQLSEL);
+
+ $LocationExist = isset($DE640MSQLSEL->VLOCID) ? trim($DE640MSQLSEL->VLOCID) : '';
+ $WHExist = isset($DE640MSQLSEL->WSELOC) ? trim($DE640MSQLSEL->WSELOC) : '';
+ $COExist = isset($DE640MSQLSEL->LVCO) ? trim($DE640MSQLSEL->LVCO) : '';
+ // dd($LocationExist .': '.$WHExist.': '.$COExist);
+
+ # if No records Founds insert New Record
+ if ( $LocationExist=='' && $WHExist=='' && $COExist=='' ) {
+ $SQLInsertPrep640M['LVCO'] = $CO; # Company
+ $SQLInsertPrep640M['WSELOC'] = $value['Warehouse'];
+ // $SQLInsertPrep640M['LVDELNO'] = $MACPKR; # M3 Delivery note number DELETED
+ // $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['LLDELNO'] = $MACPKR; # M3 Delivery note number DELETED
+ $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['LLCMDESC'] = $value['Description']; # Description
+ $SQLInsertPrep630M['LLSPR10A01'] = isset($value['Allocation']) ? $value['Allocation'] : ''; # Allocation
+ $SQLInsertPrep630M['LLSPR15A01'] = isset($value['AllocatedTo']) ? $value['AllocatedTo'] : ''; # AllocatedTo
+
+ DB::connection(config('m3.connection', 'pgsql'))->table('ic630m')->insert($SQLInsertPrep630M);
+ }
+ // dump($SQLInsertPrep);
+
+ #Send Response
+ return response()->json([
+ 'code' => '200',
+ 'status' => 'Success'
+ ]);
+ }
+ else{
+ # Write to Logs Out : Error
+ $MACPKR = isset($MACPKR) ? $MACPKR : '000000';
+ $data = ['SHMACPKR'=>$MACPKR,'SHDT'=> date('Y-m-d'),'SHTIME'=> date('H:i:s') ,'SHERROR'=> 'X','SHINTBOX'=> '','SHTYPE'=> 'M3-Res-out' ,
+ 'SHDATA'=>'No Records Found in ICM688M2' ,'SHUSER'=> $REQKPKUS,'SHSOURCE'=> $SHSOURCE,'SHCO'=>$CO,'SHWHS'=>$WHS ];
+ Helper::logToICM699M($data);
+
+ # Return Error
+ return response()->json([
+ 'code' => '405',
+ 'status' => 'Error',
+ 'message'=> 'No Records Found in ICM688M2'
+ ]);
+ }
+
+ }
+ else {
+ # Write to Logs Out : Error
+ $MACPKR = isset($MACPKR) ? $MACPKR : '000000';
+ $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'=> $REQKPKUS,'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 : '000000';
+ $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'=>$th->getMessage().' 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'=> $REQKPKUS,'SHSOURCE'=> $SHSOURCE,'SHCO'=>$CO,'SHWHS'=>$WHS];
+ Helper::logToICM699M($data);
+
+ Log::error($th);
+ return response()->json([
+ 'code'=>'405',
+ 'status'=>'error',
+ 'message'=>'Catched Error: '.$th
+ ]);
+ }
+ }
+ }
+ # End M3InventoryReportListURL
+}
diff --git a/Modules/M3/Http/Controllers/API/PdfStorage.php b/Modules/M3/Http/Controllers/API/PdfStorage.php
new file mode 100644
index 00000000..c2167ced
--- /dev/null
+++ b/Modules/M3/Http/Controllers/API/PdfStorage.php
@@ -0,0 +1,166 @@
+all());
+ # Get the Calling User
+ $SHUSER = m3_user() !== '' ? Str::upper(m3_user()) : 'WebUser';
+ $SHSOURCE = 'PdfStorageAPI';
+ # PDF File PATH
+ $pdfFilePath = Config::get('arrays.PdfPath');
+ try {
+ # Get URL PARAMS
+ $urlParams = count($request->all())>0 ? $request->all() : '';
+ // dd($urlParams);
+
+ $COMPANY = isset($urlParams["COMPANY"]) ? trim($urlParams["COMPANY"]) : ''; # Company
+ $WHS = isset($urlParams["WHS"]) ? trim($urlParams["WHS"]) : ''; # WareHouse
+ $DOCTYPE = isset($urlParams["DOCTYPE"]) ? trim($urlParams["DOCTYPE"]) : ''; # document type (PackingList, CarrierLabel, ContentLabel)
+ $FILENAME = isset($urlParams["FILENAME"]) ? trim($urlParams["FILENAME"]) : ''; # PDF File name
+ $DOCNUM = isset($urlParams["DOCNUM"]) ? trim($urlParams["DOCNUM"]) : ''; # document number (ie the internal box number, the pick list number)
+ $A4MACPKR = isset($urlParams["A4MACPKR"]) ? trim($urlParams["A4MACPKR"]) : ''; # Delivery note number
+
+ if($urlParams!=''){
+ # Key Combination : COMPANY WHS A4MACPKR DOCTYPE DOCNUM
+ # Document type (PackingList, CarrierLabel, ContentLabel)
+ $DELIVERYNO = isset($A4MACPKR) ? $A4MACPKR : '000000';
+ $DELIVERYNO = $DELIVERYNO!="" && $DELIVERYNO!=null ? $DELIVERYNO : '000000';
+ # Write to Logs : Params In
+ $IncomingParams = ['COMPANY'=> $COMPANY,'WHS'=> $WHS,'DOCTYPE'=> $DOCTYPE,'FILENAME'=> $FILENAME,'A4MACPKR'=> $A4MACPKR,'DOCNUM' => $DOCNUM];
+ $data = ['SHMACPKR'=>$DELIVERYNO,'SHDT'=> date('Y-m-d'),'SHTIME'=> date('H:i:s') ,'SHERROR'=> '','SHINTBOX'=> $DOCNUM,'SHTYPE'=> 'M3-Req-out' ,
+ 'SHDATA'=>json_encode($IncomingParams) ,'SHUSER'=> $SHUSER,'SHSOURCE'=> $SHSOURCE,'SHCO'=>$COMPANY,'SHWHS'=>$WHS ];
+ Helper::logToICM699M($data);
+
+ # Make Key and Test Validity
+ if ($A4MACPKR!='' && $DOCTYPE!='' && $DOCNUM!='' && $COMPANY!='' && $WHS!=''){
+ $cacheKey = $A4MACPKR.$DOCTYPE.$DOCNUM.$COMPANY.$WHS;
+ }
+ else{
+ $cacheKey ='';
+ }
+
+ # Read PDF File and Encode to Base64
+ $pdfFileName = $pdfFilePath.$FILENAME.'.pdf';
+ // dd($pdfFileName);
+ // dd(File::exists($pdfFileName));
+ if (File::exists($pdfFileName) && $cacheKey!='') {
+ // dd(File::exists($pdfFileName));
+
+ // Parse PDF file and build necessary objects.
+ $parser = new \Smalot\PdfParser\Parser();
+
+ // $pdf = $parser->parseFile('/www/sentm3test/htdocs/labels/E1232824-10826596.pdf');
+ // dump($pdf);
+ // $text = $pdf->getText();
+ // dump("Text Only");
+ // dump($text);
+
+ $pdfFile = File::get($pdfFileName);
+
+ // Transform content to base64
+ $base64PDF = base64_encode($pdfFile);
+ // Output base64 string
+ // dump($base64PDF);
+
+ # Save Cache
+ Cache::forever($cacheKey, $base64PDF);
+ // Cache::put($cacheKey, $base64PDF, now()->addMinutes(60));
+
+ # Retrieve Cache
+ // $cachedPdfFile = Cache::get($cacheKey);
+ // dump("Retrieve Base64 Encoded PDF saved in Cache:");
+ // dump($cachedPdfFile);
+ // $pdfData = substr($cachedPdfFile,0,50);
+ # remove File from Cache
+ // Cache::put(pdfFileName, 'value', -5);
+ // Cache::forget($pdfFileName);
+
+ # Base64 Decode and Display
+ // $pdf = $parser->parseContent(base64_decode($base64PDF));
+ // $text = $pdf->getText();
+ // dump($text);
+
+ # Write to Logs Out : Success
+ $data = ['SHMACPKR'=>$DELIVERYNO,'SHDT'=> date('Y-m-d'),'SHTIME'=> date('H:i:s') ,'SHERROR'=> '','SHINTBOX'=> $DOCNUM,'SHTYPE'=> 'M3-Res-out' ,
+ 'SHDATA'=>'PDF File converted to Base64 and Saved to Cache.Key: '.$cacheKey,'SHUSER'=> $SHUSER,'SHSOURCE'=> $SHSOURCE,'SHCO'=>$COMPANY,'SHWHS'=>$WHS];
+ // dd($data);
+ Helper::logToICM699M($data);
+
+ return response()->json([
+ 'code' => '200',
+ 'status' => 'Success',
+ 'cacheKey'=> $cacheKey
+ // 'PDFData' => $pdfData
+ ]);
+ }
+ else {
+ $SHDATA = File::exists($pdfFileName) ? '' : 'PDF File Not Found-';
+ $SHDATA = $cacheKey!='' ? $SHDATA.'' : $SHDATA.'Cache Key is missing Params';
+
+ # Write to Logs Out : Error
+ $data = ['SHMACPKR'=>$DELIVERYNO,'SHDT'=> date('Y-m-d'),'SHTIME'=> date('H:i:s') ,'SHERROR'=> 'X','SHINTBOX'=> $DOCNUM,'SHTYPE'=> 'M3-Res-out' ,
+ 'SHDATA'=>'An Error Occured -'.$SHDATA,'SHUSER'=> $SHUSER,'SHSOURCE'=> $SHSOURCE,'SHCO'=>$COMPANY,'SHWHS'=>$WHS];
+ Helper::logToICM699M($data);
+
+ # Return Error
+ return response()->json([
+ 'code' => '405',
+ 'status' => 'Error',
+ 'message'=> $SHDATA
+ ]);
+ }
+ }
+ else {
+ # Write to Logs Out : Error
+ $DELIVERYNO = isset($DELIVERYNO) ? $DELIVERYNO : '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);
+
+ # Write to Logs Out : Error
+ $DELIVERYNO = isset($DELIVERYNO) ? $DELIVERYNO : '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);
+
+ return response()->json([
+ 'code'=>'405',
+ 'status'=>'error',
+ 'message'=>'Catched Error: '.$th
+ ]);
+ }
+ }
+ # End PdfStorageAPI
+}
diff --git a/Modules/M3/Http/Controllers/API/ReplenAPI.php b/Modules/M3/Http/Controllers/API/ReplenAPI.php
new file mode 100644
index 00000000..c2bc2eb5
--- /dev/null
+++ b/Modules/M3/Http/Controllers/API/ReplenAPI.php
@@ -0,0 +1,294 @@
+all());
+ // Log::info( $request->all() );
+ # Get The Calling User
+ $SHUSER = m3_user() !== '' ? Str::upper(m3_user()) : 'WebUser';
+ $MACPKR = isset($MACPKR) ? $MACPKR : '000000';
+ $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 $key => $value){
+ $PARTS[] = ["PART"=> $value,"LOT"=>""];
+ }
+ // dump($PARTS);
+
+ $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();
+ // dd($IonToken->code);
+ 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' => 'application/json',
+ 'Content-Type' => 'application/json'
+ ])
+ ->withToken($token)
+ ->withBody($JSON, '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';
+
+ if ($responseStatusCode =='200') {
+ # Check M3 Response for Errors
+ $M3Errors = '';
+ $responseJSON = $response->getBody()->getContents();
+ $JsonSanytized = Helper::sanityzeString($responseJSON);
+ # Array
+ $responseArray = json_decode($JsonSanytized,true);
+ // LOG::info( $responseArray);
+ $responseTMP = $responseArray['result'];
+ // LOG::info($responseTMP);
+ }
+ 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 $key => $value) {
+ // dump($value);
+ $dataToWrite = [];
+
+ foreach ($value as $key2 => $content) {
+ if($key2!='Locations'){
+ $dataToWrite[$key2] = $content;
+ }
+ else{
+ foreach ($content as $key3 => $content2) {
+ //dump($content2);
+ $dataToWrite2[] = array_merge($dataToWrite,$content2);
+ }
+ }
+ }
+ }
+ // LOG::info($dataToWrite2);
+
+ # Delete Old Records from IC630M
+ foreach ($dataToWrite2 as $key => $value) {
+ $ICM630MDeleteSQL = DB::connection(config('m3.connection', 'pgsql'))->table('ic630m')
+ ->where('LLCO',$CO)
+ ->where('LLWHNO',$WHS)
+ ->where('LLPPN',trim($value['PartNumber']))
+ ->delete();
+ }
+
+ foreach ($dataToWrite2 as $key => $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();
+ // dd($DE640MSQLSEL);
+
+ $LocationExist = isset($DE640MSQLSEL->VLOCID) ? trim($DE640MSQLSEL->VLOCID) : '';
+ $WHExist = isset($DE640MSQLSEL->WSELOC) ? trim($DE640MSQLSEL->WSELOC) : '';
+ $COExist = isset($DE640MSQLSEL->LVCO) ? trim($DE640MSQLSEL->LVCO) : '';
+ // dd($LocationExist .': '.$WHExist.': '.$COExist);
+
+ # 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);
+ }
+ // dump($SQLInsertPrep);
+
+ #Send Response
+ return response()->json([
+ 'code' => '200',
+ 'status' => 'Success'
+ ]);
+ }
+ else {
+ # Write to Logs Out : Error
+ $MACPKR = isset($MACPKR) ? $MACPKR : '000000';
+ $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 : '000000';
+
+ $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);
+
+ // Log::error($th);
+ return response()->json([
+ 'code'=>'405',
+ 'status'=>'error',
+ 'message'=>'Catched Error: '.$th
+ ]);
+ }
+ }
+ }
+ # End M3InventoryReportReplen
+}
diff --git a/Modules/M3/Http/Controllers/API/TransferAPI.php b/Modules/M3/Http/Controllers/API/TransferAPI.php
new file mode 100644
index 00000000..939ad616
--- /dev/null
+++ b/Modules/M3/Http/Controllers/API/TransferAPI.php
@@ -0,0 +1,712 @@
+all());
+
+ # 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"] : '000000';
+ $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 : '000000';
+
+ $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();
+ // dump($ICM699MS->SHDATA);
+
+ # 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));
+ } else if ($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);
+ // dd($SHDATAJSON);
+
+ $JSONTR = $SHDATAJSON != '' ? json_decode($SHDATAJSON) : '';
+ // dd($JSONTR);
+
+ 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 : '000000';
+ $PICKLISTSUFFIX = isset($JSONTR->PICKLISTSUFFIX) ? $JSONTR->PICKLISTSUFFIX : '';
+ $ENDFLAG = isset($JSONTR->ENDFLAG) ? $JSONTR->ENDFLAG : '';
+ $TYPE = isset($JSONTR->TYPE) ? $JSONTR->TYPE : '';
+ $COLINESUFFIX = isset($JSONTR->COLINESUFFIX) ? $JSONTR->COLINESUFFIX : '';
+ }
+ // dd($JSONTR);
+
+ # Set SHERROR to Z in ICM699M
+ $ICM699MU = 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();
+ // dd($ICM688M2SL->A5BRADLN);
+
+ $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);
+ // dd($JSON);
+
+ # 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' => 'application/json',
+ 'Content-Type' => 'application/json'
+ ])
+ ->withToken($token)
+ ->withBody($JSON, 'application/json')
+ ->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; //$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);
+
+ 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 . ' Order Category: ' . $ORDERCATEGORY . '-' . $M3JSONResponse . $M3SessionId . $M3ResponseTime . $M3transferTime,
+ 'SHUSER' => $SHUSER,
+ 'SHSOURCE' => $SHSOURCE,
+ 'SHCO' => $DIVI,
+ 'SHWHS' => $WHS
+ ];
+ Helper::logToICM699M($data);
+
+ # Log to ICM799M
+ $ICM799MINS = 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 . ' Order Category: ' . $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 . ' Order Category: ' . $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 : '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' => $DIVI,
+ '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) {
+ # 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 : '000000';
+ $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'));
+ // dd($request->all());
+
+ # 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"] : '';
+ // dump($urlParams);
+
+ try {
+ if ($urlParams != '') {
+ $A4SPR15A01 = isset($urlParams["A4SPR15A01"]) ? $urlParams["A4SPR15A01"] : '';
+ $DELIVERYNO = isset($urlParams["DELIVERYNO"]) ? $urlParams["DELIVERYNO"] : '';
+ $TYPE = 'UpdateShipmentNumber';
+ $allMacpkrs = [];
+ // dd($A4SPR15A01);
+
+ 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 $key => $ICM688M1) {
+ $allMacpkrs[] = $ICM688M1->A4MACPKR;
+ }
+ }
+
+ # A4SPR15A01 Exists : proceed
+ if ($A4SPR15A01 != '' && count($allMacpkrs)>0) {
+ $JSON = json_encode([
+ "DIVI" => $DIVI,
+ "WHS" => $WHS,
+ "ShipmentNumber" => [
+ "Number" => $A4SPR15A01,
+ "DeliveryNumbers" => $allMacpkrs
+ ],
+ "TYPE" => $TYPE,
+ "ENDFLAG" => "",
+
+ ], JSON_UNESCAPED_SLASHES);
+ // dd($JSON);
+
+ # 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' => 'application/json',
+ 'Content-Type' => 'application/json'
+ ])
+ ->withToken($token)
+ ->withBody($JSON, 'application/json')
+ ->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; //$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 : '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' => $DIVI,
+ '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) {
+ # 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 : '000000';
+ $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
+
+}
diff --git a/Modules/M3/Http/Controllers/API/TwoShipAPIs.php b/Modules/M3/Http/Controllers/API/TwoShipAPIs.php
new file mode 100644
index 00000000..e9fbec77
--- /dev/null
+++ b/Modules/M3/Http/Controllers/API/TwoShipAPIs.php
@@ -0,0 +1,288 @@
+all());
+
+ // Log::info( $request->all() );
+ # Get The Calling User
+ $SHUSER = m3_user() !== '' ? Str::upper(m3_user()) : 'WebUser';
+
+ $SHSOURCE = 'TwoShipUpdateHold';
+ $TwoShipErrors = '';
+
+ $urlParams = count($request->all()) > 0 ? $request->all() : '';
+ $WHS = isset($urlParams["WHS"]) ? $urlParams["WHS"] : '';
+ $CO = isset($urlParams["COMPANY"]) ? $urlParams["COMPANY"] : '';
+ $MACPKR = isset($urlParams["MACPKR"]) ? $urlParams["MACPKR"] : '';
+
+ try {
+ if ($urlParams != '') {
+ $IncomingParams = ['CO' => $CO, 'WHS' => $WHS, 'MACPKR' => $MACPKR];
+ $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' => 'AggStopReq',
+ 'SHDATA' => $IncomingParams,
+ 'SHUSER' => $SHUSER,
+ 'SHSOURCE' => $SHSOURCE,
+ 'SHCO' => $CO,
+ 'SHWHS' => $WHS
+ ];
+ Helper::logToICM699M($data);
+
+ # First Step : Get MACPKRs list if available
+ # select a4macpkr from icm688m1 where a4shpaggcd in (select a4shpaggcd from icm688m1 where a4macpkr=233709) and a4shpaggcd<>0 and a4concmplt<>'y' and a4co=410 and a4whs=111
+ $A4MACPKRSel = DB::connection(config('m3.connection', 'pgsql'))->select(
+ "select a4macpkr from icm688m1 where a4shpaggcd in (select a4shpaggcd from icm688m1 where a4macpkr={$MACPKR})
+ and a4shpaggcd<>0 and a4concmplt<>'y' and a4co='{$CO}' and a4whs='{$WHS}' "
+ );
+ // dd($A4MACPKRSel);
+
+ if (count($A4MACPKRSel)>0){
+ foreach ($A4MACPKRSel as $key => $A4MACPKRR) {
+ $A4MACPKRArr[] = $A4MACPKRR->A4MACPKR;
+ }
+ }
+ else{
+ $A4MACPKRArr[] = $MACPKR;
+ }
+
+ // dump($A4MACPKRArr);
+
+ # Call 2ship API with Params
+ $WS_key = Config::get('arrays.2Ship.TwoShip_Key');
+ $end_point = Config::get('arrays.2Ship.end_point');
+ $API = Config::get('arrays.2Ship.hold_update');
+
+ $ShipOnHoldOrder_url = $end_point . $API;
+
+ # Build Json Data
+ $data = [
+ 'WS_Key' => $WS_key,
+ 'OrderNumbers' => [implode(',', $A4MACPKRArr)],
+ // 'ShipmentId' => 3,
+ 'FindBy' => 'ByMultipleOrderNumbers',
+ 'DataToBeUpdated' => [
+ 'UpdateAggregationSettings' => true,
+ 'OrderAggregationSettingsInfo' => [
+ 'NotConsideredAggregation' => true,
+ ],
+ ],
+ ];
+
+ $json_string = json_encode($data);
+
+ // dump($json_string);
+
+ #######
+ # Initialise the cURL var
+ $ch = curl_init();
+
+ # Get the response from cURL
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
+
+ curl_setopt($ch, CURLOPT_URL, $ShipOnHoldOrder_url);
+ curl_setopt($ch, CURLOPT_VERBOSE, false);
+
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
+ #When CURLOPT_SSL_VERIFYPEER is enabled (value=1), and the verification fails to prove that the certificate is authentic, the connection fails.
+ #When the option is zero, the peer certificate verification succeeds regardless.
+
+ curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
+ #When CURLOPT_SSL_VERIFYHOST is 2, that certificate must indicate that the server is the server to which you meant to connect,
+ #or the connection fails. Simply put, it means it has to have the same name in the certificate as is in the URL you operate against.
+
+ # Set data content type
+ curl_setopt(
+ $ch,
+ CURLOPT_HTTPHEADER,
+ array(
+ 'Content-Type: application/json',
+ 'Content-Length: ' . strlen($json_string)
+ )
+ );
+
+ # Post data
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $json_string);
+
+ # Set timeout
+ curl_setopt($ch, CURLOPT_TIMEOUT, Config::get('arrays.PHPTimeOut'));
+ curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, Config::get('arrays.PHPTimeOut'));
+
+ # if set true, cURL will follow redirects
+ curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
+
+ # Execute the request
+ $response = curl_exec($ch);
+
+ # Verifying error
+ $info = curl_getinfo($ch);
+
+ # Get status
+ $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+
+ # Output the error code
+ # $CurlError= curl_error($ch);
+ $CurlError = str_replace("'", " ", curl_error($ch));
+
+ # Close the session
+ unset($ch);
+
+ // dump($response);
+ // dump($status);
+ // dump($CurlError);
+
+ if ($status == '200' && $CurlError=='') {
+ $responseJSON = json_decode($response);
+ // dump($responseJSON);
+ if($responseJSON->Success==false){
+ $TwoShipErrors = '2Ship Error: '.$responseJSON->GlobalError;
+ }
+ } else {
+ $TwoShipErrors = 'Error: No Response from 2Ship';
+ $TwoShipErrors .= ' -Curl Error: '.$CurlError;
+ }
+
+ # Validate response From 2Ship
+ # Error
+ if ($TwoShipErrors != '') {
+ // dump($TwoShipErrors);
+
+ # Write to Logs : Error
+ $data = ['SHMACPKR' => $MACPKR,
+ 'SHDT' => date('Y-m-d'),
+ 'SHTIME' => date('H:i:s'),
+ 'SHERROR' => 'X',
+ 'SHINTBOX' => '',
+ 'SHTYPE' => 'AggStopRsp',
+ 'SHDATA' => $status . '-' . $TwoShipErrors,
+ 'SHUSER' => $SHUSER,
+ 'SHSOURCE' => $SHSOURCE,
+ 'SHCO' => $CO,
+ 'SHWHS' => $WHS
+ ];
+ Helper::logToICM699M($data);
+
+ # Send Response
+ return response()->json([
+ 'code' => '405',
+ 'status' => 'error',
+ 'message' => 'Status: '.$status . '-' . $TwoShipErrors
+ ]);
+ }
+ # Success
+ else{
+ # Write to Logs : JSON
+ $data = ['SHMACPKR' => $MACPKR,
+ 'SHDT' => date('Y-m-d'),
+ 'SHTIME' => date('H:i:s'),
+ 'SHERROR' => '',
+ 'SHINTBOX' => '',
+ 'SHTYPE' => 'AggStopRsp',
+ 'SHDATA' => $response,
+ 'SHUSER' => $SHUSER,
+ 'SHSOURCE' => $SHSOURCE,
+ 'SHCO' => $CO,
+ 'SHWHS' => $WHS
+ ];
+ Helper::logToICM699M($data);
+
+ # Update ICM688M1 set a4concmplt to 'y'
+ DB::connection(config('m3.connection', 'pgsql'))->table('icm688m1')
+ ->whereIn('A4MACPKR',$A4MACPKRArr)
+ ->where('A4CO',$CO)
+ ->where('A4WHS',$WHS)
+ ->update(['A4CONCMPLT'=>'Y']);
+
+ }
+ # Send Response
+ return response()->json([
+ 'code' => '200',
+ 'status' => 'Success'
+ ]);
+ }
+ # Error : No URL params
+ else {
+ # Write to Logs Out : Error
+ $MACPKR = isset($MACPKR) ? $MACPKR : '000000';
+ $data = ['SHMACPKR' => $MACPKR,
+ 'SHDT' => date('Y-m-d'),
+ 'SHTIME' => date('H:i:s'),
+ 'SHERROR' => 'X',
+ 'SHINTBOX' => '',
+ 'SHTYPE' => 'AggStopRsp',
+ '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
+ $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' => 'AggStopRsp',
+ 'SHDATA' => 'Curl Error: Communication with 2Ship Timed Out' . ' 2Ship-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 2Ship Timed Out.'
+ ]);
+ }
+ }
+ }
+ # End TwoShipUpdateHold
+}
diff --git a/Modules/M3/Http/Controllers/BoxPackToPalletController.php b/Modules/M3/Http/Controllers/BoxPackToPalletController.php
new file mode 100644
index 00000000..59852e49
--- /dev/null
+++ b/Modules/M3/Http/Controllers/BoxPackToPalletController.php
@@ -0,0 +1,314 @@
+R659PALT ?? abort(404, 'Manifest Not Found');
+
+ $userWhsCoPlant = self::getUserWhsCoPlant();
+ // dump($userWhsCoPlant);
+
+ $boxes = DB::connection(config('m3.connection', 'pgsql'))->table('ICM659M as p')
+ ->select(
+ 'p.R659PALT',
+ 'p.R659BOX',
+ 'p.R659LOADED',
+ 'p.R659USER',
+ 'p.R659DATE',
+ 'p.R659TIME',
+ 'c.AYMACPKR',
+ 'c.AYSPR15A01',
+ 'cv.A4APR8N001',
+ 'cv.A4SHSHCT',
+ 'cnv.R652SORTK as CONVEYOR_NAME'
+ )
+ ->leftJoin('ICM695M1 as c', 'p.R659BOX', '=', 'c.AYINTBOX')
+ ->leftJoin('ICM688M1 as cv', 'c.AYMACPKR', '=', 'cv.A4MACPKR')
+ ->leftJoin('ICM652M as cnv', 'cv.A4APR8N001', '=', 'cnv.R652SEQ')
+ ->where('p.R659PALT', $R659PALT)
+ ->where('p.R659CO', trim($userWhsCoPlant["USERCO"]))
+ ->where('p.R659WHS', trim($userWhsCoPlant["USERWHS"]))
+ ->where('p.R659PLANT', trim($userWhsCoPlant["USERPL"]))
+ ->orderBy('p.R659DATE', 'desc')
+ ->orderBy('p.R659TIME', 'desc')
+ ->distinct()
+ ->get()
+ ->unique('R659BOX')
+ ->values();
+ // dump($boxes);
+
+ if ($request->ajax()) {
+ return response()->json([
+ 'success' => true,
+ 'data' => $boxes,
+ ]);
+ }
+
+ $palletHeader = $boxes->first();
+ // dump($boxes);
+
+ return view('m3::liberty-theme.pages.BoxPackToPalletScan', compact('boxes', 'palletHeader', 'R659PALT'));
+ }
+
+ # Scan Boxes
+ public static function scanBoxes(Request $request)
+ {
+ $R659PALT = $request->R659PALT ?? abort(400, 'Pallet Not Found');
+ $R659BOX = trim($request->R659BOX) ?? abort(400, 'Box Not Found');
+ $SHUSER = m3_user() !== '' ? Str::upper(m3_user()) : 'WebUser';
+ $userWhsCoPlant = self::getUserWhsCoPlant();
+
+ $boxMessage = '';
+
+ # Step 1: Check for duplicate — same pallet + box combo
+ $exists = DB::connection(config('m3.connection', 'pgsql'))
+ ->table('icm659m')
+ ->select('R659PALT')
+ ->where('R659PALT', $R659PALT)
+ ->where('R659BOX', $R659BOX)
+ ->where('R659CO', trim($userWhsCoPlant["USERCO"]))
+ ->where('R659WHS', trim($userWhsCoPlant["USERWHS"]))
+ ->where('R659PLANT', trim($userWhsCoPlant["USERPL"]))
+ ->first();
+
+ if ($exists) {
+ $boxMessage = "• Box {$R659BOX} is already assigned to Pallet {$exists->R659PALT}.";
+ }
+
+ # Step 2: Check if Box exists in ICM695M1 (with carrier + conveyor joined)
+ $ICM695M1Sel = DB::connection(config('m3.connection', 'pgsql'))
+ ->table('ICM695M1 as c')
+ ->select(
+ 'c.AYINTBOX',
+ 'c.AYSPR15A01',
+ 'c.AYTYPE',
+ 'c.AYMACPKR',
+ 'cv.A4APR8N001',
+ 'cnv.R652SORTK as CONVEYOR_NAME'
+ )
+ ->leftJoin('ICM688M1 as cv', 'c.AYMACPKR', '=', 'cv.A4MACPKR')
+ ->leftJoin('ICM652M as cnv', 'cv.A4APR8N001', '=', 'cnv.R652SEQ')
+ ->where('c.AYINTBOX', $R659BOX)
+ ->where('c.AYCO', trim($userWhsCoPlant["USERCO"]))
+ ->where('c.AYWHS', trim($userWhsCoPlant["USERWHS"]))
+ ->where('c.AYPLANT', trim($userWhsCoPlant["USERPL"]))
+ ->first();
+
+ $boxExistInICM695M = isset($ICM695M1Sel->AYINTBOX);
+ $boxisPalletICM695M = isset($ICM695M1Sel->AYTYPE) && $ICM695M1Sel->AYTYPE != 'BX';
+
+ if (!$boxExistInICM695M) {
+ $br = $boxMessage == '' ? '' : '
';
+ $boxMessage .= $br . "• Box {$R659BOX} does not exist in ICM695M1 or it belongs to another Company.";
+ }
+
+ if ($boxExistInICM695M && $boxisPalletICM695M) {
+ $br = $boxMessage == '' ? '' : '
';
+ $boxMessage .= $br . "• Scanned barcode {$R659BOX} is not a Box.";
+ }
+
+ # Step 3: Check that all boxes on the pallet share the same Carrier and Conveyor
+ if ($boxExistInICM695M && !$boxisPalletICM695M && !$exists) {
+ $firstPalletBox = DB::connection(config('m3.connection', 'pgsql'))
+ ->table('ICM659M as p')
+ ->select(
+ 'c.AYSPR15A01',
+ 'cnv.R652SORTK as CONVEYOR_NAME'
+ )
+ ->leftJoin('ICM695M1 as c', 'p.R659BOX', '=', 'c.AYINTBOX')
+ ->leftJoin('ICM688M1 as cv', 'c.AYMACPKR', '=', 'cv.A4MACPKR')
+ ->leftJoin('ICM652M as cnv', 'cv.A4APR8N001', '=', 'cnv.R652SEQ')
+ ->where('p.R659PALT', $R659PALT)
+ ->where('p.R659CO', trim($userWhsCoPlant["USERCO"]))
+ ->where('p.R659WHS', trim($userWhsCoPlant["USERWHS"]))
+ ->where('p.R659PLANT', trim($userWhsCoPlant["USERPL"]))
+ ->first();
+
+ if ($firstPalletBox) {
+ $incomingCarrier = trim($ICM695M1Sel->AYSPR15A01 ?? '');
+ $incomingConveyor = trim($ICM695M1Sel->CONVEYOR_NAME ?? '');
+ $palletCarrier = trim($firstPalletBox->AYSPR15A01 ?? '');
+ $palletConveyor = trim($firstPalletBox->CONVEYOR_NAME ?? '');
+
+ if ($incomingCarrier !== $palletCarrier) {
+ $br = $boxMessage == '' ? '' : '
';
+ $boxMessage .= $br . "• Box {$R659BOX} has a different Carrier ({$incomingCarrier}) than the boxes already on Pallet {$R659PALT} ({$palletCarrier}).";
+ }
+
+ if ($incomingConveyor !== $palletConveyor) {
+ $br = $boxMessage == '' ? '' : '
';
+ $boxMessage .= $br . "• Box {$R659BOX} has a different Conveyor ({$incomingConveyor}) than the boxes already on Pallet {$R659PALT} ({$palletConveyor}).";
+ }
+ }
+ }
+
+ if ($exists || !$boxExistInICM695M || $boxisPalletICM695M || $boxMessage !== '') {
+ return response()->json([
+ 'success' => false,
+ 'message' => $boxMessage,
+ ], 409);
+ }
+
+ # Step 4: Insert new box record
+ DB::connection(config('m3.connection', 'pgsql'))
+ ->table('icm659m')
+ ->insert([
+ 'R659PALT' => $R659PALT,
+ 'R659BOX' => $R659BOX,
+ 'R659LOADED' => '',
+ 'R659USER' => $SHUSER,
+ 'R659DATE' => date('Y-m-d'),
+ 'R659TIME' => date('H:i:s'),
+ 'R659CO' => trim($userWhsCoPlant["USERCO"]),
+ 'R659WHS' => trim($userWhsCoPlant["USERWHS"]),
+ 'R659PLANT' => trim($userWhsCoPlant["USERPL"]),
+ ]);
+
+ # Step 5: Return the full refreshed box list
+ $boxes = DB::connection(config('m3.connection', 'pgsql'))->table('ICM659M as p')
+ ->select(
+ 'p.R659PALT',
+ 'p.R659BOX',
+ 'p.R659LOADED',
+ 'p.R659USER',
+ 'p.R659DATE',
+ 'p.R659TIME',
+ 'c.AYMACPKR',
+ 'c.AYSPR15A01',
+ 'cv.A4APR8N001',
+ 'cv.A4SHSHCT',
+ 'cnv.R652SORTK as CONVEYOR_NAME'
+ )
+ ->leftJoin('ICM695M1 as c', 'p.R659BOX', '=', 'c.AYINTBOX')
+ ->leftJoin('ICM688M1 as cv', 'c.AYMACPKR', '=', 'cv.A4MACPKR')
+ ->leftJoin('ICM652M as cnv', 'cv.A4APR8N001', '=', 'cnv.R652SEQ')
+ ->where('p.R659PALT', $R659PALT)
+ ->where('p.R659CO', trim($userWhsCoPlant["USERCO"]))
+ ->where('p.R659WHS', trim($userWhsCoPlant["USERWHS"]))
+ ->where('p.R659PLANT', trim($userWhsCoPlant["USERPL"]))
+ ->orderBy('p.R659DATE', 'desc')
+ ->orderBy('p.R659TIME', 'desc')
+ ->distinct()
+ ->get()
+ ->unique('R659BOX')
+ ->values();
+
+ return response()->json([
+ 'success' => true,
+ 'message' => "• Box {$R659BOX} added to Pallet {$R659PALT}.",
+ 'data' => $boxes,
+ ]);
+ }
+
+ # Delete Box
+ public static function deleteBox(Request $request)
+ {
+ $R659PALT = $request->R659PALT ?? abort(400, 'Pallet Not Found');
+ $R659BOX = trim($request->R659BOX) ?? abort(400, 'Box Not Found');
+
+ $userWhsCoPlant = self::getUserWhsCoPlant();
+
+ # Guard: only allow delete if R659LOADED is empty
+ $record = DB::connection(config('m3.connection', 'pgsql'))
+ ->table('icm659m')
+ ->where('R659PALT', $R659PALT)
+ ->where('R659BOX', $R659BOX)
+ ->first();
+
+ if (!$record) {
+ return response()->json([
+ 'success' => false,
+ 'message' => "Box {$R659BOX} not found on Pallet {$R659PALT}.",
+ ], 404);
+ }
+
+ if (!empty(trim($record->R659LOADED))) {
+ return response()->json([
+ 'success' => false,
+ 'message' => "Box {$R659BOX} is already loaded and cannot be removed.",
+ ], 403);
+ }
+
+ DB::connection(config('m3.connection', 'pgsql'))
+ ->table('icm659m')
+ ->where('R659PALT', $R659PALT)
+ ->where('R659BOX', $R659BOX)
+ ->delete();
+
+ # Return refreshed list
+ $boxes = DB::connection(config('m3.connection', 'pgsql'))->table('ICM659M as p')
+ ->select(
+ 'p.R659PALT',
+ 'p.R659BOX',
+ 'p.R659LOADED',
+ 'p.R659USER',
+ 'p.R659DATE',
+ 'p.R659TIME',
+ 'c.AYMACPKR',
+ 'c.AYSPR15A01',
+ 'cv.A4APR8N001',
+ 'cv.A4SHSHCT',
+ 'cnv.R652SORTK as CONVEYOR_NAME'
+ )
+ ->leftJoin('ICM695M1 as c', 'p.R659BOX', '=', 'c.AYINTBOX')
+ ->leftJoin('ICM688M1 as cv', 'c.AYMACPKR', '=', 'cv.A4MACPKR')
+ ->leftJoin('ICM652M as cnv', 'cv.A4APR8N001', '=', 'cnv.R652SEQ')
+ ->where('p.R659PALT', $R659PALT)
+ ->where('p.R659CO', trim($userWhsCoPlant["USERCO"]))
+ ->where('p.R659WHS', trim($userWhsCoPlant["USERWHS"]))
+ ->where('p.R659PLANT', trim($userWhsCoPlant["USERPL"]))
+ ->orderBy('p.R659DATE', 'desc')
+ ->orderBy('p.R659TIME', 'desc')
+ ->distinct()
+ ->get()
+ ->unique('R659BOX')
+ ->values();
+
+ return response()->json([
+ 'success' => true,
+ 'message' => "Box {$R659BOX} removed from Pallet {$R659PALT}.",
+ 'data' => $boxes,
+ ]);
+ }
+
+ # Get Logged User CO/WHS/PLANT
+ public static function getUserWhsCoPlant()
+ {
+ $SHUSER = m3_user() !== '' ? Str::upper(trim(m3_user())) : '';
+ # Get users from ICM428M
+ $ICM428M = DB::connection(config('m3.connection', 'pgsql'))->table('icm428m')
+ ->select('R428US', 'R428CO', 'R428WH', 'R428PL')
+ ->where('R428US', '=', $SHUSER)
+ ->first();
+
+ $R428US = isset($ICM428M->R428US) ? $ICM428M->R428US : '';
+ $USERCO = isset($ICM428M->R428CO) ? $ICM428M->R428CO : '';
+ $USERWH = isset($ICM428M->R428WH) ? $ICM428M->R428WH : '';
+ $R428PL = isset($ICM428M->R428PL) ? $ICM428M->R428PL : '';
+
+ $userWhsCoPlant = [
+ "R428US" => $R428US,
+ "USERCO" => $USERCO,
+ "USERWHS" => $USERWH,
+ "USERPL" => $R428PL,
+ ];
+ return $userWhsCoPlant;
+ }
+}
diff --git a/Modules/M3/Http/Controllers/Controller.php b/Modules/M3/Http/Controllers/Controller.php
new file mode 100644
index 00000000..3abac69b
--- /dev/null
+++ b/Modules/M3/Http/Controllers/Controller.php
@@ -0,0 +1,13 @@
+MACPKR) ? trim($request->MACPKR) : '';
+
+ # ESN1
+ # $macpacPicker='888568'; // LTL example
+ # $macpacPicker='894337'; // another LTL example with smaller orders, therefore pallets are more mixed
+ # $macpacPicker='1225311'; // parcel example
+ # ESN2
+ # $macpacPicker='748101'; // LTL example
+
+ try {
+ $icm704mArray = $this->buildNMFCCodesArray();
+
+ $shipmentData = $this->getShipmentData($macpacPicker);
+ if (empty($shipmentData['orderNumber'])) {
+ return response()->json(['error' => "Picker {$macpacPicker} was not found in ICM688M1"]);
+ }
+
+ # Get Packages
+ $packages = $this->getPackagesData($shipmentData['macpkr_list']);
+ # Add NMFC to Packages
+ $packagesWithNMFC = $this->addNMFCDataToPackages($packages, $macpacPicker, $icm704mArray);
+
+ # Get Commodities
+ $commodities = $this->getCommoditiesData(
+ $shipmentData['company'],
+ $shipmentData['warehouse'],
+ $macpacPicker,
+ $packages['package_595m1'],
+ $icm704mArray
+ );
+
+ return response()->json([
+ 'error' => '',
+ 'shipmentData' => $shipmentData,
+ 'packages' => $packagesWithNMFC,
+ 'commodities' => $commodities
+ ]);
+
+ } catch (\Exception $e) {
+ return response()->json(['error' => $e->getMessage()], 500);
+ }
+ }
+
+ protected function buildNMFCCodesArray()
+ {
+ $results = DB::table('ICM704M')->get();
+
+ return $results->mapWithKeys(function ($row) {
+ // dump($row);
+ return [
+ trim($row->AONMIT) => [
+ 'LTLClassId' => number_format(trim($row->AOFCID), 1),
+ 'NMFCItem' => trim($row->AONMIT),
+ 'NMFCSub' => trim($row->AONMSB),
+ 'SkidDescription' => trim($row->AOSKDE)
+ ]
+ ];
+ })->all();
+
+ }
+
+ protected function getShipmentData($macpacPicker)
+ {
+ $result = DB::select("
+ SELECT
+ SUM(A4TPCKWGHT) as total_weight,
+ A4MACPKR, A4SHSHA1, A4SHSHA2, A4SHSHCI, A4SHSHNM,
+ A4SHSHCT, A4SHSHZP, A4SHSHST, A4ONO, A4STCN, A4CO,
+ A4WHS, A4SHIPVIA, A4SLCO, A4SLWHS, A4CATPID, A42SSVCCOD,
+ A4CARRIER, A4SHPAGGCD, A4SALESLOC, A4SHCSPO, A4OFSTRM,
+ A4SCAC, A4PLANT
+ FROM ICM688M1
+ WHERE A4MACPKR = ?
+ GROUP BY A4MACPKR, A4SHSHA1, A4SHSHA2, A4SHSHCI, A4SHSHNM,
+ A4SHSHCT, A4SHSHZP, A4SHSHST, A4ONO, A4RLNO, A4SHNO,
+ A4STCN, A4CO, A4WHS, A4SHIPVIA, A4SLCO, A4SLWHS,
+ A4CATPID, A42SSVCCOD, A4CARRIER, A4SHPAGGCD,
+ A4SALESLOC, A4SHCSPO, A4OFSTRM, A4SCAC, A4PLANT",
+ [$macpacPicker]
+ );
+
+ if (empty($result)) {
+ return [];
+ }
+
+ $row = $result[0];
+ $aggCode = trim($row->A4SHPAGGCD);
+
+ return [
+ 'orderNumber' => trim($row->A4MACPKR),
+ 'recipient' => [
+ 'address1' => trim($row->A4SHSHA1),
+ 'address2' => trim($row->A4SHSHA2),
+ 'city' => trim($row->A4SHSHCI),
+ 'companyName' => trim($row->A4SHSHNM),
+ 'country' => trim($row->A4SHSHCT),
+ 'postalCode' => trim($row->A4SHSHZP),
+ 'state' => trim($row->A4SHSHST),
+ ],
+ 'shipmentReference' => trim($row->A4ONO),
+ 'company' => trim($row->A4CO),
+ 'warehouse' => trim($row->A4WHS),
+ 'macpkr_list' => $macpacPicker,
+ 'shipment_list' => "'" . trim($row->A4ONO) . "'",
+ 'po_list' => "'" . trim($row->A4SHCSPO) . "'",
+ 'order_list' => "'" . trim($row->A4ONO) . "'"
+ ];
+ }
+
+ protected function getPackagesData($macpkrList)
+ {
+ $results = DB::select("
+ SELECT
+ AYINTBOX,
+ MAX(AYHEIGHT) as height,
+ MAX(AYWIDTH) as width,
+ MAX(AYDEPTH) as depth,
+ SUM(AYLNWGHT) as weight
+ FROM ICM695M1
+ WHERE AYMACPKR IN (?)
+ GROUP BY AYINTBOX
+ ORDER BY AYINTBOX",
+ [$macpkrList]
+ );
+
+ $packages = [];
+ $package595m1 = [];
+ $packagesGS1Array = [];
+
+ foreach ($results as $index => $row) {
+ // dump($row);
+ $internalBox = trim($row->AYINTBOX);
+
+ $package595m1[$internalBox] = [
+ 'INDEX' => $index,
+ 'HEIGHT' => $row->HEIGHT,
+ 'WIDTH' => $row->WIDTH,
+ 'DEPTH' => $row->DEPTH,
+ 'WEIGHT' => $row->WEIGHT
+ ];
+
+ $packages[] = [
+ 'Width' => $row->WIDTH,
+ 'Height' => $row->HEIGHT,
+ 'Length' => $row->DEPTH,
+ 'Weight' => $row->WEIGHT,
+ 'LicencePlate' => $internalBox,
+ 'Reference1' => $internalBox,
+ 'WeightType' => 0,
+ 'DimensionType' => 0
+ ];
+
+ $packagesGS1Array[] = $internalBox;
+ }
+
+ return [
+ 'packages' => $packages,
+ 'package_595m1' => $package595m1,
+ 'packagesGS1Array' => $packagesGS1Array
+ ];
+ }
+
+ protected function addNMFCDataToPackages($packages, $macpkrList, $icm704mArray)
+ {
+ $nmfcResults = DB::select("
+ WITH tempfile AS (
+ SELECT
+ (SELECT A5WBFRCT FROM ICM688M2
+ WHERE A5MACPKR IN (?) AND A5PART=AZPART
+ FETCH FIRST 1 ROWS ONLY) as WBFRCT,
+ az.*
+ FROM ICM695M2 az
+ WHERE AZMACPKR IN (?)
+ )
+ SELECT azintbox, MIN(WBFRCT) as MIN_WBFRCT
+ FROM tempfile
+ GROUP BY azintbox
+ ORDER BY 1",
+ [$macpkrList, $macpkrList]
+ );
+
+ foreach ($nmfcResults as $index => $row) {
+ $wbfrct = trim($row->MIN_WBFRCT);
+ $packages['packages'][$index]['SkidDesc'] =
+ $icm704mArray[$wbfrct]['SkidDescription'] ?? 'CLIPS, FASTENERS OR MOUNTS';
+ }
+
+ return $packages;
+ }
+
+ protected function getCommoditiesData($company, $warehouse, $macpkrList, $package595m1, $icm704mArray)
+ {
+ $results = DB::select("
+ WITH tempfile1 AS (
+ SELECT
+ A5PART,
+ MAX(A5CMDESC) as A5CMDESC,
+ MAX(A5MUTMS) as A5MUTMS,
+ MAX(A5PMPWHT) as A5PMPWHT,
+ MAX(A5SLUNPR) as A5SLUNPR,
+ TRIM(MIN(A5WBFRCT)) as A5WBFRCT
+ FROM ICM688M2
+ WHERE A5CO = ? AND A5WHS = ? AND A5MACPKR IN (?) AND A5PACKED > 0
+ GROUP BY A5PART
+ ),
+ tempfile2 AS (
+ SELECT
+ AZINTBOX,
+ AZPART,
+ SUM(AZPACKED) as AZPACKED,
+ MAX(SUBSTR(AZSPR15A01,1,4)) as HAZARDOUS
+ FROM ICM695M2
+ WHERE AZCO = ? AND AZWHS = ? AND AZMACPKR IN (?) AND AZPACKED <> 0
+ GROUP BY AZINTBOX, AZPART
+ )
+ SELECT
+ A5PART, A5CMDESC, A5MUTMS,
+ A5PMPWHT * AZPACKED as WEIGHt,
+ AZPACKED, AZINTBOX,
+ A5WBFRCT, HAZARDOUS, A5SLUNPR
+ FROM tempfile1
+ LEFT JOIN tempfile2 ON AZPART = A5PART
+ ORDER BY A5PART",
+ [$company, $warehouse, $macpkrList, $company, $warehouse, $macpkrList]
+ );
+
+ $commodities = [];
+ $prevPartNumber = '';
+ $index = -1;
+
+ foreach ($results as $row) {
+ $partNumber = trim($row->A5PART);
+
+ if ($partNumber !== $prevPartNumber) {
+ $index++;
+ $quantityIndex = 0;
+
+ $wbfrct = trim($row->A5WBFRCT);
+ $nmfcData = $icm704mArray[$wbfrct] ?? [
+ 'LTLClassId' => '50',
+ 'NMFCItem' => '93490',
+ 'NMFCSub' => ''
+ ];
+
+ $commodities[] = [
+ 'Description' => trim($row->A5CMDESC),
+ 'PartNumber' => $partNumber,
+ 'SKUOrItemOrUPC' => $partNumber,
+ 'MadeInCountryCode' => 'US',
+ 'UnitValue' => $row->A5SLUNPR == '.000' ? 1 : (float) $row->A5SLUNPR,
+ 'TotalWeight' => (float) $row->WEIGHT,
+ 'QuantityUnitOfMeasure' => trim($row->A5MUTMS) ?: 'EA',
+ 'Quantity' => (float) $row->AZPACKED,
+ 'LTLClassId' => $nmfcData['LTLClassId'],
+ 'NMFCItem' => $nmfcData['NMFCItem'],
+ 'NMFCSub' => $nmfcData['NMFCSub'],
+ 'DangerousGoodsInfo' => [
+ 'ContainsDangerousGoods' => trim($row->HAZARDOUS) === 'H4.1'
+ ],
+ 'QuantityAssignment' => [
+ [
+ 'PackageIndex' => $package595m1[trim($row->AZINTBOX)]['INDEX'],
+ 'Quantity' => (float) $row->AZPACKED
+ ]
+ ]
+ ];
+ } else {
+ $quantityIndex++;
+ $commodities[$index]['TotalWeight'] += (float) $row->WEIGHT;
+ $commodities[$index]['Quantity'] += (float) $row->AZPACKED;
+ $commodities[$index]['QuantityAssignment'][] = [
+ 'PackageIndex' => $package595m1[trim($row->AZINTBOX)]['INDEX'],
+ 'Quantity' => (float) $row->AZPACKED
+ ];
+ }
+
+ $prevPartNumber = $partNumber;
+ }
+
+ return $commodities;
+ }
+
+
+}
diff --git a/Modules/M3/Http/Controllers/M3CallCloseAPIController.php b/Modules/M3/Http/Controllers/M3CallCloseAPIController.php
new file mode 100644
index 00000000..f30e76e9
--- /dev/null
+++ b/Modules/M3/Http/Controllers/M3CallCloseAPIController.php
@@ -0,0 +1,113 @@
+all())>0 ? $request->all() : '';
+ // dd($urlParams);
+ $SHUSER = isset($urlParams["SHUSER"]) ? $urlParams["SHUSER"] : '';
+ $MANIFEST = isset($urlParams["MANIFEST"]) ? $urlParams["MANIFEST"] : '';
+ $APCO = isset($urlParams["APCO"]) ? $urlParams["APCO"] : '';
+ $APWHS = isset($urlParams["APWHS"]) ? $urlParams["APWHS"] : '';
+
+ if ($MANIFEST!='' && $APCO!='' && $APWHS!='') { // $SHUSER!='' &&
+ // Log::channel('dailyCron')->info("Cron...Start CallCloseAPI...For user:".$SHUSER." Manifest#: ".$MANIFEST);
+
+ # Get Logged User CO & WH
+ # Get users from ICM428M
+ // $ICM428M = DB::connection(config('m3.connection', 'pgsql'))->table('icm428m')
+ // ->select('R428US','R428CO', 'R428WH')
+ // ->where('R428US','=',$SHUSER)
+ // ->first();
+
+ // $R428US = isset($ICM428M->R428US) ? $ICM428M->R428US : '';
+ // $USERCO = isset($ICM428M->R428CO) ? $ICM428M->R428CO : '';
+ // $USERWH = isset($ICM428M->R428WH) ? $ICM428M->R428WH : '';
+ // dump($R428US.':'.$USERCO.':'.$USERWH);
+
+ # Get Macpickers from ICM705M1
+ # SELECT APMANIFEST FROM ICM705M1 WHERE APSPARE2='' AND APCO='110' AND APWHS='321'
+ $ICM705M1 = DB::connection(config('m3.connection', 'pgsql'))->table('icm705m1')
+ ->select('APMANIFEST','APCO','APWHS')
+ ->where('APSPARE2','')
+ ->where('APCO',$APCO)
+ ->where('APWHS',$APWHS)
+ ->where('APMANIFEST','=',$MANIFEST)
+ ->whereRaw('EXTRACT(EPOCH FROM (CURRENT_TIMESTAMP - APLDCLOZ)) / 60 > 15')
+ ->orderBy('APMANIFEST')
+ ->get();
+ // dump($ICM705M1);
+
+ if (count($ICM705M1)>0) {
+ # Loop the Results from $ICM705M1
+ foreach ($ICM705M1 as $key => $ICM705M1R) {
+ # Send CO and WHS to CallCloseAPI
+ $USERCO = isset($ICM705M1R->APCO) ? $ICM705M1R->APCO : '';
+ $USERWH = isset($ICM705M1R->APWHS) ? $ICM705M1R->APWHS : '';
+
+ $callCloseShipment = Artisan::call('command:CallCloseAPI', ['user'=> $SHUSER ,'manifest' => $ICM705M1R->APMANIFEST ,
+ 'co' => $USERCO ,'whs' => $USERWH]);
+ // dump($callCloseShipment);
+
+ if ($callCloseShipment==1) {
+ return response()->json([
+ 'code' => '200',
+ 'status' => 'Success',
+ 'message'=> 'Manifest Closing submitted'
+ ]);
+ }
+ else{
+ return response()->json([
+ 'code' => '206',
+ 'status' => 'Failure',
+ 'message'=> 'Manifest Closing Failed'
+ ]);
+ }
+ }
+ }
+ else{
+ Log::channel('dailyCron')->info("Manifest CloseAPI: No records found in ICM705M1...");
+ return response()->json([
+ 'code' => '206',
+ 'status' => 'Error',
+ 'message'=> "Manifest CloseAPI: No records found in ICM705M1..."
+ ]);
+ }
+ }
+ else{
+ Log::channel('dailyCron')->error('Manifest CloseAPI: A User and Manifest must be defined...');
+
+ return response()->json([
+ 'code' => '206',
+ 'status' => 'Error',
+ 'message'=> 'Manifest CloseAPI: A User and Manifest must be defined...'
+ ]);
+ }
+ }
+ catch (\Throwable $th) {
+ Log::error($th);
+ }
+ }
+
+}
diff --git a/Modules/M3/Http/Controllers/M3DeliveryController.php b/Modules/M3/Http/Controllers/M3DeliveryController.php
new file mode 100644
index 00000000..782cd44c
--- /dev/null
+++ b/Modules/M3/Http/Controllers/M3DeliveryController.php
@@ -0,0 +1,81 @@
+table('icm428m')
+ ->select('R428PWRUSR','R428US','R428CO','R428PL','R428WH')
+ ->where('R428US','=',strtoUpper(m3_user()))
+ ->first();
+ $co = $power_user->R428CO;
+ $plant = $power_user->R428PL;
+ $whs = $power_user->R428WH;
+ $ICM664M = DB::connection(config('m3.connection', 'pgsql'))->select("select * from ICM664M
+ where AVCO='$co' and AVPLANT='$plant' and AVWHS='$whs'");
+ $IC670M = DB::connection(config('m3.connection', 'pgsql'))->select("select * from IC670M where WDCO='$co' and WDPL='$plant' and WDWHS='$whs'");
+ $shipvia = DB::connection(config('m3.connection', 'pgsql'))->select("select AXCODE, AXDESC from ICM319M order by 1");
+#646 where AXCO='$co' and AXWHS='$whs' and AXPLANT='$plant'
+ return view('m3::liberty-theme.pages.M3Delivery', compact('ICM664M','IC670M','power_user','shipvia'));
+
+ // AVCO AVCO CHARACTER 3 No ' ' Division
+ // AVWHS AVWHS CHARACTER 3 No ' ' Warehouse
+ // AVPLANT AVPLANT CHARACTER 3 No ' ' Plant
+ // AVDELMETH AVDELMETH CHARACTER 4 No ' ' Delivery method
+ // AVSHPVIA AVSHPVIA CHARACTER 4 No ' ' Sentinel ship via
+ // AVSHSRT AVSHSRT CHARACTER 6 No ' ' Sentinel route
+ // AVSHORCL AVSHORCL CHARACTER 3 No ' ' Sentinel intl code
+ // AVSPR1A01 AVSPR1A01 CHARACTER 1 No ' ' Spare field 1A 01
+ // AVSPR1A02 AVSPR1A02 CHARACTER 1 No ' ' Spare field 1A 02
+ // AVSPR10A01 AVSPR10A01 CHARACTER 10 No ' ' Spare field 10A 1
+ // AVSPR15A01 AVSPR15A01 CHARACTER 15 No ' ' Spare field 15A 1
+ // AVSPR30A01 AVSPR30A01 CHARACTER 30 No ' ' Spare field 30A 1
+ }
+
+ //
+ // Process data from Add modal
+ //
+ public static function saveM3DeliveryAdd(Request $request) {
+
+ $icm664m=DB::connection(config('m3.connection', 'pgsql'))->select("select count(*) as COUNT1 from ICM664M
+ where AVCO='$request->AVCO' and AVWHS='$request->AVWHS' and AVPLANT='$request->AVPLANT' and AVDELMETH='$request->AVDELMETH'");
+ if($icm664m[0]->COUNT1=="1") {
+ return "exists";
+ } else {
+
+ DB::connection(config('m3.connection', 'pgsql'))->insert("insert into ICM664M
+ (AVCO, AVPLANT, AVWHS, AVDELMETH, AVSHPVIA, AVSHSRT, AVSHORCL)
+ values ('$request->AVCO', '$request->AVPLANT', '$request->AVWHS', '$request->AVDELMETH',
+ '$request->AVSHPVIA', '$request->AVSHSRT', '$request->AVSHORCL')");
+ return "success";
+
+ }
+ }
+
+ //
+ // Process data from Edit modal
+ //
+ public static function saveM3DeliveryEdit(Request $request) {
+ #dd($request);
+ // Update record to ICM664M
+
+ DB::connection(config('m3.connection', 'pgsql'))->update("update ICM664M
+ set AVSHPVIA='$request->AVSHPVIA', AVSHSRT='$request->AVSHSRT', AVSHORCL='$request->AVSHORCL'
+ where AVCO='$request->AVCO' and AVPLANT='$request->AVPLANT' and AVWHS='$request->AVWHS' and AVDELMETH='$request->AVDELMETH'");
+
+ return "success";
+
+ }
+
+}
diff --git a/Modules/M3/Http/Controllers/M3ErrorsDispController.php b/Modules/M3/Http/Controllers/M3ErrorsDispController.php
new file mode 100644
index 00000000..6f2d49bb
--- /dev/null
+++ b/Modules/M3/Http/Controllers/M3ErrorsDispController.php
@@ -0,0 +1,347 @@
+all());
+ $macpkr = isset($request->macpkr) ? trim($request->macpkr) : "";
+ $shsource = isset($request->shsource) ? trim($request->shsource) : "";
+ $showerrors = isset($request->showerrors) ? trim($request->showerrors) : "N";
+ $skipdates = isset($request->skipdates) ? trim($request->skipdates) : "N";
+
+ # Get users from ICM428M
+ $ICM428M = DB::connection(config('m3.connection', 'pgsql'))->table('icm428m')
+ ->select('R428US', 'R428FIRST', 'R428FAMILY')
+ ->get();
+ $ICM428MCOL = collect($ICM428M);
+ $ICM428MCOL->filter(function ($value) {
+ return $value->R428US = trim($value->R428US);
+ });
+ $ICM428MCOL->filter(function ($value) {
+ return $value->R428FIRST = trim($value->R428FIRST);
+ });
+ $ICM428MCOL->filter(function ($value) {
+ return $value->R428FAMILY = trim($value->R428FAMILY);
+ });
+
+ return view('m3::liberty-theme.pages.M3ErrorsDisplay', compact('macpkr', 'shsource', 'showerrors', 'skipdates', 'ICM428MCOL'));
+ }
+
+ public function datatables(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'));
+ ini_set('memory_limit', '1024M');
+
+ // dump($request->all());
+ $SHMACPKR = null != $request->SHMACPKR ? trim($request->SHMACPKR) : '';
+ $SHSOURCE = null != $request->SHSOURCE ? trim($request->SHSOURCE) : '';
+ $STARTDATE = null != $request->STARTDATE ? trim($request->STARTDATE) : today()->subDays(1)->format('Y-m-d');
+ $ENDDATE = null != $request->ENDDATE ? trim($request->ENDDATE) : today()->format('Y-m-d');
+ $SHOWERRORS = null != $request->SHOWERRORS ? trim($request->SHOWERRORS) : 'N';
+ $SHUSER = m3_user() !== '' ? Str::upper(trim(m3_user())) : '';
+ $SKIPDATES = null != $request->SKIPDATES ? trim($request->SKIPDATES) : 'N';
+
+ # Get Logged User CO & WH
+ # Get users from ICM428M
+ $ICM428M = DB::connection(config('m3.connection', 'pgsql'))->table('icm428m')
+ ->select('R428US', 'R428CO', 'R428WH')
+ ->where('R428US', '=', $SHUSER)
+ ->first();
+
+ $R428US = isset($ICM428M->R428US) ? $ICM428M->R428US : '';
+ $USERCO = isset($ICM428M->R428CO) ? $ICM428M->R428CO : '';
+ $USERWH = isset($ICM428M->R428WH) ? $ICM428M->R428WH : '';
+
+ # Merge date and time fields
+ $mergedDateTime = DB::raw(" ICM699M.SHDT || ' ' || ICM699M.SHTIME AS SHDATETIME");
+
+ $ICM699M = DB::connection(config('m3.connection', 'pgsql'))->table('icm699m')
+ ->select(
+ 'ICM699M.*',
+ 'ICM699M.SHACKDATE',
+ 'ICM699M.SHACKTIME',
+ 'ICM699M.SHACKUSER',
+ $mergedDateTime,
+ 'ICM428M.R428FIRST',
+ 'ICM428M.R428FAMILY',
+ 'ICM688M1.A4ONO',
+ 'ICM688M1.A4SHSHNM',
+ 'ICM666M.A1ONO',
+ 'ICM666M.A1SHSHNM'
+ )
+ ->distinct()
+ ->leftJoin('ICM428M', 'ICM699M.SHUSER', '=', 'ICM428M.R428US')
+ ->leftJoin('ICM688M1', 'ICM699M.SHMACPKR', '=', 'ICM688M1.A4MACPKR')
+ ->leftJoin('ICM666M', 'ICM699M.SHMACPKR', '=', 'ICM666M.A1DELNO');
+
+ if ($R428US != '') {
+ $ICM699M->whereIn('SHCO', [$USERCO, '']);
+ $ICM699M->whereIn('SHWHS', [$USERWH, '']);
+ } else {
+ $ICM699M->where('SHCO', null);
+ $ICM699M->where('SHWHS', null);
+ }
+
+ if ($SHMACPKR != '') {
+ $ICM699M->where('SHMACPKR', $SHMACPKR);
+ }
+
+ if ($SHSOURCE != '') {
+ $ICM699M->where('SHSOURCE', $SHSOURCE);
+ }
+ # Disable PDFStorage Search
+ $ICM699M->where('SHSOURCE', '!=', 'PdfStorageAPI');
+
+ if ($SHMACPKR == '' && $SKIPDATES == 'N') {
+ $ICM699M->whereBetween('SHDT', [$STARTDATE, $ENDDATE]);
+ }
+
+ if ($SHOWERRORS == 'Y') {
+ $ICM699M->where('SHERROR', 'X');
+ }
+
+ # Get only M3 Logs
+ $ICM699M->where('SHTYPE', 'like', '%M3%');
+
+ return Datatables::of($ICM699M)->addIndexColumn()->make(true);
+ }
+
+ public static function update699M(Request $request)
+ {
+ // dump($request->all());
+ $SHMACPKR = null != $request->SHMACPKR ? trim($request->SHMACPKR) : '';
+ $SHSOURCE = null != $request->SHSOURCE ? trim($request->SHSOURCE) : '';
+ $SHCO = null != $request->SHCO ? trim($request->SHCO) : '';
+ $SHWHS = null != $request->SHWHS ? trim($request->SHWHS) : '';
+ $SHDT = null != $request->SHDT ? trim($request->SHDT) : '';
+ $SHTIME = null != $request->SHTIME ? trim($request->SHTIME) : '';
+ $SHTYPE = null != $request->SHTYPE ? trim($request->SHTYPE) : '';
+ $SHACKNOTE = null != $request->SHACKNOTE ? trim(substr($request->SHACKNOTE, 0, 99)) : '';
+ $SHUSER = m3_user() !== '' ? Str::upper(m3_user()) : '';
+ $CLOSESIM = null != $request->CLOSESIM ? trim($request->CLOSESIM) : 'N';
+
+ if ($CLOSESIM == 'N') {
+ $ICM699MU = DB::connection(config('m3.connection', 'pgsql'))->table('icm699m')
+ ->where('SHMACPKR', $SHMACPKR)
+ ->where('SHDT', $SHDT)
+ ->where('SHTIME', $SHTIME)
+ ->where('SHCO', $SHCO)
+ ->where('SHWHS', $SHWHS)
+ ->where('SHSOURCE', $SHSOURCE)
+ ->where('SHERROR', 'X')
+ ->where('SHTYPE', $SHTYPE)
+ ->update(["SHERROR" => "Z", "SHACKUSER" => $SHUSER, "SHACKDATE" => date('Y-m-d'), "SHACKTIME" => date('H:i:s'), "SHACKNOTE" => $SHACKNOTE]);
+
+ } else {
+ $ICM699MU = DB::connection(config('m3.connection', 'pgsql'))->table('icm699m')
+ ->where('SHCO', $SHCO)
+ ->where('SHWHS', $SHWHS)
+ ->where('SHSOURCE', $SHSOURCE)
+ ->where('SHERROR', 'X')
+ ->where('SHTYPE', $SHTYPE)
+ ->update(["SHERROR" => "Z", "SHACKUSER" => $SHUSER, "SHACKDATE" => date('Y-m-d'), "SHACKTIME" => date('H:i:s'), "SHACKNOTE" => $SHACKNOTE]);
+ }
+
+
+ if ($SHSOURCE == "CloseShipmentCoChargeAPI") {
+ # Update ICM688M1 : Change A4PICKSTS
+ DB::connection(config('m3.connection', 'pgsql'))->table('icm688m1')
+ ->where('A4MACPKR', $SHMACPKR)
+ ->where('A4CO', $SHCO)
+ ->where('A4WHS', $SHWHS)
+ ->update(['A4PICKSTS' => 'a']);
+ }
+
+ return response()->json(['success' => true]);
+ }
+
+ # Export To Excel
+ public static function exporttoExcel(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'));
+ ini_set('memory_limit', '1024M');
+
+ try {
+ // dd($request->all());
+ $SHMACPKR = null != $request->SHMACPKR ? trim($request->SHMACPKR) : '';
+ $SHSOURCE = null != $request->SHSOURCE ? trim($request->SHSOURCE) : '';
+ $STARTDATE = null != $request->STARTDATE ? trim($request->STARTDATE) : today()->subDays(1)->format('Y-m-d');
+ $ENDDATE = null != $request->ENDDATE ? trim($request->ENDDATE) : today()->format('Y-m-d');
+ $SHOWERRORS = null != $request->SHOWERRORS ? trim($request->SHOWERRORS) : 'N';
+ $SHUSER = m3_user() !== '' ? Str::upper(trim(m3_user())) : '';
+ $SKIPDATES = null != $request->SKIPDATES ? trim($request->SKIPDATES) : 'N';
+ # Get Logged User CO & WH
+ # Get users from ICM428M
+ $ICM428M = DB::connection(config('m3.connection', 'pgsql'))->table('icm428m')
+ ->select('R428US', 'R428CO', 'R428WH')
+ ->where('R428US', '=', $SHUSER)
+ ->first();
+
+ $R428US = isset($ICM428M->R428US) ? $ICM428M->R428US : '';
+ $USERCO = isset($ICM428M->R428CO) ? $ICM428M->R428CO : '';
+ $USERWH = isset($ICM428M->R428WH) ? $ICM428M->R428WH : '';
+
+ # Get users from ICM428M
+ $ICM428MAll = DB::connection(config('m3.connection', 'pgsql'))->table('icm428m')
+ ->select('R428US', 'R428FIRST', 'R428FAMILY')
+ ->get();
+ $ICM428MCOL = collect($ICM428MAll);
+ $ICM428MCOL->filter(function ($value) {
+ return $value->R428US = trim($value->R428US);
+ });
+ $ICM428MCOL->filter(function ($value) {
+ return $value->R428FIRST = trim($value->R428FIRST);
+ });
+ $ICM428MCOL->filter(function ($value) {
+ return $value->R428FAMILY = trim($value->R428FAMILY);
+ });
+
+ # Merge date and time fields
+ $mergedDateTime = DB::raw(" ICM699M.SHDT || ' ' || ICM699M.SHTIME AS SHDATETIME");
+
+ $ICM699M = DB::connection(config('m3.connection', 'pgsql'))->table('icm699m')
+ ->select(
+ DB::raw('COALESCE(ICM688M1.A4ONO, ICM666M.A1ONO) AS DELIVERY_NUM '),
+ 'ICM699M.SHMACPKR',
+ DB::raw('COALESCE(ICM688M1.A4SHSHNM, ICM666M.A1SHSHNM) AS CUSTOMER '),
+ $mergedDateTime,
+ DB::raw("CASE WHEN ICM699M.SHERROR !='Z' THEN TRIM(ICM699M.SHERROR) ELSE 'Closed' END AS ERROR"),
+ 'ICM699M.SHTYPE',
+ 'ICM699M.SHSOURCE',
+ DB::raw("CASE WHEN ICM428M.R428FIRST IS NOT NULL THEN TRIM(ICM428M.R428FIRST) ||' '|| TRIM(ICM428M.R428FAMILY) ELSE TRIM(ICM699M.SHUSER) END AS USER"),
+ 'ICM699M.SHCODE',
+ 'ICM699M.SHCO',
+ 'ICM699M.SHWHS',
+ DB::raw(" ICM699M.SHACKDATE ||' '||ICM699M.SHACKTIME AS ACKDATE"),
+ 'ICM699M.SHACKUSER',
+ 'ICM699M.SHINTBOX',
+ 'ICM699M.SHACKNOTE',
+ DB::raw('SUBSTR(ICM699M.SHDATA, 1, 200)')
+ )
+ ->distinct()
+ ->leftJoin('ICM428M', 'ICM699M.SHUSER', '=', 'ICM428M.R428US')
+ ->leftJoin('ICM688M1', 'ICM699M.SHMACPKR', '=', 'ICM688M1.A4MACPKR')
+ ->leftJoin('ICM666M', 'ICM699M.SHMACPKR', '=', 'ICM666M.A1DELNO');
+
+ # Get Records Count only
+ $ICM699MC = DB::connection(config('m3.connection', 'pgsql'))->table('icm699m');
+
+ if ($R428US != '') {
+ $ICM699M->whereIn('SHCO', [$USERCO, '']);
+ $ICM699M->whereIn('SHWHS', [$USERWH, '']);
+
+ $ICM699MC->whereIn('SHCO', [$USERCO, '']);
+ $ICM699MC->whereIn('SHWHS', [$USERWH, '']);
+ } else {
+ $ICM699M->where('SHCO', null);
+ $ICM699M->where('SHWHS', null);
+
+ $ICM699MC->where('SHCO', null);
+ $ICM699MC->where('SHWHS', null);
+ }
+
+ if ($SHMACPKR != '') {
+ $ICM699M->where('SHMACPKR', $SHMACPKR);
+
+ $ICM699MC->where('SHMACPKR', $SHMACPKR);
+ }
+
+ if ($SHSOURCE != '') {
+ $ICM699M->where('SHSOURCE', $SHSOURCE);
+
+ $ICM699MC->where('SHSOURCE', $SHSOURCE);
+ }
+ # Disable PDFStorage Search
+ $ICM699M->where('SHSOURCE', '!=', 'PdfStorageAPI');
+
+ $ICM699MC->where('SHSOURCE', '!=', 'PdfStorageAPI');
+
+ if ($SHMACPKR == '' && $SKIPDATES == 'N') {
+ $ICM699M->whereBetween('SHDT', [$STARTDATE, $ENDDATE]);
+
+ $ICM699MC->whereBetween('SHDT', [$STARTDATE, $ENDDATE]);
+ }
+
+ if ($SHOWERRORS == 'Y') {
+ $ICM699M->where('SHERROR', 'X');
+
+ $ICM699MC->where('SHERROR', 'X');
+ }
+
+ # Get only M3 Logs
+ $ICM699M->where('SHTYPE', 'like', '%M3%');
+
+ $ICM699MC->where('SHTYPE', 'like', '%M3%');
+
+ # Count records before exporting to excel : Max 20K records are allowed
+ $ICM699MCount = $ICM699MC->count();
+ // dd($ICM699MCount);
+ # Set Max allowed records
+ $maxRecords = Config::get('arrays.maxRecDL');
+ if ($ICM699MCount > $maxRecords) {
+ return redirect()->back()->withInput()->with('message', 'Maximum allowed records for Excel Download is: ' . number_format($maxRecords) .
+ ' current records: ' . number_format($ICM699MCount) . ' , change your search criteria.');
+ }
+
+ # Select Records and export them to Excel
+ $ICM699MSel = $ICM699M->get();
+ $ICM699MCol = collect($ICM699MSel);
+
+ # Get Transaction Types
+ $transxTypes = Config::get('arrays.transxTypes');
+ $ICM699MCol->filter(function ($value) use ($transxTypes) {
+ return $value->SHSOURCE = isset($transxTypes[trim($value->SHSOURCE)]) ? $transxTypes[trim($value->SHSOURCE)] : $value->SHSOURCE;
+ });
+
+ # Get User Names
+ $ICM699MCol->filter(function ($value) use ($ICM428MCOL) {
+ $UserTemp = $ICM428MCOL->firstWhere('R428US', trim($value->SHACKUSER));
+ $SHACKUSER = isset($UserTemp->R428FIRST) ? $UserTemp->R428FIRST . ' ' . $UserTemp->R428FAMILY : trim($value->SHACKUSER);
+ return $value->SHACKUSER = $SHACKUSER;
+ });
+
+ # Prepend Header To Excel
+ $newItem = ["SHMACPKR" => 'Delivery Note',
+ "DELIVERY_NUM" => 'Order #',
+ "CUSTOMER" => 'Customer',
+ "SHDATETIME" => 'Date',
+ "ERROR" => 'Error',
+ "SHTYPE" => 'Request Type',
+ "SHSOURCE" => 'Source of transaction',
+ "USER" => 'User',
+ "SHCODE" => 'Request or Response Data',
+ "SHCO" => 'Division',
+ "SHWHS" => 'Warehouse',
+ "ACKDATE" => 'Acknowledge/Retry Date',
+ "SHACKUSER" => 'Acknowledged/Retried by User',
+ "SHINTBOX" => 'Internal Box Number',
+ "SHACKNOTE" => 'Note',
+ "SHDATA" => 'Error description'
+ ];
+ $ICM699MCol->prepend($newItem);
+ // dd($ICM699MCol);
+
+ # Download Excel File
+ return app(\Modules\M3\Services\SpreadsheetExport::class)->download($ICM699MCol, 'transactionLog_' . $STARTDATE . '-' . $ENDDATE . '.xlsx');
+ } catch (\Throwable $th) {
+ Log::error($th);
+ }
+ }
+}
diff --git a/Modules/M3/Http/Controllers/M3GetPDFFromCacheController.php b/Modules/M3/Http/Controllers/M3GetPDFFromCacheController.php
new file mode 100644
index 00000000..bcbba5e0
--- /dev/null
+++ b/Modules/M3/Http/Controllers/M3GetPDFFromCacheController.php
@@ -0,0 +1,216 @@
+table('icm428m')
+ ->select('R428US','R428CO', 'R428WH','R428PL')
+ ->where('R428US','=',$SHUSER)
+ ->first();
+
+ $R428US = isset($ICM428M->R428US) ? $ICM428M->R428US : '';
+ $COMPANY = isset($ICM428M->R428CO) ? $ICM428M->R428CO : ''; # Company
+ $PLANT = isset($ICM428M->R428PL) ? $ICM428M->R428PL : ''; # Plant
+ $WHS = isset($ICM428M->R428WH) ? $ICM428M->R428WH : ''; # WareHouse
+ }
+
+ # Warehouse Table
+ $IC670M = DB::connection(config('m3.connection', 'pgsql'))->table('ic670m')->get();
+ // ->where('WDCO',$userCO)->where('WDPL',$userPL)->where('WDWHS',$userWH)
+
+ # Get URL PARAMS
+ $urlParams = count($request->all())>0 ? $request->all() : '';
+ // dump($urlParams);
+ $AYMACPKR = isset($urlParams["MACPKR"]) ? trim($urlParams["MACPKR"]) : ''; # Delivery note number
+ $DOCTYPE = isset($urlParams["DOCTYPE"]) ? trim($urlParams["DOCTYPE"]) : ''; # Document type (PackingList, CarrierLabel, ContentLabel)
+ $WHDDA = $COMPANY.$PLANT.$WHS;
+ // dump($WHDDA);
+
+ # Check Doctype fisrt
+ $docTypes = $DOCTYPE!='' ? [$DOCTYPE] : ['PackingList','ContentLabel', 'CarrierLabel', 'GSLabel']; # document type (PackingList, CarrierLabel, ContentLabel)
+
+ if($urlParams!=''){
+ // dump($urlParams);
+ # document number (ie the internal box number, the pick list number)
+ # Key Combination : COMPANY WHS A4MACPKR DOCTYPE DOCNUM
+ # Document type (PackingList, CarrierLabel, ContentLabel)
+
+ # Get Aggregation Number if it exists
+ $ICM695M1Agg = DB::connection(config('m3.connection', 'pgsql'))->table('icm695m1')
+ ->select('AYTRUCK')
+ ->where('AYCO',$COMPANY)
+ ->where('AYWHS',$WHS)
+ ->where('AYMACPKR',$AYMACPKR)
+ ->first();
+ // dump($ICM695M1Agg);
+ $aggno = isset($ICM695M1Agg->AYTRUCK) ? trim($ICM695M1Agg->AYTRUCK) : '';
+
+ if($aggno!="" && $aggno!="0") {
+ // dump($aggno);
+
+ $aggmsg="This delivery note is part of aggregation $aggno ";
+ $ICM688M1 = DB::connection(config('m3.connection', 'pgsql'))->select("select A4MACPKR from ICM688M1 where A4SHPAGGCD='$aggno'");
+ #dump($ICM688M1);
+ // foreach($ICM688M1 as $key => $ICM688M1R) {
+ // $aggmsg.=' '.$ICM688M1R->A4MACPKR.'';
+ // }
+ // $aggmsg.=" )";
+
+ #654 add 'AYSPR15A01', 'AYSPR30A01', 'AYTRUCK' carrier and tracking# and agg#
+ $ICM695M1 = DB::connection(config('m3.connection', 'pgsql'))->table('icm695m1')
+ ->select('AYCO','AYWHS','AYMACPKR','AYINTBOX', 'AYSPR15A01', 'AYSPR30A01', 'AYTRUCK')
+ ->distinct()
+ ->where('AYCO',$COMPANY)
+ ->where('AYWHS',$WHS)
+ // ->where('AYMACPKR',$AYMACPKR)
+ ->where('AYTRUCK',$aggno)
+ ->orderBy('AYMACPKR')
+ ->get();
+ }
+ else{
+ #654 add 'AYSPR15A01', 'AYSPR30A01', 'AYTRUCK' carrier and tracking# and agg#
+ $ICM695M1 = DB::connection(config('m3.connection', 'pgsql'))->table('icm695m1')
+ ->select('AYCO','AYWHS','AYMACPKR','AYINTBOX', 'AYSPR15A01', 'AYSPR30A01', 'AYTRUCK')
+ ->distinct()
+ ->where('AYCO',$COMPANY)
+ ->where('AYWHS',$WHS)
+ ->where('AYMACPKR',$AYMACPKR)
+ ->orderBy('AYMACPKR')
+ ->get();
+ }
+ #dump($ICM695M1);
+
+ $allLabels = [];
+
+ if (count($ICM695M1)>0) {
+ $tmpCacheArr = $carrier = $trackingno = [];
+ # Loop the Results from $ICM595M1TMP
+ foreach ($ICM695M1 as $key => $ICM695M1R) {
+ $WHS = trim($ICM695M1R->AYWHS);
+ $COMPANY = trim($ICM695M1R->AYCO);
+ $AYMACPKR = trim($ICM695M1R->AYMACPKR);
+ $DOCNUM = trim($ICM695M1R->AYINTBOX);
+ #654
+ $carrier[] = trim($ICM695M1R->AYSPR15A01);
+ $trackingno[] = trim($ICM695M1R->AYSPR30A01);
+ $aggno = trim($ICM695M1R->AYTRUCK);
+
+ # Make Key and Test Validity
+ if ($AYMACPKR!='' && $COMPANY!='' && $WHS!=''){
+ //echo "";
+ $CarrierLabel = '';
+ $ContentLabel = '';
+ $PackingList = '';
+ $cacheKeyPackingList = $cacheKeyCarrierLabel = $cacheKeyContentLabel = '';
+
+ # Get Unique Keys
+ foreach ($docTypes as $key => $value) {
+ # Check Parcel vs LTL
+ if( $value == 'ContentLabel' ){
+ $DOCNUMT = $DOCNUM;
+ $ContentLabel = !is_numeric($DOCNUM) ? 'LTL' : '';
+ }
+
+ if( $value == 'CarrierLabel' ){
+ $DOCNUMT = $DOCNUM;
+
+ # Keep Solon Logic to read LTL
+ $DOCNUMT2 = $ContentLabel=='LTL' ? $AYMACPKR : $DOCNUM;
+ if ($DOCNUMT2!=$DOCNUMT) {
+ $PDFKey2 = $value.'/'.$value.'_'.$AYMACPKR.'_'.$DOCNUMT2.'_'.$COMPANY.'_'.$WHS;
+ $tmpCacheArr[] = $PDFKey2;
+ }
+ }
+
+ if( $value == 'PackingList' ){
+ $DOCNUMT = $AYMACPKR;
+ }
+
+ # Get GS1 Labels
+ if($value=='GSLabel' ){
+ $PDFKey = $value.'/'.$value.'_'.$AYMACPKR.'_'.$COMPANY.'_'.$WHS.'_'.$DOCNUM;
+
+ // if ($ContentLabel=='LTL' ) {
+ // $PDFKey = $value.'/'.$value.'_'.$AYMACPKR.'_'.$COMPANY.'_'.$WHS;
+ // }
+ // else{
+ // $PDFKey = $value.'/'.$value.'_'.$AYMACPKR.'_'.$COMPANY.'_'.$WHS.'_'.$DOCNUM;
+ // }
+ }
+ else{
+ $PDFKey = $value.'/'.$value.'_'.$AYMACPKR.'_'.$DOCNUMT.'_'.$COMPANY.'_'.$WHS;
+ }
+ $tmpCacheArr[] = $PDFKey;
+ }
+ }
+ }
+ // dump($tmpCacheArr);
+
+ # Get unique values from array $PDFArray
+ $tmpCacheArr = collect($tmpCacheArr)->unique();
+ // dump($tmpCacheArr);
+ foreach($tmpCacheArr as $key => $value){
+ // $isCarrierLabel = Str::contains($value, 'CarrierLabel');
+
+ $pdfFileName = $pdfFilePath.$value.'.pdf';
+ if(File::exists($pdfFileName)){
+ // dump($pdfFileName);
+
+ $pdfFile = File::get($pdfFileName);
+ # Transform content to base64
+ // $base64PDF = $pdfFile;
+ $base64PDF = base64_encode($pdfFile);
+ // dd($base64PDF);
+ $PDFArray[] = $base64PDF;
+ }
+ }
+ // dump($PDFArray);
+ }
+ else {
+ # Nothing Found
+ }
+ }
+ }
+ catch (\Throwable $th) {
+ // Log::error($th);
+ }
+ # dump($PDFArray);
+ # dump($AYMACPKR);
+ # dump($IC670M);
+ # dump($ICM695M1);
+
+ return view('m3::liberty-theme.pages.M3GetPDF',compact('IC670M','PDFArray','AYMACPKR','WHDDA','aggmsg','carrier','trackingno','ICM688M1','COMPANY','PLANT','WHS'));
+ // compact('IC670M','ViewTitle')
+ }
+
+}
diff --git a/Modules/M3/Http/Controllers/MFOrdersController.php b/Modules/M3/Http/Controllers/MFOrdersController.php
new file mode 100644
index 00000000..ebc69f5d
--- /dev/null
+++ b/Modules/M3/Http/Controllers/MFOrdersController.php
@@ -0,0 +1,57 @@
+id) ? trim($request->id) : "";
+
+ // dd("MFOrders ".$MF);
+ # Get Users from ICM428M
+ $ICM428M = DB::connection(config('m3.connection', 'pgsql'))->table('icm428m')
+ ->select('R428US','R428CO', 'R428WH', 'R428PL')
+ ->where('R428US','=',strtoUpper(m3_user()))
+ ->first();
+ $user = $ICM428M->R428US;
+ $co = $ICM428M->R428CO;
+ $whs = $ICM428M->R428WH;
+ $plant = $ICM428M->R428PL;
+
+ # ICM705M1 Statement
+ $sqlstmt = "select APMANIFEST,APDOCKDOOR,APCARRIER,APTRUCKIDT,APSPARE1,APLDSTRU,APLDSTRD,APLDSTRT,
+ APLDCLOU,APLDCLOD,APLDCLOT,APCO,APWHS,APPLT,APSPARE2,APLDCLOZ
+ from ICM705M1
+ where APMANIFEST = $MF and APCO='$co' and APWHS='$whs' and APPLT='$plant' limit 1";
+
+ $ICM705M1 = DB::connection(config('m3.connection', 'pgsql'))->select($sqlstmt);
+ // dump($ICM705M1);
+ $carrier = isset($ICM705M1[0]->APCARRIER) ? trim($ICM705M1[0]->APCARRIER) : "";
+
+ if ($MF!='') {
+ $status_ICM688M1_array = Config::get('arrays.status_ICM688M1_array');
+
+ $sqlstmt = "SELECT AYCO,AYPLANT,AYMACPKR,AYONO,A4SHSHNM,A4PICKSTS,AYSPR15A01,SUM(AYLNWGHT) AS TOTWEIGHT,COUNT(*) AS BOXPAL FROM ICM695M1
+ LEFT JOIN ICM688M1 ON AYCO=A4CO AND AYPLANT=A4PLANT AND AYMACPKR=A4MACPKR
+ WHERE AYAPRF1551= $MF and AYCO='$co' and AYWHS='$whs' and AYPLANT='$plant'
+ GROUP BY AYCO,AYPLANT,AYMACPKR,AYONO,A4SHSHNM,A4PICKSTS,AYSPR15A01";
+
+ $ICM695M1 = DB::connection(config('m3.connection', 'pgsql'))->select($sqlstmt);
+ // dump($ICM695M1);
+
+ return view('m3::liberty-theme.pages.MFOrders', compact( 'ICM695M1', 'status_ICM688M1_array', 'MF', 'carrier')
+ );
+ }
+ else{
+ abort(404, 'Manifest Not Found');
+ }
+
+
+ }
+
+}
diff --git a/Modules/M3/Http/Controllers/OrderLinesOfClosedOrder.php b/Modules/M3/Http/Controllers/OrderLinesOfClosedOrder.php
new file mode 100644
index 00000000..3577cb41
--- /dev/null
+++ b/Modules/M3/Http/Controllers/OrderLinesOfClosedOrder.php
@@ -0,0 +1,342 @@
+table('icm428m')
+ ->select('R428US','R428CO', 'R428WH','R428PL')
+ ->where('R428US','=',$SHUSER)
+ ->first();
+
+ $R428US = isset($ICM428M->R428US) ? $ICM428M->R428US : ''; # User
+ $COMPANY = isset($ICM428M->R428CO) ? $ICM428M->R428CO : '110'; # Company
+ $PLANT = isset($ICM428M->R428PL) ? $ICM428M->R428PL : '144'; # Plant
+ $WHS = isset($ICM428M->R428WH) ? $ICM428M->R428WH : '322'; # WareHouse
+ }
+
+ # Warehouse Table
+ $IC670M = DB::connection(config('m3.connection', 'pgsql'))->table('ic670m')->get();
+
+ # Get URL PARAMS
+ $urlParams = count($request->all())>0 ? $request->all() : '';
+ // dump($urlParams);
+ $REPORTDATEDisp = isset($urlParams["REPORTDATEDisp"]) ? \DateTime::createFromFormat('Y-m-d', trim($urlParams["REPORTDATEDisp"]))->format('Ymd') : today()->format('Ymd');
+
+ $WHDDA = $COMPANY.$PLANT.$WHS;
+ // dump($WHDDA);
+ if($REPORTDATEDisp!='' && $COMPANY!='' && $WHS!='' && $PLANT!=''){
+ # Case 729: Add Currency code A1SHCURR FROM ICM666M
+ $selectContent = "
+ SELECT A5MACPKR, A5ONO,
+ (SELECT A4REFORD FROM ICM688M1 WHERE A4MACPKR=A5MACPKR) AS A4REFORD,
+ A5PART, A5RSVQTY, A5PACKED, A5RSVQTY - A5PACKED AS CALCULATED_COLUMN,
+ A5SLUNPR * A5PACKED AS ANOTHER_CALCULATED_COLUMN,
+ A5PMPWHT*A5PACKED AS WEIGHT,
+ (SELECT A4SHSHNM FROM ICM688M1 WHERE A4MACPKR=A5MACPKR) AS A4SHSHNM ,
+ SHDT, SHTIME,
+ CASE WHEN SHDT IS NULL THEN (SELECT SHDATA FROM ICM699M WHERE SHMACPKR=A5MACPKR AND SHTYPE='M3-Res-out' AND SHSOURCE='CloseShipmentCoChargeAPI' ORDER BY SHDT DESC, SHTIME DESC FETCH FIRST 1 ROWS ONLY) ELSE '' END AS REASON,
+ A1SHCURR,
+ CASE
+ WHEN (SELECT A4SHIPTYPE FROM ICM688M1 WHERE A4MACPKR=A5MACPKR) = 'LTL'
+ THEN (SELECT A4RATETCP FROM ICM688M1 WHERE A4MACPKR=A5MACPKR) * ".(100.00 - Config::get('arrays.misc.discountCarrierRateForCustomerPriceLTL'))/100 ."
+ ELSE (SELECT A4RATETCP FROM ICM688M1 WHERE A4MACPKR=A5MACPKR) * ".(100.00 - Config::get('arrays.misc.discountCarrierRateForCustomerPriceParcel') )/100 ."
+ END AS FREIGHT,
+ A4SHIPTYPE,
+ A4SHIPVIA1,
+ A4SCAC,
+ A4OFSTRM
+ FROM ICM688M2
+ LEFT JOIN ICM699M ON SHMACPKR=A5MACPKR AND SHTYPE='M3-Res-out' AND SHDATA LIKE 'Success%' AND SHSOURCE='CloseShipmentCoChargeAPI'
+ LEFT JOIN ICM666M ON A1DELNO=A5MACPKR AND A1ONO=A5ONO AND A1PKLN=A5BRADLN
+ LEFT JOIN ICM688M1 ON A4MACPKR=A5MACPKR
+ WHERE A5MACPKR IN (
+ SELECT DISTINCT AYMACPKR
+ FROM ICM695M1
+ WHERE AYSTATUS IN ('Z','z') AND AYAPR8N002 = $REPORTDATEDisp
+ )
+ AND A5CO=$COMPANY AND A5WHS=$WHS AND A5PLANT=$PLANT";
+ // dump($selectContent);
+
+ $ICM688M2 = DB::connection(config('m3.connection', 'pgsql'))
+ ->select($selectContent);
+ // dd($ICM688M2);
+ }
+ else{
+ $ICM688M2 = collect();
+ }
+
+ # Get List of Files
+ $allReportsUrls = [];
+ if ($WHS == '321') {
+ $files = Storage::disk('publicCL')->files();
+ }
+ else{
+ $files = Storage::disk('publicCL')->allFiles($WHS);
+ }
+
+ foreach ($files as $file) {
+ # Get the file URL (if URL is configured in filesystems.php)
+ $url = Storage::disk('publicCL')->url($file);
+ $allReportsUrls[$file] = $url;
+ }
+
+ }
+ catch (\Throwable $th) {
+ Log::error($th);
+ }
+
+ return view('m3::liberty-theme.pages.OrderLinesOfClosed',compact('IC670M','ICM688M2','WHDDA','COMPANY','PLANT','WHS','REPORTDATEDisp','allReportsUrls'));
+ }
+
+ public static function exporttoExcel(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'));
+ ini_set('memory_limit', '1024M');
+
+ try {
+ $SHUSER = m3_user() !== '' ? Str::upper(trim(m3_user())) : '';
+ // dd($SHUSER);
+
+ if ($SHUSER!='') {
+ # Get User CO & WH from Table ICM428M
+ $ICM428M = DB::connection(config('m3.connection', 'pgsql'))->table('icm428m')
+ ->select('R428US','R428CO', 'R428WH','R428PL')
+ ->where('R428US','=',$SHUSER)
+ ->first();
+
+ $R428US = isset($ICM428M->R428US) ? $ICM428M->R428US : ''; # User
+ $COMPANY = isset($ICM428M->R428CO) ? $ICM428M->R428CO : ''; # Company
+ $PLANT = isset($ICM428M->R428PL) ? $ICM428M->R428PL : ''; # Plant
+ $WHS = isset($ICM428M->R428WH) ? $ICM428M->R428WH : ''; # WareHouse
+ }
+
+ # Warehouse Table
+ $IC670M = DB::connection(config('m3.connection', 'pgsql'))->table('ic670m')->get();
+
+ # Get URL PARAMS
+ $urlParams = count($request->all())>0 ? $request->all() : '';
+ // dd($urlParams);
+ $reportDate = isset($urlParams["REPORTDATE"]) ? \DateTime::createFromFormat('Y-m-d', trim($urlParams["REPORTDATE"]))->format('Ymd') : today()->format('Ymd');
+ $toreportDate = isset($urlParams["TOREPORTDATE"]) ? \DateTime::createFromFormat('Y-m-d', trim($urlParams["TOREPORTDATE"]))->format('Ymd') : today()->format('Ymd');
+
+ $reportDateWD = isset($urlParams["REPORTDATE"]) ? trim($urlParams["REPORTDATE"]) : today()->format('Y-m-d');
+ $toreportDateWD = isset($urlParams["TOREPORTDATE"]) ? trim($urlParams["TOREPORTDATE"]) : today()->format('Y-m-d');
+
+ $WHDDA = $COMPANY.$PLANT.$WHS;
+ // dump($WHDDA);
+ if($reportDate!='' && $COMPANY!='' && $WHS!='' && $PLANT!=''){
+ # Case 729: Add Currency code A1SHCURR FROM ICM666M
+ $selectContent = "
+ SELECT (SHDT || ' ' || SHTIME) AS DATECLOSED, A5MACPKR, A5ONO,
+ A4OFSTRM,
+ A5PMPWHT*A5PACKED AS WEIGHT,
+ A4SCAC,
+ A4SHIPTYPE,
+ (SELECT A4REFORD FROM ICM688M1 WHERE A4MACPKR=A5MACPKR) AS A4REFORD,
+ A5PART, A5RSVQTY, A5PACKED, A5RSVQTY - A5PACKED AS CALCULATED_COLUMN,
+ A5SLUNPR * A5PACKED AS ANOTHER_CALCULATED_COLUMN,
+ (SELECT A4SHSHNM FROM ICM688M1 WHERE A4MACPKR=A5MACPKR) AS A4SHSHNM ,
+ CASE WHEN SHDT IS NULL THEN (SELECT SHDATA FROM ICM699M WHERE SHMACPKR=A5MACPKR AND SHTYPE='M3-Res-out' AND SHSOURCE='CloseShipmentCoChargeAPI' ORDER BY SHDT DESC, SHTIME DESC FETCH FIRST 1 ROWS ONLY) ELSE '' END AS REASON,
+ A1SHCURR,
+ CASE
+ WHEN (SELECT A4SHIPTYPE FROM ICM688M1 WHERE A4MACPKR=A5MACPKR) = 'LTL'
+ THEN (SELECT A4RATETCP FROM ICM688M1 WHERE A4MACPKR=A5MACPKR) * ".(100.00 - Config::get('arrays.misc.discountCarrierRateForCustomerPriceLTL'))/100 ."
+ ELSE (SELECT A4RATETCP FROM ICM688M1 WHERE A4MACPKR=A5MACPKR) * ".(100.00 - Config::get('arrays.misc.discountCarrierRateForCustomerPriceParcel'))/100 ."
+ END AS FREIGHT
+ FROM ICM688M2
+ LEFT JOIN ICM699M ON SHMACPKR=A5MACPKR AND SHTYPE='M3-Res-out' AND SHDATA LIKE 'Success%' AND SHSOURCE='CloseShipmentCoChargeAPI'
+ LEFT JOIN ICM666M ON A1DELNO=A5MACPKR AND A1ONO=A5ONO AND A1PKLN=A5BRADLN
+ LEFT JOIN ICM688M1 ON A4MACPKR=A5MACPKR
+ WHERE A5MACPKR IN (
+ SELECT DISTINCT AYMACPKR
+ FROM ICM695M1
+ WHERE AYSTATUS IN ('Z','z') AND AYAPR8N002 BETWEEN $reportDate AND $toreportDate
+ )
+ AND A5CO=$COMPANY AND A5WHS=$WHS AND A5PLANT=$PLANT";
+
+ $ICM688M2 = DB::connection(config('m3.connection', 'pgsql'))
+ ->select($selectContent);
+
+ $newItem = ["DATECLOSED" => 'Close Date',"A5MACPKR" => 'Delivery #', "A5ONO" => 'Order #',
+ "A4OFSTRM" => 'Terms',"WEIGHT" => 'Weight',"A4SCAC" => 'Carrier',"A4SHIPTYPE" => 'Mode (Parcel, Air, TL or LTL)',
+ "A4REFORD" => 'Order Type',"A5PART" => 'Part #',"A5RSVQTY" => 'Reserved',
+ "A5PACKED" => 'Packed',"CALCULATED_COLUMN" => 'Back Order Qty',"ANOTHER_CALCULATED_COLUMN" => 'Value Packed $',"A4SHSHNM" => 'Customer name',
+ "REASON" => 'Failure Reason','A1SHCURR'=> 'Currency Code','FREIGHT'=> 'Freight'];
+ $ICM688M2Col = collect($ICM688M2);
+ $ICM688M2Col->prepend($newItem);
+ // dd($ICM688M2Col);
+
+ # Count records before exporting to excel : Max 20K records are allowed
+ $ICM688M2Count = $ICM688M2Col->count();
+ # Set Max allowed records
+ $maxRecords = Config::get('arrays.maxRecCL');
+ if ($ICM688M2Count>$maxRecords) {
+ return redirect()->back()->withInput()->with('message', 'Maximum allowed records for Excel Download is: '.number_format($maxRecords).
+ ' current records: '.number_format($ICM688M2Count) . ' , change your search criteria.');
+ }
+
+ }
+ else{
+ $ICM688M2Col = "";
+ }
+ # Download Excel
+ # Add true at the end to include fields names in the Header
+ return app(\Modules\M3\Services\SpreadsheetExport::class)->download($ICM688M2Col, 'Closedorderlinesreport_'.$reportDateWD.'-'.$toreportDateWD.'.xlsx');
+ // return $ICM688M2Col->downloadExcel('Closedorderlinesreport_'.$reportDateWD.'-'.$toreportDateWD.'.csv',\Maatwebsite\Excel\Excel::CSV,false);
+ }
+ catch (\Throwable $th) {
+ Log::error($th);
+ }
+ }
+
+ public static function StoreExcelToDisk(Request $request){
+ ini_set('max_execution_time', Config::get('arrays.PHPTimeOutCL'));
+ ini_set('max_input_time', Config::get('arrays.PHPTimeOutCL'));
+ ini_set('default_socket_timeout', Config::get('arrays.PHPTimeOutCL'));
+ ini_set('memory_limit', '1024M');
+
+ try {
+ $SHUSER = m3_user() !== '' ? Str::upper(trim(m3_user())) : '';
+ // dd($SHUSER);
+
+ if ($SHUSER!='') {
+ # Get User CO & WH from Table ICM428M
+ $ICM428M = DB::connection(config('m3.connection', 'pgsql'))->table('icm428m')
+ ->select('R428US','R428CO', 'R428WH','R428PL')
+ ->where('R428US','=',$SHUSER)
+ ->first();
+
+ $R428US = isset($ICM428M->R428US) ? $ICM428M->R428US : ''; # User
+ $COMPANY = isset($ICM428M->R428CO) ? $ICM428M->R428CO : ''; # Company
+ $PLANT = isset($ICM428M->R428PL) ? $ICM428M->R428PL : ''; # Plant
+ $WHS = isset($ICM428M->R428WH) ? $ICM428M->R428WH : ''; # WareHouse
+ }
+
+ # Warehouse Table
+ $IC670M = DB::connection(config('m3.connection', 'pgsql'))->table('ic670m')->get();
+
+ # Get URL PARAMS
+ $urlParams = count($request->all())>0 ? $request->all() : '';
+ // dd($urlParams);
+ $reportDate = isset($urlParams["REPORTDATE"]) ? \DateTime::createFromFormat('Y-m-d', trim($urlParams["REPORTDATE"]))->format('Ymd') : today()->format('Ymd');
+ $toreportDate = isset($urlParams["TOREPORTDATE"]) ? \DateTime::createFromFormat('Y-m-d', trim($urlParams["TOREPORTDATE"]))->format('Ymd') : today()->format('Ymd');
+ // dump($reportDate);
+ // dd($toreportDate);
+ $reportDateWD = isset($urlParams["REPORTDATE"]) ? trim($urlParams["REPORTDATE"]) : today()->format('Y-m-d');
+ $toreportDateWD = isset($urlParams["TOREPORTDATE"]) ? trim($urlParams["TOREPORTDATE"]) : today()->format('Y-m-d');
+
+ $WHDDA = $COMPANY.$PLANT.$WHS;
+ // dump($WHDDA);
+ if($reportDate!='' && $COMPANY!='' && $WHS!='' && $PLANT!=''){
+ # Case 729: Add Currency code A1SHCURR FROM ICM666M
+ $ICM688M2 = DB::connection(config('m3.connection', 'pgsql'))
+ ->select("
+ SELECT (SHDT || ' ' || SHTIME) AS DATECLOSED, A5MACPKR, A5ONO,
+ A4OFSTRM,
+ A5PMPWHT*A5PACKED AS WEIGHT,
+ A4SCAC,
+ A4SHIPTYPE,
+ (SELECT A4REFORD FROM ICM688M1 WHERE A4MACPKR=A5MACPKR) AS A4REFORD,
+ A5PART, A5RSVQTY, A5PACKED, A5RSVQTY - A5PACKED AS CALCULATED_COLUMN,
+ A5SLUNPR * A5PACKED AS ANOTHER_CALCULATED_COLUMN,
+ (SELECT A4SHSHNM FROM ICM688M1 WHERE A4MACPKR=A5MACPKR) AS A4SHSHNM ,
+ CASE WHEN SHDT IS NULL THEN (SELECT SHDATA FROM ICM699M WHERE SHMACPKR=A5MACPKR AND SHTYPE='M3-Res-out' AND SHSOURCE='CloseShipmentCoChargeAPI' ORDER BY SHDT DESC, SHTIME DESC FETCH FIRST 1 ROWS ONLY) ELSE '' END AS REASON,
+ A1SHCURR,
+ CASE
+ WHEN (SELECT A4SHIPTYPE FROM ICM688M1 WHERE A4MACPKR=A5MACPKR) = 'LTL'
+ THEN (SELECT A4RATETCP FROM ICM688M1 WHERE A4MACPKR=A5MACPKR) * ".(100.00 - Config::get('arrays.misc.discountCarrierRateForCustomerPriceLTL'))/100 ."
+ ELSE (SELECT A4RATETCP FROM ICM688M1 WHERE A4MACPKR=A5MACPKR) * ".(100.00 - Config::get('arrays.misc.discountCarrierRateForCustomerPriceParcel'))/100 ."
+ END AS FREIGHT
+ FROM ICM688M2
+ LEFT JOIN ICM699M ON SHMACPKR=A5MACPKR AND SHTYPE='M3-Res-out' AND SHDATA LIKE 'Success%' AND SHSOURCE='CloseShipmentCoChargeAPI'
+ LEFT JOIN ICM666M ON A1DELNO=A5MACPKR AND A1ONO=A5ONO AND A1PKLN=A5BRADLN
+ LEFT JOIN ICM688M1 ON A4MACPKR=A5MACPKR
+ WHERE A5MACPKR IN (
+ SELECT DISTINCT AYMACPKR
+ FROM ICM695M1
+ WHERE AYSTATUS IN ('Z','z') AND AYAPR8N002 BETWEEN $reportDate AND $toreportDate
+ )
+ AND A5CO=$COMPANY AND A5WHS=$WHS AND A5PLANT=$PLANT
+ ");
+
+ $newItem = ["DATECLOSED" => 'Close Date',"A5MACPKR" => 'Delivery #', "A5ONO" => 'Order #',
+ "A4OFSTRM" => 'Terms',"WEIGHT" => 'Weight',"A4SCAC" => 'Carrier',"A4SHIPTYPE" => 'Mode (Parcel, Air, TL or LTL)',
+ "A4REFORD" => 'Order Type',"A5PART" => 'Part #',"A5RSVQTY" => 'Reserved',
+ "A5PACKED" => 'Packed',"CALCULATED_COLUMN" => 'Back Order Qty',"ANOTHER_CALCULATED_COLUMN" => 'Value Packed $',"A4SHSHNM" => 'Customer name',
+ "REASON" => 'Failure Reason','A1SHCURR'=> 'Currency Code','FREIGHT'=> 'Freight'];
+ $ICM688M2Col = collect($ICM688M2);
+ $ICM688M2Col->prepend($newItem);
+ // dd($ICM688M2Col);
+
+ # Count records before exporting to excel : Max 20K records are allowed
+ $ICM688M2Count = $ICM688M2Col->count();
+ # Set Max allowed records
+ $maxRecords = Config::get('arrays.maxRecCL');
+ if ($ICM688M2Count>$maxRecords) {
+ return redirect()->back()->withInput()->with('message', 'Maximum allowed records for Excel Download is: '.number_format($maxRecords).
+ ' current records: '.number_format($ICM688M2Count) . ' , change your search criteria.');
+ }
+ }
+ else{
+ $ICM688M2Col = "";
+ }
+
+ if ($WHS == '321') {
+ $prevMonthFile = 'Closedorderlinesreport_'.$reportDateWD.'-'.$toreportDateWD.'.xlsx';
+ }
+ else{
+ $prevMonthFile = $WHS.'/Closedorderlinesreport_'.$reportDateWD.'-'.$toreportDateWD.'-'.$WHS.'.xlsx';
+ }
+
+ # MAK Store the File to Storage
+ app(\Modules\M3\Services\SpreadsheetExport::class)->store($ICM688M2Col, $prevMonthFile, 'publicCL');
+
+ // $ICM688M2Col->storeExcel('Closedorderlinesreport_'.$reportDateWD.'-'.$toreportDateWD.'.csv', 'publicCL',\Maatwebsite\Excel\Excel::CSV);
+
+ // $ICM688M2Col->storeExcel('Closedorderlinesreport_'.$reportDateWD.'-'.$toreportDateWD.'.ods', 'publicCL',\Maatwebsite\Excel\Excel::ODS);
+
+ // dump('Done Saving Excel...');
+ return back();
+ }
+ catch (\Throwable $th) {
+ Log::error($th);
+ }
+ }
+
+ # Download File
+ public static function downloadFiles(Request $request){
+ // dd($request->all());
+ $fileName = $request->filename;
+ if (Storage::disk('publicCL')->exists($fileName)) {
+ # File exists, retrieve content or URL
+ // $content = Storage::disk('publicCL')->get($fileName);
+ $fileUrl = Storage::disk('publicCL')->url($fileName);
+ // dd($fileUrl);
+ $fileNameOnly = strpos($fileName, '/')!= false ? substr($fileName, strpos($fileName, '/') + 1) : $fileName;
+ # Download the file
+ return Storage::disk('publicCL')->download($fileName, $fileNameOnly);
+ } else {
+ // Download the file (use code below)
+ }
+ }
+
+}
diff --git a/Modules/M3/Http/Controllers/ReplenishSettingsController.php b/Modules/M3/Http/Controllers/ReplenishSettingsController.php
new file mode 100644
index 00000000..e195df96
--- /dev/null
+++ b/Modules/M3/Http/Controllers/ReplenishSettingsController.php
@@ -0,0 +1,196 @@
+table('icm658m')->get();
+ # Warehouse Table
+ // $IC670M = DB::connection(config('m3.connection', 'pgsql'))->table('ic670m')->get();
+
+ # Get Logged user Id
+ $userId = m3_user() !== '' ? strtoupper(m3_user()) : '' ;
+ // $userId = 'E1135818'; // Brad : E1135818 Malak : E2011812 ACOM_PDF
+ $ICM428M = DB::connection(config('m3.connection', 'pgsql'))->table('icm428m')
+ ->where('R428US',$userId)
+ ->where('R428STS','A')
+ ->first();
+
+ $userCO = isset($ICM428M->R428CO) ? $ICM428M->R428CO : '';
+ $userPL = isset($ICM428M->R428PL) ? $ICM428M->R428PL : '';
+ $userWH = isset($ICM428M->R428WH) ? $ICM428M->R428WH : '' ;
+
+ if ($userCO!='') {
+ # Warehouse Table
+ $IC670M = DB::connection(config('m3.connection', 'pgsql'))->table('ic670m')
+ ->where('WDCO',$userCO)
+ ->where('WDPL',$userPL)
+ ->where('WDWHS',$userWH)
+ ->get();
+ }
+ else{
+ // $REFCAT658 =[];
+ $IC670M =[];
+ }
+
+ // $sqlstmt="SELECT t1.REFKEY,t2.FULLID ,t2.*
+ // FROM PRDAT.REFERPS t1 LEFT JOIN ( SELECT R658CO,R658PL,R658WH,R658LC,R658PN,R658MQ,R658RQ,R658TL,R658RMQ,
+ // TRIM(R658WH)||TRIM(R658LC)||TRIM(R658PN) AS FULLID FROM EWOBJTST.ICM658M
+ // ) t2 ON t1.REFKEY = t2.FULLID WHERE t1.REFCAT = '658'";
+ // $REFCAT658 = DB::connection(config('m3.connection', 'pgsql'))->select($sqlstmt);
+ // dd($REFCAT658);
+
+ return view('m3::liberty-theme.pages.ReplenishSettings', compact('IC670M'));
+ // 'REFCAT658',
+ }
+
+ public function store(Request $request)
+ {
+ // dd( $request->all() );
+
+ $formInputs = $request->all();
+ $formInputs = array_filter($formInputs);
+ unset($formInputs["_token"]);
+
+ $formInputs['R658IZLCF'] = isset($formInputs['R658IZLCF']) ? $formInputs['R658IZLCF'] : '0';
+ // dd($formInputs);
+
+ $ICM658MINS = ICM658M::insert($formInputs);
+ // dd($ICM658MINS);
+ return redirect()->route('m3.replenishmentSettings.index');
+ }
+
+ public function update(Request $request)
+ {
+ // dd($request->all());
+ $R658PN = (trim($request->R658PN) ?? trim($request->R658PN)) != null ? trim($request->R658PN) : "";
+ $R658CO = (trim($request->R658CO) ?? trim($request->R658CO)) != null ? trim($request->R658CO) : "";
+ $R658PL = (trim($request->R658PL) ?? trim($request->R658PL)) != null ? trim($request->R658PL) : "";
+ $R658WH = (trim($request->R658WH) ?? trim($request->R658WH)) != null ? trim($request->R658WH) : "";
+ $R658MQ = trim($request->R658MQ);
+ $R658RQ = trim($request->R658RQ);
+ $R658RMQ = trim($request->R658RMQ);
+ $R658TL = trim($request->R658TL);
+ $R658IZLCF = (trim($request->R658IZLCF) ?? trim($request->R658IZLCF)) != null ? trim($request->R658IZLCF) : "0";
+
+ DB::connection(config('m3.connection', 'pgsql'))->table('icm658m')
+ ->where('R658PN', $R658PN)
+ ->where('R658CO', $R658CO)
+ ->where('R658PL', $R658PL)
+ ->where('R658WH', $R658WH)
+ ->update([ 'R658MQ'=>$R658MQ,'R658RQ'=>$R658RQ,'R658RMQ'=>$R658RMQ,'R658TL'=>$R658TL,'R658IZLCF'=>$R658IZLCF ]);
+
+ return redirect()->route('m3.replenishmentSettings.index');
+ }
+
+ public function deleteRec(Request $request)
+ {
+ // dd( $request->all() );
+ $R658PN = trim($request->R658PN);
+ $R658CO = trim($request->R658CO);
+ $R658LC = trim($request->R658LC);
+ $R658PL = trim($request->R658PL);
+ $R658WH = trim($request->R658WH);
+
+ $deleteRecord = DB::connection(config('m3.connection', 'pgsql'))->table('icm658m')
+ ->where('R658PN', $R658PN)
+ ->where('R658CO', $R658CO)
+ ->where('R658LC', $R658LC)
+ ->where('R658PL', $R658PL)
+ ->where('R658WH', $R658WH)
+ ->delete();
+
+ return response()->json(['success'=>'Record Deleted']);
+ }
+
+ public function checkRecExit(Request $request)
+ {
+ // dd( $request->all() );
+ $params = array();
+ parse_str($request['data'], $params);
+ $paramsObj = (object)$params;
+ // dd($paramsObj);
+
+ $R658PN = trim($paramsObj->R658PN);
+ $R658CO = trim($paramsObj->R658CO);
+ $R658LC = trim($paramsObj->R658LC);
+ $R658PL = trim($paramsObj->R658PL);
+ $R658WH = trim($paramsObj->R658WH);
+
+ $recordExistSQL = DB::connection(config('m3.connection', 'pgsql'))->table('icm658m')
+ ->where('R658PN', $R658PN)
+ ->where('R658CO', $R658CO)
+ ->where('R658LC', $R658LC)
+ ->where('R658PL', $R658PL)
+ ->where('R658WH', $R658WH)
+ ->first();
+ // dd($recordExists);
+ $recordExists = $recordExistSQL == null ? true : false;
+
+ return response()->json(['recordExists'=>$recordExists]);
+ }
+
+ public function datatables(Request $request){
+ # Replenishment Table
+ // $REFCAT658 = DB::connection(config('m3.connection', 'pgsql'))->table('icm658m')->get();
+ # Warehouse Table
+ // $IC670M = DB::connection(config('m3.connection', 'pgsql'))->table('ic670m')->get();
+
+ # Get Logged user Id
+ $userId = m3_user() !== '' ? strtoupper(m3_user()) : '' ;
+ // $userId = 'E1135818'; // Brad : E1135818 Malak : E2011812 ACOM_PDF
+ $ICM428M = DB::connection(config('m3.connection', 'pgsql'))->table('icm428m')
+ ->where('R428US',$userId)
+ ->where('R428STS','A')
+ ->first();
+
+ $userCO = isset($ICM428M->R428CO) ? $ICM428M->R428CO : '';
+ $userPL = isset($ICM428M->R428PL) ? $ICM428M->R428PL : '';
+ $userWH = isset($ICM428M->R428WH) ? $ICM428M->R428WH : '' ;
+
+ if ($userCO!='') {
+ # Replenishment Table
+ $REFCAT658 = DB::connection(config('m3.connection', 'pgsql'))->table('icm658m')
+ ->select('*')
+ ->where('R658CO',$userCO)
+ ->where('R658PL',$userPL)
+ ->where('R658WH',$userWH)
+ ->orderBy('R658CO','asc');
+
+ # Warehouse Table
+ // $IC670M = DB::connection(config('m3.connection', 'pgsql'))->table('ic670m')
+ // ->where('WDCO',$userCO)
+ // ->where('WDPL',$userPL)
+ // ->where('WDWHS',$userWH)
+ // ->get();
+ }
+ else{
+ $REFCAT658 =[];
+ // $IC670M =[];
+ }
+
+ // $sqlstmt="SELECT t1.REFKEY,t2.FULLID ,t2.*
+ // FROM PRDAT.REFERPS t1 LEFT JOIN ( SELECT R658CO,R658PL,R658WH,R658LC,R658PN,R658MQ,R658RQ,R658TL,R658RMQ,
+ // TRIM(R658WH)||TRIM(R658LC)||TRIM(R658PN) AS FULLID FROM EWOBJTST.ICM658M
+ // ) t2 ON t1.REFKEY = t2.FULLID WHERE t1.REFCAT = '658'";
+ // $REFCAT658 = DB::connection(config('m3.connection', 'pgsql'))->select($sqlstmt);
+ // dd($REFCAT658);
+
+ // dd( Datatables::of($REFCAT658)->addIndexColumn()->make(true) );
+
+ return Datatables::of($REFCAT658)->addIndexColumn()->make(true);
+ }
+
+}
diff --git a/Modules/M3/Http/Controllers/ShipToController.php b/Modules/M3/Http/Controllers/ShipToController.php
new file mode 100644
index 00000000..66684669
--- /dev/null
+++ b/Modules/M3/Http/Controllers/ShipToController.php
@@ -0,0 +1,187 @@
+ajax()) {
+ $data = ShipTo::select('*');
+
+ return Datatables::of($data)
+ ->addIndexColumn()
+ ->addColumn('checkbox', function ($row) {
+ return '';
+ })
+ ->addColumn('action', function ($row) {
+ $actionBtn = 'Edit ';
+ $actionBtn .= '';
+ return $actionBtn;
+ })
+ ->rawColumns(['checkbox', 'action'])
+ ->make(true);
+ }
+ return view('m3::liberty-theme.pages.ship-to.index');
+ }
+
+ public function create()
+ {
+ # US
+ $USstates = \Modules\M3\Helpers\USStates::all();
+ # CA
+ $CAstates = \Modules\M3\Helpers\CAProvinces::all();
+
+ # All States
+ $states = array_merge($USstates, $CAstates);
+
+ return view('m3::liberty-theme.pages.ship-to.create', compact('states'));
+ }
+
+ public function store(Request $request)
+ {
+ $validated = $request->validate(
+ [
+ 'AUSTCN' => 'nullable|max:11',
+ 'AUSHSHNM' => 'required|max:36',
+ 'AUSHSHA1' => 'required|max:36',
+ 'AUSHSHA2' => 'required|max:36',
+ 'AUSHSHA3' => 'nullable|max:36',
+ 'AUSHSHA4' => 'nullable|max:36',
+ 'AUSHSHCI' => 'required|max:20',
+ 'AUSHSHST' => 'required|max:2',
+ 'AUSHSHZP' => 'required|max:10',
+ 'AUSHSHCT' => 'required|max:3',
+ 'AUSHWHS' => 'required|max:3'
+ ],
+ [
+ 'AUSHSHNM.required' => 'Name is required',
+ 'AUSHSHA1.required' => 'Address 1 is required',
+ 'AUSHSHA2.required' => 'Address 2 is required',
+ 'AUSHSHCI.required' => 'City is required',
+ 'AUSHSHST.required' => 'State is required',
+ 'AUSHSHZP.required' => 'Zip code is required',
+ 'AUSHSHCT.required' => 'Country is required',
+ 'AUSHWHS.required' => 'Warehouse is required',
+
+ 'AUSTCN.max' => 'Customer Number cannot exceed 11 characters',
+ 'AUSHSHNM.max' => 'Name cannot exceed 36 characters',
+ 'AUSHSHA1.max' => 'Address 1 cannot exceed 36 characters',
+ 'AUSHSHA2.max' => 'Address 2 cannot exceed 36 characters',
+ 'AUSHSHA3.max' => 'Address 3 cannot exceed 36 characters',
+ 'AUSHSHA4.max' => 'Address 4 cannot exceed 36 characters',
+ 'AUSHSHCI.max' => 'City cannot exceed 20 characters',
+ 'AUSHSHST.max' => 'State cannot exceed 2 characters',
+ 'AUSHSHZP.max' => 'Zip code cannot exceed 10 characters',
+ 'AUSHSHCT.max' => 'Country cannot exceed 3 characters',
+ 'AUSHWHS.max' => 'Warehouse cannot exceed 3 characters'
+ ]
+ );
+ $validated['AUSTCN'] = $validated['AUSTCN'] ?? ' ';
+
+ $model = new ShipTo();
+ $model->fill($validated);
+ $success = $model->save();
+ // ShipTo::create($validated);
+ if ($success) {
+ return redirect()->route('m3.ship-to.index')->with('success', 'Record created successfully.');
+ } else {
+ return redirect()->back()
+ ->withErrors(['unique' => 'The combination of ZipCode and Warehouse must be unique.'])
+ ->withInput();
+ }
+ }
+
+ public function edit($aushshzp, $aushwhs)
+ {
+ # US
+ $USstates = \Modules\M3\Helpers\USStates::all();
+ # CA
+ $CAstates = \Modules\M3\Helpers\CAProvinces::all();
+
+ # All States
+ $states = array_merge($USstates, $CAstates);
+
+ $shipTo = ShipTo::where('AUSHSHZP', $aushshzp)
+ ->where('AUSHWHS', $aushwhs)
+ ->firstOrFail();
+ return view('m3::liberty-theme.pages.ship-to.edit', compact('shipTo', 'states'));
+ }
+
+ public function update(Request $request, $aushshzp, $aushwhs)
+ {
+ $validated = array_map(function ($value) {
+ return $value === null ? '' : $value;
+ }, $request->validate(
+ [
+ 'AUSTCN' => 'nullable|string|max:11',
+ 'AUSHSHNM' => 'required|max:36',
+ 'AUSHSHA1' => 'required|max:36',
+ 'AUSHSHA2' => 'required|max:36',
+ 'AUSHSHA3' => 'nullable|string|max:36',
+ 'AUSHSHA4' => 'nullable|string|max:36',
+ 'AUSHSHCI' => 'required|max:20',
+ 'AUSHSHST' => 'required|max:2',
+ 'AUSHSHCT' => 'required|max:3'
+ ],
+ [
+ 'AUSHSHNM.required' => 'Name is required',
+ 'AUSHSHA1.required' => 'Address 1 is required',
+ 'AUSHSHA2.required' => 'Address 2 is required',
+ 'AUSHSHCI.required' => 'City is required',
+ 'AUSHSHST.required' => 'State is required',
+ 'AUSHSHZP.required' => 'Zip code is required',
+ 'AUSHSHCT.required' => 'Country is required',
+ 'AUSHWHS.required' => 'Warehouse is required',
+
+ 'AUSTCN.max' => 'Customer Number cannot exceed 11 characters',
+ 'AUSHSHNM.max' => 'Name cannot exceed 36 characters',
+ 'AUSHSHA1.max' => 'Address 1 cannot exceed 36 characters',
+ 'AUSHSHA2.max' => 'Address 2 cannot exceed 36 characters',
+ 'AUSHSHA3.max' => 'Address 3 cannot exceed 36 characters',
+ 'AUSHSHA4.max' => 'Address 4 cannot exceed 36 characters',
+ 'AUSHSHCI.max' => 'City cannot exceed 20 characters',
+ 'AUSHSHST.max' => 'State cannot exceed 2 characters',
+ 'AUSHSHZP.max' => 'Zip code cannot exceed 10 characters',
+ 'AUSHSHCT.max' => 'Country cannot exceed 3 characters',
+ 'AUSHWHS.max' => 'Warehouse cannot exceed 3 characters'
+ ]
+ ));
+
+ $updated = ShipTo::where('AUSHSHZP', $aushshzp)
+ ->where('AUSHWHS', $aushwhs)
+ ->update($validated);
+
+ if ($updated) {
+ return redirect()->route('m3.ship-to.index')->with('success', 'Record updated successfully.');
+ } else {
+ return redirect()->route('m3.ship-to.index')->with('error', 'Record could not be updated.');
+ }
+ }
+
+ public function destroy($aushshzp, $aushwhs)
+ {
+ $deleted = ShipTo::where('AUSHSHZP', $aushshzp)
+ ->where('AUSHWHS', $aushwhs)
+ ->delete();
+
+ if ($deleted) {
+ return redirect()->route('m3.ship-to.index')->with('success', 'Record deleted successfully.');
+ } else {
+ return redirect()->route('m3.ship-to.index')->with('error', 'Record not found or could not be deleted.');
+ }
+
+ }
+
+}
diff --git a/Modules/M3/Http/Controllers/WhsPerfMetrics.php b/Modules/M3/Http/Controllers/WhsPerfMetrics.php
new file mode 100644
index 00000000..929c25f4
--- /dev/null
+++ b/Modules/M3/Http/Controllers/WhsPerfMetrics.php
@@ -0,0 +1,115 @@
+table('icm428m')
+ ->select('R428US','R428CO', 'R428WH','R428PL')
+ ->where('R428US','=',$SHUSER)
+ ->first();
+
+ $R428US = isset($ICM428M->R428US) ? $ICM428M->R428US : ''; # User
+ $COMPANY = isset($ICM428M->R428CO) ? $ICM428M->R428CO : '110'; # Company
+ $PLANT = isset($ICM428M->R428PL) ? $ICM428M->R428PL : '144'; # Plant
+ $WHS = isset($ICM428M->R428WH) ? $ICM428M->R428WH : '322'; # WareHouse
+ }
+
+ # Warehouse Table
+ $IC670M = DB::connection(config('m3.connection', 'pgsql'))->table('ic670m')->get();
+
+ # Get URL PARAMS
+ $urlParams = count($request->all())>0 ? $request->all() : '';
+ // dump($urlParams);
+ $REPORTDATEDisp = isset($urlParams["REPORTDATEDisp"]) ? \DateTime::createFromFormat('Y-m-d', trim($urlParams["REPORTDATEDisp"]))->format('Ymd') : today()->format('Ymd');
+
+ $WHDDA = $COMPANY.$PLANT.$WHS;
+ // dump($WHDDA);
+ if($REPORTDATEDisp!='' && $COMPANY!='' && $WHS!='' && $PLANT!=''){
+ # Case 729: Add Currency code A1SHCURR FROM ICM666M
+ $selectContent = "
+ SELECT A5MACPKR, A5ONO,
+ (SELECT A4REFORD FROM ICM688M1 WHERE A4MACPKR=A5MACPKR) AS A4REFORD,
+ A5PART, A5RSVQTY, A5PACKED, A5RSVQTY - A5PACKED AS CALCULATED_COLUMN,
+ A5SLUNPR * A5PACKED AS ANOTHER_CALCULATED_COLUMN,
+ (SELECT A4SHSHNM FROM ICM688M1 WHERE A4MACPKR=A5MACPKR) AS A4SHSHNM ,
+ SHDT, SHTIME,
+ CASE WHEN SHDT IS NULL THEN (SELECT SHDATA FROM ICM699M WHERE SHMACPKR=A5MACPKR AND SHTYPE='M3-Res-out' AND SHSOURCE='CloseShipmentCoChargeAPI' ORDER BY SHDT DESC, SHTIME DESC FETCH FIRST 1 ROWS ONLY) ELSE '' END AS REASON,
+ A1SHCURR,
+ CASE
+ WHEN (SELECT A4SHIPTYPE FROM ICM688M1 WHERE A4MACPKR=A5MACPKR) = 'LTL'
+ THEN (SELECT A4RATETCP FROM ICM688M1 WHERE A4MACPKR=A5MACPKR) * ".(100.00 - Config::get('arrays.misc.discountCarrierRateForCustomerPriceLTL'))/100 ."
+ ELSE (SELECT A4RATETCP FROM ICM688M1 WHERE A4MACPKR=A5MACPKR) * ".(100.00 - Config::get('arrays.misc.discountCarrierRateForCustomerPriceParcel') )/100 ."
+ END AS FREIGHT
+ FROM ICM688M2
+ LEFT JOIN ICM699M ON SHMACPKR=A5MACPKR AND SHTYPE='M3-Res-out' AND SHDATA LIKE 'Success%' AND SHSOURCE='CloseShipmentCoChargeAPI'
+ LEFT JOIN ICM666M ON A1DELNO=A5MACPKR AND A1ONO=A5ONO AND A1PKLN=A5BRADLN
+ WHERE A5MACPKR IN (
+ SELECT DISTINCT AYMACPKR
+ FROM ICM695M1
+ WHERE AYSTATUS IN ('Z','z') AND AYAPR8N002 = $REPORTDATEDisp
+ )
+ AND A5CO=$COMPANY AND A5WHS=$WHS AND A5PLANT=$PLANT";
+ // dump($selectContent);
+
+ $ICM688M2 = DB::connection(config('m3.connection', 'pgsql'))
+ ->select($selectContent);
+ // dd($ICM688M2);
+ }
+ else{
+ $ICM688M2 = collect();
+ }
+
+ # Get List of Files
+ $allReportsUrls = [];
+ $files = Storage::disk('publicLabels')->allFiles('WhsPerf/'.$WHS);
+ // $whsPerfFile = 'WhsPerf/'.$WHS.'/WhsPerfMetrics_'.$DateToday.'-'.$WHS.'.xlsx';
+
+ foreach ($files as $file) {
+ # Get the file URL (if URL is configured in filesystems.php)
+ $url = Storage::disk('publicLabels')->url($file);
+ $allReportsUrls[$file] = $url;
+ }
+ // dd($allReportsUrls);
+ }
+ catch (\Throwable $th) {
+ Log::error($th);
+ }
+
+ return view('m3::liberty-theme.pages.WhsPerfMetrics',compact('IC670M','WHDDA','COMPANY','PLANT','WHS','allReportsUrls'));
+ }
+
+
+ # Download File
+ public static function downloadFiles(Request $request){
+ // dd($request->all());
+ $fileName = $request->filename;
+ if (Storage::disk('publicLabels')->exists($fileName)) {
+ # File exists, retrieve content or URL
+ $fileUrl = Storage::disk('publicLabels')->url($fileName);
+ $fileNameOnly = basename($fileName);
+ # Download the file
+ return Storage::disk('publicLabels')->download($fileName, $fileNameOnly);
+ } else {
+ // Download the file (use code below)
+ }
+ }
+
+}
diff --git a/Modules/M3/Http/Controllers/authController.php b/Modules/M3/Http/Controllers/authController.php
new file mode 100644
index 00000000..57b48cdd
--- /dev/null
+++ b/Modules/M3/Http/Controllers/authController.php
@@ -0,0 +1,12 @@
+select("
+ select canum, canam, substr(CATPID,1,3) as TwoshipCarrierCode, substr(CATPID,4,1) as ParcelCarrierCode, caspr10A01, caspr1A01
+ from icm160m WHERE CACO='$UserCO'");
+ $power_user = DB::connection(config('m3.connection', 'pgsql'))->select("select R428PWRUSR, R428CO, R428PL, R428WH from ICM428M where R428US='".strtoUpper(m3_user())."'");
+ return view('m3::liberty-theme.pages.carrierMaint', compact('ICM160M','power_user'));
+
+ }
+
+ # Process data from Add modal
+ public static function savecarrierAdd(Request $request) {
+ $currentUser = Helper::getUserCOWHSPLT();
+ $UserCO = $currentUser['UserCO'] ?? '';
+ // $UserWHS = $currentUser['UserWHS'] ?? '';
+ // $UserPL = $currentUser['UserPL'] ?? '';
+
+ # Insert record to ICM160M
+ # Verify record does not already exist in ICM160M
+ if($request->CANUM == NULL) {
+ return "null";
+ }
+ $icm160m=DB::connection(config('m3.connection', 'pgsql'))->select("select count(*) as COUNT1 from ICM160M where CANUM='$request->CANUM' AND CACO='$UserCO'");
+ if($icm160m[0]->COUNT1=="1") {
+ return "exists";
+ } else {
+ $CASPR10A01 = isset($request->CASPR10A01) && $request->CASPR10A01 != NULL ? $request->CASPR10A01 : ' ';
+ $CASPR1A01 = isset($request->CASPR1A01) && $request->CASPR1A01 != NULL ? $request->CASPR1A01 : ' ';
+
+ $data=['CANUM'=>$request->CANUM, 'CANAM'=>$request->CANAM,
+ 'CATPID'=>str_pad(substr($request->TWOSHIPCARRIERCODE,0,3),3," ").substr($request->PARCELCARRIERCODE,0,1),
+ 'CASPR10A01'=>$CASPR10A01, 'CASPR1A01'=>$CASPR1A01,'CACO'=>$UserCO]; // ,'CAPLNT'=>$UserPL,'CAWHS'=>$UserWHS
+ $insertSQL = DB::connection(config('m3.connection', 'pgsql'))->table('icm160m')->insert($data);
+ if($insertSQL) {
+ return "success";
+ }
+ }
+ }
+ public static function savecarrierAdd2(Request $request) {
+ $currentUser = Helper::getUserCOWHSPLT();
+ $UserCO = $currentUser['UserCO'] ?? '';
+ // $UserWHS = $currentUser['UserWHS'] ?? '';
+ // $UserPL = $currentUser['UserPL'] ?? '';
+
+ # Insert record to ICM160M
+ if($request->CANUM == NULL) {
+ return "null";
+ }
+
+ $CASPR10A01 = isset($request->CASPR10A01) && $request->CASPR10A01 != NULL ? $request->CASPR10A01 : ' ';
+ $CASPR1A01 = isset($request->CASPR1A01) && $request->CASPR1A01 != NULL ? $request->CASPR1A01 : ' ';
+
+ $data=['CANUM'=>$request->CANUM, 'CANAM'=>$request->CANAM, 'CATPID'=>str_pad(substr($request->TWOSHIPCARRIERCODE,0,3),3," ").substr($request->PARCELCARRIERCODE,0,1),
+ 'CASPR10A01'=>$CASPR10A01, 'CASPR1A01'=>$CASPR1A01,'CACO'=>$UserCO]; // ,'CAPLNT'=>$UserPL,'CAWHS'=>$UserWHS
+ $insertSQL = DB::connection(config('m3.connection', 'pgsql'))->table('icm160m')->insert($data);
+ if($insertSQL) {
+ return "success";
+ }
+
+ }
+
+ # Process data from Edit modal
+ public static function savecarrierEdit(Request $request) {
+ $currentUser = Helper::getUserCOWHSPLT();
+ $UserCO = $currentUser['UserCO'] ?? '';
+
+ if($request->CANUM == NULL) {
+ return "null";
+ }
+ DB::connection(config('m3.connection', 'pgsql'))->update("update ICM160M
+ set CANAM='$request->CANAM', CATPID='".str_pad(substr($request->TWOSHIPCARRIERCODE,0,3),3," ").substr($request->PARCELCARRIERCODE,0,1)."',
+ CASPR10A01='$request->CASPR10A01', CASPR1A01='$request->CASPR1A01'
+ where CANUM='$request->CANUM' AND CACO='$UserCO'");
+
+ return "success";
+
+ }
+
+}
diff --git a/Modules/M3/Http/Controllers/dashboardController.php b/Modules/M3/Http/Controllers/dashboardController.php
new file mode 100644
index 00000000..8b876df0
--- /dev/null
+++ b/Modules/M3/Http/Controllers/dashboardController.php
@@ -0,0 +1,13 @@
+ajax()) {
+ // dump($request->all());
+ $WHDDA = isset($request->WHDDA) ? $request->WHDDA : array();
+ $WHArr = array();
+ foreach ($WHDDA as $key => $WHDDAV) {
+ $CO = substr($WHDDAV, 0, 3);
+ // $R428PL = substr($WHDDAV, 3, 3);
+ $WHArr[] = substr($WHDDAV, 6, 3);
+ }
+
+ $reportPeriod = isset($request->reportPeriod) ? $request->reportPeriod : ''; # monthly , quarter , year , daily
+ # Current
+ $checkSales = isset($request->checkSales) ? $request->checkSales : ''; # on
+ $checkWeight = isset($request->checkWeight) ? $request->checkWeight : ''; # on
+ $checkLines = isset($request->checkLines) ? $request->checkLines : ''; # on
+
+ if(count($WHArr)>0 && $CO!='' && $reportPeriod!=''){
+ switch ($reportPeriod) {
+ case 'year':
+ # Set Dates based on reportPeriod type
+ $firstDay = isset($request->REPORTDATE) ? \DateTime::createFromFormat('Y-m', $request->REPORTDATE) : '';
+ $reportDate = $firstDay->modify('first day of January')->format('Ymd');
+
+ $lastDay = isset($request->TOREPORTDATE) ? \DateTime::createFromFormat('Y-m', trim($request->TOREPORTDATE)) : '';
+ $toreportDate = $lastDay->modify('last day of December')->format('Ymd');
+
+ # Build SQL
+ $selectContent = "with tempfile as (
+ select a5rsvqty,a5packed,a5slunpr*a5packed as dollars,a5lnwght,a5whs,
+ (select max(ayapr8N002) as ayapr8N002 from icm695m1 where a5macpkr=aymacpkr fetch first 1 rows only)
+ from icm688m2 where a5macpkr in (
+ select distinct aymacpkr from icm695m1 where (AYSTATUS in ('Z','z') and ayapr8N002>=$reportDate and ayapr8N002<=$toreportDate )
+ ) and a5co='".$CO."' and a5whs in(".implode(",", $WHArr).")
+ )
+ select substr(ayapr8N002,1,4) as years,count(*) as lines,sum(a5rsvqty) as reserveqty,sum(a5packed) as packed,sum(a5lnwght*a5packed/a5rsvqty) as weight,sum(dollars) as dollars,a5whs as whs from tempfile
+ group by substr(ayapr8N002,1,4),a5whs order by 1 ";
+ break;
+
+ case 'quarter':
+ # Set Dates based on reportPeriod type
+ $firstDay = isset($request->REPORTDATE) ? \DateTime::createFromFormat('Y-m', $request->REPORTDATE) : '';
+ $reportDate = $firstDay->modify('first day of January')->format('Ymd');
+
+ $lastDay = isset($request->TOREPORTDATE) ? \DateTime::createFromFormat('Y-m', trim($request->TOREPORTDATE)) : '';
+ $toreportDate = $lastDay->modify('last day of December')->format('Ymd');
+
+ # Build SQL
+ $selectContent = "with tempfile as (
+ select a5rsvqty,a5packed,a5slunpr*a5packed as dollars,a5lnwght,a5whs,
+ (select max(ayapr8N002) as ayapr8N002 from icm695m1 where a5macpkr=aymacpkr fetch first 1 rows only)
+ from icm688m2 where a5macpkr in (
+ select distinct aymacpkr from icm695m1 where (AYSTATUS in ('Z','z') and ayapr8N002>=$reportDate and ayapr8N002<=$toreportDate )
+ ) and a5co='".$CO."' and a5whs in (".implode(",", $WHArr).")
+ )
+ select substr(ayapr8N002,3,2) ||'-' || 'Q' || EXTRACT(QUARTER FROM TO_DATE(CAST(ayapr8n002 AS TEXT),'YYYYMMDD')) as years,count(*) as lines,
+ sum(a5rsvqty) as reserveqty, sum(a5packed) as packed,sum (a5lnwght*a5packed/a5rsvqty) as weight,sum(dollars) as dollars, a5whs as whs
+ from tempfile
+ group by substr(ayapr8N002,3,2) ||'-' || 'Q' || EXTRACT(QUARTER FROM TO_DATE(CAST(ayapr8n002 AS TEXT),'YYYYMMDD')),a5whs order by 1 ";
+ break;
+
+ case 'monthly':
+ # Set Dates based on reportPeriod type
+ $firstDay = isset($request->REPORTDATE) ? \DateTime::createFromFormat('Y-m', $request->REPORTDATE) : '';
+ $reportDate = $firstDay->modify('first day of this month')->format('Ymd');
+
+ $lastDay = isset($request->TOREPORTDATE) ? \DateTime::createFromFormat('Y-m', trim($request->TOREPORTDATE)) : '';
+ $toreportDate =$lastDay->modify('last day of this month')->format('Ymd');
+
+ # Build SQL
+ $selectContent = "with tempfile as (
+ select a5rsvqty,a5packed,a5slunpr*a5packed as dollars,a5lnwght,a5whs,
+ (select max(ayapr8N002) as ayapr8N002 from icm695m1 where a5macpkr=aymacpkr fetch first 1 rows only)
+ from icm688m2 where a5macpkr in (
+ select distinct aymacpkr from icm695m1 where (AYSTATUS in ('Z','z') and ayapr8N002>=$reportDate and ayapr8N002<=$toreportDate )
+ ) and a5co='".$CO."' and a5whs in (".implode(",", $WHArr).")
+ )
+ select substr(ayapr8N002,1,4) || '-' || substr(ayapr8N002,5,2) as years,count(*) as lines,sum(a5rsvqty) as reserveqty,sum(a5packed) as packed,
+ sum(a5lnwght*a5packed/a5rsvqty) as weight,sum(dollars) as dollars, a5whs as whs
+ from tempfile
+ group by substr(ayapr8N002,1,4) || '-' || substr(ayapr8N002,5,2),a5whs order by 1 ";
+ break;
+
+ case 'custom':
+ # Set Dates based on reportPeriod type
+ $firstDay = isset($request->REPORTDATE) ? \DateTime::createFromFormat('Y-m', $request->REPORTDATE) : '';
+ $reportDate = $firstDay->modify('first day of this month')->format('Ymd');
+
+ $toreportDate = $firstDay->modify('last day of this month')->format('Ymd');
+ // $lastDay = isset($request->TOREPORTDATE) ? \DateTime::createFromFormat('Y-m', trim($request->TOREPORTDATE)) : '';
+ // $toreportDate =$lastDay->modify('last day of this month')->format('Ymd');
+
+ # Build SQL
+ $selectContent = "with tempfile as (
+ select a5rsvqty,a5packed,a5slunpr*a5packed as dollars,a5lnwght,a5whs,
+ (select max(ayapr8N002) as ayapr8N002 from icm695m1 where a5macpkr=aymacpkr fetch first 1 rows only)
+ from icm688m2 where a5macpkr in (
+ select distinct aymacpkr from icm695m1 where (AYSTATUS in ('Z','z') and ayapr8N002>=$reportDate and ayapr8N002<=$toreportDate )
+ ) and a5co='".$CO."' and a5whs in (".implode(",", $WHArr).")
+ )
+ select substr(ayapr8N002,7,2) as years,count(*) as lines,sum(a5rsvqty) as reserveqty,sum(a5packed) as packed,
+ sum(a5lnwght*a5packed/a5rsvqty) as weight, sum(dollars) as dollars, a5whs as whs
+ from tempfile
+ group by substr(ayapr8N002,7,2),a5whs order by 1 ";
+ break;
+
+ default:
+ $selectContent = "";
+ break;
+ }
+ // dump($reportDate);
+ // dump($toreportDate);
+ // dump($selectContent);
+
+ $execSummaryRes = DB::connection(config('m3.connection', 'pgsql'))->select($selectContent);
+ }
+ else{
+ $execSummaryRes = collect();
+ }
+ // dump($execSummaryRes);
+
+ return response()->json(['success'=>true,'reportPeriod'=> $reportPeriod, 'result'=>$execSummaryRes, 'checkSales'=>$checkSales,
+ 'checkWeight'=>$checkWeight, 'checkLines'=>$checkLines]);
+ }
+
+ # Init Page
+ $SHUSER = m3_user() !== '' ? Str::upper(trim(m3_user())) : '';
+ // dd($SHUSER);
+ if ($SHUSER!='') {
+ # Get User CO & WH from Table ICM428M
+ $ICM428M = DB::connection(config('m3.connection', 'pgsql'))->table('icm428m')
+ ->select('R428US','R428CO', 'R428WH','R428PL')
+ ->where('R428US','=',$SHUSER)
+ ->first();
+
+ $R428US = isset($ICM428M->R428US) ? $ICM428M->R428US : ''; # User
+ $COMPANY = isset($ICM428M->R428CO) ? $ICM428M->R428CO : '110'; # Company
+ $PLANT = isset($ICM428M->R428PL) ? $ICM428M->R428PL : '144'; # Plant
+ $WHS = isset($ICM428M->R428WH) ? $ICM428M->R428WH : '322'; # WareHouse
+ }
+ $WHDDA = $COMPANY.$PLANT.$WHS;
+ // dump($WHDDA);
+ # Warehouse Table
+ $IC670M = DB::connection(config('m3.connection', 'pgsql'))->table('ic670m')->get();
+ }
+ catch (\Throwable $th) {
+ Log::error($th);
+ }
+
+ return view('m3::liberty-theme.pages.execSummary',compact('IC670M','WHDDA'));
+ // ,'ICM688M2',,'COMPANY','PLANT','WHS','reportDate'
+ }
+}
diff --git a/Modules/M3/Http/Controllers/execSummaryLineController.php b/Modules/M3/Http/Controllers/execSummaryLineController.php
new file mode 100644
index 00000000..cad75c8f
--- /dev/null
+++ b/Modules/M3/Http/Controllers/execSummaryLineController.php
@@ -0,0 +1,205 @@
+ajax()) {
+ // dump($request->all());
+ $WHDDA = isset($request->WHDDA) ? $request->WHDDA : array();
+ $WHArr = array();
+ foreach ($WHDDA as $key => $WHDDAV) {
+ $CO = substr($WHDDAV, 0, 3);
+ // $R428PL = substr($WHDDAV, 3, 3);
+ $WHArr[] = substr($WHDDAV, 6, 3);
+ }
+
+ $reportPeriod = isset($request->reportPeriod) ? $request->reportPeriod : ''; # monthly , quarter , year , daily
+ # Current
+ $checkSales = isset($request->checkSales) ? $request->checkSales : ''; # on
+ $checkWeight = isset($request->checkWeight) ? $request->checkWeight : ''; # on
+ $checkLines = isset($request->checkLines) ? $request->checkLines : ''; # on
+
+ if(count($WHArr)>0 && $CO!='' && $reportPeriod!=''){
+ switch ($reportPeriod) {
+ case 'year':
+ # Set Dates based on reportPeriod type
+ $firstDay = isset($request->REPORTDATE) ? \DateTime::createFromFormat('Y-m', $request->REPORTDATE) : '';
+ $reportDate = $firstDay->modify('first day of January')->format('Ymd');
+
+ $lastDay = isset($request->TOREPORTDATE) ? \DateTime::createFromFormat('Y-m', trim($request->TOREPORTDATE)) : '';
+ $toreportDate = $lastDay->modify('last day of December')->format('Ymd');
+
+ # Build SQL
+ $selectContent = "with tempfile as (
+ select a5rsvqty,a5packed,a5slunpr*a5packed as dollars,a5lnwght,a5whs,
+ (select max(ayapr8N002) as ayapr8N002 from icm695m1 where a5macpkr=aymacpkr fetch first 1 rows only)
+ from icm688m2 where a5macpkr in (
+ select distinct aymacpkr from icm695m1 where (AYSTATUS in ('Z','z') and ayapr8N002>=$reportDate and ayapr8N002<=$toreportDate )
+ ) and a5co='".$CO."' and a5whs in(".implode(",", $WHArr).")
+ )
+ select substr(ayapr8N002,1,4) as years,count(*) as lines,sum(a5rsvqty) as reserveqty,sum(a5packed) as packed,sum(a5lnwght*a5packed/a5rsvqty) as weight,sum(dollars) as dollars,a5whs as whs from tempfile
+ group by substr(ayapr8N002,1,4),a5whs order by 1 ";
+
+ $execSummaryResLY = [];
+ break;
+
+ case 'quarter':
+ # Set Dates based on reportPeriod type
+ $firstDay = isset($request->REPORTDATE) ? \DateTime::createFromFormat('Y-m', $request->REPORTDATE) : '';
+ $reportDate = $firstDay->modify('first day of January')->format('Ymd');
+
+ $lastDay = isset($request->TOREPORTDATE) ? \DateTime::createFromFormat('Y-m', trim($request->TOREPORTDATE)) : '';
+ $toreportDate = $lastDay->modify('last day of December')->format('Ymd');
+ # Build SQL
+ $selectContent = "with tempfile as (
+ select a5rsvqty,a5packed,a5slunpr*a5packed as dollars,a5lnwght,a5whs,
+ (select max(ayapr8N002) as ayapr8N002 from icm695m1 where a5macpkr=aymacpkr fetch first 1 rows only)
+ from icm688m2 where a5macpkr in (
+ select distinct aymacpkr from icm695m1 where (AYSTATUS in ('Z','z') and ayapr8N002>=$reportDate and ayapr8N002<=$toreportDate )
+ ) and a5co='".$CO."' and a5whs in (".implode(",", $WHArr).")
+ )
+ select 'Q' || EXTRACT(QUARTER FROM TO_DATE(CAST(ayapr8n002 AS TEXT),'YYYYMMDD')) ||'-' || substr(ayapr8N002,3,2) as years,count(*) as lines,
+ sum(a5rsvqty) as reserveqty, sum(a5packed) as packed,sum (a5lnwght*a5packed/a5rsvqty) as weight,sum(dollars) as dollars, a5whs as whs
+ from tempfile
+ group by 'Q' || EXTRACT(QUARTER FROM TO_DATE(CAST(ayapr8n002 AS TEXT),'YYYYMMDD')) ||'-' || substr(ayapr8N002,3,2),a5whs order by 1 ";
+
+ $execSummaryResLY = [];
+
+ break;
+
+ case 'monthly':
+ # Set Dates based on reportPeriod type
+ $firstDay = isset($request->REPORTDATE) ? \DateTime::createFromFormat('Y-m', $request->REPORTDATE) : null;
+
+ $lastDay = (clone $firstDay);
+ $reportDate = $firstDay->modify('-11 months')->modify('first day of this month')->format('Ymd'); //
+ $toreportDate = $lastDay ? $lastDay->modify('last day of this month')->format('Ymd') : '';
+ # Last Year Dates
+ // Same period, but for Last Year (LY)
+ $reportDateLY = (clone $firstDay)->modify('-1 year')->modify('first day of this month')->format('Ymd');
+ $toreportDateLY = (clone $lastDay)->modify('-1 year')->modify('last day of this month')->format('Ymd');
+
+ # Build SQL
+ $selectContent = "with tempfile as (
+ select a5rsvqty,a5packed,a5slunpr*a5packed as dollars,a5lnwght,a5whs,
+ (select max(ayapr8N002) as ayapr8N002 from icm695m1 where a5macpkr=aymacpkr fetch first 1 rows only)
+ from icm688m2 where a5macpkr in (
+ select distinct aymacpkr from icm695m1 where (AYSTATUS in ('Z','z') and ayapr8N002>=$reportDate and ayapr8N002<=$toreportDate )
+ ) and a5co='".$CO."' and a5whs in (".implode(",", $WHArr).")
+ )
+ select substr(ayapr8N002,1,4) || '-' || substr(ayapr8N002,5,2) as years,count(*) as lines,sum(a5rsvqty) as reserveqty,sum(a5packed) as packed,
+ sum(a5lnwght*a5packed/a5rsvqty) as weight,sum(dollars) as dollars, a5whs as whs
+ from tempfile
+ group by substr(ayapr8N002,1,4) || '-' || substr(ayapr8N002,5,2),a5whs order by 1 ";
+
+ $selectContentLY = "with tempfile as (
+ select a5rsvqty,a5packed,a5slunpr*a5packed as dollars,a5lnwght,a5whs,
+ (select max(ayapr8N002) as ayapr8N002 from icm695m1 where a5macpkr=aymacpkr fetch first 1 rows only)
+ from icm688m2 where a5macpkr in (
+ select distinct aymacpkr from icm695m1 where (AYSTATUS in ('Z','z') and ayapr8N002>=$reportDateLY and ayapr8N002<=$toreportDateLY )
+ ) and a5co='".$CO."' and a5whs in (".implode(",", $WHArr).")
+ )
+ select substr(ayapr8N002,1,4) || '-' || substr(ayapr8N002,5,2) as years,count(*) as lines,sum(a5rsvqty) as reserveqty,sum(a5packed) as packed,
+ sum(a5lnwght*a5packed/a5rsvqty) as weight,sum(dollars) as dollars, a5whs as whs
+ from tempfile
+ group by substr(ayapr8N002,1,4) || '-' || substr(ayapr8N002,5,2),a5whs order by 1 ";
+
+ $execSummaryResLY = DB::connection(config('m3.connection', 'pgsql'))->select($selectContentLY);
+
+ break;
+
+ case 'custom':
+ # Set Dates based on reportPeriod type
+ $firstDay = isset($request->REPORTDATE) ? \DateTime::createFromFormat('Y-m', $request->REPORTDATE) : '';
+ $reportDate = $firstDay->modify('first day of this month')->format('Ymd');
+ $toreportDate = $firstDay->modify('last day of this month')->format('Ymd');
+
+ # Last Year Dates
+ $reportDateLY = (clone $firstDay)->modify('-1 year')->modify('first day of this month')->format('Ymd');
+ $toreportDateLY = (clone $firstDay)->modify('-1 year')->modify('last day of this month')->format('Ymd');
+
+ # Build SQL
+ $selectContent = "with tempfile as (
+ select a5rsvqty,a5packed,a5slunpr*a5packed as dollars,a5lnwght,a5whs,
+ (select max(ayapr8N002) as ayapr8N002 from icm695m1 where a5macpkr=aymacpkr fetch first 1 rows only)
+ from icm688m2 where a5macpkr in (
+ select distinct aymacpkr from icm695m1 where (AYSTATUS in ('Z','z') and ayapr8N002>=$reportDate and ayapr8N002<=$toreportDate )
+ ) and a5co='".$CO."' and a5whs in (".implode(",", $WHArr).")
+ )
+ select substr(ayapr8N002,7,2) as years,count(*) as lines,sum(a5rsvqty) as reserveqty,sum(a5packed) as packed,
+ sum(a5lnwght*a5packed/a5rsvqty) as weight, sum(dollars) as dollars, a5whs as whs
+ from tempfile
+ group by substr(ayapr8N002,7,2),a5whs order by 1 ";
+
+ $selectContentLY = "with tempfile as (
+ select a5rsvqty,a5packed,a5slunpr*a5packed as dollars,a5lnwght,a5whs,
+ (select max(ayapr8N002) as ayapr8N002 from icm695m1 where a5macpkr=aymacpkr fetch first 1 rows only)
+ from icm688m2 where a5macpkr in (
+ select distinct aymacpkr from icm695m1 where (AYSTATUS in ('Z','z') and ayapr8N002>=$reportDateLY and ayapr8N002<=$toreportDateLY )
+ ) and a5co='".$CO."' and a5whs in (".implode(",", $WHArr).")
+ )
+ select substr(ayapr8N002,7,2) as years,count(*) as lines,sum(a5rsvqty) as reserveqty,sum(a5packed) as packed,
+ sum(a5lnwght*a5packed/a5rsvqty) as weight, sum(dollars) as dollars, a5whs as whs
+ from tempfile
+ group by substr(ayapr8N002,7,2),a5whs order by 1 ";
+
+ $execSummaryResLY = DB::connection(config('m3.connection', 'pgsql'))->select($selectContentLY);
+ break;
+
+ default:
+ $selectContent = "";
+ break;
+ }
+
+ $execSummaryRes = DB::connection(config('m3.connection', 'pgsql'))->select($selectContent);
+ }
+ else{
+ $execSummaryRes = collect();
+ $execSummaryResLY = collect();
+ }
+
+ return response()->json(['success'=>true,'reportPeriod'=> $reportPeriod, 'result'=>$execSummaryRes, 'resultLY'=>$execSummaryResLY,
+ 'checkSales'=>$checkSales, 'checkWeight'=>$checkWeight, 'checkLines'=>$checkLines]);
+ }
+
+ # Init Page
+ $SHUSER = m3_user() !== '' ? Str::upper(trim(m3_user())) : '';
+ // dd($SHUSER);
+ if ($SHUSER!='') {
+ # Get User CO & WH from Table ICM428M
+ $ICM428M = DB::connection(config('m3.connection', 'pgsql'))->table('icm428m')
+ ->select('R428US','R428CO', 'R428WH','R428PL')
+ ->where('R428US','=',$SHUSER)
+ ->first();
+
+ $R428US = isset($ICM428M->R428US) ? $ICM428M->R428US : ''; # User
+ $COMPANY = isset($ICM428M->R428CO) ? $ICM428M->R428CO : '110'; # Company
+ $PLANT = isset($ICM428M->R428PL) ? $ICM428M->R428PL : '144'; # Plant
+ $WHS = isset($ICM428M->R428WH) ? $ICM428M->R428WH : '322'; # WareHouse
+ }
+ $WHDDA = $COMPANY.$PLANT.$WHS;
+ // dump($WHDDA);
+ # Warehouse Table
+ $IC670M = DB::connection(config('m3.connection', 'pgsql'))->table('ic670m')->get();
+ }
+ catch (\Throwable $th) {
+ Log::error($th);
+ }
+
+ return view('m3::liberty-theme.pages.execSummaryLine',compact('IC670M','WHDDA'));
+ // ,'ICM688M2',,'COMPANY','PLANT','WHS','reportDate'
+ }
+}
diff --git a/Modules/M3/Http/Controllers/fillBOL2Controller.php b/Modules/M3/Http/Controllers/fillBOL2Controller.php
new file mode 100644
index 00000000..d0519ee2
--- /dev/null
+++ b/Modules/M3/Http/Controllers/fillBOL2Controller.php
@@ -0,0 +1,235 @@
+bolService = $bolService;
+ }
+
+ public static function index(Request $request) {
+
+ return view('m3::liberty-theme.pages.fillBOL2');
+
+ }
+
+ public function fillBOL(Request $request)
+ {
+
+ ## $BOL = BOL::findOrFail($request);
+ $BOL = $request;
+
+ $data = [
+ 'bol_number' => $request->input('BOL_number') ?? '1234567890',
+ 'shipper_no' => $request->input('shipper_no') ?? '1234567890',
+ 'date' => now()->format('m/d/Y') ?? '01/01/2000',
+ 'master_bill_no' => $request->input('master_bill_no') ? 'X' : 'X',
+ 'master_bill_yes' => $request->input('master_bill_yes') ? 'X' : '',
+ 'master_bill_drops' => $request->input('master_bill_drops') ?? '',
+ 'consignor_name' => $request->input('consignor_name') ?? 'ERICO INTERNATIONAL CORP',
+ 'consignor_address1' => $request->input('consignor_address1') ?? '6800 ARNOLD MILLER PARKWAY',
+ 'consignor_address2' => $request->input('consignor_address2') ?? 'SOLON, OH 44139',
+ 'consignor_address3' => $request->input('consignor_address3') ?? 'USA',
+ 'consignee_name' => $request->input('consignee_name') ?? 'ERICO EUROPE BV',
+ 'consignee_address1' => $request->input('consignee_address1') ?? 'JULES VERNEWEG 75',
+ 'consignee_address2' => $request->input('consignee_address2') ?? '',
+ 'consignee_address3' => $request->input('consignee_address3') ?? 'TILBURG . 5015 BG',
+ 'freight_collect' => $request->input('freight_collect') ? 'X' : 'X',
+ 'carrier_name' => $request->input('carrier_name') ?? 'ICL / Expeditors',
+
+ 'pieces' => $request->input('pieces') ?? '20',
+ 'line_class' => $request->input('line_class') ?? '50',
+ 'line_weight' => $request->input('line_weight') ?? '8320',
+
+ 'total_pieces' => $request->input('total_pieces') ?? '20',
+ 'total_line_weight' => $request->input('total_line_weight') ?? '8320',
+ 'description' => $request->input('description') ?? 'Package Description sfdfsdfasdfas dfasdfasdfcasdfvasfa clsdalcdfl
+Line 2
+Line 3
+Line 4
+Line 5',
+
+ 'DTESHIPED.1' => date('d/m/Y'),
+ 'invoice_number' => $BOL['BOL_number'],
+ 'amount_due' => number_format($BOL['amount'], 2),
+ 'TYPEANDESCPTN.1' => 'TOTAL: 20 SKIDS 8320 #',
+ 'TYPEANDESCPTN.10' => 'ROTTERDAM ETA: 11/22',
+ 'TYPEANDESCPTN.13' => 'CONTAINER:',
+ 'TYPEANDESCPTN.2' => 'MECHANICAL / CADDY/ ELECTRICAL',
+ 'TYPEANDESCPTN.4' => 'BOOKING: 150744100',
+ 'TYPEANDESCPTN.5' => 'REFERENCE: 3140028046',
+ 'TYPEANDESCPTN.6' => 'VESSEL: INDEPENDENT HORIZON V. 1023E',
+ 'TYPEANDESCPTN.7' => 'SEAL: 637053',
+ 'TYPEANDESCPTN.9' => 'CHESTER, PA ETD: 11/05',
+ 'BOFLADNGAGYCD' => $BOL['BOL_number'],
+ 'CLASSORATE1' => '50',
+ 'CNMETRKLICNSE' => 'ICL / Expeditors',
+ 'CONSIGTONMADDR' => 'ERICO EUROPE BV JULES VERNEWEG 75 TILBURG . 5015 BG',
+ 'DATE' => date('d/m/Y'),
+ 'FRMNMADDR' => 'ERICO INTERNATIONAL CORP 6800 ARNOLD MILLER PARKWAY SOLON, OH 44139 USA',
+ 'LNITEMWT1' => '8320',
+ 'PARTOFMSTRBILL' => 'No',
+ 'PKGTYPECOUNT1' => '20',
+ 'SHPRNMBR' => '3140028046',
+ 'TOTALWT' => '8320',
+ 'TOTPIECES' => '20',
+ 'ckFREIGHTCOLECT' => 'Yes',
+ 'ckPREPAY' => 'Off',
+
+ 'DTESHIPED.2' => '',
+ 'LNITEMWT24' => '',
+ 'CLASSORATE24' => '',
+ 'LNITEMCLAS24' => '',
+ 'TYPEANDESCPTN.24' => '',
+ 'PKGTYPECOUNT24' => '',
+ 'LNITEMWT23' => '',
+ 'CLASSORATE23' => '',
+ 'LNITEMCLAS23' => '',
+ 'TYPEANDESCPTN.23' => '',
+ 'PKGTYPECOUNT23' => '',
+ 'LNITEMWT22' => '',
+ 'CLASSORATE22' => '',
+ 'LNITEMCLAS22' => '',
+ 'TYPEANDESCPTN.22' => '',
+ 'PKGTYPECOUNT22' => '',
+ 'LNITEMWT21' => '',
+ 'CLASSORATE21' => '',
+ 'LNITEMCLAS21' => '',
+ 'TYPEANDESCPTN.21' => '',
+ 'PKGTYPECOUNT21' => '',
+ 'LNITEMWT20' => '',
+ 'CLASSORATE20' => '',
+ 'LNITEMCLAS20' => '',
+ 'TYPEANDESCPTN.20' => '',
+ 'PKGTYPECOUNT20' => '',
+ 'LNITEMWT19' => '',
+ 'CLASSORATE19' => '',
+ 'LNITEMCLAS19' => '',
+ 'TYPEANDESCPTN.19' => '',
+ 'PKGTYPECOUNT19' => '',
+ 'LNITEMWT18' => '',
+ 'CLASSORATE18' => '',
+ 'LNITEMCLAS18' => '',
+ 'TYPEANDESCPTN.18' => '',
+ 'PKGTYPECOUNT18' => '',
+ 'LNITEMWT17' => '',
+ 'CLASSORATE17' => '',
+ 'LNITEMCLAS17' => '',
+ 'TYPEANDESCPTN.17' => '',
+ 'PKGTYPECOUNT17' => '',
+ 'LNITEMWT16' => '',
+ 'CLASSORATE16' => '',
+ 'LNITEMCLAS16' => '',
+ 'TYPEANDESCPTN.16' => '',
+ 'PKGTYPECOUNT16' => '',
+ 'LNITEMWT15' => '',
+ 'CLASSORATE15' => '',
+ 'LNITEMCLAS15' => '',
+ 'TYPEANDESCPTN.15' => '',
+ 'PKGTYPECOUNT15' => '',
+ 'LNITEMWT14' => '',
+ 'CLASSORAT14' => '',
+ 'LNITEMCLAS14' => '',
+ 'TYPEANDESCPTN.14' => '',
+ 'PKGTYPECOUNT14' => '',
+ 'LNITEMWT13' => '',
+ 'CLASSORATE13' => '',
+ 'LNITEMCLAS13' => '',
+ 'PKGTYPECOUNT13' => '',
+ 'LNITEMWT12' => '',
+ 'CLASSORATE12' => '',
+ 'LNITEMCLAS12' => '',
+ 'TYPEANDESCPTN.12' => '',
+ 'PKGTYPECOUNT12' => '',
+ 'LNITEMWT11' => '',
+ 'CLASSORATE11' => '',
+ 'LNITEMCLAS11' => '',
+ 'TYPEANDESCPTN.11' => '',
+ 'PKGTYPECOUNT11' => '',
+ 'LNITEMWT10' => '',
+ 'CLASSORATE10' => '',
+ 'LNITEMCLAS10' => '',
+ 'PKGTYPECOUNT10' => '',
+ 'LNITEMWT9' => '',
+ 'CLASSORATE9' => '',
+ 'LNITEMCLAS8' => '',
+ 'PKGTYPECOUNT9' => '',
+ 'LNITEMWT8' => '',
+ 'CLASSORATE8' => '',
+ 'TYPEANDESCPTN.8' => '',
+ 'PKGTYPECOUNT8' => '',
+ 'LNITEMWT7' => '',
+ 'CLASSORATE7' => '',
+ 'LNITEMCLAS7' => '',
+ 'PKGTYPECOUNT7' => '',
+ 'LNITEMWT6' => '',
+ 'CLASSORATE6' => '',
+ 'LNITEMCLAS6' => '',
+ 'PKGTYPECOUNT6' => '',
+ 'LNITEMWT5' => '',
+ 'CLASSORATE5' => '',
+ 'LNITEMCLAS5' => '',
+ 'PKGTYPECOUNT5' => '',
+ 'LNITEMWT4' => '',
+ 'CLASSORATE4' => '',
+ 'LNITEMCLAS4' => '',
+ 'PKGTYPECOUNT4' => '',
+ 'LNITEMWT3' => '',
+ 'CLASSORATE3' => '',
+ 'LNITEMCLAS3' => '',
+ 'TYPEANDESCPTN.3' => '',
+ 'PKGTYPECOUNT3' => '',
+ 'LNITEMWT2' => '',
+ 'CLASSORATE2' => '',
+ 'LNITEMCLAS2' => '',
+ 'PKGTYPECOUNT2' => '',
+ 'LNITEMCLAS1' => '',
+ 'HAZLNITEMWT3' => '',
+ 'HAZCLASSORATE3' => '',
+ 'HAZLNITEMCLAS3' => '',
+ 'HAZMATERDESL3' => '',
+ 'HAZMATERL3' => '',
+ 'HAZLNITEMWT2' => '',
+ 'HAZCLASSORATE2' => '',
+ 'HAZLNITEMCLAS2' => '',
+ 'HAZMATERDESL2' => '',
+ 'HAZMATERL2' => '',
+ 'HAZLNITEMWT1' => '',
+ 'HAZCLASSORATE1' => '',
+ 'HAZLNITEMCLAS1' => '',
+ 'HAZMATERDESL1' => '',
+ 'HAZMATERL1' => '',
+ '24HREMGCYRSPNS' => '',
+ 'CARIERFEDEMPID' => '',
+ 'BILLTOADDR' => '',
+ 'NUMDROPS' => '',
+
+ ];
+
+ try {
+ $filledPdf = $this->bolService->fillBillOfLading($data);
+
+ return response()->download($filledPdf)->deleteFileAfterSend(true);
+ } catch (\Exception $e) {
+ return response()->json(['error' => $e->getMessage()], 500);
+ }
+
+
+
+ }
+
+}
diff --git a/Modules/M3/Http/Controllers/fillBOLController.php b/Modules/M3/Http/Controllers/fillBOLController.php
new file mode 100644
index 00000000..b7afb304
--- /dev/null
+++ b/Modules/M3/Http/Controllers/fillBOLController.php
@@ -0,0 +1,225 @@
+path('ETN-BOL.pdf'));
+ // $pdf = new Pdf(Storage::disk('public')->path('ETN-BOL.pdf'), [
+ // //'command' => '/usr/local/bin/pdftk',
+ // 'useExec' => true,
+ // ]);
+ if ($pdf === false) {
+ var_dump("step 1");
+ $error = $pdf->getError();
+ dd($error);
+ }
+
+ #$test = Storage::disk('public')->exists('ETN-BOL.pdf');
+ #dd($test);
+
+ $newfile="BOL-{$BOL['BOL_number']}.pdf";
+ var_dump($newfile);
+
+ $test = Storage::disk('public')->put($newfile, '');
+ if ($test === false) {
+ var_dump("step 2");
+ $error = $test->getError();
+ dd($error);
+ }
+
+ #$test=$pdf->addFile(Storage::disk('public')->path($newfile), 'A');
+ #dd($test);
+
+ $result = $pdf->fillForm([
+ 'DTESHIPED.1' => date('d/m/Y'),
+ 'invoice_number' => $BOL['BOL_number'],
+ 'amount_due' => number_format($BOL['amount'], 2),
+ 'TYPEANDESCPTN.1' => 'TOTAL: 20 SKIDS 8320 #',
+ 'TYPEANDESCPTN.10' => 'ROTTERDAM ETA: 11/22',
+ 'TYPEANDESCPTN.13' => 'CONTAINER:',
+ 'TYPEANDESCPTN.2' => 'MECHANICAL / CADDY/ ELECTRICAL',
+ 'TYPEANDESCPTN.4' => 'BOOKING: 150744100',
+ 'TYPEANDESCPTN.5' => 'REFERENCE: 3140028046',
+ 'TYPEANDESCPTN.6' => 'VESSEL: INDEPENDENT HORIZON V. 1023E',
+ 'TYPEANDESCPTN.7' => 'SEAL: 637053',
+ 'TYPEANDESCPTN.9' => 'CHESTER, PA ETD: 11/05',
+ 'BOFLADNGAGYCD' => $BOL['BOL_number'],
+ 'CLASSORATE1' => '50',
+ 'CNMETRKLICNSE' => 'ICL / Expeditors',
+ 'CONSIGTONMADDR' => 'ERICO EUROPE BV JULES VERNEWEG 75 TILBURG . 5015 BG',
+ 'DATE' => date('d/m/Y'),
+ 'FRMNMADDR' => 'ERICO INTERNATIONAL CORP 6800 ARNOLD MILLER PARKWAY SOLON, OH 44139 USA',
+ 'LNITEMWT1' => '8320',
+ 'PARTOFMSTRBILL' => 'No',
+ 'PKGTYPECOUNT1' => '20',
+ 'SHPRNMBR' => '3140028046',
+ 'TOTALWT' => '8320',
+ 'TOTPIECES' => '20',
+ 'ckFREIGHTCOLECT' => 'Yes',
+ 'ckPREPAY' => 'Off',
+
+ 'DTESHIPED.2' => '',
+ 'LNITEMWT24' => '',
+ 'CLASSORATE24' => '',
+ 'LNITEMCLAS24' => '',
+ 'TYPEANDESCPTN.24' => '',
+ 'PKGTYPECOUNT24' => '',
+ 'LNITEMWT23' => '',
+ 'CLASSORATE23' => '',
+ 'LNITEMCLAS23' => '',
+ 'TYPEANDESCPTN.23' => '',
+ 'PKGTYPECOUNT23' => '',
+ 'LNITEMWT22' => '',
+ 'CLASSORATE22' => '',
+ 'LNITEMCLAS22' => '',
+ 'TYPEANDESCPTN.22' => '',
+ 'PKGTYPECOUNT22' => '',
+ 'LNITEMWT21' => '',
+ 'CLASSORATE21' => '',
+ 'LNITEMCLAS21' => '',
+ 'TYPEANDESCPTN.21' => '',
+ 'PKGTYPECOUNT21' => '',
+ 'LNITEMWT20' => '',
+ 'CLASSORATE20' => '',
+ 'LNITEMCLAS20' => '',
+ 'TYPEANDESCPTN.20' => '',
+ 'PKGTYPECOUNT20' => '',
+ 'LNITEMWT19' => '',
+ 'CLASSORATE19' => '',
+ 'LNITEMCLAS19' => '',
+ 'TYPEANDESCPTN.19' => '',
+ 'PKGTYPECOUNT19' => '',
+ 'LNITEMWT18' => '',
+ 'CLASSORATE18' => '',
+ 'LNITEMCLAS18' => '',
+ 'TYPEANDESCPTN.18' => '',
+ 'PKGTYPECOUNT18' => '',
+ 'LNITEMWT17' => '',
+ 'CLASSORATE17' => '',
+ 'LNITEMCLAS17' => '',
+ 'TYPEANDESCPTN.17' => '',
+ 'PKGTYPECOUNT17' => '',
+ 'LNITEMWT16' => '',
+ 'CLASSORATE16' => '',
+ 'LNITEMCLAS16' => '',
+ 'TYPEANDESCPTN.16' => '',
+ 'PKGTYPECOUNT16' => '',
+ 'LNITEMWT15' => '',
+ 'CLASSORATE15' => '',
+ 'LNITEMCLAS15' => '',
+ 'TYPEANDESCPTN.15' => '',
+ 'PKGTYPECOUNT15' => '',
+ 'LNITEMWT14' => '',
+ 'CLASSORAT14' => '',
+ 'LNITEMCLAS14' => '',
+ 'TYPEANDESCPTN.14' => '',
+ 'PKGTYPECOUNT14' => '',
+ 'LNITEMWT13' => '',
+ 'CLASSORATE13' => '',
+ 'LNITEMCLAS13' => '',
+ 'PKGTYPECOUNT13' => '',
+ 'LNITEMWT12' => '',
+ 'CLASSORATE12' => '',
+ 'LNITEMCLAS12' => '',
+ 'TYPEANDESCPTN.12' => '',
+ 'PKGTYPECOUNT12' => '',
+ 'LNITEMWT11' => '',
+ 'CLASSORATE11' => '',
+ 'LNITEMCLAS11' => '',
+ 'TYPEANDESCPTN.11' => '',
+ 'PKGTYPECOUNT11' => '',
+ 'LNITEMWT10' => '',
+ 'CLASSORATE10' => '',
+ 'LNITEMCLAS10' => '',
+ 'PKGTYPECOUNT10' => '',
+ 'LNITEMWT9' => '',
+ 'CLASSORATE9' => '',
+ 'LNITEMCLAS8' => '',
+ 'PKGTYPECOUNT9' => '',
+ 'LNITEMWT8' => '',
+ 'CLASSORATE8' => '',
+ 'TYPEANDESCPTN.8' => '',
+ 'PKGTYPECOUNT8' => '',
+ 'LNITEMWT7' => '',
+ 'CLASSORATE7' => '',
+ 'LNITEMCLAS7' => '',
+ 'PKGTYPECOUNT7' => '',
+ 'LNITEMWT6' => '',
+ 'CLASSORATE6' => '',
+ 'LNITEMCLAS6' => '',
+ 'PKGTYPECOUNT6' => '',
+ 'LNITEMWT5' => '',
+ 'CLASSORATE5' => '',
+ 'LNITEMCLAS5' => '',
+ 'PKGTYPECOUNT5' => '',
+ 'LNITEMWT4' => '',
+ 'CLASSORATE4' => '',
+ 'LNITEMCLAS4' => '',
+ 'PKGTYPECOUNT4' => '',
+ 'LNITEMWT3' => '',
+ 'CLASSORATE3' => '',
+ 'LNITEMCLAS3' => '',
+ 'TYPEANDESCPTN.3' => '',
+ 'PKGTYPECOUNT3' => '',
+ 'LNITEMWT2' => '',
+ 'CLASSORATE2' => '',
+ 'LNITEMCLAS2' => '',
+ 'PKGTYPECOUNT2' => '',
+ 'LNITEMCLAS1' => '',
+ 'HAZLNITEMWT3' => '',
+ 'HAZCLASSORATE3' => '',
+ 'HAZLNITEMCLAS3' => '',
+ 'HAZMATERDESL3' => '',
+ 'HAZMATERL3' => '',
+ 'HAZLNITEMWT2' => '',
+ 'HAZCLASSORATE2' => '',
+ 'HAZLNITEMCLAS2' => '',
+ 'HAZMATERDESL2' => '',
+ 'HAZMATERL2' => '',
+ 'HAZLNITEMWT1' => '',
+ 'HAZCLASSORATE1' => '',
+ 'HAZLNITEMCLAS1' => '',
+ 'HAZMATERDESL1' => '',
+ 'HAZMATERL1' => '',
+ '24HREMGCYRSPNS' => '',
+ 'CARIERFEDEMPID' => '',
+ 'BILLTOADDR' => '',
+ 'NUMDROPS' => '',
+
+ ])
+ ->needAppearances() // ensures values are visible in viewer
+ ->saveAs(Storage::disk('public')->path($newfile));
+ // Always check for errors
+ if ($result === false) {
+ var_dump("step 3");
+ $error = $pdf->getError();
+ dd($error);
+ } else {
+ return response()->file(Storage::disk('public')->path($newfile));
+ dd("step 4");
+ }
+
+ }
+
+}
diff --git a/Modules/M3/Http/Controllers/palletQtyController.php b/Modules/M3/Http/Controllers/palletQtyController.php
new file mode 100644
index 00000000..abeed02d
--- /dev/null
+++ b/Modules/M3/Http/Controllers/palletQtyController.php
@@ -0,0 +1,102 @@
+table('ic670m')->get();
+ #$power_user = DB::connection(config('m3.connection', 'pgsql'))->select("select R428PWRUSR, R428CO, R428PL, R428WH from ICM428M where R428US='".strtoUpper(m3_user())."'");
+ $power_user = DB::connection(config('m3.connection', 'pgsql'))->table('icm428m')
+ ->select('R428PWRUSR','R428US','R428CO','R428PL','R428WH')
+ ->where('R428US','=',strtoUpper(m3_user()))
+ ->first();
+ $co = $power_user->R428CO;
+ $plant = $power_user->R428PL;
+ $whs = $power_user->R428WH;
+ $ICM709M = DB::connection(config('m3.connection', 'pgsql'))->table('icm709m')
+ ->where('AT9CO','=',$co)
+ ->where('AT9PLT','=',$plant)
+ ->where('AT9WHS','=',$whs)
+ ->get();
+ $IC670M = DB::connection(config('m3.connection', 'pgsql'))->select("select * from IC670M where WDCO='$co' and WDPL='$plant' and WDWHS='$whs'");
+ return view('m3::liberty-theme.pages.palletQty', compact('ICM709M','IC670M','power_user'));
+
+ }
+
+ //
+ // Process data from Add modal
+ //
+ public static function saveQtyAdd(Request $request) {
+
+ // Insert record to ICM709M
+ #var_dump($request);
+ #console.log($request);
+ // Verify record does not already exist in ICM709M
+ $icm709m=DB::connection(config('m3.connection', 'pgsql'))->select("select count(*) as COUNT1 from ICM709M
+ where AT9CO='$request->AT9CO' and AT9PLT='$request->AT9PLT' and AT9WHS='$request->AT9WHS' and AT9PART='$request->AT9PART'");
+ if($icm709m[0]->COUNT1>="1") {
+ return "exists";
+ } else {
+ // Verify Part# already exists in ICM630M
+ $ic630m= DB::connection(config('m3.connection', 'pgsql'))->select("select count(*) as COUNT1 from IC630M
+ where LLCO='$request->AT9CO' and LLWHNO='$request->AT9WHS' and LLPPN='$request->AT9PART'");
+ if($ic630m[0]->COUNT1=="0") {
+ return "not exist";
+ } else {
+ DB::connection(config('m3.connection', 'pgsql'))->insert("insert into ICM709M (AT9CO, AT9PLT, AT9WHS, AT9PART, AT9QTY, AT9WRN)
+ values ('$request->AT9CO', '$request->AT9PLT', '$request->AT9WHS', '$request->AT9PART', '$request->AT9QTY', '$request->AT9WRN')");
+ return "success";
+ }
+ }
+ }
+ public static function saveQtyAdd2(Request $request) {
+
+ // Insert record to ICM709M
+ #var_dump($request);
+ #console.log($request);
+ // Verify record does not already exist in ICM709M
+ //DB::connection(config('m3.connection', 'pgsql'))->insert("insert into ICM709M (AT9CO, AT9PLT, AT9WHS, AT9PART, AT9QTY)
+ // values ('$request->AT9CO', '$request->AT9PLT', '$request->AT9WHS', '$request->AT9PART', '$request->AT9QTY')");
+ // $data=['AT9CO'=>$request->AT9CO, 'AT9PLT'=>$request->AT9PLT, 'AT9WHS'=>$request->AT9WHS, 'AT9PART'=>$request->AT9PART,
+ // 'AT9QTY'=>$request->AT9QTY, 'AT9WRN'=>$request->AT9WRN];
+ // $insertSQL = DB::connection(config('m3.connection', 'pgsql'))->table('icm709m')->insert($data);
+ DB::connection(config('m3.connection', 'pgsql'))->insert("insert into ICM709M (AT9CO, AT9PLT, AT9WHS, AT9PART, AT9QTY, AT9WRN)
+ values ('$request->AT9CO', '$request->AT9PLT', '$request->AT9WHS', '$request->AT9PART', '$request->AT9QTY', '$request->AT9WRN')");
+ // if($insertSQL) {
+ return "success";
+ // }
+
+ }
+
+ //
+ // Process data from Edit modal
+ //
+ public static function saveQtyEdit(Request $request) {
+
+ #dump($request);
+ #console.log($request);
+
+ //$icm709m=DB::connection(config('m3.connection', 'pgsql'))->select("select count(*) as COUNT1 from ICM709M
+ // where AT9CO='$request->AT9CO' and AT9PLT='$request->AT9PLT' and AT9WHS='$request->AT9WHS' and AT9PART='$request->AT9PART'");
+ //var_dump($icm709m);
+
+ DB::connection(config('m3.connection', 'pgsql'))->update("update ICM709M
+ set AT9QTY='$request->AT9QTY', AT9WRN='$request->AT9WRN'
+ where AT9CO='$request->AT9CO' and AT9PLT='$request->AT9PLT' and AT9WHS='$request->AT9WHS' and AT9PART='$request->AT9PART'");
+
+ return "success";
+
+ }
+
+}
diff --git a/Modules/M3/Http/Controllers/pendingClosureController.php b/Modules/M3/Http/Controllers/pendingClosureController.php
new file mode 100644
index 00000000..b277f316
--- /dev/null
+++ b/Modules/M3/Http/Controllers/pendingClosureController.php
@@ -0,0 +1,121 @@
+table('icm428m')
+ ->select('R428US','R428CO', 'R428WH', 'R428PL')
+ ->where('R428US','=',strtoUpper(m3_user()))
+ ->first();
+ $user = $ICM428M->R428US;
+ $co = $ICM428M->R428CO;
+ $whs = $ICM428M->R428WH;
+ $plant = $ICM428M->R428PL;
+
+ # ICM705M1 Statement
+ $sqlstmt = "select APMANIFEST,APDOCKDOOR,APCARRIER,APTRUCKIDT,APSPARE1,APLDSTRU,APLDSTRD,APLDSTRT,
+ APLDCLOU,APLDCLOD,APLDCLOT,APCO,APWHS,APPLT,APSPARE2,APLDCLOZ
+ from ICM705M1
+ where APSPARE2 in ('','P') and APCO='$co' and APWHS='$whs' and APPLT='$plant'";
+
+ $ICM705M1 = DB::connection(config('m3.connection', 'pgsql'))->select($sqlstmt);
+
+ $ICM698Ma=array();
+ $ICM699Ma=array();
+ foreach($ICM705M1 as $key=>$val) {
+ $sqlstmt1="select LGUSER,LGCONFDT,LGCONFTM
+ from ICM698M
+ where LGCO='$val->APCO' and LGWHS='$val->APWHS'and LGURL='op605api.php'
+ and LGRESPONSE like 'Close of Sentinel Manifest%'
+ and LGRESPONSE like '%' || right('000000000' || '$val->APMANIFEST',9) || '%'";
+ $ICM698M = DB::connection(config('m3.connection', 'pgsql'))->select($sqlstmt1);
+ $ICM698Ma[$val->APMANIFEST]['TMSUSER']='';
+ $ICM698Ma[$val->APMANIFEST]['TMSDATE']='';
+ $ICM698Ma[$val->APMANIFEST]['TMSTIME']='';
+ foreach($ICM698M as $key2=>$val2) {
+ $ICM698Ma[$val->APMANIFEST]['TMSUSER']=$val2->LGUSER;
+ $ICM698Ma[$val->APMANIFEST]['TMSDATE']=$val2->LGCONFDT;
+ $ICM698Ma[$val->APMANIFEST]['TMSTIME']=$val2->LGCONFTM;
+ }
+
+
+ $ICM699MSel1 ="select SHMACPKR,SHDT,SHTIME from ICM699M
+ WHERE SHMACPKR='$val->APMANIFEST' AND SHCO='$co' AND SHWHS='$whs'
+ AND SHSOURCE='CloseShipmentCoChargeAPI' AND SHERROR='' AND SHTYPE='M3-Req-out' limit 1";
+ $ICM699MSel = DB::connection(config('m3.connection', 'pgsql'))->select($ICM699MSel1);
+ foreach($ICM699MSel as $key2=>$val2) {
+ $ICM699Ma[$val2->SHMACPKR]['SHDT'] = $val2->SHDT;
+ $ICM699Ma[$val2->SHMACPKR]['SHTIME'] = $val2->SHTIME;
+ }
+ }
+ // dump($ICM699Ma);
+
+
+ $sqlstmt="select count(*) as COUNT1 from ICM699M
+ where SHCO='$co' and SHWHS='$whs' and SHTYPE like '%M3%' and SHERROR='X'
+ and SHSOURCE='CloseShipmentCoChargeAPI'";
+ $ICM699M = DB::connection(config('m3.connection', 'pgsql'))->select($sqlstmt);
+
+ # Get Unprocessed Orders
+ $unprocessedArr = array();
+ $sqlstmt3 = "WITH TEMPFILE AS (
+ SELECT A4MACPKR,A4SPKRFUD,(SELECT AYAPRF1551 FROM ICM695M1 WHERE AYMACPKR=A4MACPKR AND AYSLWHS='$whs' FETCH FIRST 1 ROWS ONLY) AS MF FROM ICM688M1
+ WHERE A4PICKSTS='B' AND A4WHS='$whs' ORDER BY A4SPKRFUD
+ )
+ SELECT APMANIFEST,APSPARE2 FROM ICM705M1 WHERE APMANIFEST IN (SELECT DISTINCT MF FROM TEMPFILE) AND APSPARE2='X' AND APWHS='$whs' ";
+ // AND APSPARE2!=''
+ // dump($sqlstmt3);
+ $UproccessedOrders = DB::connection(config('m3.connection', 'pgsql'))->select($sqlstmt3);
+ foreach($UproccessedOrders as $key=>$UproccessedOrder) {
+ // $unprocessedArr[] = $UproccessedOrder->APMANIFEST;
+ $unprocessedArr[] = ' '.
+ trim($UproccessedOrder->APMANIFEST).'';
+ }
+ // dump($unprocessedArr);
+
+ return view('m3::liberty-theme.pages.pendingClosure',
+ compact('ICM705M1', 'ICM698Ma', 'ICM699M', 'user', 'request','unprocessedArr','ICM699Ma')
+ );
+
+ }
+
+ public static function allowRetry(Request $request){
+ # Get URL PARAMS
+ $urlParams = count($request->all())>0 ? $request->all() : '';
+ // dd($urlParams);
+ // $SHUSER = isset($urlParams["SHUSER"]) ? $urlParams["SHUSER"] : '';
+ $MANIFEST = isset($urlParams["MANIFEST"]) ? $urlParams["MANIFEST"] : '';
+ $APCO = isset($urlParams["APCO"]) ? $urlParams["APCO"] : '';
+ $APWHS = isset($urlParams["APWHS"]) ? $urlParams["APWHS"] : '';
+
+ try {
+
+ DB::connection(config('m3.connection', 'pgsql'))->table('icm705m1')
+ ->where('APCO',$APCO)
+ ->where('APWHS',$APWHS)
+ ->where('APMANIFEST','=',$MANIFEST)
+ ->update(['APSPARE2'=>'']);
+
+ return response()->json([
+ 'code' => '200',
+ 'status' => 'Success',
+ 'message'=> 'Manifest Closing submitted'
+ ]);
+ } catch (\Throwable $th) {
+ //throw $th;
+ }
+
+
+ }
+
+}
diff --git a/Modules/M3/Http/Controllers/sentinelController.php b/Modules/M3/Http/Controllers/sentinelController.php
new file mode 100644
index 00000000..373e2e5c
--- /dev/null
+++ b/Modules/M3/Http/Controllers/sentinelController.php
@@ -0,0 +1,73 @@
+AYINTBOX) ? trim($request->AYINTBOX) : '';
+ $AYCO = isset($request->AYCO) ? trim($request->AYCO) : '';
+ $AYWHS = isset($request->AYWHS) ? trim($request->AYWHS) : '';
+ $AYUSER = isset($request->AYUSER) ? trim($request->AYUSER) : '';
+
+ if ($AYINTBOX!='') {
+ # Get the record from ICM695M1
+ $ICM695M1Sel = DB::connection(config('m3.connection', 'pgsql'))->table('icm695m1')
+ ->select()
+ ->where('AYINTBOX',$AYINTBOX)
+ ->where('AYCO',$AYCO)
+ ->where('AYWHS',$AYWHS)
+ ->where('AYSTATUS','')
+ ->first();
+
+ $allowDeletion = isset($ICM695M1Sel->AYSENTPKR) ? ($ICM695M1Sel->AYSENTPKR !='' ? true : false ) : false;
+
+ if ($allowDeletion) {
+ $timestamp = date('Y-m-d H:i:s.u');
+ $date1 = date('Ymd');
+ $time1 = date('His');
+
+ # Delete Records from ICM695M1 And ICM695M2
+ $ICM695M1Del = DB::connection(config('m3.connection', 'pgsql'))->table('icm695m1')
+ ->where('AYINTBOX',$AYINTBOX)
+ ->where('AYCO',$AYCO)
+ ->where('AYWHS',$AYWHS)
+ ->delete();
+
+ $ICM695M2Del = DB::connection(config('m3.connection', 'pgsql'))->table('icm695m2')
+ ->where('AZINTBOX',$AYINTBOX)
+ ->where('AZCO',$AYCO)
+ ->where('AZWHS',$AYWHS)
+ ->delete();
+
+ # Log the event as an unusual transaction to appear on SPD bottom right:
+ $InsertValues = "'$ICM695M1Sel->AYCO', '$ICM695M1Sel->AYWHS', '$ICM695M1Sel->AYSENTPKR', '$ICM695M1Sel->AYMACPKR', '$ICM695M1Sel->AYONO', '$ICM695M1Sel->AYRLNO', '$ICM695M1Sel->AYSHNO', '', 'Box $AYINTBOX emptied and repacked',
+ '$timestamp', '$date1', '$time1', '$AYUSER','$timestamp', '$date1', '$time1', '$AYUSER','$AYINTBOX'";
+
+ $ICM689MInsert = DB::connection(config('m3.connection', 'pgsql'))->insert("INSERT INTO ICM689M
+ (A7CO, A7WHS, A7SENTPKR, A7MACPKR, A7ONO, A7RLNO, A7SHNO, A7SOURCE, A7ERRMSG, A7DISRAITS, A7DISRAID, A7DISRAIT, A7DISRAIU, A7DISRESTS ,A7DISRESD ,A7DISREST ,A7DISRESU , A7SPR15A01)
+ values ($InsertValues)");
+
+ return response()->json(['success'=>true , 'message' => 'Line Deleted']);
+ }
+ else{
+ return response()->json(['success'=>false , 'message' => 'Line already packed']);
+ }
+ }
+ else{
+ return response()->json(['success'=>false , 'message' => 'Line missing']);
+ }
+
+ }
+
+}
diff --git a/Modules/M3/Http/Controllers/userControlController.php b/Modules/M3/Http/Controllers/userControlController.php
new file mode 100644
index 00000000..2fb7a672
--- /dev/null
+++ b/Modules/M3/Http/Controllers/userControlController.php
@@ -0,0 +1,342 @@
+table('icm428m')->get();
+ $ICM428M = DB::connection(config('m3.connection', 'pgsql'))->table('icm428m')
+ ->select('R428US','R428CO', 'R428WH')
+ ->where('R428US','=',strtoUpper(m3_user()))
+ ->first();
+ $co = $ICM428M->R428CO;
+ $whs = $ICM428M->R428WH;
+
+ $ICM428M = DB::connection(config('m3.connection', 'pgsql'))->select("SELECT * FROM ICM428M where R428CO='$co' and R428WH='$whs'");
+ #765 add DATE_PASSWORD_EXPIRES as DATE_EXPIRED, SET_PASSWORD_TO_EXPIRE as EXPIRED
+ $USER_INFO = DB::connection(config('m3.connection', 'pgsql'))->table('icm428m')->selectRaw('R428US as USERPRF, R428STS as STATUS, NULL as DATE_EXPIRED, NULL as EXPIRED')->get()->all();
+ #echo ""; var_dump($USER_INFO); echo "
";
+ $power_user = DB::connection(config('m3.connection', 'pgsql'))->select("select R428PWRUSR, R428CO, R428PL, R428WH from ICM428M where R428US='".strtoUpper(m3_user())."'");
+ #765
+# $expired_users = DB::connection(config('m3.connection', 'pgsql'))->select("SELECT USER_PROFILE FROM TABLE (SYSTOOLS.AUDIT_JOURNAL_CP () ) WHERE PASSWORD_EXPIRED = '*YES'");
+# echo ""; print_r($expired_users); echo "
";
+
+ $IC670M = DB::connection(config('m3.connection', 'pgsql'))->table('ic670m')->get();
+ return view('m3::liberty-theme.pages.userControl', compact('ICM428M','IC670M','power_user','USER_INFO'));
+
+ }
+
+ //
+ // Process data from Add modal
+ //
+ public static function saveUserAdd(Request $request) {
+
+ if($request->R428EMPCDE=="") {
+ $request->R428EMPCDE=0;
+ }
+
+ // Insert record to ICM428M
+ #dump($request);
+ // Validate user profile exists on the system
+ $usrprf = [(object) ['COUNT' => 0]]; // PostgreSQL/Core owns M3 profiles; no QSYS2 lookup.
+
+ // Validate employee code exists in LBPF file
+ #if($request->R428EMPCDE>0) {
+ # $empcde=DB::connection(config('m3.connection', 'pgsql'))->select("select count(*) as COUNT2 from LBPF where EMPNO='$request->R428EMPCDE'");
+ # if($empcde[0]->COUNT2=="0") {
+ # #echo "";
+ # return "error empcd";
+ # }
+ #}
+ $icm428m=DB::connection(config('m3.connection', 'pgsql'))->select("select count(*) as COUNT1 from ICM428M where R428US='$request->R428US'");
+ if($icm428m[0]->COUNT1=="1") {
+ return "error exists";
+ } else {
+
+ if($usrprf[0]->COUNT=="1") {
+ DB::connection(config('m3.connection', 'pgsql'))->insert("insert into ICM428M
+ (R428CO, R428PL, R428WH, R428STS, R428US, R428FIRST, R428FAMILY, R428EMAIL, R428EMPCDE, R428ADMUSR, R428PWRUSR, MENU2OPT, MENU3OPT, MENU4OPT, MENU5OPT, MENU6OPT, R42811A)
+ values ('$request->R428CO', '$request->R428PL', '$request->R428WH', '$request->R428STS', '$request->R428US', '$request->R428FIRST',
+ '$request->R428FAMILY', '$request->R428EMAIL', $request->R428EMPCDE, '$request->R428ADMUSR', '$request->R428PWRUSR',
+ 'NN".$request->MENU2OPT3."NNN".$request->MENU2OPT7.$request->MENU2OPT8."N', '".$request->MENU3OPT1.$request->MENU3OPT2."NNNNNNN',
+ '".$request->MENU4OPT1.$request->MENU4OPT2.$request->MENU4OPT3."NNNNNN',
+ '".$request->MENU5OPT1.$request->MENU5OPT2.$request->MENU5OPT3."N".$request->MENU5OPT5."NNNN','".$request->MENU6OPT1.$request->MENU6OPT2.$request->MENU6OPT3."','".$request->R42811A."')");
+ return "success";
+ } else {
+ #echo "";
+
+ # CL program call here (ewobjtst.)ICMUSRPRF parms(R428US, R428FIRST, R428FAMILY)
+ // connect to toolkit using DB2 credentials (can also leave blank for default authority)
+ try {
+ $conn = app(\Modules\M3\Services\PostgresProgramBridge::class);
+ }
+ catch (Exception $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.';
+ return "error profile3";
+ break;
+ case 42705:
+ $PGMERRORS = 'Database not found. Try WRKRDBDIRE to check.';
+ return "error profile4";
+ break;
+ default:
+ $PGMERRORS = 'Could not connect. Error: ' . $code . ' ' . $msg;
+ return "error profile5";
+ break;
+ }
+ }
+ $conn->setOptions(array('persistent' => false, 'stateless' => true, 'debug' => true,'debugLogFile' => '/www/sentm3test/htdocs/M3/storage/logs/toolkit_debug.log'));
+ // Add LIB
+ // $result = $conn->CLCommand('ADDLIBLE LIB(MPDAT10)');
+ // define several input/output params
+ $params = [];
+ $params[] = $conn->AddParameterChar('in',10,'User profile','E#iUsrPrf',$request->R428US);
+ $params[] = $conn->AddParameterChar('in',20,'First name','FIRST',$request->R428FIRST);
+ $params[] = $conn->AddParameterChar('in',30,'Family name','FAMILY',$request->R428FAMILY);
+## $result = $conn->PgmCall(Config::get('eproconf.misc.PGM1'), Config::get('eproconf.misc.libname4'), $params, array(), array());
+ $result = $conn->PgmCall('ICMUSRPRF', 'EWOBJ', $params, array(), array());
+ if (!$result) {
+ $PGMERRORS = 'Error calling program. Code: ' . $conn->getErrorCode() . ' Msg: ' . $conn->getErrorMsg();
+ //echo "";
+ return "error profile2";
+ } else {
+ // Successful Call : User profile created with default password
+ //dd($result);
+ //echo "";
+ DB::connection(config('m3.connection', 'pgsql'))->insert("insert into ICM428M
+ (R428CO, R428PL, R428WH, R428STS, R428US, R428FIRST, R428FAMILY, R428EMAIL, R428EMPCDE, R428ADMUSR, R428PWRUSR, MENU2OPT, MENU3OPT, MENU4OPT, MENU5OPT, MENU6OPT, R42811A,R42821A)
+ values ('$request->R428CO', '$request->R428PL', '$request->R428WH', '$request->R428STS', '$request->R428US', '$request->R428FIRST',
+ '$request->R428FAMILY', '$request->R428EMAIL', $request->R428EMPCDE, '$request->R428ADMUSR', '$request->R428PWRUSR',
+ 'NN".$request->MENU2OPT3."NNN".$request->MENU2OPT7.$request->MENU2OPT8."N', '".$request->MENU3OPT1.$request->MENU3OPT2."NNNNNNN',
+ '".$request->MENU4OPT1.$request->MENU4OPT2.$request->MENU4OPT3."NNNNNN',
+ '".$request->MENU5OPT1.$request->MENU5OPT2.$request->MENU5OPT3."N".$request->MENU5OPT5."NNNN','".$request->MENU6OPT1.$request->MENU6OPT2.$request->MENU6OPT3."','".$request->R42811A."','".$request->R42821A."')");
+ return "success2";
+ }
+ ##kd return "error profile";
+ }
+
+ }
+ }
+
+ //
+ // Process data from Edit modal
+ //
+ public static function saveUserEdit(Request $request) {
+
+ #dump($request);
+ if($request->R428EMPCDE=="") {
+ $request->R428EMPCDE=0;
+ }
+
+ // Validate employee code exists in LBPF file
+ //dump($request->R428EMPCDE);
+ #if($request->R428EMPCDE>0) {
+ # $sqlstmt="select count(*) as COUNT from LBPF where EMPNO='$request->R428EMPCDE'";
+ # #echo "$sqlstmt
";
+ # $empcde=DB::connection(config('m3.connection', 'pgsql'))->select($sqlstmt);
+ # #dump($empcde);
+ # if($empcde[0]->COUNT=="0") {
+ # #echo "";
+ # return "error empcd";
+ # }
+ #}
+
+ // Update record to ICM428M
+
+ $ICM428M=DB::connection(config('m3.connection', 'pgsql'))->select("select * from ICM428M where R428US='$request->R428US'");
+ //var_dump($ICM428M);
+
+ DB::connection(config('m3.connection', 'pgsql'))->update("update ICM428M
+ set R428CO='$request->R428CO', R428PL='$request->R428PL', R428WH='$request->R428WH', R428STS='$request->R428STS', R428FIRST='$request->R428FIRST',
+ R428FAMILY='$request->R428FAMILY', R428EMAIL='$request->R428EMAIL', R428EMPCDE=$request->R428EMPCDE, R428ADMUSR='$request->R428ADMUSR',
+ R428PWRUSR='$request->R428PWRUSR',
+ MENU2OPT='".substr($ICM428M[0]->MENU2OPT,0,2).$request->MENU2OPT3.substr($ICM428M[0]->MENU2OPT,3,3).$request->MENU2OPT7.$request->MENU2OPT8."',
+ MENU3OPT='".$request->MENU3OPT1.$request->MENU3OPT2.substr($ICM428M[0]->MENU3OPT,2,-1)."',
+ MENU4OPT='".$request->MENU4OPT1.$request->MENU4OPT2.$request->MENU4OPT3.substr($ICM428M[0]->MENU4OPT,3,-1)."',
+ MENU5OPT='".$request->MENU5OPT1.$request->MENU5OPT2.$request->MENU5OPT3.substr($ICM428M[0]->MENU5OPT,3,1).$request->MENU5OPT5.substr($ICM428M[0]->MENU5OPT,5,-1)."',
+ MENU6OPT='".$request->MENU6OPT1.$request->MENU6OPT2.$request->MENU6OPT3.substr($ICM428M[0]->MENU6OPT,3,-1)."',
+ R42811A='".$request->R42811A."',R42821A='".$request->R42821A."'
+ where R428US='$request->R428US'");
+
+ return "success";
+
+ }
+
+ #590
+ public static function callCL(Request $request) {
+
+ $PGMERRORS = '';
+
+ // connect to toolkit using DB2 credentials (can also leave blank for default authority)
+ try {
+ $conn = app(\Modules\M3\Services\PostgresProgramBridge::class);
+ }
+ catch (Exception $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(array('persistent' => false, 'stateless' => true, 'debug' => true,'debugLogFile' => '/www/sentm3test/htdocs/M3/storage/logs/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', 10, 'userid','USERID',$request->USERID);
+ $params[] = $conn->AddParameterChar('in', 1, 'action','ACTION',$request->ACTION);
+
+ // AddParameterPackDec($io, $length, $scale, $comment, $varName, $value,$dimension)
+ // Add Delivery Note Param
+ //$params[] = $conn->AddParameterPackDec('in', 11, 0, 'ParamIn','','00000087125');
+
+ // $params[] = $conn->AddParameterZoned('in', 11, 0, 'ParamIn');
+
+ // Start Time Tracking
+ // $start = microtime(true);
+
+ //dump('Calling: EWOBJ/ICMCHGPRF action='.$request->ACTION.' user='.$request->USERID);
+
+ // Config::get('eproconf.misc.PGM1'), Config::get('eproconf.misc.libname4')
+ // ICM700C EWOBJTST ICM700C ICM700CSBM
+ $result = $conn->PgmCall('ICMCHGPRF', 'EWOBJ', $params, array(), array());
+
+ if (!$result) {
+ $PGMERRORS = 'Error calling program. Code: ' . $conn->getErrorCode() . ' Msg: ' . $conn->getErrorMsg();
+ //dump($PGMERRORS);
+ echo "";
+ return "error";
+ die();
+ }
+ // Successful Call
+ else{
+ //dump($result);
+ // $AWREQN = $result['io_param']["var0"];
+ //return "success";
+ if($request->ACTION=="P") {
+ echo "";
+ }
+ if($request->ACTION=="R") {
+ echo "";
+ }
+ echo "";
+ }
+
+ // if ($PGMERRORS!="") {
+ // // return back()->withMessage('Can not Create PR: '.$PGMERRORS);
+ // dump($PGMERRORS);
+ // }
+ // else{
+ // // return $AWREQN;
+ // }
+ }
+
+
+ #765
+ public static function savePassword(Request $request) {
+
+#dd('B4');
+ 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'));
+
+ $PGMERRORS = '';
+
+#console_log("request> ");
+#echo "request="; var_dump($request);
+
+#echo "B3
";
+ // connect to toolkit using DB2 credentials (can also leave blank for default authority)
+ try {
+ $conn = app(\Modules\M3\Services\PostgresProgramBridge::class);
+#dump($conn);
+#echo "B4
";
+ }
+ catch (Exception $e)
+ {
+#echo "B5
";
+ // Determine reason for failure.
+ // Probably database authentication error or invalid or unreachable database.
+### $conn->setOptions(array('persistent' => false, 'stateless' => true, 'debug' => true,'debugLogFile' => '/www/sentm3test/htdocs/storage/logs/toolkit_debug.log'));
+ $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;
+ }
+ }
+
+ #$params = [];
+ #$params[] = $conn->AddParameterChar('in', 10, 'userid','USRPRF',$request->USERID);
+ #$params[] = $conn->AddParameterChar('in', 10, 'pwd','PASSWORD',$request->PASSWORD);
+ #$params[] = $conn->AddParameterChar('in', 9, 'sts','STATUS','*ENABLED');
+ #$params[] = $conn->AddParameterChar('in', 4, 'pwdexp','PWDEXP','*NO');
+
+ //dump('Before CHGUSRPRF');
+ $result = $conn->CLCommand('QSYS/CHGUSRPRF USRPRF('.$request->R428US_PWD.') PASSWORD('.$request->NEW_PASSWORD.') STATUS(*ENABLED) PWDEXP(*NO)');
+ #$result = $conn->PgmCall('CHGUSRPRF', 'QSYS', $params, array(), array());
+ #echo "";
+
+ if (!$result) {
+ $PGMERRORS = 'Error calling program. Code: ' . $conn->getErrorCode() . ' Msg: ' . $conn->getErrorMsg();
+ dump($PGMERRORS);
+ echo "";
+ return "error pwd";
+ }
+ // Successful Call
+ else{
+ return "success";
+ }
+
+ }
+}
diff --git a/Modules/M3/Http/Controllers/userPickingStats4.php b/Modules/M3/Http/Controllers/userPickingStats4.php
new file mode 100644
index 00000000..da9d154f
--- /dev/null
+++ b/Modules/M3/Http/Controllers/userPickingStats4.php
@@ -0,0 +1,313 @@
+dates)) {
+ $date = $request->dates;
+ $starting = $date;
+ } else {
+ $starting = date("Y-m-d", strtotime("-1 days"));
+ }
+
+ ##$min_work_hours_for_break = 4;
+ $min_work_hours_for_break = implode(",", Config::get('arrays.min_work_hours_for_break'));
+
+ ##$ignore_picks_that_last_longer_than_this_many_hours = 8;
+ $ignore_picks_that_last_longer_than_this_many_hours = implode(",", Config::get('arrays.ignore_picks_that_last_longer_than_this_many_hours'));
+
+ #$user_array = Config::get('arrays.user_array');
+ #618
+ # Get Logged User CO & WH
+ # Get Users from ICM428M
+ $ICM428M = DB::connection(config('m3.connection', 'pgsql'))->table('icm428m')
+ ->select('R428US','R428CO', 'R428WH')
+ ->where('R428US','=',strtoUpper(m3_user()))
+ ->first();
+ $co = $ICM428M->R428CO;
+ $whs = $ICM428M->R428WH;
+
+ $user_array=array();
+ #$sqlstmt="SELECT R428US as userprf, R428FIRST, R428FAMILY, R428EMPCDE as empno FROM ICM428M where R428EMPCDE!=0";
+ $sqlstmt="SELECT R428US as userprf, (trim(R428FIRST) || ' ' || trim(R428FAMILY)) as name, R428EMPCDE as empno FROM ICM428M
+ where R428STS='A' and R428EMPCDE!=0 and R428CO='$co' and R428WH='$whs'";
+ $ICM428M = DB::connection(config('m3.connection', 'pgsql'))->select($sqlstmt);
+ // ->selectRaw("R428US, (trim(R428FIRST) || ' ' || trim(R428FAMILY)), R428EMPCDE ")
+ // ->where("R428EMPCDE!=0")
+ // ->get();
+ #while($row = odbc_fetch_object($result)) {
+ $x=0;
+ foreach($ICM428M as $key=>$row) {
+ // print_r($row);
+ $user_array[$x]['userprf']=trim($row->USERPRF);
+ #$user_array[$x]['name']=trim($row->R428FIRST)+' '+trim($row->R428FAMILY);
+ $user_array[$x]['name']=trim($row->NAME);
+ $user_array[$x]['empno']=$row->EMPNO;
+ $x++;
+ }
+ array_multisort(array_column($user_array, 'name'), SORT_ASC, $user_array);
+
+ // fill array of Lines per Hour per Monitor
+ $lph_per_monitor_array = Config::get('arrays_custom.lph_per_code_array');
+ #echo ""; print_r($user_array); echo "
";
+ if (isset($request->user)) {
+ $user = $request->user;
+ $empno = 0;
+ foreach ($user_array as $key => $val) {
+ if ($user_array[$key]['userprf'] == $user) {
+ $empno = $user_array[$key]['empno'];
+ }
+ }
+ } else {
+ $empno = 0;
+ $user = "";
+ }
+
+ // get data from LBPF for user and day
+ $payrollCodes = "";
+ ksort($lph_per_monitor_array);
+ foreach ($lph_per_monitor_array as $key => $val) {
+ $payrollCodes .= $key . ",";
+ }
+ $payrollCodes = substr($payrollCodes, 0, -1);
+
+ $yr = substr($starting, 0, 4) - 2000;
+ $mth = substr($starting, 5, 2);
+ $day = substr($starting, 8, 2);
+ $sqlstmt = "select oppno, sum(cast (hrs as integer)+ (hrs-cast (hrs as integer))/0.6) as hrs from LBPF
+ where empno=$empno and lbyr=$yr and lbmo=$mth and lbdy=$day
+ and oppno in ($payrollCodes)
+ group by oppno";
+
+ #echo "$sqlstmt
";
+
+ $lbpf1 = DB::connection(config('m3.connection', 'pgsql'))->select($sqlstmt);
+
+ $lbpf = 0;
+ foreach ($lbpf1 as $key => $val) {
+ $lbpf += $val->HRS;
+ }
+
+ $sql = "select * from perfstat where dt='$starting' and a5pickcomu='$user' ";
+ #@dd($sql);
+
+ if (isset($request->dates) || isset($request->user)) {
+ $statistic4 = DB::connection(config('m3.connection', 'pgsql'))->select($sql);
+ } else {
+ $statistic4 = array();
+ }
+
+ #echo ""; print_r($statistic4); echo "
";
+
+ #$duration = microtime(true) - $start;
+
+ // initialize arrays
+ $monitor_array = $totals_array = $perf_array = array();
+ $totals_array["value"] = 0;
+ $totals_array["weight"] = 0;
+ $totals_array["timediff"] = 0;
+ $totals_array["picked"] = 0;
+ $totals_array["entries"] = 0;
+ $diff = 0;
+
+ #echo ""; print_r($lbpf1); echo "
";
+
+ foreach ($lbpf1 as $key => $val) {
+ $monitor_array[$val->OPPNO]['tot_hours'] = $val->HRS;
+ // Initialize these variables in case not existant in statistic4
+ $monitor_array[$val->OPPNO]['header'] = "Mon" . $val->OPPNO;
+ $monitor_array[$val->OPPNO]['timediff'] = 0;
+ $monitor_array[$val->OPPNO]["percent_per_monitor"] = 0;
+ $monitor_array[$val->OPPNO]["percent_per_activity"] = 0;
+ $monitor_array[$val->OPPNO]["lph_blended_per_activity"] = 0;
+ $monitor_array[$val->OPPNO]["picked"] = 0;
+ $monitor_array[$val->OPPNO]["weight"] = 0;
+ $monitor_array[$val->OPPNO]["lines"] = 0;
+
+ }
+ if (!empty($statistic4)) {
+ #echo "in !empty
";
+ // Initialize the Monitor array
+ foreach ($statistic4 as $key => $val) {
+
+ // Initialize these variables in case not existant in LBPF
+ $monitor_array[$val->CODE]['header'] = "Mon" . $statistic4[$key]->CODE;
+ $monitor_array[$val->CODE]['timediff'] = 0;
+ $monitor_array[$val->CODE]["percent_per_monitor"] = 0;
+ $monitor_array[$val->CODE]["percent_per_activity"] = 0;
+ $monitor_array[$val->CODE]["lph_blended_per_activity"] = 0;
+ $monitor_array[$val->CODE]["picked"] = 0;
+ $monitor_array[$val->CODE]["weight"] = 0;
+ $monitor_array[$val->CODE]["lines"] = 0;
+ }
+ #echo "after 1st init
";
+
+ // add another element (0) in monitor_array to capture the total blended lph value expected
+ $monitor_array[0]["lph_blended_per_activity"] = 0;
+ $monitor_array[0]['header'] = "0";
+
+ // cycle thru stats again, and accumulate totals at global level (totals_array) and at monitor level (monitor_array)
+ foreach ($statistic4 as $key => $val) {
+
+ $statistic4[$key]->WEIGHT = round($statistic4[$key]->WEIGHT);
+ $statistic4[$key]->A5VALUE = round($statistic4[$key]->A5VALUE);
+ $statistic4[$key]->A5PICKED = round($statistic4[$key]->A5PICKED);
+
+ $statistic4[$key]->A5PICKCMTS = date('Y-m-d H:i', strtotime($statistic4[$key]->A5PICKCMTS));
+
+ // Calculate difference from previous time entry in seconds and save in TIMEDIFF key of STATISTIC4 array
+ # $time_now=strtotime($statistic4[$key]->A5PICKCMTSADJ);
+ $time_now = strtotime($statistic4[$key]->A5CMTSADJ);
+ if ($key > 0) {
+ $diff = round(abs($time_now - $time_prev));
+ if ($diff > $ignore_picks_that_last_longer_than_this_many_hours * 60 * 60) {
+ $diff = -1;
+ }
+ }
+
+ $statistic4[$key]->TIMEDIFF = $diff;
+
+ if ($diff / 60 < 5) {
+ $statistic4[$key]->COLOUR = "";
+ }
+ if ($diff / 60 >= 5 && $diff / 60 <= 10) {
+ $statistic4[$key]->COLOUR = "yellow";
+ }
+ if ($diff / 60 > 10 && $diff / 60 <= 15) {
+ $statistic4[$key]->COLOUR = "#88ace0";
+ }
+ if ($diff / 60 > 15) {
+ $statistic4[$key]->COLOUR = "red";
+ }
+
+ // save the time for previous entry
+# $time_prev=strtotime($statistic4[$key]->A5PICKCMTSADJ);
+ $time_prev = strtotime($statistic4[$key]->A5CMTSADJ);
+
+ // accumulate totals at monitor level
+ $monitor_array[$val->CODE]['timediff'] += $diff;
+ $monitor_array[$val->CODE]['picked'] += $statistic4[$key]->A5PICKED;
+ $monitor_array[$val->CODE]['weight'] += $statistic4[$key]->WEIGHT;
+ $monitor_array[$val->CODE]['lines']++;
+
+
+ // calculate totals at global level
+ $totals_array["entries"] = count($statistic4);
+ $totals_array["weight"] += $statistic4[$key]->WEIGHT;
+ $totals_array["value"] += $statistic4[$key]->A5VALUE;
+ $totals_array["timediff"] += $diff;
+ $totals_array["picked"] += $statistic4[$key]->A5PICKED;
+
+ }
+ #echo "after 2"; print_r($statistic4);
+ // build array for Performance with Greg's time entry (at one point we had a [0] array as well)
+
+ if (!is_null($lbpf)) {
+
+ $perf_array["tot_hours"] = (isset($lbpf) ? $lbpf : 0);
+
+ if ($perf_array["tot_hours"] <> 0) {
+ $perf_array["per_hour_actual"] = $totals_array["entries"] / $perf_array["tot_hours"];
+ } else {
+ $perf_array["per_hour_actual"] = 0;
+ }
+
+ }
+
+ // cycle through monitors array and compute percentage to allocate to each monitor (code)
+ ksort($monitor_array);
+ foreach ($monitor_array as $key => $val) {
+ if ($key != "0") {
+ if (!isset($monitor_array[$key]["tot_hours"])) {
+ $monitor_array[$key]["tot_hours"] = 0;
+ }
+
+ if ($totals_array["timediff"] <> 0) {
+ $monitor_array[$key]["percent_per_monitor"] = $monitor_array[$key]["timediff"] / $totals_array["timediff"];
+ }
+
+ if ($lbpf <> 0) {
+ $monitor_array[$key]["percent_per_activity"] = $monitor_array[$key]["tot_hours"] / $lbpf;
+ }
+ $monitor_array[$key]["lph_blended_per_activity"] = $monitor_array[$key]["percent_per_activity"] * (isset($lph_per_monitor_array[$key]) ? $lph_per_monitor_array[$key] : 0);
+ $monitor_array[0]["lph_blended_per_activity"] += $monitor_array[$key]["lph_blended_per_activity"];
+
+ }
+ }
+
+ if ($monitor_array[0]["lph_blended_per_activity"] <> 0) {
+ $perf_array["performance_activity"] = $perf_array["per_hour_actual"] / $monitor_array[0]["lph_blended_per_activity"];
+ }
+
+ }
+
+ #echo "";
+ #print_r($request);
+ #print_r($perf_array); print_r($monitor_array);
+
+ // return encoded json if input field named format is json
+ if ($request->format == "json") {
+
+ if (!array_key_exists("performance_activity", $perf_array)) {
+ $performance = 0;
+ } else {
+ $performance = number_format($perf_array["performance_activity"] * 100, 0);
+ }
+ if (!array_key_exists("0", $monitor_array)) {
+ $blendedTargetLPH = 0;
+ } else {
+ $blendedTargetLPH = number_format($monitor_array[0]["lph_blended_per_activity"], 1);
+ }
+ if (!array_key_exists("per_hour_actual", $perf_array)) {
+ $actualLPH = 0;
+ } else {
+ $actualLPH = number_format($perf_array["per_hour_actual"], 1);
+ }
+ if (!array_key_exists("tot_hours", $perf_array)) {
+ $grossHours = 0;
+ } else {
+ $grossHours = $perf_array["tot_hours"];
+ }
+
+ $json_data = array(
+ "day" => $starting,
+ "performance" => $performance,
+ "blendedTargetLPH" => $blendedTargetLPH,
+ "actualLPH" => $actualLPH,
+ "grossHours" => $grossHours
+ );
+ #echo ""; print_r($json_data);
+ return json_encode($json_data);
+
+ } else {
+ // display webpage of statistic version 4
+ $request->ports = Config::get('arrays.env_ports');
+ $no_data = "N";
+ if (count($statistic4) == 0 && $_SERVER['REQUEST_URI'] != "/userPickingStats4") {
+ $no_data = "Y";
+ }
+
+ #error_log("Time required to xyz: " . $duration . "\n", 3, "/temp/v4.log");
+
+ return view(
+ 'liberty-theme.pages.userPickingStats4',
+ compact('statistic4', 'starting', 'user', 'user_array', 'monitor_array', 'totals_array', 'perf_array', 'request', 'no_data')
+ );
+
+ }
+
+ }
+
+}
diff --git a/Modules/M3/Http/Controllers/userPickingStats5.php b/Modules/M3/Http/Controllers/userPickingStats5.php
new file mode 100644
index 00000000..b0155352
--- /dev/null
+++ b/Modules/M3/Http/Controllers/userPickingStats5.php
@@ -0,0 +1,138 @@
+table('icm428m')
+ ->select('R428US','R428CO', 'R428WH')
+ ->where('R428US','=',strtoUpper(m3_user()))
+ ->first();
+ $co = $ICM428M->R428CO;
+ $whs = $ICM428M->R428WH;
+
+ #@dd($request);
+ #$user_array=Config::get('arrays.user_array');
+ $user_array=array();
+ $sqlstmt="SELECT R428US as userprf, (trim(R428FIRST) || ' ' || trim(R428FAMILY)) as name, R428EMPCDE as empno FROM ICM428M
+ where R428EMPCDE!=0 and R428CO='$co' and R428WH='$whs'";
+ $ICM428M = DB::connection(config('m3.connection', 'pgsql'))->select($sqlstmt);
+ $x=0;
+ foreach($ICM428M as $key=>$row) {
+ // print_r($row);
+ $user_array[$x]['userprf']=trim($row->USERPRF);
+ #$user_array[$x]['name']=trim($row->R428FIRST)+' '+trim($row->R428FAMILY);
+ $user_array[$x]['name']=trim($row->NAME);
+ $user_array[$x]['empno']=$row->EMPNO;
+ $x++;
+ }
+ array_multisort(array_column($user_array, 'name'), SORT_ASC, $user_array);
+
+ // Filter by date
+ if (isset($request->dates)) {
+ $date = explode (' - ', $request->dates);
+ $start = str_replace(array(' ', '-'), '', $date[0]);
+ $end = str_replace(array(' ', '-'), '', $date[1]);
+ $starting = $date[0];
+ $ending = $date[1];
+ } else {
+ $start = date("Ymd", strtotime("-5 days"));
+ $end = date("Ymd");
+ $starting = date("Y-m-d", strtotime("-5 days"));
+ #$starting = "2021-11-01";
+ $ending = date("Y-m-d");
+ }
+
+ // calculate day difference between 2 dates
+ $str_date = new DateTime($starting);
+ $end_date = new DateTime($ending);
+ $interval = $str_date->diff($end_date);
+ $days = $interval->format('%a'); //retrieve number of days %a
+ #echo "diff=$days
";
+
+ $user=$request->user;
+
+ // retrieve session user and pw, also the HTTP server host address and port
+ $username = $request->header('php-auth-user');
+ $pw = $request->header('php-auth-pw');
+ $http_host = $request->server('HTTP_HOST');
+ $urlStats4 = "http://$http_host/userPickingStats4";
+
+ // initialize arrays
+ $statistic5 = $totals_array = array();
+ // initialize totals
+ $totals_array['performance'] = 0;
+ $totals_array['blendedTargetLPH'] = 0;
+ $totals_array['actualLPH'] = 0;
+ $totals_array['grossHours'] = 0;
+ $y = 0;
+
+ // loop for the days difference and passing proper date to v4 to get json encoded response
+ if (isset($request->dates)) {
+ for($x=0;$x<=$days;$x++) {
+
+ $next_date = date("Y-m-d",strtotime($starting."+$x days"));
+
+ $parameters = ['dates'=>$next_date, 'user'=>$request->user, 'format'=>'json'];
+ #echo ""; print_r($parameters); echo "$urlStats4
";
+
+ $response = Http::withBasicAuth($username, $pw)->get($urlStats4, $parameters);
+ #echo $response;
+ $statusCode = $response->status();
+
+ #echo "$statusCode json return=".$response->getBody()."
";
+
+ $statistic5[$x] = json_decode($response->getBody(),true);
+
+ $totals_array['performance'] += isset($statistic5[$x]['performance'])?$statistic5[$x]['performance']:0;
+ $totals_array['blendedTargetLPH'] += isset($statistic5[$x]['blendedTargetLPH'])?$statistic5[$x]['blendedTargetLPH']:0;
+ $totals_array['actualLPH'] += isset($statistic5[$x]['actualLPH'])?$statistic5[$x]['actualLPH']:0;
+ $totals_array['grossHours'] += isset($statistic5[$x]['grossHours'])?$statistic5[$x]['grossHours']:0;
+
+ if(!isset($statistic5[$x]['day'])) {
+ $statistic5[$x]['day'] = $next_date;
+ }
+ if(isset($statistic5[$x]['performance'])) {
+ if($statistic5[$x]['performance']>0) {
+ $y++;
+ }
+ } else {
+ $statistic5[$x]['performance']=0;
+ }
+ }
+ }
+
+ if($y>0) {
+ $totals_array['performance'] /= $y;
+ $totals_array['blendedTargetLPH'] /= $y;
+ $totals_array['actualLPH'] /= $y;
+ $totals_array['grossHours'] /= $y;
+ }
+
+ if($request->format=="json") {
+ echo "";
+ print_r($statistic5);
+ echo "
";
+ }else{
+ #dd($statistic5);
+ #if($statistic5[1]!=null)
+ return view('m3::liberty-theme.pages.userPickingStats5', compact('statistic5', 'totals_array', 'user_array', 'user', 'starting', 'ending', 'request'));
+ }
+
+ }
+}
diff --git a/Modules/M3/Http/Controllers/userProfileController.php b/Modules/M3/Http/Controllers/userProfileController.php
new file mode 100644
index 00000000..41db565a
--- /dev/null
+++ b/Modules/M3/Http/Controllers/userProfileController.php
@@ -0,0 +1,90 @@
+table('icm428m')
+ ->select('R428US','R428CO', 'R428WH','R428PL','R428FIRST','R428FAMILY')
+ ->where('R428US','=',$loggedUser)
+ ->where('R42821A','=','Y')
+ ->first();
+
+ $IC670M = DB::connection(config('m3.connection', 'pgsql'))->table('ic670m')->get();
+
+ # Check if user is eligible for Profile update
+ if (isset($ICM428M->R428US)) {
+ return view('m3::liberty-theme.pages.userProfile', compact('ICM428M','IC670M'));
+ }
+ else{
+ abort(404);
+ }
+
+ }
+
+ public static function updateUserProfile(Request $request) {
+ // dd($request->all());
+
+ $R428US = isset($request->R428US) ? trim($request->R428US) : '';
+ $R428DPW = isset($request->R428DPW) ? trim($request->R428DPW) : '';
+
+ $R428CO = substr($R428DPW, 0, 3);
+ $R428PL = substr($R428DPW, 3, 3);
+ $R428WH = substr($R428DPW, 6, 3);
+ // dd($R428US.'-'.$R428CO.'-'.$R428PL.'-'.$R428WH );
+
+ if ($R428US!='') {
+ # Update record to ICM428M
+ DB::connection(config('m3.connection', 'pgsql'))->update("update ICM428M
+ set R428CO='$R428CO', R428PL='$R428PL', R428WH='$R428WH'
+ where R428US='$R428US'");
+
+ // return "success";
+ return redirect('/userprofile')->with('success', 'Profile updated successfully!');
+ }
+ else{
+ return redirect('/userprofile')->with('success', 'Profile updated successfully!');
+ }
+
+ }
+
+ public static function updateUserProfileAjax(Request $request) {
+ // dd($request->all());
+
+ $R428US = isset($request->R428US) ? trim($request->R428US) : '';
+ $R428DPW = isset($request->R428DPW) ? trim($request->R428DPW) : '';
+
+ $R428CO = substr($R428DPW, 0, 3);
+ $R428PL = substr($R428DPW, 3, 3);
+ $R428WH = substr($R428DPW, 6, 3);
+ // dd($R428US.'-'.$R428CO.'-'.$R428PL.'-'.$R428WH );
+
+ if ($R428US!='') {
+ # Update record to ICM428M
+ DB::connection(config('m3.connection', 'pgsql'))->update("update ICM428M
+ set R428CO='$R428CO', R428PL='$R428PL', R428WH='$R428WH'
+ where R428US='$R428US'");
+
+ return response()->json(['success'=>true]);
+ }
+ else{
+ return response()->json(['success'=>false]);
+ }
+
+ }
+
+}
diff --git a/Modules/M3/Http/Controllers/utilitiesContoller.php b/Modules/M3/Http/Controllers/utilitiesContoller.php
new file mode 100644
index 00000000..28649a8a
--- /dev/null
+++ b/Modules/M3/Http/Controllers/utilitiesContoller.php
@@ -0,0 +1,646 @@
+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(array('persistent' => false, 'stateless' => true, 'debug' => true, 'debugLogFile' => '/www/sentustesx/htdocs/storage/logs/toolkit_debug.log'));
+
+ // Add LIB
+ // $result = $conn->CLCommand('ADDLIBLE LIB(MPDAT10)');
+
+ // define several input/output params
+ $params = [];
+ // $params[] = $conn->AddParameterChar('out',7,'eqNumber');
+
+ // AddParameterChar($io, $size, $comment, $varName, $value, $varying, $dimension)
+ # Add Warehouse Param
+ $params[] = $conn->AddParameterChar('in', 3, 'eqNumber', '', '111');
+
+ // AddParameterPackDec($io, $length, $scale, $comment, $varName, $value,$dimension)
+ // Add Delivery Note Param
+ $params[] = $conn->AddParameterPackDec('in', 11, 0, 'ParamIn', '', '00000087125');
+
+ // $params[] = $conn->AddParameterZoned('in', 11, 0, 'ParamIn');
+
+ // Start Time Tracking
+ $start = microtime(true);
+
+ dump('Calling: EWOBJTST/ICM700C');
+
+ // Config::get('eproconf.misc.PGM1'), Config::get('eproconf.misc.libname4')
+ // ICM700C EWOBJTST ICM700C ICM700CSBM
+ $result = $conn->PgmCall('ICM700CSBM', 'EWOBJTST', $params, array(), array());
+
+ if (!$result) {
+ $PGMERRORS = 'Error calling program. Code: ' . $conn->getErrorCode() . ' Msg: ' . $conn->getErrorMsg();
+ }
+ // Successful Call
+ else {
+ dump($result);
+ // $AWREQN = $result['io_param']["var0"];
+ }
+
+ if ($PGMERRORS != "") {
+ // return back()->withMessage('Can not Create PR: '.$PGMERRORS);
+ dump($PGMERRORS);
+ } else {
+ // return $AWREQN;
+ }
+ // Get Execution Time
+ $time = microtime(true) - $start;
+ dump($time);
+ }
+
+ public static function pdfReadWrite(Request $request)
+ {
+ dump("PDF Read Write");
+
+ $pdfFileName = "E1232824-10826596";
+
+ // Parse PDF file and build necessary objects.
+ $parser = new \Smalot\PdfParser\Parser();
+
+ // $pdf = $parser->parseFile('/www/sentm3test/htdocs/labels/E1232824-10826596.pdf');
+ // dump($pdf);
+ // $text = $pdf->getText();
+ // dump("Text Only");
+ // dump($text);
+
+ // $pdfFile = file_get_contents('/www/sentm3test/htdocs/labels/E1232824-10826596.pdf');
+ $pdfFile = File::get('/www/sentm3test/htdocs/labels/' . $pdfFileName . '.pdf');
+
+ // Transform content to base64
+ $base64PDF = base64_encode($pdfFile);
+ // Output base64 string
+ // dump($base64PDF);
+
+ # Save Cache
+ Cache::put($pdfFileName, $base64PDF, now()->addMinutes(60));
+
+ # Retrieve Cache
+ $cachedPdfFile = Cache::get($pdfFileName);
+ dump("Retrieve Base64 Encoded PDF saved in Cache:");
+ dump($cachedPdfFile);
+
+ # remove File from Cache
+ // Cache::put(pdfFileName, 'value', -5);
+ // Cache::forget($pdfFileName);
+
+ # Base64 Decode and Display
+ // $pdf = $parser->parseContent(base64_decode($base64PDF));
+ // $text = $pdf->getText();
+ // dump($text);
+
+ }
+
+ public static function fixICM799MSentPKR(Request $request)
+ {
+ ini_set('max_execution_time', Config::get('arrays.PHPTimeOutCL'));
+ ini_set('max_input_time', Config::get('arrays.PHPTimeOutCL'));
+ ini_set('default_socket_timeout', Config::get('arrays.PHPTimeOutCL'));
+ ini_set('memory_limit', '1024M');
+
+ dump("Run Fix IMSENTPKR...");
+
+ $SHUSER = 'TWOSHIP';
+
+ # Get User CO & WH
+ # Get users from ICM428M
+ $ICM428M = DB::connection(config('m3.connection', 'pgsql'))->table('icm428m')
+ ->select('R428US', 'R428CO', 'R428WH')
+ ->where('R428US', '=', $SHUSER)
+ ->first();
+
+ $DIVI = isset($ICM428M->R428CO) ? $ICM428M->R428CO : '';
+ $WHS = isset($ICM428M->R428WH) ? $ICM428M->R428WH : '';
+
+ # Get Parts And Lots from ICM688M2
+ $ICM688M2SLTMP = DB::connection(config('m3.connection', 'pgsql'))->table('icm688m2')
+ ->select('A5MACPKR', 'A5SENTPKR', 'A5PICKSTRD')
+ ->distinct()
+ ->where('A5CO', $DIVI)
+ ->where('A5WHS', $WHS)
+ ->where('A5PICKSTRD', '!=', '0')
+ ->orderBy('A5PICKSTRD', 'ASC')
+ ->get();
+
+ // $counter=0;
+ foreach ($ICM688M2SLTMP as $key => $ICM688M2SL) {
+ // $counter++;
+ // $counter == 10 ? exit : '';
+
+ $A5MACPKR = isset($ICM688M2SL->A5MACPKR) ? $ICM688M2SL->A5MACPKR : '';
+ $A5SENTPKR = isset($ICM688M2SL->A5SENTPKR) ? $ICM688M2SL->A5SENTPKR : '';
+
+ dump("ICM688M2 Record: " . $A5MACPKR . '-' . $A5SENTPKR);
+
+ $ICM799MINS = DB::connection(config('m3.connection', 'pgsql'))->table('icm799m')
+ ->where("IMDELNO", '=', $A5MACPKR)
+ ->update(["IMSENTPKR" => $A5SENTPKR]);
+ }
+
+ }
+
+ # Generate GS1-128
+ public static function generateGS128(Request $request)
+ {
+ ini_set('max_execution_time', Config::get('arrays.PHPTimeOutCL'));
+ ini_set('max_input_time', Config::get('arrays.PHPTimeOutCL'));
+ ini_set('default_socket_timeout', Config::get('arrays.PHPTimeOutCL'));
+ ini_set('memory_limit', '1024M');
+
+ try {
+ Log::channel('LabelCron')->info(">>> Run GS1 Label creation Command...");
+
+ # Get the Calling User
+ // $userId = 'TWOSHIP';
+ // $SHUSER = isset($userId) ? $userId : (m3_user() !== '' ? Str::upper(trim(m3_user())) : '');
+
+ # Get Manifest Array
+ $GSArray = $request->query();
+ // dump($GSArray);
+
+ $SHUSER = isset($GSArray['User']) ? trim($GSArray['User']) : '';
+
+ if ($SHUSER != '') {
+ # Get User CO & WH from Table ICM428M
+ $ICM428M = DB::connection(config('m3.connection', 'pgsql'))->table('icm428m')
+ ->select('R428US', 'R428CO', 'R428WH', 'R428PL')
+ ->where('R428US', '=', $SHUSER)
+ ->first();
+
+ $R428US = isset($ICM428M->R428US) ? $ICM428M->R428US : ''; # User
+ $COMPANY = isset($ICM428M->R428CO) ? $ICM428M->R428CO : ''; # Company
+ $PLANT = isset($ICM428M->R428PL) ? $ICM428M->R428PL : ''; # Plant
+ $WHS = isset($ICM428M->R428WH) ? $ICM428M->R428WH : ''; # WareHouse
+
+ $Macpkr = $GSArray['Macpkr'];
+ $packageType = trim($GSArray['packageType']); # 1 => Pallet , 0 => Carton
+ $packageTypeDesc = $packageType == 1 ? 'Pallet' : 'Carton';
+ $manufactID = '0826528'; # MAK : get ID from Nvent and save to Config File
+ $total_length = 9;
+
+ $html = '
+
+
+
+
+ ';
+
+ # Get number of Pallets
+ $packageCount = count($GSArray['PackagesArray']);
+ $packageNum = 1;
+
+ # Get GS1 Label MAX ID from ICM695M3 :
+ $GS1SEQUENCESel = DB::connection(config('m3.connection', 'pgsql'))->table('icm695m3')->max('ID');
+ $GS1SEQUENCE = isset($GS1SEQUENCESel) ? $GS1SEQUENCESel : 0;
+
+ # Loop PackagesArray : Build Table for PDF and Insert to ICM695m3
+ foreach ($GSArray['PackagesArray'] as $key => $value) {
+ $table_style = $packageNum < $packageCount ? ' style="page-break-after: always;" ' : '';
+
+ $A2INTBOX = trim($value);
+
+ $GS1SEQUENCE++;
+ $GS1SEQUENCEID = str_pad($GS1SEQUENCE, $total_length, "0", STR_PAD_LEFT);
+ # Build GS1 18 Digits Code
+ $gs1_128_bc_1 = '00' . $packageType . $manufactID . $GS1SEQUENCEID;
+
+ # Calculate Check Digit
+ $digits = str_split($gs1_128_bc_1);
+ $sum = 0;
+ $length = count($digits);
+
+ # Loop through each digit starting from the right
+ for ($i = 0; $i < $length; $i++) {
+ $digit = $digits[$length - $i - 1];
+ # Assign a weight of 3 or 1 alternately
+ $weight = ($i % 2 == 0) ? 3 : 1;
+ # Add the product of the digit and its weight to the sum
+ $sum += $digit * $weight;
+ }
+ # Calculate the remainder when sum is divided by 10
+ $remainder = $sum % 10;
+ # If remainder is 0, check digit is 0; otherwise, subtract remainder from 10
+ $checkDigit = ($remainder == 0) ? 0 : 10 - $remainder;
+ # End Check Digit Calculation
+
+ # SSCC 18 Digits Code
+ $gs1_128_bc = $gs1_128_bc_1 . $checkDigit;
+
+ $gs1_128_bc_desc = '(00)' . $packageType . $manufactID . $GS1SEQUENCEID . $checkDigit;
+
+ $data = [
+ 'ship_to' => $GSArray["Recipient_CompanyName"] . '
' . $GSArray["Recipient_Address1"] . '
' .
+ $GSArray["Recipient_City"] . ',' . $GSArray["Recipient_State"]
+ . '
' . $GSArray["Recipient_PostalCode"],
+ 'from' => $GSArray["Sender_CompanyName"] . '
' . $GSArray["Sender_Address1"] . '
' .
+ $GSArray["Sender_City"] . ',' . $GSArray["Sender_State"]
+ . '
' . $GSArray["Sender_PostalCode"],
+ 'ship_to_lbl' => '420' . $GSArray["Recipient_PostalCode"],
+ 'ship_to_desc' => '(420)' . $GSArray["Recipient_PostalCode"],
+ 'pro' => '190071217845706', # MAK : Check missing info with Brad
+ 'item_number' => '10000B',
+ 'upc' => '098506095310',
+ 'quantity' => '1',
+ 'serial_shipping_container' => $gs1_128_bc_desc
+ ];
+
+ # Initialize barcode generator
+ $generator = new BarcodeGeneratorPNG();
+
+ # Generate barcodes
+ $shipToPostalCodeBarcode = $generator->getBarcode($data['ship_to_lbl'], $generator::TYPE_CODE_128);
+ $serialShippingContainerBarcode = $generator->getBarcode($data['serial_shipping_container'], $generator::TYPE_CODE_128, 2, 50);
+
+ # HTML content for the label
+ $html .= '
+
+
+
+ FROM: ' . $data['from'] . '
+ |
+
+ SHIP TO: ' . $data['ship_to'] . '
+ |
+
+
+
+
+ ' . $data['ship_to_desc'] . '
+ |
+
+ Carrier: ' . $GSArray["CarrierName"] . '
+ PRO #: ' . $GSArray["trackingno"] . '
+ B/L #: ' . $GSArray["BOLnumber"] . '
+ Ref : ' . $A2INTBOX . '
+ |
+
+
+
+ PURCHASE ORDER: ' . $GSArray["ShipmentPONumber"] . '
+ Vendor: ' . $manufactID . '
+ |
+
+
+ |
+ ' . $packageTypeDesc . ' # : ' . $packageNum . ' of ' . $packageCount . '
+ |
+
+
+
+  . ')
+ ' . $data['serial_shipping_container'] . '
+ |
+
+
';
+
+ $packageNum++;
+
+ # Insert new Record to ICM695M3 $gs1_128_bc
+ $ICM695M3SQLInsert = DB::connection(config('m3.connection', 'pgsql'))->table('icm695m3')
+ ->insert(['A2CO' => $COMPANY, 'A2WHS' => $WHS, 'A2PLANT'=>$PLANT,'A2MACPKR' => $Macpkr, 'A2GS1LABEL' => $gs1_128_bc, "A2INTBOX" => $A2INTBOX]);
+
+ Log::channel('LabelCron')->info("<<< GS1-128...End of Label Creation for Mackpkr: " . $Macpkr);
+ }
+
+ $html .= ' ';
+ // dump($html);
+
+ ob_start();
+
+ # Initialize Dompdf
+ $dompdf = new Dompdf();
+ $dompdf->loadHtml($html);
+ $dompdf->setPaper('a6', 'portrait');
+ # Render the HTML as PDF
+ $dompdf->render();
+
+ # Output the generated PDF to Browser
+ // $dompdf->stream();
+
+ $pdfContent = $dompdf->output();
+ // dump($pdfContent);
+
+ $labelsPath = Config::get('arrays.PdfPath'); // '/www/sentm3live/htdocs/labels/';
+ # Put the PDF in labels/CarrierLabel
+ $GSFolder = "GSLabel";
+
+ $carrierFileName = $GSFolder . '_' . $Macpkr . '_' . $COMPANY . '_' . $WHS . '_' . $A2INTBOX;
+ # LTL
+ // if ($packageType=='1') {
+ // $carrierFileName = $GSFolder.'_'.$Macpkr.'_'.$COMPANY.'_'.$WHS;
+ // }
+ // # small Packs
+ // else{
+ // $carrierFileName = $GSFolder.'_'.$Macpkr.'_'.$COMPANY.'_'.$WHS.'_'.$A2INTBOX;
+ // }
+
+ $GS1FileName = $labelsPath . $GSFolder . '/' . $carrierFileName . '.pdf';
+ $GS1FileNameNoRoot = $GSFolder . '/' . $carrierFileName;
+ file_put_contents($GS1FileName, $pdfContent);
+ ob_end_clean();
+ }
+
+ // # Insert new Record to ICM695M3 $gs1_128_bc
+ // $ICM695M3SQLInsert = DB::connection(config('m3.connection', 'pgsql'))->table('icm695m3')
+ // ->insert(['A2CO'=> $COMPANY,'A2WHS'=> $WHS,'A2MACPKR'=> $Macpkr,'A2GS1LABEL'=> $gs1_128_bc]);
+
+ // Log::channel('LabelCron')->info("<<< GS1-128...End of Label Creation for Mackpkr: ".$Macpkr);
+
+ return json_encode(["result" => "success", "GS1File" => $GS1FileNameNoRoot]);
+
+ } catch (\Throwable $th) {
+ // Log::error($th);
+ Log::channel('LabelCron')->error($th);
+ return json_encode(["result" => "error", "GS1File" => $th]);
+
+ }
+ }
+
+ public static function generateGS128Tst(Request $request)
+ {
+ print_r(">>> Generate PDF");
+
+ // $builder = new Barcode\Builder();
+ // $image = $builder->output('(10)123456(400)11(3906)333333');
+
+ // $builder = new Barcode\Builder();
+ // $builder->setBarcodeType('gs1-128');
+ // $builder->setFilename('barcode.png');
+ // $builder->setImageFormat('png');
+ // $builder->setWidth(500);
+ // $builder->setHeight(150);
+ // $builder->setFontPath('FreeSans.ttf');
+ // $builder->setFontSize(15);
+ // $builder->setBackgroundColor(255, 255, 255);
+ // $builder->setPaintColor(0, 0, 0);
+ // Barcode\Builder::build()->setWidth(600)->setBackgroundColor(100, 100, 100)->output('(10)123456(400)11');
+ // return response($image)->header('Content-Type', 'image/png');
+
+ $data = [
+ 'from' => 'Any Vendor
123 Any Street
SomeTown, ST 01234',
+ 'ship_to' => 'True Value Hardware
123 Any Street
SomeTown, ST 01234',
+ 'ship_to_postal_code' => '42016172',
+ 'pro' => '190071217845706',
+ 'item_number' => '10000B',
+ 'upc' => '098506095310',
+ 'quantity' => '1',
+ 'serial_shipping_container' => '(00)107904370000005'
+ ];
+
+ // Initialize barcode generator
+ $generator = new BarcodeGeneratorPNG();
+
+ // Generate barcodes
+ $shipToPostalCodeBarcode = $generator->getBarcode($data['ship_to_postal_code'], $generator::TYPE_CODE_128);
+ $proBarcode = $generator->getBarcode($data['pro'], $generator::TYPE_CODE_128);
+ $serialShippingContainerBarcode = $generator->getBarcode($data['serial_shipping_container'], $generator::TYPE_CODE_128, 2, 50);
+
+ # HTML content for the label
+ // border="1" style="border-collapse: collapse; width: 100%; height: 300px;"
+ $html = '
+
+
+
+
+
+
+
+ FROM: ' . $data['from'] . '
+ |
+
+ SHIP TO: ' . $data['ship_to'] . '
+ |
+
+
+
+  . ')
+ (' . $data['ship_to_postal_code'] . ')
+ |
+
+ Carrier Routing(SCAC)
+ PRO #:
+ B/L # :
+ |
+
+
+
+ PURCHASE ORDER: PO1234567
+  . ')
+ PRO: ' . $data['pro'] . '
+ |
+
+
+
+ ITEM #: ' . $data['item_number'] . '
+ UPC: ' . $data['upc'] . '
+ QUANTITY: ' . $data['quantity'] . '
+ |
+
+
+
+  . ')
+ ' . $data['serial_shipping_container'] . '
+ |
+
+
+
+