Περιγραφή λειτουργιών
Ψηφιακή Διακίνηση Αγαθών - Digital Goods Movement
Το σύστημα Digital Goods Movement του ΑΑΔΕ myDATA επιτρέπει την παρακολούθηση και διαχείριση της διακίνησης αγαθών σε πραγματικό χρόνο. Οι λειτουργίες αυτές είναι διαθέσιμες μόνο για το ERP channel και δεν υποστηρίζονται από παρόχους ηλεκτρονικής τιμολόγησης.
Όλες οι λειτουργίες Digital Goods Movement υποστηρίζονται μόνο για τον εκδότη (ERP channel).
RegisterTransfer - Καταχώρηση Μεταφοράς
# production
https://mydatapi.aade.gr/myDATA/RegisterTransfer
# development
https://mydataapidev.aade.gr/RegisterTransfer
Καταχωρεί τα στοιχεία μεταφοράς για ένα δελτίο αποστολής που βρίσκεται σε διακίνηση. Η μέθοδος καλείται από τον μεταφορέα για να δηλώσει την παραλαβή των αγαθών και την έναρξη της διακίνησης, ή την παραλαβή από προηγούμενο μεταφορέα (μεταφόρτωση).
Παράδειγμα χρήσης
use Firebed\AadeMyData\Http\DigitalGoodsMovement\RegisterTransfer;
use Firebed\AadeMyData\Models\DigitalGoodsMovement\Transport;
use Firebed\AadeMyData\Models\DigitalGoodsMovement\TransportDetails;
use Firebed\AadeMyData\Models\DigitalGoodsMovement\Location;
use Firebed\AadeMyData\Enums\DigitalGoodsMovement\TransportType;
use Firebed\AadeMyData\Exceptions\MyDataException;
// Δημιουργία στοιχείων μεταφοράς
$details = new TransportDetails();
$details->setVehicleNumber('AHN0011');
$details->setTransportType(TransportType::PRIVATE_USE_TRUCK);
$details->setCarrierVatNumber('777777777');
$details->setTrailorNumber('P22345'); // Αριθμός κυκλοφορίας "P" (προαιρετικό)
$details->setLocation(new Location(41.303921, -81.901693)); // latitude, longitude
$transport = new Transport();
$transport->setQrUrl('https://mydataapidev.aade.gr/TimologioQR/QRInfo?q=test_qr_url');
$transport->setTransportDetail($details);
$registerTransfer = new RegisterTransfer();
try {
$response = $registerTransfer->handle($transport);
if ($response->first()->isSuccessful()) {
echo "Η μεταφορά καταχωρήθηκε με επιτυχία." . PHP_EOL;
echo "Transfer Mark: " . $response->first()->getTransferMark();
}
} catch (MyDataException $e) {
echo "Σφάλμα επικοινωνίας: " . $e->getMessage();
}
Πεδία TransportDetails
| Πεδίο | Τύπος | Υποχρεωτικό | Περιγραφή |
|---|---|---|---|
vehicleNumber |
string | Ναι | Αριθμός Μεταφορικού Μέσου (max 50 χαρακτήρες) |
transportType |
TransportType | Ναι | Είδος Μεταφορικού Μέσου (1-7) |
carrierVatNumber |
string | Ναι | ΑΦΜ Μεταφορικής Εταιρείας (max 20 χαρακτήρες) |
pNumber |
string | Όχι | Αριθμός κυκλοφορίας "P" ρυμουλκούμενου (max 50 χαρακτήρες) |
location |
Location | Όχι | Τοποθεσία Μεταφόρτωσης (longitude, latitude) |
Τύποι Μεταφορικού Μέσου (TransportType)
-
PUBLIC_USE_TRUCK(1) - Φορτηγό Δημόσιας Χρήσης -
PRIVATE_USE_TRUCK(2) - Φορτηγό Ιδιωτικής Χρήσης -
SHIP(3) - Πλοίο -
TRAIN(4) - Τρένο -
AIRPLANE(5) - Αεροπλάνο -
OTHER_TRANSPORT_MEANS(6) - Λοιπά Μεταφορικά Μέσα -
WITHOUT(7) - Άνευ
GenerateGroupQrCode - Δημιουργία Ομαδικού QR Code
# production
https://mydatapi.aade.gr/myDATA/GenerateGroupQRCode
# development
https://mydataapidev.aade.gr/GenerateGroupQRCode
Δημιουργεί ένα ομαδικό QR code που συνδυάζει πολλαπλά QR codes από διαφορετικά δελτία αποστολής. Απαιτούνται τουλάχιστον 2 QR URLs.
Παράδειγμα χρήσης
use Firebed\AadeMyData\Http\DigitalGoodsMovement\GenerateGroupQrCode;
use Firebed\AadeMyData\Models\DigitalGoodsMovement\GroupQrCode;
use Firebed\AadeMyData\Exceptions\MyDataException;
$groupQrCode = new GroupQrCode();
$groupQrCode->addQrUrl("https://mydataapidev.aade.gr/TimologioQR/QRInfo?q=test_url_1");
$groupQrCode->addQrUrl("https://mydataapidev.aade.gr/TimologioQR/QRInfo?q=test_url_2");
$generate = new GenerateGroupQrCode();
try {
$response = $generate->handle($groupQrCode);
echo "Group QR URL: " . $response->getGroupQrUrl() . PHP_EOL;
echo "Group ID: " . $response->getGroupId() . PHP_EOL;
echo "QR URLs Count: " . $response->getQrUrlsCount() . PHP_EOL;
echo "Created at: " . $response->getCreatedAt() . PHP_EOL;
echo "Expires at: " . $response->getExpiresAt() . PHP_EOL;
} catch (MyDataException $e) {
echo "Σφάλμα επικοινωνίας: " . $e->getMessage();
}
Helper method
Εναλλακτικά, μπορείτε να χρησιμοποιήσετε τη μέθοδο generateFromQrUrls:
$qrUrls = [
"https://mydataapidev.aade.gr/TimologioQR/QRInfo?q=test_url_1",
"https://mydataapidev.aade.gr/TimologioQR/QRInfo?q=test_url_2",
];
$generate = new GenerateGroupQrCode();
$response = $generate->generateFromQrUrls($qrUrls);
ConfirmDeliveryOutcome - Επιβεβαίωση Παράδοσης
# production
https://mydatapi.aade.gr/myDATA/ConfirmDeliveryOutcome
# development
https://mydataapidev.aade.gr/ConfirmDeliveryOutcome
Επιβεβαιώνει την παράδοση αγαθών και καταχωρεί τα στοιχεία παράδοσης. Μπορεί να δηλώσει πλήρη, μερική ή καμία παράδοση.
Παράδειγμα χρήσης
use Firebed\AadeMyData\Http\DigitalGoodsMovement\ConfirmDeliveryOutcome;
use Firebed\AadeMyData\Models\DigitalGoodsMovement\DeliveryOutcome;
use Firebed\AadeMyData\Models\DigitalGoodsMovement\PackagingDetail;
use Firebed\AadeMyData\Enums\DigitalGoodsMovement\DeliveryOutcomeType;
use Firebed\AadeMyData\Enums\DigitalGoodsMovement\PackagingType;
use Firebed\AadeMyData\Exceptions\MyDataException;
$outcome = new DeliveryOutcome();
$outcome->setQrUrl('https://mydataapidev.aade.gr/TimologioQR/QRInfo?q=test_url');
$outcome->setOutcome(DeliveryOutcomeType::FULL);
// Προαιρετικά: Δήλωση συσκευασιών που παραδόθηκαν
$outcome->addDeliveredPackaging(new PackagingDetail(PackagingType::CRATE, 10));
$outcome->addDeliveredPackaging(new PackagingDetail(PackagingType::BOX, 2));
// Προαιρετικά: Ένδειξη παράδοσης χωρίς παρουσία παραλήπτη
$outcome->setDeliveredWithoutRecipient(false);
$confirm = new ConfirmDeliveryOutcome();
try {
$response = $confirm->handle($outcome);
if ($response->first()->isSuccessful()) {
echo "Η παράδοση επιβεβαιώθηκε με επιτυχία." . PHP_EOL;
echo "Delivery Outcome Mark: " . $response->first()->getDeliveryOutcomeMark();
}
} catch (MyDataException $e) {
echo "Σφάλμα επικοινωνίας: " . $e->getMessage();
}
Πεδία DeliveryOutcome
| Πεδίο | Τύπος | Υποχρεωτικό | Περιγραφή |
|---|---|---|---|
qrUrl |
string | Ναι | Το URL του QR code του Δελτίου |
outcome |
DeliveryOutcomeType | Ναι | Αποτέλεσμα παράδοσης (FULL/PARTIAL/NONE) |
deliveredWithoutRecipient |
boolean | Όχι | Παράδοση χωρίς φυσική παρουσία παραλήπτη |
deliveredPackaging |
PackagingDetail[] | Όχι | Λίστα με συσκευασίες που παραδόθηκαν |
Τύποι Αποτελέσματος Παράδοσης (DeliveryOutcomeType)
-
FULL- Πλήρης Παράδοση -
PARTIAL- Μερική Παράδοση -
NONE- Καμία Παράδοση
Τύποι Συσκευασίας (PackagingType)
-
PALLET(1) - Παλέτα -
BOX(2) - Κούτα -
CRATE(3) - Κιβώτιο -
BARREL(4) - Βαρέλι -
SACK(5) - Σάκος -
OTHER(6) - Λοιπά (απαιτείotherPackagingTypeTitle)
RejectDeliveryNote - Απόρριψη Δελτίου Αποστολής
# production
https://mydatapi.aade.gr/myDATA/RejectDeliveryNote
# development
https://mydataapidev.aade.gr/RejectDeliveryNote
Απορρίπτει ένα δελτίο αποστολής με συγκεκριμένο λόγο απόρριψης. Μπορεί να γίνει με χρήση mark ή QR URL.
Απόρριψη με χρήση mark
use Firebed\AadeMyData\Http\DigitalGoodsMovement\RejectDeliveryNote;
use Firebed\AadeMyData\Models\DigitalGoodsMovement\DeliveryRejection;
use Firebed\AadeMyData\Exceptions\MyDataException;
$rejection = new DeliveryRejection(111111111111111, 'Damaged goods');
$reject = new RejectDeliveryNote();
try {
$response = $reject->handle($rejection);
if ($response->first()->isSuccessful()) {
echo "Το δελτίο απορρίφθηκε με επιτυχία." . PHP_EOL;
echo "Reject Mark: " . $response->first()->getRejectMark();
}
} catch (MyDataException $e) {
echo "Σφάλμα επικοινωνίας: " . $e->getMessage();
}
Απόρριψη με χρήση QR URL
$rejection = new DeliveryRejection(
'https://mydataapidev.aade.gr/TimologioQR/QRInfo?q=test_url',
'Damaged goods'
);
$reject = new RejectDeliveryNote();
$response = $reject->handle($rejection);
Helper methods
$reject = new RejectDeliveryNote();
// Απόρριψη με mark
$response = $reject->rejectUsingMark(400002969517846, 'Damaged goods');
// Απόρριψη με QR URL
$response = $reject->rejectUsingQrUrl(
'https://mydataapidev.aade.gr/TimologioQR/QRInfo?q=test_url',
'Damaged goods'
);
Πεδία DeliveryRejection
| Πεδίο | Τύπος | Υποχρεωτικό | Περιγραφή |
|---|---|---|---|
qrUrl ή invoiceMark |
string ή int | Ναι | Το URL του QR ή το MARK του δελτίου |
rejectionReason |
string | Όχι | Λόγος απόρριψης (max 150 χαρακτήρες) |
RequestDeliveryNoteStatus - Αναζήτηση Κατάστασης Δελτίου
# production
https://mydatapi.aade.gr/myDATA/GetDeliveryNoteStatus
# development
https://mydataapidev.aade.gr/GetDeliveryNoteStatus
Αναζητά την τρέχουσα κατάσταση ενός δελτίου αποστολής και το πλήρες ιστορικό των συμβάντων του (lifecycle history).
Παράδειγμα χρήσης
use Firebed\AadeMyData\Http\DigitalGoodsMovement\RequestDeliveryNoteStatus;
use Firebed\AadeMyData\Enums\DigitalGoodsMovement\DeliveryStatus;
use Firebed\AadeMyData\Exceptions\MyDataException;
$request = new RequestDeliveryNoteStatus();
try {
$response = $request->handle(111111111111111); // mark του δελτίου
echo "Status: " . $response->getStatus()->label() . PHP_EOL;
echo "Invoice Mark: " . $response->getInvoiceMark() . PHP_EOL;
if ($response->getDispatchTimestamp()) {
echo "Dispatch Time: " . $response->getDispatchTimestamp() . PHP_EOL;
}
// Εμφάνιση ιστορικού συμβάντων
$history = $response->getLifecycleHistory();
if ($history) {
echo "\nΙστορικό Συμβάντων:" . PHP_EOL;
foreach ($history as $event) {
echo "- Event: " . $event->getEventType()->label() . PHP_EOL;
echo " Timestamp: " . $event->getEventTimestamp() . PHP_EOL;
echo " Actor VAT: " . $event->getActorVat() . PHP_EOL;
if ($event->getMark()) {
echo " Mark: " . $event->getMark() . PHP_EOL;
}
// Έλεγχος για λεπτομέρειες μεταφοράς
if ($event->getTransportDetails()) {
$transport = $event->getTransportDetails();
echo " Vehicle: " . $transport->getVehicleNumber() . PHP_EOL;
}
// Έλεγχος για λεπτομέρειες παράδοσης
if ($event->getOutcomeDetails()) {
$outcome = $event->getOutcomeDetails();
echo " Outcome: " . $outcome->getOutcome()->label() . PHP_EOL;
}
// Έλεγχος για λεπτομέρειες απόρριψης
if ($event->getRejectionDetails()) {
$rejection = $event->getRejectionDetails();
echo " Rejection Reason: " . $rejection->getReason() . PHP_EOL;
}
}
}
} catch (MyDataException $e) {
echo "Σφάλμα επικοινωνίας: " . $e->getMessage();
}
Πιθανές καταστάσεις δελτίου (DeliveryStatus)
-
REGISTERED(1) - Εκδόθηκε -
CANCELLED(2) - Ακυρώθηκε -
IN_TRANSIT(3) - Σε διακίνηση -
REJECTED(4) - Απορρίφθηκε -
DELIVERED_BY_CARRIER(5) - Παραδόθηκε από τον μεταφορέα -
FAILED_DELIVERY(7) - Αποτυχία παράδοσης -
COMPLETED(8) - Ολοκληρώθηκε
Τύποι Συμβάντων (DeliveryEventType)
-
RegisterTransfer- Έναρξη διακίνησης / Μεταφόρτωση -
ConfirmOutcome- Επιβεβαίωση παραλαβής -
Rejection- Απόρριψη
RequestGroupQrDetails - Αναζήτηση Στοιχείων Ομαδικού QR
# production
https://mydatapi.aade.gr/myDATA/RequestGroupQRDetails
# development
https://mydataapidev.aade.gr/RequestGroupQRDetails
Αναζητά τα στοιχεία ενός ομαδικού QR code που έχει δημιουργηθεί προηγουμένως.
Παράδειγμα χρήσης
use Firebed\AadeMyData\Http\DigitalGoodsMovement\RequestGroupQrDetails;
use Firebed\AadeMyData\Exceptions\MyDataException;
$request = new RequestGroupQrDetails();
try {
$response = $request->handle('9946C6AA9DB3658C85CC3BF43DB726FE25BBC555');
echo "Group ID: " . $response->getGroupId() . PHP_EOL;
echo "Creator VAT: " . $response->getGroupQrCreatorVatNumber() . PHP_EOL;
echo "Created at: " . $response->getCreatedAt() . PHP_EOL;
echo "Expires at: " . $response->getExpiresAt() . PHP_EOL;
echo "QR URLs Count: " . $response->getQrUrlsCount() . PHP_EOL;
echo "\nQR URLs:" . PHP_EOL;
foreach ($response->getQrUrls() as $qrUrl) {
echo " - " . $qrUrl . PHP_EOL;
}
} catch (MyDataException $e) {
echo "Σφάλμα επικοινωνίας: " . $e->getMessage();
}
Απόκριση και Επεξεργασία Αποτελεσμάτων
Response Objects
Οι μέθοδοι RegisterTransfer, ConfirmDeliveryOutcome, και RejectDeliveryNote επιστρέφουν ResponseDoc (συλλογή από αντικείμενα Response - Firebed\AadeMyData\Models\DigitalGoodsMovement\Response).
Κάθε Response περιέχει:
-
index: Αριθμός Σειράς Οντότητας -
statusCode: Κωδικός Αποτελέσματος (Successή άλλο) -
transferMark: Μοναδικός Αριθμός Εκκίνησης/Μεταφόρτωσης (μόνο γιαRegisterTransfer) -
rejectMark: Μοναδικός Αριθμός Απόρριψης (μόνο γιαRejectDeliveryNote) -
deliveryOutcomeMark: Μοναδικός Αριθμός Καταχώρησης (μόνο γιαConfirmDeliveryOutcome) -
errors: Λίστα Σφαλμάτων (αν υπάρχουν)
// Έλεγχος επιτυχίας
if ($response->first()->isSuccessful()) {
echo "Success!" . PHP_EOL;
// Ανάλογα με τη μέθοδο που καλέσατε:
echo "Transfer Mark: " . $response->first()->getTransferMark() . PHP_EOL; // RegisterTransfer
echo "Reject Mark: " . $response->first()->getRejectMark() . PHP_EOL; // RejectDeliveryNote
echo "Outcome Mark: " . $response->first()->getDeliveryOutcomeMark() . PHP_EOL; // ConfirmDeliveryOutcome
}
// Έλεγχος αποτυχίας
if ($response->first()->isFailed()) {
echo "Errors: " . PHP_EOL;
foreach ($response->first()->getErrors() as $error) {
echo "- " . $error->getMessage() . PHP_EOL;
}
}
// Διατρέχοντας όλα τα αποτελέσματα
foreach ($response as $item) {
if ($item->isSuccessful()) {
echo "Item {$item->getIndex()}: Success";
}
}
GroupQrCodeResponse
Η μέθοδος GenerateGroupQrCode επιστρέφει αντικείμενο GroupQrCodeResponse:
$groupQrUrl = $response->getGroupQrUrl(); // URL του ομαδικού QR
$groupId = $response->getGroupId(); // Μοναδικό ID
$qrUrlsCount = $response->getQrUrlsCount(); // Πλήθος QR URLs
$expiresAt = $response->getExpiresAt(); // Ημερομηνία λήξης
$statusCode = $response->getStatusCode(); // Κωδικός κατάστασης
DeliveryNoteStatusResponse
Η μέθοδος RequestDeliveryNoteStatus επιστρέφει αντικείμενο DeliveryNoteStatusResponse:
$invoiceMark = $response->getInvoiceMark(); // Mark δελτίου
$status = $response->getStatus(); // DeliveryStatus enum
$dispatchTime = $response->getDispatchTimestamp(); // Χρόνος αποστολής
$history = $response->getLifecycleHistory(); // Array από DeliveryEvent
GroupQrDetailsResponse
Η μέθοδος RequestGroupQrDetails επιστρέφει αντικείμενο GroupQrDetailsResponse:
$groupId = $response->getGroupId();
$creatorVat = $response->getGroupQrCreatorVatNumber();
$createdAt = $response->getCreatedAt();
$expiresAt = $response->getExpiresAt();
$qrUrls = $response->getQrUrls(); // Array από URLs
$qrUrlsCount = $response->getQrUrlsCount();
Όλες οι μέθοδοι που επιστρέφουν
Responseαντικείμενα υποστηρίζουν τις μεθόδουςisSuccessful()καιisFailed()για εύκολο έλεγχο κατάστασης.
Η σειρά των παραμέτρων στον constructor του
Locationείναι:latitude(γεωγραφικό πλάτος),longitude(γεωγραφικό μήκος).