niedziela, 9 listopada 2014

Wysyłanie przesyłek do domyślnego bufora

Gdy mamy już gotowego prostego klienta, czas wrzucić jakąś przesyłkę.


Ale na początek może wytłumaczę czym jest karta, którą definiuje się jako dodatnią liczbę całkowitą. Najprościej wyobrazić sobie ją jako kontener, który umożliwia wkładanie do niego tylko przesyłek, które są do niego przypisane. Tak więc jeśli mamy umowę z Pocztą i dostajemy od nich jakieś numery kart, to każda z tych kart definiuje co w jej ramach można wysyłać.



Przed wysłaniem przesyłki potrzebny jest nam bufor, do którego będziemy mogli ją wrzucić. Oczywiście system pozwala nam się czymś takim nie przejmować, będziemy wówczas musieli korzystać z bufora domyślnego, dlatego przedstawię tu dwie strategie:

1. korzystanie z bufora domyślnego

2. korzystanie, z świadomie tworzonych przez użytkownika buforów



Dziś zajmę się punktem pierwszym: korzystanie z bufora domyślnego



Użytkowanie bufora domyślnego ma swoje ograniczenie, dzień w którym coś do niego wrzucamy musi być dniem jego wysłania a jednocześnie jest dniem nadania. Dodatkowo, najbezpieczniej przed wrzuceniem do niego nowych przesyłek wyczyścić go całkowicie (metoda clearEnvelope) tak aby mieć pewność, że nie ma tam przesyłek, których zapomnieliśmy wysłać dzień wcześniej.



Całą procedurę wysyłania przesyłek opisać można w 7 krokach.

1. ustalenie dostępnych numerów kart (getKarty)

2. ustawienie bieżącej karty (setAktywnaKarta)

3. wyczyszczenie istniejącego bufora (clearEnvelope)

4. utworzenie przesyłki

5. wysłanie przesyłki do elektronicznego nadawcy (addShipmnet)

6. pobranie dostępnych urzędów nadania dla bieżącej karty (getUrzedyNadania)

7. wysłanie informacji o utworzonych przesyłkach na wybrany urząd nadania (sendEnvelope)



Pominąłem na tą chwilę pobieranie nalepek adresowych aby nie zaciemniać kodu, nalepki adresowe można pobrać po utworzeniu przesyłek jaki i po ich wysłaniu na wybrany urząd nadania. Dodatkowo uprościłem sprawę wybierania karty oraz urzędu nadania, po przez użycie zawsze pierwszej z dostępnych.



Poniżej wrzucam, mam nadzieję czytelny kod, który wykona wszystkie czynności od 1 do 7. Najlepiej go odpalić i sprawdzić jak działa, oraz dla pewności co pozostaje po jego wykonaniu w folderze "Wysłane" na stronie Testowej Elektronicznego Nadawcy.


Plik do pobrania
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<?php
include "ElektronicznyNadawca.php";
class client
{
 protected $guid = null;
 public $urzedyNadania = null;
 protected $karty = null;
 protected $przesylki = array();
 protected $przesylkiDodane = array();
 protected $login = 'nazwa użytkownika w systemie elektroniczny nadawca';
 protected $location = 'https://en-testwebapi.poczta-polska.pl/websrv/labs.php';
 protected $password = 'hasło';
 protected $en = null;
 // -------------------------------------------------------------------------
 public function __construct()
 {
  $this->en = new ElektronicznyNadawca("labs.wsdl", array('login' => $this->login, 'password' => $this->password, 'location' => $this->location ));
 }
 // -------------------------------------------------------------------------
 public function testGetKarty()
 {
  echo "========<b>testGetKarty</b>====================<BR>";
  $parameters = new getKarty();
  $response = $this->en->getKarty($parameters);
  var_dump($response);
  $response->karta = $this->convertToArray($response->karta);
  $this->karty = $response->karta;
 }
// -------------------------------------------------------------------------
public function testSetAktywnaKarta()
{
 echo "========<b>setAktywnaKarta</b>====================<BR>";
 $parameters = new setAktywnaKarta();
 $parameters->idKarta = reset($this->karty)->idKarta;
 $response = $this->en->setAktywnaKarta($parameters);
 var_dump($parameters);
 $response = new setAktywnaKartaResponse();
 if(!is_null($response->error))
 {
  $this->printErrors($response->error);
  throw new Exception("Błąd ustawiania karty.");
 }
}
 // -------------------------------------------------------------------------
 public function testClearEnvelope()
 {
  echo "========<b>testClearEnvelope</b>====================<BR>";
  $response = $this->en->clearEnvelope(new clearEnvelope());
  var_dump($response);
 }
 // -------------------------------------------------------------------------
 public function testPaczkaPocztowaType()
 {
  echo "========<b>testPaczkaPocztowaType</b>====================<BR>";
  $paczka = new paczkaPocztowaType();
  $paczka->adres = new adresType();
  $paczka->adres->nazwa = "Jan Kowalski";
  $paczka->adres->ulica = "Kowalska";
  $paczka->adres->numerDomu = "666";
  $paczka->adres->numerLokalu = "666";
  $paczka->adres->kodPocztowy = "66-666";
  $paczka->adres->miejscowosc = "Warszawa";
  $paczka->kategoria = kategoriaType::PRIORYTETOWA;
  $paczka->gabaryt = gabarytType::GABARYT_B;
  $paczka->wartosc = 20000;
  
  $paczka->guid = $this->getGuid();
  var_dump($paczka);
  $this->przesylki[] = $paczka;
 }
 // -------------------------------------------------------------------------
 public function testAddShipment()
 {
  echo "========<b>testAddShipment</b>====================<BR>";
  $parameters = new addShipment();
  $parameters->przesylki = $this->przesylki;
  $response = $this->en->addShipment($parameters);
  var_dump($response);
  $response->retval = $this->convertToArray($response->retval);
  foreach($response->retval as $przesylka)
  {
   if(is_null($przesylka->error))
    $this->przesylkiDodane[] = $przesylka;
   else
   {
    echo "<B>Nie udało się dodać przesyłki </B>" . $przesylka->guid . " z powodu błędów.<BR>";
    $this->printErrors($przsylka->error);
   }
  }
 }
 // -------------------------------------------------------------------------
 public function testSendEnvelope()
 {
  echo "========<b>testSendEnvelope</b>====================<BR>";
  $parameters = new sendEnvelope();
  $parameters->urzadNadania = $this->urzedyNadania[0]->urzadNadania;
  $response = $this->en->sendEnvelope($parameters);
  var_dump($response);
  
  if(!is_null($response->error))
  {
   $this->printErrors($response->error);
  }
  echo "<B>Status wysłanego kontenera przesyłek: </B>" . $response->envelopeStatus . "<BR>";
  echo "<B>Identyfikator kontenera przesyłek: </B>" . $response->idEnvelope . "<BR>";
  return $response->idEnvelope;
 }
 // -------------------------------------------------------------------------
 public function testGetUrzadNadania()
 {
  echo "========<b>testGetUrzadNadania</b>====================<BR>";
  $response = $this->en->getUrzedyNadania(new getUrzedyNadania());
  var_dump($response->urzedyNadania);
  $response->urzedyNadania = $this->convertToArray($response->urzedyNadania);
  if(count($response->urzedyNadania) == 0)
   throw new Exception("Brak urzędów nadania.");
  $this->urzedyNadania = $response->urzedyNadania;
 }
 // -------------------------------------------------------------------------
 function getGuid()
 {
  mt_srand((double)microtime() * 10000);
  $charid = strtoupper(md5(uniqid(rand(), true)));
  $retval = substr($charid, 0, 32);
  return $retval;
 }
 // -------------------------------------------------------------------------
 function convertToArray($data)
 {
  if(!is_array($data))
   $data = array( $data );
  return $data;
 }
 // -------------------------------------------------------------------------
 function printErrors($errors)
 {
  $errors = $this->convertToArray($errors);
  foreach($errors as $error)
  {
   echo "[" . $error->errorNumber . "] " . $error->errorDesc . " " . $error->guid . "<BR>";
  }
 }
}
$c = new client();
$c->testGetKarty();
$c->testSetAktywnaKarta();
$c->testClearEnvelope();
$c->testPaczkaPocztowaType();
$c->testAddShipment();
$c->testGetUrzadNadania();
$c->testSendEnvelope();
?>
 </body>
</html>

23 komentarze:

  1. Hej. Dzięki wielkie za wskazówki. Wszystko działa - ale, mam problem z funkcją pocztexKrajowyType - otrzymuję błąd:
    ========testAddShipment====================
    object(addShipmentResponse)#20 (1) {
    ["retval"]=>
    object(addShipmentResponseItemType)#21 (3) {
    ["error"]=>
    object(errorType)#22 (3) {
    ["errorNumber"]=>
    int(40102)
    ["errorDesc"]=>
    string(74) "Produkt ("832") nie znajduje się na umowie zawartej z Poczta Polską S.A."
    ["guid"]=>
    string(32) "AA43DC14D9462D056237873B3A3F370C"
    }
    ["numerNadania"]=>
    NULL
    ["guid"]=>
    string(32) "AA43DC14D9462D056237873B3A3F370C"
    }
    }
    Dodam, że tylko przy dodawaniu opcji POCZTEX i tylko na wersji produkcujnej (na testowej działa) .
    Spotkałeś się już może z czymś takim? Pozdrawiam, Krzysiek

    OdpowiedzUsuń
  2. Witam
    Będzie trzeba się zgłosić do przedstawiciela handlowego, wygląda na to, że karta na której przygotowywana jest przesyłka, nie ma pocztexKrajowyType (to jest stary pocztex), tylko oni mogą dopisywać takie rzeczy do karty.
    Po za tym myślę, że to może być błędny typ, bowiem o ile się orientuję, aktualnie w ofercie PP pocztex udostępniany jest jako typ uslugaKurierskaType.

    OdpowiedzUsuń
  3. Jesteś MASTER!

    OdpowiedzUsuń
  4. Hello, please how I can add a description (eg. Order number) on the label? Also, you can not specify the type of insurance U1. Can you please publish a sample script for describing and insurance? Thank you very much.

    OdpowiedzUsuń
  5. Świetny opis, naprawdę mi pomógł. Małe pytanie, jak uzyskałeś dostęp do konta testowego - dane które otrzymałem do konta produkcyjnego nie działają i nie wiem jak zdobyć dane do testowego.

    OdpowiedzUsuń
    Odpowiedzi
    1. Witam
      Faktycznie, wszelkie kontakty wydają się jakby ukryte, udało mi się na stronie coś znaleźć, i jestem pewien, że tam będą w stanie udzielić jakiejś konkretnej informacji z kim rozmawiać o dostępie do konta testowego

      "Dla telefonów stacjonarnych 801 333 444 (opłata jak za połączenie lokalne),
      dla telefonów komórkowych i zagranicy (+48) 43 842 06 00 (opłata wg cennika operatora).
      Infolinia czynna jest od poniedziałku do piątku w godz. 8:00 - 20:00"

      Usuń
  6. Hej, mam problem, wszystko działa niby ok, skrypt niby tworzy przesyłkę i otrzymuję numer przesyłki, lecz nie widzę tej przesyłki po zalogowaniu się do e-nadawcy. W czym jest problem?

    OdpowiedzUsuń
  7. Witam
    Należy wejść na ENa w zakładkę Ustawienia, po lewej stronie w sekcji Inne zaznaczyć checkboxa "Pokaż bufory webapi w przygotowanych"
    Pozdrawiam

    OdpowiedzUsuń
  8. Dzięki wielkie za pomoc!:) Teraz już widzę zbiory, mam jeszcze tylko jedno pytanie, czy mogę w jakiś sposób odczytać istniejące bufory?
    Bo poradziłem sobie w taki sposób, id zbioru jest widoczne na końcu linku zbioru: https://e-nadawca.poczta-polska.pl/przesylki/?action=GetZbiorClose&arg1=16079228
    i gdy podstawiam w
    $parameters->idBufor = $bufor->idBufor
    wartość arg1 zamiast $bufor->idBufor to mi dodaje paczkę do tego zbioru. Czy da się z poziomu Api odczytać id zbiorów/buforów?

    OdpowiedzUsuń
  9. Ok widzę że się nie da pobrać listy buforów utworzonych ręcznie w EN tylko te co zostały utworzone poprzez API, więc pozostaje poprzez api dodawać nowy zbiór :) Już sobie poradziłem przerabiając nieco Twoją funkcję testgetkarty(), kod

    protected $bufory = null;
    public function testEnvelopeBuforList()
    {
    echo "========testBuforList====================
    ";
    $parameters = new getEnvelopeBuforList();
    $response = $this->en->getEnvelopeBuforList($parameters);
    var_dump($response);
    $response->bufor = $this->convertToArray($response->bufor);
    $this->bufory = $response->bufor;
    }

    OdpowiedzUsuń
  10. Dokładnie, niestety nie da się metodą getEnvelopeBuforList wylistować buforów utworzonych po za webapi, myślę że zamysł był taki by ewentualny mechanizm po stronie webapi nie miał wpływu na przesyłki tworzone przez www.

    OdpowiedzUsuń
  11. Dobra ogarnąłem już prawie wszystko, pozostało mi tylko generowanie etykiet, podeślesz w jaki sposób można to zrobić?

    OdpowiedzUsuń
  12. Witam, jestem nowy w języku polskim, a także jestem integracji Polski Integracja Post .net Project, próbowałem wiele rzeczy, ale siedzę w błąd "PRODUKT (& quot; & quot;) Nie znajduje SIĘ na umowie zawartej z Poczta Polska SA " struggeling od tygodni. można zasugerować, jakie rzeczy można zrobić, aby rozwiązać ten problem. Ja was posyłam jak poniżej przykładowy plik xml:








    0


    OdpowiedzUsuń
    Odpowiedzi
    1. Maybe better to write in English? Most of polish people know english :) In this case you propably use wrong delivery type, thats not on the deal that customer (owner of account that you connect to API) of Polish Post have. Its very complicated with amount of delivery types and the best solution is to contact Sales department of Polish Post, thru the account owner, and they for sure gonna help you with that - they were very helpfull for me with the integration!

      Usuń
    2. Thanks a lot for your quick response :), i have tried lots of Shipment types but not get success, as per your suggestion i will contact to polish post team. your blog helped me a lot. thanks again :)

      Usuń
  13. Witam, jestem nowy w języku polskim, a także jestem integracji Polski Integracja Post .net Project, próbowałem wiele rzeczy, ale siedzę w błąd "PRODUKT (& quot; & quot;) Nie znajduje SIĘ na umowie zawartej z Poczta Polska SA " struggeling od tygodni. można zasugerować, jakie rzeczy można zrobić, aby rozwiązać ten problem. Ja was posyłam jak poniżej przykładowy plik xml:








    0


    OdpowiedzUsuń
  14. Ten komentarz został usunięty przez autora.

    OdpowiedzUsuń
  15. Ten komentarz został usunięty przez autora.

    OdpowiedzUsuń
  16. Odbijam się od "Produkt ("") nie znajduje się na umowie zawartej z Poczta Polską S.A." Dla każdego rodzaju paczki. Zarówno dla Twojego kodu, jak i kodu z dokumentacji jak i zupełnie od zera napisanej komunikacji. Czy coś jeszcze z PP trzeba załatwić aby webapi działało?

    OdpowiedzUsuń
    Odpowiedzi
    1. Skontaktuj się z handlowcem przypisanym do konta i Ci poda dokładny produkt, który jest przypisany do umowy. W PP jest tak, że działają Ci tylko produkty, na które podpiszesz umowę, a ich nazwy często są mylące i trzeba się naszukać.

      Usuń
    2. Witam
      Czy mógłbyś dodać treść SOAPa, który jest wysyłany do EN, bowiem wygląda na jakiś błąd w typie przesyłki.

      Usuń
  17. Jasne, że to świetna sprawa. I jakbyś kiedyś sam za pośrednictwem brokerów nadawał jakieś przesyłki to polecam wyposażyć się w porządne taśmy pakowe jak np. https://tcmservice.pl/pl/tasmy-pakowe .

    OdpowiedzUsuń