Files
WMS/Modules/M3/Http/Controllers/UtilitiesController.php
T
2026-09-22 11:21:09 +01:00

574 lines
22 KiB
PHP
Executable File

<?php
namespace Modules\M3\Http\Controllers;
use Ayeo\Barcode;
use Cache;
use Config;
use DB;
use Dompdf\Dompdf;
use File;
use Illuminate\Http\Request;
use Log;
use Modules\M3\Services\PostgresProgramBridge;
use PDF;
use Picqer\Barcode\BarcodeGeneratorPNG;
use Zebra\Zpl\Image;
class UtilitiesController extends Controller
{
public static function index(Request $request)
{
dd('SentM3Test');
// Get The Next ID by Calling POM002C
// connect to toolkit using DB2 credentials (can also leave blank for default authority)
try {
$conn = app(PostgresProgramBridge::class);
} catch (\Throwable $e) {
// Determine reason for failure.
// Probably database authentication error or invalid or unreachable database.
Log::error('Unable to connect to the program bridge.', ['exception' => $e]);
return response()->json(['error' => 'Program bridge connection failed.'], 503);
}
$conn->setOptions(['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 = [];
// 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');
// 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, [], []);
if ($result) {
dump($result);
}
// 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.
$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();
foreach ($iCM688M2SLTMP as $ICM688M2SL) {
$a5MACPKR = isset($ICM688M2SL->A5MACPKR) ? $ICM688M2SL->A5MACPKR : '';
$a5SENTPKR = isset($ICM688M2SL->A5SENTPKR) ? $ICM688M2SL->A5SENTPKR : '';
dump('ICM688M2 Record: ' . $a5MACPKR . '-' . $a5SENTPKR);
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...');
$gSArray = $request->query();
$sHUSER = trim((string) ($gSArray['User'] ?? ''));
$gS1FileNameNoRoot = '';
if ($sHUSER !== '') {
$gS1FileNameNoRoot = self::generateGS128ForUser($gSArray, $sHUSER);
}
return json_encode(['result' => 'success', 'GS1File' => $gS1FileNameNoRoot]);
} catch (\Throwable $th) {
Log::channel('LabelCron')->error($th);
return json_encode(['result' => 'error', 'GS1File' => $th]);
}
}
private static function generateGS128ForUser(array $gSArray, string $sHUSER): string
{
// 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();
$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 = '
<html>
<head>
<style>
.border_btm {
border-bottom: 1px solid;
}
.border_rght {
border-right: 1px solid;
}
.margin_t {
padding-top : 10px;
}
.align_lft {
text-align: left;
}
.align_center {
text-align: center;
}
@page { margin: 5px; }
body { margin: 0px; }
</style>
</head>
<body style="font-family: Arial, sans-serif;">';
// 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 $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;
$checkDigit = self::gs1CheckDigit($gs1_128_bc_1);
// 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'] . '<br>' . $gSArray['Recipient_Address1'] . '<br>' .
$gSArray['Recipient_City'] . ',' . $gSArray['Recipient_State']
. '<br>' . $gSArray['Recipient_PostalCode'],
'from' => $gSArray['Sender_CompanyName'] . '<br>' . $gSArray['Sender_Address1'] . '<br>' .
$gSArray['Sender_City'] . ',' . $gSArray['Sender_State']
. '<br>' . $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 .= self::gs128LabelHtml(
$data, $gSArray, $a2INTBOX, $manufactID, $packageTypeDesc,
$packageNum, $packageCount, $table_style,
$shipToPostalCodeBarcode, $serialShippingContainerBarcode
);
$packageNum++;
// Insert new Record to ICM695M3 $gs1_128_bc
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 .= '</body> </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();
$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();
return $gS1FileNameNoRoot;
}
private static function gs128LabelHtml(
array $data, array $gSArray, string $a2INTBOX, string $manufactID,
string $packageTypeDesc, int $packageNum, int $packageCount, string $table_style,
string $shipToPostalCodeBarcode, string $serialShippingContainerBarcode
): string {
return '
<table ' . $table_style . '>
<tr>
<td colspan="2" class="border_btm border_rght align_lft">
FROM:<br>' . $data['from'] . '
</td>
<td colspan="2" class="border_btm align_lft">
SHIP TO:<br>' . $data['ship_to'] . '
</td>
</tr>
<tr>
<td colspan="3" class="border_btm border_rght margin_t align_center">
<img src="data:image/png;base64,' . base64_encode($shipToPostalCodeBarcode) . '"> <br>
' . $data['ship_to_desc'] . '
</td>
<td class="border_btm margin_t align_lft">
Carrier: ' . $gSArray['CarrierName'] . ' <br>
PRO #: ' . $gSArray['trackingno'] . ' <br>
B/L #: ' . $gSArray['BOLnumber'] . ' <br>
Ref : ' . $a2INTBOX . '
</td>
</tr>
<tr>
<td colspan="4" class="border_btm margin_t align_lft">
PURCHASE ORDER: ' . $gSArray['ShipmentPONumber'] . ' <br>
Vendor: ' . $manufactID . '
</td>
</tr>
<tr>
<td colspan="4" class="border_btm margin_t align_center">
' . $packageTypeDesc . ' # : ' . $packageNum . ' of ' . $packageCount . '
</td>
</tr>
<tr>
<td colspan="4" style="text-align: center;" class="margin_t">
<img src="data:image/png;base64,' . base64_encode($serialShippingContainerBarcode) . '"><br>
' . $data['serial_shipping_container'] . '
</td>
</tr>
</table>';
}
private static function gs1CheckDigit(string $value): int
{
$digits = str_split($value);
$sum = 0;
$length = count($digits);
for ($i = 0; $i < $length; $i++) {
$digit = (int) $digits[$length - $i - 1];
$weight = $i % 2 === 0 ? 3 : 1;
$sum += $digit * $weight;
}
$remainder = $sum % 10;
return $remainder === 0 ? 0 : 10 - $remainder;
}
public static function generateGS128Tst(Request $request)
{
print_r('>>> Generate PDF');
$data = [
'from' => 'Any Vendor<br>123 Any Street<br>SomeTown, ST 01234',
'ship_to' => 'True Value Hardware<br>123 Any Street<br>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 = '
<html>
<style>
.border_btm {
border-bottom: 1px solid;
}
.border_rght {
border-right: 1px solid;
}
.margin_t {
padding-top : 10px;
}
.align_lft {
text-align: left;
}
@page { margin: 5px; }
body { margin: 0px; }
</style>
</head>
<body style="font-family: Arial, sans-serif;">
<table class="table">
<tr>
<td colspan="2" class="border_btm border_rght align_lft">
FROM:<br>' . $data['from'] . '
</td>
<td colspan="2" class="border_btm align_lft">
SHIP TO:<br>' . $data['ship_to'] . '
</td>
</tr>
<tr>
<td colspan="2" class="border_btm border_rght margin_t align_lft">
<img src="data:image/png;base64,' . base64_encode($shipToPostalCodeBarcode) . '"><br>
(' . $data['ship_to_postal_code'] . ')
</td>
<td colspan="2" class="border_btm margin_t align_lft">
Carrier Routing(SCAC) <br>
PRO #: <br>
B/L # :
</td>
</tr>
<tr>
<td colspan="4" style="text-align: center;" class="border_btm margin_t">
PURCHASE ORDER: PO1234567 <br>
<img src="data:image/png;base64,' . base64_encode($proBarcode) . '"><br>
PRO: ' . $data['pro'] . '
</td>
</tr>
<tr>
<td colspan="4" style="text-align: left;" class="border_btm margin_t">
ITEM #: ' . $data['item_number'] . '<br>
UPC: ' . $data['upc'] . '<br>
QUANTITY: ' . $data['quantity'] . '
</td>
</tr>
<tr>
<td colspan="4" style="text-align: center;" class="margin_t">
<img src="data:image/png;base64,' . base64_encode($serialShippingContainerBarcode) . '"><br>
' . $data['serial_shipping_container'] . '
</td>
</tr>
</table>
</body>
</html>';
// 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();
// // return $pdfContent;
$labelsPath = '/www/sentm3live/htdocs/labels/';
// # Put the PDF in labels/CarrierLabel
$gSFolder = 'GSLabel';
$carrierFileName = 'GSLabel';
file_put_contents($labelsPath . $gSFolder . '/' . $carrierFileName . '.pdf', $pdfContent);
// Save the PDF string to a temporary file for debugging
// $tempPdfPath = tempnam(sys_get_temp_dir(), 'pdf') . '.pdf';
// // dump($tempPdfPath);
// file_put_contents($tempPdfPath, $pdfContent);
// // Check if the PDF was generated correctly
// if (!file_exists($tempPdfPath) || filesize($tempPdfPath) === 0) {
// }
// Create an Imagick instance
// $imagick = new \Imagick();
// // Read the PDF from the string
// // $imagick->readImageBlob( $pdfContent );
// // Read the PDF from the file
// $imagick->readImage($tempPdfPath);
// // Set the resolution (optional)
// $imagick->setResolution(300, 300);
// // Convert the first page of the PDF to an image
// $imagick->setIteratorIndex(0);
// $imagick->setImageFormat('png');
}
public static function miscTests(Request $request)
{
// $total_length = 9;
// # MAK replace cache ID with MAX ID+1 from ICM695M3
// $gS1SEQUENCESel = DB::connection(config('m3.connection', 'pgsql'))->table('icm695m3')->max('ID');
// dump($gS1SEQUENCESel);
// $gS1SEQUENCE = isset($gS1SEQUENCESel) ? $gS1SEQUENCESel : 0;
// $gS1SEQUENCE++;
// $gS1SEQUENCEID = str_pad($gS1SEQUENCE, $total_length, "0", STR_PAD_LEFT);
// dump($gS1SEQUENCEID);
// MAK Get Contents
// ESN1
// $aYMACPKR='888568'; // LTL example
// $aYMACPKR='894337'; // another LTL example with smaller orders, therefore pallets are more mixed
// $aYMACPKR='1225311'; // parcel example
// ESN2
// $aYMACPKR='999999'; // LTL example
$aYMACPKR = '748101'; // LTL example
$myRequest = new Request;
$myRequest->setMethod('POST');
$myRequest->request->add([
'MACPKR' => $aYMACPKR,
]);
// Call the controller method properly
$controller = new GetContentsController;
$response = $controller->processShipment($myRequest);
$responseData = $response->getData();
$error = isset($responseData->error) ? $responseData->error : '';
if ($error == '') {
// Get Commodities
$commoditiesTmp = isset($responseData->commodities) ? $responseData->commodities : '';
if ($commoditiesTmp != '') {
$commodities = json_encode($commoditiesTmp);
dump($commodities);
} else {
dump('Commodities Empty...');
}
} else {
dump($error);
}
}
}