5. Aufbau eines Preisskript

5.1. Überblick

Der Preisskript erzeugt aus den Bestellparametern die Preisdatei (price.txt). Für die Abfrage der Parameter steht eine iG/Script Bibliothek zur Verfügung. Die einzelnen Parameter bzw. die Bibliothek sind im folgenden beschrieben. Am Schluss des Kapitels ist ein vollständiges Beispiel angegeben.

5.2. Skriptparameter

Dem Preisskript werden vom GeoShop folgende Parameter in der Map OPT übergeben:

ParameterBeschreibung
productProduktname.
areaEffektiv bestellte Fläche (d.h. nach dem Schnitt mit den Tarifzonen).
fence_areaFläche des Bestellpolygon.
userBenutzername.
prefixBenutzerprefix (falls vorhanden).
topicsAusgewählte Datenebenen als kommaseparierte Liste.
polygon_rateName des Textfiles, welches die Schnittresultate mit den Tarifzonen enthält.
point_rateName des Textfiles, welches die Schnittresultate mit der Punktebene enthält.
temp_dirName des Verzeichnis in welchem temporäre Dateien abgelegt werden können. Wird vom GeoShop nach der Preisberechnung automatisch gelöscht.
logName der Logdatei.
outputName der Textdatei in welchem das Resultat der Berechnung gespeichert werden soll. Die ersten beiden Zeilen haben eine spezielle Bedeutung. 1. Zeile: Währung, 2. Zeile: Preis. Der Rest der Outputdatei wird dem Benutzer im GeoShop Client Applet angezeigt.
[Anmerkung]

Für das Auslesen der Parameter OPT.polygon_rate bzw. OPT.point_rate stehen spezielle Prozeduren in der Bibliothek \script\price.lib zur Verfügung.

5.3. iG/Script Bibliothek price.lib

Folgende Prozeduren aus der Bibliothek \script\price.lib können für die Berechnung des Preis bzw. für das Schreiben der Preisdatei benutzt werden:

PRICE_DISPLAY_INPUT [][]

Zeigt alle Inputparameter in der Logdatei an.

PRICE_CREATE_OUTPUT [][]

Erstellt eine neue, leere Preisdatei.

PRICE_WRITELN [s line][]

Schreibt eine Zeile in die Preisdatei.

PRICE_CLOSE_OUTPUT [][]

Schliesst die Preisdatei.

PRICE_SET_LOG [s logfile][]

Setzt die Logdatei auf einen bestimmten fixen Pfad (vorallem für Debuggingzwecke nützlich).

PRICE_GET_TOPICS [][]

Füllt die vordefinierte Map PRICE_TOPICS mit Einträgen der Art <Ebene> => TRUE (bzw. DEFAULT => FALSE). Nach dem Aufruf von PRICE_GET_TOPICS kann über die Map PRICE_TOPICS sehr einfach festgestellt werden, ob eine bestimmte Datenebene vom Benutzer ausgewählt wurde oder nicht.

PRICE_COUNT_TOPICS [][i count]

Gibt die Anzahl ausgewählter Datenebenen zurück.

PRICE_GET_POLYGON_RATES [][]

Füllt die vordefinierte Map PRICE_POLYGON_RATES mit Einträgen für jede Flächenart (Rate Class im GeoEditor). Der Wert für jede Flächenart ist als Faktor zwischen 0.0 und 1.0 zu verstehen (DEFAULT => 0.0). xy => 0.5 bedeutet z.B., dass 50% der Bestellfläche in der Flächenart xy liegen.

PRICE_GET_POINT_RATES [][]

Füllt die vordefinierte Map PRICE_POINT_RATES mit Einträgen für jede Punktart (Rate Class im GeoEditor). Als Wert für jede Punktart wird die Anzahl Punkte in der Bestellfläche eingetragen (DEFAULT => 0).

5.4. Beispiele

Das Beispielskript \user\script\price\price.cfg berechnet folgende Preisfunktion:

  • Für Flächen <= 10 ha wird eine Grundgebühr von SFr. 20.- und pro Datenebene ein Zuschlag von SFr. 5.- erhoben.

  • Für Flächen ] 10.0 .. 300.0] ha wird eine Grundgebühr von SFr. 100.- und pro Datenebene ein Zuschlag von SFr. 25.- erhoben.

  • Für Flächen > 300 ha wird eine Grundgebühr von SFr. 200.- und ein pro Datenebene ein Zuschlag von SFr. 50.- erhoben.

  • Es wird kein Schnitt mit Tarifzonen oder einer Punktebene gemacht.

Nachfolgend ist der vollständige Quelltext des Beispielskript price.cfg angegeben (Prozeduren der Bibliothek price.lib sind fett markiert):

|LICENSE \license\geoshop.lic
|INCL \script\price.lib

! Hilfsfunktion für die Formatierung von Preisen
PROCEDURE FORMAT_PRICE ! [r price][s result]
   'SFr. ' SWAP TO_STRING 8 RJUST APP
END_PROCEDURE

! Hilfsfunktion für die Berechnung des Tarifs
PROCEDURE CALCULATE_PRICE ! [][r price]
OPT.fence_area TO_INT 0.0001 * TO_INT => OPT.ha

! der Tarif ist abhängig von der Anzahl ausgewählter Ebenen
PRICE_COUNT_TOPICS => OPT.topcount
   IF OPT.ha <= 10 THEN
      20.0 => OPT.grundgebuehr
      5.0 OPT.topcount * => OPT.ebenengebuehr
   ELSIF OPT.ha <= 300 THEN
      100.0 => OPT.grundgebuehr
      25.0 OPT.topcount * => OPT.ebenengebuehr
   ELSE
      200.0 => OPT.grundgebuehr
      50.0 OPT.topcount * => OPT.ebenengebuehr
   END_IF
   OPT.grundgebuehr OPT.ebenengebuehr + => OPT.price
END_PROCEDURE

! Hauptprogramm

'price.log' PRICE_SET_LOG ! Logdatei für Fehlermeldungen setzen
PRICE_DISPLAY_INPUT ! Alle Inputparameter anzeigen
PRICE_CREATE_OUTPUT ! Leeres price.txt erzeugen

   ! calculate price
   CALCULATE_PRICE
   ! header
   OPT.price TO_STRING PRICE_WRITELN ! 1. Zeile price.txt mit Preis
   'SFr' PRICE_WRITELN ! 2. Zeile price.txt mit Währung

   ! info
   OPT.ha TO_STRING . ' ha' 14 LJUST . ': '
      OPT.grundgebuehr FORMAT_PRICE APP PRICE_WRITELN ! 1. Ausgabe

   OPT.topcount TO_STRING . ' Ebenen' 14 LJUST . ': '
      OPT.ebenengebuehr FORMAT_PRICE APP PRICE_WRITELN ! 2. Ausgabe

   '-----------------------------' PRICE_WRITELN ! etc.
   'Zwischentotal' 14 LJUST . ': '
   OPT.price FORMAT_PRICE APP PRICE_WRITELN
   '-----------------------------' PRICE_WRITELN

   'Demorabatt' 14 LJUST . ': '
      OPT.price -1.0 * FORMAT_PRICE APP PRICE_WRITELN

   'Netto' 14 LJUST . ': '
      0.0 FORMAT_PRICE APP PRICE_WRITELN

   'MwSt. 7.6%' 14 LJUST . ': '
      0.0 FORMAT_PRICE APP PRICE_WRITELN

   '-----------------------------' PRICE_WRITELN

   'Total' 14 LJUST . ': '
      0.0 FORMAT_PRICE APP PRICE_WRITELN

   '=============================' PRICE_WRITELN

PRICE_CLOSE_OUTPUT ! price.txt schliessen

Ein komplexeres Beispiel (nach Modell Buschor) ist im Skript \user\script\price\zh.cfg enthalten (inkl. Schnitt mit Tarifzonen).

5.5. Angabe des Preisskript in der Produktdatei

Schlussendlich muss der Preisskript (hier z.B. \script\price\price.cfg) einem GeoShop Datenprodukt zugeordnet werden (hier z.B. \user\products\dxf.pro). Dazu muss man in der .pro Produktdatei folgenden zusätzlichen Eintrag machen (fett markiert):

PRODUCT
   name STRING dxf
   display_name STRING GEOBAU2/DXF
   models LIST
      MODEL
         name STRING Grunddatensatz
         display_name STRING 'amtl. Vermessung'
         topics LIST
            STRING Fixpunkte
            STRING Liegenschaften
         }
      }
      MODEL
         name STRING SIA405_mit_Erweiterungen
         display_name STRING 'SIA Werkleitungen'
         topics LIST
            STRING SIA405_Abwasser
            STRING SIA405_Wasser
            STRING SIA405_Kabelkommunikation
         }
      }
   }
   params MAP
   }
   services MAP
      Grunddatensatz STRING il2dxf
      SIA405_mit_Erweiterungen STRING il2dxf
   }
   price_function STRING \script\price\price.cfg
}

Die vollständige Syntax für den price_function Eintrag lautet:

price_function STRING <script>,<layer>

Falls der Preisskript auf die Berechnung eines Schnitts von Bestellpolygon mit den Tarifzonen bzw. einer Punktebene angewiesen ist, muss in <layer> der entsprechende Layer angegeben werden, in welchem die PolygonRate bzw. PointRate Objekte enthalten sind.

[Anmerkung]

Nur wenn dem ausgewählten Produkt ein Preisskript zugeordnet wurde, wird dem Benutzer das Menü Bestellen>Preis berechnen angezeigt.