System eDokumenty udostępnia API (Application Programming Interface) dzięki któremu jesteśmy w stanie przeprowadzać podstawowe czynności bez konieczności logowania do systemu.
Usługa jest zabezpieczona rozszerzeniem WSSecurity protokołu SOAP i wymaga podania w nagłówkach wywołania XML nazwy użytkownika i hasła.
Hasło i użytkownik to specjalne dane, które należy wprowadzić do pliku config.inc pod kluczami
define('EDOK_API_LOGIN', 'edok_api_user'); define('EDOK_API_PASSWORD', 'edok_api_pass');
wartości stałych w powyższym przykładzie są tylko danymi prezentacyjnymi i nie powinno się ich używać na produkcyjnej bazie.
Stałe te mogą mieć dowolne wartości ważne jednak aby te same wartości podać przy wywołaniu usługi SOAP w kliencie.
Usługa jest dostępna pod adresem:
http://{host}:{port}/apps/edokumenty/classes/eDokumentyApi/EDokApiServer.php
Opcjonalnie od wersji 0.9.8 usługa jest dostępna pod skróconym adresem:
http://{host}:{port}/eDokumentyApi.php
Wartość {host} oraz {port} należy zamienić odpowiednimi wartościami zgodnymi z konfiguracją serwera instalacyjnego systemu eDokumenty.
Dokumentacja API znajduje się pod adresem
http://{host}:{port}/apps/edokumenty/classes/eDokumentyApi/DokumentacjaAPI.txt
Podgląd dokumentacji API
<?php // Dokumentacja Webservice - API systemu eDokumenty w wersji 0.9.9 /** * Tworzy nowy dokument * * @param data Array - Tablica z parametrami * @param data['dscrpt'] String - opis dokumentu * @param data['dctpid'] Int - typ dokumentu (types_of_documents:dctpid) * @param data['target'] Int - identyfikator stanowiska (organization_units:orunid) * @param data['prc_id'] Int - identyfikator sprawy (processes:prc_id) * @param data['state_'] Int - rodzaj dokumenty (1-wychodzący, 2-przychodzący, 3-wewnętrzny) * @param data['from_contact_symbol'] String - symbol nadawcy (contacts:symbol) * @param data['to_contact_symbol'] String - symbol odbiorcy (contacts:symbol) * * @return Int - id dokumentu jeśli sukces (documents:doc_id), 0 w razie niepowodzenia * * @throws Exception - SoapFault */ Int createDocument(Array data) /** * Dodaje załącznik do dokumentu * * @param fileContent String - Tablica z parametrami * @param fileName String - nazwa pliku * @param documentId Int - identyfikator dokumentu (documents:doc_id) * @param contentTransferEncoding String - kodowanie przesyłanej treści pliku (tylko base64) * * @return Int - id pliku jeśli sukces, 0 w razie niepowodzenia * * @throws Exception - SoapFault */ Int addAttachmentToDocument(String fileContent, String fileName, Int documentId) /** * Tworzy nowy dokument typu raport dobowy z kasy * W przypadku jeśli dany dokument już istnieje następuje * jego aktualizacja. * Warunkiem sprawdzenia są 2 parametry acorid oraz datedr. * * @param data Array - Tablica z parametrami * @param data['datedr'] Date - data raportu w formacie YYYY-MM-DD (np 2010-01-01) * @param data['netto_'] Numeric(12, 2) - wartość netto obrotów * @param data['vatval'] Numeric(12, 2) - wartość vat * @param data['brutto'] Numeric(12, 2) - wartość brutto obrotów * @param data['crdpay'] Numeric(12, 2) - wartość jaka została zapłacona kartami * @param data['clncnt'] Int - ilość klientów * @param data['acorid'] Int - jednostka rozliczeniowa (organization_units:orunid) jeśli isclun = TRUE * * @return Int - id dokumentu jeśli sukces (documents:doc_id), 0 w razie niepowodzenia * * @throws Exception - SoapFault */ Int createFKDayReport(Array data) /** * Tworzy nową sprawę * * @param data Array - Tablica z parametrami * @param data['dscrpt'] String - opis sprawy * @param data['briefcase_symbol'] String - symbol teczki (można podać zamiast dsexid np. DO.1040) * @param data['dsexid'] int - identyfikator teczki (doss_exctract_list:dsexid) * @param data['orunid'] int - identyfikator jednostki organizacyjnej, pod którą zostanie utworzona sprawa (organization_units:orunid) * @param data['rspoid'] int - identyfikator osoby odpowiedzialnej w sprawie (organization_units:orunid) * @param data['prtpid'] int - identyfikator procedury (procedures_def:prtpid) * @param data['contact_symbol'] String - symbol kontaktu (contacts:symbol) * * @return Int - id sprawy jeśli sukces (processes:prc_id), 0 w razie niepowodzenia * * @throws Exception - SoapFault */ Int createProcess(Array data) /** * Zwraca dane sprawy * * @param prc_id Int - Id sprawy (processes:prc_id) * * @return Array - tablica danych sprawy jeśli sukces, SoapFault w razie niepowodzenia * * @throws Exception - SoapFault */ Array getProcess(Int prc_id) /** * Tworzy nowy kontakt * * @param data Array - Tablica z parametrami * @param data['name_1'] String - nazwa kontaktu * @param data['name_2'] String - skrót kontaktu * @param data['nip___'] Int - numer NIP kontaktu * @param data['symbol'] String - symbol kontrahenta * @param data['notes_'] String - uwagi * @param data['ph_num'] String - numery telefonów * @param data['faxnum'] String - numery faxów * @param data['email_'] String - adresy email oddzielone przecinkiem * @param data['websit'] String - strona www kontaktu * @param data['regon_'] String - numer REGON * @param data['pesel_'] String - numer PESEL * @param data['bldnum'] String - numer domu * @param data['fltnum'] String - numer mieszkania * @param data['distkm'] Numeric(12, 2) - dystans * @param data['powiat'] String - nazwa powiatu * @param data['gmina_'] String - nazwa gmiany * @param data['woj___'] String - nazwa województwa ze słownika * @param data['post__'] String - poczta * @param data['countr'] String - kraj * @param data['city__'] String - miasto * @param data['code__'] String - kod_pocztowy * @param data['street'] String - nazwa ulicy * * @return Int - id kontaktu jeśli sukces (contacts:contid), 0 w razie niepowodzenia * * @throws Exception - SoapFault */ Int createContact(Array data) /** * Zwraca dane kontaktu wraz z adresem * * @param contid Int - Id kontaktu (contacts:contid) * * @return Array - tablica danych kontaktu jeśli sukces, SoapFault w razie niepowodzenia * * @throws Exception - SoapFault */ Array getContact(Int contid) /** * Tworzy nowe zdarzenie * * @param data Array - Tablica z parametrami * @param data['dscrpt'] String - opis zdarzenia * @param data['trmtyp'] String - typ zdarzenia (TODO - zadanie, PHONECALL - rozmowa tel., MEETING - spotkanie) * @param data['type__'] String - typ rozmowy tel. jeśli trmtyp = PHONECALL (IN - przychodząca, OUT - wychodząca, INT - wewnętrzna) * @param data['start_'] String - data rozpoczęcia w formacie YYYY-MM-DD HH:MM:SS np 2010-01-01 08:00:00 * @param data['duratn'] String - czas trwania np 2h30m - co oznacza 2 godziny 30 minut * @param data['usr_id'] Mixed - identyfikator pracownika (może być tablica identyfikatorów), któremu zleca się wykonanie zdarzenia (users:usr_id) * @param data['contid'] Int - identyfikator kontaktu (contacts:contid) pod którym zostanie utworzone zdarzenie * @param data['prc_id'] Int - identyfikator sprawy (processes:prc_id) do której zostanie dołączone zdarzenie * @param data['adduid'] Int - identyfikator pracownika (users:usr_id) który zleca zdarzenie, musi należeć do jednostki i mieć aktywne konto * * @return Int - id event jeśli sukces (events:evntid), 0 w razie niepowodzenia * * @throws Exception - SoapFault */ Int createEvent(Array data) /** * Zwraca dane zdarzenia * * @param evntid Int - Id zdarzenia (events:evntid) * * @return Array - tablica danych zdarzenia jeśli sukces, SoapFault w razie niepowodzenia * * @throws Exception - SoapFault */ Array getEvent(Int evntid) /** * Zwraca listę zdarzeń według zadanych parametrów * * @param data Array - Tablica z parametrami * @param from__ Date - data w formacie YYYY-MM-DD (np 2010-01-01) z jakiego dnia ma pobrać zdarzenia * @param to____ Date - data w formacie YYYY-MM-DD (np 2010-01-10) do jakiego dnia ma pobrać zdarzenia, jeśli brak parametru do ustawiany na from__ * @param usr_id Int - Id praconwika (users:usr_id) * @param contid Int - Id kontaktu (contacts:contid) * * @return Array - tablica zdarzeń (może być pusta jeśli nie ma takich, które spełniają kryterium wyszukiwania) * jeśli sukces, SoapFault w razie niepowodzenia * * @throws Exception - SoapFault */ Array getEvents(Array data) /** * Zwraca dane etapów danej procedury. * Identyfikator procedury można pobrać wykonując $client->getProcess($prc_id) i w zwróconej * tablicy będzie kolumna procid. * * @param Int procid - Id procedury (procedures:procid) * * @return Array - tablica z danymi etapów jeśli pusta tzn, że procedura nie ma etapów * * @throws Exception - SoapFault */ Int getProceduresStages(Int procid) /** * Wykonuje dany etap procedury oraz aktywuje następny * * @param Int procid - Id procedury (procedures:procid) * @param Int ptstid - Id etapu z wskazanej procedury jakie zostanie wykonany jako załatwiony * @param Int next_ptstid - Id etapu z tabeli stages_def * ("ptstid" jest etapem decyzyjnym to "next_ptstid" będzie wybrane * jako następny etap jeżeli jest następnikiem etapu "ptstid") * * @return Boolean - TRUE w przypadku powodzenia w każdym innym jest zwracany wyjątek SoapFault * * @throws Exception - SoapFault */ Int completeStage(Int procid, Int ptstid, Int next_ptstid = NULL) ?>
Przykład wywołania API z poziomu PHP w systemie eDokumenty
Hasło powinno być zakodowane przy użyciu funkcji md5
// Plik MyService.php umieszczony w apps/edokumenty. // MyService.php <?php // stałe są w confing.inc i są to dane potrzebne do autentykacji usługi require_once('./../../framework/lib/util/Translator/Translator.inc'); require_once('./config.inc'); // klient SOAP systemu eDokumenty wysyłający nagłówki WSSecurity zmienić na // odpowiednią ścieżkę w zależności od lokalizacji pliku MyService.php require_once('./classes/eDokumentyApi/EDokApiClient.inc'); // wartość {host}:{port} zmienić na odpowiednią dla serwera $ops = array( 'location' => 'http://{host}:{port}eDokumentyApi.php', "uri" => "eDokumentyAPI", 'encoding'=>'UTF-8' ); $client = new EDokApiClient(null, $ops); $client->setUser(EDOK_API_LOGIN); // ten sam co w config.inc $client->setPass(md5(EDOK_API_PASSWORD)); // to samo co w config.inc $header = new SoapHeader('eDokumentyAPI', 'entity_symbol', DEFAULT_ENTITY_SYMBOL); $client->__setSoapHeaders($header); // Tworzy kontakt $contid = NULL; try { $data = array( 'name_1' => 'SOAP TEST'.date('d H:m:s'), 'name_2' => 'SOAPTEST', 'nip___' => 1111111111, 'street' => 'Główna', 'symbol' => 'FGH99' ); $contid = $client->createContact($data); var_dump($contid); } catch(SoapFault $fault) { var_dump($fault); if ($fault->faultcode < 100) { trigger_error("SOAP Fault: (faultcode: {$fault->faultcode}, faultstring: {$fault->faultstring})", E_USER_ERROR); } } // Tworzy sprawę $prc_id = NULL; try { $data = array( 'dscrpt' => 'SOAP TEST '.date('d H:m:s'), 'briefcase_symbol' => 'DK.023', 'orunid' => 49, 'rspoid' => 54, 'fxtrid' => 60, 'prtpid' => 1, ); $prc_id = $client->createProcess($data); var_dump($prc_id); } catch(SoapFault $fault) { var_dump($fault); if ($fault->faultcode < 100) { trigger_error("SOAP Fault: (faultcode: {$fault->faultcode}, faultstring: {$fault->faultstring})", E_USER_ERROR); } } // tworzy dokument w sprawie if ($prc_id) { $doc_id = NULL; try { $data = array( 'dscrpt' => 'SOAP TEST '.date('d H:m:s'), 'prc_id' => $prc_id, 'dctpid' => 1, 'target' => 54, 'from_contact_symbol' => '12345', 'to_contact_symbol' => '54321', ); $doc_id = $client->createDocument($data); var_dump($doc_id); } catch(SoapFault $fault) { var_dump($fault); if ($fault->faultcode < 100) { trigger_error("SOAP Fault: (faultcode: {$fault->faultcode}, faultstring: {$fault->faultstring})", E_USER_ERROR); } } // dodaje załącznik do utworzonego dokumentu // o treści Testowy plik i nazwie dokument.txt if ($doc_id) { try { $filePath = './test.pdf'; $content = base64_encode(file_get_contents(filePath)); $dd = $client->addAttachmentToDocument($content, basename(filePath), $doc_id); var_dump($dd); } catch(SoapFault $fault) { var_dump($fault); if ($fault->faultcode < 100) { trigger_error("SOAP Fault: (faultcode: {$fault->faultcode}, faultstring: {$fault->faultstring})", E_USER_ERROR); } } } } // zwraca dane (tablica) o sprawie wszystko z tabeli processes gdzie prc_id = $prc_id try { $data = $client->getProcess($prc_id); var_dump($data); } catch(SoapFault $fault) { var_dump($fault); if ($fault->faultcode < 100) { trigger_error("SOAP Fault: (faultcode: {$fault->faultcode}, faultstring: {$fault->faultstring})", E_USER_ERROR); } } ?>
W przypadku jeśli chcemy utworzyć własnego klienta SOAP dla innego języka programowania np. JAVA należy skontaktować się z działem oprogramowania celem wyszczególnienia specyfikacji takiego klienta.
Dodatkowo od wersji 3.3 autentykacja nie wymaga nadpisania klienta Soap. Wystarczy do url z adresem serwisu dodać parametry GET w postaci
<?php $ops = array( 'location' => 'http://{host}:{port}eDokumentyApi.php?a1='.EDOK_API_LOGIN.'&a2='.md5(md5(EDOK_API_PASSWORD).'_SOAP_eDok_api').'&a3='.DEFAULT_ENTITY_SYMBOL.'', "uri" => "eDokumentyAPI", 'encoding'=>'UTF-8', ); */ // bezpośrednie wywołanie klienta Soap $client = new SoapClient(NULL, $ops); ?>