ECommerce: Unterschied zwischen den Versionen

Aus OrgaMon Wiki
Zur Navigation springen Zur Suche springen
 
(98 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
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.
OrgaMon biete eine vielzahl von Kopplungsmöglichkeiten, die es dem Kunden oder Geschäftspartner ermöglichen auf Informationen und Daten zuzugreifen und Prozesse anzustossen.  


== Funktions Überblick ==
* Lieferanten


Erstmalig werden Funktionen f?ch䦴sabl䵦e aus OrgaMon in einem Zentralen Modul (eCommerce) gesammelt. Das Ziel ist, den ganzen Webshop bzw. alle Webanfragen ausschließlich über eCommerce Modul laufen zu lassen. Dabei werden auch erstmals "r" Connections und "w" Connections eingesetzt, was dem zukünftigen raib-Servern zugute kommt (Clustering). Nun eine Liste aller eCommerce Funktionen:
Lieferanten können ihre Systeme mit OrgaMon koppeln, und beispielsweise die Liste der noch zu liefernden Artikel abrufen


== SSL Ablagen ==
* Kunden


http://www.nurdletech.com/https.html<br>
Kunden können ebenfalls uber diese Schnittstelle Zahlungsverpflichtungen oder alte Belege einsehen.
http://www.securityfocus.com/infocus/1820


== CodeSign ==
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.


Das erweitern einer EXE Datei um ein Certifikat.
* Webshop


Buying the code signing certs from Thawte will cost you $200 per year. Renewals cost ~ $153 US. Verisign charges $400 per year. Obviously I went with Thawte. The certs are the same, as all CA's have their root certs for codesigning enabled, this really isn't the case with SSL (https:// certificates) so you have to pick wisely when buying ssl cert.  
Der Webshop nutzt neben der Datenbankverbindung vorzugsweise Funktion aus der XML-RPC-API.


With the cert you can sign as many products as you wish, as long as they are from the company/organization which purchased the code signing cert.
== Funktions Überblick ==


You are not required to renew the certificate, as long as you timestamp the program. You basically connect to a server that does timestamping and it stamps the certificate/program with a hardcoded date. If the certificate expires and there is a valid stamp on it then the certificate does not warn it is expired to the end users downloading your files. But you will need to renew the cert if you want to re-stamp new builds/updates of your files. You can use the freely available versign timestampign service to stamp your code with (instructions to do it are included in microsofts code signing sdk).  
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.


Information on how to sign code is at:
* mit <code>query;</code> markierte Funktionen ändern nichts an der Datenbank, die Funktionen laufen "read-only" ab
http://msdn.microsoft.com/library/default.asp?url=/workshop/security/authcode/signing.asp
* 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


You can download the files (signcode.exe) at:
== XMLRPC API (cOrgaMon-Web) ==
http://www.microsoft.com/downloads/details.aspx?FamilyID=2B742795-D0F0-4A66-B27F-22A95FCD3425&displaylang=en


Probably want to get the x86 executable as it's unlikely most people here are generating alpha executables (64 bit).  
=== 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>


You can get more information and purchase the certs from Thawte at:
=== ArtikelPreis ===
http://www.thawte.com/codesign/index.html
<source lang="delphi">
 
    ArtikelPreis(AUSGABEART_R, ARTIKEL_R:integer): double; query;
Look at the Microsoft Authenticode Code Signing Certificate.
    // 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
As to questions about stealing a cert. It's possible but very very hard to do. Thawte sends you a .pvk file (private key file) and a certificate file. Both files are required to generate the certificate embedded into the exe. The hash of this certificate is unique to each executable and if the exe is modified in anyway the cert is nullified. Also you have the option when purchasing the code signing cert if you want to password protect it. This allows even more security as if anyone does get a hold of the cert and private key then they still need the password to sign with.
 
 
Also the process to obtain a cert can take some time. It took me roughly 8 hours to receive it. You cannot as an individual in the US get a code signing cert. You must be a registered business with your state, country and they will require you to fax them documentation proving your business is valid. Then they will check your domain, all certs are tied with a domain - typically business domain so they check the whois records. As long as the REGISTRANT OF RECORD on the domain matches your legal company name EXACTLY then you are fine. For instance my legal company name is PGWARE LLC, thus thta is what had to be listed in teh registrant information for the domain; if I had just PGWARE then Thawte will decline my application.
 
Finally you have to have a business phone number where they can contact you to verify the purchase. They will attempt to obtain a phone number from you by the use of phone directory service in your city, if you are not listed then they will attempt other means to find a phoone number to contact you at. If they are not able to find any number then you need to fax them a phone bill that shows your company name on it, and your telephone number on it. They will then call you and ask you basic questions on who ordered the certificate and details you entered when ordering - this allows them to confirm you are the person who really is getting the cert. If you have no phone number at all for your business fear not you can send in a notorized letter signed by a notary which states you give permission and authorization to distribute a certificate to your business; then fax it in to them.
 
As long as you have everything in order and all documents ready to be faxed you can get the cert within a day's time. They do all these checks to make sure you are who you say you are. Also they want ot make it seem like they are actually doing something for that $200 you're sending them.
 
 
If any of you guys are interested in doing it and have any problems along the way just message me here or email me and I'll lend some assistance.
---
Julian the cert is signed into the exe by the user of the signcode.exe program. It adds an additional section into the exe header which contains the cert.
 
When usign the codesign.exe you can pass commandline params to generate the digital certificate within the exe. When you right click on a exe that is signed , click the PROPERTIES and there is a new tab within the properties sheet of the executable entitled DIGITAL CERTIFICATE.
 
Here is how to sign:
 
 
signcode.exe -spc mycert.spc -v mykey.pvk -n "My Program" -i http://www.url.com -$ commercial -t http://timestamp.verisign.com/scripts/timstamp.dll MYPROG.EXE
 
 
mycert.spc is the file Thawte/verisign sends to you, it is the certificate. MyKey.pvk is the private key thwate/verisign also sends to you which contains your private key and password (if a password was set). Note you cannot change the password without buying a new cert.
 
"My Program" is just a friendly name you can give your program and is displayed in the Security box when shown to a user downloading you file. http://www.url.com is the url to your website, this lets a user click on your program name (friendly name) and it takes them to the website. Finally you include the optional timestamp (you should timestamp, so when the certificate expires the file is still signed). Then you pass the filename/path to your exe that needs to be signed.
 
== Internet Ablagen ==
 
Internetablagen dienen der fortgesetzten Dokumentation der Auftragsergebnisse im InterNet. Der Auftraggeber kann jederzeit Ergebnisportionen einsehen oder in sein EDV-System integrieren. Dabei werden auf dem OrgaMon WebServer virtuelles Host eingerichtet, einer für jeden Auftraggeber.
 
* Anlegen des Benutzers ~SubDomain~
 
Der Benutzername sollte der TopLevelDomain Prefix des Auftraggebers sein. Die Auftraggeber sei eine Zahnradfabrik. Deren Domain ist http://www.zf.com. Somit ist unser SubDomain zf. Zukünftiger Datenaustausch erfolgt über die Adresse http://zf.orgamon.de. Erster Schritt ist die Anlage des Benutzers zf. Um die Erklärung allgemein zu halten verwenden wir ab jetzt anstelle von "zf" immer ~SubDomain~.
 
yast
Sicherheit und Benutzer->Benutzer anlegen un bearbeiten
<ALT>&<H> für "Hinzufügen"
Bei "Benutzername": ~SubDomain~ eintragen
Bei "Passwort": Das generierte Passwort aus dem Orgamon eintragen
<ALT>&<D> für Details
Bei "Homeverzeichnis": /srv/www/htdocs/~SubDomain~
Bei "Leeres Home": eine Haken machen!
Bei "Login-Shell": /bin/false
Bei "Standardgruppe": "ftp" auswählen
Bei "weitere Gruppen": nur "www", "ftp" darf angehakt sein!
<ALT>&<W> für weiter.
<ALT>&<E> für Anlegen.
yast Verlassen
 
* Internetablage vor-befüllen
 
#
# Sicherstellen, dass samba Vollzugriff auf die Ablage
# hat.
chmod 777 /srv/www/htdocs/~SubDomain~
   
   
# für index.php sorgen
</source>
# für sort.txt sorgen
<br>
chmod 666 sort.txt


* PHP - Script zur Dateianzeige
=== Land ===
<source lang="delphi">
    Land(LAND_R: integer): string; query;
    // liefert die Landesbezeichnung (als ISO-Kürzel)
</source>


<nowiki>
=== KontoInfo ===
<?php
<source lang="delphi">
  define(SortOrderFileName,"sort.txt");
    KontoInfo(PERSON_R: integer): double; command;
     // liefert den Kontostand des Kunden (zu zahlen!)
  function save($s)
     // erzeugt als Nebeneffekt die aktuelle "Mahnung.html"
  { $fp = fopen(SortOrderFileName,"w");
</source>
    fputs($fp,$s);
<br>
    fclose($fp);
  }
  function load()
  { $fp = fopen(SortOrderFileName,"r");
    $s = trim(fgets($fp,10));
    fclose($fp);
    return $s;
  }
  // Beim allerersten Skriptaufruf
  if (!file_exists(SortOrderFileName) AND !isset($sortorder))
  { $sortorder = "name";  // Standard-Einstellung
    save($sortorder);
  }
  // Beim jeweils ersten Skriptaufruf
  if (file_exists(SortOrderFileName) AND !isset($sortorder)) { $sortorder = load(); }
  // Beim erneuten Skriptaufruf
  if (file_exists(SortOrderFileName) AND isset($sortorder)) { save($sortorder); }
  ?>
  <html>
  <HEAD>
  <Title>Dateiablage</title>
  <META HTTP-EQUIV="Pragma" content="no-cache">
  <META HTTP-EQUIV="Cache-Control" content="no-cache, must-revalidate">
  <META HTTP-EQUIV="Expires" content="0">
  <STYLE TYPE="text/css">
  <!--
  P.breakhere { page-break-before: always; }
  table.border { border-color:#000000; border-style:solid; }
  td { padding-left:5px; padding-right:5px; border-color:#000000; border-style:solid; border-bottom-style:solid; border-width:0px; border-bottom-width:0px; font-family:Verdana; font-size:13px; }
  a:link    { font-family:Verdana,Arial; font-size:13px;  color:#cc0000; text-decoration:none; }
  a:visited { font-family:Verdana,Arial; font-size:13px;  color:#999999; text-decoration:none; }
  a:active  { font-family:Verdana,Arial; font-size:13px;  color:#cc0000; text-decoration:none; }
  a:hover  { font-family:Verdana,Arial; font-size:13px;  color:#cc0000; text-decoration:none; background-color:#C8D8E0; }
  a:link.head    { font-family:Verdana,Arial; font-size:13px;  color:#000040; text-decoration:underline; }
  a:visited.head { font-family:Verdana,Arial; font-size:13px;  color:#000040; text-decoration:underline; }
  a:active.head  { font-family:Verdana,Arial; font-size:13px;  color:#000040; text-decoration:underline; }
  a:hover.head  { font-family:Verdana,Arial; font-size:13px;  color:#000040; text-decoration:underline; }
  -->
  </STYLE>
  </HEAD>
  <body bgcolor="#ffffff">
  <center>
  <table class=border cellpadding=0 cellspacing=2 border=1 width=500>
  <tr><td colspan=2><b>zip Dateiablage</b><br><br></td></tr>
  <tr>
     <td width=70% bgcolor="#C8D8E0"><font face="Verdana" size=-1><a class="head" href="./<?php echo basename($PHP_SELF); ?>?sortorder=name"><b>
  <?php
  echo "Dateiname</b></a>";
  if ($sortorder=="name")
  {
     echo " v";
  }
  ?>
  </td>
    <td width=30% bgcolor="#C8D8E0"><font face="Verdana" size=-1><a class="head" href="./<?php echo basename($PHP_SELF); ?>?sortorder=date"><b>
  <?php
  echo "Ablagedatum</b></a>";
  if ($sortorder=="date")
  {
    echo " v";
  }
  ?>
  </td>
  </tr>
  <!-- BEGIN BAUSTELLE -->
  <?php
 
  $filename = array();
  $filedate = array();
  $n = 0;
  if ($handle = opendir('.'))
  { while (false !== ($file = readdir($handle)))
    { if (strpos($file,".zip")>1)
      { $filename[$n] = $file;
        $filedate[$n] = filemtime($file);
            $n++;
      }
    } closedir($handle);
  }
  // $sortorder = "name";
  switch($sortorder)
  { case("name") : array_multisort($filename, SORT_ASC, $filedate, SORT_DESC);
                  break;
    case("date") : array_multisort($filedate, SORT_DESC, $filename, SORT_ASC);
                  break;
  }


  for ($i = 0; $i < $n; $i++)
=== BestellInfo ===
  { $fn = $filename[$i];
<source lang="delphi">
    $fd = $filedate[$i];
    BestellInfo(PERSON_R: integer): integer; command;
    echo "<tr>";
    // liefert den Lieferrückstand des Lieferanten (Erwartete Mengen!)
    // erzeugt als Nebeneffekt die aktuelle "Bestellung.html"
    // Datei-Name
</source>
    if (strpos($fn,".html")>1) {
<br>
      echo "<td bgcolor=#FFFFCC><font face=\"Verdana\" size=-1>";
      echo "<a href=$fn>";
      echo $fn;
      echo "</a></td>";
    }
    else {
      echo "<td bgcolor=#E8F4F8><font face=\"Verdana\" size=-1>";
      echo "<a href=$fn>";
      echo $fn;  
      echo "</a></td>";
    }
 
    // Datei-Datum
    echo "<td bgcolor=#E8F4F8><font face=\"Verdana\" size=-1>";
    echo date ("d.m.Y", $fd);
    echo "&nbsp;&nbsp;";
    echo date ("H:i:s", $fd);
    echo "</td>";
    echo "</tr>";
  }
 
  ?>
  <!-- END BAUSTELLE -->
  <!-- INSERT BAUSTELLE -->
  </table>
  </center>
  </body>
  </html>
</nowiki>


* Virtueller Host auf die Ablage leiten
=== Bestellen ===
<source lang="delphi">
    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>


Vorbereitung: in der listen.conf
=== 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>


NameVirtualHost *
=== Buchen ===
 
<source lang="delphi">
Im Verzeichnis /etc/apache2/vhosts.d/
    Buchen(BELEG_R, PERSON_R : integer): integer; command;
 
    //
#
    // a) BELEG_R>0
# Datei ~SubDomain~.orgamon.de.conf
    //
#
    // führt bei einem bereits existierende Beleg (BELEG_R) dazu, dass alles direkt lieferbare
<VirtualHost *>
    // sofort verbucht wird und in den Status "geliefert" gesetzt wird. Es wird ein
  ServerName ~SubDomain~.orgamon.de
    // Rechnungsbeleg erstellt, und die Ware wird ausgeliefert betrachtet.
  DocumentRoot /srv/www/htdocs/~SubDomain~
    //
</VirtualHost>
    // BELEG_R = 0 führt zur Vertragsanwendung bei diesem Kunden
   
    //
  <Directory /srv/www/htdocs/~SubDomain~>
    // Rückgabewert:
  AuthType Basic
    //  
  AuthName "Mandant Ablage"
    // -1 : Es ist ein Fehler aufgetreten! Mehr Info dazu in der EREIGNIS Tabelle
  AuthUserFile /srv/www/htdocs/~SubDomain~/.htpasswd
    // 0 : Eine direkte Auslieferung ist nicht nötig oder möglich! Mehr Info dazu in der EREIGNIS Tabelle
  Require user ~SubDomain~
    // 1 : Es wurde erfolgreich eine Auslieferung durchgeführt! In der Regel keine Infos in der EREIGNIS Tabelle
</Directory>
    //
 
    // b) (BELEG_R<1) und (PERSON_R>0)
<b>Verzeichnisschutz mit htpassed</b>
    //  
    // der aktuelle Arbeitszeitbeleg der angegeben Person wird erstellt.
    //  
</source>
<br>
<br>
leider fehlte auf meinem Suse 9.2 der Befehl htpasswd. (Ich hab in mir von einem anderen Server gezogen, was ich dazu alles tun musste das Ding zum Laufen zu bringen: Ich rede nicht gerne davon!). Also ist die erste Hürde, das Ding zu installieren, danach ist es einfach


# Wechsle in das html Verzeichnis, das Du schützen willst
=== ArtikelVersendetag ===
# Wird ~DasPasswort~ weggelassen wird über die KOmmandozeile
<source lang="delphi">
# 2 fach nachgefragt.
     ArtikelVersendetag(AUSGABEART_R, ARTIKEL_R:integer): integer; query;
htpasswd -cb .htpasswd ~SubDomain~ ~DasPasswort~
 
== XML RPC ==
 
    <b>abu.ArtikelSuche(SuchStr: string): array of integer; { ARTIKEL_R }</b>
    // Suchmaschine f?ikelsuche
    <b>abu.ArtikelPreis(AUSGABEART_R, ARTIKEL_R:integer): double;</b>
    // 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?
    <b>abu.Land(LAND_R: integer): string;</b>
    // liefert die Landesbezeichnung (als ISO-K?
    <b>abu.KontoInfo(PERSON_R: integer): double;</b>
    // liefert den Kontostand des Kunden (zu zahlen!)
    // erzeugt als Nebeneffekt die aktuelle "Mahnung.html"
    <b>abu.BestellInfo(PERSON_R: integer): integer;</b>
     // liefert den Lieferr?nd des Lieferanten (Erwartete Mengen!)
    // erzeugt als Nebeneffekt die aktuelle "Bestellung.html"
    <b>abu.Bestellen(PERSON_R: integer): integer;</b>
    // erstellt aus dem Einkaufswagen des Kunden eine tats䣨liche
    // Bestellung. Die (neue) Beleg-Nummer wird zur?eben.
    //
    <b>abu.ArtikelVersendetag(AUSGABEART_R, ARTIKEL_R:integer): integer;</b>
     //
     //
     // 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 318: 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 324: 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>
    <b>abu.Verlag(VERLAG_R:integer): string;</b>
<br>
 
=== 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>
    <b>abu.Versandkosten(PERSON_R:integer): double;</b>
<br>
     // Liefert passend zum "Kunden,Umfang des Einkaufswagen,Versandart des Kunden" die
 
     // passenden Versandkosten. Im Moment als dummy immer 3,33 ?.
=== Versandkosten ===
<source lang="delphi">
    <b>abu.ArtikelInfo(AUSGABEART_R, ARTIKEL_R, LAND_R, VERLAG_R) : double, string;</b>
    Versandkosten(PERSON_R:integer): double; query;
     // Multi-Info-Funktion f?tere Informationen zu Artikel-Daten
     // Liefert passend zum "Kunden/Umfang des Einkaufswagen/Versandart des Kunden/Rabattstatus" die
     // passenden Versandkosten.  
</source>
 
=== ArtikelInfo ===
<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>
    <b>abu.BasePlug():array of string;</b>
<br>
    //
 
    // liefert diverse Informations-String:
=== ArtikelRabattPreis ===
    //
<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 (Icons und Logos auf externer Site)
    //  9) TPicUpload Versions-Nummer (Bilder hochladen)
    // 10) TMS FlexCel Versions-Nummer (XLS Dokument-Ausgabe)
    // 11) jcl Versions-Nummer
    // 12) jvcl Versions-Nummer
    // 13) Artikel-Bilder-URL (Artikelfotos auf externer Site)
    // 14) SynEdit Versions-Nummer
    // 15) VCLZip Versions-Nummer
    // 16) XMLRPC Versions-Nummer
    // 17) XML Parser Versions-Nummer
    // 18) Datenbank-Benutzer
    // 19) Datenbank-Passwort (verschlüsselt über privaten Key)
     // 20) SYSDBA-Passwort (verschlüsselt über privaten Key)
    // 21) verwendete gds32.dll Versions-Nummer
    //
 
    <b>abu.ArtikelRabattPreis(AUSGABEART_R,ARTIKEL_R,PERSON_R) : array of double;</b>
     //
     //
     // 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>
    <b>abu.PersonNeu : integer; { PERSON_R }</b>
<br>
 
=== 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>
    <b>abu.Ort(PERSON_R) : string; { Adress-Ortsangabe }</b>
<br>
 
=== 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
     <b>abu.Rabatt(PERSON_R) : boolean;</b>
    // 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>
 
=== 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>
    <b>abu.Preis(AUSGABEART_R,ARTIKEL_R,PERSON_R) : array of double;</b>
<br>
 
=== 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 404: Zeile 274:
     //  result[3] Netto-wie-Brutto-Flag: ("1"= JA | "0" = NEIN)
     //  result[3] Netto-wie-Brutto-Flag: ("1"= JA | "0" = NEIN)
     //
     //
   
</source>
    <b>abu.Miniscore(PERSON_R,ARTIKEL_R);</b>
<br>
 
=== Miniscore ===
<source lang="delphi">
    Miniscore(PERSON_R,ARTIKEL_R) : boolean; command;
     //  
     //  
     // Beantragt das Versenden von Miniscores des Artikels ARTIKEL_R  
     // Beantragt das Versenden von Miniscores des Artikels ARTIKEL_R  
Zeile 411: Zeile 285:
     // Zum Versenden wird die eMail-Vorlage "PDF" benutzt.
     // Zum Versenden wird die eMail-Vorlage "PDF" benutzt.
     //
     //
 
</source>
    <b>abu.LoginInfo(PERSON_R : integer);</b>
<br>
 
=== LoginInfo ===
<source lang="delphi">
    LoginInfo(PERSON_R : integer) : boolean; command;
     //  
     //  
     // Beantragt das Versenden einer eMail mit den     
     // Beantragt das Versenden einer eMail mit den     
Zeile 419: Zeile 297:
     // Zum Versenden wird die eMail-Vorlage "LOGIN" Benutzt.
     // Zum Versenden wird die eMail-Vorlage "LOGIN" Benutzt.
     //
     //
</source>
<br>
=== Senden ===
<source lang="delphi">
    Senden(GeraeteNo: String) : boolean; command;
    //
    // Importiert Neuerungen der OrgaMon-App und stellt das
    // neue Auftragsvolumen bereit.
    //
</source>
=== NextVal ===
<source lang="delphi">
    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
    //
</source>
== XMLRPC API (cOrgaMon-App) ==
=== BasePlug ===
<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>
=== StartTAN ===
<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
    // 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
</source>
=== ProceedTAN ===
<source lang="delphi">
    procedure ProceedTAN (TAN:string); { 0=OK,Ansonsten Fehlercodes } command;
    //
    // verarbeitet alle Eingangsdaten und stellt die Ergebnisdateien
    // im entsprechenden TAN Verzeichnis zur Verfügung.
</source>

Aktuelle Version vom 22. Februar 2024, 19: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.