Die folgende technische Information ist für Portalbetreiber. Der Anwender der Software braucht dies nicht lesen. 

Die Openfewo-Schnittstelle:

Eine dynamische XML-Schnittstelle für alle Ferienwohnungsdaten. Es gibt eine Vielzahl von Schnittstellen zwischen Vermieterprogrammen und Portalbetreibern die eine Übertragung von Belegtzeiten, Preisen, Bildern, Objekteigenschaften ermöglichen sollen. Ein besonderes Problem, ist die große Datenmenge wenn die Zahl der Kunden und Objekte steigt. Trotz der großen Datenmange müssen einige Daten z.B. Belegtmeldungen in Echtzeit verfügbar sein um Doppelbelegungen zu vermeiden. Dies führt dann zu Notlösungen wie diese: Bilder, Preise, Beschreibungstexte werden erst nachts kopiert, wenn die Server mehr Kapazitäten haben. Die Kunden wundern sich dann, weshalb ihre Änderungen nicht übernommen werden. Dieses Problem lässt sich vermeiden, wenn man alle Daten dynamisch überträgt. Die Openfewo-Schnittstelle soll dies ermöglichen. Openfewo bietet eine zeitnahe bzw. direkte Übertragung aller Daten ohne dabei die Server mit großen Datenmengen zu belasten. Und so funktioniert es: Fewo-Line sendet eine kleine Notification an den Empfänger. Es wird über alle Änderungen des Anwenders informiert. Die Nachricht ist so aufgebaut. Beispiel: https://www.meine-beispielwebseite.de/nachrichtenempfang.php?user=1234&changes=b Die gewünschte URL wird unter "erweitert" angelegt. Parametername "url" Beispiel url=https://www.meine-beispielwebseite.de/nachrichtenempfang.php Diese Einstellungen können für Portale fest definiert werden damit der Anwender später nur das Portal auswählen muss. Der Nachrichtenempfänmger antwortet dann mit "success" damit der Sender die Nachricht nicht erneut sendet. Es wird max 5x versucht. Sofern eine andere Erfolgsmeldung ausgewertet werden soll, kann man dies in der Konfiguration der Schnittstelle unter dem Parameter success_key hinterlegen. Es wird, an die vom Partner hinterlegte PUSH-URL gesendet. Die einzigen Infos sind user + changes, also was sich geändert hat.
b Belegung
o Objekt
j Bild
p Parameter oder Eigenschaften
t Textblock
s Saisonzeit
e Preis
m manuelle Testnachricht
Kombinationen sind auch möglich. Wenn z.B. eine Saisonzeit und ein Bild geändert wurden, würde changes=sj als Nachricht an den Pushempfänger gehen. Bei Belegungsänderungen wird die Nachricht sofort versendet. Bei allen anderen Änderungen wird 5 Minuten gewartet, ob noch weitere Änderungen hinzukommen. So wird verhindert, dass bei Konfigurationsarbeiten des Anwenders, ständig Nachrichten an den Partner gehen. Die Information in der Nachricht ist ohnehin nur grob und wird vom Empfänger meistens nicht ausgewertet. Wichtig ist aber zu wissen, dass nun per PULL wieder abgerufen werden soll um die aktualisierten Daten zu bekommen. Nach Erhalt der Nachricht fragt der Partner über vereinbarte URL den Server der Vermietersoftware mit http-GET die genauen Informationen ab. Die Schnittstelle wird nur mit dem GET-Parametern "lc" und "ob" gesteuert. "lc" (last change) ist ein Zeitstempel. Das Portal fragt alle Änderungen ab, die sich seit dem Zeitpunkt "lc" ergeben haben. Beispiel für eine Anfrage des Portals an die Vermietersoftware: http://www.fewo-line.de/converter.php?pt=schnellsuchesylt&auth=12345&lc=1970-01-01+00:00:00 Es werden weder bestimmte Kunden noch bestimmten Objekte abgefragt. Es kommt immer alles was sich seit dem Abfragezeitpunkt "lc" geändert hat. Dabei wird immer die feste XML-Baum-Struktur eingehalten. So läuft z.B. eine dynamische Kommunikation ab: Das Portal fragt die Vermieterfoftware: Gib mir alle Änderungen seit "lc=2014-10-04 14:31:55" Die Vermietersoftware antwortet: es gibt keine Änderungen Du hast jetzt den Wissensstand von "lc=2014-10-04 14:43:20" es wurden alle Daten komplett gesendet "ob=complete" Das Portal merkt sich "lc=2014-10-04 14:43:20" Nächster Aufruf einige Minuten später. Das Portal fragt Vermietersoftware: Gib mir alle Änderungen seit "lc=2014-10-04 14:43:20" Die Vermietersoftware antwortet: Der Kunde 47 hat ....... in Objekt 44: ............. das Bild 53 bearbeitet ............. den Preis mit der id=3456 geändert ............. einen Beschreibungstext mit der id=23432 gelöscht ............. eine Belegung eingetragen ....... in Objekt 33: ............. wurden neue Objekteigenschaften hinzugefügt Du hast jetzt den Wissensstand von "lc=2014-10-04 14:45:41" es wurden alle Daten komplett gesendet "ob=complete" Die Variable "ob" kann im Normalbetrieb weggelassen werden. Nur wenn (z.B. bei einer Erstübertragung) die Datenmange zu groß ist, bricht die Vermietersoftware nach 20000 Zeilen oder einer Laufzeit 20 Sekunden ab und übergibt in der xml-variable "ob" ein Lesezeichen, bis zur welcher Objektnummer die Übertragung gekommen ist. Das angefangene Objekt wird dabei noch zu Ende übertragen und die xml-Struktur geregelt geschlossen. Wenn die Übertragung z.B. bei der Nummer "ob=50.6" endete muss der nächste Aufruf so z.B. lauten: "http://www.fewo-line.de/converter.php?pt=schnellsuchesylt&auth=12345&lc=1970-01-01+00:00:00&ob=50.6" Nun wird die Übertragung erst bei dem Objekt 50.6 begonnen. Sofern die verbleibende Datenmenge noch immer zu groß ist, wird wieder ein neues Lesezeichen gesendet. So sind timeouts ausgeschlossen. Daten nur für einen bestimmten user abfragen: Diesen Parameter hinzufügen name=username Nur bestimmte Daten abfragen: Diesen Parameter hinzufügen par=objects,saisons,ratings,abort_cond,text_blocks,pictures Die gewünschten Parameter mit Kommar getrennt auflisten. Die Bedingungen "range condition" und "range condition2" sind mit UND zu verknüpfen. Der Preis oder die Abbruchbedingung gilt also nur, wenn beide Bedingungen (condition and condition2) gleichzeitig erfüllt sind. Beispiel für einen Kommunikationsablauf bei Erstkontakt (Totalabgleich): 1) Portal fragt Vermietersoftware: Gib mir alle Änderungen seit dem "lc=1970-01-01 00:00:00" (Also seit dem Anfang der Zeitrechnung) 2) Die Vermietersoftware antwortet in xml: "lc=1970-01-01 00:00:00 ob=50.6" (Das Portal merkt sich die beiden Parameter lc und ob und fragt erneut an) 3) Portal fragt Vermietersoftware: Gib mir alles seit "lc=1970-01-01 00:00:00" aber erst ab dem Objekt "ob=50.6" 5) Vermietersoftware antwortet: Du hast jetzt den Datenstand von "lc=2014-10-04 14:31:55" und 100% der Objekte "ob=complete" Sofern der Kundenstamm erst nach und nach aufgebaut wird, könnte man sich auch überlegen, die Variante "Erstübertragung" in der Programmierung seiner Schnittstelle einzusparen. Es soll nur erwähnt sein, sofern gleich zu Anfang riesige Datenmengen anfallen sollten. Die PULL Anfrage wird nur über die beiden oben beschriebenen GET-Parameter lc und ob gesteuert. Es gibt dann noch feste Parameter pt = Portalname und auth = Portalpasswort Die Vermeitersoftware antwortet in einer XML-Struktur: Die abzufragernde Datenmenge kann durch Filter eingeschränkt werden: In der Variable "name" kann der Benutzername des Users angegeben werden. Also nicht die Seriennummer sondern der interne User auf dem Zielportal. Sofern dieser Parameter angegeben ist, werden nur Daten dieses Users ausgegeben. In der Variable "par" kann zusätzlich ausgewählt werden, welche Daten ausgegeben werden sollen. Diese werden durch Komma getrennt. z.B. par=objects,saisons,ratings,text_blocks,pictures Ist "par" nicht angegeben, werden alle Gruppen ausgegeben.
Aufbau der XML-Struktur: Beispiel einer XML-Quelle Hier sehen Sie alle Kunden, die zu www.schnellsuche-sylt.de eine Schnittstelle angelegt haben. Der aktuell beschriebene Verzweigung im XML-Baum ist unten jeweils als Überschrift in braun hervorgehoben. • openfewo
  users        = alle user die eine Schnittstelle zu dem abfragenden Portal eingerichtet haben.
  next_request = enthält den oben beschriebenen Zeitstempel "lc" und das Lesezeichen "ob" die in der Anfrage als auch in der Antwort 
                 verwendet werden
• openfewo/next_request
  lc = last change 
  ob = object (Lesezeichen sofern Übertragung abgebrochen wurde)
• openfewo/users
  lc   = last change, 
  id   = interne id des users
  akt  = aktiv (y/n) Ist der Benutzer aktiv oder hat der Benutzer das Zielportal vorübergehend deaktiviert
  ser  = Seriennummer der Software = Kundennummer des Fewo-Line-Kunden   
  name = Benutzername des Kunden auf dem abfragenden Portal 
  nr   = interne Fewo-Line Zielnummer. Laufende Nummer der vom Kunden eingerichteten Schnittstelle 
• openfewo/users/user
  objects     = Objekte 
  saisons     = Saiaonzeiten 
  ratings     = Preise 
  text_blocks = Texte/Beschreibungen
  pictures    = Bilder
• openfewo/users/user/objects
 lc   = last change
 id   = interne id des Objektes
 akt  = aktiv (y/n) Ist das Objekt noch aktiv?
 nr   = interne Objektnummer (fortlaufend pro user)
 map  = mapping Objektname bzw. Objectcode beim abfragenden Portal
In diesem Beispiel ist zu sehen, das der Benutzer für das Objekt 6 keinen Mappingcode eingegeben hat, weil er es bei dem abfragenden Portal nicht anbietet. • openfewo/users/user/objects/object
  occupancys = Belegungen
  parameters = Objekteigenschaften 
• openfewo/users/user/objects/object/occupancys
 lc    = last change
 id    = interne ID der Belegung
 akt   = aktiv (y/n)  Bei "n" ist Belegung gelöcht 
 start = Belegung von 
 end   = Belegung bis
 typ   = Art der der Belegung: 
        "bb" = verbindliche Buchung   (Kalender belegt)
        "ba" = verbindliches Angebot  (Kalender belegt)
        "ff" = freibleibendes Angebot (Kalender bleibt frei)
        "fs" = Stornierung            (Kalender bleibt frei)
        "d"  = gelöscht               (Kalender bleibt frei)

• openfewo/users/user/objects/object/parameters:
  localname    = (url-codiert) Lokaler Objektname wie er vom Kunden verwendet wird (20 Zeichen)
  house        = (url-codiert) Name des Hauses (20 Zeichen)
  title        = (url-codiert) Objekttitel, Kurzbeschreibung (60 Zeichen)
  description  = (url-codiert) Objektbeschreibung
  street       = (url-codiert) Straße (40 Zeichen)
  zip          = (url-codiert) Postleitzahl 
  city         = (url-codiert) Ort (40 Zeichen)
  rooms        = Zahl der Räume
  persnor      = Zahl der Personen Normalbelegung
  persmax      = Zahl der Personen Maximalbelegung
  public       = (y/n) Das Objekt soll öffentlich sichtbar sein
  price_group  = (url-codiert) Preisgruppe, vom Kunden frei definierbar. Diese findet sich unten pei den Preisen wieder
  spa_location = (url-codiert) Kurort, vom Kunden frei definierbar. Diese findet sich unten pei den Preisen wieder
  object_id    = Laufende interne Objektnummer, fortlaufend pro Kunden
  properties   = Objekteigenschaften
• openfewo/users/user/objects/object/parameters/properties
  property = Die Objektmerkmale werden in Klartext übertragen. Das Abfragende Portal sucht sich nur die Merkmale heraus,
             die es lesen kann und ignoriert die anderen. Fewo-Line sendet über eine interne Namensübersetzung die benötigten 
             Schlüsselworte.
• openfewo/users/user/objects/object/parameters/saisons
 
saison_grp = Saisonzeitengruppe. Verschiedene Gruppen sind z.B. Notwendig, wenn die Kurkartenpreise zu einem anderen Zeipunkt
             von Saison A nach B wechseln, als die Mietpreise 
• openfewo/users/user/saisons/saison_grp/saison
  lc    = last change
  id    = interne ID
  akt   = aktiv (y/n)  Bei "n" ist die Saisonzeit gelöcht 
  start = Datum von
  end   = Datum bis
  value = Wert der Saisonzeit. Möglich sind "a1" bis "k1" sowie "a2" bis "k2"
          Zu diesen Wert wird in den Preisen wieder Bezug genommen.   
• openfewo/users/user/ratings
  lc    = last change
  id    = interne ID
  akt   = aktiv (y/n)  Bei "n" ist der Preis gelöcht 
• openfewo/users/user/ratings/rate
   title           = (url codiert) Name der Leistung 
   value           = Preis 
   currency        = Währung
   unit            = % (wird nur angegeben wenn der Preis prozentual ist)
   base            = Grundlage für den prozentualen Preis. Die Bezeichnung kann je nach aktuellem Steuersatz abweichen:
                    "own_sales_tax_0"  = % auf Eigene Umsätze mit  0% MwSt.
                    "own_sales_tax_7"  = % auf Eigene Umsätze mit  7% MwSt. 
                    "own_sales_tax_5"  = % auf Eigene Umsätze mit  5% MwSt. 
                    "own_sales_tax_19" = % auf Eigene Umsätze mit 19% MwSt. 
                    "own_sales_tax_16" = % auf Eigene Umsätze mit 16% MwSt. 

                    "commission_sales_tax_0"  = % auf Provi. Umsätze Eigentümer mit  0% MwSt.  
                    "commission_sales_tax_7"  = % auf Provi. Umsätze Eigentümer mit  7% MwSt.  
                    "commission_sales_tax_5"  = % auf Provi. Umsätze Eigentümer mit  5% MwSt.
                    "commission_sales_tax_19" = % auf Provi. Umsätze Eigentümer mit 19% MwSt. 
                    "commission_sales_tax_16" = % auf Provi. Umsätze Eigentümer mit 16% MwSt. 

                    "guest_to_owner_tax_0"  = % auf Gast an Eigentümer mit  0% MwSt.
                    "guest_to_owner_tax_7"  = % auf Gast an Eigentümer mit  7% MwSt. 
                    "guest_to_owner_tax_5"  = % auf Gast an Eigentümer mit  5% MwSt. 
                    "guest_to_owner_tax_19" = % auf Gast an Eigentümer mit 19% MwSt. 
                    "guest_to_owner_tax_16" = % auf Gast an Eigentümer mit 16% MwSt. 
                    
                    "lessor_to_owner_tax_0"  = % auf Vermieter an Eigentümer mit  0% MwSt.
                    "lessor_to_owner_tax_7"  = % auf Vermieter an Eigentümer mit  7% MwSt.
                    "lessor_to_owner_tax_5"  = % auf Vermieter an Eigentümer mit  5% MwSt.
                    "lessor_to_owner_tax_19" = % auf Vermieter an Eigentümer mit 19% MwSt.
                    "lessor_to_owner_tax_16" = % auf Vermieter an Eigentümer mit 16% MwSt.

                    "all_sales_tax_0"   = % auf alle Umsätze mit  0% MwSt.
                    "all_sales_tax_7"   = % auf alle Umsätze mit  7% MwSt.
                    "all_sales_tax_5"   = % auf alle Umsätze mit  5% MwSt.
                    "all_sales_tax_19"  = % auf alle Umsätze mit 19% MwSt.
                    "all_sales_tax_16"  = % auf alle Umsätze mit 16% MwSt.

                    "total"            = % auf die Endsumme
                    "guest_card_tax_0" = % auf Transit Gästekarten
                    "payments"         = % auf Zahlungen
                    "services_whose_name_is" = % auf alle Leistungen dessen Name dem Feld "service_name" entspricht
 
   service_name    = Leistungsname dessen Summe als Grundlage für die Prozentuale Berechnung verwendet werden soll                               
   
   valid condition = Dieser Preis gilt wenn diese Bedingung zutrifft
                     Diese Bedingungen können in condition verglichen werden 
                     "alltime"       = es gibt keine Bedingung, gilt immer
                     "spa_location"  = Der Kurort entspricht dem "match" 
                     "house"         = Der Hausname entspricht dem "match"
                     "price_group"   = Die Preisgruppe entspricht dem "match"
                     "object_id"     = Die Objektnummer entspricht dem "match"
                     "localname"     = Der lokale Objektname entspricht dem "match" 
                     "item_each"     = Eine andere Leistung im Warenkorb entspricht dem "match". 
                                       Zahl der optionalen Hauptleistung übernehmen.
                     "item_once"     = Eine andere Leistung im Warenkorb entspricht dem "match". 
                                       Zahl immer eins, egal wie oft eine optionale Hauptleistung ausgewählt wurde.  
 
                     
   optional        = y/n
   per_unit        = Der Preis wird auf die folgende Einheit berechnet
                     "booking"           = Buchung
                     "night"             = Nacht
                     "person"            = Person
                     "night_and_person"  = Nacht und Person
                     "night_and_adult"   = Nacht und Erwachsenen
                     "night_and_kid"     = Nacht und Kind
                     "night_and_spa_fee" = Nacht und Kurabgabepflichtiger Person
                     "person_hide"       = Person (in den Übernachtungspreis einrechnen ... also verstecken)
                     "booking_hide"      = Buchung(in den Übernachtungspreis einrechnen ... also verstecken) 
                      
 
   tax_rate        = Steuersatz
   saison name     = Sofern der Preis saisonzeitabhängig ist, steht hier der wert der Saisonzeit
   range condition = Einschränkungsbedingung min/max. Der Preis gilt nur wenn dies auch zutrifft 
                     Die folgenden Möglichkeiten können eintreten: 
                     "none"              = also keine Einschränkung                         
                     "stay"              = Aufenthaltsdauer in Tagen                        
                     "day_of_stay"       = Numerischer Tag des Aufenthaltes                    
                     "day_of_week"       = Nummer des Wochentages (So=7)";
                     "number_of_persons" = Zahl der Personen            
                     "number_of_days_before_arrival" = Tage vor Anreise 
                     "age_of_person"     = Lebensalter der Person              
 

• openfewo/users/user/text_blocks
  lc    = last change
  id    = interne ID
  akt   = aktiv (y/n)  Bei "n" ist der Text gelöscht
• openfewo/users/user/text_blocks/text_block
  blockname = Variablenname des Textes. Diese Variablen können auftreten:
             "rating"          = Zusatzinformation zu den Preisen   
             "location"        = Lage des Objektes
             "outside"         = Information zum Außenbereich
             "lessor_address"  = Vermieteradresse
             "lessor_phone"    = Telefon
             "lessor_mobile"   = Mobil
             "lessor_fax"      = Fax
             "lessor_mail"     = Mailadresse

  valid    = Bedingung unter der dieser Text zutrifft
             Diese Bedingungen können in condition verglichen werden (identisch wie bei den Preisen) 
             "alltime"       = es gibt keine Bedingung, gilt immer         
             "spa_location"  = Der Kurort entspricht dem "match" 
             "house"         = Der Hausname entspricht dem "match"
             "price_group"   = Die Preisgruppe entspricht dem "match"
             "object_id"     = Die Objektnummer entspricht dem "match"
             "localname"     = Der lokale Objektname entspricht dem "match" 

  text     = (url codiert)  Textinhalt/Information
• openfewo/users/user/pictures
  lc    = last change
  id    = interne ID
  akt   = aktiv (y/n)  Bei "n" ist das Bild gelöcht 
• openfewo/users/user/pictures/picture
  title  = (url codiert) Bildtitel
  type   = Dateiformat jpg oder png
  pix    = Abmessungen des Quellbildes 

  object = Information ob innen oder außen. Wenn innen dann kommt der Mappingcode 
           des Objektes beim abfragenden Portal
           Parameter inside y/n 
  
  link   = Endung des Downloadlinks für das Bild. Bei Fewo-Line lautet der Link:
           http://www.fewo-line.de/webclient/index.php?cl=img&n=(+Endung)
           z.B. http://www.fewo-line.de/webclient/index.php?cl=img&n=21.4.7
           Für bestimmte Abmessungen ist nach der Endung die gewünschte Abmessung hinzuzufügen
           z.B. http://www.fewo-line.de/webclient/index.php?cl=img&n=21.4.7.600x400

Zur übergeordneten Hilfeseite