ECommerce: Unterschied zwischen den Versionen

Aus OrgaMon Wiki
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
 
(130 dazwischenliegende Versionen von 5 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
Die B2B Fähigkeiten des OrgaMon ermögchen es Dienstleistungen des OrgaMon von aussen zu benutzten. Dazu wird im Moment, die von jedem System beherschte XML-RPC Schnittstelle benutzt. Der benutzte TCP/IP Port ist frei einstellbar.
OrgaMon biete eine vielzahl von Kopplungsmöglichkeiten, die es dem Kunden oder Geschäftspartner ermöglichen auf Informationen und Daten zuzugreifen und Prozesse anzustossen.  


* Lieferanten
Lieferanten können ihre Systeme mit OrgaMon koppeln, und beispielsweise die Liste der noch zu liefernden Artikel abrufen
* Kunden
Kunden können ebenfalls uber diese Schnittstelle Zahlungsverpflichtungen oder alte Belege einsehen.
Die B2B Fähigkeiten des OrgaMon ermöglichen es Dienstleistungen des OrgaMon von aussen zu benutzten. Dazu wird im Moment, die von jedem System beherschte XML-RPC Schnittstelle benutzt. Der benutzte TCP/IP Port ist frei einstellbar.
* Webshop
Der Webshop nutzt neben der Datenbankverbindung vorzugsweise Funktion aus der XML-RPC-API.


== Funktions Überblick ==
== Funktions Überblick ==


Erstmalig werden Funktionen f?ch䦴sabl䵦e aus OrgaMon in einem
Der OrgaMon verwendet einen betriebswirtschaftlichen Kernel. In diesem Teil des Quelltextes (eCommerce) sammelt sich die Verarbeitungslogik für alle wesentlichen Buchungsvorgänge (z.B. Zahlungseingang, Warenzugang, Versandbuchung usw.). Eine ausgewählte Zusammenstellung von Kernel-Funktionen sind via XMLRPC von aussen zugänglich. Somit ist es dem TWebShop möglich grosse Teile der Logik via XMLRPC dem OrgaMon zu überlassen.
Zentralen Modul (eCommerce) gesammelt. Das Ziel ist, den ganzen Webshop
bzw. alle Webanfragen ausschlie߬ich ?as eCommerce Modul laufen zu
lassen. Dabei werden auch erstmals "r" Connections und "w" Connections
eingesetzt, was dem zuk?en raib-Server zugute kommt (Clustering).
Nun eine Liste aller eCommerce Funktionen:


== Funktionsindex "XML-RPC-Verf?quot; ==
* mit <code>query;</code> markierte Funktionen ändern nichts an der Datenbank, die Funktionen laufen "read-only" ab
* mit <code>command;</code> markierte Funktion verändern die Daten der Datenbank, Datensätze werden geändert gelöscht oder eingefügt, Dateien im Dateisystem werden erstellt


    abu.ArtikelSuche(SuchStr: string): array of integer; { ARTIKEL_R }
== XMLRPC API (cOrgaMon-Web) ==
    // Suchmaschine f?ikelsuche


     abu.ArtikelPreis(AUSGABEART_R, ARTIKEL_R:integer): double;
=== BasePlug ===
<syntaxhighlight lang="Delphi">
     BasePlug():array of string; query;
    // BasePlug enthält wichtige Umgebungsinformationen für den konnektierten
    // WebShop. So erfährt der WebShop z.B. über BasePlug auf welche Datenbank
    // er konnektieren soll. Oder wo Musik-Downloads zu finden sind. BasePlug
    // verhindert redundante Parametrierung von Shop und OrgaMon. In der Regel
    // liefert BasePlug alle Infos an den Shop die er braucht.
    //
    // Bedeutung der einzelnen Zeilen:
    //
    // [00] Datenbank-Verbindungsstring
    // [01] Anwendungsname mit Versionsnummer
    // [02] Datenbank-Layer mit Versionsnummer
    // [03] Indy Versions-Nummer
    // [04] PDF Pfad (public) (Parameter [[Systemeinstellungen#PDFPathShop]])
    // [05] Musik Pfad (Parameter [[Systemeinstellungen#MusicPath]])
    // [06] Pfad zu den Rechnungen (Parameter [[Systemeinstellungen#htmlPath]])
    // [07] Pfad der Artikel-Bilder (Icons und Logos auf externer Site) (Parameter [[Systemeinstellungen#BilderURL]])
    // [08] GUI: TPicUpload Versions-Nummer (Bilder hochladen)
    //      CONSOLE: Anzahl der bisher verarbeiteten Anfragen dieser Serverinstanz
    // [09] Tabellenkalkulation mit Versionsnummer (.xls Dokument-Ausgabe)
    // [10] jcl mit Versionsnummer
    // [11] jvcl mit Versionsnummer
    // [12] Artikel-Bilder-Pfad (Parameter [[Systemeinstellungen#ShopArtikelBilderURL]])
    // [13] zip mit Versionsnummer
    // [14] unzip mit Versionsnummer
    // [15] XMLRPC Versionsnummer "@" Hostname der Serverinstanz ":" XMLRPC-Port der Serverinstanz
    // [16] memcached Versionsnummer "@" [[Systemeinstellungen#memcachedHost]]
    // [17] Datenbank-Benutzer
    // [18] Datenbank-Passwort (verschlüsselt über privaten Key)
    // [19] wie [18]
    // [20] Datenbank-Client mit Versionsnummer
    // [21] PNG - Image Versionsnummer
    // [22] Datenbankhost
    // [23] Datenbankname
    // [24] CONSOLE:Uptime der Serverinstanz "@" Uptime des Servers
    //      GUI:N/A 
    // [25] exif mit Versionsnummer
    // [26] eindeutiger Kontext der Serverinstanz
    // [27] Betriebssystem der Serverinstanz
</syntaxhighlight>
<br>
 
=== ArtikelSuche ===
<source lang="delphi">
    ArtikelSuche(SuchStr: string; [SORTIMENT_R : integer]): array of integer; { ARTIKEL_R } query;
    // Suchmaschine für artikelsuche
    // Optional ist die Suche eingeschränkt auf ein spezielles Sortiment
</source>
<br>
 
=== ArtikelPreis ===
<source lang="delphi">
    ArtikelPreis(AUSGABEART_R, ARTIKEL_R:integer): double; query;
     // liefert den Preis des Artikels in dieser Ausgabeart
     // liefert den Preis des Artikels in dieser Ausgabeart
     // kostenlos = 0; //  
     // kostenlos = 0; //  
     // cPreis_vergriffen = -1.0; // Artikel nicht mehr lieferbar.
     // cPreis_vergriffen = -1.0; // Artikel nicht mehr lieferbar.
     // cPreis_aufAnfrage = -2.0; // keine Preisinformation verf?
     // cPreis_aufAnfrage = -2.0; // keine Preisinformation verfügbar
</source>
<br>


     abu.Land(LAND_R: integer): string;
=== Land ===
     // liefert die Landesbezeichnung (als ISO-K?
<source lang="delphi">
     Land(LAND_R: integer): string; query;
     // liefert die Landesbezeichnung (als ISO-Kürzel)
</source>


     abu.KontoInfo(PERSON_R: integer): double;
=== KontoInfo ===
<source lang="delphi">
     KontoInfo(PERSON_R: integer): double; command;
     // liefert den Kontostand des Kunden (zu zahlen!)
     // liefert den Kontostand des Kunden (zu zahlen!)
     // erzeugt als Nebeneffekt die aktuelle "Mahnung.html"
     // erzeugt als Nebeneffekt die aktuelle "Mahnung.html"
</source>
<br>


     abu.BestellInfo(PERSON_R: integer): integer;
=== BestellInfo ===
     // liefert den Lieferr?nd des Lieferanten (Erwartete Mengen!)
<source lang="delphi">
     BestellInfo(PERSON_R: integer): integer; command;
     // liefert den Lieferrückstand des Lieferanten (Erwartete Mengen!)
     // erzeugt als Nebeneffekt die aktuelle "Bestellung.html"
     // erzeugt als Nebeneffekt die aktuelle "Bestellung.html"
</source>
<br>


     abu.Bestellen(PERSON_R: integer): integer;
=== Bestellen ===
     // erstellt aus dem Einkaufswagen des Kunden eine tats䣨liche
<source lang="delphi">
     // Bestellung. Die (neue) Beleg-Nummer wird zur?eben.
    Bestellen(PERSON_R: integer): integer; command;
    // erstellt aus dem Einkaufswagen des Kunden eine tatsächliche
     // Bestellung. Die (neue) Beleg-Nummer wird zurückgegeben.
    //
</source>
<br>
 
=== Vormerken ===
<source lang="delphi">
    Vormerken(PERSON_R: integer): integer; command;
     // erstellt aus dem Einkaufswagen des Kunden eine tatsächliche
     // Bestellung. Die (neue) Beleg-Nummer wird zurückgegeben.
    //
    // Im Ergebnis wie "Bestellen", jedoch wird die Verarbeitung
    // im Hintergrund durchgeführt.
</source>
<br>
 
=== Buchen ===
<source lang="delphi">
    Buchen(BELEG_R, PERSON_R : integer): integer; command;
    //
    // a) BELEG_R>0
    //
    // führt bei einem bereits existierende Beleg (BELEG_R) dazu, dass alles direkt lieferbare
    // sofort verbucht wird und in den Status "geliefert" gesetzt wird. Es wird ein
    // Rechnungsbeleg erstellt, und die Ware wird ausgeliefert betrachtet.
    //
    // BELEG_R = 0 führt zur Vertragsanwendung bei diesem Kunden
    //
    // Rückgabewert:
    //
    // -1 : Es ist ein Fehler aufgetreten! Mehr Info dazu in der EREIGNIS Tabelle
    //  0 : Eine direkte Auslieferung ist nicht nötig oder möglich! Mehr Info dazu in der EREIGNIS Tabelle
    //  1 : Es wurde erfolgreich eine Auslieferung durchgeführt! In der Regel keine Infos in der EREIGNIS Tabelle
     //
     //
    // b) (BELEG_R<1) und (PERSON_R>0)
    //
    // der aktuelle Arbeitszeitbeleg der angegeben Person wird erstellt.
    //
</source>
<br>


     abu.ArtikelVersendetag(AUSGABEART_R, ARTIKEL_R:integer): integer;
=== ArtikelVersendetag ===
<source lang="delphi">
     ArtikelVersendetag(AUSGABEART_R, ARTIKEL_R:integer): integer; query;
     //
     //
     // GELBE STATI
     // (NULL,0)
     //  0=keine Info ?erf?eit vorhanden
    //  NULL=wie 0
     //  0=keine Info über die Verfügbarkeit vorhanden
     //
     //
     // ROTE STATI:
     // (1..9)
     //  1=entg?vergriffen
     //  1=entgültig vergriffen
     //  2=zur Zeit vergriffen, Neuauflage jedoch ungewiss
     //  2=zur Zeit vergriffen, Neuauflage jedoch ungewiss
     //  3=zur Zeit vergriffen, Neuauflage jedoch sicher
     //  3=zur Zeit vergriffen, Neuauflage jedoch sicher
    //  4=Zustellung sofort per eMail
    //  5=kann sofort heruntergeladen werden
    //  6= -- bisher ohne Bedeutung --
    //  7= -- bisher ohne Bedeutung --
    //  8= -- bisher ohne Bedeutung --
    //  9= -- bisher ohne Bedeutung --
     //
     //
     //
     // GRÜNE STATI: (10..100)
    // GRÜŽE STATI:
     //  10=heute lieferbar  (=ist unbegrenzt am Lager, ohne Mengenangabe)
     //  10=heute lieferbar  (=ist am Lager, ohne Mengenangabe)
     //  11=morgen lieferbar (=wurde z.B. mit dieser Zusage bereits bestellt und kommt morgen)
     //  11=morgen lieferbar (=wurde z.B. mit dieser Zusage bereits bestellt und kommt morgen)
     //  12=in 2 Tagen lieferbar... (=ist z.B. in dieser Zeit zu beschaffen)
     //  12=in 2 Tagen lieferbar... (=ist z.B. in dieser Zeit zu beschaffen)
Zeile 56: Zeile 180:
     //  14= ... usw ...
     //  14= ... usw ...
     //
     //
     // GRÜŽE STATI:
     // GRÜNE STATI: (101..20000100)
     //  101= heute lieferbar  (=ist am Lager, Lagermenge=1)
     //  101= heute lieferbar  (=ist am Lager, Lagermenge=1)
     //  102= heute lieferbar  (=ist am Lager, Lagermenge=2)
     //  102= heute lieferbar  (=ist am Lager, Lagermenge=2)
Zeile 62: Zeile 186:
     //  ... usw.
     //  ... usw.
     //
     //
     //  GRÜŽE STATI:
     //  GRÜNE STATI:
     // >20020101= Konkretes Lieferdatum (z.B. Erscheinungsdatum!)
     // >20020101= Konkretes Lieferdatum (z.B. Erscheinungsdatum!)
     //  20031003= am 03.10.2003 lieferbar (da es z.B. an diesem Tag erscheint)
     //  20031003= am 03.10.2003 lieferbar (da es z.B. an diesem Tag erscheint)
     //            (Vorbestellungen nat? m?ch)
     //            (Vorbestellungen natürlich möglich)
     //
     //
</source>
<br>


     abu.Verlag(VERLAG_R:integer): string;
=== Verlag ===
<source lang="delphi">
     Verlag(VERLAG_R:integer): string; query;
     // Names des Verlages zu einem Verlags-RID
     // Names des Verlages zu einem Verlags-RID
     // ACHTUNG: aus geschichtlichen Gr?sind VERLAG_R zumeist als PERSON_R(s)
     // ACHTUNG: aus geschichtlichen Gründen sind VERLAG_R zumeist als PERSON_R(s)
     // zu verstehen!
     // zu verstehen!
</source>
<br>


     abu.Versandkosten(PERSON_R:integer): double;
=== Versandkosten ===
     // Liefert passend zum "Kunden,Umfang des Einkaufswagen,Versandart des Kunden" die
<source lang="delphi">
     // passenden Versandkosten. Im Moment als dummy immer 3,33 ?.
     Versandkosten(PERSON_R:integer): double; query;
     // Liefert passend zum "Kunden/Umfang des Einkaufswagen/Versandart des Kunden/Rabattstatus" die
     // passenden Versandkosten.  
</source>


     abu.ArtikelInfo(AUSGABEART_R, ARTIKEL_R, LAND_R, VERLAG_R) : double, string;
=== ArtikelInfo ===
     // Multi-Info-Funktion f?tere Informationen zu Artikel-Daten
<source lang="delphi">
     ArtikelInfo(AUSGABEART_R, ARTIKEL_R, LAND_R, VERLAG_R) : double, string; query;
     // Multi-Info-Funktion für weitere Informationen zu Artikel-Daten
     // Ergebnisse: Preis, "ISO-Landeskennzeichen" "-" "Verlag"
     // Ergebnisse: Preis, "ISO-Landeskennzeichen" "-" "Verlag"
</source>
<br>


    abu.BasePlug():array of string;
=== ArtikelRabattPreis ===
    // liefert diverse Informations-String:
<source lang="delphi">
    // 1) Datenbankname
     ArtikelRabattPreis(AUSGABEART_R,ARTIKEL_R,PERSON_R) : array of double; query;
    // 2) OrgaMon Versions-Nummer
    // 3) IBO Versions-Nummer
    // 4) Indy Versions-Nummer
    // 5) PDF Pfad (public)
    // 6) Musik Pfad
    // 7) HTML-Pfad (Rechnungen)
    // 8) Bild-URL
    // 9) Datenbank SYSDBA passwort
    // * Mit Hilfe des Verbindungsstrings sollte auf die entsprechende Datenbank
    //  konnektiert werden.
    // * In der Datenbank sollten nun alle weiteren Parameter, den Shop betreffend
    //  eingegeben sein!
    // f? Shop wichtige Parameter:
    //
    // MusicPath=\\Linus\user\abu\Delphi\abu\Musik\
    // PDFPath=\\Linus\user\hebu\HeBu PDF\A4PDF\
    // XMLRPCHost=BRUTUS
    // XMLRPCPort=3049
    //
 
     abu.ArtikelRabattPreis(AUSGABEART_R,ARTIKEL_R,PERSON_R) : array of double;
     //
     //
     // wie Artikel-Preis, soll jedoch bei Kunden mit Rabatt-Code verwendet werden,
     // wie Artikel-Preis, soll jedoch bei Kunden mit Rabatt-Code verwendet werden,
     // diese Funktion liefert noch die Rabatt-Zahl dazu!
     // diese Funktion liefert noch die Rabatt-Zahl dazu!
     //
     //
</source>
<br>


     abu.PersonNeu : integer; { PERSON_R }
=== PersonNeu ===
<source lang="delphi">
     PersonNeu : integer; { PERSON_R } command;
     //
     //
     // Eine neue Person wird angelegt. Der (neue) RID wird als Ergebnis ge-
     // Eine neue Person wird angelegt. Der (neue) RID wird als Ergebnis ge-
     // liefert. Der Webshop kann nun weitere Eintragungen machen.
     // liefert. Der Webshop kann nun weitere Eintragungen machen.
     //
     //
</source>
<br>


     abu.Ort(PERSON_R) : string; { Adress-Ortsangabe }
=== Ort ===
<source lang="delphi">
     Ort(PERSON_R) : [array of] string; { Adress-Ortsangabe } query;
     //
     //
     // Zu der angegebenen Person wird die Orts-Angabe zusammengestellt.
     // Zu der angegebenen Person wird die Orts-Angabe zusammengestellt.
     // Dazu wird Land, Plz, Ortsname und Ortsteil landesspeziefisch
     // Dazu wird Land, Plz, Ortsname und Ortsteil landesspeziefisch
     // kombiniert.
     // kombiniert.
    // In der Regel wird ein einzelner String zurückgegeben, es kann
    // aber auch ein mehrzeiliger Text zurückgegeben werden, wenn
    // in der Datenbank eine Mehrzeiligkeit der Ortsangabe gesetzt wurde
    // Im "Orts-Formatierungsstring" siehe [[Land]]
</source>
<br>


     abu.Rabatt(PERSON_R) : boolean;
=== Rabatt ===
<source lang="delphi">
     Rabatt(PERSON_R) : boolean; query;
     // Zu der angegebenen Person wird ermittelt, ob sie Rabatte bekommt.
     // Zu der angegebenen Person wird ermittelt, ob sie Rabatte bekommt.
     // Wenn ja wird true, andernfalls false zur?eben.
     // Wenn ja wird true, andernfalls false zurückzugeben.
</source>
<br>


     abu.Preis(AUSGABEART_R,ARTIKEL_R,PERSON_R) : array of double;
=== Preis ===
<source lang="delphi">
     Preis(AUSGABEART_R,ARTIKEL_R,PERSON_R) : array of double; query;
     //
     //
     // Ersetzt in Zukunft die beiden Methoden abu.ArtikelPreis und abu.ArtikelRabattPreis
     // Ersetzt in Zukunft die beiden Methoden abu.ArtikelPreis und abu.ArtikelRabattPreis
     // Falls der Kunde Rabatte bekommt, was beim Login mit abu.Rabatt gepr?rd,
     // Falls der Kunde Rabatte bekommt, was beim Login mit abu.Rabatt geprüft wird,
     // wird der Funktion der wirkliche PERSON_R ?ben, andernfalls 0.
     // wird der Funktion der wirkliche PERSON_R übergeben, andernfalls 0.
     // R?ewerte sind der Preis und der Rabatt (in Prozent, 0 bei PERSON_R == 0).
     // Rückgabewerte sind der Preis und der Rabatt (in Prozent, 0 bei PERSON_R == 0).
     //  
     //  
     //  result[0] Preis in Euro
     //  result[0] Preis in Euro
Zeile 137: Zeile 273:
     //  result[2] Netto-Flag: ("1" = JA | "0" = NEIN)
     //  result[2] Netto-Flag: ("1" = JA | "0" = NEIN)
     //  result[3] Netto-wie-Brutto-Flag: ("1"= JA | "0" = NEIN)
     //  result[3] Netto-wie-Brutto-Flag: ("1"= JA | "0" = NEIN)
    //
== Funktionsindex "intern verf?quot; ==
    // SQL selects, die einen Einzelnen Wert zur?en
    function e_r_sql(s: string): integer;
    function e_r_GEN(GenName: string): integer;
    function e_r_sqls(s: string): string;
    function e_r_sqll(s: string): TStringList;
    function e_r_sqlm(s: string): TIntegerList;
    function e_r_sqld(s: string): double;
    function e_r_IsRID(FieldName: string; RID: integer): boolean;
    // SQL Update, Execute Statements
    procedure e_x_sql(s: string); overload;
    procedure e_x_sql(s: TStrings); overload;
    // kleinere Tools f?ikel Selektion
    function e_r_sqlArtikelWhere(AUSGABEART_R, ARTIKEL_R: integer): string;
     //
     //
</source>
<br>


     procedure e_r_ArtikelSortieren(const RIDS: TList);
=== Miniscore ===
<source lang="delphi">
     Miniscore(PERSON_R,ARTIKEL_R) : boolean; command;
    //
    // Beantragt das Versenden von Miniscores des Artikels ARTIKEL_R
    // an den Benutzer PERSON_R.
    // Zum Versenden wird die eMail-Vorlage "PDF" benutzt.
     //
     //
</source>
<br>


     function ResolveSQL(const VarName: ShortString): ShortString;
=== LoginInfo ===
<source lang="delphi">
     LoginInfo(PERSON_R : integer) : boolean; command;
    //
    // Beantragt das Versenden einer eMail mit den   
    // Zugangsdaten für den Login für diese Person.
    // ggf. wird das PAsswort neu gesetzt.
    // Zum Versenden wird die eMail-Vorlage "LOGIN" Benutzt.
     //
     //
</source>
<br>


     procedure e_x_dereference(dependencies: TStringList; fromref, toref: string);
=== Senden ===
    // alle Referenzen von einem Wert auf einen RID
<source lang="delphi">
     Senden(GeraeteNo: String) : boolean; command;
     //
     //
     // TABELLE "." FELD [","] [" where " CONDITION]
     // Importiert Neuerungen der OrgaMon-App und stellt das
    // neue Auftragsvolumen bereit.
     //
     //
</source>


    function e_r_AgentMenge(AUSGABEART_R, ARTIKEL_R: integer): integer;
=== NextVal ===
    // liefert die Menge, die im Moment zu beschaffen ist
<source lang="delphi">
 
     NextVal(Generator: string) : integer; command;
     function e_r_UngelieferteMenge(AUSGABEART_R, ARTIKEL_R: integer): integer;
    // liefert die Menge, die im Moment zu beschaffen ist
 
    function e_r_VorschlagMenge(AUSGABEART_R, ARTIKEL_R: integer): integer;
    // liefert die Menge, die das System vorschlagen w?    function e_r_ErwarteteMenge(AUSGABEART_R, ARTIKEL_R: integer; sDetails: TStringList = nil): integer;
    // liefert die Menge, die im Moment erwartet wird!
 
    function e_r_Localize(RID, LAND_R: integer): string;
     //
     //
 
     // Datenbank-Funktion: Führt GEN_ID auf den angegebenen Generator (mit dem Inkrement 1) und liefert das Ergebnis als Integer zurück
     function e_r_Localize2(RID, LANGUAGE: integer): string;
    // Landesspezifiesche Strings
     //
     //
</source>


    function e_w_SyncLocalTime: boolean;
== XMLRPC API (cOrgaMon-App) ==
    // Lokale Uhrzeit neu stellen!
    //


     function e_w_GEN(GenName: string): integer;
=== BasePlug ===
     // erh?den Generator um ein und liefert nun diesen Wert.
<source lang="pascal">
     function BasePlug: array of string; { Infos } query;
     //  
    // liefert diverse Informations-String:
     //
     //
    // 1) Arbeitsverzeichnis          J:\OrgaMon\Handy-Server\dat\
    // 2) Programmversion              OrgaMon Rev. 8.665
    // 3) Version einer Komponente    XMLRPC Rev. 1.021
    // 4) Version einer Komponente    ANFiX Rev. 1.069
    // 5) Host                        RAIB42
    // 6) Server Timestamp            13.09.21 12:46:02
    // 7) Aktuelle TAN.Aufrufe Bisher  78321.229
    // 8) Log-Kontext                  Q82GKNEDP
    // 9) Betriebssystem              wine-6.0
</source>


     function e_r_Bearbeiter(BEARBEITER_R: integer): string;
=== StartTAN ===
     // Liefert das K?des Bearbeiters.
<source lang="delphi">
     function StartTAN(GerateID:string) : integer; { TAN } command;
     //  
    // erwartet eine 3 stellige Geräte Identifiktationsnummer wie z.B. 422
    // Die Funktion holt die passenden Gerätedaten von einem FTP Server
    // Ist das Gerät bekannt, so wird eine neue TAN Nummer gezogen, es wird
    // ein entsprechendes Verzeichnis geöffnet, und Upload Daten können
    // gezogen werden.
    // Format: GERAET,TAN,VERSION,OPTIONEN,UHR,MOMENT,IMEI,SALT
     //
     //
 
     // GERAET    : z.B. 003
    function e_r_ServerTime: TDateTime;
     // TAN        vormalige TAN
     // Server Uhrzeit auslesen!
     // VERSION    OrgaMon-App Programmversion, z.B. 2.045
    //
     // OPTIONEN  OrgaMon-App Programm-Optionen
 
     // UHR        Handy Datum - Uhr
    function e_r_UngelieferteMengeUeberBedarf(AUSGABEART_R, ARTIKEL_R: integer): integer;
     // MOMENT     aktueller Anfrage-Moment
    // liefert die ?hlige Menge die vom System erwartet wird, also ?quot;Agent" und "Mindestbestand"
     // IMEI      Handy Identifikation
    // hinaus.
     // SALT      Identifikations Salt
 
</source>
    function e_r_MindestMenge(AUSGABEART_R, ARTIKEL_R: integer): integer;
=== ProceedTAN ===
     // liefert die Mindest-Menge, die auf Lager sein sollte
<source lang="delphi">
 
     procedure ProceedTAN (TAN:string); { 0=OK,Ansonsten Fehlercodes } command;
    procedure e_w_BedarfsAnzeige(AUSGABEART_R, ARTIKEL_R, POSTEN_R, MENGE: integer; Motivation: eMotivation);
     //  
     // dem Agenten signalisieren, dass Bestell-Bedarf besteht
     // verarbeitet alle Eingangsdaten und stellt die Ergebnisdateien
 
     // im entsprechenden TAN Verzeichnis zur Verfügung.
    function e_w_SetFolge(AUSGABEART_R, ARTIKEL_R: integer): integer; // Order-Posten-Anz
</source>
    // Reihenfolge der Befriediung von Erwarteten Mengen voreinstellen
 
    function e_w_Wareneingang(AUSGABEART_R, ARTIKEL_R, MENGE: integer): integer; // [ZUSAMMENHANG]
    // Waren im System verteilen
 
    function e_r_ZahlungText(ZAHLUNGTYP_R: integer; PERSON_R: integer = 0; MoreInfo: TStringList = nil): string;
    // liefert den Zahlungstext zur jeweiligen Person
 
    function e_r_VERLAG_R_fromVerlag(Verlag: string): integer; { RID }
    // RID eines Verlages bestimmen!
 
    function e_r_Lieferant(ARTIKEL_R, MENGE: integer): integer; {PERSON_R}
    // Ermittelt den Lieferanten zu diesem Artikel
 
    function e_w_BestellBeleg(PERSON_R: integer): integer; {BBELEG_R}
    // liefert die Nummer eines Bestellbelegs, ev. wird einer neu erzeugt
 
    function e_w_JoinBeleg(BELEG_R_FROM, BELEG_R_TO: integer): integer;
    // 2 Belege zusammen f?
    function e_w_JoinPerson(PERSON_R_FROM, PERSON_R_TO: integer): integer;
     // 2 Personen zusammen f? Quellperson kann gel?t werden
 
    function e_w_MoveBeleg(BELEG_R_FROM, PERSON_R_TO: integer): integer;
    // einen Beleg von einem Verantwortlichen zum anderen f?
    function e_w_CopyBeleg(BELEG_R_FROM, PERSON_R_TO: integer): integer;
    // Beleg neu erstellen anhand einer Vorlage
 
    function e_r_MengenAusgabe(MENGE, EINHEIT_R: integer; FormatStr: string = '%d'): string;
    // Menge rausbelichten
 
    function e_r_EinzelPreisAusgabe(PREIS: double; EINHEIT_R: integer): string;
    // Einzelpreis rausbelichten
 
    function e_r_PostenPreis(EinzelPreis: double; Anz, EINHEIT_R: integer): double;
    // Gesamtpreis berechnen
 
    function e_w_AusgabeBeleg(BELEG_R: integer; NurGeliefertes: boolean; AlsLieferschein: boolean): string;
    // Ausgabelauf f? aktuellen Beleg mit Anlage der htmls
 
    function e_r_Ausgabeart(AUSGABEART_R: integer): string;
    // liefert den text dieser Ausgabeart
    //
 
    function e_r_Menge(AUSGABEART_R, ARTIKEL_R: integer): integer; { MENGE }
    // liefert die Lagermenge dieses Artikels in der angegebenen
    // Auspr䧵ngsart
 
    function e_r_PreisTabelle(PREIS_R: integer): double;
    // Liest den Preiswert aus der Tabelle aus
    //
 
    function e_r_PreisValid(p: double): boolean;
    // Ist es auch ein echter preis, oder nur ein Tag
    //
 
    function e_r_Preis(AUSGABEART_R, ARTIKEL_R: integer; var Satz: double; var Netto: boolean; var NettoWieBrutto: boolean): double;
    // liefert den Preis des Artikels
    // Satz ist der Mwst-Satz
     // Netto liefert Info, ob dieser Preis ein Netto oder Brutto-Preis ist
    //
 
    function e_r_PreisText(AUSGABEART_R, ARTIKEL_R: integer): string;
     // liefert den Preis des Artikels, fertig als String
     // - es kann auch "auf Anfrage" geben
 
    function e_r_PreisBrutto(AUSGABEART_R, ARTIKEL_R: integer): double;
    // liefert den Preis des Artikels
    //
 
    function e_r_PreisNativ(AUSGABEART_R, ARTIKEL_R: integer): double;
    // liefert die Preisangabe f?sen Artikel
    // unabh䮧ig von netto/brutto Problematik so wie er in der
    // Datenbank steht.
 
    function e_r_EndPreis(PERSON_R, AUSGABEART_R, ARTIKEL_R: integer): double;
    // liefert den Preis des Artikels
 
    function e_r_PreisNetto(AUSGABEART_R, ARTIKEL_R: integer): double;
    // liefert den Preis des Artikels
 
    function e_r_PaketPreis(AUSGABEART_R, ARTIKEL_R: integer): double;
    // liefert den Preis des Artikels
 
    function e_r_RabattFaehig(PERSON_R: integer): boolean;
    // ist es ein Rabatt-Kunde JA/NEIN
 
    function e_r_Rabatt(ARTIKEL_R, PERSON_R: integer; var Netto: boolean; var NettoWieBrutto: boolean): double;
    // liefert den Rabatt, den diese Person bei diesem Artikel erh䬴
    // nebenbei:
    // wird bei dieser Person ohne MwSt-Ausweisgearbeitet (Ausl䮤er)?
     // soll dabei einfach der eigentliche Bruttopreis als Nettopreis ausgewiesen werden?
     //
 
    function e_r_ekRabatt(ARTIKEL_R: integer): double;
    // liefert den Rabatt, mit dem dieser Artikel eingekauft wird
 
    function e_r_ObtainISOfromRID(LAND_R: integer): string;
    // liefert das ISO Landeskennzeichen
 
    function e_r_MwSt(AUSGABEART_R, ARTIKEL_R: integer): double; overload;
    // liefert die MwSt des Artikels
 
    function e_r_MwSt(SORTIMENT_R: integer): double; overload;
    // liefert die MwSt wie in diesem Sortiment ?
 
    function e_w_EinLagern(ARTIKEL_R: integer): integer; // [LAGER_R]
    // Lagerplatz eintragen
 
    function e_r_LagerVorschlag(SORTIMENT_R: integer; PERSON_R: integer {VERLAG_R}): integer; // [LAGER_R]
    // Lagerplatz vorschlagen
 
    function e_r_LagerDiversitaet(LAGER_R: integer): integer; // [MENGE]
    // Liefert die Anzahl verschiedener Artikel auf einem Lagerplatz
 
    procedure e_w_LagerFreigeben;
    // gibt Lagerplä´ºe frei, bei denen 14 Tage keine Bewegung mehr ist und Menge=0
 
    function e_w_Menge(AUSGABEART_R, ARTIKEL_R, MENGE: integer; BELEG_R: integer = 0; POSTEN_R: integer = 0): integer; { MENGE }
    // bucht eine Lagermenge ab oder zu
    // liefert die neue Lagermenge
 
    function e_w_NeuerMahnlauf(ForceNew: boolean = false): boolean;
    // erzeugt neuen Nummernkreise und leert die Mahnkandidatenliste
    //
 
    function e_w_KontoInfo(PERSON_R: integer; Verbuchen: boolean = false; AuchMahnbescheid: boolean = false): TStringList;
    // liefert den Kontostand des Kunden (zu zahlen!)
    // erzeugt als Nebeneffekt die aktuelle "Mahnung.html"
    //
    // OFFEN=
    // VERZUG=
    // [GUTSCHRIFT=JA]
    // [DIFFERENZ=JA]
    //
 
    function e_r_BestellInfo(PERSON_R: integer): integer;
    // liefert den Lieferr?nd des Lieferanten (erwartete Mengen!)
    // erzeugt als Nebeneffekt die aktuelle "Bestellung.html"
 
    function e_w_Bestellen(PERSON_R: integer): integer;
    // setzt den Einkaufswagen in eine Bestellung um. Dabei wird der
    // Einkaufswagen geleert.
 
    function e_w_BudgetEinfuegen(BELEG_R: integer): integer;
    // F?berechnetes Volumen aus offenen Bugets in den angegebenen
    // Beleg ein.
 
    procedure e_w_BudgetAbschreiben(BELEG_R: integer; BUDGET_R: integer; Menge_Rechnung: integer);
    // Bucht ein bisher unberechnetes Volumen an einem Budget ab, und
    // setzt das Volumen auf "abgerechnet".
 
     procedure e_w_EinkaufswagenLeeren(PERSON_R: integer);
    // Leert den aktuellen Einkaufswagen
 
    function e_w_EinkaufswagenEinfuegen(BELEG_R: integer): integer;
    // F?n aktuellen Einkaufswagen in den angegebenen Beleg
    // ein.
 
    function e_r_Rechnung(BELEG_R: integer): integer;
    // liefert die als n䣨stes zu vergebene Rechnungsnummer
 
    function e_w_BelegVersand(BELEG_R: integer; Summe: double; gewicht: integer): integer;
    // Legt einen neuen Versand-Eintrag in der Versand-Tabelle an,
    // oder f?en vorbereiteten!
 
    function e_r_StandardVersender: integer;
    // Legt einen neuen Versand-Eintrag in der Versand-Tabelle an,
    // dadurch
 
    function e_r_LeerGewicht(PACKFORM_R: integer): integer;
    // Leergewicht einer bestimmten Packform
    //
 
    function e_r_Gewicht(AUSGABEART_R, ARTIKEL_R: integer): integer;
    // Gewicht eines Artikels
    //
 
    function e_r_ArtikelVersendetag(AUSGABEART_R, ARTIKEL_R: integer): integer;
    // gibts infos ?en Versendetag aus, es werden spezielle Status Codes
    // verwendet. Siehe Doku.
 
    function e_r_Lieferzeit(AUSGABEART_R, ARTIKEL_R: integer): integer; // [Tage]
    // gibts infos ?en Versendetag aus, es werden spezielle Status Codes
    // verwendet. Siehe Doku.
 
    function e_w_ArtikelNeu(SORTIMENT_R: integer): integer; { : RID }
    // legt einen Artikel im angegebenen Sortiment an
    // liefert den neuen RID zur?    function e_w_PersonNeu: integer; { : RID }
    // legt eine neue Person (vorl䵦ig) an. Ü¢er sie kann der Kunde
    // vorbestellungen / vormerkungen anlegen.
 
    function e_r_UebergangsfachFromPerson(PERSON_R: integer): integer;
    // Ü¢ergangsfach ermitteln
    //
 
    function e_r_Uebergangsfach_VERLAG_R: integer;
    // Das Ü¢ergangsfach
 
    function e_r_FreiesLager_VERLAG_R: integer;
    //
 
    function e_r_IsUebergangsfach(LAGER_R: integer): boolean;
    //
 
    function e_r_LagerPlatzNameFromLAGER_R(LAGER_R: integer): string;
    // Names eines Lagerplatzes anhand des LAGER_R
 
    function e_w_SetStandardVersandData(qVERSAND: TIB_Query): integer;
    // Versanddatensatz vorbelegen
 
    function e_r_VersandKosten(AUFTRAGGEBER_R, LIEFERANSCHRIFT_R, BELEG_R: integer): integer; { : ARTIKEL_R }
    // berechnet die VersandKosten anhand der Tabelle VREGEL
    // PERSON_R: Auftraggeber, angabe freiwillig
    // LIEFERANSCHRIFT_R: an wen geht die Lieferung, angabe freiwillig
    // BELEG_R: um welchen Beleg geht es
 
    function e_r_IsVersandKosten(ARTIKEL_R: integer): boolean;
    // ermittelt, ob es sich bei dem Angegebenen Artikel
    // um einen Versandartikel handelt, dies sind solche, die
    // in der VREGEL genannt werden.
 
    function e_w_VersandKostenClear(BELEG_R: integer): integer; { : Anzahl der entfernten }
    // l?en der ungebuchten versandkosten des
    // letzten Buchungslaufes
 
    function e_r_ort(PERSON_R: integer): string;
     // gibt der kompletten Orts-String an
    //
 
    function e_r_ObtainVerlagFromPERSON_RID(PERSON_R: integer): string;
    //
 
    function e_r_BelegInfo(PERSON_R: integer; BELEG_R: integer): TStringList; { : diverse ermittelten Werte }
    // PERSON_R: Eigner des Einkaufswagen
    //  -- ODER ALTERNATIV --
    // BELEG_R: direkte Belegnummer
    //
 
    function e_w_BerechneBeleg(BELEG_R: integer; NurGeliefertes: boolean = false): TStringList; { : diverse ermittelte Werte }
     // die Auftragsmengen entsprechend auf die Mengen verteilen Daumen, es erfolgen
     // Lagerbuchungen.
    // RECHNUNGSBETRAG=
    // LIEFERGEWICHT=
 
    function e_w_ForderungBuchen(BELEG_R: integer; RechnungsBetrag: double): TStringList;
    //
    //
 
    function e_w_BucheVersand(BELEG_R: integer; LabelDatensatz: boolean): string;
    // Briefumschlag-Funktion in den Belegen, Berechnete Mengen werden auf
    // geliefert gesetzt. Budgets werden abgeschrieben.
 
    procedure e_w_RechnungDatumSetzen(ib_q: TIB_Query; Aufdatum: TDateTime); overload;
    // historisch !! - l?en wenn m?ch
 
    procedure e_w_RechnungDatumSetzen(ib_q: TIB_Query; Aufdatum: TANFiXDate); overload;
    // historisch !! - l?en wenn m?ch
 
    function e_w_BelegNeu(PERSON_R: integer): integer; { }
    // legt einen neuen Kunden-Beleg an
 
    function e_r_LohnKalkulation(Betrag: double; Datum: TANFIXDate): string;
    //
 
    function e_r_LadeParameter: TStringList; { }
    //
 
    procedure e_r_PostenInfo(IBQ: TIB_DataSet; NurGeliefertes: boolean; EinzelpreisNetto: boolean;
      var
      _Anz,
      _AnzAuftrag,
      _AnzGeliefert,
      _AnzStorniert,
      _AnzAgent: integer;
      var
      _Rabatt,
      _EinzelPreisUnrabattiert,
      _EinzelPreis,
      _MwStSatz: double
 
      );
 
    procedure e_w_BeforeDeletePosten(POSTEN_R: integer);
    procedure e_w_BeforeDeleteBPosten(BPOSTEN_R: integer);
    procedure e_w_BeforeDeleteBeleg(BELEG_R: integer);
    procedure e_w_BeforeDeleteBBeleg(BBELEG_R: integer);
    procedure e_w_BeforeDeleteArtikel(ARTIKEL_R: integer);
 
    function e_w_BelegStatusBuchen(qbeleg: TIB_Query): boolean;
    function e_w_BBelegStatusBuchen(bbeleg, bposten: TIB_Query): boolean;
 
    procedure e_w_SetPostenData(ARTIKEL_R, PERSON_R: integer; qPosten: TIB_Query);
    procedure e_w_SetPostenPreis(AUSGABEART_R, ARTIKEL_R, PERSON_R: integer; qPosten: TIB_Query);
    // vor dem setzen weiterer Felder kann hier Standardasiert ein Artikel in
    // den aktuellen Posten kopiert werden. Zentrale Funktion zum F?einer
    // Posten zeile
 
    procedure e_w_InvalidateCaches;
 
    // Q - Funktionen sind Qualitä´³sicherungs-Hilfsfunktionen
    function q_r_PersonWarnung(PERSON_R: integer): TStringList;
 
    // F - Sind Download und Upload Funktionen
    procedure e_f_PersonInfo(PERSON_R: integer; AusgabePfad: string);

Aktuelle Version vom 22. Februar 2024, 18:32 Uhr

OrgaMon biete eine vielzahl von Kopplungsmöglichkeiten, die es dem Kunden oder Geschäftspartner ermöglichen auf Informationen und Daten zuzugreifen und Prozesse anzustossen.

  • Lieferanten

Lieferanten können ihre Systeme mit OrgaMon koppeln, und beispielsweise die Liste der noch zu liefernden Artikel abrufen

  • Kunden

Kunden können ebenfalls uber diese Schnittstelle Zahlungsverpflichtungen oder alte Belege einsehen.

Die B2B Fähigkeiten des OrgaMon ermöglichen es Dienstleistungen des OrgaMon von aussen zu benutzten. Dazu wird im Moment, die von jedem System beherschte XML-RPC Schnittstelle benutzt. Der benutzte TCP/IP Port ist frei einstellbar.

  • Webshop

Der Webshop nutzt neben der Datenbankverbindung vorzugsweise Funktion aus der XML-RPC-API.

Funktions Überblick

Der OrgaMon verwendet einen betriebswirtschaftlichen Kernel. In diesem Teil des Quelltextes (eCommerce) sammelt sich die Verarbeitungslogik für alle wesentlichen Buchungsvorgänge (z.B. Zahlungseingang, Warenzugang, Versandbuchung usw.). Eine ausgewählte Zusammenstellung von Kernel-Funktionen sind via XMLRPC von aussen zugänglich. Somit ist es dem TWebShop möglich grosse Teile der Logik via XMLRPC dem OrgaMon zu überlassen.

  • mit query; markierte Funktionen ändern nichts an der Datenbank, die Funktionen laufen "read-only" ab
  • mit command; markierte Funktion verändern die Daten der Datenbank, Datensätze werden geändert gelöscht oder eingefügt, Dateien im Dateisystem werden erstellt

XMLRPC API (cOrgaMon-Web)

BasePlug

    BasePlug():array of string; query;
    // BasePlug enthält wichtige Umgebungsinformationen für den konnektierten
    // WebShop. So erfährt der WebShop z.B. über BasePlug auf welche Datenbank
    // er konnektieren soll. Oder wo Musik-Downloads zu finden sind. BasePlug
    // verhindert redundante Parametrierung von Shop und OrgaMon. In der Regel
    // liefert BasePlug alle Infos an den Shop die er braucht.
    // 
    // Bedeutung der einzelnen Zeilen:
    //
    // [00] Datenbank-Verbindungsstring
    // [01] Anwendungsname mit Versionsnummer
    // [02] Datenbank-Layer mit Versionsnummer
    // [03] Indy Versions-Nummer
    // [04] PDF Pfad (public) (Parameter [[Systemeinstellungen#PDFPathShop]])
    // [05] Musik Pfad (Parameter [[Systemeinstellungen#MusicPath]])
    // [06] Pfad zu den Rechnungen (Parameter [[Systemeinstellungen#htmlPath]])
    // [07] Pfad der Artikel-Bilder (Icons und Logos auf externer Site) (Parameter [[Systemeinstellungen#BilderURL]])
    // [08] GUI: TPicUpload Versions-Nummer (Bilder hochladen)
    //      CONSOLE: Anzahl der bisher verarbeiteten Anfragen dieser Serverinstanz
    // [09] Tabellenkalkulation mit Versionsnummer (.xls Dokument-Ausgabe)
    // [10] jcl mit Versionsnummer
    // [11] jvcl mit Versionsnummer
    // [12] Artikel-Bilder-Pfad (Parameter [[Systemeinstellungen#ShopArtikelBilderURL]])
    // [13] zip mit Versionsnummer
    // [14] unzip mit Versionsnummer
    // [15] XMLRPC Versionsnummer "@" Hostname der Serverinstanz ":" XMLRPC-Port der Serverinstanz
    // [16] memcached Versionsnummer "@" [[Systemeinstellungen#memcachedHost]]
    // [17] Datenbank-Benutzer
    // [18] Datenbank-Passwort (verschlüsselt über privaten Key)
    // [19] wie [18]
    // [20] Datenbank-Client mit Versionsnummer
    // [21] PNG - Image Versionsnummer
    // [22] Datenbankhost
    // [23] Datenbankname
    // [24] CONSOLE:Uptime der Serverinstanz "@" Uptime des Servers
    //      GUI:N/A  
    // [25] exif mit Versionsnummer
    // [26] eindeutiger Kontext der Serverinstanz
    // [27] Betriebssystem der Serverinstanz


ArtikelSuche

    ArtikelSuche(SuchStr: string; [SORTIMENT_R : integer]): array of integer; { ARTIKEL_R } query;
    // Suchmaschine für artikelsuche
    // Optional ist die Suche eingeschränkt auf ein spezielles Sortiment


ArtikelPreis

    ArtikelPreis(AUSGABEART_R, ARTIKEL_R:integer): double; query;
    // liefert den Preis des Artikels in dieser Ausgabeart
    // kostenlos = 0; // 
    // cPreis_vergriffen = -1.0; // Artikel nicht mehr lieferbar.
    // cPreis_aufAnfrage = -2.0; // keine Preisinformation verfügbar


Land

    Land(LAND_R: integer): string; query;
    // liefert die Landesbezeichnung (als ISO-Kürzel)

KontoInfo

    KontoInfo(PERSON_R: integer): double; command;
    // liefert den Kontostand des Kunden (zu zahlen!)
    // erzeugt als Nebeneffekt die aktuelle "Mahnung.html"


BestellInfo

    BestellInfo(PERSON_R: integer): integer; command;
    // liefert den Lieferrückstand des Lieferanten (Erwartete Mengen!)
    // erzeugt als Nebeneffekt die aktuelle "Bestellung.html"


Bestellen

    Bestellen(PERSON_R: integer): integer; command;
    // erstellt aus dem Einkaufswagen des Kunden eine tatsächliche
    // Bestellung. Die (neue) Beleg-Nummer wird zurückgegeben.
    //


Vormerken

    Vormerken(PERSON_R: integer): integer; command;
    // erstellt aus dem Einkaufswagen des Kunden eine tatsächliche
    // Bestellung. Die (neue) Beleg-Nummer wird zurückgegeben.
    // 
    // Im Ergebnis wie "Bestellen", jedoch wird die Verarbeitung
    // im Hintergrund durchgeführt.


Buchen

    Buchen(BELEG_R, PERSON_R : integer): integer; command;
    //
    // a) BELEG_R>0
    //
    // führt bei einem bereits existierende Beleg (BELEG_R) dazu, dass alles direkt lieferbare
    // sofort verbucht wird und in den Status "geliefert" gesetzt wird. Es wird ein
    // Rechnungsbeleg erstellt, und die Ware wird ausgeliefert betrachtet.
    // 
    // BELEG_R = 0 führt zur Vertragsanwendung bei diesem Kunden
    // 
    // Rückgabewert: 
    // 
    // -1 : Es ist ein Fehler aufgetreten! Mehr Info dazu in der EREIGNIS Tabelle
    //  0 : Eine direkte Auslieferung ist nicht nötig oder möglich! Mehr Info dazu in der EREIGNIS Tabelle
    //  1 : Es wurde erfolgreich eine Auslieferung durchgeführt! In der Regel keine Infos in der EREIGNIS Tabelle
    //
    // b) (BELEG_R<1) und (PERSON_R>0)
    // 
    // der aktuelle Arbeitszeitbeleg der angegeben Person wird erstellt.
    //


ArtikelVersendetag

    ArtikelVersendetag(AUSGABEART_R, ARTIKEL_R:integer): integer; query;
    //
    // (NULL,0)
    //  NULL=wie 0
    //  0=keine Info über die Verfügbarkeit vorhanden
    //
    // (1..9)
    //  1=entgültig vergriffen
    //  2=zur Zeit vergriffen, Neuauflage jedoch ungewiss
    //  3=zur Zeit vergriffen, Neuauflage jedoch sicher
    //  4=Zustellung sofort per eMail
    //  5=kann sofort heruntergeladen werden
    //  6= -- bisher ohne Bedeutung --
    //  7= -- bisher ohne Bedeutung --
    //  8= -- bisher ohne Bedeutung --
    //  9= -- bisher ohne Bedeutung --
    //
    // GRÜNE STATI: (10..100)
    //  10=heute lieferbar  (=ist unbegrenzt am Lager, ohne Mengenangabe)
    //  11=morgen lieferbar (=wurde z.B. mit dieser Zusage bereits bestellt und kommt morgen)
    //  12=in 2 Tagen lieferbar... (=ist z.B. in dieser Zeit zu beschaffen)
    //  13=in 3 Tagen lieferbar...
    //  14= ... usw ...
    //
    // GRÜNE STATI: (101..20000100)
    //  101= heute lieferbar  (=ist am Lager, Lagermenge=1)
    //  102= heute lieferbar  (=ist am Lager, Lagermenge=2)
    //  103= heute lieferbar  (=ist am Lager, Lagermenge=3)
    //  ... usw.
    //
    //  GRÜNE STATI:
    // >20020101= Konkretes Lieferdatum (z.B. Erscheinungsdatum!)
    //  20031003= am 03.10.2003 lieferbar (da es z.B. an diesem Tag erscheint)
    //            (Vorbestellungen natürlich möglich)
    //


Verlag

    Verlag(VERLAG_R:integer): string; query;
    // Names des Verlages zu einem Verlags-RID
    // ACHTUNG: aus geschichtlichen Gründen sind VERLAG_R zumeist als PERSON_R(s)
    // zu verstehen!


Versandkosten

    Versandkosten(PERSON_R:integer): double; query;
    // Liefert passend zum "Kunden/Umfang des Einkaufswagen/Versandart des Kunden/Rabattstatus" die
    // passenden Versandkosten.

ArtikelInfo

    ArtikelInfo(AUSGABEART_R, ARTIKEL_R, LAND_R, VERLAG_R) : double, string; query;
    // Multi-Info-Funktion für weitere Informationen zu Artikel-Daten
    // Ergebnisse: Preis, "ISO-Landeskennzeichen" "-" "Verlag"


ArtikelRabattPreis

    ArtikelRabattPreis(AUSGABEART_R,ARTIKEL_R,PERSON_R) : array of double; query;
    //
    // wie Artikel-Preis, soll jedoch bei Kunden mit Rabatt-Code verwendet werden,
    // diese Funktion liefert noch die Rabatt-Zahl dazu!
    //


PersonNeu

    PersonNeu : integer; { PERSON_R } command;
    //
    // Eine neue Person wird angelegt. Der (neue) RID wird als Ergebnis ge-
    // liefert. Der Webshop kann nun weitere Eintragungen machen.
    //


Ort

    Ort(PERSON_R) : [array of] string; { Adress-Ortsangabe } query;
    //
    // Zu der angegebenen Person wird die Orts-Angabe zusammengestellt.
    // Dazu wird Land, Plz, Ortsname und Ortsteil landesspeziefisch
    // kombiniert.
    // In der Regel wird ein einzelner String zurückgegeben, es kann
    // aber auch ein mehrzeiliger Text zurückgegeben werden, wenn
    // in der Datenbank eine Mehrzeiligkeit der Ortsangabe gesetzt wurde
    // Im "Orts-Formatierungsstring" siehe [[Land]]


Rabatt

    Rabatt(PERSON_R) : boolean; query;
    // Zu der angegebenen Person wird ermittelt, ob sie Rabatte bekommt.
    // Wenn ja wird true, andernfalls false zurückzugeben.


Preis

    Preis(AUSGABEART_R,ARTIKEL_R,PERSON_R) : array of double; query;
    //
    // Ersetzt in Zukunft die beiden Methoden abu.ArtikelPreis und abu.ArtikelRabattPreis
    // Falls der Kunde Rabatte bekommt, was beim Login mit abu.Rabatt geprüft wird,
    // wird der Funktion der wirkliche PERSON_R übergeben, andernfalls 0.
    // Rückgabewerte sind der Preis und der Rabatt (in Prozent, 0 bei PERSON_R == 0).
    // 
    //  result[0] Preis in Euro
    //  result[1] Rabatt in %
    //  result[2] Netto-Flag: ("1" = JA | "0" = NEIN)
    //  result[3] Netto-wie-Brutto-Flag: ("1"= JA | "0" = NEIN)
    //


Miniscore

    Miniscore(PERSON_R,ARTIKEL_R) : boolean; command;
    // 
    // Beantragt das Versenden von Miniscores des Artikels ARTIKEL_R 
    // an den Benutzer PERSON_R. 
    // Zum Versenden wird die eMail-Vorlage "PDF" benutzt.
    //


LoginInfo

    LoginInfo(PERSON_R : integer) : boolean; command;
    // 
    // Beantragt das Versenden einer eMail mit den     
    // Zugangsdaten für den Login für diese Person.
    // ggf. wird das PAsswort neu gesetzt.
    // Zum Versenden wird die eMail-Vorlage "LOGIN" Benutzt.
    //


Senden

    Senden(GeraeteNo: String) : boolean; command;
    //
    // Importiert Neuerungen der OrgaMon-App und stellt das
    // neue Auftragsvolumen bereit.
    //

NextVal

    NextVal(Generator: string) : integer; command;
    //
    // Datenbank-Funktion: Führt GEN_ID auf den angegebenen Generator (mit dem Inkrement 1) und liefert das Ergebnis als Integer zurück
    //

XMLRPC API (cOrgaMon-App)

BasePlug

    function BasePlug: array of string; { Infos } query;
    // 
    // liefert diverse Informations-String:
    //
    // 1) Arbeitsverzeichnis           J:\OrgaMon\Handy-Server\dat\
    // 2) Programmversion              OrgaMon Rev. 8.665
    // 3) Version einer Komponente     XMLRPC Rev. 1.021
    // 4) Version einer Komponente     ANFiX Rev. 1.069
    // 5) Host                         RAIB42
    // 6) Server Timestamp             13.09.21 12:46:02
    // 7) Aktuelle TAN.Aufrufe Bisher  78321.229
    // 8) Log-Kontext                  Q82GKNEDP
    // 9) Betriebssystem               wine-6.0

StartTAN

    function StartTAN(GerateID:string) : integer; { TAN } command;
    // 
    // erwartet eine 3 stellige Geräte Identifiktationsnummer wie z.B. 422
    // Die Funktion holt die passenden Gerätedaten von einem FTP Server
    // Ist das Gerät bekannt, so wird eine neue TAN Nummer gezogen, es wird
    // ein entsprechendes Verzeichnis geöffnet, und Upload Daten können 
    // gezogen werden.
    // Format: GERAET,TAN,VERSION,OPTIONEN,UHR,MOMENT,IMEI,SALT
    //
    // GERAET    : z.B. 003
    // TAN        vormalige TAN
    // VERSION    OrgaMon-App Programmversion, z.B. 2.045
    // OPTIONEN   OrgaMon-App Programm-Optionen
    // UHR        Handy Datum - Uhr
    // MOMENT     aktueller Anfrage-Moment
    // IMEI       Handy Identifikation
    // SALT       Identifikations Salt

ProceedTAN

    procedure ProceedTAN (TAN:string); { 0=OK,Ansonsten Fehlercodes } command;
    // 
    // verarbeitet alle Eingangsdaten und stellt die Ergebnisdateien
    // im entsprechenden TAN Verzeichnis zur Verfügung.