Integracja z systemem zleceń na zaopatrzenie w wyroby medyczne

0

Cześć,
Czy jest tu ktoś, komu udało się dokonać integracji z systemem NFZ do zleceń na zaopatrzenie w wyroby medyczne i wykonać na nim z sukcesem metodę "putDocument"? Niestety mi za każdym razem zwraca "91011 - Błąd walidacji ze schemą", mail ezpo nie odpowiada i nie mam pomysłu do kogo się zwrócić po pomoc ani co jeszcze spróbować przestawić w kodzie. Przykładowa przechodząca koperta soap to już w ogóle byłaby super.

1

Też mam ten błąd.
Udało się rozwiązać problem tego błędu?
Mój plik wygląda tak:


<dokument-zpo
	xmlns="https://ezwm.nfz.gov.pl/xml/e-zpo/dok-zlecenia/v2.1" typ-nad="S" ow-nad="01" id-nad="123456789" id-inst-nad="IRIS3_2_3" id-tech-dokumentu="IRIS0000001" nr-wersji="1" data-gen="2020-02-03 14:15:59">
	<zlecenie>
		<miejsce-wystawienia-zlecenia nazwa="medi sp. z o.o." regon="12345678901234">
			<swd ow-nfz="01" kod-swd="1234567890"></swd>
			<adres kod-poczt="50-502" miejscowosc="Wrocław" ulica="Hubska" nr-domu="11" nr-lokalu="1" kod-kraju="PL"></adres>
		</miejsce-wystawienia-zlecenia>
		<pacjent typ-id-osoby="P" plec="2" id-osoby="22222222222" nazwisko="Kasina" imie="Anna"></pacjent>
		<okreslenie-wyrob-med>
			<okulary odleglosc-zrenic="83">
				<soczewka rodzaj="B" oko="L" pryzma:="1" sfera:="1" cylinder:="10" os:="100"></soczewka>
				<soczewka rodzaj="B" oko="P" pryzma:="1" sfera:="10" cylinder:="12" os:="90"></soczewka>
			</okulary>
		</okreslenie-wyrob-med>
		<dane-dt-wystawienia data-wystawienia="2020-02-03">
			<osoba-uprawniona typ-pers-zlec="11" id-zlec="123456789" nazwisko="Lecznica" imie="Danuta"></osoba-uprawniona>
		</dane-dt-wystawienia>
	</zlecenie>
</dokument-zpo>

0

Nie, pisałam do [email protected] i na razie czekam na odpowiedź (przez telefon wyrazili chęć pomocy). Jak wspomniałam, wcześniej pisałam wielokrotnie do ezpo, ale odpowiedzieli tylko raz w październiku. Wskazali wtedy dwa problemy które miałam ze swoim zleceniem: że data-gen powinna być w formacie data-gen="2019-09-25T1400 i że <kobieta-w-ciazy /> samym pojawieniem się informuje że kobieta jest w ciąży. Dostosowanie się do ich uwag nic nie zmieniło.

1

Obiecałem sobie, że jak mi się uda to udostępnię prawidłową odpowiedź dla potomnych :)
Ze względu na dane wrażliwe zmieniłem lekko request, ale w razie pytań chętnie pomogę :)

<ns2:dokument-zpo xmlns:ns2="https://ezwm.nfz.gov.pl/xml/e-zpo/dok-zlecenia/v2.1" xmlns:ns3="http://www.w3.org/2000/09/xmldsig#" typ-nad="S" ow-nad="07" id-nad="11111111" id-inst-nad="11111111-00001" id-tech-dokumentu="PM185797" nr-wersji="1" data-gen="2020-05-29T11:19:49">
    <ns2:zlecenie>
        <ns2:miejsce-wystawienia-zlecenia nazwa="Przychodnia" regon="123456789">
            <ns2:swd ow-nfz="07" kod-swd="11111111"/>
            <ns2:adres kod-poczt="11-111" miejscowosc="test" ulica="testowa" nr-domu="70"/>
        </ns2:miejsce-wystawienia-zlecenia>
        <ns2:pacjent typ-id-osoby="P" id-osoby="12345678901" nazwisko="TEST" imie="TEST"/>
        <ns2:okreslenie-wyrob-med>
            <ns2:okulary>
                <ns2:soczewka rodzaj="D" oko="P" sfera="-1.00" cylinder="-1.00" os="1" pryzma="0.75"/>
            </ns2:okulary>
        </ns2:okreslenie-wyrob-med>
        <ns2:dane-dt-wystawienia data-wystawienia="2020-05-29">
            <ns2:osoba-uprawniona typ-pers-zlec="11" id-zlec="1234567" nazwisko="LEKARZ" imie="KASIA"/>
        </ns2:dane-dt-wystawienia>
    </ns2:zlecenie>
</ns2:dokument-zpo>
0

okazało się że miałam złe kodowanie przesyłanego pliku -- powinno być utf8, nfz wspominał o tym chyba niedawno w jakimś powiadomieniu

0

Eh ten nfz i ich komunikaty :). Przy okazji masz może u siebie funkcjonalność pobierania PDF zrobioną? Komunikacja u mnie śmiga, ale za nic nie mogę poprawnie odkodować pliku :/

0

Niestety, zawsze miałam przekłamania na kilku bajtach więc po prostu zapisuję na dysku całego zipa -- windows umie go rozpakować. Jeszcze nie kazali mi tego zmienić.

0

No nic, powalczę :). Dla pewności zapytam. Ten zakodowany plik Base64 co jest w response to już domyślnie jest w formacie .zip?

0

Tak, ta byte[] co się ją dostaje w Streamloadzie to plik zip.

0

Super, dzięki wielkie za podpowiedź :)

0

Witam
Piszę w c# (winforms) integrację z powyższym systemem. Logowanie działa ale mam problem z wysyłaniem zlecenia. Dla uproszczenia wysyłam zlecenie testowe z tego wątku ale za każdym razem dostaję informacje Brak danych wejściowych. Czy ktoś może spotkał się z takim problemem? Niżej przesyłam fragment metody którą wysyłam zlecenie. Z góry dziękuję za wszelkie wskazówki.

private void Wysylanie()
        {            
            ServiceRequest serviceReq = new ServiceRequest();
            serviceReq.location = new EzwmWSB.ServiceLocation();
            serviceReq.location.@namespace = "www.nfz.gov.pl/ws/broker/nfz/e-zpo/zlecenie";
            serviceReq.location.localname = "putDocument";
            serviceReq.location.version = "2.1";
            XmlDocument doc = new XmlDocument();

            EndpointAddress endpointAddress = new EndpointAddress("https://test-ezwm.nfz.gov.pl/ws-broker-server-ezlec/services/ServiceBroker");
            serviceBinding.ReceiveTimeout = new TimeSpan(0, 0, 240);

            string Xml = "<ezwm:dokument-zpo xmlns:ezwm=\"https://ezwm.nfz.gov.pl/xml/e-zpo/dok-zlecenia/v2.1\" typ-nad=\"S\" ow-nad=\"14\" id-nad=\"11111111\" id-inst-nad=\"11111111-00001\" id-tech-dokumentu=\"123\" nr-wersji=\"1\" data-gen=\"2020-12-02Y11:11:11\">" +
                            "<ezwm:zlecenie>" +
                                "<ezwm:miejsce-wystawienia-zlecenia nazwa=\"przych\" regon=\"5345234861\">" +
                                    "<ezwm:swd ow-nfz=\"10\" kod-swd=\"11111111\"/>" +
                                    "<ezwm:adres kod-poczt=\"11-400\" miejscowosc=\"Kraków\" ulica=\"Ulica\" nr-domu=\"1\"/>" +
                                "</ezwm:miejsce-wystawienia-zlecenia>" +
                                "<ezwm:pacjent typ-id-osoby=\"P\" id-osoby=\"12345678901\" nazwisko=\"Jan\" imie=\"KOWALSKI\"/>" +
                                "<ezwm:okreslenie-wyrob-med>" +
                                    "<ezwm:okulary>" +
                                        "<ezwm:soczewka rodzaj=\"D\" oko=\"P\" sfera=\"-1.00\" cylinder=\"-1.00\" os=\"1\" pryzma=\"0.75\"/>" +
                                    "</ezwm:okulary>" +
                                "</ezwm:okreslenie-wyrob-med>" +
                                "<ezwm:dane-dt-wystawienia data-wystawienia=\"" + DateTime.Now.ToShortDateString() + "\">" +
                                    "<ezwm:osoba-uprawniona typ-pers-zlec=\"11\" id-zlec=\"1234\" nazwisko=\"Nowak\" imie=\"Barbara\"/>" +
                                "</ezwm:dane-dt-wystawienia>" +
                            "</ezwm:zlecenie>" +
                        "</ezwm:dokument-zpo>";

            doc.LoadXml(Xml);

            serviceReq.payload = new Payload();
            serviceReq.payload.textload = doc.DocumentElement;

            EzwmWSB.session sesja = new EzwmWSB.session();
            sesja.id = m_Sesja.id;

            EzwmWSB.authToken token = new EzwmWSB.authToken();
            token.id = m_AuthTok.id;

            serviceReq.date = DateTime.Now;

            ServiceBrokerClient servBrokCli = new ServiceBrokerClient(serviceBinding, endpointAddress);

            ServiceResponse servResp = null;

            try
            {
                servResp = servBrokCli.executeService(sesja, token, serviceReq);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
                return;
            }


            XmlDocument respXml = new XmlDocument();
            respXml.LoadXml(servResp.payload.textload.OuterXml);      
            ....
        }
0

Z tego co widzę, w ramach payload ustawiasz tylko textload, i to na wartość która powinna być przesyłana w streamloadzie. Należy ustawiać i textload, i streamload.
Przykładowy textload:

<komunikat xmlns="https://ezwm.nfz.gov.pl/ws/broker/nfz/xml/e-zpo/document/v2.1" nazwa-sys="MOJA NAZWA" tryb-przeslania="1" typ="https://ezwm.nfz.gov.pl/xml/e-zpo/dok-anulowania-zlec/v2.1" wersja-sys="2.1.4"/>

Przykładowy streamload został już wcześniej podany, z tym że trzeba go jeszcze zzipować (w kodowaniu UTF-8) i zrobić z niego tablicę bajtów.

0

Dzięki za konkretną odpowiedź. Pytanie odnośnie tego zip - mam zzipować stringa czy może wygenerować plik xml i potem go spakować?
P.S. Pozwolę sobie zadać jeszcze kilka pytań -

  1. Czy czy treść textload zawiera się w streamload? Np. jako nadrzędny element czy może textload i streamload ma wyglądać "dokładnie" jak ten pokazane w tym temacie? Dokładnie tzn. te same atrybuty z innymi zmiennymi w zależności czy wysyłam zlecenie czy anulowanie itd.
  2. Proporties "stream" obiektu payload jest typu PayloadStreamload. Ten z kolei ma dwa properties "name" w co nie wiem co mam wpisać i proporties "stream" typu "base64Binary" którego z kolei proprties Value typu bite[] gdzie podaję ową tablicę bajtów. Czy dobrze rozumiem?
  3. Czy tylko mi się wydaję że dokumentacja całej integracji jest raczej skąpa, ogólnikowa?
1

Uwaga, poniższe odpowiedzi to tylko moje opinie / "u mnie tak działa"; nie jest wykluczone że może działać też inaczej.

  1. Zajrzyj do schem .xsd -- nie wiem jak w c#, ale w javie można sobie z nich wygenerować klasy (dzięki czemu łatwo wypełniać obiekty zlecenia), a po zmarshallowaniu do stringa można sprawdzić ich zgodność ze schemą (dzięki czemu od razu wiesz jeśli czegoś nie wypełniłeś). Jestem przekonana że podobne pomocne mechanizmy istnieją w innych popularnych językach.
    Textload i streamload są równorzędne, elementem nadrzędnym do nich jest payload.
  2. W "name" dajesz nazwę przesyłanego pliku zlecenia. W przesyłanym archiwum zip (teoretycznie) może być wiele plików, więc w ten sposób wskazujesz o który chodzi.
  3. Tzn jeśli weźmie się pod uwagę te wszystkie pliki .xsd to nie jest taka znów ogólnikowa. "Technicznie" wiadomo jakie mają być pola, jakiego typu i które są kiedy obowiązkowe. Natomiast brakuje czasem wyjaśnienia co one właściwie znaczą, skąd wziąć słowniki dla tych wszystkich kodów i skąd brać nazwy / identyfikatory systemu. Placówka medyczna nie zawsze pomoże.
1

Nie wiem o co chodzi w pierwszym pytaniu, więc odpowiem przez przykład.
W javie tworzenie streamloada moze wyglądać mniej więcej tak (gdzie xmlDokument to taki xml co został już podany):

	Streamload streamloadZpoDoc(String xmlDokument)
	{
		Streamload streamload = new Streamload();
		final String fileName = "zlecenie.xml";
		streamload.setName(fileName);
		Base64Binary value = new Base64Binary();
		value.setValue(zipString(xmlDokument, fileName));
		streamload.setStream(value);
		return streamload;
	}
	
	byte[] zipString(String entry, String entryName)
	{
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		try (ZipOutputStream zipOut = new ZipOutputStream(baos, StandardCharsets.UTF_8))
		{
			ZipEntry ze = new ZipEntry(entryName);
			zipOut.putNextEntry(ze);
			zipOut.write(entry.getBytes(StandardCharsets.UTF_8));
			zipOut.closeEntry();
		}
		return baos.toByteArray();
	}
0

@cas__:

  1. rzeczywisty kod generujacy klasy C# pliku JPK MAG. Generalnie narzędzie nie pobiera schem po http, trzeba je ręcznie ściągnąć. Widoczne xsd to materialne pliki leżące w tym samym katalogu.
xsd /c /namespace:moje.swojskie.generated ElementarneTypyDanych_v4-0E.xsd KodyKrajow_v4-1E.xsd KodyUrzedowSkarbowych_v4-0E.xsd Schemat_JPK_MAG(1)_v1-0.xsd StrukturyDanych_v4-0E.xsd KodyCechKrajow_v3-0E.xsd Schemat_JPK_KR1_v1-0.xsd
  1. Schemy rodziny JPK nie mają problemu ze słownikami. Nie jestem wyjadaczem, wiem o nich tyle, ile muszę, ale jest dobrze (rządowy soft w pionie skarbowym w mojej opinii zwykle jest lepszej jakości 3) niż społecznym czy pożal się boże sądowym).
    Czyli się da zrobić 100% ścisłą schemę XML, tylko czasem ktoś odpuszcza / polegnie.
  1. choć zwolnienie podatkowe 26 latków zj...li już w samych koncepcjach, były wielokrotnie "patchowane" aby choć trochę były kompatybilne z realiami.
0

@AnyKtokolwiek:
3. W tym przypadku słowników nie dostajemy w schemie (niektóre enumy tak), tylko są do pobrania z różnych stron NFZ, czasem trochę "ukrytych" (i zmieniają się cyklicznie).

0

Ponownie dziękuję za odzew. @cas__ Dzięki za przykład. Muszę jeszcze jednak z tym powalczyć. Nie jestem pewien czy dobrze tworzę tego zipa z tych danych. Czy wystarczy jak zippuję tego string (co np. mam w swoim kodzie z zleceniem) i zamienie na byte array?

1 użytkowników online, w tym zalogowanych: 0, gości: 1