Geschäftsfall Rechnungen an die Stadt Wien. Gemeinde Wien



Ähnliche Dokumente
Verteilte Systeme: Übung 4

Wiederholung: Beginn

Web-Sevices : WSDL Entwicklung von Web-Anwendungen

Anwendungsprotokolle: HTTP, POP, SMTP

Man liest sich: POP3/IMAP

Melde- und Veröffentlichungsplattform Portal (MVP Portal) Hochladen einer XML-Datei

Reimo Fachhändlerbereich Import Datei

Bedienungsanleitung für den SecureCourier

WebServices Zwischen Buzzword und Nutzen

ACCOUNTINFO 1.01 VERWENDEN DER ACCOUNTINFO-SCHNITTSTELLE ABFARGE VON ACCOUNT-INFORMATIONEN IN ECHTZEIT 02. MÄRZ 2010

Übersicht. Angewandte Informatik 2 - Tutorium 6. Teile einer WSDL-Datei. Was ist WSDL. Besprechung: Übungsblatt 5

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

Anlegen eines DLRG Accounts

OP-LOG

VVA Webservice Online Lieferbarkeits-Abfrage

Benutzerhandbuch. Leitfaden zur Benutzung der Anwendung für sicheren Dateitransfer.

Sicherer Datenaustausch mit Sticky Password 8

Handbuch zum Verschlüsselungsverfahren

HTML5. Wie funktioniert HTML5? Tags: Attribute:

Leitfaden zur Nutzung von binder CryptShare

Sage Treuhandaustausch onesage Version 2.2

Version smarter mobile(zu finden unter Einstellungen, Siehe Bild) : Gerät/Typ(z.B. Panasonic Toughbook, Ipad Air, Handy Samsung S1):

mysql - Clients MySQL - Abfragen eine serverbasierenden Datenbank

Kurzinformation Zugang zur NOVA für dezentrale Administratoren

Abruf und Versand von Mails mit Verschlüsselung

Bereich METIS (Texte im Internet) Zählmarkenrecherche

Import der Schülerdaten Sokrates Web

Anleitung über den Umgang mit Schildern

Virtueller Seminarordner Anleitung für die Dozentinnen und Dozenten

Installation Benutzerzertifikat

Workflow, Business Process Management, 4.Teil

Beschreibung und Bedienungsanleitung. Inhaltsverzeichnis: Abbildungsverzeichnis: Werkzeug für verschlüsselte bpks. Dipl.-Ing.

END USER GUIDE IBS TICKET SYSTEM HOW-TO. Dokumenten Kontrolle. Version 1.1. Datum IBS Ticket System End User How-To D.doc.

Zur Bestätigung wird je nach Anmeldung (Benutzer oder Administrator) eine Meldung angezeigt:

einrichtung in den kaufmännischen Programmen der WISO Reihe

Bewusstkaufen.at XML Produkt Importschnittstelle für Händler

Firmware-Update, CAPI Update

SMS-API. Sloono Schnittstellenbeschreibung. Version 1.2 Stand

Version Deutsch In diesem HOWTO wird beschrieben wie Sie Ihren Gästen die Anmeldung über eine SMS ermöglichen.

ITF2XML. Transferservice. Version 1.0. infogrips GmbH, Zürich client10.doc, Revision 1.1. Tel.: 01 / Fax: 01 /

Sicherer Datenaustausch zwischen der MPC-Group und anderen Firmen. Möglichkeiten zum Datenaustausch... 2

Inhalt: Ihre persönliche Sedcard... 1 Login... 1 Passwort vergessen... 2 Profildaten bearbeiten... 3

Verschlüsselung

Live Update (Auto Update)

Kurzanleitung GigaMove

Installation und Nutzung des Fax-Service KU.Fax

Neuer Releasestand Finanzbuchhaltung DAM-EDV E Inhaltsverzeichnis. 1. Neuerungen Schnittstelle Telebanking mit IBAN und BIC...

Comtarsia SignOn Familie

Novell Client. Anleitung. zur Verfügung gestellt durch: ZID Dezentrale Systeme. Februar ZID Dezentrale Systeme

Kommunikations-Management

Anleitung für die Lohnmeldung via ELM-Standard mittels PartnerWeb

Drupal Kurzanleitung. Wie ändere ich den Inhalt meiner Seite?

Einrichtung des Cisco VPN Clients (IPSEC) in Windows7

macs Support Ticket System

WordPress. Dokumentation

Artikel Schnittstelle über CSV

Database Exchange Manager. Infinqa IT Solutions GmbH, Berlin Stralauer Allee Berlin Tel.:+49(0) Fax.:+49(0)

1 Allgemeines Initialisierung Zertifikatserzeugung... 4

Serviceanweisung Austausch Globalsign Ausstellerzertifikate

Installationsanweisung Gruppenzertifikat

Dokumentation EGVP-Übertmittlungsfehler bei Server-Engpässen Vorgehensweise Seite 1 von 5

SSO-Schnittstelle. Inhalt: Beschreibung der Single Sign-On (SSO) Schnittstelle. NetSlave GmbH Simon-Dach-Straße 12 D Berlin

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Datenbanken Kapitel 2

Version NotarNet Bürokommunikation. Bedienungsanleitung für den ZCS-Import-Assistenten für Outlook

Web Sockets mit HTML5. Quelle:

Step by Step Webserver unter Windows Server von Christian Bartl

Matrix42. Use Case - Sicherung und Rücksicherung persönlicher Einstellungen über Personal Backup. Version September

Handbuch für Redakteure

Bedienung des Web-Portales der Sportbergbetriebe

Bankeinzug von Beiträgen via Florix

DB2 Kurzeinführung (Windows)

Einstellungen für SEPA-Lastschriften oder SEPA Dauerlastschriften in der VR-NetWorld Software 5.0

Schulberichtssystem. Inhaltsverzeichnis

Anleitung zur Umstellung der Mehrwertsteuer in WERBAS

12. Dokumente Speichern und Drucken

Backup der Progress Datenbank

ICS-Addin. Benutzerhandbuch. Version: 1.0

OpenVPN unter Linux mit KVpnc Stand: 16. Mai 2013

Suche schlecht beschriftete Bilder mit Eigenen Abfragen

Bedienungsanleitung: Onlineverifizierung von qualifiziert signierten PDF-Dateien

Dokumentation zur Versendung der Statistik Daten

Norddeutsche Landesverbände - Stand vom

Zugriff auf das Across-Ticketsystem

Anleitung SEPA-Lastschriften mit VR-NetWorld Software Version 5.x

Anleitungen zum KMG- -Konto

COSA. Portal Client Installation JAVA J2SE / JRE Version 1.4.2_09, Stand Copyright

Kurzanleitung ecari-mofa

Zustandsgebundene Webservices

FastViewer Remote Edition 2.X

Anleitung SEPA-Lastschriften in der VR-NetWorld Software Version 5

IDA ICE - Konvertieren und Importieren von mit TRY_Effekte_aufpraegen.exe erzeugten Datensätzen

Speicher in der Cloud

Schiller-Gymnasium Hof

Installationsanleitung SSL Zertifikat

Standard-Kontaktformular

LC-Ne s-letter. Neuerungen bei LIFTCALC

Transkript:

Geschäftsfall Rechnungen an die Stadt Wien Gemeinde Wien Dieses Dokument beschreibt den Geschäftsfall Rechnungen an die Stadt Wien. Dieses Dokument ist work in progress'' 1. 1 Ablauf Beim Geschäftsfall Rechnungen an die Stadt Wien werden der Stadt Wien vom Geschäftspartner eine oder mehrere Rechnungen zugestellt. Einlangende Rechnungen werden am ec-server formal geprüft und anschließend der eigentlichen Verarbeitung zugeführt. Abbildung 1: Überblick Interaktion Abbildung 1 zeigt das Interaktionsschema. Die Pfeile sind mit jeweils einer Nummer und einem Vorgang beschriftet. Die Nummern geben die Reihenfolge an, ihre Position von wo der Vorgang ausgeht. Beim Geschäftspartner wird eine Rechnungs-Datei erstellt (1). Aus den Rechnungsdaten wird am Server des Geschäftspartners eine XML-Datei erzeugt und per Upload an den ec-server übermittelt. Der Upload ist ein HTTP- POST-Request in eine Applikation. Diese prüft die XML-Datei auf syntaktische Korrektheit, extrahiert die Daten und stellt sie in eine Datenbank (2). Die Applikation am ec-server liefert als Antwort auf den Upload-Request eine Statusseite (HTML), die Auskunft gibt, ob diese Vorverarbeitung (sozusagen die interne Zustellung) erfolgreich war oder eine Fehlerbeschreibung (3). Der ec-server initiiert die Weiterverarbeitung und verschickt eine Status-Email, aus der ersichtlich ist, ob die Vorverarbeitung korrekt abgelaufen ist oder nicht (4). Achtung: Aus einem erfolgreichen Upload läßt sich nur ableiten, daß der ec-server die Daten empfangen und in die Datenbank stellen konnte. Die Weiterverarbeitung bei der Stadt Wien liegt nicht im Bereich der hier beschriebenen Software. 2 Datenformate Die in diesem Abschnitt dargestellten Dateien sind Beispiele. Die Daten sind fiktiv und nur zur Illustration gedacht. Die von der Stadt Wien verwendeten XML-Formate enthalten keine semantisch be 1 Die Stadt Wien behält sich bezüglich aller in diesem Dokument erwähnten XML-Datenformate vor, die Reihenfolge der Elemente und Attribute zu ändern und zusätzliche Elemente, bzw. Attribute hinzuzufügen, wenn dies im technischen oder organisatorischen Interesse ist. Bei der Verarbeitung ist darauf zu achten, daß Elemente und Attribute, die zum Zeitpunkt der Implementierung nicht bekannt sind, nicht zu Verarbeitungsfehlern führen, sondern ignoriert werden. 1

deutsamen Leerzeichen (significant whitespace), die konkrete Formatierung kann also in der Praxis anders aussehen, was aber bei Verwendung eines XML-Parsers zum Extrahieren der Daten bedeutungslos ist. In XML kodierte Beispieldaten (Rechnungen an die Stadt Wien): <?xml version="1.0" encoding="iso-8859-1" standalone="no"?> <!DOCTYPE rechnung_fuer_gemeinde_wien SYSTEM "http://xml.wien.gv.at/dtd/ec/rechnungen/rechnungen.dtd"> <rechnung_fuer_gemeinde_wien> <rechnung> <header_sektion> <rechnungs_datum>20050331</rechnungs_datum> <rechnungs_text>08154711 Diverses</rechnungs_text> <rechnungs_waehrung>eur</rechnungs_waehrung> <skonto> <zahlungsfrist>14</zahlungsfrist> <skonto_prozentsatz>3</skonto_prozentsatz> </skonto> <kunden_nummer>000112200</kunden_nummer> <buchhaltungs_abteilung>14</buchhaltungs_abteilung> <ueberrechnungs_fall>kleinzeugrechnungen</ueberrechnungs_fall> <leistungs_datum>20050117</leistungs_datum> <faelligkeits_datum>20050414</faelligkeits_datum> <bestell_dienststelle>22</bestell_dienststelle> <bestell_nummer>1234567</bestell_nummer> <teilrechnung>9</teilrechnung> <rechnungsleger> <name_adresse> <personennummer>47110815</personennummer> <name>mustermann Kleinwaren</name> <vorname>fritz</vorname> <titel>dr.</titel> <rechtsform>ges.m.b.h.</rechtsform> <strasse>gartenweg</strasse> <orientierungsnummer>17a/3/24</orientierungsnummer> <ort>wien</ort> <postleitzahl>1203</postleitzahl> <staat>aus</staat> </name_adresse> <bank_info> <kontonummer>00471100815</kontonummer> <bankleitzahl>20151</bankleitzahl> </bank_info> <umsatzsteuer_id>47110471104</umsatzsteuer_id> <firmenbuch_nummer>08150081500</firmenbuch_nummer> <kontakt> <ansprech_partner>dr. Fritz Muster</ansprech_partner> <kommunikations_nummer>47110815</kommunikations_nummer> <kommunikations_medium>te</kommunikations_medium> </kontakt> <kontakt> <ansprech_partner>büro</ansprech_partner> <kommunikations_nummer>office@muster.at</kommunikations_nu mmer> <kommunikations_medium>em</kommunikations_medium> </kontakt> </rechnungsleger> <zahlungsempfaenger> <name_adresse> 2

mer> <personennummer>12345678</personennummer> <name>bank Burgenland</name> <vorname></vorname> <titel></titel> <rechtsform>ag</rechtsform> <strasse>holzweg</strasse> <orientierungsnummer>18</orientierungsnummer> <ort>eisenstadt</ort> <postleitzahl>9231</postleitzahl> <staat>aus</staat> </name_adresse> <bank_info> <kontonummer>9876543210</kontonummer> <bankleitzahl>10101</bankleitzahl> </bank_info> <umsatzsteuer_id></umsatzsteuer_id> <firmenbuch_nummer>01010101010</firmenbuch_nummer> <kontakt> <ansprech_partner>hr. Maier</ansprech_partner> <kommunikations_nummer>044599001010101</kommunikations_num <kommunikations_medium>fx</kommunikations_medium> </kontakt> </zahlungsempfaenger> <leistungsempfaenger> <objekt>07324566284</objekt> <name_adresse> <personennummer>33333333</personennummer> <name>magistratsabteilung 77</name> <vorname>hugo</vorname> <titel></titel> <rechtsform></rechtsform> <strasse>prunkdamm</strasse> <orientierungsnummer>1</orientierungsnummer> <ort>st. Pölten</ort> <postleitzahl>2222</postleitzahl> <staat>aus</staat> </name_adresse> <dienststellen_kuerzel>77</dienststellen_kuerzel> <kontakt> <ansprech_partner>ltr.stv. OAR Hirsch</ansprech_partner> <kommunikations_nummer>400077101</kommunikations_nummer> <kommunikations_medium>te</kommunikations_medium> </kontakt> </leistungsempfaenger> </header_sektion> <detail_sektion> <zeile> <positions_nummer>1</positions_nummer> <positionsbeschreibung>kleine Fische</positionsbeschreibung> <masseinheit>m3</masseinheit> <anzahl>3</anzahl> <katalog_artikel>ean 3456789</katalog_artikel> <einzel_preis>49999,99</einzel_preis> <positions_preis>149999,97</positions_preis> <steuer> <steuer_art>vat</steuer_art> <steuersatz>10</steuersatz> </steuer> </zeile> <zeile> <positions_nummer>2</positions_nummer> 3

<positionsbeschreibung>chips</positionsbeschreibung> <masseinheit>pck</masseinheit> <anzahl>22</anzahl> <katalog_artikel>ean 3456790</katalog_artikel> <einzel_preis>7,50</einzel_preis> <positions_preis>165,00</positions_preis> <steuer> <steuer_art>vat</steuer_art> <steuersatz>10</steuersatz> </steuer> </zeile> </detail_sektion> <summen_sektion> <gesamtsumme_betrag>150164,97</gesamtsumme_betrag> <steuer_summe> <steuer_art>vat</steuer_art> <steuersatz>10</steuersatz> <steuersumme_betrag>15016,5</steuersumme_betrag> </steuer_summe> </summen_sektion> </rechnung> </rechnung_fuer_gemeinde_wien> Abbildung 1: Beispieldaten Rechnungen an die Stadt Wien Den Beispieldaten entsprechende DTD (Rechnungen an die Stadt Wien): <?xml version="1.0" encoding="iso-8859-1"?> <!ELEMENT rechnung_fuer_gemeinde_wien ( rechnung+)> <!ELEMENT rechnung ( header_sektion, detail_sektion, summen_sektion)> <!ELEMENT header_sektion ( rechnungs_datum, rechnungs_text, rechnungs_waehrung, skonto?, kunden_nummer, ueberrechnungs_kennzahl?, ueberrechnungs_fall?, buchhaltungs_abteilung, buchungs_text?, beleg_nummer?, leistungs_datum, faelligkeits_datum, haushaltskonto?, bestell_dienststelle, bestell_nummer, teilrechnung, vorhabens_nummer?, vorhabens_kennzeichen?, kostenstelle?, kostenart?, kostentraeger?, betriebsaufteiler?, auftrags_kennzahl?, wirtschaftsgut_nummer?, inventar_nummer?, rechnungsleger, zahlungsempfaenger?, leistungsempfaenger?)> <!ELEMENT skonto ( zahlungsfrist, skonto_prozentsatz)> <!ELEMENT rechnungsleger ( name_adresse, bank_info, umsatzsteuer_id?, firmenbuch_nummer?, sozialversicherungs_nummer?, geburts_datum?, kontakt+)> <!ELEMENT zahlungsempfaenger ( name_adresse, bank_info, umsatzsteuer_id?, firmenbuch_nummer?, sozialversicherungs_nummer?, geburts_datum?, kontakt*)> 4

<!ELEMENT leistungsempfaenger ( objekt?, name_adresse, dienststellen_kuerzel?, kontakt*)> <!ELEMENT kontakt ( ansprech_partner, kommunikations_nummer, kommunikations_medium)> <!ELEMENT detail_sektion ( zeile+)> <!ELEMENT zeile ( positions_nummer, positionsbeschreibung, masseinheit, anzahl, katalog_artikel, einzel_preis, positions_preis, steuer)> <!ELEMENT steuer ( steuer_art, steuersatz)> <!ELEMENT summen_sektion ( gesamtsumme_betrag, steuer_summe)> <!ELEMENT steuer_summe ( steuer_art, steuersatz, steuersumme_betrag)> <!ELEMENT name_adresse ( personennummer?, name, vorname, titel, rechtsform, strasse, orientierungsnummer, ort, postleitzahl, staat)> <!ELEMENT bank_info ( kontonummer, bankleitzahl)> <!ELEMENT rechnungs_datum (#PCDATA)> <!ELEMENT rechnungs_text (#PCDATA)> <!ELEMENT rechnungs_waehrung (#PCDATA)> <!ELEMENT kunden_nummer (#PCDATA)> <!ELEMENT ueberrechnungs_kennzahl (#PCDATA)> <!ELEMENT ueberrechnungs_fall (#PCDATA)> <!ELEMENT buchhaltungs_nummer (#PCDATA)> <!ELEMENT buchungs_text (#PCDATA)> <!ELEMENT beleg_nummer (#PCDATA)> <!ELEMENT leistungs_datum (#PCDATA)> <!ELEMENT haushaltskonto (#PCDATA)> <!ELEMENT bestell_dienststelle (#PCDATA)> <!ELEMENT bestell_nummer (#PCDATA)> <!ELEMENT teilrechnung (#PCDATA)> <!ELEMENT vorhabens_nummer (#PCDATA)> <!ELEMENT vorhabens_kennzeichen (#PCDATA)> <!ELEMENT kostenstelle (#PCDATA)> <!ELEMENT kostenart (#PCDATA)> <!ELEMENT kostentraeger (#PCDATA)> <!ELEMENT betriebsaufteiler (#PCDATA)> <!ELEMENT auftrags_kennzahl (#PCDATA)> <!ELEMENT wirtschaftsgut_nummer (#PCDATA)> <!ELEMENT inventar_nummer (#PCDATA)> <!ELEMENT personennummer (#PCDATA)> <!ELEMENT zahlungsfrist (#PCDATA)> <!ELEMENT skonto_prozentsatz (#PCDATA)> <!ELEMENT name (#PCDATA)> <!ELEMENT vorname (#PCDATA)> <!ELEMENT titel (#PCDATA)> <!ELEMENT rechtsform (#PCDATA)> <!ELEMENT strasse (#PCDATA)> <!ELEMENT orientierungsnummer (#PCDATA)> 5

<!ELEMENT ort (#PCDATA)> <!ELEMENT postleitzahl (#PCDATA)> <!ELEMENT staat (#PCDATA)> <!ELEMENT umsatzsteuer_id (#PCDATA)> <!ELEMENT firmenbuch_nummer (#PCDATA)> <!ELEMENT sozialversicherungs_nummer (#PCDATA)> <!ELEMENT geburts_datum (#PCDATA)> <!ELEMENT bankleitzahl (#PCDATA)> <!ELEMENT kontonummer (#PCDATA)> <!ELEMENT dienststellen_kuerzel (#PCDATA)> <!ELEMENT ansprech_partner (#PCDATA)> <!ELEMENT kommunikations_nummer (#PCDATA)> <!ELEMENT kommunikations_medium (#PCDATA)> <!ELEMENT objekt (#PCDATA)> <!ELEMENT positions_nummer (#PCDATA)> <!ELEMENT katalog_artikel (#PCDATA)> <!ELEMENT einzel_preis (#PCDATA)> <!ELEMENT positionsbeschreibung (#PCDATA)> <!ELEMENT masseinheit (#PCDATA)> <!ELEMENT anzahl (#PCDATA)> <!ELEMENT faelligkeits_datum (#PCDATA)> <!ELEMENT positions_preis (#PCDATA)> <!ELEMENT steuer_art (#PCDATA)> <!ELEMENT steuersatz (#PCDATA)> <!ELEMENT gesamtsumme_betrag (#PCDATA)> <!ELEMENT steuersumme_betrag (#PCDATA)> Abbildung 2: DTD zu den Rechnungen an die Stadt Wien 3 Automatischer Upload 3.1 Upload mittels HTTPS-Request Für den Geschäftsfall Rechnungen gibt es zusätzlich zum herkömmlichen Upload über den Browser noch die Möglichkeit eines automatischen Uploads. Der interaktive Upload von Rechnungen mit dem Browser ist zwar einfach, bedingt aber menschliche Interaktion. Für eine Vollautomatisierung dieser Vorgänge gibt es eine alternative Schnittstelle zum automatischen Upload. Wie beim Zugriff auf die interaktive Applikation erfolgt die Kommunikation auch hier verschlüsselt über HTTPS. Im Gegensatz zur Applikation muss man hier nicht durch mehrere Formulare navigieren, es genügt ein einziger HTTPS-Zugriff. Der Zugriff muss ein POST-Request unter Angabe von Benutzernamen und Passwort sein, alle für die Verarbeitung notwendigen Daten werden als ``Formularparameter'' mitgeschickt. Das den Upload durchführende Programm muss dabei den selben HTT PS-Request generieren wie ein Browser beim Absenden eines Formulars. <html> <body> <form name="form1" method="post" action="https://service.wien.gv.at/ec0/a_remote_control/ advcgi/ec0/remote_control_start" enctype="multipart/form-data"> <input type="hidden" name="geschaeftsfall" value="ueberrechnungen"> 6

</form> </body> </html> <input type="file" name="file" value=""> <input type="submit" name="submit" value="upload"> Abbildung 3: Automatischer Rechnungsupload, äquivalentes HTML-Formular Abbildung 3 zeigt den HTML-Code eines Formulars, das beim Absenden durch den Browser korrekte Daten für den Upload von Rechnungsdaten liefert. Die URL im Form-Attribut action ist die Ziel-URL für den Upload, die Methode ist POST (Formulardaten werden also im Gegensatz zu GET nicht in die URL, sondern in den Datenstrom kodiert), und der encoding type ist multipart/form-data. Innerhalb der Form kann der Submit-Button ignoriert werden, er dient im Beispielformular nur zum Auslösen des Requests. Wichtig sind aber die beiden anderen Werte. Da man sich beim automatischen Upload nicht durch mehrere Formulare bis zum eigentlichen Upload ``hindurchmanövriert'', muss dem ec-server bereits mit diesem einen Request mitgeteilt werden, um welchen Geschäftsfall es sich handelt. Dazu dient der Formularparameter geschaeftsfall, hier als hidden input dargestellt. Der zweite essentielle Parameter ist die zum ec-server zu transportierende Datei selbst. In HTML-Formularen wird dafür ein Input mit dem Typ file verwendet, der Browser zeigt neben dem Feld eine Schaltfläche ``Durchsuchen'' an und der Benutzer muss diese Schaltfläche betätigen, um mittels eines Dateiauswahl-Dialogs die zu transportierende Datei auszuwählen. Beim automatischen Upload ist die normalerweise durch den Browser durchgeführte Kodierung entsprechend dem encoding type multipart/form-data natürlich von der den Request auslösenden Applikation auszuführen. Normative Informationen zur Implementierung von File-Uploads durch HTTP-Clients finden sich in ``RFC 1867, Form-based File Upload in HTML 2 ''. Der ec-server schickt als Antwort auf den HTTPS-Request eine XML-Datei. Abbildung 4 zeigt die entsprechende Document Type Definition 3 (DTD). DTD für eine Antwort auf automatischen Upload: <?xml version='1.0' encoding='iso-8859-1'?> <!ELEMENT ec_server_upload_rc ( response )> <!ELEMENT response ( status, geschaeftsfall, 2 http://www.ietf.org/rfc/rfc1867.txt 3 http://xml.wien.gv.at/dtd/ec/auto_upload/ec_server_upload_rc.dtd 7

)> transaktion_id, upload_id, message, <!ELEMENT status <!ATTLIST status #REQUIRED> <!ELEMENT geschaeftsfall <!ELEMENT transaktion_id <!ELEMENT upload_id <!ELEMENT message (#PCDATA)> value (IN_PROCESS ERROR OK) (#PCDATA)> (#PCDATA)> (#PCDATA)> (#PCDATA)> Abbildung 4: DTD für eine Antwort auf automatischen Upload Da diese Antwort sofort, also vor der eigentlichen Datenverarbeitung, verschickt wird, können aus ihr nur einige Vorabinformationen gewonnen werden. Trifft die Upload-Datei am ec-server ein, wird eine upload_id und, im Falle von Rechnungen, eine transaktion_id generiert und die Verarbeitung der Daten gestartet. In diesem Fall wird der Status in der Antwort auf IN_PROCESS gesetzt, was den korrekten HTTPS-Request, den Erhalt der Upload-Datei und die korrekte Vorverarbeitung bestätigt. Tritt bis dahin ein wie immer gearteter Fehler auf, wird der Status in der Antwort auf ERROR gesetzt und message mit einer sprechenden Fehlermeldung versehen. Abbildung 5 zeigt ein Beispiel für eine Antwort auf einen korrekten Rechnungs- Upload mittels HTTPS-Request: <?xml version="1.0" encoding="iso-8859-1" standalone="no"?> <!DOCTYPE ec_server_upload_rc SYSTEM "http://xml.wien.gv.at/dtd/ec/auto_upload/ec_server_upload_rc.d td"> <ec_server_upload_rc> <response> <status value="in_process" /> <geschaeftsfall>ueberrechnungen</geschaeftsfall> <transaktion_id>123</transaktion_id> <upload_id>77</upload_id> <message>ihr Upload wird bearbeitet. Die Verarbeitungszeit Ihrer Daten kann bei einer grossen Datenmenge im Stundenbereich liegen; nach Beendigung der Verarbeitung erhalten Sie in jedem Fall eine Status-Email. </message> </response> </ec_server_upload_rc> Abbildung 5: Beispiel einer Antwort auf einen Rechnungs-HTTPS-Request Nach Beendigung der Verarbeitung, deren Dauer sich aus der Dateigröße ergibt, wird an den ec-server-benutzer eine email verschickt, aus der der Status der Verarbeitung ersichtlich ist. 3.2 Upload über SOAP-Schnittstelle Für diese komfortable Art des Uploads werden Rechnungen oder Kommunalsteuern einzeln durch einen SOAP-Client an den ec-server übertragen. Jeder SOAP-Call wird 8

sofort bearbeitet, was dem Anwender den Vorteil bietet, dass er sofort via SOAP eine Rückmeldung über den Status des aktuellen Uploads erhält. Weiters entfallen dabei die langen Uploadzeiten bei großen Rechnungsmengen und die damit verbundenen Netzprobleme. 3.2.1 Definitionen Die Web-Service-Beschreibung (WSDL - Web Service Description Language) ist unter http://service.magwien.gv.at/xml_schema/ec0/rechnungen.wsdl (siehe auch Abbildung 8 ) zu finden, das XML-Schema (XSD - XML Schema Definition) unter http://service.magwien.gv.at/xml_schema/ec0/rechnungen.xsd (siehe auch Abbildung 9 ). Url des SOAP-Servers: https://services.wien.gv.at/ec_soap/ 3.2.2 Beschreibung Der Datenaustausch zwischen Client und Server erfolgt im XML-Format. Der Client erzeugt ein XML-Dokument und schickt es mittels SOAP-Call zum Server. Das Ergebnis eines Requests ist wieder ein XML-Dokument. Der SOAP-Client gibt bei einem Initialisierungsaufruf (InitXA) dem SOAP-Server bekannt, für welchen Geschäftsfall Daten upgeloadet werden sollen und wieviele einzelne Datensätze übertragen werden sollen. In unserem Beispiel sollen 3 Rechnungen, die logisch zu einer Transaktion zusammengehören, übermittelt werden. Als Antwort (InitXAResponse) erhält der Client vom Server eine Transaktionsnummer (XANum). Diese Transaktionsnummer muss bei jedem der angekündigten Anzahl von SOAP-Calls gleich sein, damit der Server erkennt, welche Datensätze zu einem Paket gehören. Die einzelnen SOAP-Calls müssen zudem noch mit einer fortlaufenden Nummer versehen werden. In unserem Beispiel gibt der Client im Initialisierungsaufruf bekannt, dass Rechnungen übermittelt werden, und zwar genau 3 Stück. Der Server liefert eine Transaktionsnummer zurück. Der Client übermittelt die 3 Rechnungen mit jeweils derselben erhaltenen Transaktionsnummer und der laufenden Nummern 1, 2 und 3. Jeder Übermittlungsaufruf des Clients (Upload) wird vom Server beantwortet (UploadResponse). Nachdem der letzte Rechnungssatz korrekt übermittelt wurde, erkennt dersoap-server, dass das Paket komplett ist und leitet die Verarbeitung an den ec-server weiter. Bevor das Paket komplett ist, findet keine weitere Verarbeitung vom ec-server statt. Der Client erhält zu jedem SOAP-Call vom Server eine Statusmeldung, ob die Übertragung der Daten funktioniert hat bzw. ob Syntax- oder Übertragungsfehler aufgetreten sind. Bei einem fehlerhaften SOAP-Call muss der Client nur mehr diesen einen SOAP-Call (unter Angabe der Transaktions- und laufenden Nummer) wiederholen, alle korrekt durchgeführten Übermittlungen merkt sich der SOAP-Server. Der Vorteil bei der Verwendung der SOAP-Schnittstelle liegt eben darin, dass bei Übertragungsproblemen nicht wie bisher das komplette Paket von hunderten Datensätzen erneut upgeloadet werden muss, sondern dass nur jene Datensätze wiederholt gesendet werden müssen, bei denen etwas schief gelaufen ist. 9

3.2.3 Verwendung eines Zertifikates Der Zugriff auf die SOAP-Schnittstelle ist geschützt und nur mit einem Client-Zertifikat möglich, das auf Anfrage generiert wird. Der Benutzer erhält das verschlüsselte Zertifikat (benutzername.p12) von der MA14-ADV auf einer CD. Zusätzlich wird ein Passwort ausgeliefert, mit dem das Zertifikat entschlüsselt werden kann. 3.2.3.1 Verwenden des Zertifikates unter Windows Wie das Zertifikat unter Windows verwendet wird, hängt stark von der verwendeten Software zum Schreiben eines Clients ab. 3.2.3.2 Umwandeln des Zertifikates unter Linux/Unix auf ein.pem-format Da der LWP-User Agent.pem-Files erwartet und nichts mit einem.p12-file anfangen kann, muss das Zertifikat umgewandelt werden. Dieser Vorgang muß einmalig ausgeführt werden, bevor die SOAP-Schnittstelle verwendet werden kann. Unter Linux wird dafür der Befehl openssl mit folgenden Parametern verwendet: % openssl pkcs12 -in benutzername.p12 -nodes Danach wird der Benutzer nach dem Passwort gefragt, das mit der CD ausgeliefert wurde. Enter Import Password: Nach Eingabe des Passwortes wird das Zertifikat entschlüsselt und ausgegeben. Die Zeilen zwischen -----BEGIN CERTIFICATE----- und -----END CERTIFICATE----- enthalten das Zertifikat und müssen in einer eigenen Datei abgespeichert werden (z.b. ec_soap_benutzername_cert.pem). Die Zeilen zwischen -----BEGIN RSA PRIVATE KEY----- und -----END RSA PRIVATE KEY----- enthalten den private key und müssen in einer zweiten Datei abgespeichert werden (z.b. ec_soap_benutzername_key.pem). 3.2.4 Beispiel für einen perl-client Folgendes perl-programm soll zur Veranschaulichung eines ec-soap-clients dienen; natürlich können auch andere Sprachen verwendet werden. Codebeispiel für Perl-Client: #!/usr/bin/perl ################################################################### # # $Id: auto_upload_document.tex,v 1.4 2004/10/22 11:19:33 klr Exp $ # ################################################################### ################################################################### # # ADV::Service::Ec_soap # ################################################################### 10

package ADV::Service::Ec_soap; use vars qw(@isa $VERSION $SERVICE $APPXMLNS $ACTIONXMLNS); use SOAP::Lite +trace => 'debug' ; use MIME::Base64 qw(encode_base64); use IO::File; use Classlib::dotNET::Client; @ISA = qw(classlib::dotnet::client); #------------------------------------------------------------------ BEGIN { $VERSION = 1; $APPXMLNS = 'http://www.wien.gv.at/advecserver/ec_soap_svc/ns'; $ACTIONXMLNS = $APPXMLNS; $SERVICE = "https://service.magwien.gv.at/ec_soap/"; # Client-Zertifikat $ENV{HTTPS_CERT_FILE} = '/AdvApps/conf/certs/ec_soap_test_klr_cert.pem'; $ENV{HTTPS_KEY_FILE} = '/AdvApps/conf/keys/ec_soap_test_klr_key.pem'; } #------------------------------------------------------------------ sub new { my $class = shift; my $self = $class->super::new(service => $SERVICE, trace => 1, trace_data => 1, ); $self = bless($self, $class); } return $self; #------------------------------------------------------------------ # Initialisierungsaufruf # # Parameter: $count... Anzahl der zu übertragenden Datensätze # $geschaeftsfall... Geschäftsfall (urs für Rechnungen) # Returnvalue: vom Server generierte Transaktionsnummer sub init_xa { my $self = shift; my $count = shift; my $geschaeftsfall = shift; my $xml_in = join('', '<InitItem>', '<Count>', $count, Einzelrechnungen '</Count>', '<geschaeftsfall>', # Anzahl der 11

$geschaeftsfall, # urs oder komm_st '</geschaeftsfall>', '</InitItem>', ); my $data = SOAP::Data->name('InitXA') ->attr({xmlns => $ACTIONXMLNS}) ->type('' => $xml_in); } # Transaktionsnummer wird vom Server generiert my $tnr = $self->call($data, ['1', '//XANum', ''], ); return $tnr; #------------------------------------------------------------------ # Übertragung einer Rechnung # # Parameter: $XANum... Transaktionsnummer aus dem Aufruf von &init_xa, # die für alle Datensätze gleich sein muß. # $Serial... fortlaufende Nummer; pro Datensatz wird eine # eigene Nummer angegeben. # restl.parameter... Datenfelder der Rechnung # sub upload { my $self = shift; my $XANum = shift; my $Serial = shift; my $rechnungs_datum = shift; my $rechnungs_text = shift; my $rechnungs_waehrung = shift; my $kunden_nummer = shift; my $buchhaltungs_abteilung = shift; my $leistungs_datum = shift; my $faelligkeits_datum = shift; my $bestell_dienststelle = shift; my $name = shift; my $strasse = shift; my $orientierungsnummer = shift; my $ort = shift; my $postleitzahl = shift; my $staat = shift; my $kontonummer = shift; my $bankleitzahl = shift; my $ansprech_partner = shift; my $kommunikations_nummer = shift; my $kommunikations_medium = shift; my $positions_nummer = shift; my $positionsbeschreibung = shift; my $masseinheit = shift; my $gesamtsumme_betrag = shift; my $steuer_art = shift; my $steuersumme_betrag = shift; # XML-Format my $xml_in = join('', '<Item>', 12

'<XANum>', $XANum, '</XANum>'."\n", '<Serial>', $Serial, '</Serial>'."\n", '<rechnung>', '<header_sektion>', '<rechnungs_datum>', $rechnungs_datum, '</rechnungs_datum>', '<rechnungs_text>', $rechnungs_text, '</rechnungs_text>', '<rechnungs_waehrung>', $rechnungs_waehrung, '</rechnungs_waehrung>', '<kunden_nummer>', $kunden_nummer, '</kunden_nummer>', '<buchhaltungs_abteilung>', $buchhaltungs_abteilung, '</buchhaltungs_abteilung>', '<leistungs_datum>', $leistungs_datum, '</leistungs_datum>', '<faelligkeits_datum>', $faelligkeits_datum, '</faelligkeits_datum>', '<bestell_dienststelle>', $bestell_dienststelle, '</bestell_dienststelle>', '<rechnungsleger>', '<name_adresse>', '<name>', $name, '</name>', '<strasse>', $strasse, '</strasse>', '<orientierungsnummer>', $orientierungsnummer, '</orientierungsnummer>', '<ort>', $ort, '</ort>', '<postleitzahl>', $postleitzahl, '</postleitzahl>', '<staat>', $staat, '</staat>', '</name_adresse>', '<bank_info>', '<kontonummer>', $kontonummer, '</kontonummer>', '<bankleitzahl>', $bankleitzahl, '</bankleitzahl>', '</bank_info>', '<kontakt>', 13

'<ansprech_partner>', $ansprech_partner, '</ansprech_partner>', '<kommunikations_nummer>', $kommunikations_nummer, '</kommunikations_nummer>', '<kommunikations_medium>', $kommunikations_medium, '</kommunikations_medium>', '</kontakt>', '</rechnungsleger>', '</header_sektion>', '<detail_sektion>', '<zeile>', '<positions_nummer>', $positions_nummer, '</positions_nummer>', '<positionsbeschreibung>', $positionsbeschreibung, '</positionsbeschreibung>', '<masseinheit>', $masseinheit, '</masseinheit>', '</zeile>', '</detail_sektion>', '<summen_sektion>', '<gesamtsumme_betrag>', $gesamtsumme_betrag, '</gesamtsumme_betrag>', '<steuer_summe>', '<steuer_art>', $steuer_art, '</steuer_art>', '<steuersumme_betrag>', $steuersumme_betrag, '</steuersumme_betrag>', '</steuer_summe>', '</summen_sektion>', '</rechnung>', '</Item>', ); my $data = SOAP::Data->name('Upload') ->attr({xmlns => $ACTIONXMLNS}) ->type('' => $xml_in); } my $status = $self->call($data, ['1', '//Status', ''], ); return $status; #------------------------------------------------------------------ package main; my $svc = ADV::Service::Ec_soap->new(); # Initialisierungsaufruf für 3 Rechnungen, das Ergebnis ist eine # Transaktionsnummer my $xa_num = $svc->init_xa(3, "urs"); print "xa_num = $xa_num\n"; 14

# Übertragung der ersten Rechnung print $svc->upload( $xa_num, # Transaktionsnummer 1, # Serial '20050428', # rechnungs_datum 'Rechnungstext 1', # rechnungs_text 'EUR', # rechnungs_waehrung '1234567890', # kunden_nummer '1', # buchhaltungs_abteilung '20050304', # leistungs_datum '20050515', # faelligkeits_datum 'ma6', # bestell_dienststelle 'fritz', # name 'wunderg.', # strasse '43', # orientierungsnummer 'wien', # ort '1234', # postleitzahl 'A', # staat '123456', # kontonummer '12000', # bankleitzahl 'Schmidt', # ansprech_partner '2222', # kommunikations_nummer 'tel', # kommunikations_medium '1', # positions_nummer '1', # positionsbeschreibung 'g', # masseinheit '1234456.77', # gesamtsumme_betrag 'MW', # steuer_art '1233455688', # steuersumme_betrag )."\n"; # Übertragung der zweiten Rechnung print $svc->upload( $xa_num, # Transaktionsnummer 2, # Serial '20050320', # rechnungs_datum 'Rechnungstext 2', # rechnungs_text 'EUR', # rechnungs_waehrung '0987654321', # kunden_nummer '1', # buchhaltungs_abteilung '20050224', # leistungs_datum '20050506', # faelligkeits_datum 'ma6', # bestell_dienststelle 'franz', # name 'mirakelg.', # strasse '7', # orientierungsnummer 'wien', # ort '1234', # postleitzahl 'A', # staat '654321', # kontonummer '12000', # bankleitzahl 'Meier', # ansprech_partner '3333', # kommunikations_nummer 'tel', # kommunikations_medium '1', # positions_nummer '1', # positionsbeschreibung 'kg', # masseinheit '20.00', # gesamtsumme_betrag 'MW', # steuer_art '4', # steuersumme_betrag 15

)."\n"; # Übertragung der dritten Rechnung print $svc->upload( $xa_num, # Transaktionsnummer 3, # Serial '20050112', # rechnungs_datum 'Rechnungstext 3', # rechnungs_text 'EUR', # rechnungs_waehrung '0987612345', # kunden_nummer '1', # buchhaltungs_abteilung '20041221', # leistungs_datum '20050128', # faelligkeits_datum 'ma2', # bestell_dienststelle 'fridolin', # name 'zauberg.', # strasse '9', # orientierungsnummer 'wien', # ort '1111', # postleitzahl 'A', # staat '654123', # kontonummer '20151', # bankleitzahl 'Bauer', # ansprech_partner '6666', # kommunikations_nummer 'tel', # kommunikations_medium '1', # positions_nummer '1', # positionsbeschreibung 'kg', # masseinheit '80.00', # gesamtsumme_betrag 'MW', # steuer_art '4', # steuersumme_betrag )."\n"; Abbildung 6: Codebeispiel für Perl-Client Der Beispielclient erzeugt folgende Ausgaben: >>>>>> Classlib::dotNET::Client::call(InitXA) SOAP::Transport::HTTP::Client::send_receive: POST https://services.wien.gv.at/ec_soap/ Accept: text/xml Accept: multipart/* Content-Length: 539 Content-Type: text/xml; charset=utf-8 SOAPAction: http://www.wien.gv.at/advecserver/ec_soap_svc/ns/initxa <?xml version="1.0" encoding="utf-8"?><soap-env:envelope xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/xmlschema-instance" xmlns:xsd="http://www.w3.org/1999/xmlschema"><soap-env:body><initxa xmlns="http://www.wien.gv.at/advecserver/ec_soap_svc/ns"><inititem> <Count>3</Count><geschaeftsfall>urs</geschaeftsfall></InitItem> </InitXA></SOAP-ENV:Body></SOAP-ENV:Envelope> SOAP::Transport::HTTP::Client::send_receive: HTTP/1.1 200 OK Connection: close Date: Tue, 30 Apr 2005 11:14:57 GMT Server: Apache/1.3.29 (Unix) (MA14-ADV/ESN) mod_watch/3.17 mod_ssl/2.8.16 OpenSSL/0.9.6b mod_perl/1.29 NTLM/3.1.2 16

Content-Length: 501 Content-Type: text/xml; charset=utf-8 Client-Date: Tue, 30 Apr 2005 11:14:53 GMT Client-Response-Num: 1 Client-Response-Num: 1 Client-SSL-Cert-Issuer: /C=AT/O=Stadt Wien/OU=MA 14/CN=Magistrat Wien CA II/Email=post@adv.magwien.gv.at Client-SSL-Cert-Subject: /C=AT/O=Stadt Wien/OU=MA 14/CN=services.wien.gv.at Client-SSL-Cipher: EDH-RSA-DES-CBC3-SHA Client-SSL-Warning: Peer certificate not verified SOAPServer: SOAP::Lite/Perl/0.55 X-DL-HatStyle: wo-neu <?xml version="1.0" encoding="utf-8"?><soap-env:envelope xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/xmlschema-instance" xmlns:xsd="http://www.w3.org/1999/xmlschema"> <SOAP-ENV:Body><InitXAResponse xmlns="http://www.wien.gv.at/advecserver/ec_soap_svc/ns"> <XANum>2585</XANum> </InitXAResponse></SOAP-ENV:Body></SOAP-ENV:Envelope> $VAR1 = '2585'; <<<<<< 2.084098 seconds >>>>>> Classlib::dotNET::Client::call(Upload) SOAP::Transport::HTTP::Client::send_receive: POST https://services.wien.gv.at/ec_soap/ Accept: text/xml Accept: multipart/* Content-Length: 1761 Content-Type: text/xml; charset=utf-8 SOAPAction: http://www.wien.gv.at/advecserver/ec_soap_svc/ns/upload <?xml version="1.0" encoding="utf-8"?><soap-env:envelope xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/xmlschema-instance" xmlns:xsd="http://www.w3.org/1999/xmlschema"><soap-env:body><upload xmlns="http://www.wien.gv.at/advecserver/ec_soap_svc/ns"><item> <XANum>2585</XANum> <Serial>1</Serial> <rechnung><header_sektion> <rechnungs_datum>20050428</rechnungs_datum> <rechnungs_text>rechnungstext 1</rechnungs_text> <rechnungs_waehrung>eur</rechnungs_waehrung> <kunden_nummer>1234567890</kunden_nummer> <buchhaltungs_abteilung>1</buchhaltungs_abteilung> <leistungs_datum>20050304</leistungs_datum> <faelligkeits_datum>20050515</faelligkeits_datum>< bestell_dienststelle>ma6</bestell_dienststelle> <rechnungsleger><name_adresse><name>fritz</name> <strasse>wunderg.</strasse> <orientierungsnummer>43</orientierungsnummer> <ort>wien</ort><postleitzahl>1234</postleitzahl><staat>a</staat> </name_adresse><bank_info><kontonummer>123456</kontonummer> <bankleitzahl>12000</bankleitzahl></bank_info> <kontakt><ansprech_partner>schmidt</ansprech_partner> <kommunikations_nummer>2222</kommunikations_nummer> <kommunikations_medium>tel</kommunikations_medium></kontakt> 17

</rechnungsleger></header_sektion> <detail_sektion><zeile><positions_nummer>1</positions_nummer> <positionsbeschreibung>1</positionsbeschreibung> <masseinheit>g</masseinheit></zeile></detail_sektion> <summen_sektion><gesamtsumme_betrag>1234456.77</gesamtsumme_betrag> <steuer_summe><steuer_art>mw</steuer_art> <steuersumme_betrag>1233455688</steuersumme_betrag></steuer_summe> </summen_sektion></rechnung></item></upload></soap-env:body> </SOAP-ENV:Envelope> SOAP::Transport::HTTP::Client::send_receive: HTTP/1.1 200 OK Connection: close Date: Tue, 30 Apr 2005 11:14:59 GMT Server: Apache/1.3.29 (Unix) (MA14-ADV/ESN) mod_watch/3.17 mod_ssl/2.8.16 OpenSSL/0.9.6b mod_perl/1.29 NTLM/3.1.2 Content-Length: 501 Content-Type: text/xml; charset=utf-8 Client-Date: Tue, 30 Apr 2005 11:14:56 GMT Client-Response-Num: 1 Client-Response-Num: 1 Client-SSL-Cert-Issuer: /C=AT/O=Stadt Wien/OU=MA 14/CN=Magistrat Wien CA II/Email=post@adv.magwien.gv.at Client-SSL-Cert-Subject: /C=AT/O=Stadt Wien/OU=MA 14/CN=services.wien.gv.at Client-SSL-Cipher: EDH-RSA-DES-CBC3-SHA Client-SSL-Warning: Peer certificate not verified SOAPServer: SOAP::Lite/Perl/0.55 X-DL-HatStyle: wo-neu <?xml version="1.0" encoding="utf-8"?><soap-env:envelope xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/xmlschema-instance" xmlns:xsd="http://www.w3.org/1999/xmlschema"> <SOAP-ENV:Body><UploadResponse xmlns="http://www.wien.gv.at/advecserver/ec_soap_svc/ns"> <Status>OK</Status></UploadResponse></SOAP-ENV:Body> </SOAP-ENV:Envelope> $VAR1 = 'OK'; <<<<<< 2.621128 seconds >>>>>> Classlib::dotNET::Client::call(Upload) SOAP::Transport::HTTP::Client::send_receive: POST https://services.wien.gv.at/ec_soap/ Accept: text/xml Accept: multipart/* Content-Length: 1746 Content-Type: text/xml; charset=utf-8 SOAPAction: http://www.wien.gv.at/advecserver/ec_soap_svc/ns/upload <?xml version="1.0" encoding="utf-8"?><soap-env:envelope xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/xmlschema-instance" xmlns:xsd="http://www.w3.org/1999/xmlschema"><soap-env:body><upload xmlns="http://www.wien.gv.at/advecserver/ec_soap_svc/ns"><item> <XANum>2585</XANum> <Serial>2</Serial> <rechnung><header_sektion> <rechnungs_datum>20050320</rechnungs_datum> <rechnungs_text>rechnungstext 2</rechnungs_text><rechnungs_waehrung>EUR</rechnungs_waehrung> 18

<kunden_nummer>0987654321</kunden_nummer> <buchhaltungs_abteilung>1</buchhaltungs_abteilung> <leistungs_datum>20050224</leistungs_datum> <faelligkeits_datum>20050506</faelligkeits_datum> <bestell_dienststelle>ma6</bestell_dienststelle><rechnungsleger> <name_adresse><name>franz</name><strasse>mirakelg.</strasse> <orientierungsnummer>7</orientierungsnummer><ort>wien</ort> <postleitzahl>1234</postleitzahl><staat>a</staat></name_adresse> <bank_info><kontonummer>654321</kontonummer> <bankleitzahl>12000</bankleitzahl></bank_info><kontakt> <ansprech_partner>meier</ansprech_partner> <kommunikations_nummer>3333</kommunikations_nummer> <kommunikations_medium>tel</kommunikations_medium></kontakt> </rechnungsleger></header_sektion><detail_sektion><zeile> <positions_nummer>1</positions_nummer> <positionsbeschreibung>1</positionsbeschreibung> <masseinheit>kg</masseinheit></zeile></detail_sektion> <summen_sektion><gesamtsumme_betrag>20.00</gesamtsumme_betrag> <steuer_summe><steuer_art>mw</steuer_art> <steuersumme_betrag>4</steuersumme_betrag></steuer_summe> </summen_sektion></rechnung></item></upload></soap-env:body> </SOAP-ENV:Envelope> SOAP::Transport::HTTP::Client::send_receive: HTTP/1.1 200 OK Connection: close Date: Tue, 30 Apr 2005 11:15:01 GMT Server: Apache/1.3.29 (Unix) (MA14-ADV/ESN) mod_watch/3.17 mod_ssl/2.8.16 OpenSSL/0.9.6b mod_perl/1.29 NTLM/3.1.2 Content-Length: 501 Content-Type: text/xml; charset=utf-8 Client-Date: Tue, 30 Apr 2005 11:14:58 GMT Client-Response-Num: 1 Client-Response-Num: 1 Client-SSL-Cert-Issuer: /C=AT/O=Stadt Wien/OU=MA 14/CN=Magistrat Wien CA II/Email=post@adv.magwien.gv.at Client-SSL-Cert-Subject: /C=AT/O=Stadt Wien/OU=MA 14/CN=services.wien.gv.at Client-SSL-Cipher: EDH-RSA-DES-CBC3-SHA Client-SSL-Warning: Peer certificate not verified SOAPServer: SOAP::Lite/Perl/0.55 X-DL-HatStyle: wo-neu <?xml version="1.0" encoding="utf-8"?><soap-env:envelope xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/xmlschema-instance" xmlns:xsd="http://www.w3.org/1999/xmlschema"> <SOAP-ENV:Body><UploadResponse xmlns="http://www.wien.gv.at/advecserver/ec_soap_svc/ns"> <Status>OK</Status></UploadResponse></SOAP-ENV:Body> </SOAP-ENV:Envelope> $VAR1 = 'OK'; <<<<<< 2.030154 seconds >>>>>> Classlib::dotNET::Client::call(Upload) SOAP::Transport::HTTP::Client::send_receive: POST https://services.wien.gv.at/ec_soap/ Accept: text/xml Accept: multipart/* Content-Length: 1748 Content-Type: text/xml; charset=utf-8 SOAPAction: http://www.wien.gv.at/advecserver/ec_soap_svc/ns/upload 19

<?xml version="1.0" encoding="utf-8"?><soap-env:envelope xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/xmlschema-instance" xmlns:xsd="http://www.w3.org/1999/xmlschema"><soap-env:body><upload xmlns="http://www.wien.gv.at/advecserver/ec_soap_svc/ns"><item> <XANum>2585</XANum> <Serial>3</Serial> <rechnung><header_sektion> <rechnungs_datum>20050112</rechnungs_datum> <rechnungs_text>rechnungstext 3</rechnungs_text><rechnungs_waehrung>EUR</rechnungs_waehrung> <kunden_nummer>0987612345</kunden_nummer> <buchhaltungs_abteilung>1</buchhaltungs_abteilung> <leistungs_datum>20041221</leistungs_datum> <faelligkeits_datum>20050128</faelligkeits_datum> <bestell_dienststelle>ma2</bestell_dienststelle><rechnungsleger> <name_adresse><name>fridolin</name><strasse>zauberg.</strasse> <orientierungsnummer>9</orientierungsnummer><ort>wien</ort> <postleitzahl>1111</postleitzahl><staat>a</staat></name_adresse> <bank_info><kontonummer>654123</kontonummer> <bankleitzahl>20151</bankleitzahl></bank_info> <kontakt><ansprech_partner>bauer</ansprech_partner> <kommunikations_nummer>6666</kommunikations_nummer> <kommunikations_medium>tel</kommunikations_medium></kontakt> </rechnungsleger></header_sektion><detail_sektion><zeile> <positions_nummer>1</positions_nummer> <positionsbeschreibung>1</positionsbeschreibung> <masseinheit>kg</masseinheit></zeile></detail_sektion> <summen_sektion><gesamtsumme_betrag>80.00</gesamtsumme_betrag> <steuer_summe><steuer_art>mw</steuer_art> <steuersumme_betrag>4</steuersumme_betrag></steuer_summe> </summen_sektion></rechnung></item></upload></soap-env:body> </SOAP-ENV:Envelope> SOAP::Transport::HTTP::Client::send_receive: HTTP/1.1 200 OK Connection: close Date: Tue, 30 Apr 2005 11:15:03 GMT Server: Apache/1.3.29 (Unix) (MA14-ADV/ESN) mod_watch/3.17 mod_ssl/2.8.16 OpenSSL/0.9.6b mod_perl/1.29 NTLM/3.1.2 Content-Length: 501 Content-Type: text/xml; charset=utf-8 Client-Date: Tue, 30 Apr 2005 11:15:00 GMT Client-Response-Num: 1 Client-Response-Num: 1 Client-SSL-Cert-Issuer: /C=AT/O=Stadt Wien/OU=MA 14/CN=Magistrat Wien CA II/Email=post@adv.magwien.gv.at Client-SSL-Cert-Subject: /C=AT/O=Stadt Wien/OU=MA 14/CN=services.wien.gv.at Client-SSL-Cipher: EDH-RSA-DES-CBC3-SHA Client-SSL-Warning: Peer certificate not verified SOAPServer: SOAP::Lite/Perl/0.55 X-DL-HatStyle: wo-neu <?xml version="1.0" encoding="utf-8"?><soap-env:envelope xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/xmlschema-instance" xmlns:xsd="http://www.w3.org/1999/xmlschema"> <SOAP-ENV:Body><UploadResponse xmlns="http://www.wien.gv.at/advecserver/ec_soap_svc/ns"> 20

<Status>OK</Status></UploadResponse></SOAP-ENV:Body> </SOAP-ENV:Envelope> $VAR1 = 'OK'; <<<<<< 2.055627 seconds xa_num = 2585 OK OK OK Abbildung 7: Ausgabe Perl-Client 4 Anhang Folgend die Web-Service-Beschreibung rechnungen.wsdl: <!-- edited with XMLSPY v5 rel. 4 U (http://www.xmlspy.com) by Referat ESI (MAGISTRAT DER STADT WIEN MA14-ADV) --> <definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xs="http://www.w3.org/2001/xmlschema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:t="http://www.wien.gv.at/advecserver/ec_soap_svc/ns" xmlns:s0="http://www.wien.gv.at/advecserver/ec_soap_svc/v1_0" xmlns:s1="http://www.wien.gv.at/advecserver/ec_soap_svc/ns" targetnamespace="http://www.wien.gv.at/advecserver/ec_soap_svc/v1_0" > <import namespace="http://www.wien.gv.at/advecserver/ec_soap_svc/ns" location="rechnungen.xsd"/> <types/> <message name="initxasoapin"> <part name="parameters" element="s1:initxa"/> </message> <message name="initxasoapout"> <part name="parameters" element="s1:initxaresponse"/> </message> <message name="uploadsoapin"> <part name="parameters" element="s1:upload"/> </message> <message name="uploadsoapout"> <part name="parameters" element="s1:uploadresponse"/> </message> <porttype name="servicesoap"> <operation name="initxa"> <documentation> Gibt die Anzahl der zu uebertragenden Datensaetze bekannt und liefert eine neue Transaktionsnummer. Diese ist immer aufsteigend und muss bei jedem folgenden Upload als Referenz angegeben werden. </documentation> <input message="s0:initxasoapin"/> <output message="s0:initxasoapout"/> </operation> <operation name="upload"> <documentation> Upload einer Rechnung. Dabei wird angegeben, die wievielte 21

Rechnung uebertragen wird. </documentation> <input message="s0:uploadsoapin"/> <output message="s0:uploadsoapout"/> </operation> </porttype> <binding name="servicesoap" type="s0:servicesoap"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="initxa"> <soap:operation soapaction="http://www.wien.gv.at/advecserver/ec_soap_svc/v1_0/initx A" style="document"/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> <operation name="upload"> <soap:operation soapaction="http://www.wien.gv.at/advecserver/ec_soap_svc/v1_0/uploa d" style="document"/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> </binding> <service name="ec_soap_svc"> <port name="servicesoap" binding="s0:servicesoap"> <soap:address location="https://service.wien.gv.at/ec_soap"/> </port> </service> </definitions> Abbildung 8: rechnungen.wsdl Das XML-Schema rechnungen.xsd: <?xml version="1.0" encoding="utf-8"?> <!-- edited with XMLSPY v5 rel. 4 U (http://www.xmlspy.com) by Referat ESI (MAGISTRAT DER STADT WIEN MA14-ADV) --> <!--W3C Schema generated by XMLSPY v5 rel. 4 U (http://www.xmlspy.com)--> <xs:schema targetnamespace="http://www.wien.gv.at/advecserver/ec_soap_svc/ns" xmlns:t="http://www.wien.gv.at/advecserver/ec_soap_svc/ns" xmlns:xs="http://www.w3.org/2001/xmlschema" elementformdefault="qualified"> <xs:simpletype name="count_t"> <xs:restriction base="xs:long"> <xs:totaldigits value="8"/> 22

<xs:element name="count" type="t:count_t"/> <xs:element name="geschaeftsfall"> <xs:pattern value="urs komm_st"/> <xs:element name="inititem"> <xs:complextype> <xs:element ref="t:count"/> <xs:element ref="t:geschaeftsfall"/> <xs:element name="initxa"> <xs:complextype> <xs:element ref="t:inititem"/> <xs:element name="xanum" type="xs:long"/> <xs:element name="serial" type="t:count_t"/> <xs:element name="initxaresponse"> <xs:complextype> <xs:element ref="t:xanum"/> <xs:element name="abzug"> <xs:restriction base="xs:decimal"> <xs:totaldigits value="10"/> <xs:fractiondigits value="3"/> <xs:element name="ansprech_partner"> <xs:maxlength value="35"/> <xs:element name="anzahl"> <xs:restriction base="xs:decimal"> <xs:totaldigits value="10"/> <xs:fractiondigits value="3"/> <xs:element name="auftrags_kennzahl"> <xs:restriction base="xs:positiveinteger"> 23

<xs:totaldigits value="7"/> <xs:complextype name="bank_infotype"> <xs:element ref="t:kontonummer"/> <xs:element ref="t:bankleitzahl"/> <xs:element name="bankleitzahl"> <xs:maxlength value="8"/> <xs:element name="beginn"> <xs:restriction base="xs:positiveinteger"> <xs:totaldigits value="8"/> <xs:element name="beleg_nummer"> <xs:restriction base="xs:positiveinteger"> <xs:totaldigits value="11"/> <xs:element name="bestell_dienststelle"> <xs:maxlength value="5"/> <xs:element name="bestell_nummer"> <xs:restriction base="xs:positiveinteger"> <xs:totaldigits value="7"/> <xs:element name="betriebsaufteiler"> <xs:restriction base="xs:positiveinteger"> <xs:totaldigits value="7"/> <xs:element name="buchhaltungs_abteilung"> <xs:maxlength value="2"/> 24

<xs:element name="buchungs_text"> <xs:maxlength value="50"/> <xs:complextype name="detail_sektiontype"> <xs:element name="text" type="t:texttype" minoccurs="0" maxoccurs="unbounded"/> <xs:element name="zeile" type="t:zeiletype" maxoccurs="unbounded"/> <xs:element name="dienststellen_kuerzel"> <xs:maxlength value="5"/> <xs:element name="differenz"> <xs:restriction base="xs:decimal"> <xs:totaldigits value="9"/> <xs:fractiondigits value="6"/> <xs:element name="einzel_preis"> <xs:restriction base="xs:decimal"> <xs:totaldigits value="17"/> <xs:fractiondigits value="8"/> <xs:element name="ende"> <xs:restriction base="xs:positiveinteger"> <xs:totaldigits value="8"/> <xs:element name="faelligkeits_datum"> <xs:length value="8"/> <xs:pattern value="\d+"/> <xs:element name="firmenbuch_nummer"> <xs:maxlength value="11"/> 25

<xs:element name="geburts_datum"> <xs:length value="8"/> <xs:pattern value="\d+"/> <xs:element name="geraetenummer"> <xs:maxlength value="15"/> <xs:element name="gesamtsumme_betrag"> <xs:restriction base="xs:decimal"> <xs:totaldigits value="15"/> <xs:fractiondigits value="2"/> <xs:element name="haushaltskonto"> <xs:restriction base="xs:positiveinteger"> <xs:totaldigits value="14"/> <xs:complextype name="header_sektiontype"> <xs:element ref="t:rechnungs_datum"/> <xs:element ref="t:rechnungs_text"/> <xs:element ref="t:rechnungs_waehrung"/> <xs:element name="skonto" type="t:skontotype" <xs:element ref="t:kunden_nummer"/> <xs:element ref="t:ueberrechnungs_kennzahl" <xs:element ref="t:ueberrechnungs_fall" <xs:element ref="t:buchhaltungs_abteilung"/> <xs:element ref="t:buchungs_text" <xs:element ref="t:beleg_nummer" <xs:element ref="t:leistungs_datum"/> <xs:element ref="t:faelligkeits_datum"/> <xs:element ref="t:haushaltskonto" <xs:element ref="t:bestell_dienststelle"/> <xs:element ref="t:bestell_nummer" <xs:element ref="t:teilrechnung" <xs:element ref="t:vorhabens_nummer" <xs:element ref="t:vorhabens_kennzeichen" 26

<xs:element ref="t:kostenstelle" <xs:element ref="t:kostenart" <xs:element ref="t:kostentraeger" <xs:element ref="t:betriebsaufteiler" <xs:element ref="t:auftrags_kennzahl" <xs:element ref="t:wirtschaftsgut_nummer" <xs:element ref="t:inventar_nummer" <xs:element name="rechnungsleger" type="t:rechnungslegertype"/> <xs:element name="zahlungsempfaenger" type="t:zahlungsempfaengertype" <xs:element name="leistungsempfaenger" type="t:leistungsempfaengertype" <xs:element name="inventar_nummer"> <xs:restriction base="xs:positiveinteger"> <xs:totaldigits value="7"/> <xs:element name="katalog_artikel"> <xs:maxlength value="35"/> <xs:element name="kommunikations_medium"> <xs:maxlength value="3"/> <xs:element name="kommunikations_nummer"> <xs:maxlength value="30"/> <xs:element name="konstante"> <xs:restriction base="xs:decimal"> <xs:totaldigits value="9"/> <xs:fractiondigits value="6"/> <xs:complextype name="kontakttype"> 27

<xs:element ref="t:ansprech_partner"/> <xs:element ref="t:kommunikations_nummer"/> <xs:element ref="t:kommunikations_medium"/> <xs:element name="kontonummer"> <xs:restriction base="xs:positiveinteger"> <xs:totaldigits value="16"/> <xs:element name="kostenart"> <xs:maxlength value="10"/> <xs:element name="kostenstelle"> <xs:maxlength value="10"/> <xs:element name="kostentraeger"> <xs:maxlength value="10"/> <xs:element name="kunden_nummer"> <xs:restriction base="xs:positiveinteger"> <xs:totaldigits value="10"/> <xs:element name="leistungs_datum"> <xs:length value="8"/> <xs:pattern value="\d+"/> <xs:complextype name="leistungsempfaengertype"> <xs:element ref="t:objekt" <xs:element name="name_adresse" type="t:name_adressetype"/> <xs:element ref="t:dienststellen_kuerzel" <xs:element name="kontakt" type="t:kontakttype" minoccurs="0" maxoccurs="unbounded"/> 28

<xs:element name="masseinheit"> <xs:maxlength value="5"/> <xs:element name="name"> <xs:maxlength value="48"/> <xs:complextype name="name_adressetype"> <xs:element ref="t:personennummer" <xs:element ref="t:name"/> <xs:element ref="t:vorname" <xs:element ref="t:titel" <xs:element ref="t:rechtsform" <xs:element ref="t:strasse"/> <xs:element ref="t:orientierungsnummer"/> <xs:element ref="t:ort"/> <xs:element ref="t:postleitzahl"/> <xs:element ref="t:staat"/> <xs:element name="objekt"> <xs:maxlength value="25"/> <xs:element name="ordnungszahl"> <xs:maxlength value="33"/> <xs:element name="orientierungsnummer"> <xs:maxlength value="20"/> <xs:element name="ort"> <xs:maxlength value="17"/> 29