ECommerce

Aus OrgaMon Wiki
Zur Navigation springen Zur Suche springen

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.

Funktions Überblick

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:

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/
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
# für sort.txt sorgen

chmod 666 sort.txt
  • PHP - Script zur Dateianzeige
 <?php
  define(SortOrderFileName,"sort.txt");
 
  function save($s)
  { $fp = fopen(SortOrderFileName,"w");
    fputs($fp,$s);
    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++) 
   { $fn = $filename[$i];
     $fd = $filedate[$i];
     echo "<tr>";
 
     // Datei-Name
     if (strpos($fn,".html")>1) {
      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 "  ";
     echo date ("H:i:s", $fd);
     echo "</td>";
 
     echo "</tr>"; 
   } 
   
  ?>
 
  <!-- END BAUSTELLE -->
  <!-- INSERT BAUSTELLE -->
  </table>
  </center>
  </body>
  </html>
 
  • Virtueller Host auf die Ablage leiten
#
# Datei /etc/apache2/vhosts.d/~SubDomain~.orgamon.de.conf
#
<VirtualHost *>
 ServerName ~SubDomain~.orgamon.de
 DocumentRoot /srv/www/htdocs/~SubDomain~
</VirtualHost> 

<Directory /srv/www/htdocs/~SubDomain~>
 AuthType Basic
 AuthName "Mandant Ablage"
 AuthUserFile /srv/www/htdocs/~SubDomain~/.htpasswd
 Require user ~SubDomain~
</Directory>

Verzeichnisschutz mit htpassed
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
# Wird ~DasPasswort~ weggelassen wird über die KOmmandozeile
# 2 fach nachgefragt.
htpasswd -cb .htpasswd ~SubDomain~ ~DasPasswort~

XML RPC

   abu.ArtikelSuche(SuchStr: string): array of integer; { ARTIKEL_R }
   // Suchmaschine f?ikelsuche

   abu.ArtikelPreis(AUSGABEART_R, ARTIKEL_R:integer): double;
   // 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?

   abu.Land(LAND_R: integer): string;
   // liefert die Landesbezeichnung (als ISO-K?

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

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

   abu.Bestellen(PERSON_R: integer): integer;
   // erstellt aus dem Einkaufswagen des Kunden eine tats䣨liche
   // Bestellung. Die (neue) Beleg-Nummer wird zur?eben.
   //

   abu.ArtikelVersendetag(AUSGABEART_R, ARTIKEL_R:integer): integer;
   //
   // GELBE STATI
   //  0=keine Info ?erf?eit vorhanden
   //
   // ROTE STATI:
   //  1=entg?vergriffen
   //  2=zur Zeit vergriffen, Neuauflage jedoch ungewiss
   //  3=zur Zeit vergriffen, Neuauflage jedoch sicher
   //
   //
   // GRÜŽE STATI:
   //  10=heute lieferbar  (=ist 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ÜŽE STATI:
   //  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ÜŽE STATI:
   // >20020101= Konkretes Lieferdatum (z.B. Erscheinungsdatum!)
   //  20031003= am 03.10.2003 lieferbar (da es z.B. an diesem Tag erscheint)
   //            (Vorbestellungen nat? m?ch)
   //

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

   abu.Versandkosten(PERSON_R:integer): double;
   // Liefert passend zum "Kunden,Umfang des Einkaufswagen,Versandart des Kunden" die
   // passenden Versandkosten. Im Moment als dummy immer 3,33 ?.

   abu.ArtikelInfo(AUSGABEART_R, ARTIKEL_R, LAND_R, VERLAG_R) : double, string;
   // Multi-Info-Funktion f?tere Informationen zu Artikel-Daten
   // Ergebnisse: Preis, "ISO-Landeskennzeichen" "-" "Verlag"

   abu.BasePlug():array of string;
   // liefert diverse Informations-String:
   // 1) Datenbankname
   // 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,
   // diese Funktion liefert noch die Rabatt-Zahl dazu!
   //

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

   abu.Ort(PERSON_R) : string; { Adress-Ortsangabe }
   //
   // Zu der angegebenen Person wird die Orts-Angabe zusammengestellt.
   // Dazu wird Land, Plz, Ortsname und Ortsteil landesspeziefisch
   // kombiniert.

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

   abu.Preis(AUSGABEART_R,ARTIKEL_R,PERSON_R) : array of double;
   //
   // Ersetzt in Zukunft die beiden Methoden abu.ArtikelPreis und abu.ArtikelRabattPreis
   // Falls der Kunde Rabatte bekommt, was beim Login mit abu.Rabatt gepr?rd,
   // wird der Funktion der wirkliche PERSON_R ?ben, andernfalls 0.
   // R?ewerte 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)
   //
   
   abu.Miniscore(PERSON_R,ARTIKEL_R);
   // 
   // Beantragt das Versenden von Miniscores des Artikels ARTIKEL_R 
   // an den Benutzer PERSON_R 
   //