PHP code example of entelix / edilink
1. Go to this page and download the library: Download entelix/edilink library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
entelix / edilink example snippets
use Entelix\EdiLink\DTOs\MovementRecord;
$record = MovementRecord::build()
->identity('CMAU1234560', '20GP', 'MSC', reportingParty: 'ADEPOT')
->depot('ADN01', zone: 26)
->arrival('2024-06-01 08:00:00', movementType: 'FULL_IN', vehicleNo: 'GJ05TX1234')
->deliveryOrder('MSCUDO123456', validity: '2024-06-10', grace: false)
->survey('2024-06-01 10:00:00')
->repairCycle(sentAt: '2024-06-02 09:00:00', returnedAt: '2024-06-05 14:00:00')
->departure('2024-06-08 11:00:00', movementType: 'FULL_OUT', vehicleNo: 'MH04CD5678')
->booking('MSCUBOOK001', validity: '2024-06-15', consignee: 'ACME EXPORTS', sealRef: 'MSC987654')
->ediFlags(gateIn: '', survey: '', mnrIn: '', mnrOut: '', gateOut: '')
->id('1001')
->make();
$record = MovementRecord::fromArray($dbRow);
$output->content; // string — the EDI text (or JSON for array format)
$output-> // array — structured rows for Excel/OVA
$output->hasContent(); // bool
$output->lineCount(); // int
$output->recordCount(); // int
use Entelix\EdiLink\Facades\EdiLink;
$output = EdiLink::carrier('MSC')->buildGateIn($records);
file_put_contents(storage_path('app/edilink/gatein.txt'), $output->content);
// Update your DB for the records that were
$results = EdiLink::carrier('MSC')->buildAll($records);
// $results is keyed by event type:
// ['gate_in' => EdiOutput, 'survey' => EdiOutput, 'repair_dispatch' => EdiOutput, ...]
$filename = 'MSC_EDI_' . now()->format('d_M_Y_H_i') . '.txt';
$buffer = '';
foreach ($results as $eventType => $output) {
$buffer .= $output->content;
if (! empty($output->r::whereIn('id', $output->
$ediContent = EdiLink::generate('MSC', $records);
file_put_contents($path, $ediContent);
$output = EdiLink::carrier('MSC', 'array')->buildGateIn($records);
$rows = json_decode($output->content, true);
// Each row is an associative array: ['carrier_code', 'container_number', 'event_code', ...]
// Export to Excel
foreach ($rows as $row) {
$sheet->appendRow(array_values($row));
}
// app/Models/ContainerUnit.php
public function scopePendingEdiFor(Builder $query, string $carrier, Carbon $from, Carbon $to): Builder
{
// Adapt column names to match your own schema
return $query
->where('shipping_line', $carrier)
->where(function (Builder $q) use ($from, $to) {
$events = [
['flag' => 'edi_arrival', 'event_col' => 'arrived_at'],
['flag' => 'edi_survey', 'event_col' => 'surveyed_at'],
['flag' => 'edi_mnr_out', 'event_col' => 'repair_sent_at'],
['flag' => 'edi_mnr_in', 'event_col' => 'repair_done_at'],
['flag' => 'edi_departed', 'event_col' => 'departed_at'],
];
foreach ($events as $e) {
$q->orWhere(fn(Builder $sub) =>
$sub->whereNull($e['flag'])
->whereBetween($e['event_col'], [$from, $to])
);
}
});
}
// app/Console/Commands/DispatchCarrierEdi.php
namespace App\Console\Commands;
use App\Models\ContainerUnit;
use Entelix\EdiLink\Core\EdiOutput;
use Entelix\EdiLink\DTOs\MovementRecord;
use Entelix\EdiLink\Facades\EdiLink;
use Illuminate\Console\Command;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Storage;
class DispatchCarrierEdi extends Command
{
protected $signature = 'edi:dispatch {carrier}';
protected $description = 'Build and email a carrier EDI file covering the previous hour';
/**
* Maps EDILink event slugs to the dispatch-flag column in your table.
* Adjust the right-hand values to match your actual column names.
*/
private const DISPATCH_FLAGS = [
'gate_in' => 'edi_arrival',
'survey' => 'edi_survey',
'repair_dispatch' => 'edi_mnr_out',
'repair_return' => 'edi_mnr_in',
'gate_out' => 'edi_departed',
];
public function handle(): int
{
$carrier = strtoupper($this->argument('carrier'));
$window = $this->reportingWindow();
$filename = sprintf('%s_EDI_%s.txt', $carrier, $window['from']->format('Ymd_Hi'));
$units = ContainerUnit::with(['depot', 'inboundOrder', 'outboundBooking', 'activeSeal'])
->pendingEdiFor($carrier, $window['from'], $window['to'])
->get();
if ($units->isEmpty()) {
$this->info("No pending {$carrier} EDI events in window.");
return self::SUCCESS;
}
// Hydrate MovementRecord objects from your model collection.
// fromArray() accepts any key names — map yours here once.
$records = $units->map(fn($unit) => MovementRecord::fromArray([
'id' => $unit->id,
'container_number' => $unit->unit_number,
'iso_type' => $unit->size_type,
'carrier_code' => $unit->shipping_line,
'reporting_party' => $unit->depot->edi_party_code,
'depot_code' => $unit->depot->location_code,
'zone_id' => $unit->depot->zone_id,
'arrived_at' => $unit->arrived_at,
'arrival_movement_type' => $unit->arrival_type,
'arrival_vehicle' => $unit->arrival_vehicle_ref,
'delivery_order_ref' => $unit->inboundOrder?->reference,
'delivery_order_expiry' => $unit->inboundOrder?->expires_at,
'delivery_order_overdue' => $unit->arrival_after_do_expiry,
'surveyed_at' => $unit->surveyed_at,
'sent_for_repair_at' => $unit->repair_sent_at,
'returned_from_repair_at' => $unit->repair_done_at,
'departed_at' => $unit->departed_at,
'departure_movement_type' => $unit->departure_type,
'departure_vehicle' => $unit->departure_vehicle_ref,
'destination_location' => $unit->departure_destination,
'booking_ref' => $unit->outboundBooking?->reference,
'booking_expiry' => $unit->outboundBooking?->expires_at,
'booking_overdue' => $unit->departure_after_booking_expiry,
'consignee_name' => $unit->outboundBooking?->consignee,
'seal_reference' => $unit->activeSeal?->full_number,
// Dispatch flags — empty string = pending, filename = already sent
'dispatched_gate_in' => $unit->edi_arrival ?? '',
'dispatched_survey' => $unit->edi_survey ?? '',
'dispatched_mnr_in' => $unit->edi_mnr_out ?? '',
'dispatched_mnr_out' => $unit->edi_mnr_in ?? '',
'dispatched_gate_out' => $unit->edi_departed ?? '',
]))->all();
// Generate all event types in a single pass
$results = EdiLink::carrier($carrier)->buildAll($records);
// Concatenate content + stamp dispatched flags in one loop
$ediContent = collect($results)
->filter(fn(EdiOutput $o) => $o->hasContent())
->each(function (EdiOutput $output) use ($filename) {
$column = self::DISPATCH_FLAGS[$output->eventType] ?? null;
if ($column && $output->
// routes/console.php (Laravel 11+)
Schedule::command('edi:dispatch MSC')->hourly();
// app/EdiLink/HllCarrierProfile.php
namespace App\EdiLink;
use Entelix\EdiLink\Builders\AbstractCarrierProfile;
use Entelix\EdiLink\Core\EdiLine;
use Entelix\EdiLink\Core\EdiOutput;
use Entelix\EdiLink\DTOs\MovementRecord;
use DateTimeImmutable;
class HllCarrierProfile extends AbstractCarrierProfile
{
public function carrierCode(): string { return 'HLL'; }
public function carrierName(): string { return 'Hapag-Lloyd'; }
public function buildGateIn(array $records): EdiOutput
{
$lines = [];
$dAt))
->add('location', 5, $record->depotCode);
$lines[] = $line->toText();
$
'carriers' => [
'HLL' => \App\EdiLink\HllCarrierProfile::class,
],
EdiLink::carrier('HLL')->buildAll($records);
bash
php artisan vendor:publish --tag=edilink-config
bash
# Check registered carriers and usage hint
php artisan edilink:generate MSC
# Validate an EDI file against a carrier schema
php artisan edilink:validate /path/to/file.txt --carrier=MSC