M3 Integration fixes
This commit is contained in:
Executable
Executable
+77
@@ -0,0 +1,77 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\M3\Console;
|
||||
|
||||
use Config;
|
||||
use DB;
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Http\Request;
|
||||
use Log;
|
||||
use Modules\M3\Http\Controllers\API\CloseShipment;
|
||||
|
||||
class CallCloseAPI extends Command
|
||||
{
|
||||
protected $signature = 'command:CallCloseAPI {user?} {manifest?} {co?} {whs?} ';
|
||||
|
||||
protected $description = 'Call Close API';
|
||||
|
||||
public function handle()
|
||||
{
|
||||
self::configureTimeouts();
|
||||
try {
|
||||
$manifest = (string) ($this->argument('manifest') ?? '');
|
||||
if ($manifest !== '') {
|
||||
return $this->closeSpecificManifest($manifest, (string) ($this->argument('co') ?? ''), (string) ($this->argument('whs') ?? ''));
|
||||
}
|
||||
$this->closePendingManifests();
|
||||
|
||||
return self::SUCCESS;
|
||||
} catch (\Throwable $th) {
|
||||
Log::channel('dailyCron')->error($th);
|
||||
|
||||
return self::FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
private static function configureTimeouts(): void
|
||||
{
|
||||
$timeout = Config::get('arrays.PHPTimeOut');
|
||||
ini_set('max_execution_time', $timeout);
|
||||
ini_set('max_input_time', $timeout);
|
||||
ini_set('default_socket_timeout', $timeout);
|
||||
}
|
||||
|
||||
private function closePendingManifests(): void
|
||||
{
|
||||
$rows = 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();
|
||||
foreach ($rows as $row) {
|
||||
$this->closeManifest((string) $row->APMANIFEST, (string) ($row->APCO ?? ''), (string) ($row->APWHS ?? ''));
|
||||
}
|
||||
}
|
||||
|
||||
private function closeSpecificManifest(string $manifest, string $co, string $whs): int
|
||||
{
|
||||
$exists = DB::connection(config('m3.connection', 'pgsql'))->table('icm705m1')
|
||||
->where('APSPARE2', '')->where('APCO', $co)->where('APWHS', $whs)->where('APMANIFEST', $manifest)->exists();
|
||||
if (! $exists) {
|
||||
Log::channel('dailyCron')->warning('Manifest not available for close', compact('manifest', 'co', 'whs'));
|
||||
|
||||
return self::FAILURE;
|
||||
}
|
||||
$this->closeManifest($manifest, $co, $whs);
|
||||
|
||||
return self::SUCCESS;
|
||||
}
|
||||
|
||||
private function closeManifest(string $manifest, string $co, string $whs): void
|
||||
{
|
||||
DB::connection(config('m3.connection', 'pgsql'))->table('icm705m1')
|
||||
->where('APMANIFEST', $manifest)->where('APCO', $co)->where('APWHS', $whs)->update(['APSPARE2' => 'P']);
|
||||
$request = Request::create('', 'POST', ['WHS' => $whs, 'COMPANY' => $co, 'TRANSTYPE' => 'M', 'MANIFEST' => $manifest]);
|
||||
$response = CloseShipment::CloseShipmentCoChargeAPI($request);
|
||||
$json = json_encode($response->getData());
|
||||
Log::channel('dailyCron')->info('Close Shipment API Response for Manifest:' . $manifest . '-' . $json);
|
||||
}
|
||||
}
|
||||
Executable
+223
@@ -0,0 +1,223 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\M3\Console;
|
||||
|
||||
use Config;
|
||||
use DB;
|
||||
use Illuminate\Console\Command;
|
||||
use Log;
|
||||
use Modules\M3\Services\SpreadsheetExport;
|
||||
use Storage;
|
||||
|
||||
class ClosedOrderSaveXls extends Command
|
||||
{
|
||||
private const XLSX_EXTENSION = '.xlsx';
|
||||
|
||||
/**
|
||||
* The name and signature of the console command.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $signature = 'command:ClosedOrderSaveXls {user?} {co?} {whs?} {pl?}';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'Save Orders Closed Lines to Excel';
|
||||
|
||||
/**
|
||||
* Create a new command instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
/**
|
||||
* Execute the console command.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
$this->configureRuntime();
|
||||
|
||||
try {
|
||||
Log::channel('dailyCron')->info('Cron...Start Save Orders Closed Lines to Excel');
|
||||
[$company, $warehouse, $plant] = $this->argumentsForReport();
|
||||
|
||||
$this->generatePreviousMonthReport($company, $warehouse, $plant);
|
||||
$this->generateCurrentMonthReport($company, $warehouse, $plant);
|
||||
|
||||
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::channel('dailyCron')->error($th);
|
||||
|
||||
return self::FAILURE;
|
||||
}
|
||||
|
||||
return self::SUCCESS;
|
||||
}
|
||||
|
||||
private function configureRuntime(): void
|
||||
{
|
||||
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');
|
||||
}
|
||||
|
||||
private function argumentsForReport(): array
|
||||
{
|
||||
return [
|
||||
trim((string) $this->argument('co')),
|
||||
trim((string) $this->argument('whs')),
|
||||
trim((string) $this->argument('pl')),
|
||||
];
|
||||
}
|
||||
|
||||
private function generatePreviousMonthReport(string $company, string $warehouse, string $plant): void
|
||||
{
|
||||
$date = new \DateTime('FIRST DAY OF THIS MONTH');
|
||||
$date->modify('-1 month');
|
||||
$from = $date->format('Y-m-d');
|
||||
$to = $date->modify('last day of this month')->format('Y-m-d');
|
||||
$file = $warehouse === '321'
|
||||
? 'Closedorderlinesreport_' . $from . '-' . $to . self::XLSX_EXTENSION
|
||||
: $warehouse . '/Closedorderlinesreport_' . $from . '-' . $to . '-' . $warehouse . self::XLSX_EXTENSION;
|
||||
|
||||
$this->info('Generate Last Month Report...');
|
||||
$this->generateReport(
|
||||
$company,
|
||||
$warehouse,
|
||||
$plant,
|
||||
str_replace('-', '', $from),
|
||||
str_replace('-', '', $to),
|
||||
$file,
|
||||
! Storage::disk('publicCL')->exists($file),
|
||||
'Last Month',
|
||||
);
|
||||
}
|
||||
|
||||
private function generateCurrentMonthReport(string $company, string $warehouse, string $plant): void
|
||||
{
|
||||
$now = new \DateTime;
|
||||
$from = $now->format('Y-m-01');
|
||||
$to = $now->format('Y-m-d');
|
||||
$file = $warehouse === '321'
|
||||
? 'first_of_month_to_current_date.xlsx'
|
||||
: $warehouse . '/first_of_month_to_current_date_' . $warehouse . self::XLSX_EXTENSION;
|
||||
|
||||
$this->info('Generate Current Month Report...');
|
||||
$this->generateReport(
|
||||
$company,
|
||||
$warehouse,
|
||||
$plant,
|
||||
str_replace('-', '', $from),
|
||||
str_replace('-', '', $to),
|
||||
$file,
|
||||
true,
|
||||
'Current Month',
|
||||
);
|
||||
}
|
||||
|
||||
private function generateReport(
|
||||
string $company,
|
||||
string $warehouse,
|
||||
string $plant,
|
||||
string $from,
|
||||
string $to,
|
||||
string $file,
|
||||
bool $shouldGenerate,
|
||||
string $label,
|
||||
): void {
|
||||
$this->info('From Date: ' . $from);
|
||||
$this->info('To Date: ' . $to);
|
||||
|
||||
if (! $shouldGenerate || ! $this->hasReportScope($company, $warehouse, $plant)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$rows = $this->closedOrderRows($company, $warehouse, $plant, $from, $to);
|
||||
if ($rows->isEmpty()) {
|
||||
Log::channel('dailyCron')->info($label . ' report, no records found: Nothing to save...');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$rows->prepend($this->headers());
|
||||
$this->logRecordLimit($rows->count());
|
||||
$this->info('Saving ' . $label . ' Excel Report to Disk');
|
||||
Log::channel('dailyCron')->info('Saving ' . $label . ' Excel Report to Disk');
|
||||
app(SpreadsheetExport::class)->store($rows, $file, 'publicCL');
|
||||
}
|
||||
|
||||
private function hasReportScope(string $company, string $warehouse, string $plant): bool
|
||||
{
|
||||
return $company !== '' && $warehouse !== '' && $plant !== '';
|
||||
}
|
||||
|
||||
private function closedOrderRows(string $company, string $warehouse, string $plant, string $from, string $to)
|
||||
{
|
||||
$ltlFactor = (100.00 - Config::get('arrays.misc.discountCarrierRateForCustomerPriceLTL')) / 100;
|
||||
$parcelFactor = (100.00 - Config::get('arrays.misc.discountCarrierRateForCustomerPriceParcel')) / 100;
|
||||
|
||||
$sql = <<<'SQL'
|
||||
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) * ?
|
||||
ELSE (SELECT A4RATETCP FROM ICM688M1 WHERE A4MACPKR=A5MACPKR) * ?
|
||||
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 ? AND ?
|
||||
)
|
||||
AND A5CO=? AND A5WHS=? AND A5PLANT=?
|
||||
SQL;
|
||||
|
||||
return collect(DB::connection(config('m3.connection', 'pgsql'))->select($sql, [
|
||||
$ltlFactor, $parcelFactor, $from, $to, $company, $warehouse, $plant,
|
||||
]));
|
||||
}
|
||||
|
||||
private function headers(): array
|
||||
{
|
||||
return [
|
||||
'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',
|
||||
];
|
||||
}
|
||||
|
||||
private function logRecordLimit(int $count): void
|
||||
{
|
||||
$maxRecords = (int) Config::get('arrays.maxRecCL');
|
||||
if ($count <= $maxRecords) {
|
||||
return;
|
||||
}
|
||||
|
||||
Log::channel('dailyCron')->info(
|
||||
'Maximum allowed records for Excel export is: ' . number_format($maxRecords)
|
||||
. ' current records: ' . number_format($count),
|
||||
);
|
||||
}
|
||||
}
|
||||
Executable
+88
@@ -0,0 +1,88 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\M3\Console;
|
||||
|
||||
use Config;
|
||||
use File;
|
||||
use Illuminate\Console\Command;
|
||||
use Log;
|
||||
|
||||
class DeleteOldLabels extends Command
|
||||
{
|
||||
/**
|
||||
* The name and signature of the console command.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $signature = 'command:DeleteOldLabelsCmd';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'Delete Old Labels Command';
|
||||
|
||||
/**
|
||||
* Create a new command instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
/**
|
||||
* Execute the console command.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function handle(): void
|
||||
{
|
||||
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 $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 {} \;');
|
||||
}
|
||||
|
||||
$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;
|
||||
}
|
||||
}
|
||||
|
||||
// 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::channel('dailyCron')->error($th);
|
||||
}
|
||||
}
|
||||
}
|
||||
Executable
+258
@@ -0,0 +1,258 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\M3\Console;
|
||||
|
||||
use Ayeo\Barcode;
|
||||
use Cache;
|
||||
use Config;
|
||||
use DB;
|
||||
use Dompdf\Dompdf;
|
||||
use File;
|
||||
use Illuminate\Console\Command;
|
||||
use Log;
|
||||
use PDF;
|
||||
use Picqer\Barcode\BarcodeGeneratorPNG;
|
||||
use Str;
|
||||
|
||||
class GenerateGS1Cmd extends Command
|
||||
{
|
||||
/**
|
||||
* The name and signature of the console command.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $signature = 'command:GenerateGS1Cmd {user?} {--gsarray=}';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'Generate GS1-128 Label';
|
||||
|
||||
/**
|
||||
* Create a new command instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
/**
|
||||
* Execute the console command.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
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 = $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);
|
||||
|
||||
// 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();
|
||||
|
||||
$cOMPANY = isset($iCM428M->R428CO) ? $iCM428M->R428CO : ''; // Company
|
||||
$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 = '
|
||||
<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;
|
||||
while ($packageNum <= $packageCount) {
|
||||
$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_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',
|
||||
'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 .= '
|
||||
<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['ShipmentPONumber'] . ' <br>
|
||||
B/L #: ' . $gSArray['BOLnumber'] . '
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2" class="border_btm margin_t align_lft border_rght">
|
||||
PURCHASE ORDER: ' . $gSArray['Macpkr'] . ' <br>
|
||||
Vendor: ' . $manufactID . '
|
||||
</td>
|
||||
<td colspan="2" class="border_btm margin_t align_center">
|
||||
Pallet # : ' . $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>';
|
||||
|
||||
$packageNum++;
|
||||
}
|
||||
|
||||
$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');
|
||||
// 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::channel('LabelCron')->error($th);
|
||||
}
|
||||
}
|
||||
}
|
||||
Executable
+56
@@ -0,0 +1,56 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\M3\Console;
|
||||
|
||||
use Config;
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Http\Request;
|
||||
use Log;
|
||||
use Modules\M3\Http\Controllers\UtilitiesController;
|
||||
|
||||
class UtilitiesCmd extends Command
|
||||
{
|
||||
/**
|
||||
* The name and signature of the console command.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $signature = 'command:UtilitiesCmd';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'Utilities Command';
|
||||
|
||||
/**
|
||||
* Create a new command instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
/**
|
||||
* Execute the console command.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function handle(): void
|
||||
{
|
||||
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...');
|
||||
|
||||
$myRequest = new Request;
|
||||
UtilitiesController::fixICM799MSentPKR($myRequest);
|
||||
|
||||
$this->info('End Utilities Command...');
|
||||
|
||||
} catch (\Throwable $th) {
|
||||
Log::channel('dailyCron')->error($th);
|
||||
}
|
||||
}
|
||||
}
|
||||
Executable
+145
@@ -0,0 +1,145 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\M3\Console;
|
||||
|
||||
use Config;
|
||||
use DB;
|
||||
use Illuminate\Console\Command;
|
||||
use Log;
|
||||
use Modules\M3\Services\SpreadsheetExport;
|
||||
|
||||
class WHSMetricsSaveXls extends Command
|
||||
{
|
||||
/**
|
||||
* The name and signature of the console command.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $signature = 'command:WHSMetricsSaveXls {user?} {co?} {whs?} {pl?}';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'Save WHS Metrics to Excel';
|
||||
|
||||
/**
|
||||
* Create a new command instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
/**
|
||||
* Execute the console command.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
$this->configureRuntime();
|
||||
|
||||
try {
|
||||
Log::channel('dailyCron')->info('Cron...Start Save WHS Metrics to Excel');
|
||||
$company = '110';
|
||||
$warehouse = '321';
|
||||
$plant = '143';
|
||||
$file = 'WhsPerf/' . $warehouse . '/WhsPerfMetrics_' . date('Y-m-d') . '-' . $warehouse . '.xlsx';
|
||||
|
||||
Log::channel('dailyCron')->info('>>> File Name: ' . $file);
|
||||
$this->info('Generate Today WHS Performance Report...');
|
||||
|
||||
[$summary, $details] = $this->reportCollections($company, $warehouse, $plant);
|
||||
$this->storeReport($summary, $details, $file);
|
||||
|
||||
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::channel('dailyCron')->error($th);
|
||||
}
|
||||
|
||||
return self::SUCCESS;
|
||||
}
|
||||
|
||||
private function configureRuntime(): void
|
||||
{
|
||||
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');
|
||||
}
|
||||
|
||||
private function reportCollections(string $company, string $warehouse, string $plant): array
|
||||
{
|
||||
$summary = collect($this->summaryRows($company, $warehouse, $plant))->map(fn ($item) => $this->trimRow($item));
|
||||
$summary->prepend([
|
||||
'A4SHIPTYPE' => 'Method', 'STATUS' => 'Status', 'SOURCE' => 'Source', 'PICKERS' => 'Pickers',
|
||||
'WEIGHT' => 'Weight', 'LINES' => 'Lines', 'DOLLARS' => 'Dollars',
|
||||
]);
|
||||
|
||||
$details = collect($this->detailRows($company, $warehouse, $plant))->map(fn ($item) => $this->trimRow($item));
|
||||
$details->prepend([
|
||||
'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',
|
||||
]);
|
||||
|
||||
return [$summary, $details];
|
||||
}
|
||||
|
||||
private function trimRow(object $item): object
|
||||
{
|
||||
foreach ($item as $key => $value) {
|
||||
if (is_string($value)) {
|
||||
$item->{$key} = trim($value);
|
||||
}
|
||||
}
|
||||
|
||||
return $item;
|
||||
}
|
||||
|
||||
private function summaryRows(string $company, string $warehouse, string $plant): array
|
||||
{
|
||||
return DB::connection(config('m3.connection', 'pgsql'))->select(<<<'SQL'
|
||||
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=? AND A3WHS=? AND A3PLT=?
|
||||
)
|
||||
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
|
||||
SQL, [$company, $warehouse, $plant]);
|
||||
}
|
||||
|
||||
private function detailRows(string $company, string $warehouse, string $plant): array
|
||||
{
|
||||
return DB::connection(config('m3.connection', 'pgsql'))->select(<<<'SQL'
|
||||
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=? AND A3WHS=? AND A3PLT=?
|
||||
) SELECT * FROM TEMPFILE
|
||||
SQL, [$company, $warehouse, $plant]);
|
||||
}
|
||||
|
||||
private function storeReport($summary, $details, string $file): void
|
||||
{
|
||||
if ($summary->isEmpty() || $details->isEmpty()) {
|
||||
Log::channel('dailyCron')->info('Today WHS Performance Report, no records found: Nothing to save...');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$this->info('Saving Today WHS Performance Report to Disk...');
|
||||
Log::channel('dailyCron')->info('Saving Today WHS Performance Report to Disk...');
|
||||
app(SpreadsheetExport::class)->storeSheets(['Summary' => $summary, 'Details' => $details], $file, 'publicLabels');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user