Dostęp do informacji z ZUS – wygenerowałem plik .pas i nie wiem co dalej

0

Witam zus udostępnił usługę przez Soap do otrzymywania raportów

wygenerowałem zla.pas poniżej
stworzyłem kod i nie wiem co dalej

procedure TForm1.Button1Click(Sender: TObject);
var WebAPI: wsdlPlatnikRaportyZla_PortType;
  pyt: Pobierzraporty;
  odp: PobierzraportyResponse;
    data: Tdatetime;
    Datasx: TXSDate;


  begin

    WebAPI:= GetwsdlPlatnikRaportyZla_PortType(False,'',nil);
    pyt:= Pobierzraporty.Create;
    odp:= PobierzraportyResponse.Create;
   try

    pyt.login:='login';
    pyt.haslo:='haslo';
    pyt.nip:='nip';
    pyt.dataOd:=// tu data typu TXSDate

   odp:= webapi.pobierzRaporty(pyt);


  finally
     Memo1.Lines.Add(odp.kod+'  '+odp.opis);
     pyt.Free;
     odp.Free;
  end;

proszę o pomoc nie wiem jak zapisać datę w postaci TSXDate

unit zla;

interface

uses Soap.InvokeRegistry, Soap.SOAPHTTPClient, System.Types, Soap.XSBuiltIns;

const
  IS_OPTN = $0001;
  IS_UNBD = $0002;
  IS_NLBL = $0004;
  IS_UNQL = $0008;


type

  // ************************************************************************ //
  // The following types, referred to in the WSDL document are not being represented
  // in this file. They are either aliases[@] of other types represented or were referred
  // to but never[!] declared in the document. The types from the latter category
  // typically map to predefined/known XML or Embarcadero types; however, they could also 
  // indicate incorrect WSDL documents that failed to declare or import a schema type.
  // ************************************************************************ //
  // !:base64Binary    - "http://www.w3.org/2001/XMLSchema"[Gbl]
  // !:date            - "http://www.w3.org/2001/XMLSchema"[Gbl]
  // !:string          - "http://www.w3.org/2001/XMLSchema"[Gbl]

  Raport               = class;                 { "http://zus/zus.channel.platnikRaportyZla:wsdlPlatnikRaportyZla"[GblCplx] }
  PobierzRaportyResponse2 = class;              { "http://zus/zus.channel.platnikRaportyZla:wsdlPlatnikRaportyZla"[Lit][GblCplx] }
  PobierzRaportyResponse = class;               { "http://zus/zus.channel.platnikRaportyZla:wsdlPlatnikRaportyZla"[Lit][GblElm] }
  PobierzRaporty2      = class;                 { "http://zus/zus.channel.platnikRaportyZla:wsdlPlatnikRaportyZla"[Lit][GblCplx] }
  PobierzRaporty       = class;                 { "http://zus/zus.channel.platnikRaportyZla:wsdlPlatnikRaportyZla"[Lit][GblElm] }

  raporty    = array of Raport;                 { "http://zus/zus.channel.platnikRaportyZla:wsdlPlatnikRaportyZla"[GblCplx] }


  // ************************************************************************ //
  // XML       : Raport, global, <complexType>
  // Namespace : http://zus/zus.channel.platnikRaportyZla:wsdlPlatnikRaportyZla
  // ************************************************************************ //
  Raport = class(TRemotable)
  private
    FdataWygenerowania: TXSDate;
    Fzawartosc: TByteDynArray;
  public
    destructor Destroy; override;
  published
    property dataWygenerowania: TXSDate        Index (IS_UNQL) read FdataWygenerowania write FdataWygenerowania;
    property zawartosc:         TByteDynArray  Index (IS_UNQL) read Fzawartosc write Fzawartosc;
  end;



  // ************************************************************************ //
  // XML       : PobierzRaportyResponse, global, <complexType>
  // Namespace : http://zus/zus.channel.platnikRaportyZla:wsdlPlatnikRaportyZla
  // Serializtn: [xoLiteralParam]
  // Info      : Wrapper
  // ************************************************************************ //
  PobierzRaportyResponse2 = class(TRemotable)
  private
    Fkod: string;
    Fopis: string;
    Fraporty: raporty;
    Fraporty_Specified: boolean;
    procedure Setraporty(Index: Integer; const Araporty: raporty);
    function  raporty_Specified(Index: Integer): boolean;
  public
    constructor Create; override;
    destructor Destroy; override;
  published
    property kod:     string   Index (IS_UNQL) read Fkod write Fkod;
    property opis:    string   Index (IS_UNQL) read Fopis write Fopis;
    property raporty: raporty  Index (IS_OPTN or IS_UNQL) read Fraporty write Setraporty stored raporty_Specified;
  end;



  // ************************************************************************ //
  // XML       : PobierzRaportyResponse, global, <element>
  // Namespace : http://zus/zus.channel.platnikRaportyZla:wsdlPlatnikRaportyZla
  // Info      : Wrapper
  // ************************************************************************ //
  PobierzRaportyResponse = class(PobierzRaportyResponse2)
  private
  published
  end;



  // ************************************************************************ //
  // XML       : PobierzRaporty, global, <complexType>
  // Namespace : http://zus/zus.channel.platnikRaportyZla:wsdlPlatnikRaportyZla
  // Serializtn: [xoLiteralParam]
  // Info      : Wrapper
  // ************************************************************************ //
  PobierzRaporty2 = class(TRemotable)
  private
    FdataOd: TXSDate;
    Flogin: string;
    Fhaslo: string;
    Fnip: string;
  public
    constructor Create; override;
    destructor Destroy; override;
  published
    property dataOd: TXSDate  Index (IS_UNQL) read FdataOd write FdataOd;
    property login:  string   Index (IS_UNQL) read Flogin write Flogin;
    property haslo:  string   Index (IS_UNQL) read Fhaslo write Fhaslo;
    property nip:    string   Index (IS_NLBL or IS_UNQL) read Fnip write Fnip;
  end;



  // ************************************************************************ //
  // XML       : PobierzRaporty, global, <element>
  // Namespace : http://zus/zus.channel.platnikRaportyZla:wsdlPlatnikRaportyZla
  // Info      : Wrapper
  // ************************************************************************ //
  PobierzRaporty = class(PobierzRaporty2)
  private
  published
  end;


  // ************************************************************************ //
  // Namespace : http://zus/zus.channel.platnikRaportyZla:wsdlPlatnikRaportyZla
  // soapAction: zus_channel_platnikRaportyZla_wsdlPlatnikRaportyZla_Binder_pobierzRaporty
  // transport : http://schemas.xmlsoap.org/soap/http
  // style     : document
  // use       : literal
  // binding   : zus_channel_platnikRaportyZla_wsdlPlatnikRaportyZla_Binder
  // service   : wsdlPlatnikRaportyZla
  // port      : zus_channel_platnikRaportyZla_wsdlPlatnikRaportyZla_Port
  // URL       : https://193.105.143.40:8500/ws/zus.channel.platnikRaportyZla:wsdlPlatnikRaportyZla/zus_channel_platnikRaportyZla_wsdlPlatnikRaportyZla_Port
  // ************************************************************************ //
  wsdlPlatnikRaportyZla_PortType = interface(IInvokable)
  ['{F5F121D2-9964-4F97-8E11-69C0715B628F}']

    // Cannot unwrap: 
    //     - Input element wrapper name does not match operation's name
    //     - More than one strictly out element was found
    function  pobierzRaporty(const parameters: PobierzRaporty): PobierzRaportyResponse; stdcall;
  end;

function GetwsdlPlatnikRaportyZla_PortType(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): wsdlPlatnikRaportyZla_PortType;


implementation
  uses System.SysUtils;

function GetwsdlPlatnikRaportyZla_PortType(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): wsdlPlatnikRaportyZla_PortType;
const
  defWSDL = 'https://193.105.143.40:8500/ws/zus.channel.platnikRaportyZla:wsdlPlatnikRaportyZla/zus_channel_platnikRaportyZla_wsdlPlatnikRaportyZla_Port';
  defURL  = 'https://193.105.143.40:8500/ws/zus.channel.platnikRaportyZla:wsdlPlatnikRaportyZla/zus_channel_platnikRaportyZla_wsdlPlatnikRaportyZla_Port';
  defSvc  = 'wsdlPlatnikRaportyZla';
  defPrt  = 'zus_channel_platnikRaportyZla_wsdlPlatnikRaportyZla_Port';
var
  RIO: THTTPRIO;
begin
  Result := nil;
  if (Addr = '') then
  begin
    if UseWSDL then
      Addr := defWSDL
    else
      Addr := defURL;
  end;
  if HTTPRIO = nil then
    RIO := THTTPRIO.Create(nil)
  else
    RIO := HTTPRIO;
  try
    Result := (RIO as wsdlPlatnikRaportyZla_PortType);
    if UseWSDL then
    begin
      RIO.WSDLLocation := Addr;
      RIO.Service := defSvc;
      RIO.Port := defPrt;
    end else
      RIO.URL := Addr;
  finally
    if (Result = nil) and (HTTPRIO = nil) then
      RIO.Free;
  end;
end;


destructor Raport.Destroy;
begin
  System.SysUtils.FreeAndNil(FdataWygenerowania);
  inherited Destroy;
end;

constructor PobierzRaportyResponse2.Create;
begin
  inherited Create;
  FSerializationOptions := [xoLiteralParam];
end;

destructor PobierzRaportyResponse2.Destroy;
var
  I: Integer;
begin
  for I := 0 to System.Length(Fraporty)-1 do
    System.SysUtils.FreeAndNil(Fraporty[I]);
  System.SetLength(Fraporty, 0);
  inherited Destroy;
end;

procedure PobierzRaportyResponse2.Setraporty(Index: Integer; const Araporty: raporty);
begin
  Fraporty := Araporty;
  Fraporty_Specified := True;
end;

function PobierzRaportyResponse2.raporty_Specified(Index: Integer): boolean;
begin
  Result := Fraporty_Specified;
end;

constructor PobierzRaporty2.Create;
begin
  inherited Create;
  FSerializationOptions := [xoLiteralParam];
end;

destructor PobierzRaporty2.Destroy;
begin
  System.SysUtils.FreeAndNil(FdataOd);
  inherited Destroy;
end;

initialization
  { wsdlPlatnikRaportyZla_PortType }
  InvRegistry.RegisterInterface(TypeInfo(wsdlPlatnikRaportyZla_PortType), 'http://zus/zus.channel.platnikRaportyZla:wsdlPlatnikRaportyZla', 'ISO-8859-1');
  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(wsdlPlatnikRaportyZla_PortType), 'zus_channel_platnikRaportyZla_wsdlPlatnikRaportyZla_Binder_pobierzRaporty');
  InvRegistry.RegisterInvokeOptions(TypeInfo(wsdlPlatnikRaportyZla_PortType), ioDocument);
  InvRegistry.RegisterInvokeOptions(TypeInfo(wsdlPlatnikRaportyZla_PortType), ioLiteral);
  RemClassRegistry.RegisterXSInfo(TypeInfo(raporty), 'http://zus/zus.channel.platnikRaportyZla:wsdlPlatnikRaportyZla', 'raporty');
  RemClassRegistry.RegisterXSClass(Raport, 'http://zus/zus.channel.platnikRaportyZla:wsdlPlatnikRaportyZla', 'Raport');
  RemClassRegistry.RegisterXSClass(PobierzRaportyResponse2, 'http://zus/zus.channel.platnikRaportyZla:wsdlPlatnikRaportyZla', 'PobierzRaportyResponse2', 'PobierzRaportyResponse');
  RemClassRegistry.RegisterExternalPropName(TypeInfo(PobierzRaportyResponse2), 'raporty', '[ArrayItemName="raport"]');
  RemClassRegistry.RegisterSerializeOptions(PobierzRaportyResponse2, [xoLiteralParam]);
  RemClassRegistry.RegisterXSClass(PobierzRaportyResponse, 'http://zus/zus.channel.platnikRaportyZla:wsdlPlatnikRaportyZla', 'PobierzRaportyResponse');
  RemClassRegistry.RegisterXSClass(PobierzRaporty2, 'http://zus/zus.channel.platnikRaportyZla:wsdlPlatnikRaportyZla', 'PobierzRaporty2', 'PobierzRaporty');
  RemClassRegistry.RegisterSerializeOptions(PobierzRaporty2, [xoLiteralParam]);
  RemClassRegistry.RegisterXSClass(PobierzRaporty, 'http://zus/zus.channel.platnikRaportyZla:wsdlPlatnikRaportyZla', 'PobierzRaporty');

end.
0
pyt.dataOd.asdate:=AnyDate;
0

wpisuje:

pyt.dataOd.asdate:=strtodate('10.10.2018');

i wywala błąd:

is not s valid date
0

Tego tez probowałem

0

@Paweł Piasecki:
Jaki błąd ???

spróbuj tak

pyt.dataOd.asdate:=encodedate(2018,10,18);

tu masz fragment helpa, możesz wrost użyc property month, day, year oraz asdate

XSBuiltIns.TXSDate PropertiesFrom MediaWiki
Delphi Information
property Month: Word read GetMonth write SetMonth; Indicates the month of the year that the object represents. 
 
property Day: Word read GetDay write SetDay; Indicates the Day of the month that the object represents. 
 
property Year: Integer read GetYear write SetYear; Indicates the year that the object represents. 
 
property AsDate: TDateTime read GetAsDate write SetAsDate; Represents the object's value as a TDateTime value. 
0

Dzięki próbowałem i podczas kompilacji dostaje:

acces violation at address 00649810 in module . read of addsress 0000000C

przeskakuje do modułu Soap.XSBuiltIns; na pozycję

procedure TXSDate.SetAsDate(const Value: TDateTime);
var
  ADate: TXSBaseDate;
begin
  ADate := GetBaseDate(FDateValue);  // tu wywala ??????????
  try
    ADate.AsDate := Value;
    FDateValue := ADate.NativeToXS;
  finally
    ADate.Free;
  end;
end;
2
    pyt.dataOd := TXSDate.Create;
    pyt.dataOd.AsDate:=encodedate(2018,10,18);
0

przeszło bez błędów serdeczne dzięki

0

Witajcie ponownie mam kolejny problem
wysyłam pyt nie zwraca odpowiedzi zamiast tego pokazuje windowsoskie okno logowania na serwer
z prośbą o podanie loginu i hasła co wypełnienie nie skutkuje na odpowiedz

procedure TForm1.Button1Click(Sender: TObject);
var WebAPI: wsdlPlatnikRaportyZla_PortType;
  pyt: Pobierzraporty;
  odp: PobierzraportyResponse;
    data: Tdatetime;
    Datasx: TXSDate;
 
  begin
 
    WebAPI:= GetwsdlPlatnikRaportyZla_PortType(False,'',nil);
    pyt:= Pobierzraporty.Create;
    odp:= PobierzraportyResponse.Create;
   try
 
    pyt.login:='login';
    pyt.haslo:='haslo';
    pyt.nip:='nip';
    pyt.dataOd:=TXSDate.Create;
    pyt.dataOd:=encodedate(2018,10,10); 
   odp:= webapi.pobierzRaporty(pyt);     // tu nie zwraca odpowiedzi

  finally
     Memo1.Lines.Add(odp.kod+'  '+odp.opis);
     pyt.Free;
     odp.Free;
  end;
0

A na pewno podajesz dobre dane?

Login – ustawiony wewnątrz PUE, wzakładce zaświadczeń lekarskich –nie jest to login do PUE, lecz login dedykowany do połączenia z usługą,
2.
Hasło do usługi –hasło ustalone w zakładce zaświadczeń lekarskich, dedykowane do połączenia z usługą

Edit: to raczej nie to bo i tak powinieneś dostać odpowiedź, że nieprawidłowe dane.

0

Tak tak napisali bip.zus.pl zakładka inne
ustawiłem w zus.pl login i haslo dotyczące tylko ZLA

0

W dokumentacji nie ma czegoś o autoryzacji? Nie musi być wysłany oprócz loginu i hasła jakiś token czy inne nagłowki?

0

Prócz loginu hasła nip oraz daty raportu wysyłanych w tym samym czasie nic innego nie ma w odpowiedzi powinien byc raport lub błędny nip login hasło

0

właśnie sróbowałem jeszcze raz uruchomić program i zadziałał coś musieli zrobić po stronie zus bo działa bez poprawki
temat zamknięty na razie dzięki pozdrawiam

0

witam ponownie mam "odpowiedz" z soap typu TByteDynArray jak w delphi 10.2 dekodować base64 do postaci
którą później muszę zapisać jako plik zip. Proszę o pomoc bo szukam i nic .

1

Możesz zdekodować tabicę TByteDynArrayzawierającą dane zakodowane Base64 do TMemoryStream

  //uses System.NetEncoding
  //resultBytes TByteDynArray
  outMS:= TMemoryStream.Create;
  try
    inMs:= TMemoryStream.Create;
    try
      inMS.Write(resultBytes[0], Length(resultBytes));
      inMS.Position:= 0;
      TNetEncoding.Base64.Decode(inMS, outMS);
      outMS.Position:= 0;
    finally
      inMs.Free;
    end;
    //tu cos robisz z wyjściowym MemoryStream  (na przyklad ZIPujesz)
  finally
    outMS.Free;
  end;
0

czy zapis outMS.SaveToFile('c:\plik.zip'); będzie prawidłowy , czy zastosować np zipforge do zapisu do zipa
//nadmieniam, że informacja wejściowa inMS to plik zip zaszyfrowany w base64 typu TByteDynArray//
potrzebuje uzyskać na wyjściu plik zip. Po utworzeniu tego pliku winrar wywala błąd że niewłaściwy format

0

Na pewno to plik.zip ?
Czy tylko zakodowane base64 a następnie skompresowane Zip dane? (same dane są pozbawione nagłówków dlatego WinRAR ani żaden inny program obsługujący archiwa ZIP ich nie otworzy)
A może jeszcze inaczej wcześniej skompresowane a później zakodowane base64?
To wszystko robi różnicę.
Gdzie jakaś dokumentacja do tego?

0

Na stronie bip.zus.pl zakładka inne dotyczy raportów ZLA
Pobrany raport to plik skompresowany zipem z hasłem
nazywa się raport.zip wewnątrz raport.xml oraz ZLA.xml

0

Czyli z tego wynika że raport jest plikiem zip zakodowanym w base64 wiec tak jak pisałem wcześniej trzeba zdekodować base64 oczywiście nie wszystko co zwraca serwer tylko to w sekcji raport co jest zwróconym plikiem i już powinieneś mieć zahasłowany plik ZIP. Nie próbowałeś dedkodować przypadkiem wszystkiego co zwraca serwer, bo jeżeli tylko te dane to powinno być ok.

0

właśnie tak robię i pytałem czy zapis outMS.SaveToFile('c:\plik.zip'); będzie prawidłowy , bo później tego pliku zip nie otwiera wywala błąd że nie jest to struktura zip


  odp:= webapi.pobierzRaporty(pyt);
     data:=odp.raporty[0].dataWygenerowania; // data wygenerowania raportu
     resultbytes:=odp.raporty[0].zawartosc;  // zawartość raportu

     dataraportu:=datetostr(data.AsDate);

     outMS:= TMemoryStream.Create;

  try
    inMs:= TMemoryStream.Create;

    try
      inms.Write(resultBytes[0], Length(resultBytes));
      inMS.Position:= 0;
      TNetEncoding.Base64.Decode(inMS, outMS);
      outMS.Position:= 0;
    finally
      inMs.Free;
    end;
    //tu cos robisz z wyjściowym MemoryStream  (na przyklad ZIPujesz)
     outMS.SaveToFile('k:\raport.zip');

  finally
    outMS.Free;
    plik.Free;
  end;
0

Teoretycznie powinien być prawidłowy podglądnij go w jakimś hexedytorze plik ZIP powinien zaczynać się od PK.

0

Wszystko działa coś mnie tknęło i zapisałem raport pobrany nie rozszyfrowany ,dziady z zus nie zaszyfrowali zipa w base64, więc . Raport pobrany trzeba zapisać od razu do zipa i jest ok.

temat zamknięty dzięki wszystkim.

0

Proponuję w wygenerowanym pliku do SOAP dodać coś takiego:

  RIO.HTTPWebNode.Password := 'b2b_platnik_raporty_zla';
  RIO.HTTPWebNode.UserName := 'b2b_platnik_raporty_zla';

	try
	  Result := (RIO as wsdlPlatnikRaportyZla_PortType);

ponieważ bramka wymaga autoryzacji.

A dwa... mam problem takiej natury, że pobiera mi raport, a za nic nie mogę się do niego dobrać.
W sensie:

for Raport in GetRapResponse.raporty do
   begin
     Memo1.Lines.Add('Raport: '+FormatDateTime('yyyy-mm-dd hh:nn:ss',Raport.dataWygenerowania.AsDate));
   end;

Nie robi nic, ale jeśli dam breakpointa na for, to Raport pokazuje że property ma wypełnione :(
Próba odwołania jak u Ciebie:

data:=odp.raporty[0].dataWygenerowania; // data wygenerowania raportu
     resultbytes:=odp.raporty[0].zawartosc; 

lub:

   Memo1.Lines.Add('data '+DateToStr(GetRapResponse.raporty[0].dataWygenerowania.AsDate));

To exception z marszu. I o co tu chodzi?

var
 PUE :wsdlPlatnikRaportyZla_PortType;
 GetRap : esDocZusPueGateService.PobierzRaporty;
 Raport : esDocZusPueGateService.Raport;
 GetRapResponse : esDocZusPueGateService.PobierzRaportyResponse;
begin

 PUE := GetwsdlPlatnikRaportyZla_PortType;
 GetRap := PobierzRaporty.Create;
 try
//   DataOd := TXSDate.Create;
//   DataOd.AsDate := Now;
   GetRap.dataOd.AsDate := Now; //<-create dodałem do konstruktora klasy
   GetRap.login :='';
   Getrap.haslo :='';
   Getrap.nip := '';
   GetRapResponse := PUE.pobierzRaporty(GetRap);
 
   Memo1.Lines.Add('kod: '+GetRapResponse.kod);
   Memo1.Lines.Add('Opis: '+GetRapResponse.opis);

// to zwraca 0
   Memo1.Lines.Add('Raportów '+IntToStr(Length(GetRapResponse.raporty)));

// i tu już pozamiatane 
  Memo1.Lines.Add('data '+DateToStr(GetRapResponse.raporty[0].dataWygenerowania.AsDate));
finally
 GetRap.Free;
end;
end.
0

Eh, kurka, nie ta data :)
Wszystko ok.

0

Panowie, zapytam z innej beczki, próbowaliście może e-zwolnień ?
nie mogę odpalić pobierzOswiadczenie....

0

Witajcie, Również walczę z pobieraniem danych eZLA przez web service. Niby wszystko działa, ale pojawia się problem gdy pobieram więcej niż jeden raport. Wtedy kilka razy pobiera ten sam raport. Spotkaliście się z czymś takim??

Pozdrawiam
Grzesiek

0

Może pobiera z cache? Spróbuj dodać nagłówek Cache-Control: No-Cache albo nawet Cache-Control: No-Store.

0
kAzek napisał(a):

Może pobiera z cache? Spróbuj dodać nagłówek Cache-Control: No-Cache albo nawet Cache-Control: No-Store.

Mógłbyś podpowiedzieć jak dodać nagłówek? Jestem świeży z SOAP i nie mogę się doszukać...

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