PHP5 und BiPRO Teil II

Ich stecke aktuell mal wieder in einem BiPRO Projekt und stoße hier und da auf ein paar Schwierigkeiten bei der Umsetzung. Da die Umsetzung mit PHP5 sehr umfangreich ist und der Support seitens der Versicherer mit Hinblick auf PHP5 sehr minimal ist, möchte ich Euch hier an ein paar Lösungsansätzen teilhaben lassen.

Die hier gezeigten Code Beispiele basieren auf einer objektorientierten Programmierung mit PHP5 und den in PHP5 enthaltenen Soap Objekten. Es werden also keine XML Schemata als String hardcodiert und dann versendet. Sämtliche XML Schemata werden allein vom PHP Soap Client anhand der vom jeweiligen Versicherer gelieferten WSDL Datei erstellt.

Heute bin ich im Zusammenhang mit der BiPRO Norm auf folgenden Fehler gestoßen:

The type definition cannot be abstract for element ns3:Partner

Nach einer eingehenden Prüfung des XML Schemas stellte sich heraus, dass der Versicherer bei der Tarifierung den Knoten „Partner“ mit einer Typen Definition ausgestattet hat. Dies geht nicht aus den XSD Definitionen hervor, sondern ist lediglich in den Beispiel Requests des jeweiligen Versicherers zu sehen.

Hat man die Objekte der BiPRO Norm (Complex Types) vernünftig für PHP aufgelöst, sehen die zu verwendenden Objekte für den Partner Knoten in etwa so aus:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/**
 * Struct CT_Person
 */
class CT_Person extends CT_Partner {
    protected $Vorname = null;
    protected $Geburtsdatum = null;
    protected $Geschlecht = null;
    protected $Titel = null;
    protected $Geburtsort = null;
    protected $Stsangehoerigkeit = null;
    protected $Familienstand = null;
    protected $Adelspraedikat = null;
    protected $Geburtsname = null;
    protected $Geburtsland = null;
    protected $InDeutschlandAnsaessigSeit = null;
    protected $Steueridentifikationsnummer = null;
    protected $Ausweis = null;
    protected $GesetzlicheKrankenversicherung = null;
    protected $Einkommenssteuer = null;
    protected $Berufstaetigkeit = null;
    protected $Einkommen = null;
    protected $Haushalt = null;
    protected $Ausbildung = null;
    protected $Gesundheitsdaten = null;
 
    public function __construct( ... ) { ... }
}
 
/**
 * Struct CT_Partner
 */
abstract class CT_Partner {
    protected $Anrede = null;
    protected $Name = null;
    protected $Namenszusatz1 = null;
    protected $Namenszusatz2 = null;
    protected $PartnernummerVU = null;
    protected $PartnernummerVM = null;
    protected $Vorsteuerabzugsberechtigt = null;
    protected $PartnerID = 0;
    protected $Anschrift = null;
    protected $ZusaetzlichePartnerdaten = null;
    protected $Kommunikationsverbindung = null;
    protected $Bankverbindung = null;
    protected $HandeltAufRechnungVon = null;
    protected $Gruppenvertragspartner = null;
    protected $Partnerbeziehung = null;
    protected $Vertrauensperson = null;
 
    public function __construct( ... ) { ... }
 
    public function __set($name, $value) {
        $this->{$name} = $value;
    }
 
    public function __get($name) {
        return isset($this->{$name}) ? $this->{$name} : null;
    }

Verwendet man diese Objekte nun direkt für den Soap Client könnte Euer Code wie folgt aussehen:

1
2
3
4
5
6
7
8
9
10
11
12
13
try {
    $client = new SoapClient('DeineWsdlDatei.wsdl');
    $params = new CT_QuoteRequest(
        ...
        new CT_Person(
            ...
        )
        ...
    );
    $response = $client->getQuote($params);
} catch (SoapFault $e) {
    // error handling
}

Unter normalen Umständen ist es vollkommen ausreichend, wenn man die Objekte direkt so übergibt, wie ich es im oben genannten Beispiel getan habe. Leider ist es aber in meinem Fall so, dass der Versicherer dem Partner Knoten noch ein Attribute „type“ mitgegeben hat, ohne das das komplette XML Schema invalide ist. Wenn ich den Request also wie oben beispielhaft dargestellt absende, bekomme ich folgendes XML Schema:

1
2
3
<ns3:partner>
...
</ns3:partner>

Ein reiner Knoten ohne Attribute. Wie gebe ich also ohne großen Aufwand dem Knoten Partner das vom Versicherer verlangte Type Attribut mit auf den Weg? Wie schon im vorhergehenden Teil beschrieben, ist es gar nicht so schwer BiPRO Webservices Attribute mit auf den Weg zu geben. In diesem Fall ist es sogar noch weitaus einfacher. Folgendes Beispiel zeigt, wie man ein Attribut in einem Knoten realisieren kann, ohne dabei die Objekte, welche die BiPRO Norm für PHP nachbilden, erweitern zu müssen.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
try {
    $client = new SoapClient('DeineWsdlDatei.wsdl');
    $params = new CT_QuoteRequest(
        ...
        new SoapVar(
            new CT_Person(
                ...
            ),
            SOAP_ENC_OBJECT,
            'CT_Person',
            'http://www.bipro.net/namespace/partner'
        )
        ...
    );
    $response = $client->getQuote($params);
} catch (SoapFault $e) {
    // error handling
}

Das daraus resultierende XML Schema sieht dann wie folgt aus:

1
2
3
<ns3:partner xsi:type="ns2:CT_Person">
...
</ns3:partner>

Somit ist das XML Schema auch valide und wird vom Webservice des Versicherers auch angenommen. Das SoapVar Objekt funktioniert hier theoretisch als Mantel und so ist man in der Lage für diesen spezifischen XML Knoten einen neuen Typen und einen gesonderten Namespace anzugeben.

Warum eine objektorientierte Umsetzung für BiPRO?

Der Vorteil einer objektorientierten Umsetzung liegt auf der Hand: die Wiederverwendbarkeit von Programmcode. Ich kann mit den PHP Objekten, welche die Structs der BiPRO Norm repräsentieren sehr viel effezienter arbeiten. Während ich bei den ersten BiPRO Projekten noch lange String-Verkettungen in den PHP Code setzte, und für jeden Request quasi die gleichen Strings erneut in den Code schrieb, kann ich die jetzigen Objekte einfach neu aufrufen. Der PHP Code ist sehr viel genauer und wartungsärmer und durch die seit PHP5 vorhandene SOAP Erweiterung erstellt das XML Schema voll automatisch.

Ein großer Nachteil bleibt aber die nicht einheitliche Umsetzung der Versicherer. Während die von mir zuvor umgesetzten Anbindungen an Webservices von Versicherungen keinerlei Probleme mit Attributen in einem Knoten hatten, stoße ich nun auf diese Variante eines BiPRO Webservices.

Fragen? Aufträge?

Nutzt einfach die Kommentarfunktion für Eure Fragen. Ihr kommt mit der BiPRO Norm oder der Anbindung eines Webservices auf Basis der BiPRO Norm nicht zurecht? Meldet Euch einfach und wir schauen gemeinsam, was man tun kann, wenn der BiPRO Support bei PHP Fragen mal wieder nicht helfen kann.

About Author: Marcel
Ich bin Senior PHP Developer bei MM Newmedia. Seit 2005 bin ich begeisterter Webentwickler und arbeite als Freelancer für namenhafte Firmen und entwickle jede Menge abgefahrenes Zeug und berichte darüber in meinem Blog.

Kommentar verfassen

Werbung