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
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
* @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); } } ?>
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.