Files
core/docs/elta.md
T

44 KiB
Raw Blame History

ELTA Courier — API and printing reference

A reference for designing the ELTA Courier integration, reconstructed from ELTA's own desktop client ("ELTA Customer Client", ELTA_PEL.exe, client version 0032), decompiled from ELTA's official installer (https://www.elta-courier.gr/app/ELTA_COURIER_SETUP.msi). The decompiled source lives next to this repo in ../elta-courier-decompiled/ (see its README); file and line references below point there. Where something was confirmed by calling ELTA's test account from our integration, it says so.

Two axes:

  • Part A — the API: every SOAP operation, its inputs and outputs, the values the client sends, and the business rules it enforces before calling.
  • Part B — printing: what the client prints, when, from which data, with every fixed text, every image and every formatting rule.

Part C lists where our current integration (src/Shipping/Carriers/Elta/) differs.


Part A — The API

A1. Transport

Host https://clients.elta-courier.gr (port 443). Verified 2026-09-30: the hostname now resolves to 18.156.16.255 (AWS Frankfurt) and serves HTTPS with a valid certificate; answers are identical to the old host.
Old host 212.205.47.226:9003 (the installer's hosts-entry.txt) — plain HTTP only: HTTPS there fails the TLS handshake (SSL_ERROR_SYSCALL), and https://clients.elta-courier.gr:9003 fails with wrong version number (that port speaks HTTP).
Scheme The client builds its URL as "https://" + <first field of ip.txt> (Form1.cs:213), i.e. HTTPS on the hostname.
Reliability The HTTPS host was slower (~0.4–0.8 s vs ~0.2 s) and returned one transient HTTP 500 and one 15 s timeout during testing; retry on network errors / 5xx.
Protocol SOAP 1.1, document/literal. One endpoint URL for every operation.
Namespace Each operation has its own: /<OPERATION> (e.g. /PELVGNEW).
Body <READ> element in that namespace, with each parameter as a child element.
SOAPAction We send Get (works); the proxies' SoapDocumentMethod arguments weren't decodable.
Authentication None at the HTTP/SOAP level. Account codes travel as ordinary body parameters. PELLOGINNEW checks the password; other operations take the account/user code without a password.
Proxy Optional corporate HTTP proxy from proxy.txt (ip;port;user;pass), with Expect100Continue = false. Local-network only; nothing to do with ELTA auth.
WSDL None published for these operations; the shapes come from the client's generated proxies (ELTA_PEL.pel_*/).

Every response carries:

  • st_flag — the return value of READ (declared integer). "0" = success; anything else is an error.
  • st_title — the message (Greek) to show on error, e.g. Λάθος Τ.Κ. (wrong postcode), Λάθος ΣΥΔΕΤΑ (wrong voucher), Δεν Επιτρέπεται! Εχει Γίνει Εκτύπωση (not allowed, already printed).

Paging convention (every list operation): a page is at most 100 rows. If a page comes back with exactly 100 rows, call again passing the last row's id as the cursor (in_id, pel_sub_code or a_paral_code, depending on the operation); the client stops when a page has fewer than 100 (or the 100th row is empty).

Number formats: amounts come back right-aligned in 9 characters (" 0.00"); dates go in as dd/MM/yyyy; timestamps come back as yyyyMMddHHmm[ss] in Greek local time.

A2. Operations at a glance

Operation Purpose Client screen
PELLOGINNEW Log in, get account details and the user's station Login
PELVERNEW Latest client version (triggers FTP self-update) Login
PELLISTNEW Sub-senders of a multi-sender account Login
PELSRV Service catalogue Login
PELSUR Surcharge catalogue Never called (surcharges are hardcoded)
PELPARALLIST1 Saved recipients (address book) Login
PELTKNEW Postcode → station, default service, localities Voucher entry
PELTK Postcode → station, service (older/simpler) Voucher entry, recipient pick
PELTKBOX Postcode → PostBox station and service Voucher entry (PostBox)
PELTK1 Is this postcode valid? File/Excel import
PELVGNEW Create a voucher (pending or issued) Voucher entry
PELVGUP Edit a pending voucher Voucher entry (edit mode)
PELVGINNEW Create a pending voucher, simplified (bulk) File/Excel import
PELVG01NEW1 Issue a pending voucher (and re-print an issued one) Batch processing
PELVGDEL Delete a pending voucher Batch processing
PELPARALVGNEW1 List pending (and optionally issued) vouchers Batch processing
PELTTNEW01 Track one voucher (by voucher number or reference) Tracking
PELMANIF2 Vouchers in a date range with latest status, by status Multiple search
PELMANIFNEW Index / manifest of vouchers in a date range, with totals Index report
PELPARALIN / PELPARALUP / PELPARALSE Address book: insert / update / fetch one Recipients
PELPARALDE / PELPARALDE1 Address book: delete one / delete a code range Recipients
PELPARALCE Address book: check a code and postcode before import Recipient Excel import

A3. Account and reference data

PELLOGINNEW — log in

In
pel_code Customer (account) code, e.g. test account 999999999
user_code User code (digits only in the client)
user_pass Password
Out
st_title Error message
pel_flag "1" = multi-sender account (has sub-senders, see PELLISTNEW); "0" = single sender
pel_titles, pel_addres, pel_area, pel_tk, pel_tel_1, pel_tel_2 Account name/address/area/postcode/phones — printed as the sender on single-sender accounts
user_station The user's ELTA station code — sent as sender_station to the postcode lookups and to PELVG01NEW1, and printed as the deposit station (Γρ.Κατάθεσης)
user_pel_code The account code to use in every later call (pel_code / pel_apost_code)

After a successful login the client calls PELVERNEW (if an FTP address is configured); if ag_wupdate_version > its own version (0032) it downloads an update over FTP and stops. Then it loads the reference lists below.

PELVERNEW — client version

No inputs. Out: st_title, ag_wupdate_version.

PELLISTNEW — sub-senders (multi-sender accounts only)

In: pel_code (= user_pel_code), pel_sub_code (cursor: last code of the previous page, "" first). Out: st_title, ag_rec_rec[] (100/page), ag_rec_counter. Row: ag_code, ag_title, ag_adress, ag_area, ag_tk, ag_tel_1, ag_tel_2, ag_st (station), ag_st_t (station title). Used to pick the sender of a voucher and the return-to party (see special handling).

PELSRV — service catalogue

No inputs. Out: st_title, ag_srv_rec[] (up to 150: ag_code, ag_title), ag_srv_counter. The service picker only offers services whose code starts with the same two digits as the one the postcode lookup returned (same family).

PELSUR — surcharge catalogue

No inputs. Out: ag_sur_rec[] (ag_code, ag_title). The client never calls it; its surcharges are hardcoded (see A5).

PELPARALLIST1 — saved recipients

In: pel_code, a_paral_code (cursor). Out: ag_rec_rec[] (100/page: ag_code, ag_title, ag_adress, ag_area, ag_tk, ag_tel_1, ag_tel_2), ag_rec_counter.

A4. Postcode, station and service lookups

PELTKNEW — the main lookup

In: pel_tk (postcode), sender_station (= user_station).

Out
pel_fields.rec_station, rec_station_t Destination station code and title (Γρ. Επίδοσης)
pel_fields.pel_service, pel_service_t Default service for that postcode
pel_fields.pel_service_t201, pel_service_t231 Titles of services 201 and 231 (see localities)
a_lview_data[] Up to 300 localities within the postcode
locations_counter Number of localities; "0" = none, use pel_service as is

Locality row: wloc_code, wloc_title, wloc_county, wloc_countyt, wloc_station, wloc_stationt, wloc_distance (decimal), wloc_postal_code, wloc_coordinate_x, wloc_coordinate_y, wloc_disp_flag, wloc_comments.

When a postcode has localities, the user must pick one (Sydeta.cs:3320):

  • the recipient area becomes "<wloc_code>/<wloc_title>";
  • wloc_disp_flag = "1" (hard to reach, ΔΥΣΠΡΟΣΙΤΟ) → service 231 ΠΟΛΗ ΠΟΛΗ -ΠΠ- ΔΥΣΠΡΟΣΙΤΟ; otherwise service 201 ΕΝΤΟΣ ΠΟΛΗΣ -ΠΠ- ΕΠΟΜΕΝΗ.

PELTK — simple lookup

In: pel_tk, sender_station. Out: st_title, rec_station, rec_station_t, pel_service, pel_service_t. Used when a saved recipient is picked.

PELTKBOX — PostBox lookup

In: pel_tk, sender_station. Out: st_title, pel_fields (rec_station, rec_station_t, pel_service, pel_service_t). Used instead of PELTKNEW when "ΕΠΙΔΟΣΗ POST BOX" is ticked; on error the PostBox option is unticked.

PELTK1 — validate a postcode

In: pel_tk. Out: st_title (st_flag ≠ 0 = invalid). Used by the bulk imports.

A5. Vouchers (ΣΥ.ΔΕ.ΤΑ.)

Lifecycle

PELVGNEW (pel_insert_flag "0") ─► pending: has pel_vg_id, no voucher number
        │                            │   editable (PELVGUP), deletable (PELVGDEL)
        │                            ▼
        │                     PELVG01NEW1 (issue) ─► issued: voucher number, OCR line,
        │                                            stations, service; child numbers
        └── (pel_insert_flag "1") ─► issued immediately, same outputs as PELVGNEW
  • Only pending vouchers can be deleted. An issued one is refused (Δεν Επιτρέπεται! Εχει Γίνει Εκτύπωση). Confirmed on the test account.
  • In the client, issuing = printing: "Print" in batch processing calls PELVG01NEW1 and prints the result. It calls PELVG01NEW1 for already-issued rows too, so it also serves to re-print (ELTA returns the existing voucher's data).
  • A multi-parcel send is one voucher record (pel_temaxia > 1). The extra parcels get their own numbers (vg_child_no[]) only when the voucher is issued. They are not separately listed, deletable or trackable (tracking an extra parcel's number returns Λάθος ΣΥΔΕΤΑ — confirmed).

PELVGNEW — create a voucher

The client's call (Sydeta.cs:1550), in order:

# Parameter Client value Notes / rules
1 pel_apost_code Sender code: user_pel_code (single-sender), or the chosen sub-sender Required
2 pel_paral_name Recipient name Required; up to 150 chars in the form
3 pel_paral_address Recipient address Required; up to 150
4 pel_paral_area Recipient area (or "<wloc_code>/<wloc_title>") Up to 40
5 pel_paral_tk Postcode Required; 5 digits
6 pel_paral_thl_1 Phone Digits only, up to 10. At least one of the two phones is required
7 pel_paral_thl_2 Mobile Up to 10. PostBox: required, 10 digits, starting 69
8 pel_service Service code from the postcode lookup / picker Required by the client (Δεν Εχει Οριστεί Υπηρεσία). We send "" and ELTA assigns one on issue — works on the test account
9 pel_baros Weight in kg, . decimal Required, > 0
10 pel_baros_xyz Volumetric weight: X × Y × Z (cm) ÷ 5000, 3 decimals Only when dimensions are given
11–13 pel_x, pel_y, pel_z Dimensions in cm, integers up to 3 digits All three > 0 or none (Λάθος Διαστάσεις)
14 pel_temaxia Number of pieces Required, 1–20 (Μέγιστος Επιτρεπόμενος Αριθμός Τεμαχίων 20.)
15 pel_paral_sxolia Remarks + envelope/parcel flag, see below Remarks up to 90 chars
16 pel_sur_1 002 special handling, or 917 PostBox Fixed slot, see below
17 pel_sur_2 003 set delivery time Fixed slot
18 pel_sur_3 004 Saturday delivery Fixed slot
19 pel_ant_poso COD cash amount . decimal
20–23 pel_ant_poso1…4 COD cheque amounts (up to 4 cheques)
24–27 pel_ant_date1…4 Each cheque's due date, dd/MM/yyyy Required per cheque; not in the past
28 pel_asf_poso Insured value The client always sends a single space " " — it has no insurance input
29 pel_user user_code
30 pel_ref_no "Reference No" Up to 30 chars; printed on the voucher, searchable, trackable
31 pel_insert_flag "1" = issue now ("Εκτύπωση ΣΥ.ΔΕ.ΤΑ." ticked), "0" = pending We send "0"
32 pel_paral_code Saved recipient's code, if picked from the address book
33 pel_retur_code Return-to party's code (special handling only) See below

Envelope or parcel (mandatory). The client makes the user choose Φάκελος (envelope) or Δέμα (parcel) (Δεν Εχει Επιλεγεί Είδος), and encodes it inside pel_paral_sxolia: the remarks right-aligned in 99 characters, then "1" (envelope) or "2" (parcel) — 100 characters total (Sydeta.cs:1530):

pel_paral_sxolia = $"{remarks.Trim(),99}" + "2";   // parcel

(Only PELVGNEW does this; PELVGUP and PELVGINNEW send the remarks plain.)

Surcharges go in fixed slots, not in order: special handling is always pel_sur_1, set time always pel_sur_2, Saturday always pel_sur_3; PostBox (917) takes pel_sur_1. The client's surcharges:

Code Surcharge Slot
002 ΕΙΔΙΚΗ ΔΙΑΧΕΙΡΙΣΗ (special handling) pel_sur_1
003 ΠΡΟΚΑΘΟΡΙΣΜΕΝΗ ΩΡΑ (set delivery time) pel_sur_2
004 ΕΠΙΔΟΣΗ ΣΑΒΒΑΤΟΥ (Saturday delivery) pel_sur_3
917 ΕΠΙΔΟΣΗ POST BOX (PostBox delivery) pel_sur_1

Special handling (002) and the return-to party. Ticking special handling sets a return-to party (pel_retur_code), defaulting to the sender; multi-sender accounts can pick another sub-sender. When ELTA then returns a return voucher (return_vg), the client prints it (B6).

Business rules the client enforces (all before calling ELTA):

  • name, address, postcode, service required; at least one phone; pieces 1–20; weight > 0;
  • COD is cash or cheques, never both (Δεν Επιτρέπεται Αντικαταβολή Μετρητά Και Επιταγή);
  • each cheque needs a due date, not in the past;
  • PostBox: not with special handling (Δεν Επιτρέπεται Post Box Με ειδική Διαχείρηση), not with COD (Δεν Επιτρέπεται Post Box Με Αντικαταβολή), and needs a 10-digit mobile starting 69 (Δεν Επιτρέπεται Post Box Χωρίς Κινητό Τηλέφωνο / ...Λάθος Κινητό Τηλέφωνο);
  • envelope or parcel must be chosen.

Outputs (same set from PELVG01NEW1, plus stations/service there):

Out
vg_code The voucher number, e.g. NZ000987368GR (empty when pending)
vg_child_no[] One number per extra parcel of a multi-parcel send (up to 149)
ocr_line OCR line, e.g. >14260009873682< 17004> 1317759< 25> — printed at the foot of the A4 payment stub; characters 2–14 are the 13-digit reference printed on the voucher
return_vg, r_ocr_line Return voucher number and its OCR line (special handling)
epitagh_vg, e_ocr_line Cheque-return voucher number and its OCR line (COD by cheque)
date_time Issue time, yyyyMMddHHmm (Greek time). The client picks the report by it (≥ 202410 → current reports)

PELVGNEW does not return the pending voucher's id (pel_vg_id); find it with PELPARALVGNEW1 (match pel_ref_no, empty pel_paral_vg, highest id).

PELVG01NEW1 — issue (and re-print)

In: pel_id (= pel_vg_id, declared integer), sender_station (= user_station). Out: st_title, return_vg, epitagh_vg, vg_code, vg_child_no[], ocr_line, r_ocr_line, e_ocr_line, date_time, rec_station, rec_station_t (destination station), rec_srv, rec_srv_t (the service ELTA settled on, e.g. 201 ΠΟΛΗ ΠΟΛΗ - ΠΠ).

PELVGUP — edit a pending voucher

In: pel_id, then the same fields as PELVGNEW 1–30 and pel_paral_code (no pel_insert_flag, no pel_retur_code; remarks sent plain). Out: st_title.

PELVGINNEW — bulk insert (pending)

Used by the file/Excel imports. In: pel_code (sender), user_code, paral_title, paral_adress, paral_area, paral_tk, paral_thl1, paral_thl2, paral_tem (pieces), paral_baros, paral_sxolia, paral_ant_m (COD cash), paral_ant_e (COD cheque), paral_ant_date (cheque due date), paral_da (always ""), paral_ref, paral_sur_1…3, retour_code. Out: st_title. No service, no envelope/parcel flag, no dimensions — ELTA works them out.

PELVGDEL — delete a pending voucher

In: pel_vg_id (the pending id, not the voucher number). Out: st_title. The client only offers it for rows without a voucher number.

PELPARALVGNEW1 — list pending vouchers

In: pel_code, pel_user_code, flag_1 ("1" = "Εμφάνιση Όλων": include issued ones), flag_2 ("1" = "Όλοι Οι Χρήστες": all the account's users), in_id (cursor: last pel_vg_id, "0" first). Out: st_title, vg_rec[] (100/page), vg_rec_counter.

Row fields: pel_vg_id, pel_apost_code, pel_paral_vg (voucher number; empty = pending), pel_paral_code, pel_paral_name, pel_paral_address, pel_paral_area, pel_paral_tk, pel_paral_thl_1, pel_paral_thl_2, pel_service, pel_baros, pel_baros_xyz, pel_x, pel_y, pel_z, pel_temaxia, pel_paral_sxolia, pel_ant_poso, pel_ant_poso1…4, pel_ant_date1…4, pel_asf_poso, pel_ref_no, pel_sur_1…3, pel_retour.

PELTTNEW01 — track one voucher

In: web_vg — a voucher number or our reference number (the client's field is labelled ΣΥ.Δ.ΕΛ.ΤΑ./Reference No), pel_code.

Out: st_title, web_status[] (up to 50 checkpoints), web_status_counter, pel_rec.

Checkpoint: web_date_time (yyyyMMddHHmmss, Greek time), web_station, web_status_name (e.g. ΔΗΜΙΟΥΡΓΙΑ ΣΥ.ΔΕ.ΤΑ. ΑΠΟ ΠΕΛΑΤΗ, in unaccented capitals), web_sxolia (e.g. PEL CLIENT). Empty rows pad the array; skip rows without a date.

pel_rec (the voucher record):

Field Meaning
a_vg_3 The voucher number
a_vg_2 Its return voucher — verified: a special-handling voucher's return_vg came back here
a_vg_1 Its cheque voucher (by elimination; the client's field labels suggested the opposite)
a_ref Our reference
a_rec_title, a_rec_address, a_rec_area, a_rec_postal, a_rec_tel_1, a_rec_tel_2 Recipient
a_rec_station, a_rec_station_t Destination station
a_services Service (code/text)
a_weight (decimal), a_no_of_packages Weight, pieces
a_antik (decimal), a_antik_text COD amount and text
a_antik1 (decimal), a_antik_text1 Remittance ("Απόδοση") — the COD paid back to the merchant
a_sender_date Date sent
a_rec_name Delivered to — the name of whoever received it
a_rec_date_time Delivered at — blank until delivered
a_apost, a_sxolia Sender, remarks

PELMANIF2 — vouchers in a date range, by status ("Πολλαπλή Αναζήτηση")

In: pel_code, date_1, date_2 (dd/MM/yyyy), paral_code (optional recipient), status_flag, in_id (cursor: last pel_col_id).

status_flag
0 All (Ολα)
1 Delivered (Παραδομένα)
2 Undelivered (Απαραδοτα)
3 To be returned (Προς Επιστροφή)

Row: pel_col_1 voucher · pel_col_2 reference · pel_col_3 recipient · pel_col_4 postcode · pel_col_5 station · pel_col_6 last status · pel_col_7 remarks/date · pel_col_8 COD · pel_col_id cursor. Only main vouchers are listed.

PELMANIFNEW — index / manifest ("Ευρετήριο")

In: pel_code, date_1, date_2, paral_code, in_id (cursor: last pel_col_15). Out: ag_pel_rec[], ag_pel_counter, spel_baros (total weight of the page, decimal), spel_temaxia (total pieces of the page).

Row: pel_col_1 voucher · 2 weight · 3 pieces · 4 recipient · 5 address · 6 postcode · 7 station · 8 sender · 9 reference · 10 COD · 11 cheque voucher · 12 return voucher · 13 + 14 the two phones · 15 cursor.

A7. Address book

Operation In Out
PELPARALIN pel_code, paral_code, paral_title, paral_adress, paral_area, paral_tk, paral_thl1, paral_thl2 st_title
PELPARALUP same as PELPARALIN st_title
PELPARALSE pel_code, paral_code the recipient's fields
PELPARALDE pel_code, paral_code st_title
PELPARALDE1 pel_code, paral_code_1, paral_code_2 (a code range) st_title
PELPARALCE pel_code, paral_code, paral_tk, tk_flag, pel_flag st_tk ("1" = bad postcode), st_code ("1" = code already exists)

A8. Client-side configuration files (for reference)

File Content
ip.txt <host:port>;<ftp host> — web-service host (prefixed with https://) and update FTP host
proxy.txt ip;port;user;pass
printer.txt print_on_create(0/1);printer name;paper size — 1 = A4, 2 = label (A6)
paral.txt, awb.txt Excel column letters for the recipient (7) and voucher (16) imports

A9. Excel import (voucher columns)

Recipient name, address, area, postcode, phone, mobile, pieces, weight, remarks, COD cash, COD cheque, cheque due date, reference, surcharge 1–3 — each mapped to a column letter (defaults A…P). Rows are validated (postcode via PELTK1, PostBox via PELTKBOX, pieces ≤ 20, …), invalid ones shown red and skipped; valid ones go through PELVGINNEW as pending vouchers, issued later from batch processing.


Part B — Printing

B1. When the client prints

  • On creation, if "Εκτύπωση ΣΥ.ΔΕ.ΤΑ." is ticked (default from printer.txt): it sends pel_insert_flag = "1" and prints straight away.
  • From batch processing ("Εκτύπωση Επιλεγμένων" / "Εκτύπωση Όλων"): issues each voucher with PELVG01NEW1 and prints it.

Each print job prints, in order (Sydeta.cs:1646, epexergasia.cs):

  1. the main voucher (print_vg);
  2. one label per extra parcel, 002/00n, 003/00n, … (print_child) — printing the main voucher always prints every parcel; there is no way to print one extra parcel alone;
  3. the return voucher, if ELTA returned return_vg (B6);
  4. the cheque-return voucher, if ELTA returned epitagh_vg (B7).

B2. Paper and report selection

Paper (printer.txt) Page (render DeviceInfo) Main voucher Extra parcel
1 A4 21 × 29.7 cm, no margins sydetaE.rdlc sydetaE1.rdlc (separate, smaller report)
2 label 10.4 × 14.8 cm (not ISO A6's 10.5), no margins SydetaLabelE.rdlc SydetaLabelE.rdlc (same report)

Vouchers issued before October 2024 (date_time < 202410) use the older reports (sydeta, sydeta1, SydetaLabel1). sydeta_R, sydeta1_R, SydetaLabel2 are only on-screen previews. Rendering is EMF at the page size, drawn to the whole page, sent to the configured printer without a dialog (a print dialog only if no printer is configured).

B3. The print data — every field

The reports read one dataset row (DataSet1.print_fields). How the client fills it for a main voucher (Sydeta.cs::print_vg, epexergasia.cs::print_vg):

Sender (sender_1…5)

sender_1 "Κωδικός:" + sender code
sender_2, sender_3 Sender name, split at 40 characters (sender_3 = the next 40, else "")
sender_4 Sender address (first 40 characters)
sender_5 "TK:" + postcode + " " + area + " ΤΗΛ:" + phone, cut at 40

Sender = the account (single-sender) or the chosen sub-sender.

Recipient (rec_1…5)

rec_1, rec_2 Recipient name, split at 40 (rec_2 = the rest, else "")
rec_3 Address (first 40)
rec_4 "TK:" + postcode + " " + area
rec_5 "ΤΗΛ: " + phone + " " + mobile

Voucher and routing

Field Value
sydeta Voucher number, e.g. NZ000987368GR
barcode "*" + voucher + "*" — printed in a Code 39 barcode font (the asterisks are Code 39 start/stop)
barcode_2 ocr_line characters 2–14 (13 digits), e.g. 1426000987368
date A4: dd/MM/yyyy HH:mm; label: dd/MM/yyyy
time Label only: HH:mm
service, service_title Service code and title, e.g. 201 / ΠΟΛΗ ΠΟΛΗ - ΠΠ
station_apo Deposit station = the user's station (Γρ.Κατάθεσης)
station_pros, station_pros_title Destination station (Γρ. Επίδοσης), e.g. 94580 / ΙΩΑΝΝΙΝΑ - ΠΡΑΚΤΟΡΕΙΟ
xreosi ΧΡΕΩΣΗ ΑΠΟΣΤΟΛΕΑ ΠΙΣΤΩΣΗ (charged to sender, on credit)
siimvasi 131775-9 (fixed; the ELTA "Ταχυπληρωμή" account number)
copy Empty on a main voucher (see extra parcels / return voucher)

Parcel

Field Value
baros Weight as entered
ogos_baros Volumetric weight (A4)
ogos_1 "XxYxZ" (A4)
ogos_2 "XxYxZ = <volumetric>" (label)
ogos_3 * ΠΡΟΣΟΧΗ PostBox * for PostBox, else empty
temaxia 1 piece: the count as entered (1); several: "001/" + count (e.g. 001/003)
polaplo * ΠΟΛΛΑΠΛΗ ΑΠΟΣΤΟΛΗ * when more than one piece
periexomeno The Reference No (pel_ref_no) — printed in the REFERENCE box
sxolia_1…3 Remarks in 27-character lines (1st 27, next 27, the rest) — the plain remarks, not the padded/flagged value

Cash on delivery (num6 = cash + all cheques)

Field When Value
antik_minima COD * ΠΡΟΣΟΧΗ ΑΝΤΙΚΑΤΑΒΟΛΗ *
apodiksi COD * Απόδειξη Είσπραξης * (the entry screen misspells it Είσπαξης; batch printing spells it right)
antik_1 COD ΑΝΤΙΚΑΤΑΒΟΛΗ <total, 2 decimals>; PostBox: * ΠΡΟΣΟΧΗ PostBox *
antik_2 COD * ΑΝΑΛΥΣΗ *
antik_3 cash <cash> MΕΤΡΗΤΑ (the "M" is a Latin M)
antik_3…6 cheques, A4 <amount> € ΕΠΙΤΑΓΗ <due date> per cheque
antik_3…6 cheques, label <amount> ΕΠ/ΓΗ <due date> per cheque
antik_poso always the total if paid in cash, else 0.00 (cheques and no COD)
antik_ocr always ocr_line — printed at the foot of the A4 payment stub

Surcharges (sur_1…3) — from the codes, in this layout:

Codes sur_1 sur_2 sur_3
002 002 ΕΙΔΙΚΗ ΔΙΑΧΕΙΡΗΣΗ
002 + 003 002 … 003 ΠΡΟΚΑΘΟΡΙΣΜΕΝΗ ΩΡΑ
002 + 003 + 004 002 … 003 … 004 ΕΠΙΔΟΣΗ ΣΑΒΒΑΤΟΥ
002 + 004 002 … 004 ΕΠΙΔΟΣΗ ΣΑΒΒΑΤΟΥ
003 003 …
003 + 004 003 … 004 … (entry screen) / sur_1 = 004 (batch)
004 004 … (entry screen) / sur_1 = 004 (batch)
917 (PostBox) * ΠΡΟΣΟΧΗ PostBox * (003/004 as above)

(The entry screen and batch printing place 004 differently when 002 is absent — a client inconsistency; sur_4 exists in the A4 report but is never filled.)

Fields in the dataset that no code fills: service_thirida, axia, sur_4, antik_7.

B4. Extra parcel labels (print_child)

For each vg_child_no (k = 2, 3, …; n = pieces):

Field Value
sydeta, barcode The parcel's own number / *number*
temaxia Label: "00k/00n" (e.g. 002/003); A4: n
periexomeno A4 only: "00k/00n" — printed large in the child report
polaplo Label: ΠΟΛΛΑΠΛΗ ΑΠΟΣΤΟΛΗ - MASTER : <main voucher>
copy Label: ΠΟΛΛΑΠΛH; A4: "*" + main voucher + "*" (under ΜASTER ΣΥΔΕΤΑ)
antik_minima, antik_1 COD: * ΠΡΟΣΟΧΗ ΑΝΤΙΚΑΤΑΒΟΛΗ * — no amount (collected on the main voucher)
sender, recipient, date, time, service, service_title, baros, stations, sxolia_1…3 As on the main voucher
Not set barcode_2, xreosi, siimvasi, sur_*, ogos_*, other antik_*, reference (label)

B5. What each report prints

A4 main voucher — sydetaE.rdlc

One A4 page, three bands separated by cut lines, each with a side strip naming the copy:

Band Copies (side strips) Contents
1 (top) 1. ΑΠΟΣΤΟΛΕΑΣ / SHIPPER, 3. ΑΡΧΕΙΟ / ΓΡΑΦΕΙΟ ΚΑΤΑΘΕΣΗΣ Full voucher: logo, ELTA details, title, barcode, voucher, deposit/destination stations, weight, volumetric, pieces, service, sender, recipient, charge line, surcharges, reference, remarks, COD block, signature boxes, terms
2 6. ΠΑΡΑΛΗΠΤΗΣ / CONSIGNEE, 5. ΑΡΧΕΙΟ / ΓΡΑΦΕΙΟ ΕΠΙΔΟΣΗΣ Same voucher again, with the sender's signature box, print time, copy, antik_minima, apodiksi
3 (payment stub) 2. - 4. ΛΟΓΙΣΤΗΡΙΟ "ΤΑΧΥΠΛΗΡΩΜΗ ΕΙΣΠΡΑΞΗ / ΜΕΤΑΒΙΒΑΣΗ": voucher + barcode, stations, weight, pieces, service, charge, sender (code + name), recipient (name, address, postcode), surcharges, remarks, signature boxes, COD breakdown, ΠΟΣΟ (antik_poso), date stamp, fees, "Η-αριθμός", "Αρ. Λογ/κής Απόδοσης", and the OCR line below "ΜΗ ΣΗΜΕΙΩΝΕΤΕ ΚΑΤΩ ΑΠΟ ΑΥΤΗ ΤΗ ΓΡΑΜΜΗ"

Fields used: antik_1–7, antik_minima, antik_ocr, antik_poso, apodiksi, barcode, baros, copy, date, ogos_1, ogos_3, ogos_baros, periexomeno, rec_1–5, sender_1–5, service, service_title, station_apo, station_pros, station_pros_title, sur_1–4, sxolia_1–3, sydeta, temaxia.

Fixed texts (verbatim, typos included):

  • ΣΥΝΟΔΕΥΤΙΚΟ ΔΕΛΤΙΟ ΤΑΧΥΜΕΤΑΦΟΡΑΣ
  • ΥΠΗΡΕΣΙΑ :, Ογκ/κο Βάρος
  • ΧΡΕΩΣΗ ΑΠΟΣΤΟΛΕΑ ΤΡ.ΠΛΗΡ: ΠΙΣΤΩΣΗ (copies), ΧΡ. ΑΠΟΣΤ: ΠΙΣΤΩΣΗ (stub)
  • Συν.Χρέωσης (€): / Συν.Χρέωσης. (€): / Συν.Χρ. (€):
  • Πρόσθετες Υπηρεσίες, * ΕΠΙΒΑΡΥΝΣΕΙΣ *
  • * REFERENCE No * / * REFERENCE No*
  • * ΠΑΡΑΤΗΡΗΣΕΙΣ *
  • ΓΙΑ ΤΗΝ ΠΑΡΑΛΑΒΗ, ΟΝΟΜΑ/ΥΠΟΓΡΑΦΗ
  • ΥΠΟΓΡΑΦΗ ΑΠΟΣΤΟΛΕΑ, ΟΝΟΜΑ/ΥΠΟΓΡΑΦΗ ΠΑΡΑΛΗΠΤΗ
  • Ημερομηνία - Ωρα Εκτύπωσης :, Ημ/νία:, Ώρα:
  • Π Ο Σ Ο
  • Έλαβα γνώση των όρων που αναγράφονται στο αντίγραφο 1 και 6 και τους αποδέχομαι ανεπιφύλακτα (and a variant ending ...αντίγραφο 1 και τους αποδέχομαι ανεπιφύλακτα)
  • ΕΕΤΤ ΑΜ 99-150 Γενική Αδεια Ταχ/κων Υπηρεσιών

Images used, with what they contain:

Image Where Content
elta, elta1 Band 1/2 top-left ELTA Courier logo
Πλήρηστοιχεία_red1, _red2, _black Next to the logo; stub ELTA company details (see B8)
Point2_EETTAM_August2024 Band 1 ΕΕΤΤ ΑΜ: 99-150 Γενική Άδεια Ταχ/κων Υπηρεσιών
Point4_CompanynameEETTAM_August2024 Band 2 ΕΛΛΗΝΙΚΑ ΤΑΧΥΔΡΟΜΕΙΑ Α.Ε. ΕΕΤΤ ΑΜ: 99-150 Γενική Άδεια Ταχ/κων Υπηρεσιών
oroi Band 1, vertical Ισχύουν οι Γενικοί Οροι Παραχής Υπηρεσιών οι οποίοι βρίσκονται αναρτημένοι στο www.elta-courier.gr και είναι διαθέσιμοι σε ολα τα καταστήματα της εταιρίας. ("Παραχής", "ολα": ELTA's own spelling, same as the label)
ID1__shipper_ec Band 1 side 1.ΑΠΟΣΤΟΛΕΑΣ / SHIPPER
ID3__file_ec Band 1 side 3. ΑΡΧΕΙΟ / ΓΡΑΦΕΙΟ ΚΑΤΑΘΕΣΗΣ
ID6__consignee_ec Band 2 side 6. ΠΑΡΑΛΗΠΤΗΣ / CONSIGNEE + ΕΕΤΤ ΑΜ:01-200 Γενική Άδεια Ταχ/κών Υπηρεσιών
ID5__file_store_elta_courier Band 2 side 5. ΑΡΧΕΙΟ / ΓΡΑΦΕΙΟ ΕΠΙΔΟΣΗΣ
ID2_4_logistirio Stub side 2. - 4. ΛΟΓΙΣΤΗΡΙΟ
elta_taxyplirwmi_eispraksi Stub header ΤΑΧΥΠΛΗΡΩΜΗ ΕΙΣΠΡΑΞΗ / ΜΕΤΑΒΙΒΑΣΗ Ο. Αριθμός Λογ/μού Ταχυπληρωμής 131775-9
elta_chromologiko_simantro Stub ELTA Ταχυπληρωμή logo + Χρονολογικό Σήμαντρο (date-stamp box)
elta_teli Stub Τέλη (fees)
elta_h_arithmos Stub Η - αριθμός
elta_ar__logiostikis_apodosis Stub Αρ. Λογ/κής Απόδοσης
Point5_ELTACourier_ΑποστολήμαςΕσείς_September2024 Stub, vertical ELTA "Hellenic Post" logo + Αποστολή μας εσείς!
mhn_shmeivnete Foot ΜΗ ΣΗΜΕΙΩΝΕΤΕ ΚΑΤΩ ΑΠΟ ΑΥΤΗ ΤΗ ΓΡΑΜΜΗ

A4 extra parcel — sydetaE1.rdlc

A single block: logo (eltared) + company details (Πλήρηστοιχεία_red1), ΕΕΤΤ ΑΜ 99-150 Γενική Αδεια Ταχ/κων Υπηρεσιών, ΣΥΝΟΔΕΥΤΙΚΟ ΔΕΛΤΙΟ ΤΑΧΥΜΕΤΑΦΟΡΑΣ, barcode + parcel number, Ημερομηνία - Ωρα Εκτύπωσης : + date, deposit station / weight / Ογκ/κο Βάρος / pieces, ΥΠΗΡΕΣΙΑ : + service, destination station, sender (5 lines), recipient (5 lines), and a panel with ** ΠΟΛΛΑΠΛΗ ΑΠΟΣΤΟΛΗ **, the piece (002/003, large), the COD warning, ΜASTER ΣΥΔΕΤΑ and the master voucher. No surcharges, reference, remarks, charge line, COD amounts or stub.

Label (10.4 × 14.8 cm) — SydetaLabelE.rdlc

Top: logo (elta_logoblack), company details (Πλήρηστοιχεία_black1), a ΥΠΗΡΕΣΙΑ: box (service + title), the EETT box (Point2_EETTAM_August2024), date and time, ΣΥΝΟΔΕΥΤΙΚΟ ΔΕΛΤΙΟ ΤΑΧΥΜΕΤΑΦΟΡΑΣ, copy. Then Γρ. Επίδοσης : + destination station; a row of charge (xreosi) / OCR reference (barcode_2) / siimvasi; Γρ.Κατάθεσης:, ΒΑΡΟΣ(Kgr), ΟΓΚΟΜΕΤΡΙΚΟ ΒΑΡΟΣ(Kgr) (ogos_2), Τεμάχια; the sender (ΑΠΟΣΤΟΛΕΑΣ, 5 lines) next to ΑΙΤΙΑ ΕΠΙΣΤΡΟΦΗΣ (return reasons with tick boxes: Άγνωστος, Ελλειπή Δ/νση, Απαράδεκτο, Άλλαξε Δ/νση, Αζήτητο); the recipient (Π Α Ρ Α Λ Η Π Τ Η Σ, 5 lines) next to the COD column (antik_1…7); REFERENCE (periexomeno) and * ΠΑΡΑΤΗΡΗΣΕΙΣ * (sxolia_1, sxolia_2 — only two lines on the label) next to * ΕΠΙΒΑΡΥΝΣΕΙΣ * (sur_1…3); the polaplo line; the terms (Ισχύουν οι Γενικοί Οροι Παραχής Υπηρεσιών οι οποίοι βρίσκονται αναρτημένοι στο www.elta-courier.gr / και είναι διαθέσιμοι σε ολα τα καταστήματα της εταιρίας. — "Παραχής" is ELTA's typo); the antik_1 banner; the barcode; the voucher number (sydeta).

B6. Return voucher ("RETOUR")

Printed when return_vg is not empty (special handling with a return-to party):

Field Value
copy RETOUR
rec_1…5 (recipient = return-to party) "Κωδικός:" + code, name (split at 40), address, "TK:… … ΤΗΛ:…"
sender_1…5 (sender = our recipient) name (split at 40), address, "TK:" + postcode + " " + area, "ΤΗΛ: " + phones
sydeta, barcode return_vg
barcode_2 r_ocr_line characters 2–14
service, service_title 461 RETOUR ΕΝΤΟΣ ΠΟΛΗΣ if the original service starts with 1, else 462 RETOUR ΠΟΛΗ ΠΟΛΗ
xreosi ΧΡΕΩΣΗ ΠΑΡΑΛΗΠΤΗ ΠΙΣΤΩΣΗ (charged to the recipient)
siimvasi 131775-9
baros, temaxia 0.100, 1
station_apo / station_pros the original destination station / the return-to party's station
sxolia_1…3 "ΣΥΔΕΤΑ <main voucher> Χρέωση Πελάτη <sender code>" in 27-char lines
antik_poso / antik_ocr 0.00 / r_ocr_line

B7. Cheque-return voucher

Printed when epitagh_vg is not empty (COD by cheque) — carries the cheques back:

Field Value
copy empty
rec_* (recipient = our sender) "Κωδικός:" + sender code, sender name, address, TK/area/phone line
sender_* (sender = our recipient) as in B6
sydeta, barcode, barcode_2 epitagh_vg, *epitagh_vg*, e_ocr_line characters 2–14
service, service_title 350 ΕΠΙΣΤΡΟΦΗ ΑΞΙΟΓΡΑΦΩΝ
xreosi ΧΡΕΩΣΗ ΠΑΡΑΛΗΠΤΗ ΠΙΣΤΩΣΗ
siimvasi, baros, temaxia 131775-9, 0.100, 1
station_apo / station_pros the original destination station / the user's station
sxolia_* "ΣΥΔΕΤΑ <main voucher> Χρέωση Πελάτη <sender code>"
antik_poso / antik_ocr 0.00 / e_ocr_line

B8. ELTA company details (as printed, from ELTA's current images)

ΕΛΛΗΝΙΚΑ ΤΑΧΥΔΡΟΜΕΙΑ Α.Ε.
Έδρα: Λεωφ. Ιωνίας 200 & Ιακωβάτων 61,
111 44 Αθήνα
Α.Φ.Μ.: 094026421 | Δ.Ο.Υ.: ΚΕ.ΦΟ.Δ.Ε. ΑΤΤΙΚΗΣ
Τ. 210-6073000 | Ε. info@elta-courier.gr
www.elta-courier.gr
Γ.Ε.ΜΗ: 001092101000

EETT licence: ΕΕΤΤ ΑΜ: 99-150 Γενική Άδεια Ταχ/κων Υπηρεσιών (the older 01-200 still appears on the consignee copy strip and the legacy reports, whose company block reads ΤΑΧΥΜΕΤΑΦΟΡΕΣ ΕΛΤΑ Α.Ε., Λ.Μεσογείων 395, Αγία Παρασκευή, 153 43, ΤΗΛ:210 6073000 FAX:2106073100, ΑΦΜ: 099759170 ΔΟΥ ΦΑΕ ΑΘΗΝΩΝ, Ε.Ε.Τ.Τ. ΑΜ 01-200 — not current).

B9. Other printouts (reports lists)

Report Screen Columns
Report1 (landscape) Index, simple ΣΥ.ΔΕ.ΤΑ., ΒΑΡΟΣ, ΤΕΜΑΧΙΑ, ΠΑΡΑΛΗΠΤΗΣ, ΔΙΕΥΘΥΝΣΗ, Τ.Κ., ΣΤΑΘΜΟΣ, ΑΠΟΣΤΟΛΕΑΣ, REFERENCE No; title ΚΑΤΑΣΤΑΣΗ ΣΥ.ΔΕ.ΤΑ. + date range; totals row ΣΥΝΟΛΑ (weight, pieces)
Report3 (landscape) Index, extended the above + ΤΗΛΕΦΩΝΑ, ΑΝΤ/ΛΗ, ΣΥΔΕΤΑ ΕΠΙΤΑΓΗΣ, ΣΥΔΕΤΑ ΕΠΙΣΤΡΟΦΙΚΟΥ
Report2 (landscape) Multiple search ΣΥ.ΔΕ.ΤΑ., REFERENCE, ΠΑΡΑΛΗΠΤΗΣ, Τ.Κ., ΣΤΑΘΜΟΣ, ΑΝΤ/ΒΟΛΗ, ΤΕΛΕΥΤΑΙΟ STATUS, ΣΧΟΛΙΑ

Part C — Where our integration differs (as of 0.29.3)

Rows marked Fixed are handled since 0.31.0 (see CHANGELOG); the "Ours" column describes the fixed behaviour.

Verified against ELTA's test account (2026-09-30)

All with generic test data (TEST RECIPIENT, TEST ADDRESS 1, 10431, 2100000000, references TEST-…); pending vouchers were deleted afterwards. One issued voucher remains on the shared account: NZ000987460GR (+ return voucher NZ000987473GR).

Check Result
HTTPS Works on https://clients.elta-courier.gr (443); fails on the old IP and on port 9003 (see A1)
Envelope/parcel flag Accepted. ELTA trims the padding and keeps the flag as the last character of the remarks (TEST REMARK2, also in tracking a_sxolia). Whether ELTA also reads it as the parcel type isn't visible through the API
Surcharge slots Stored exactly in the slot sent (004 in slot 1 stays 004|000|000); ELTA does not normalize. Tracking (a_services) shows only the service, never surcharges, so their effect can't be read back. ELTA's own client only reads Saturday from slot 3 (B3), so 004 in slot 1 would not print as Saturday there
Blank service Accepted, but ELTA stores 201 ΠΟΛΗ ΠΟΛΗ for 10431, where its own lookup (PELTKNEW) gives 101 ΕΝΤΟΣ ΠΟΛΗΣ for the test station — a blank service can land on a different service than the client would send. Explicit 101/201 are honoured
Localities Common: 45500 Ιωάννινα has 190 localities (170 hard-to-reach → 231), 20100 Κόρινθος 41 (16), 72200 Χίος 56 (31); islands get 211 ΠΟΛΗ ΠΟΛΗ -ΠΠ- ΝΗΣΙ
Insurance pel_asf_poso = 50.00 is stored; effect not visible
No phones / 21 pieces Both accepted at creation (the limits are the client's); not tested at issue
Remarks > 90 95 characters accepted and stored in full (90 is the client's limit)
Special handling + return-to Issuing returned a return voucher (return_vg + r_ocr_line); tracking lists it in a_vg_2
Tracking by reference PELTTNEW01 with our reference (00000007) returns the voucher
Delivery / remittance fields Present in pel_rec (a_rec_name, a_rec_date_time, a_antik1, a_antik_text1); empty until delivery
PostBox lookup (PELTKBOX) 10431 → station 10200 ΑΙΟΛΟΥ 100 (Κ.Κ.), service 101; 45500, 84100, 00000 → st_flag 1 "Το Τ.Κ. Δεν Εχει PostBox"

The differences

# Topic ELTA client Ours Impact
1 Envelope/parcel Mandatory; remarks right-aligned in 99 chars + 1/2 in pel_paral_sxolia Remarks right-aligned in 99 characters (padded by characters) + 2 Fixed
2 Surcharge slots Fixed: 002→1, 003→2, 004→3, 917→1 Fixed slots, as the client Fixed
3 Service Always resolved first (PELTKNEW) and sent Resolved with PELTKNEW (sender station) and sent Fixed (was blank; ELTA then gave 201 where its lookup gives 101)
4 Localities Area = code/title of the picked locality; hard-to-reach → service 231 Locality matched by the address's city (accents/case ignored) → code/title + its service; no match → blank service, noted on the shipment Fixed
5 Phones At least one required; PostBox needs 69… mobile At least one required; digits only, 30/0030 dropped, 69… → mobile field Fixed (PostBox not offered)
6 Pieces 1–20 Refused above 20 Fixed
7 Insurance Never sent (" ") We send pel_asf_poso Unverified whether ELTA honours it
8 PostBox (917) Supported, with rules (no COD, no special handling, mobile) "PostBox delivery" extra service: PELTKBOX routing, 917 in pel_sur_1, the client's rules checked, PostBox texts on the label Fixed
9 Cheque COD Up to 4 cheques + dates; cheque-return voucher printed Cash only Fine for a shop; noted for completeness
10 Special handling + return Return-to party (pel_retur_code); RETOUR voucher printed Return-to = our sender code; return_vg + r_ocr_line stored; RETOUR page printed after the parcels (B6) Fixed
11 Remarks length 90 chars 90 —
12 Company details on labels B8 (Ιωνίας 200, Γ.Ε.ΜΗ) B8 details on the A4 copies, stub, A4 child and A6 Fixed
13 Απόδειξη Είσπραξης Correct in batch printing Correct Fixed
14 Side copy strips, stub strips, "Αποστολή μας εσείς" Images (B5) Approximated / missing Cosmetic
15 Tracking by reference PELTTNEW01 accepts our reference We track by voucher only Verified working — could track a voucher whose number we don't have
16 Delivery details a_rec_name, a_rec_date_time Stored from each tracking poll (meta.delivered_to / delivered_at); shown on the order page and Carrier Vouchers view Fixed
17 COD remittance a_antik1, a_antik_text1 Stored (meta.cod_remitted / cod_remittance); shown as "COD paid back" Fixed
18 Scheme https://clients.elta-courier.gr https://clients.elta-courier.gr, 2 retries on connection errors / 5xx Fixed