From 1b06486b2bdca010a39e9f22a1436e1c9338bf8b Mon Sep 17 00:00:00 2001 From: Konstantinos Arvanitakis Date: Tue, 29 Sep 2026 14:31:30 +0300 Subject: [PATCH] Feat: Adding Elta integrations --- composer.json | 4 +- config/shippingCarriers/elta.php | 70 +++++ resources/logos/elta-courier-logo.png | Bin 0 -> 92711 bytes .../shipping/carriers/elta/label-a4.blade.php | 123 +++++++++ .../shipping/carriers/elta/label-a6.blade.php | 225 ++++++++++++++++ .../elta/partials/_main-copy.blade.php | 153 +++++++++++ .../elta/partials/_party-box.blade.php | 17 ++ .../elta/partials/_payment-stub.blade.php | 120 +++++++++ src/Providers/ShippingServiceProvider.php | 8 + src/Shipping/Carriers/Elta/AreaResolver.php | 39 +++ src/Shipping/Carriers/Elta/EltaClient.php | 156 +++++++++++ .../Carriers/Elta/EltaFulfillmentService.php | 249 ++++++++++++++++++ .../Carriers/Elta/EltaLabelRenderer.php | 184 +++++++++++++ src/Shipping/Carriers/Elta/EltaRateDriver.php | 70 +++++ src/Shipping/Carriers/Elta/EltaResponse.php | 43 +++ src/Shipping/Carriers/Elta/EltaStation.php | 11 + .../Elta/Exceptions/EltaApiException.php | 14 + 17 files changed, 1485 insertions(+), 1 deletion(-) create mode 100644 config/shippingCarriers/elta.php create mode 100644 resources/logos/elta-courier-logo.png create mode 100644 resources/views/shipping/carriers/elta/label-a4.blade.php create mode 100644 resources/views/shipping/carriers/elta/label-a6.blade.php create mode 100644 resources/views/shipping/carriers/elta/partials/_main-copy.blade.php create mode 100644 resources/views/shipping/carriers/elta/partials/_party-box.blade.php create mode 100644 resources/views/shipping/carriers/elta/partials/_payment-stub.blade.php create mode 100644 src/Shipping/Carriers/Elta/AreaResolver.php create mode 100644 src/Shipping/Carriers/Elta/EltaClient.php create mode 100644 src/Shipping/Carriers/Elta/EltaFulfillmentService.php create mode 100644 src/Shipping/Carriers/Elta/EltaLabelRenderer.php create mode 100644 src/Shipping/Carriers/Elta/EltaRateDriver.php create mode 100644 src/Shipping/Carriers/Elta/EltaResponse.php create mode 100644 src/Shipping/Carriers/Elta/EltaStation.php create mode 100644 src/Shipping/Carriers/Elta/Exceptions/EltaApiException.php diff --git a/composer.json b/composer.json index ece4e5f..7ae801f 100644 --- a/composer.json +++ b/composer.json @@ -18,7 +18,9 @@ "lunarphp/search": "*", "lunarphp/meilisearch": "*", "spatie/laravel-translation-loader": "^2.8", - "stripe/stripe-php": "^16.6" + "stripe/stripe-php": "^16.6", + "picqer/php-barcode-generator": "^3.3", + "barryvdh/laravel-dompdf": "^3.1" }, "require-dev": { "fakerphp/faker": "^1.23", diff --git a/config/shippingCarriers/elta.php b/config/shippingCarriers/elta.php new file mode 100644 index 0000000..014b8cb --- /dev/null +++ b/config/shippingCarriers/elta.php @@ -0,0 +1,70 @@ + env('ELTA_SERVICE_LOCATION', 'http://212.205.47.226:9003'), + + 'user_code' => env('ELTA_USER_CODE'), + 'user_pass' => env('ELTA_USER_PASS'), + + 'apost_code' => env('ELTA_APOST_CODE'), + 'apost_sub_code' => env('ELTA_APOST_SUB_CODE'), + + 'sender_name' => env('ELTA_SENDER_NAME'), + 'sender_address' => env('ELTA_SENDER_ADDRESS'), + 'sender_postcode' => env('ELTA_SENDER_POSTCODE'), + 'sender_area' => env('ELTA_SENDER_AREA'), + 'sender_phone' => env('ELTA_SENDER_PHONE'), + 'origin_station_code' => env('ELTA_ORIGIN_STATION_CODE'), + + 'label_paper_size' => env('ELTA_LABEL_PAPER_SIZE', 'a4'), + + 'timeout' => env('ELTA_HTTP_TIMEOUT', 15), + +]; diff --git a/resources/logos/elta-courier-logo.png b/resources/logos/elta-courier-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..aee4f2b9682a12cd328c8cb846e0452c7a5e331e GIT binary patch literal 92711 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 literal 0 HcmV?d00001 diff --git a/resources/views/shipping/carriers/elta/label-a4.blade.php b/resources/views/shipping/carriers/elta/label-a4.blade.php new file mode 100644 index 0000000..185dbb0 --- /dev/null +++ b/resources/views/shipping/carriers/elta/label-a4.blade.php @@ -0,0 +1,123 @@ + + + + + + + +

+ + {{-- Copy 1: delivery copy — RDLC band top=0 --}} +
+ @include('core::shipping.carriers.elta.partials._main-copy', ['copyType' => 'delivery']) +
+
+
3. ΑΡΧΕΙΟ / ΓΡΑΦΕΙΟ ΚΑΤΑΘΕΣΗΣ
+
+ +
✂ ΑΠΟΚΟΨΤΕ ΕΔΩ
+ + {{-- Copy 2: sender's copy — RDLC band top≈8.94cm on the full page --}} +
+ @include('core::shipping.carriers.elta.partials._main-copy', ['copyType' => 'sender']) +
+ +
✂ ΑΠΟΚΟΨΤΕ ΕΔΩ
+ + {{-- Copy 3: ΤΑΧΥΠΛΗΡΩΜΗ ΕΙΣΠΡΑΞΗ / ΜΕΤΑΒΙΒΑΣΗ stub — RDLC band top≈19.22cm --}} +
+ ΤΑΧΥΠΛΗΡΩΜΗ ΕΙΣΠΡΑΞΗ / ΜΕΤΑΒΙΒΑΣΗ   Ο. Αριθμός Λογ/μού Ταχυπληρωμής {{ $siimvasi }} +
+
+ @include('core::shipping.carriers.elta.partials._payment-stub') +
+ +
ΜΗ ΣΗΜΕΙΩΝΕΤΕ ΚΑΤΩ ΑΠΟ ΑΥΤΗ ΤΗ ΓΡΑΜΜΗ
+ + +
+ + diff --git a/resources/views/shipping/carriers/elta/label-a6.blade.php b/resources/views/shipping/carriers/elta/label-a6.blade.php new file mode 100644 index 0000000..0bfb277 --- /dev/null +++ b/resources/views/shipping/carriers/elta/label-a6.blade.php @@ -0,0 +1,225 @@ + + + + + + + +
+ {{-- Header: logo (0.10,0.12,1.66x1.26) + service box (6.42,0.10,3.93x0.84) --}} + +
+
ΥΠΗΡΕΣΙΑ: {{ $service_code }}
+
{{ $service_name }}
+
+
+ ΕΕΤΤ ΑΜ: 99-150 Γενική Άδεια
Ταχ/κων Υπηρεσιών +
+ +
{{ $date }}
+
ΣΥΝΟΔΕΥΤΙΚΟ ΔΕΛΤΙΟ ΤΑΧΥΜΕΤΑΦΟΡΑΣ
+ {{-- The RDLC's own barcode textbox here uses the "Free 3 of 9 + Extended" barcode font — we don't have that font, so this + would-be *{voucher}* fallback text is dropped in favor of the + real Code 128 barcode image rendered near the bottom instead. --}} +
{{ $time }}
+ +
+
Γρ. Επίδοσης :
+
{{ $station_pros }}
+
{{ $station_pros_title }}
+
+ + {{-- ΧΡΕΩΣΗ / REFERENCE / ΣΥΜΒΑΣΗ 3-cell row, and the Γρ.Κατάθεσης / + ΒΑΡΟΣ / ΟΓΚΟΜΕΤΡΙΚΟ ΒΑΡΟΣ / Τεμάχια row right below it: both are + genuinely tabular single rows of fixed-width cells, so — like + the equivalent A4 rows — they're built as real + instead of independently- + bordered absolute divs, which was drawing every shared edge + (each cell-to-cell seam, and the seam between these two rows) + twice, visibly doubling/thickening those lines versus a real + printed ELTA label. Each table is positioned at the row's own + RDLC top/left; the first table's bottom border is dropped since + the second table's top border already draws that shared line. --}} +
+ + + + + + + + +
+
{{ $xreosi }}
+
+
{{ $ocr_reference }}
+
+
{{ $siimvasi }}
+
+ + + + + + + + + + +
+
Γρ.Κατάθεσης:
+
{{ $station_apo }}
+
+
ΒΑΡΟΣ(Kgr)
+
{{ $weight }}
+
+
ΟΓΚΟΜΕΤΡΙΚΟ ΒΑΡΟΣ(Kgr)
+
{{ $volumetric_weight ?? '0.000' }}
+
+
Τεμάχια
+
{{ $package_label }}
+
+ + {{-- ΑΠΟΣΤΟΛΕΑΣ + ΑΙΤΙΑ ΕΠΙΣΤΡΟΦΗΣ --}} +
+ @include('core::shipping.carriers.elta.partials._party-box', [ + 'title' => 'ΑΠΟΣΤΟΛΕΑΣ', + 'lines' => $sender_lines, + ]) +
+
+
ΑΙΤΙΑ ΕΠΙΣΤΡΟΦΗΣ
+
+
Άγνωστος
+
Ελλειπή Δ/νση
+
Απαράδεκτο
+
Άλλαξε Δ/νση
+
Αζήτητο
+
+
+ + {{-- ΠΑΡΑΛΗΠΤΗΣ + ΑΝΤΙΚΑΤΑΒΟΛΗ column --}} +
+ @include('core::shipping.carriers.elta.partials._party-box', [ + 'title' => 'ΠΑΡΑΛΗΠΤΗΣ', + 'lines' => $recipient_lines, + ]) +
+
+ @if ($antik_1 ?? null) +
{{ $antik_1 }}
+ @endif +
+ + {{-- REFERENCE / ΕΠΙΒΑΡΥΝΣΕΙΣ --}} +
+
REFERENCE
+
{{ $order_reference }}
+
+
+
* ΕΠΙΒΑΡΥΝΣΕΙΣ *
+
+ + {{-- ΠΑΡΑΤΗΡΗΣΕΙΣ --}} +
+
* ΠΑΡΑΤΗΡΗΣΕΙΣ *
+
+ + @if ($multiPiece) +
+
* ΠΟΛΛΑΠΛΗ ΑΠΟΣΤΟΛΗ * {{ $package_label }}
+
+ @endif + +
+ +
+ + @if ($antik_1 ?? null) +
+
{{ $antik_1 }}
+
+ @endif + +
+ +
+
{{ $voucher_no }}
+
+ + diff --git a/resources/views/shipping/carriers/elta/partials/_main-copy.blade.php b/resources/views/shipping/carriers/elta/partials/_main-copy.blade.php new file mode 100644 index 0000000..89a7c33 --- /dev/null +++ b/resources/views/shipping/carriers/elta/partials/_main-copy.blade.php @@ -0,0 +1,153 @@ +{{-- + One "ΣΥΝΟΔΕΥΤΙΚΟ ΔΕΛΤΙΟ ΤΑΧΥΜΕΤΑΦΟΡΑΣ" copy (delivery or sender's), + geometry transcribed directly from ELTA_PEL.sydetaE.rdlc's delivery- + copy band (Top/Left values there are relative to that band; here + they're absolute cm offsets from THIS partial's own 0,0, since the + caller wraps it in a `position:relative` container sized 15.75cm x + 8.75cm — the same width/height as the RDLC band, read off its own + rectangle8/rectangle9/rectangle11/rectangle12 extents). + + Expects: $copyType ('delivery'|'sender') and all of + EltaLabelRenderer's $data. +--}} + +
+
ΕΛΛΗΝΙΚΑ ΤΑΧΥΔΡΟΜΕΙΑ Α.Ε.
+
Έδρα: Απελλού 1, 105 51, Αθήνα
+
Υποκ/μα: Λ. Μεσογείων 395, 153 43, Αγ. Παρασκευή
+
Α.Φ.Μ.: 094026421 | Δ.Ο.Υ.: ΚΕΦΟ.Δ.Ε. ΑΤΤΙΚΗΣ
+
Τ. 210-6073000 | Ε. info@elta-courier.gr
+
www.eltacourier.gr
+
+
ΕΕΤΤ ΑΜ 99-150 Γενική Αδεια Ταχ/κων Υπηρεσιών
+ +{{-- Title / barcode / voucher, centered column at x=8.52..15.58 --}} +
+
ΣΥΝΟΔΕΥΤΙΚΟ ΔΕΛΤΙΟ ΤΑΧΥΜΕΤΑΦΟΡΑΣ
+
+ +
+ {{-- The RDLC's own barcode textbox uses the "Free 3 of 9 Extended" + barcode font (literal *{voucher}* text rendered as bars by that + font) — we don't have that font, so we render a real Code 128 + barcode image above instead (visually equivalent, actually + scannable), making this second plain-text *{voucher}* line + redundant with it rather than a distinct field. --}} +
{{ $voucher_no }}
+
+ +{{-- 5-cell deposit/destination/weight/pieces/volumetric row — a genuinely + tabular single row of fixed-width cells, so it's built as a real + rather than independently-bordered + absolute divs: that was drawing every shared internal edge twice + (once per adjacent cell), producing a visibly doubled/thickened line + that real printed ELTA labels don't show. The table is positioned via + the same absolute top/left/width the RDLC geometry gives the row as a + whole; each . --}} +
keeps its own RDLC-derived width via
+ + + + + + + + + + +
+
Γρ.Κατάθεσης
+
{{ $station_apo }}
+
+
Γρ.Προορισμού
+
{{ $station_pros }}
+
+
Βάρος
+
{{ $weight }}
+
+
Τεμάχια
+
{{ $package_label }}
+
+
Ογκ/κο Βάρος
+
{{ $volumetric_weight ?? '0.000' }}
+
+
+
ΥΠΗΡΕΣΙΑ :
+
{{ $service_code }}
+
{{ $service_name }}
+
+ +{{-- Sender box --}} +
+
ΑΠΟΣΤΟΛΕΑΣ
+ @foreach ($sender_lines as $i => $line) + @if (trim((string) $line) !== '') +
{{ $line }}
+ @endif + @endforeach +
+ +{{-- Recipient box --}} +
+
ΠΑΡΑΛΗΠΤΗΣ
+ @foreach ($recipient_lines as $i => $line) + @if (trim((string) $line) !== '') +
{{ $line }}
+ @endif + @endforeach +
+ +{{-- Charge banner + right-column panel stack (ΧΡΕΩΣΗ / Συν.Χρέωσης / + REFERENCE / ΠΑΡΑΤΗΡΗΣΕΙΣ, and the Πρόσθετες Υπηρεσίες column beside + them): these panels sit only a hair apart (~0.09-0.10cm, the RDLC's + own geometry, left untouched), close enough that each pair's two + independent borders read as one thick/doubled line at print + resolution. Each panel below keeps only the border sides it "owns" + on a shared seam (border-top/border-left removed where the + neighbouring panel above/left already draws that same line), so + every seam is drawn exactly once while every panel's outward-facing + sides keep their border. --}} +
{{ str_replace(' ΠΙΣΤΩΣΗ', ' ΤΡ.ΠΛΗΡ: ΠΙΣΤΩΣΗ', $xreosi) }}
+ +
+
Συν.Χρέωσης (€):
+
+
+
Πρόσθετες Υπηρεσίες
+ @foreach ([$sur_1 ?? null, $sur_2 ?? null, $sur_3 ?? null, $sur_4 ?? null] as $i => $sur) + @if (!empty($sur)) +
{{ $sur }}
+ @endif + @endforeach +
+ +
+
* REFERENCE No*
+
{{ $order_reference }}
+
+ +
+
* ΠΑΡΑΤΗΡΗΣΕΙΣ *
+
+ +{{-- Right-hand signature / print-timestamp column, differs by copy type --}} +@if ($copyType === 'delivery') +
+
{{ $antik_1 ?? '' }}
+
+
+
ΓΙΑ ΤΗΝ ΠΑΡΑΛΑΒΗ
+
ΟΝΟΜΑ/ΥΠΟΓΡΑΦΗ
+
{{ $date }} {{ $time }}
+
+@else +
+
{{ $antik_1 ?? '' }}
+
+
+
ΥΠΟΓΡΑΦΗ ΑΠΟΣΤΟΛΕΑ
+
Ημερομηνία - Ωρα Εκτύπωσης: {{ $date }} {{ $time }}
+
+@endif diff --git a/resources/views/shipping/carriers/elta/partials/_party-box.blade.php b/resources/views/shipping/carriers/elta/partials/_party-box.blade.php new file mode 100644 index 0000000..a3bd02d --- /dev/null +++ b/resources/views/shipping/carriers/elta/partials/_party-box.blade.php @@ -0,0 +1,17 @@ +{{-- + Sender/recipient box, matching SydetaLabelE.rdlc's rectangle10/ + rectangle11 (ΑΠΟΣΤΟΛΕΑΣ/ΠΑΡΑΛΗΠΤΗΣ) layout: a bold title line, then + the RDLC's sender_1..5 / rec_1..5 fields as separate plain text + lines (ELTA's own client pre-wraps the address into these fixed- + width lines server-side, so we render each line separately rather + than reflowing the address ourselves, to match the real line + breaks). + + Expects: $title, $lines (array of up to 5 strings). +--}} +
{{ $title }}
+@foreach ($lines as $line) + @if (trim((string) $line) !== '') +
{{ $line }}
+ @endif +@endforeach diff --git a/resources/views/shipping/carriers/elta/partials/_payment-stub.blade.php b/resources/views/shipping/carriers/elta/partials/_payment-stub.blade.php new file mode 100644 index 0000000..05c554a --- /dev/null +++ b/resources/views/shipping/carriers/elta/partials/_payment-stub.blade.php @@ -0,0 +1,120 @@ +{{-- + Copy 3: the ΤΑΧΥΠΛΗΡΩΜΗ ΕΙΣΠΡΑΞΗ/ΜΕΤΑΒΙΒΑΣΗ payment-receipt stub, + geometry transcribed from sydetaE.rdlc's third band (source Top + values there run ~19.22cm-27.0cm on the full A4 page; offsets below + are relative to this partial's own container, i.e. the RDLC's Top + minus 19.22cm). This band is narrower than copies 1/2 (starts at + x=3.01cm instead of x=0.27cm) — the RDLC leaves its left margin for + the perforated tear line + rotated "3. ΑΡΧΕΙΟ / ΓΡΑΦΕΙΟ ΚΑΤΑΘΕΣΗΣ" + text, reproduced by the caller outside this partial. + + Expects all of EltaLabelRenderer's $data. +--}} +
+
+ +
+
{{ $voucher_no }}
+
+
{{ $voucher_no }}
+ +{{-- 4-cell deposit/destination/weight/pieces row: same doubled-border + issue and same fix as _main-copy.blade.php's 5-cell row — a real + in place of 4 independently-bordered + absolute divs, positioned at the row's own RDLC top/left/width. --}} +
+ + + + {{-- border-bottom:none on every cell: the ΑΠΟΣΤΟΛΕΑΣ party box + immediately below (top:2.44cm, this row ends at 2.42cm) already + draws that shared line with its own border-top. --}} + + + + + + +
+
Γρ.Κατάθεσης
+
{{ $station_apo }}
+
+
Γρ.Προορισμού
+
{{ $station_pros }}
+
+
Βάρος
+
{{ $weight }}
+
+
Τεμάχια
+
{{ $package_label }}
+
+
+
{{ $service_code }}
+
{{ $service_name }}
+
+ +{{-- Below: several panel pairs sit a hair apart (or, for the + Συν.Χρέωσης/ΕΠΙΒΑΡΥΝΣΕΙΣ pair, even overlap slightly) per the RDLC's + own geometry — left untouched — close enough that two independent + borders read as one doubled/thick line. border-top/border-bottom is + removed from one side of each pair so only the remaining box's + border draws that shared line. --}} +
{{ str_replace(' ΠΙΣΤΩΣΗ', ' ΤΡ.ΠΛΗΡ: ΠΙΣΤΩΣΗ', $xreosi) }}
+ +
+
ΑΠΟΣΤΟΛΕΑΣ
+ @foreach ($sender_lines as $i => $line) + @if (trim((string) $line) !== '') +
{{ $line }}
+ @endif + @endforeach +
+
+
Συν.Χρέωσης (€):
+
Πρόσθετες Υπηρεσίες
+
+ +
+
ΠΑΡΑΛΗΠΤΗΣ
+ @foreach ($recipient_lines as $i => $line) + @if (trim((string) $line) !== '') +
{{ $line }}
+ @endif + @endforeach +
+
+
* ΕΠΙΒΑΡΥΝΣΕΙΣ *
+
+ +
+ Έλαβα γνώση των όρων που αναγράφονται στο αντίγραφο 1 και 6 και τους αποδέχομαι ανεπιφύλακτα +
+ +{{-- rectangle29 --}} +
+
ΥΠΟΓΡΑΦΗ ΑΠΟΣΤΟΛΕΑ
+
{{ $date }}
+
+{{-- rectangle43 --}} +
+
ΟΝΟΜΑ/ΥΠΟΓΡΑΦΗ ΠΑΡΑΛΗΠΤΗ
+
Ημ/νία:     Ώρα:
+
+{{-- rectangle44 --}} +
+
Π Ο Σ Ο
+
{{ number_format($cod_amount ?? 0, 2) }}
+
+{{-- rectangle45: small ELTA-branded legal box; the real RDLC fills it via + its own Image18 bitmap (baked "ΠΟΡΤΑ-ΠΟΡΤΑ ΕΛΛΗΝΙΚΑ ΤΑΧΥΔΡΟΜΕΙΑ..." + legal text + logo graphic) rather than text fields — approximated + here with our own extracted logo + the same legal text as plain + HTML, since we can't extract that embedded bitmap. --}} +
+
+ +
diff --git a/src/Providers/ShippingServiceProvider.php b/src/Providers/ShippingServiceProvider.php index 64cd7e2..3c78f7b 100644 --- a/src/Providers/ShippingServiceProvider.php +++ b/src/Providers/ShippingServiceProvider.php @@ -24,6 +24,9 @@ use Modules\Core\Shipping\Carriers\Acs\Jobs\WarmAcsAreaCacheJob; use Modules\Core\Shipping\Carriers\BoxNow\BoxNowClient; use Modules\Core\Shipping\Carriers\BoxNow\BoxNowFulfillmentService; use Modules\Core\Shipping\Carriers\BoxNow\BoxNowRateDriver; +use Modules\Core\Shipping\Carriers\Elta\EltaClient; +use Modules\Core\Shipping\Carriers\Elta\EltaFulfillmentService; +use Modules\Core\Shipping\Carriers\Elta\EltaRateDriver; use Modules\Core\Shipping\Contracts\CarrierFulfillmentInterface; use Modules\Core\Shipping\Filament\Pages\ManageShippingRates; use Modules\Core\Shipping\Carriers\StorePickup\StorePickupRateDriver; @@ -39,14 +42,17 @@ class ShippingServiceProvider extends ServiceProvider { $this->mergeConfigFrom(__DIR__ . '/../../config/shippingCarriers/acs.php', 'acs'); $this->mergeConfigFrom(__DIR__ . '/../../config/shippingCarriers/boxnow.php', 'boxnow'); + $this->mergeConfigFrom(__DIR__ . '/../../config/shippingCarriers/elta.php', 'elta'); $this->app->singleton(AcsClient::class, fn () => new AcsClient(config('acs'))); $this->app->singleton(BoxNowClient::class, fn () => new BoxNowClient(config('boxnow'))); + $this->app->singleton(EltaClient::class, fn () => new EltaClient(config('elta'))); $this->app->bind(CarrierFulfillmentInterface::class, function ($app, array $params) { return match ($params['carrier'] ?? null) { 'acs' => $app->make(AcsFulfillmentService::class), 'box-now' => $app->make(BoxNowFulfillmentService::class), + 'elta' => $app->make(EltaFulfillmentService::class), default => null, }; }); @@ -67,6 +73,7 @@ class ShippingServiceProvider extends ServiceProvider $this->publishes([ __DIR__ . '/../../config/shippingCarriers/acs.php' => config_path('shippingCarriers/acs.php'), __DIR__ . '/../../config/shippingCarriers/boxnow.php' => config_path('shippingCarriers/boxnow.php'), + __DIR__ . '/../../config/shippingCarriers/elta.php' => config_path('shippingCarriers/elta.php'), ], 'core-config'); // Signed-URL auth only, same model as Lunar's own vendor @@ -137,6 +144,7 @@ class ShippingServiceProvider extends ServiceProvider Shipping::extend('acs', fn ($app) => $app->make(AcsRateDriver::class)); Shipping::extend('box-now', fn ($app) => $app->make(BoxNowRateDriver::class)); Shipping::extend('store-pickup', fn ($app) => $app->make(StorePickupRateDriver::class)); + Shipping::extend('elta', fn ($app) => $app->make(EltaRateDriver::class)); $this->app->make(ConsoleSchedule::class) ->job(new WarmAcsAreaCacheJob) diff --git a/src/Shipping/Carriers/Elta/AreaResolver.php b/src/Shipping/Carriers/Elta/AreaResolver.php new file mode 100644 index 0000000..5ea0c62 --- /dev/null +++ b/src/Shipping/Carriers/Elta/AreaResolver.php @@ -0,0 +1,39 @@ +addDays(30), + function () use ($postcode) { + $response = $this->client->getStation([ + 'pel_tk' => $postcode, + 'sender_station' => '', + ])->throwIfError(); + + $fields = $response->data['pel_fields'] ?? []; + + return new EltaStation( + code: $fields['rec_station'] ?? '', + name: $fields['rec_station_t'] ?? '', + ); + }, + ); + } +} diff --git a/src/Shipping/Carriers/Elta/EltaClient.php b/src/Shipping/Carriers/Elta/EltaClient.php new file mode 100644 index 0000000..754c28e --- /dev/null +++ b/src/Shipping/Carriers/Elta/EltaClient.php @@ -0,0 +1,156 @@ +call('PELLOGINNEW', $params); + } + + public function createVoucher(array $params): EltaResponse + { + return $this->call('PELVGNEW', $params); + } + + public function listVouchers(array $params): EltaResponse + { + return $this->call('PELPARALVGNEW1', $params); + } + + public function deleteVoucher(array $params): EltaResponse + { + return $this->call('PELVGDEL', $params); + } + + public function getTracking(array $params): EltaResponse + { + return $this->call('PELTTNEW01', $params); + } + + public function getStation(array $params): EltaResponse + { + return $this->call('PELTKNEW', $params); + } + + private function call(string $operation, array $params): EltaResponse + { + $namespace = '/'.$operation; + + $body = ''; + foreach ($params as $key => $value) { + $body .= ''.htmlspecialchars((string) $value, ENT_XML1).''; + } + + $envelope = '' + .'' + .''.$body.''; + + $response = Http::withHeaders([ + 'SOAPAction' => 'Get', + 'Content-Type' => 'text/xml', + ]) + ->timeout($this->config['timeout']) + ->withBody($envelope, 'text/xml') + ->post($this->config['service_location']); + + if ($response->failed()) { + throw new EltaApiException('ELTA request failed: HTTP '.$response->status()); + } + + return EltaResponse::fromSoapResult($this->parseEnvelope($response->body())); + } + + private function parseEnvelope(string $xml): array + { + $dom = new DOMDocument(); + + if (! $dom->loadXML($xml)) { + throw new EltaApiException('ELTA returned a response that could not be parsed as XML.'); + } + + $xpath = new DOMXPath($dom); + $xpath->registerNamespace('soapenv', 'http://schemas.xmlsoap.org/soap/envelope/'); + $readResponse = $xpath->query('//soapenv:Body/*')->item(0); + + if (! $readResponse instanceof DOMElement) { + throw new EltaApiException('ELTA response did not contain a SOAP body.'); + } + + return $this->nodeToArray($readResponse); + } + + private function nodeToArray(DOMElement $element): array + { + $data = []; + + foreach ($element->childNodes as $child) { + if (! $child instanceof DOMElement) { + continue; + } + + $name = $child->localName; + $hasElementChildren = false; + + foreach ($child->childNodes as $grandchild) { + if ($grandchild instanceof DOMElement) { + $hasElementChildren = true; + break; + } + } + + $value = $hasElementChildren ? $this->nodeToArray($child) : trim($child->textContent); + + if (array_key_exists($name, $data)) { + if (! is_array($data[$name]) || ! array_is_list($data[$name])) { + $data[$name] = [$data[$name]]; + } + $data[$name][] = $value; + } else { + $data[$name] = $value; + } + } + + return $data; + } +} diff --git a/src/Shipping/Carriers/Elta/EltaFulfillmentService.php b/src/Shipping/Carriers/Elta/EltaFulfillmentService.php new file mode 100644 index 0000000..0e73d9c --- /dev/null +++ b/src/Shipping/Carriers/Elta/EltaFulfillmentService.php @@ -0,0 +1,249 @@ +shippingAddress; + $weight = $request->weight ?? 0.5; + + $params = [ + 'pel_apost_code' => config('elta.apost_code'), + 'pel_paral_name' => trim("{$address->first_name} {$address->last_name}"), + 'pel_paral_address' => $address->line_one, + 'pel_paral_area' => $address->city, + 'pel_paral_tk' => $address->postcode, + 'pel_paral_thl_1' => $address->contact_phone, + 'pel_paral_thl_2' => '', + 'pel_service' => '', + 'pel_baros' => number_format($weight, 3, '.', ''), + 'pel_baros_xyz' => '', + 'pel_x' => '', + 'pel_y' => '', + 'pel_z' => '', + 'pel_temaxia' => (string) $request->packageCount, + 'pel_paral_sxolia' => '', + 'pel_sur_1' => '', + 'pel_sur_2' => '', + 'pel_sur_3' => '', + 'pel_ant_poso' => '', + 'pel_ant_poso1' => '', + 'pel_ant_poso2' => '', + 'pel_ant_poso3' => '', + 'pel_ant_poso4' => '', + 'pel_ant_date1' => '', + 'pel_ant_date2' => '', + 'pel_ant_date3' => '', + 'pel_ant_date4' => '', + 'pel_asf_poso' => '', + 'pel_user' => config('elta.user_code'), + 'pel_ref_no' => (string) $order->id, + 'pel_insert_flag' => '', + 'pel_paral_code' => '', + 'pel_retur_code' => '', + ]; + + $codAmount = null; + + if ($request->paymentMode === 'cod') { + $codAmount = $request->amountToCollect ?? $order->total->decimal; + $params['pel_ant_poso'] = number_format($codAmount, 2, '.', ''); + } + + $response = $this->client->createVoucher($params)->throwIfError(); + + $voucherNo = (string) $response->data['vg_code']; + + $shipment = Shipment::create([ + 'order_id' => $order->id, + 'carrier' => 'elta', + 'tracking_reference' => $voucherNo, + 'meta' => [ + 'weight' => $weight, + 'ocr_line' => $response->data['ocr_line'] ?? null, + 'date_time' => $response->data['date_time'] ?? null, + 'package_count' => $request->packageCount, + 'cod_amount' => $codAmount, + ], + ]); + + // PELVGNEW's own response already carries every child voucher + // number for a multi-piece shipment in vg_child_no — no second + // request needed, same as the old CREATEAWB/vg_child shape. + foreach (array_filter((array) ($response->data['vg_child_no'] ?? [])) as $childVoucherNo) { + Shipment::create([ + 'order_id' => $order->id, + 'carrier' => 'elta', + 'tracking_reference' => $childVoucherNo, + 'parent_reference' => $voucherNo, + 'meta' => $shipment->meta?->toArray() ?? [], + ]); + } + + return $shipment; + } + + /** + * PELB64VG (the old, deprecated operation this used to call) fails + * with the same st_flag=3 as CREATEAWB — it's the same legacy family. + * There's no *NEW replacement: ELTA's own official client renders + * labels entirely locally from a bundled report template, never + * fetching one from the server at all (see EltaLabelRenderer's + * docblock). This reproduces that local rendering instead. + */ + public function printLabel(Shipment $shipment): string + { + $pdf = $this->labelRenderer->render($shipment); + + $shipment->update(['label_printed_at' => now()]); + + return $pdf; + } + + /** + * Unlike the old, deprecated operation set (which genuinely has no + * delete operation), the *NEW family does support cancellation via + * PELVGDEL — but it identifies a voucher by its internal pel_vg_id, + * not the AWB/tracking number PELVGNEW returns (vg_code). Getting + * pel_vg_id requires first listing the account's vouchers via + * PELPARALVGNEW1 and matching the row whose pel_paral_vg equals our + * tracking_reference. + */ + public function cancelShipment(Shipment $shipment): void + { + $voucherId = $this->findVoucherId($shipment->tracking_reference); + + if ($voucherId === null) { + throw new EltaApiException( + 'Could not find voucher '.$shipment->tracking_reference.' in ELTA\'s voucher list — it may already be too old or cancelled to look up.', + ); + } + + $this->client->deleteVoucher(['pel_vg_id' => $voucherId])->throwIfError(); + + $shipment->update(['cancelled_at' => now()]); + } + + private function findVoucherId(string $trackingReference): ?string + { + $inId = '0'; + + // PELPARALVGNEW1 paginates via in_id, same cursor pattern the + // official client uses — walk pages until the voucher is found + // or a page comes back empty. flag_1/flag_2 map to the real + // client's "Show All"/"All Users" checkboxes — live-confirmed + // both must be '1', otherwise even a voucher created moments ago + // is filtered out of the (default, unfiltered-looking) list. + for ($page = 0; $page < 50; $page++) { + $response = $this->client->listVouchers([ + 'pel_code' => config('elta.apost_code'), + 'pel_user_code' => config('elta.user_code'), + 'flag_1' => '1', + 'flag_2' => '1', + 'in_id' => $inId, + ])->throwIfError(); + + $rows = array_filter( + (array) ($response->data['vg_rec'] ?? []), + fn (array $row) => filled($row['pel_vg_id'] ?? null), + ); + + if ($rows === []) { + return null; + } + + $match = collect($rows)->first( + fn (array $row) => ($row['pel_paral_vg'] ?? null) === $trackingReference, + ); + + if ($match !== null) { + return $match['pel_vg_id']; + } + + $inId = (string) end($rows)['pel_vg_id']; + } + + return null; + } + + public function trackShipment(Shipment $shipment): Collection + { + $response = $this->client->getTracking([ + 'web_vg' => $shipment->tracking_reference, + 'pel_code' => config('elta.apost_code'), + ])->throwIfError(); + + $rows = array_filter( + (array) ($response->data['web_status'] ?? []), + fn (array $row) => filled($row['web_date_time'] ?? null), + ); + + // No explicit delivered-confirmation field like the old + // PELTT01's pod_name — pel_rec.a_rec_date_time is blank until + // delivery per the real client's own rendering, used as the + // delivered signal here; unconfirmed against a genuinely + // delivered parcel yet. + $isDelivered = filled(trim($response->data['pel_rec']['a_rec_date_time'] ?? '', ' /:')); + + return collect(array_values($rows))->map(function (array $row, int $index) use ($rows, $isDelivered) { + $isLast = $index === count($rows) - 1; + $dateTime = $row['web_date_time'] ?? ''; + + return new TrackingCheckpoint( + status: $isLast && $isDelivered + ? TrackingStatus::Delivered + : $this->guessStatusFromTitle($row['web_status_name'] ?? ''), + carrierStatus: $row['web_status_name'] ?? null, + message: $row['web_sxolia'] ?: ($row['web_status_name'] ?? null), + location: $row['web_station'] ?? null, + occurredAt: Carbon::createFromFormat('YmdHi', substr($dateTime, 0, 12)), + meta: $row, + ); + }); + } + + /** + * web_status_name is free text with no structured status code — same + * limitation Acs\AcsFulfillmentService::guessStatusFromAction() has. + * Live-confirmed text seen so far: "ΔΗΜΙΟΥΡΓΙΑ ΣΥ.ΔΕ.ΤΑ. ΑΠΟ ΠΕΛΑΤΗ" + * (voucher created) — matched via a Pending-ish fallback below since + * it isn't yet in transit. Other statuses are best-guess substring + * matches to refine as more real tracking text is observed. + */ + private function guessStatusFromTitle(string $title): TrackingStatus + { + $title = mb_strtolower($title); + + return match (true) { + str_contains($title, 'παραδόθηκε') => TrackingStatus::Delivered, + str_contains($title, 'διανομή') => TrackingStatus::OutForDelivery, + str_contains($title, 'παραλαβή') => TrackingStatus::CollectedFromSender, + str_contains($title, 'μεταφορά') || str_contains($title, 'διαμετακόμιση') => TrackingStatus::InTransit, + default => TrackingStatus::Pending, + }; + } +} diff --git a/src/Shipping/Carriers/Elta/EltaLabelRenderer.php b/src/Shipping/Carriers/Elta/EltaLabelRenderer.php new file mode 100644 index 0000000..f34ebce --- /dev/null +++ b/src/Shipping/Carriers/Elta/EltaLabelRenderer.php @@ -0,0 +1,184 @@ +order; + $address = $order->shippingAddress; + $meta = $shipment->meta?->toArray() ?? []; + + $destinationStation = $this->areaResolver->resolve($address->postcode); + + $dateTime = (string) ($meta['date_time'] ?? ''); + $occurredAt = strlen($dateTime) >= 12 + ? Carbon::createFromFormat('YmdHi', substr($dateTime, 0, 12)) + : now(); + + $voucherNo = $shipment->tracking_reference; + $ocrLine = (string) ($meta['ocr_line'] ?? ''); + $packageCount = (int) ($meta['package_count'] ?? 1); + + $generator = new BarcodeGeneratorPNG(); + + $data = [ + 'sender_name' => config('elta.sender_name'), + 'sender_address' => config('elta.sender_address'), + 'sender_postcode' => config('elta.sender_postcode'), + 'sender_area' => config('elta.sender_area'), + 'sender_phone' => config('elta.sender_phone'), + 'apost_code' => config('elta.apost_code'), + + 'recipient_name' => trim("{$address->first_name} {$address->last_name}"), + 'recipient_address' => $address->line_one, + 'recipient_postcode' => $address->postcode, + 'recipient_area' => $address->city, + 'recipient_phone' => $address->contact_phone, + + // Mirrors Sydeta.cs::print_vg()'s own dataRow["sender_1..5"] / + // dataRow["rec_1..5"] construction: name on its own line, then + // address, then "TK: ΤΗΛ:" — each of + // the RDLC's rectangle8/rectangle9 boxes renders these as 3 + // separate textbox lines (not 5; sender_2/sender_3 and + // rec_2/rec_3 only appear when a line's text exceeds the + // report's 40-char wrap width, which our own data never hits + // in practice for a name/address/contact triple). + 'sender_lines' => [ + config('elta.sender_name'), + config('elta.sender_address'), + 'TK:'.config('elta.sender_postcode').' '.config('elta.sender_area').' ΤΗΛ:'.config('elta.sender_phone'), + ], + 'recipient_lines' => [ + trim("{$address->first_name} {$address->last_name}"), + $address->line_one, + 'TK:'.$address->postcode.' '.$address->city, + 'ΤΗΛ: '.$address->contact_phone, + ], + + 'date' => $occurredAt->format('d/m/Y'), + 'time' => $occurredAt->format('H:i'), + + 'voucher_no' => $voucherNo, + 'barcode_voucher' => $this->barcodeDataUri($generator, $voucherNo), + + 'weight' => $meta['weight'] ?? null, + 'package_count' => $packageCount, + 'package_label' => $packageCount > 1 + ? sprintf('001/%03d', $packageCount) + : '001', + 'multiPiece' => $packageCount > 1, + + 'station_apo' => config('elta.origin_station_code'), + 'station_pros' => $destinationStation->code, + 'station_pros_title' => $destinationStation->name, + + 'service_code' => '214', + 'service_name' => 'ΠΟΛΗ ΠΟΛΗ -ΠΘ- ΝΗΣΙ', + + 'xreosi' => 'ΧΡΕΩΣΗ ΑΠΟΣΤΟΛΕΑ ΠΙΣΤΩΣΗ', + 'siimvasi' => '131775-9', + + 'cod_amount' => $meta['cod_amount'] ?? null, + 'ocr_line' => $ocrLine, + // The A6 layout's 3-cell row shows a 13-digit reference derived + // from the OCR line, not the barcode's own voucher text — + // confirmed against the real sample: ">14260009814363<..." + // yields reference "1426000981436" (13 chars after the '>'). + 'ocr_reference' => strlen($ocrLine) >= 14 ? substr($ocrLine, 1, 13) : '', + + 'order_reference' => (string) $order->id, + + // sydetaE.rdlc's "Πρόσθετες Υπηρεσίες" (sur_1..4) and the + // ΑΝΤΙΚΑΤΑΒΟΛΗ banner (antik_1) are only populated by ELTA's + // own client when the shipper ticks special-service checkboxes + // (Sydeta.cs::print_vg()'s checkBox2-5) or a COD amount is set + // — neither is tracked on our Shipment model today, so these + // render as empty boxes, matching what a plain "credit" send + // with no extras or COD looks like on a real label. + 'sur_1' => null, + 'sur_2' => null, + 'sur_3' => null, + 'sur_4' => null, + 'antik_1' => $meta['cod_amount'] ?? null ? '* ΠΡΟΣΟΧΗ ΑΝΤΙΚΑΤΑΒΟΛΗ *' : null, + 'volumetric_weight' => $meta['volumetric_weight'] ?? null, + + 'eltaLogo' => $this->logoDataUri(), + ]; + + $paperSize = config('elta.label_paper_size', 'a4'); + $view = $paperSize === 'a6' + ? 'core::shipping.carriers.elta.label-a6' + : 'core::shipping.carriers.elta.label-a4'; + + $pdf = Pdf::loadView($view, $data); + + // A6 = 104mm x 148mm, per RDLCPrinter.cs's own DeviceInfo + // override for printer_size==2 (1mm ≈ 2.8346pt) — note this is + // ELTA's own thermal-label size, not the ISO A6 (105x148mm) the + // old comment here named. A 4-value paper array plus an + // orientation string together confuse dompdf into doubling the + // canvas and silently overflowing to a second blank page + // (reproduced with a bare empty page); the array alone is + // already portrait (height > width), so the orientation + // argument is both redundant and the actual bug. + $paperSize === 'a6' + ? $pdf->setPaper([0, 0, 294.80, 419.53]) + : $pdf->setPaper('a4'); + + return $pdf->output(); + } + + /** + * PNG over SVG — dompdf's inline support doesn't reliably + * render the barcode generator's -based bars (confirmed: the + * SVG output rendered as literal text in a live test), while a + * base64 PNG is unambiguous. + */ + private function barcodeDataUri(BarcodeGeneratorPNG $generator, string $payload): string + { + $png = $generator->getBarcode($payload, BarcodeGeneratorPNG::TYPE_CODE_128); + + return 'data:image/png;base64,'.base64_encode($png); + } + + /** + * Embedded as a base64 data URI rather than referenced by URL — + * resources/logos/ is only copied into a consuming app's public/ on + * vendor:publish, which isn't guaranteed to have run, and dompdf + * needs either a real filesystem path or a working absolute URL. + */ + private function logoDataUri(): string + { + $path = __DIR__.'/../../../../resources/logos/elta-courier-logo.png'; + + return 'data:image/png;base64,'.base64_encode(file_get_contents($path)); + } +} diff --git a/src/Shipping/Carriers/Elta/EltaRateDriver.php b/src/Shipping/Carriers/Elta/EltaRateDriver.php new file mode 100644 index 0000000..34b7389 --- /dev/null +++ b/src/Shipping/Carriers/Elta/EltaRateDriver.php @@ -0,0 +1,70 @@ +cartHasExcludedProducts($shippingOptionRequest->shippingRate, $shippingOptionRequest->cart)) { + return null; + } + + return $this->resolveFixedPrice( + $shippingOptionRequest->shippingRate, + $shippingOptionRequest->shippingRate->shippingMethod, + $shippingOptionRequest->cart, + ); + } + + public function on(ShippingRate $shippingRate): self + { + $this->shippingRate = $shippingRate; + + return $this; + } +} diff --git a/src/Shipping/Carriers/Elta/EltaResponse.php b/src/Shipping/Carriers/Elta/EltaResponse.php new file mode 100644 index 0000000..2475ae5 --- /dev/null +++ b/src/Shipping/Carriers/Elta/EltaResponse.php @@ -0,0 +1,43 @@ +hasError) { + throw new EltaApiException($this->errorMessage ?? 'Unknown ELTA API error', $this->data); + } + + return $this; + } +} diff --git a/src/Shipping/Carriers/Elta/EltaStation.php b/src/Shipping/Carriers/Elta/EltaStation.php new file mode 100644 index 0000000..0979e00 --- /dev/null +++ b/src/Shipping/Carriers/Elta/EltaStation.php @@ -0,0 +1,11 @@ +