Files
core/docs/elta.md
T

710 lines
44 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`):
```csharp
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`.
## A6. Tracking and search
### `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** |