Autor Téma: Registr plátců DPH přes SOAP  (Přečteno 13089 krát)

Offline perverez

  • Nováček
  • *
  • Příspěvků: 21
  • Karma: 3
Re:Registr plátců DPH přes SOAP
« Odpověď #15 kdy: 06-04-2013, 20:17:38 »
Ahoj, stejný problém jsem měl také pod RAD 2007. Celý den jsem to hledal a nakonec jsem zjistil následující chybu, kterou vyprodukoval SOAP, který je součástí RAD 2007:

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Body>
    <SOAP-ENV:StatusNespolehlivyPlatceRequest>
      <dic>12345678</dic>
    </SOAP-ENV:StatusNespolehlivyPlatceRequest>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>


Chyba je v tom, že StatusNespolehlivyPlatceRequest je uveden včetně NameSpace. Přišel jsem na to až když jsem porovnával požadovaný XML s vygerovaným XML v události OnBeforeExecute. Řešením je použití novější verze SOAP, kde je uvedený problém vyřešen (např. https://forums.embarcadero.com/message.jspa?messageID=290788).
« Poslední změna: 06-04-2013, 20:19:16 od perverez »

Offline zdenek

  • Plnoletý
  • ***
  • Příspěvků: 139
  • Karma: 8
Re:Registr plátců DPH přes SOAP
« Odpověď #16 kdy: 06-04-2013, 22:40:09 »
Ano to je jedna z chyb. U D2006 to dokonce udělá i u elementu "dic". Ale ani odstraneni v before execute nepomohlo:

Kód: Delphi [Vybrat]
  1. procedure TForm55.HTTPRIO1BeforeExecute(const MethodName: string; var SOAPRequest: WideString);
  2. begin
  3.   SOAPRequest:=StringReplace(SOAPRequest,'SOAP-ENV:dic','dic',[rfReplaceAll]);
  4.   SOAPRequest:=StringReplace(SOAPRequest,'/SOAP-ENV:StatusNespolehlivyPlatceRequest','/StatusNespolehlivyPlatceRequest',[rfReplaceAll]);
  5.   SOAPRequest:=StringReplace(SOAPRequest,'SOAP-ENV:StatusNespolehlivyPlatceRequest','StatusNespolehlivyPlatceRequest xmlns="http://adis.mfcr.cz/rozhraniCRPDPH/"',[rfReplaceAll]);
  6. end;
  7.  

XE2 už jsou ok. Ale v D2006 asi bude ještě moucha někde dále.

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 815
  • Karma: 59
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:Registr plátců DPH přes SOAP
« Odpověď #17 kdy: 08-05-2013, 10:51:16 »
Tak teď jsem to zkoušel v Delphi XE2 i XE4 podle tohoto návodu http://www.drbob42.com/examines/examinE2.htm a ani mi to nevytvořilo unitu.

Chyba: Unable to load WSDL File/Location: http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl.  Error [Der angeforderte Header wurde nicht gefunden. - URL:http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl - SOAPAction:""].

Ale autor to očividně bez problémů rozběhal, nezkoušeli jste to taky někdo?
Embarcadero Technology Partner

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 815
  • Karma: 59
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:Registr plátců DPH přes SOAP
« Odpověď #18 kdy: 08-05-2013, 11:11:49 »
Nebudu si zbytečně ztěžovat život a SOAP řešit manuálně, našel jsem toto rozhraní (neoficiální), ale zdá se, že funguje: http://isvat.appspot.com/.
Embarcadero Technology Partner

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3178
  • Karma: 137
    • Verze Delphi: D2007, XE3, DX10
Re:Registr plátců DPH přes SOAP
« Odpověď #19 kdy: 08-05-2013, 11:28:40 »
Chyba: Unable to load WSDL File/Location: http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl.  Error [Der angeforderte Header wurde nicht gefunden. - URL:http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl - SOAPAction:""].
Pricina mi neni jasna - vypada to, ze importer nezere URL, ale kdyz si target ulozis na disk a naimportujes ho ze souboru, tak to funguje. Nejsi sam, komu to neslo: http://stackoverflow.com/questions/14177991/unable-to-load-wsdl-file-location-in-delphi-for-vies-soap-service

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 815
  • Karma: 59
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:Registr plátců DPH přes SOAP
« Odpověď #20 kdy: 08-05-2013, 11:40:33 »
Díky, funguje, nějak mně tuto odpověď Google nenabídl...
Embarcadero Technology Partner

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3178
  • Karma: 137
    • Verze Delphi: D2007, XE3, DX10
Re:Registr plátců DPH přes SOAP
« Odpověď #21 kdy: 08-05-2013, 11:47:32 »
Díky, funguje, nějak mně tuto odpověď Google nenabídl...
Zrejme proto, ze jsem hledal text anglickeho chyboveho hlaseni...

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 815
  • Karma: 59
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:Registr plátců DPH přes SOAP
« Odpověď #22 kdy: 08-05-2013, 12:35:18 »
Však já to taky tak nějak anglicky hledal, ale občas má člověk temno před očima...
« Poslední změna: 08-05-2013, 12:50:37 od oxo »
Embarcadero Technology Partner

Offline JanSustr

  • Nováček
  • *
  • Příspěvků: 2
  • Karma: 0
    • Verze Delphi: XE10
Re:Registr plátců DPH přes SOAP
« Odpověď #23 kdy: 24-03-2021, 19:28:41 »
Dobrý den,

vygeneroval jsem objekt rozhraniCRPDPH pomocí "automatu"
a po nějaké době jsem opravil:

  //RemClassRegistry.RegisterXSInfo(TypeInfo(DICType), 'http://adis.mfcr.cz/rozhraniCRPDPH/', 'DICType');

  RemClassRegistry.RegisterXSInfo(TypeInfo(DICType), 'http://adis.mfcr.cz/rozhraniCRPDPH/', 'dic');

(jde o to dic)

a pak to začlo běhat.
Delphi 10.1 Berlín

Takže mají chybu v to wsdl-ku.

Ahoj.

Offline JanSustr

  • Nováček
  • *
  • Příspěvků: 2
  • Karma: 0
    • Verze Delphi: XE10
Re:Registr plátců DPH přes SOAP
« Odpověď #24 kdy: 24-03-2021, 19:30:31 »
ještě....
použil jsem wireshark, abych víděl co se posílá

Offline Jan Fiala

  • Plnoletý
  • ***
  • Příspěvků: 183
  • Karma: 2
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Registr plátců DPH přes SOAP
« Odpověď #25 kdy: 25-03-2021, 19:25:52 »
S rejstrikem platcu pres SOAP fungujeme, delal jsem to kdysi. V priloze je funkcni naimportovane WSDL pro Delphi 7. Takze v novejsich by to melo fungovat taky.
Pouzivame to hromadne - necham si vratit seznam nespolehlivych platcu, ten pak rozparsuju pomoci JanXMLTree a hromadne projdu podle DIC s adresarem. Tam poznamenam datum registrace, kdy byl registrovany jako nespolehlivy platce, pripadne ty, kteri ze seznamu zmizi v adresari uvolnim. je to samostatny EXE, ktery se spousti pres planovac uloh.
Uzivateli staci informace o tom, ze je platce nespolehlivy, dal uz je to na nem - platba pouze na povoleny ucet atd.
V ramci aplikace pak dostane informace o konkretnim platci - status, ucty atd pomoci StatusNespolehlivyPlatceRequest

Kód: Delphi [Vybrat]
  1. type
  2.   TADISSeznamPolozka = record
  3.     DIC: string[15];
  4.     DatRegistrace: TDateTime;
  5.   end;
  6.  
  7.   TADISSeznamPlatcu = array of TADISSeznamPolozka;
  8.  
  9.   { zastresuje objekt pro nacteni seznamu nespolehlivych platcu i pro informace pro platci }
  10.   TADIS = class(TObject)
  11.     procedure HTTPRIOAfterExecute(const MethodName: String; SOAPResponse: TStream);
  12.   private
  13.     Interf: rozhraniCRPDPH;
  14.     RIOAccess: IRIOAccess;
  15.     X: THTTPRIO;
  16.     FPocetPlatcu: integer;
  17.     FAdisSeznamPlatcu: TADISSeznamPlatcu;
  18.     janXML: TjanXMLTree;
  19.     FStatusCode: integer;
  20.     FStatusString: string;
  21.     FNespolehlivyPlatceTyp: NespolehlivyPlatceType;
  22.     FDatumZverejneni: TDateTime;
  23.     FSeznamUctu: TStringList;
  24.     FDic: string;
  25.    ...
  26.  
  27.  
  28. {-----------------------------------------------------------------
  29.   Inicializace ADIS
  30. ------------------------------------------------------------------}
  31. constructor TADIS.Create;
  32. begin
  33.   janXML := TJanXMLTree.Create('', '', nil);
  34.   { inicializace interface }
  35.   Interf := GetrozhraniCRPDPH(False, '');
  36.   RIOAccess := Interf as IRIOAccess;
  37.   X := RIOAccess.RIO as THTTPRIO;
  38.   FPocetPlatcu := -1;
  39.   FSeznamUctu := TStringList.Create;
  40. end;
  41.  
  42. {-----------------------------------------------------------------
  43.   Udalost po spusteni requestu - ziskam kompletni odpoved webove
  44.   sluzby, ten nactu do janXML a necham rozparsovat
  45. ------------------------------------------------------------------}
  46. procedure TADIS.HTTPRIOAfterExecute(const MethodName: String;
  47.   SOAPResponse: TStream);
  48. begin
  49.   SOAPResponse.Position := 0;
  50.   janXML.LoadFromStream(SOAPResponse);
  51. end;
  52.  
  53. {-----------------------------------------------------------------
  54.   Nacte seznam platcu do pole  FAdisSeznamPlatcu
  55. ------------------------------------------------------------------}
  56. procedure TADIS.NactiSeznamPlatcu;
  57. var
  58.   np: SeznamNespolehlivyPlatceRequest;
  59.   odp: SeznamNespolehlivyPlatceResponse;
  60.   janNode : TJanXMLNode;
  61.   i: Integer;
  62. begin
  63.   FPocetPlatcu := 0;
  64.   { potrebuju ziskat obsah XML, protoze sluzba nevraci seznam }
  65.   x.OnAfterExecute := HTTPRIOAfterExecute;
  66.   np := SeznamNespolehlivyPlatceRequest.Create;
  67.   { necham si vratit seznam nespolehlivych platcu }
  68.   odp := interf.getSeznamNespolehlivyPlatce(np);
  69.   { zkontrolujeme, zda sluzba odpovedela }
  70.   FStatusCode := odp.status.statusCode;
  71.   FStatusString := odp.status.statusText;
  72.  
  73.   if FStatusString = 'OK' then
  74.   begin
  75.     i := 0;
  76.     SetLength(FAdisSeznamPlatcu, 4500);
  77.     janNode := janXML.firstChild.findNamedNode('statusPlatceDPH');
  78.     while janNode <> nil do
  79.     begin
  80.       { uz dosla kapacita, tak pridame }
  81.       if High(FAdisSeznamPlatcu) > i then
  82.         SetLength(FAdisSeznamPlatcu, High(FAdisSeznamPlatcu)   100);
  83.       FAdisSeznamPlatcu[i].DIC := 'CZ'   janNode.getNamedAttribute('dic').Value;
  84.       FAdisSeznamPlatcu[i].DatRegistrace := XMLDatumToDate(janNode.getNamedAttribute('datumZverejneniNespolehlivosti').Value);
  85.  
  86.       inc(i);
  87.       janNode := janNode.nextSibling;
  88.     end;
  89.     { upravim vyslednou delku pole }
  90.     SetLength(FAdisSeznamPlatcu, i);
  91.     FPocetPlatcu := i;
  92.   end;
  93.   { uklid }
  94.   x.OnAfterExecute := nil;
  95.   np.Free;
  96. end;
  97.  
« Poslední změna: 25-03-2021, 19:29:44 od Jan Fiala »