diff --git a/README.md b/README.md index 31b3836..7f591b5 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ This package provides an expressive, fluent interface to ΑΑΔΕ myDATA invoici | Version | PHP | myDATA | |---------|-----|--------| -| ^v.3.x | 8.1 | v1.0.6 | +| ^v.3.x | 8.1 | v1.0.7 | | ^v.2.x | 8.1 | v1.0.5 | | ^v.1.x | 8.0 | v1.0.3 | @@ -29,7 +29,7 @@ By default, the package's classes are loaded automatically. There is nothing for ## Documentation

Official myDATA webpage: AADE myDATA

-

Official documentation: AADE myDATA REST API v1.0.6.

+

Official documentation: AADE myDATA REST API v1.0.7.

In order to use this package, you will need first a user id and a subscription key. You can get these credentials by signing up to mydata rest api.

Development: Sign up to mydata development api
Production: Sign up to mydata production api
@@ -56,6 +56,11 @@ MyDataRequest::setEnvironment($env); MyDataRequest::setCredentials($user_id, $subscription_key); ``` +For development, you may need to disable client verification if you are not using https: +```php +MyDataRequest::verifyClient(false); +``` + ### SendInvoices

You can refer to the official or this package's documentation to see the details about the parameters.

@@ -87,14 +92,15 @@ foreach ($response as $responseType) { // own and an invoice reference from myDATA, and you will have to relate these together. // Each responseType has an index value which corresponds to the index of the invoice in // the $invoicesDoc object, you can use this index value to find the invoice it is referred to. - // Afterwards, get the invoice's uid and mark values from the responseType, - // relate them with your local invoice and save them in your database. + // Retrieve the invoice's uid, mark, qr and other values from the responseType, + // then establish the correlation with your local invoice and persist these details in your database. $index = $responseType->getIndex(); $uid = $responseType->getInvoiceUid(); $mark = $responseType->getInvoiceMark(); $cancelledByMark = $responseType->getCancellationMark(); + $qrUrl = $responseType->getQrUrl(); - dd(compact('index', 'uid', 'mark', 'cancelledByMark')); + dd(compact('index', 'uid', 'mark', 'cancelledByMark', 'qrUrl')); } else { // There were some errors for this specific invoice. See errors for details. foreach ($responseType->getErrors() as $error) { diff --git a/config/class_map.php b/config/class_map.php index 7395c50..7b691cb 100644 --- a/config/class_map.php +++ b/config/class_map.php @@ -6,6 +6,7 @@ use Firebed\AadeMyData\Models\CancelledInvoicesDoc; use Firebed\AadeMyData\Models\ContinuationToken; use Firebed\AadeMyData\Models\Counterpart; +use Firebed\AadeMyData\Models\EntityType; use Firebed\AadeMyData\Models\Error; use Firebed\AadeMyData\Models\Errors; use Firebed\AadeMyData\Models\ExpensesClassification; @@ -18,6 +19,7 @@ use Firebed\AadeMyData\Models\InvoicesDoc; use Firebed\AadeMyData\Models\InvoiceSummary; use Firebed\AadeMyData\Models\Issuer; +use Firebed\AadeMyData\Models\Party; use Firebed\AadeMyData\Models\PaymentMethodDetail; use Firebed\AadeMyData\Models\PaymentMethods; use Firebed\AadeMyData\Models\RequestedBookInfo; @@ -27,6 +29,7 @@ use Firebed\AadeMyData\Models\Ship; use Firebed\AadeMyData\Models\TaxesTotals; use Firebed\AadeMyData\Models\TaxTotals; +use Firebed\AadeMyData\Models\TransportDetailType; return [ 'InvoicesDoc' => InvoicesDoc::class, @@ -57,4 +60,7 @@ 'response' => Response::class, 'taxes' => TaxTotals::class, 'taxesTotals' => TaxesTotals::class, + 'otherTransportDetails' => TransportDetailType::class, // v1.0.7 + 'otherCorrelatedEntities' => EntityType::class, // v1.0.7 + 'entityData' => Party::class // v1.0.7 ]; \ No newline at end of file diff --git a/src/Enums/SpecialInvoiceCategory.php b/src/Enums/SpecialInvoiceCategory.php index a93094a..df7b74c 100644 --- a/src/Enums/SpecialInvoiceCategory.php +++ b/src/Enums/SpecialInvoiceCategory.php @@ -8,22 +8,73 @@ enum SpecialInvoiceCategory: int * Επιδοτήσεις – Επιχορηγήσεις */ case TYPE_1 = 1; - - + + /** - * Έσοδα Λιανικής Ξενοδοχείων – Χρεώσεις Δωματίου + * Έσοδα Λιανικής Ξενοδοχείων */ case TYPE_2 = 2; - - + + /** * Λογιστική Εγγραφή */ case TYPE_3 = 3; - - + + /** - * Tax Free Έγκυρη τιμή μόνο για διαβίβαση μέσω erp ή έκδοση μέσω παρόχου ή timologio + * Tax Free + * Έγκυρη τιμή μόνο για διαβίβαση μέσω erp ή έκδοση μέσω παρόχου ή timologio */ case TYPE_4 = 4; + + + /** + * Σύνθετες συναλλαγές ημεδαπής – αλλοδαπής + * + * @version 1.0.7 + */ + case TYPE_5 = 5; + + + /** + * Δικαιούχοι του άρθρου 3 της υπό στοιχεία 139818 ΕΞ2022/28.09.2022 (Β’5083) κοινής υπουργικής απόφασης + * + * @version 1.0.7 + */ + case TYPE_6 = 6; + + + /** + * Αγορά αγροτικών αγαθών υπηρεσιών Άρθρο 41 του Κώδικα ΦΠΑ + * + * @version 1.0.7 + */ + case TYPE_7 = 7; + + + /** + * Έσοδα Λιανικών ΦΗΜ ΑΑΔΕ_1 + * Μόνο για ανάγνωση – μη έγκυρη τιμή για αποστολή μέσω ERP / Πάροχο + * + * @version 1.0.7 + */ + case TYPE_8 = 8; + + + /** + * Έσοδα Λιανικών ΦΗΜ ΑΑΔΕ_2 + * Μόνο για ανάγνωση – μη έγκυρη τιμή για αποστολή μέσω ERP / Πάροχο + * + * @version 1.0.7 + */ + case TYPE_9 = 9; + + + /** + * Έσοδα Λιανικών ΦΗΜ Επιχείρησης Απόκλιση + * + * @version 1.0.7 + */ + case TYPE_10 = 10; } \ No newline at end of file diff --git a/src/Models/EntityType.php b/src/Models/EntityType.php new file mode 100644 index 0000000..a11c86b --- /dev/null +++ b/src/Models/EntityType.php @@ -0,0 +1,55 @@ +get('type'); + } + + /** + * Κατηγορία Οντότητας + *
    + *
  1. Φορολογικός Εκπρόσωπος
  2. + *
  3. Διαμεσολαβητής
  4. + *
+ * + * @param int $type Κατηγορία Οντότητας + * + * @version 1.0.7 + */ + public function setType(int $type): void + { + $this->put('type', $type); + } + + /** + * @return Party + * + * @version 1.0.7 + */ + public function getEntityData(): Party + { + return $this->get('entityData'); + } + + /** + * @param Party $entityData + * + * @version 1.0.7 + */ + public function setEntityData(Party $entityData): void + { + $this->put('entityData', $entityData); + } +} \ No newline at end of file diff --git a/src/Models/Invoice.php b/src/Models/Invoice.php index 60c56fe..b97dd05 100644 --- a/src/Models/Invoice.php +++ b/src/Models/Invoice.php @@ -60,8 +60,8 @@ public function getTransmissionFailure(): ?int *
  • Στην περίπτωση αδυναμίας επικοινωνίας του παρόχου με το myDATA κατά την έκδοση / διαβίβαση παραστατικού
  • *
  • Στην περίπτωση αδυναμίας επικοινωνίας του ERP με το myDATA κατά την έκδοση / διαβίβαση παραστατικού
  • * - * - * @param int $transmissionFailure Κωδικός αδυναμίας επικοινωνίας παρόχου + * + * @param int $transmissionFailure Κωδικός αδυναμίας επικοινωνίας παρόχου */ public function setTransmissionFailure(int $transmissionFailure): void { @@ -77,7 +77,7 @@ public function getIssuer(): ?Issuer } /** - * @param Issuer $issuer Εκδότης Παραστατικού + * @param Issuer $issuer Εκδότης Παραστατικού */ public function setIssuer(Issuer $issuer): void { @@ -93,7 +93,7 @@ public function getCounterpart(): ?Counterpart } /** - * @param Counterpart $counterpart Λήπτης Παραστατικού + * @param Counterpart $counterpart Λήπτης Παραστατικού */ public function setCounterpart(Counterpart $counterpart): void { @@ -110,8 +110,8 @@ public function getPaymentMethods(): ?PaymentMethods /** * Προσθήκη τρόπου πληρωμής. - * - * @param PaymentMethodDetail $paymentMethod Τρόπος Πληρωμής + * + * @param PaymentMethodDetail $paymentMethod Τρόπος Πληρωμής */ public function addPaymentMethod(PaymentMethodDetail $paymentMethod): void { @@ -129,7 +129,7 @@ public function getInvoiceHeader(): ?InvoiceHeader } /** - * @param InvoiceHeader $invoiceHeader Επικεφαλίδα Παραστατικού + * @param InvoiceHeader $invoiceHeader Επικεφαλίδα Παραστατικού */ public function setInvoiceHeader(InvoiceHeader $invoiceHeader): void { @@ -146,8 +146,8 @@ public function getInvoiceDetails(): ?array /** * Προσθήκη γραμμής παραστατικού. - * - * @param InvoiceDetails $invoiceDetails Γραμμή Παραστατικού + * + * @param InvoiceDetails $invoiceDetails Γραμμή Παραστατικού */ public function addInvoiceDetails(InvoiceDetails $invoiceDetails): void { @@ -163,7 +163,7 @@ public function getInvoiceSummary(): ?InvoiceSummary } /** - * @param InvoiceSummary $invoiceSummary Περίληψη Παραστατικού + * @param InvoiceSummary $invoiceSummary Περίληψη Παραστατικού */ public function setInvoiceSummary(InvoiceSummary $invoiceSummary): void { @@ -175,14 +175,14 @@ public function setInvoiceSummary(InvoiceSummary $invoiceSummary): void * του ΦΠΑ, οι οποίοι αφορούν όλο το παραστατικό σαν σύνολο. Σε περίπτωση που ο * χρήστης κάνει χρήση αυτού του στοιχείου, δε θα μπορεί να εισάγει φόρους εκτός * του ΦΠΑ σε κάθε γραμμή του παραστατικού ξεχωριστά. - * + * * @return TaxesTotals|null */ public function getTaxesTotals(): ?TaxesTotals { return $this->get('taxesTotals'); } - + /** * Προσθήκη συνόλου φόρων. */ @@ -193,13 +193,48 @@ public function addTaxesTotals(TaxTotals $taxTotalsType): void $this->put('taxesTotals', $taxesTotals); } + /** + * Συμπληρώνεται από την Υπηρεσία. + * + * Κωδικοποιημένο αλφαριθμητικό για να χρησιμοποιηθεί από τα + * προγράμματα για τη δημιουργία QR Code τύπου Url. + * + * @version 1.0.7 + */ + public function getQrCodeUrl(): ?string + { + return $this->get('qrCodeUrl'); + } + + /** + * @return TransportDetailType[]|null Λοιπές Λεπτομέρειες Διακίνησης (Ορισμός - Αλλαγή Μτφ Μέσων) + * + * @version 1.0.7 + */ + public function getOtherTransportDetails(): ?array + { + return $this->get('otherTransportDetails'); + } + + /** + * Προσθήκη Λεπτομέρειες Διακίνησης (Ορισμός - Αλλαγή Μτφ Μέσων). + * + * @param TransportDetailType $transportDetailType Λεπτομέρειες Διακίνησης + * + * @version 1.0.7 + */ + public function addOtherTransportDetail(TransportDetailType $transportDetailType): void + { + $this->push('otherTransportDetails', $transportDetailType); + } + public function put($key, $value): void { - if ($key === 'invoiceDetails') { - $this->addInvoiceDetails($value); + if ($key === 'invoiceDetails' || $key === 'otherTransportDetails') { + $this->push($key, $value); return; } - + parent::put($key, $value); } } \ No newline at end of file diff --git a/src/Models/InvoiceHeader.php b/src/Models/InvoiceHeader.php index 07c490d..bcccf78 100644 --- a/src/Models/InvoiceHeader.php +++ b/src/Models/InvoiceHeader.php @@ -2,10 +2,10 @@ namespace Firebed\AadeMyData\Models; -use Firebed\AadeMyData\Enums\SpecialInvoiceCategory; use Firebed\AadeMyData\Enums\InvoiceType; use Firebed\AadeMyData\Enums\InvoiceVariationType; use Firebed\AadeMyData\Enums\MovePurpose; +use Firebed\AadeMyData\Enums\SpecialInvoiceCategory; class InvoiceHeader extends Type { @@ -20,7 +20,7 @@ public function getSeries(): ?string /** * Σε περίπτωση μή έκδοσης σειράς παραστατικού, το πεδίο series πρέπει να έχει την τιμή 0 * - * @param string $series Σειρά παραστατικού + * @param string $series Σειρά παραστατικού */ public function setSeries(string $series): void { @@ -36,7 +36,7 @@ public function getAa(): ?string } /** - * @param string $aa ΑΑ Παραστατικού, μέγιστο επιτρεπτό μήκος 50 + * @param string $aa ΑΑ Παραστατικού, μέγιστο επιτρεπτό μήκος 50 */ public function setAa(string $aa): void { @@ -52,7 +52,7 @@ public function getIssueDate(): ?string } /** - * @param string $issueDate Ημερομηνία Έκδοσης Παραστατικού + * @param string $issueDate Ημερομηνία Έκδοσης Παραστατικού */ public function setIssueDate(string $issueDate): void { @@ -68,7 +68,7 @@ public function getInvoiceType(): ?string } /** - * @param InvoiceType|string $invoiceType Είδος Παραστατικού + * @param InvoiceType|string $invoiceType Είδος Παραστατικού */ public function setInvoiceType(InvoiceType|string $invoiceType): void { @@ -84,7 +84,7 @@ public function isVatPaymentSuspension(): ?bool } /** - * @param bool $vatPaymentSuspension Αναστολή Καταβολής ΦΠΑ + * @param bool $vatPaymentSuspension Αναστολή Καταβολής ΦΠΑ */ public function setVatPaymentSuspension(bool $vatPaymentSuspension): void { @@ -102,7 +102,7 @@ public function getCurrency(): ?string /** * Ο κωδικός νομισμάτων προέρχεται από την αντίστοιχη λίστα σύμφωνα με το πρότυπο ISO4217. * - * @param string $currency Νόμισμα + * @param string $currency Νόμισμα */ public function setCurrency(string $currency): void { @@ -121,7 +121,7 @@ public function getExchangeRate(): ?float * To πεδίο exchangeRate είναι η ισοτιμία του νομίσματος σε σχέση με το ευρώ. * Πρέπει να συμπληρώνεται μόνο όταν το νόμισμα δεν έχει τιμή EUR * - * @param float $exchangeRate Ισοτιμία + * @param float $exchangeRate Ισοτιμία */ public function setExchangeRate(float $exchangeRate): void { @@ -129,9 +129,9 @@ public function setExchangeRate(float $exchangeRate): void } /** - * @return string|null Συσχετιζόμενα Παραστατικά + * @return array|null Συσχετιζόμενα Παραστατικά (ΜΑΡΚ) */ - public function getCorrelatedInvoices(): ?string + public function getCorrelatedInvoices(): ?array { return $this->get('correlatedInvoices'); } @@ -139,11 +139,11 @@ public function getCorrelatedInvoices(): ?string /** * Το στοιχείο correlatedInvoices είναι λίστα και περιέχει τα ΜΑΡΚ των συσχετιζόμενων παραστατικών. * - * @param string $correlatedInvoices Συσχετιζόμενα Παραστατικά + * @param int $correlatedInvoice Συσχετιζόμενο Παραστατικό (ΜΑΡΚ) */ - public function setCorrelatedInvoices(string $correlatedInvoices): void + public function addCorrelatedInvoice(int $correlatedInvoice): void { - $this->put('correlatedInvoices', $correlatedInvoices); + $this->push('correlatedInvoices', $correlatedInvoice); } /** @@ -155,7 +155,7 @@ public function isSelfPricing(): ?bool } /** - * @param bool $selfPricing Ένδειξη Αυτοτιμολόγησης + * @param bool $selfPricing Ένδειξη Αυτοτιμολόγησης */ public function setSelfPricing(bool $selfPricing): void { @@ -171,7 +171,7 @@ public function getDispatchDate(): ?string } /** - * @param string $dispatchDate Ημερομηνία Έναρξης Αποστολής + * @param string $dispatchDate Ημερομηνία Έναρξης Αποστολής */ public function setDispatchDate(string $dispatchDate): void { @@ -187,7 +187,7 @@ public function getDispatchTime(): ?string } /** - * @param string $dispatchTime Ώρα Έναρξης Αποστολής + * @param string $dispatchTime Ώρα Έναρξης Αποστολής */ public function setDispatchTime(string $dispatchTime): void { @@ -203,7 +203,7 @@ public function getVehicleNumber(): ?string } /** - * @param string $vehicleNumber Αριθμός Μεταφορικού Μέσου + * @param string $vehicleNumber Αριθμός Μεταφορικού Μέσου */ public function setVehicleNumber(string $vehicleNumber): void { @@ -219,7 +219,7 @@ public function getMovePurpose(): ?string } /** - * @param MovePurpose|string $movePurpose Σκοπός Διακίνησης + * @param MovePurpose|string $movePurpose Σκοπός Διακίνησης */ public function setMovePurpose(MovePurpose|string $movePurpose): void { @@ -238,7 +238,7 @@ public function isFuelInvoice(): ?bool * Το πεδίο fuelInvoice ορίζει αν πρόκειται για παραστατικό πώλησης υγρών καυσίμων και * επιτρέπεται η αποστολή μόνο για την περίπτωση των παρόχων * - * @param bool $fuelInvoice Ένδειξη Παραστατικό καυσίμων + * @param bool $fuelInvoice Ένδειξη Παραστατικό καυσίμων */ public function setFuelInvoice(bool $fuelInvoice): void { @@ -257,7 +257,7 @@ public function getSpecialInvoiceCategory(): ?int * Οι πιθανές τιμές του πεδίου specialInvoiceCategory περιγράφονται αναλυτικά στον * αντίστοιχα πίνακα του Παραρτήματος. * - * @param SpecialInvoiceCategory|int $specialInvoiceCategory Ελάχιστη τιμή = 1, Μέγιστη τιμή = 4 + * @param SpecialInvoiceCategory|int $specialInvoiceCategory Ελάχιστη τιμή = 1, Μέγιστη τιμή = 10 * @return void */ public function setSpecialInvoiceCategory(SpecialInvoiceCategory|int $specialInvoiceCategory): void @@ -278,11 +278,44 @@ public function getInvoiceVariationType(): ?int * αντίστοιχα πίνακα του Παραρτήματος. Επίσης, λεπτομέρειες σχετικά με τον τρόπο * χρήσης τους από επιχειρησιακής σκοπιάς περιγράφονται στο σχετικό επιχειρησιακό * έγγραφο. (Δεν επιτρέπεται στην περίπτωση αποστολής μέσω παρόχων) - * @param InvoiceVariationType|int $invoiceVariationType Ελάχιστη τιμή = 1, Μέγιστη τιμή = 4 + * @param InvoiceVariationType|int $invoiceVariationType Ελάχιστη τιμή = 1, Μέγιστη τιμή = 4 * @return void */ public function setInvoiceVariationType(InvoiceVariationType|int $invoiceVariationType): void { $this->put('invoiceVariationType', $invoiceVariationType); } + + + /** + * @return array|null Λοιπές συσχετιζόμενες οντότητες + * + * @version 1.0.7 + */ + public function getOtherCorrelatedEntities(): ?array + { + return $this->get('otherCorrelatedEntities'); + } + + /** + * Λοιπές συσχετιζόμενες οντότητες + * + * @param EntityType $entityType + * + * @version 1.0.7 + */ + public function addOtherCorrelatedEntities(EntityType $entityType): void + { + $this->push('otherCorrelatedEntities', $entityType); + } + + public function put($key, $value): void + { + if ($key === 'correlatedInvoices' || $key === 'otherCorrelatedEntities') { + $this->push($key, $value); + return; + } + + parent::put($key, $value); + } } \ No newline at end of file diff --git a/src/Models/Party.php b/src/Models/Party.php index a58cf2b..b3b6476 100644 --- a/src/Models/Party.php +++ b/src/Models/Party.php @@ -2,7 +2,7 @@ namespace Firebed\AadeMyData\Models; -abstract class Party extends Type +class Party extends Type { /** * @return string|null Οποιοσδήποτε έγκυρος ΑΦΜ @@ -159,4 +159,28 @@ public function setSupplyAccountNo(string $supplyAccountNo): void { $this->put('supplyAccountNo', $supplyAccountNo); } + + /** + * @return string|null Κωδ. Χώρας Έκδοσης Επίσημου Εγγράφου + * @version 1.0.7 + */ + public function getCountryDocumentId(): ?string + { + return $this->get('countryDocumentId'); + } + + /** + * Ο κωδικός χώρας έκδοσης του επίσημου εγγράφου (π.χ διαβατηρίου), είναι + * επιτρεπτός μόνο στην περίπτωση διαβίβασης παραστατικών που ανήκουν στην + * Ειδική Κατηγορία Παραστατικού Tax free (το πεδίο της επικεφαλίδας του + * παραστατικού specialInvoiceCategory έχει την τιμή 4) και εφόσον έχει συμπληρωθεί + * το πεδίο αριθμός επίσημου εγγράφου (documentIdNo) και αφορά τον λήπτη του + * παραστατικού. + * + * @version 1.0.7 + */ + public function setCountryDocumentId(string $countryDocumentId): void + { + $this->put('countryDocumentId', $countryDocumentId); + } } \ No newline at end of file diff --git a/src/Models/Response.php b/src/Models/Response.php index ee01dff..3d92a31 100644 --- a/src/Models/Response.php +++ b/src/Models/Response.php @@ -134,6 +134,26 @@ public function hasErrors(): bool return !is_null($this->getErrors()) && count($this->getErrors()) > 0; } + /** + * @return string|null Το πεδίο qrUrl επιστρέφει μόνο στις υποβολές παραστατικών τύπου από 1.1 έως 11.5 + * @version 1.0.7 + */ + public function getQrUrl(): ?string + { + return $this->get('qrUrl'); + } + + /** + * Χρησιμοποιείται από τα προγράμματα για τη δημιουργία QR Code τύπου Url + * + * @param $qrUrl + * @version 1.0.7 + */ + public function setQrUrl($qrUrl): void + { + $this->put('qrUrl', $qrUrl); + } + /** * @return Errors|null Λίστα Σφαλμάτων */ diff --git a/src/Models/TransportDetailType.php b/src/Models/TransportDetailType.php new file mode 100644 index 0000000..cd6fbe7 --- /dev/null +++ b/src/Models/TransportDetailType.php @@ -0,0 +1,31 @@ +get('vehicleNumber'); + } + + /** + * Αριθμός Μεταφορικού Μέσου + * + * @param int $vehicleNumber Μέγιστο επιτρεπτό μήκος 50 + * + * @version 1.0.7 + */ + public function setVehicleNumber(int $vehicleNumber): void + { + $this->put('vehicleNumber', $vehicleNumber); + } +} \ No newline at end of file