Revision ab18d1c0
Von Jan Büren vor etwa 6 Jahren hinzugefügt
SL/InstallationCheck.pm | ||
---|---|---|
{ name => "Email::MIME", url => "http://search.cpan.org/~rjbs/", debian => 'libemail-mime-perl' },
|
||
{ name => "FCGI", version => '0.72', url => "http://search.cpan.org/~mstrout/", debian => 'libfcgi-perl' },
|
||
{ name => "File::Copy::Recursive", url => "http://search.cpan.org/~dmuey/", debian => 'libfile-copy-recursive-perl' },
|
||
{ name => "File::Flock", version => '2008.01', url => "http://search.cpan.org/~muir/", }, # fallback version 98
|
||
{ name => "File::Flock", version => '2008.01', url => "http://search.cpan.org/~muir/", debian => 'libfile-flock-perl' },
|
||
{ name => "File::MimeInfo", url => "http://search.cpan.org/~michielb/", debian => 'libfile-mimeinfo-perl' },
|
||
{ name => "File::Slurp", url => "https://metacpan.org/author/CAPOEIRAB", debian => 'libfile-slurp-perl' },
|
||
{ name => "GD", url => "http://search.cpan.org/~lds/", debian => 'libgd-gd2-perl', },
|
||
{ name => 'HTML::Parser', url => 'http://search.cpan.org/~gaas/', debian => 'libhtml-parser-perl', },
|
||
{ name => 'HTML::Restrict', url => 'http://search.cpan.org/~oalders/', debian => 'libhtml-restrict-perl'},
|
||
... | ... | |
{ name => "Rose::DB", url => "http://search.cpan.org/~jsiracusa/", debian => 'librose-db-perl' },
|
||
{ name => "Rose::DB::Object", version => 0.788, url => "http://search.cpan.org/~jsiracusa/", debian => 'librose-db-object-perl' },
|
||
{ name => "Set::Infinite", version => '0.63', url => "http://search.cpan.org/~fglock/", debian => 'libset-infinite-perl' },
|
||
{ name => "Set::Crontab", version => '1.03', url => "http://search.cpan.org/~ams/", },
|
||
{ name => "Set::Crontab", version => '1.03', url => "http://search.cpan.org/~ams/", debian => 'libset-crontab-perl' },
|
||
{ name => "String::ShellQuote", version => 1.01, url => "http://search.cpan.org/~rosch/", debian => 'libstring-shellquote-perl' },
|
||
{ name => "Sort::Naturally", url => "http://search.cpan.org/~sburke/", debian => 'libsort-naturally-perl' },
|
||
# Test::Harness is core, so no Debian packages. Test::Harness 3.00 was first packaged in 5.10.1
|
doc/UPGRADE | ||
---|---|---|
** BITTE FERTIGEN SIE VOR DEM UPGRADE EIN BACKUP IHRER DATENBANK(EN) AN! **
|
||
|
||
|
||
Upgrade auf v3.x.x
|
||
Upgrade auf v3.5.3
|
||
|
||
* Fallback-Module entfernt
|
||
|
||
... | ... | |
dieser Version nicht mehr mit ausgeliefert.
|
||
Bitte vor dem Anmelden an der Weboberfläche 'scripts/installation_check.pl -v' ausführen
|
||
und die entsprechenden Module installieren.
|
||
S.a. weitere Details in der aktuellen kivitendo-Dokumentation.
|
||
|
||
|
||
Upgrade auf v3.5.1
|
doc/dokumentation.xml | ||
---|---|---|
<literal>Set::Infinite</literal>,
|
||
<literal>List::UtilsBy</literal>,
|
||
<literal>DateTime::Set</literal>,
|
||
<literal>DateTime::Event::Cron</literal></para>
|
||
<literal>DateTime::Event::Cron</literal>
|
||
<literal>Daemon::Generic</literal>
|
||
<literal>DateTime::Event::Cron</literal>
|
||
<literal>File::Flock</literal>
|
||
<literal>File::Slurp</literal>
|
||
<literal>Set::Crontab</literal>
|
||
<literal>Exception::Lite</literal>
|
||
</para>Für die letzten beiden Module liefert kivitendo fallback-Module aus, da
|
||
diese überhaupt nicht in debian oder in der benötigten Version zu Verfügung stehen (Stand Anfang 2019).
|
||
|
||
<para>Seit Version größer v3.5.0 sind die folgenden Pakete
|
||
hinzugekommen: <literal>Text::Unidecode</literal>,
|
||
... | ... | |
libfile-copy-recursive-perl postgresql libalgorithm-checkdigits-perl \
|
||
libcrypt-pbkdf2-perl git libcgi-pm-perl libtext-unidecode-perl libwww-perl\
|
||
postgresql-contrib aqbanking-tools poppler-utils libhtml-restrict-perl\
|
||
libdatetime-event-cron-perl libdatetime-set-perl libset-infinite-perl liblist-utilsby-perl
|
||
libdatetime-set-perl libset-infinite-perl liblist-utilsby-perl\
|
||
libdaemon-generic-perl libfile-flock-perl libfile-slurp-perl
|
||
|
||
</programlisting>
|
||
<para>Ab Ubuntu Version 18.04 LTS sind alle benötigten Pakete in der Distributions verfügbar.</para>
|
||
<para>Für ältere Ubuntu/Debians müßen einige Pakete per CPAN installiert werden.
|
doc/html/ch02s02.html | ||
---|---|---|
<code class="literal">List::UtilsBy</code>,
|
||
<code class="literal">DateTime::Set</code>,
|
||
<code class="literal">DateTime::Event::Cron</code>
|
||
</p><p>Seit Version größer v3.5.0 sind die folgenden Pakete
|
||
|
||
<code class="literal">Daemon::Generic</code>
|
||
|
||
<code class="literal">DateTime::Event::Cron</code>
|
||
|
||
<code class="literal">File::Flock</code>
|
||
|
||
<code class="literal">File::Slurp</code>
|
||
|
||
<code class="literal">Set::Crontab</code>
|
||
|
||
<code class="literal">Exception::Lite</code>
|
||
|
||
</p>Für die letzten beiden Module liefert kivitendo fallback-Module aus, da
|
||
diese überhaupt nicht in debian oder in der benötigten Version zu Verfügung stehen (Stand Anfang 2019).
|
||
|
||
<p>Seit Version größer v3.5.0 sind die folgenden Pakete
|
||
hinzugekommen: <code class="literal">Text::Unidecode</code>,
|
||
<code class="literal">LWP::Authen::Digest</code>,
|
||
<code class="literal">LWP::UserAgent</code>
|
||
... | ... | |
sind auch in 2.6.1 weiterhin mit ausgeliefert, wurden in einer
|
||
zukünftigen Version aber aus dem Paket entfernt werden. Es wird
|
||
empfohlen diese Module zusammen mit den anderen als Bibliotheken zu
|
||
installieren.</p><div class="sect3" title="2.2.2.1. Debian und Ubuntu"><div class="titlepage"><div><div><h4 class="title"><a name="d0e486"></a>2.2.2.1. Debian und Ubuntu</h4></div></div></div><p>Für Debian und Ubuntu stehen die meisten der benötigten
|
||
installieren.</p><div class="sect3" title="2.2.2.1. Debian und Ubuntu"><div class="titlepage"><div><div><h4 class="title"><a name="d0e505"></a>2.2.2.1. Debian und Ubuntu</h4></div></div></div><p>Für Debian und Ubuntu stehen die meisten der benötigten
|
||
Pakete als Debian-Pakete zur Verfügung. Sie können mit
|
||
folgendem Befehl installiert werden:</p><pre class="programlisting">apt install apache2 libarchive-zip-perl libclone-perl \
|
||
libconfig-std-perl libdatetime-perl libdbd-pg-perl libdbi-perl \
|
||
... | ... | |
libfile-copy-recursive-perl postgresql libalgorithm-checkdigits-perl \
|
||
libcrypt-pbkdf2-perl git libcgi-pm-perl libtext-unidecode-perl libwww-perl\
|
||
postgresql-contrib aqbanking-tools poppler-utils libhtml-restrict-perl\
|
||
libdatetime-event-cron-perl libdatetime-set-perl libset-infinite-perl liblist-utilsby-perl
|
||
libdatetime-set-perl libset-infinite-perl liblist-utilsby-perl\
|
||
libdaemon-generic-perl libfile-flock-perl libfile-slurp-perl
|
||
|
||
</pre><p>Ab Ubuntu Version 18.04 LTS sind alle benötigten Pakete in der Distributions verfügbar.</p><p>Für ältere Ubuntu/Debians müßen einige Pakete per CPAN installiert werden.
|
||
Das geht bspw. für das benötige Paket HTML::Restrict mit:</p><pre class="programlisting">apt-get install build-essential
|
||
cpan HTML::Restrict</pre></div><div class="sect3" title="2.2.2.2. Fedora"><div class="titlepage"><div><div><h4 class="title"><a name="d0e499"></a>2.2.2.2. Fedora</h4></div></div></div><p>Für Fedora stehen die meisten der benötigten Perl-Pakete als
|
||
cpan HTML::Restrict</pre></div><div class="sect3" title="2.2.2.2. Fedora"><div class="titlepage"><div><div><h4 class="title"><a name="d0e518"></a>2.2.2.2. Fedora</h4></div></div></div><p>Für Fedora stehen die meisten der benötigten Perl-Pakete als
|
||
RPM-Pakete zur Verfügung. Sie können mit folgendem Befehl
|
||
installiert werden:</p><pre class="programlisting">dnf install httpd mod_fcgid perl-Archive-Zip perl-Clone perl-DBD-Pg \
|
||
perl-DBI perl-DateTime perl-Email-Address perl-Email-MIME perl-FCGI \
|
||
... | ... | |
perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv perl-URI \
|
||
perl-XML-Writer perl-YAML perl-parent postgresql-server perl-CPAN \
|
||
perl-Algorithm-CheckDigits perl-GD perl-Class-XSAccessor perl-Text-Balanced perl-libwww-perl</pre><p>Zusätzlich müssen einige Pakete aus dem CPAN installiert
|
||
werden. Dazu können Sie die folgenden Befehle nutzen:</p><pre class="programlisting">cpan Config::Std HTML::Restrict</pre></div><div class="sect3" title="2.2.2.3. openSUSE"><div class="titlepage"><div><div><h4 class="title"><a name="d0e510"></a>2.2.2.3. openSUSE</h4></div></div></div><p>Für openSUSE stehen die meisten der benötigten Perl-Pakete als
|
||
werden. Dazu können Sie die folgenden Befehle nutzen:</p><pre class="programlisting">cpan Config::Std HTML::Restrict</pre></div><div class="sect3" title="2.2.2.3. openSUSE"><div class="titlepage"><div><div><h4 class="title"><a name="d0e529"></a>2.2.2.3. openSUSE</h4></div></div></div><p>Für openSUSE stehen die meisten der benötigten Perl-Pakete als
|
||
RPM-Pakete zur Verfügung. Sie können mit folgendem Befehl
|
||
installiert werden:</p><pre class="programlisting">zypper install apache2 apache2-mod_fcgid perl-Archive-Zip perl-Clone \
|
||
perl-Config-Std perl-DBD-Pg perl-DBI perl-DateTime perl-Email-Address \
|
||
... | ... | |
perl-Sort-Naturally perl-Template-Toolkit perl-Text-CSV_XS perl-Text-Iconv \
|
||
perl-URI perl-XML-Writer perl-YAML perl-CPAN \
|
||
perl-Algorithm-CheckDigits perl-GD perl-Class-XSAccessor postgresql-server perl-libwwww-perl</pre><p>Zusätzlich müssen einige Pakete aus dem CPAN installiert
|
||
werden. Dazu können Sie die folgenden Befehle nutzen:</p><pre class="programlisting">cpan Rose::Db::Object</pre></div></div><div class="sect2" title="2.2.3. Andere Pakete installieren"><div class="titlepage"><div><div><h3 class="title"><a name="d0e521"></a>2.2.3. Andere Pakete installieren</h3></div></div></div><p>Seit Version v3.4.0 wird für den Bankimport optional das Paket
|
||
werden. Dazu können Sie die folgenden Befehle nutzen:</p><pre class="programlisting">cpan Rose::Db::Object</pre></div></div><div class="sect2" title="2.2.3. Andere Pakete installieren"><div class="titlepage"><div><div><h3 class="title"><a name="d0e540"></a>2.2.3. Andere Pakete installieren</h3></div></div></div><p>Seit Version v3.4.0 wird für den Bankimport optional das Paket
|
||
'aqbanking-tools' benötigt.</p><p>Debian und Ubuntu: </p><pre class="programlisting">apt install aqbanking-tools
|
||
</pre><p>
|
||
</p><p>Fedora: </p><pre class="programlisting">dnf install aqbanking</pre><p>
|
doc/html/ch02s06.html | ||
---|---|---|
<html><head>
|
||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||
<title>2.6. Webserver-Konfiguration</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="kivitendo 3.5.1: Installation, Konfiguration, Entwicklung"><link rel="up" href="ch02.html" title="Kapitel 2. Installation und Grundkonfiguration"><link rel="prev" href="ch02s05.html" title="2.5. Anpassung der PostgreSQL-Konfiguration"><link rel="next" href="ch02s07.html" title="2.7. Der Task-Server"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">2.6. Webserver-Konfiguration</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s05.html">Zurück</a> </td><th width="60%" align="center">Kapitel 2. Installation und Grundkonfiguration</th><td width="20%" align="right"> <a accesskey="n" href="ch02s07.html">Weiter</a></td></tr></table><hr></div><div class="sect1" title="2.6. Webserver-Konfiguration"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="Apache-Konfiguration"></a>2.6. Webserver-Konfiguration</h2></div></div></div><div class="sect2" title="2.6.1. Grundkonfiguration mittels CGI"><div class="titlepage"><div><div><h3 class="title"><a name="d0e977"></a>2.6.1. Grundkonfiguration mittels CGI</h3></div></div></div><div class="note" title="Anmerkung" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Note"><tr><td rowspan="2" align="center" valign="top" width="25"><img alt="[Anmerkung]" src="system/docbook-xsl/images/note.png"></td><th align="left">Anmerkung</th></tr><tr><td align="left" valign="top"><p>Für einen deutlichen Performanceschub sorgt die Ausführung
|
||
<title>2.6. Webserver-Konfiguration</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="kivitendo 3.5.1: Installation, Konfiguration, Entwicklung"><link rel="up" href="ch02.html" title="Kapitel 2. Installation und Grundkonfiguration"><link rel="prev" href="ch02s05.html" title="2.5. Anpassung der PostgreSQL-Konfiguration"><link rel="next" href="ch02s07.html" title="2.7. Der Task-Server"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">2.6. Webserver-Konfiguration</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch02s05.html">Zurück</a> </td><th width="60%" align="center">Kapitel 2. Installation und Grundkonfiguration</th><td width="20%" align="right"> <a accesskey="n" href="ch02s07.html">Weiter</a></td></tr></table><hr></div><div class="sect1" title="2.6. Webserver-Konfiguration"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="Apache-Konfiguration"></a>2.6. Webserver-Konfiguration</h2></div></div></div><div class="sect2" title="2.6.1. Grundkonfiguration mittels CGI"><div class="titlepage"><div><div><h3 class="title"><a name="d0e996"></a>2.6.1. Grundkonfiguration mittels CGI</h3></div></div></div><div class="note" title="Anmerkung" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Note"><tr><td rowspan="2" align="center" valign="top" width="25"><img alt="[Anmerkung]" src="system/docbook-xsl/images/note.png"></td><th align="left">Anmerkung</th></tr><tr><td align="left" valign="top"><p>Für einen deutlichen Performanceschub sorgt die Ausführung
|
||
mittels FastCGI/FCGI. Die Einrichtung wird ausführlich im Abschnitt
|
||
<a class="xref" href="ch02s06.html#Apache-Konfiguration.FCGI" title="2.6.2. Konfiguration für FastCGI/FCGI">Konfiguration für FastCGI/FCGI</a> beschrieben.</p></td></tr></table></div><p>Der Zugriff auf das Programmverzeichnis muss in der Apache
|
||
Webserverkonfigurationsdatei <code class="literal">httpd.conf</code> eingestellt
|
||
... | ... | |
Alias /url/for/kivitendo-erp-fcgid/ /path/to/kivitendo-erp/</pre><p>Dann ist unter <code class="filename">/url/for/kivitendo-erp/</code>
|
||
die normale Version erreichbar, und unter
|
||
<code class="constant">/url/for/kivitendo-erp-fcgid/</code> die
|
||
FastCGI-Version.</p></div></div><div class="sect2" title="2.6.3. Weitergehende Konfiguration"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1128"></a>2.6.3. Weitergehende Konfiguration</h3></div></div></div><p>Für einen deutlichen Sicherheitsmehrwert sorgt die Ausführung
|
||
FastCGI-Version.</p></div></div><div class="sect2" title="2.6.3. Weitergehende Konfiguration"><div class="titlepage"><div><div><h3 class="title"><a name="d0e1147"></a>2.6.3. Weitergehende Konfiguration</h3></div></div></div><p>Für einen deutlichen Sicherheitsmehrwert sorgt die Ausführung
|
||
von kivitendo nur über https-verschlüsselten Verbindungen, sowie
|
||
weiteren Zusatzmassnahmen, wie beispielsweise Basic Authenticate. Die
|
||
Konfigurationsmöglichkeiten sprengen allerdings den Rahmen dieser
|
doc/html/ch02s07.html | ||
---|---|---|
Links aus einem der Runlevel-Verzeichnisse heraus in den Boot-Prozess
|
||
einzubinden. Da das bei neueren Linux-Distributionen aber nicht
|
||
zwangsläufig funktioniert, werden auch Start-Scripte mitgeliefert, die
|
||
anstelle eines symbolischen Links verwendet werden können.</p><div class="sect3" title="2.7.3.1. SystemV-basierende Systeme (z.B. ältere Debian, ältere openSUSE, ältere Fedora)"><div class="titlepage"><div><div><h4 class="title"><a name="d0e1202"></a>2.7.3.1. SystemV-basierende Systeme (z.B. ältere Debian, ältere
|
||
anstelle eines symbolischen Links verwendet werden können.</p><div class="sect3" title="2.7.3.1. SystemV-basierende Systeme (z.B. ältere Debian, ältere openSUSE, ältere Fedora)"><div class="titlepage"><div><div><h4 class="title"><a name="d0e1221"></a>2.7.3.1. SystemV-basierende Systeme (z.B. ältere Debian, ältere
|
||
openSUSE, ältere Fedora)</h4></div></div></div><p>Kopieren Sie die Datei
|
||
<code class="filename">scripts/boot/system-v/kivitendo-task-server</code>
|
||
nach <code class="filename">/etc/init.d/kivitendo-task-server</code>. Passen
|
||
... | ... | |
<code class="literal">DAEMON=....</code>). Binden Sie das Script in den
|
||
Boot-Prozess ein. Dies ist distributionsabhängig:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Debian-basierende Systeme:</p><pre class="programlisting">update-rc.d kivitendo-task-server defaults
|
||
insserv kivitendo-task-server</pre></li><li class="listitem"><p>Ältere openSUSE und ältere Fedora:</p><pre class="programlisting">chkconfig --add kivitendo-task-server</pre></li></ul></div><p>Danach kann der Task-Server mit dem folgenden Befehl gestartet
|
||
werden:</p><pre class="programlisting">/etc/init.d/kivitendo-task-server start</pre></div><div class="sect3" title="2.7.3.2. Upstart-basierende Systeme (z.B. Ubuntu bis 14.04)"><div class="titlepage"><div><div><h4 class="title"><a name="d0e1231"></a>2.7.3.2. Upstart-basierende Systeme (z.B. Ubuntu bis 14.04)</h4></div></div></div><p>Kopieren Sie die Datei
|
||
werden:</p><pre class="programlisting">/etc/init.d/kivitendo-task-server start</pre></div><div class="sect3" title="2.7.3.2. Upstart-basierende Systeme (z.B. Ubuntu bis 14.04)"><div class="titlepage"><div><div><h4 class="title"><a name="d0e1250"></a>2.7.3.2. Upstart-basierende Systeme (z.B. Ubuntu bis 14.04)</h4></div></div></div><p>Kopieren Sie die Datei
|
||
<code class="filename">scripts/boot/upstart/kivitendo-task-server.conf</code>
|
||
nach <code class="filename">/etc/init/kivitendo-task-server.conf</code>.
|
||
Passen Sie in der kopierten Datei den Pfad zum Task-Server an (Zeile
|
||
<code class="literal">exec ....</code>).</p><p>Danach kann der Task-Server mit dem folgenden Befehl gestartet
|
||
werden:</p><pre class="programlisting">service kivitendo-task-server start</pre></div><div class="sect3" title="2.7.3.3. systemd-basierende Systeme (z.B. neure openSUSE, neuere Fedora, neuere Ubuntu und neuere Debians)"><div class="titlepage"><div><div><h4 class="title"><a name="d0e1249"></a>2.7.3.3. systemd-basierende Systeme (z.B. neure openSUSE, neuere
|
||
werden:</p><pre class="programlisting">service kivitendo-task-server start</pre></div><div class="sect3" title="2.7.3.3. systemd-basierende Systeme (z.B. neure openSUSE, neuere Fedora, neuere Ubuntu und neuere Debians)"><div class="titlepage"><div><div><h4 class="title"><a name="d0e1268"></a>2.7.3.3. systemd-basierende Systeme (z.B. neure openSUSE, neuere
|
||
Fedora, neuere Ubuntu und neuere Debians)</h4></div></div></div><p>Kopieren Sie die Datei
|
||
<code class="filename">scripts/boot/systemd/kivitendo-task-server.service</code>
|
||
nach <code class="filename">/etc/systemd/system/</code>. Passen Sie in der
|
doc/html/ch02s13.html | ||
---|---|---|
Verzeichnis umbenannt werden.</p><p>Dieses Verzeichnis, wie auch das komplette
|
||
<code class="literal">users</code>-Verzeichnis, muss vom Webserver beschreibbar
|
||
sein. Dieses wurde bereits erledigt (siehe <a class="xref" href="ch02s03.html" title="2.3. Manuelle Installation des Programmpaketes">Manuelle Installation des Programmpaketes</a>), kann aber erneut
|
||
überprüft werden, wenn die Konvertierung nach PDF fehlschlägt.</p><div class="sect2" title="2.13.1. OpenDocument (odt) Druckvorlagen mit Makros"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2293"></a>2.13.1. OpenDocument (odt) Druckvorlagen mit Makros</h3></div></div></div><p>OpenDocument Vorlagen können Makros enthalten, welche komplexere
|
||
überprüft werden, wenn die Konvertierung nach PDF fehlschlägt.</p><div class="sect2" title="2.13.1. OpenDocument (odt) Druckvorlagen mit Makros"><div class="titlepage"><div><div><h3 class="title"><a name="d0e2312"></a>2.13.1. OpenDocument (odt) Druckvorlagen mit Makros</h3></div></div></div><p>OpenDocument Vorlagen können Makros enthalten, welche komplexere
|
||
Aufgaben erfüllen.</p><p>Der Vorlagensatz "rev-odt" enthält solche Vorlagen mit <span class="bold"><strong>Schweizer Bank-Einzahlungsscheinen (BESR)</strong></span>.
|
||
Diese Makros haben die Aufgabe, die in den Einzahlungsscheinen
|
||
benötigte Referenznummer und Kodierzeile zu erzeugen. Hier eine kurze
|
||
Beschreibung, wie die Makros aufgebaut sind, und was bei ihrer Nutzung
|
||
zu beachten ist (<span class="bold"><strong>in fett sind nötige einmalige
|
||
Anpassungen aufgeführt</strong></span>):</p><div class="sect3" title="2.13.1.1. Bezeichnung der Vorlagen"><div class="titlepage"><div><div><h4 class="title"><a name="d0e2306"></a>2.13.1.1. Bezeichnung der Vorlagen</h4></div></div></div><p>Rechnung: invoice_besr.odt, Auftrag:
|
||
sales_order_besr.odt</p></div><div class="sect3" title="2.13.1.2. Vorbereitungen im Adminbereich"><div class="titlepage"><div><div><h4 class="title"><a name="d0e2311"></a>2.13.1.2. Vorbereitungen im Adminbereich</h4></div></div></div><p>Damit beim Erstellen von Rechnungen und Aufträgen neben der
|
||
Anpassungen aufgeführt</strong></span>):</p><div class="sect3" title="2.13.1.1. Bezeichnung der Vorlagen"><div class="titlepage"><div><div><h4 class="title"><a name="d0e2325"></a>2.13.1.1. Bezeichnung der Vorlagen</h4></div></div></div><p>Rechnung: invoice_besr.odt, Auftrag:
|
||
sales_order_besr.odt</p></div><div class="sect3" title="2.13.1.2. Vorbereitungen im Adminbereich"><div class="titlepage"><div><div><h4 class="title"><a name="d0e2330"></a>2.13.1.2. Vorbereitungen im Adminbereich</h4></div></div></div><p>Damit beim Erstellen von Rechnungen und Aufträgen neben der
|
||
Standardvorlage ohne Einzahlungsschein weitere Vorlagen (z.B. mit
|
||
Einzahlungsschein) auswählbar sind, muss für jedes Vorlagen-Suffix
|
||
ein Drucker eingerichtet werden:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Druckeradministration → Drucker hinzufügen</p></li><li class="listitem"><p>Mandant wählen</p></li><li class="listitem"><p>Druckerbeschreibung → aussagekräftiger Text: wird in der
|
||
... | ... | |
Aufträgen oder Rechnungen als odt-Datei keine Bedeutung, darf
|
||
aber nicht leer sein)</p></li><li class="listitem"><p>Vorlagenkürzel → besr bzw. selbst gewähltes Vorlagensuffix
|
||
(muss genau der Zeichenfolge entsprechen, die zwischen
|
||
"invoice_" bzw. "sales_order_" und ".odt" steht.)</p></li><li class="listitem"><p>speichern</p></li></ul></div></div><div class="sect3" title="2.13.1.3. Benutzereinstellungen"><div class="titlepage"><div><div><h4 class="title"><a name="d0e2335"></a>2.13.1.3. Benutzereinstellungen</h4></div></div></div><p>Wer den Ausdruck mit Einzahlungsschein als Standardeinstellung
|
||
"invoice_" bzw. "sales_order_" und ".odt" steht.)</p></li><li class="listitem"><p>speichern</p></li></ul></div></div><div class="sect3" title="2.13.1.3. Benutzereinstellungen"><div class="titlepage"><div><div><h4 class="title"><a name="d0e2354"></a>2.13.1.3. Benutzereinstellungen</h4></div></div></div><p>Wer den Ausdruck mit Einzahlungsschein als Standardeinstellung
|
||
im Rechnungs- bzw. Auftragsformular angezeigt haben möchte, kann
|
||
dies persönlich für sich bei den Benutzereinstellungen
|
||
konfigurieren:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Programm → Benutzereinstellungen → Druckoptionen</p></li><li class="listitem"><p>Standardvorlagenformat → OpenDocument/OASIS</p></li><li class="listitem"><p>Standardausgabekanal → Bildschirm</p></li><li class="listitem"><p>Standarddrucker → gewünschte Druckerbeschreibung auswählen
|
||
(z.B. mit Einzahlungsschein Bank xy)</p></li><li class="listitem"><p>Anzahl Kopien → leer</p></li><li class="listitem"><p>speichern</p></li></ul></div></div><div class="sect3" title="2.13.1.4. Aufbau und nötige Anpassungen der Vorlagen"><div class="titlepage"><div><div><h4 class="title"><a name="d0e2359"></a>2.13.1.4. Aufbau und nötige Anpassungen der Vorlagen</h4></div></div></div><p>In der Vorlage sind als Modul "BESR" 4 Makros gespeichert, die
|
||
(z.B. mit Einzahlungsschein Bank xy)</p></li><li class="listitem"><p>Anzahl Kopien → leer</p></li><li class="listitem"><p>speichern</p></li></ul></div></div><div class="sect3" title="2.13.1.4. Aufbau und nötige Anpassungen der Vorlagen"><div class="titlepage"><div><div><h4 class="title"><a name="d0e2378"></a>2.13.1.4. Aufbau und nötige Anpassungen der Vorlagen</h4></div></div></div><p>In der Vorlage sind als Modul "BESR" 4 Makros gespeichert, die
|
||
aus dem von kivitendo erzeugten odt-Dokument die korrekte
|
||
Referenznummer inklusive Prüfziffer sowie die Kodierzeile in
|
||
OCRB-Schrift erzeugen und am richtigen Ort ins Dokument
|
||
... | ... | |
angepasst werden.</strong></span> Dabei ist darauf zu achten, dass
|
||
sich die Positionen der Postkonto-Nummern der Bank, sowie der
|
||
Zeichenfolgen dddfr, DDDREF1, DDDREF2, 609, DDDKODIERZEILE nicht
|
||
verschieben.</p></li></ul></div><div class="screenshot"><div class="mediaobject"><img src="images/Einzahlungsschein_Makro.png"></div></div></div><div class="sect3" title="2.13.1.5. Auswahl der Druckvorlage in kivitendo beim Erzeugen einer odt-Rechnung (analog bei Auftrag)"><div class="titlepage"><div><div><h4 class="title"><a name="d0e2423"></a>2.13.1.5. Auswahl der Druckvorlage in kivitendo beim Erzeugen einer
|
||
verschieben.</p></li></ul></div><div class="screenshot"><div class="mediaobject"><img src="images/Einzahlungsschein_Makro.png"></div></div></div><div class="sect3" title="2.13.1.5. Auswahl der Druckvorlage in kivitendo beim Erzeugen einer odt-Rechnung (analog bei Auftrag)"><div class="titlepage"><div><div><h4 class="title"><a name="d0e2442"></a>2.13.1.5. Auswahl der Druckvorlage in kivitendo beim Erzeugen einer
|
||
odt-Rechnung (analog bei Auftrag)</h4></div></div></div><p>Im Fussbereich der Rechnungsmaske muss neben Rechnung,
|
||
OpenDocument/OASIS und Bildschirm die im Adminbereich erstellte
|
||
Druckerbeschreibung ausgewählt werden, falls diese nicht bereits bei
|
||
den Benutzereinstellungen als persönlicher Standard gewählt
|
||
wurde.</p></div><div class="sect3" title="2.13.1.6. Makroeinstellungen in LibreOffice anpassen"><div class="titlepage"><div><div><h4 class="title"><a name="d0e2428"></a>2.13.1.6. Makroeinstellungen in LibreOffice anpassen</h4></div></div></div><p>Falls beim Öffnen einer von kivitendo erzeugten odt-Rechnung
|
||
wurde.</p></div><div class="sect3" title="2.13.1.6. Makroeinstellungen in LibreOffice anpassen"><div class="titlepage"><div><div><h4 class="title"><a name="d0e2447"></a>2.13.1.6. Makroeinstellungen in LibreOffice anpassen</h4></div></div></div><p>Falls beim Öffnen einer von kivitendo erzeugten odt-Rechnung
|
||
die Meldung kommt, dass Makros aus Sicherheitsgründen nicht
|
||
ausgeführt werden, so müssen folgende Einstellungen in LibreOffice
|
||
angepasst werden:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Extras → Optionen → Sicherheit → Makrosicherheit</p></li><li class="listitem"><p>Sicherheitslevel auf "Mittel" einstellen (Diese
|
doc/html/ch03s03.html | ||
---|---|---|
<code class="varname">invdate</code>
|
||
</span></dt><dd><p>Rechnungsdatum</p></dd><dt><span class="term">
|
||
<code class="varname">invnumber</code>
|
||
</span></dt><dd><p>Rechnungsnummer</p></dd></dl></div></div></div><div class="sect2" title="3.3.10. Variablen in anderen Vorlagen"><div class="titlepage"><div><div><h3 class="title"><a name="dokumentenvorlagen-und-variablen.andere-vorlagen"></a>3.3.10. Variablen in anderen Vorlagen</h3></div></div></div><div class="sect3" title="3.3.10.1. Einführung"><div class="titlepage"><div><div><h4 class="title"><a name="d0e5695"></a>3.3.10.1. Einführung</h4></div></div></div><p>Die Variablen in anderen Vorlagen sind ähnlich wie in der
|
||
</span></dt><dd><p>Rechnungsnummer</p></dd></dl></div></div></div><div class="sect2" title="3.3.10. Variablen in anderen Vorlagen"><div class="titlepage"><div><div><h3 class="title"><a name="dokumentenvorlagen-und-variablen.andere-vorlagen"></a>3.3.10. Variablen in anderen Vorlagen</h3></div></div></div><div class="sect3" title="3.3.10.1. Einführung"><div class="titlepage"><div><div><h4 class="title"><a name="d0e5714"></a>3.3.10.1. Einführung</h4></div></div></div><p>Die Variablen in anderen Vorlagen sind ähnlich wie in der
|
||
Rechnung. Allerdings heißen die Variablen, die mit
|
||
<code class="varname">inv</code> beginnen, jetzt anders. Bei den Angeboten
|
||
fangen sie mit <code class="varname">quo</code> für "quotation" an:
|
doc/html/ch03s07.html | ||
---|---|---|
<html><head>
|
||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||
<title>3.7. Artikelklassifizierung</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="kivitendo 3.5.1: Installation, Konfiguration, Entwicklung"><link rel="up" href="ch03.html" title="Kapitel 3. Features und Funktionen"><link rel="prev" href="ch03s06.html" title="3.6. Schweizer Kontenpläne"><link rel="next" href="ch03s08.html" title="3.8. Dateiverwaltung (Mini-DMS)"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">3.7. Artikelklassifizierung</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s06.html">Zurück</a> </td><th width="60%" align="center">Kapitel 3. Features und Funktionen</th><td width="20%" align="right"> <a accesskey="n" href="ch03s08.html">Weiter</a></td></tr></table><hr></div><div class="sect1" title="3.7. Artikelklassifizierung"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="features.part_classification"></a>3.7. Artikelklassifizierung</h2></div></div></div><div class="sect2" title="3.7.1. Übersicht"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6363"></a>3.7.1. Übersicht</h3></div></div></div><p>Die Klassifizierung von Artikeln dient einer weiteren
|
||
<title>3.7. Artikelklassifizierung</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="kivitendo 3.5.1: Installation, Konfiguration, Entwicklung"><link rel="up" href="ch03.html" title="Kapitel 3. Features und Funktionen"><link rel="prev" href="ch03s06.html" title="3.6. Schweizer Kontenpläne"><link rel="next" href="ch03s08.html" title="3.8. Dateiverwaltung (Mini-DMS)"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">3.7. Artikelklassifizierung</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s06.html">Zurück</a> </td><th width="60%" align="center">Kapitel 3. Features und Funktionen</th><td width="20%" align="right"> <a accesskey="n" href="ch03s08.html">Weiter</a></td></tr></table><hr></div><div class="sect1" title="3.7. Artikelklassifizierung"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="features.part_classification"></a>3.7. Artikelklassifizierung</h2></div></div></div><div class="sect2" title="3.7.1. Übersicht"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6382"></a>3.7.1. Übersicht</h3></div></div></div><p>Die Klassifizierung von Artikeln dient einer weiteren
|
||
Gliederung, um zum Beispiel den Einkauf vom Verkauf zu trennen,
|
||
gekennzeichnet durch eine Beschreibung (z.B. "Einkauf") und ein Kürzel
|
||
(z.B. "E"). Für jede Klassifizierung besteht eine Beschreibung und
|
||
eine Abkürzung die normalerweise aus einem Zeichen besteht, kann aber
|
||
auf mehrere Zeichen erweitert werden, falls zur Unterscheidung
|
||
notwendig. Sinnvoll sind jedoch nur maximal 2 Zeichen.</p></div><div class="sect2" title="3.7.2. Basisklassifizierung"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6368"></a>3.7.2. Basisklassifizierung</h3></div></div></div><p>Als Basisklassifizierungen gibt es</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Einkauf</p></li><li class="listitem"><p>Verkauf</p></li><li class="listitem"><p>Handelsware</p></li><li class="listitem"><p>Produktion</p></li><li class="listitem"><p>- keine - (diese wird bei einer Aktualisierung für alle
|
||
notwendig. Sinnvoll sind jedoch nur maximal 2 Zeichen.</p></div><div class="sect2" title="3.7.2. Basisklassifizierung"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6387"></a>3.7.2. Basisklassifizierung</h3></div></div></div><p>Als Basisklassifizierungen gibt es</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Einkauf</p></li><li class="listitem"><p>Verkauf</p></li><li class="listitem"><p>Handelsware</p></li><li class="listitem"><p>Produktion</p></li><li class="listitem"><p>- keine - (diese wird bei einer Aktualisierung für alle
|
||
existierenden Artikel verwendet und ist gültig für Verkauf und
|
||
Einkauf)</p></li></ul></div><p>Es können weitere Klassifizierungen angelegt werden. So kann es
|
||
z.B. für separat auszuweisende Artikel folgende Klassen geben:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Lieferung (Logistik, Transport) mit Kürzel L</p></li><li class="listitem"><p>Material (Verpackungsmaterial) mit Kürzel M</p></li></ul></div></div><div class="sect2" title="3.7.3. Attribute"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6398"></a>3.7.3. Attribute</h3></div></div></div><p>Bisher haben die Klassifizierungen folgende Attribute, die auch
|
||
z.B. für separat auszuweisende Artikel folgende Klassen geben:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Lieferung (Logistik, Transport) mit Kürzel L</p></li><li class="listitem"><p>Material (Verpackungsmaterial) mit Kürzel M</p></li></ul></div></div><div class="sect2" title="3.7.3. Attribute"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6417"></a>3.7.3. Attribute</h3></div></div></div><p>Bisher haben die Klassifizierungen folgende Attribute, die auch
|
||
alle gleichzeitg gültig sein können</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>gültig für Verkauf - dieser Artikel kann im Verkauf genutzt
|
||
werden</p></li><li class="listitem"><p>gültig für Einkauf - dieser Artikel kann im Einkauf genutzt
|
||
werden</p></li><li class="listitem"><p>separat ausweisen - hierzu gibt es zur Dokumentengenerierung
|
||
... | ... | |
pro separat auszuweisenden Klassifizierungen die Variable<span class="bold"><strong>< %separate_X_subtotal%></strong></span>, wobei X das
|
||
Kürzel der Klassifizierung ist.</p><p>Im obigen Beispiel wäre das für Lieferkosten <span class="bold"><strong><%separate_L_subtotal%></strong></span> und für
|
||
Verpackungsmaterial <span class="bold"><strong>
|
||
<%separate_M_subtotal%></strong></span>.</p></div><div class="sect2" title="3.7.4. Zwei-Zeichen Abkürzung"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6429"></a>3.7.4. Zwei-Zeichen Abkürzung</h3></div></div></div><p>Der Typ des Artikels und die Klassifizierung werden durch zwei
|
||
<%separate_M_subtotal%></strong></span>.</p></div><div class="sect2" title="3.7.4. Zwei-Zeichen Abkürzung"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6448"></a>3.7.4. Zwei-Zeichen Abkürzung</h3></div></div></div><p>Der Typ des Artikels und die Klassifizierung werden durch zwei
|
||
Buchstaben dargestellt. Der erste Buchstabe ist eine Lokalisierung des
|
||
Artikel-Typs ('P','A','S'), deutsch 'W', 'E', und 'D' für Ware
|
||
Erzeugnis oder Dienstleistung und ggf. weiterer Typen.</p><p>Der zweite Buchstabe (und ggf. auch ein dritter, falls nötig)
|
doc/html/ch03s08.html | ||
---|---|---|
<html><head>
|
||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||
<title>3.8. Dateiverwaltung (Mini-DMS)</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="kivitendo 3.5.1: Installation, Konfiguration, Entwicklung"><link rel="up" href="ch03.html" title="Kapitel 3. Features und Funktionen"><link rel="prev" href="ch03s07.html" title="3.7. Artikelklassifizierung"><link rel="next" href="ch03s09.html" title="3.9. Webshop-Api"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">3.8. Dateiverwaltung (Mini-DMS)</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s07.html">Zurück</a> </td><th width="60%" align="center">Kapitel 3. Features und Funktionen</th><td width="20%" align="right"> <a accesskey="n" href="ch03s09.html">Weiter</a></td></tr></table><hr></div><div class="sect1" title="3.8. Dateiverwaltung (Mini-DMS)"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="features.file_managment"></a>3.8. Dateiverwaltung (Mini-DMS)</h2></div></div></div><div class="sect2" title="3.8.1. Übersicht"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6441"></a>3.8.1. Übersicht</h3></div></div></div><p>Parallel zum alten WebDAV gibt es ein Datei-Management-System,
|
||
<title>3.8. Dateiverwaltung (Mini-DMS)</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="kivitendo 3.5.1: Installation, Konfiguration, Entwicklung"><link rel="up" href="ch03.html" title="Kapitel 3. Features und Funktionen"><link rel="prev" href="ch03s07.html" title="3.7. Artikelklassifizierung"><link rel="next" href="ch03s09.html" title="3.9. Webshop-Api"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">3.8. Dateiverwaltung (Mini-DMS)</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s07.html">Zurück</a> </td><th width="60%" align="center">Kapitel 3. Features und Funktionen</th><td width="20%" align="right"> <a accesskey="n" href="ch03s09.html">Weiter</a></td></tr></table><hr></div><div class="sect1" title="3.8. Dateiverwaltung (Mini-DMS)"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="features.file_managment"></a>3.8. Dateiverwaltung (Mini-DMS)</h2></div></div></div><div class="sect2" title="3.8.1. Übersicht"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6460"></a>3.8.1. Übersicht</h3></div></div></div><p>Parallel zum alten WebDAV gibt es ein Datei-Management-System,
|
||
das Dateien verschiedenen Typs verwaltet. Dies können</p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p>aus ERP-Daten per LaTeX Template erzeugte
|
||
PDF-Dokumente,</p></li><li class="listitem"><p>zu bestimmten ERP-Daten gehörende Anhangdateien
|
||
unterschiedlichen Formats,</p></li><li class="listitem"><p>per Scanner eingelesene PDF-Dateien,</p></li><li class="listitem"><p>per E-Mail empfangene Dateianhänge unterschiedlichen
|
||
Formats,</p></li><li class="listitem"><p>sowie speziel für Artikel hochgeladene Bilder sein.</p></li></ol></div><div class="screenshot"><div class="mediaobject"><img src="images/DMS-Overview.png"></div></div></div><div class="sect2" title="3.8.2. Struktur"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6468"></a>3.8.2. Struktur</h3></div></div></div><p>Über eine vom Speichermedium unabhängige Zwischenschicht werden
|
||
Formats,</p></li><li class="listitem"><p>sowie speziel für Artikel hochgeladene Bilder sein.</p></li></ol></div><div class="screenshot"><div class="mediaobject"><img src="images/DMS-Overview.png"></div></div></div><div class="sect2" title="3.8.2. Struktur"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6487"></a>3.8.2. Struktur</h3></div></div></div><p>Über eine vom Speichermedium unabhängige Zwischenschicht werden
|
||
die Dateien und ihre Versionen in der Datenbank verwaltet. Darunter
|
||
können verschiedene Implementierungen (Backends) gleichzeitig
|
||
existieren:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Dateisystem</p></li><li class="listitem"><p>WebDAV</p></li><li class="listitem"><p>Schnittstelle zu externen
|
||
... | ... | |
für "attachment" und "image" nur die Quelle "uploaded". Für "document"
|
||
gibt es auf jeden Fall die Quelle "created". Die Quellen "scanner" und
|
||
"email" müssen derzeit in der Datenbank konfiguriert werden (siehe
|
||
<a class="xref" href="ch03s08.html#file_management.dbconfig" title="3.8.4.2. Datenbank-Konfigurierung">Datenbank-Konfigurierung</a>).</p></div><div class="sect2" title="3.8.3. Anwendung"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6520"></a>3.8.3. Anwendung</h3></div></div></div><p>Die Daten werden bei den ERP-Objekten als extra Reiter
|
||
<a class="xref" href="ch03s08.html#file_management.dbconfig" title="3.8.4.2. Datenbank-Konfigurierung">Datenbank-Konfigurierung</a>).</p></div><div class="sect2" title="3.8.3. Anwendung"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6539"></a>3.8.3. Anwendung</h3></div></div></div><p>Die Daten werden bei den ERP-Objekten als extra Reiter
|
||
dargestellt. Eine Verkaufsrechnung z.B. hat die Reiter "Dokumente" und
|
||
"Dateianhänge".</p><div class="screenshot"><div class="mediaobject"><img src="images/DMS-Anhaenge.png"></div></div><p>Bei den Dateianhängen wird immer nur die aktuelle Version einer
|
||
Datei angezeigt. Wird eine Datei mit gleichem Namen hochgeladen, so
|
||
... | ... | |
so sind diese z.B. bei Einkaufsrechnungen sichtbar:</p><div class="screenshot"><div class="mediaobject"><img src="images/DMS-Dokumente-Scanner.png"></div></div><p>Statt des Löschens wird hier die Datei zurück zur Quelle
|
||
verschoben. Somit kann die Datei anschließend an ein anderes
|
||
ERP-Objekt angehängt werden.</p><p>Derzeit sind "Titel" und "Beschreibung" noch nicht genutzt. Sie
|
||
sind bisher nur bei Bildern relevant.</p></div><div class="sect2" title="3.8.4. Konfigurierung"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6563"></a>3.8.4. Konfigurierung</h3></div></div></div><div class="sect3" title="3.8.4.1. Mandantenkonfiguration"><div class="titlepage"><div><div><h4 class="title"><a name="file_management.clientconfig"></a>3.8.4.1. Mandantenkonfiguration</h4></div></div></div><div class="sect4" title="3.8.4.1.1. Reiter "Features""><div class="titlepage"><div><div><h5 class="title"><a name="d0e6569"></a>3.8.4.1.1. Reiter "Features"</h5></div></div></div><p>Unter dem Reiter <span class="bold"><strong>Features</strong></span>
|
||
sind bisher nur bei Bildern relevant.</p></div><div class="sect2" title="3.8.4. Konfigurierung"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6582"></a>3.8.4. Konfigurierung</h3></div></div></div><div class="sect3" title="3.8.4.1. Mandantenkonfiguration"><div class="titlepage"><div><div><h4 class="title"><a name="file_management.clientconfig"></a>3.8.4.1. Mandantenkonfiguration</h4></div></div></div><div class="sect4" title="3.8.4.1.1. Reiter "Features""><div class="titlepage"><div><div><h5 class="title"><a name="d0e6588"></a>3.8.4.1.1. Reiter "Features"</h5></div></div></div><p>Unter dem Reiter <span class="bold"><strong>Features</strong></span>
|
||
im Abschnitt Dateimanagement ist neben dem "alten" WebDAV das
|
||
Dateimangement generell zu- und abschaltbar, sowie die Zuordnung
|
||
der Dateitypen zu Backends. Die Löschbarkeit von Dateien, sowie
|
||
die maximale Uploadgröße sind Backend-unabhängig</p><div class="screenshot"><div class="mediaobject"><img src="images/DMS-ClientConfig.png"></div></div><p>Die einzelnen Backends sind einzeln einschaltbar.
|
||
Spezifische Backend-Konfigurierungen sind hier noch
|
||
ergänzbar.</p></div><div class="sect4" title="3.8.4.1.2. Reiter "Allgemeine Dokumentenanhänge""><div class="titlepage"><div><div><h5 class="title"><a name="d0e6585"></a>3.8.4.1.2. Reiter "Allgemeine Dokumentenanhänge"</h5></div></div></div><p>Unter dem Reiter <span class="bold"><strong>Allgemeine
|
||
ergänzbar.</p></div><div class="sect4" title="3.8.4.1.2. Reiter "Allgemeine Dokumentenanhänge""><div class="titlepage"><div><div><h5 class="title"><a name="d0e6604"></a>3.8.4.1.2. Reiter "Allgemeine Dokumentenanhänge"</h5></div></div></div><p>Unter dem Reiter <span class="bold"><strong>Allgemeine
|
||
Dokumentenanhänge</strong></span> kann für alle ERP-Dokumente (
|
||
Angebote, Aufträge, Lieferscheine, Rechnungen im Verkauf und
|
||
Einkauf ) allgemeingültige Anhänge hochgeladen werden.</p><div class="screenshot"><div class="mediaobject"><img src="images/DMS-Allgemeine-Dokumentenanhaenge.png"></div></div><p>Diese Anhänge werden beim Generieren von PDF-Dateien an die
|
doc/html/ch03s09.html | ||
---|---|---|
<html><head>
|
||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||
<title>3.9. Webshop-Api</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="kivitendo 3.5.1: Installation, Konfiguration, Entwicklung"><link rel="up" href="ch03.html" title="Kapitel 3. Features und Funktionen"><link rel="prev" href="ch03s08.html" title="3.8. Dateiverwaltung (Mini-DMS)"><link rel="next" href="ch04.html" title="Kapitel 4. Entwicklerdokumentation"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">3.9. Webshop-Api</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s08.html">Zurück</a> </td><th width="60%" align="center">Kapitel 3. Features und Funktionen</th><td width="20%" align="right"> <a accesskey="n" href="ch04.html">Weiter</a></td></tr></table><hr></div><div class="sect1" title="3.9. Webshop-Api"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e6619"></a>3.9. Webshop-Api</h2></div></div></div><p>Das Shopmodul bietet die Möglichkeit Onlineshopartikel und
|
||
<title>3.9. Webshop-Api</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="kivitendo 3.5.1: Installation, Konfiguration, Entwicklung"><link rel="up" href="ch03.html" title="Kapitel 3. Features und Funktionen"><link rel="prev" href="ch03s08.html" title="3.8. Dateiverwaltung (Mini-DMS)"><link rel="next" href="ch04.html" title="Kapitel 4. Entwicklerdokumentation"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">3.9. Webshop-Api</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s08.html">Zurück</a> </td><th width="60%" align="center">Kapitel 3. Features und Funktionen</th><td width="20%" align="right"> <a accesskey="n" href="ch04.html">Weiter</a></td></tr></table><hr></div><div class="sect1" title="3.9. Webshop-Api"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e6638"></a>3.9. Webshop-Api</h2></div></div></div><p>Das Shopmodul bietet die Möglichkeit Onlineshopartikel und
|
||
Onlineshopbestellungen zu verwalten und zu bearbeiten.</p><p>Es ist Multishopfähig, d.h. Artikel können mehreren oder
|
||
unterschiedlichen Shops zugeordnet werden. Bestellungen können aus
|
||
mehreren Shops geholt werden.</p><p>Zur Zeit bietet das Modul nur einen Connector zur REST-Api von
|
||
Shopware. Weitere Connectoren können dazu programmiert und eingerichtet
|
||
werden.</p><div class="sect2" title="3.9.1. Rechte für die Webshopapi"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6628"></a>3.9.1. Rechte für die Webshopapi</h3></div></div></div><p>In der Administration können folgende Rechte vergeben
|
||
werden</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Webshopartikel anlegen und bearbeiten</p></li><li class="listitem"><p>Shopbestellungen holen und bearbeiten</p></li><li class="listitem"><p>Shop anlegen und bearbeiten</p></li></ul></div></div><div class="sect2" title="3.9.2. Konfiguration"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6643"></a>3.9.2. Konfiguration</h3></div></div></div><p>Unter System->Webshops können Shops angelegt und konfiguriert
|
||
werden</p><div class="mediaobject"><img src="images/Shop_Listing.png"></div></div><div class="sect2" title="3.9.3. Webshopartikel"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6651"></a>3.9.3. Webshopartikel</h3></div></div></div><div class="sect3" title="3.9.3.1. Shopvariablenreiter in Artikelstammdaten"><div class="titlepage"><div><div><h4 class="title"><a name="d0e6654"></a>3.9.3.1. Shopvariablenreiter in Artikelstammdaten</h4></div></div></div><p>Mit dem Recht "Shopartikel anlegen und bearbeiten" und des
|
||
werden.</p><div class="sect2" title="3.9.1. Rechte für die Webshopapi"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6647"></a>3.9.1. Rechte für die Webshopapi</h3></div></div></div><p>In der Administration können folgende Rechte vergeben
|
||
werden</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Webshopartikel anlegen und bearbeiten</p></li><li class="listitem"><p>Shopbestellungen holen und bearbeiten</p></li><li class="listitem"><p>Shop anlegen und bearbeiten</p></li></ul></div></div><div class="sect2" title="3.9.2. Konfiguration"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6662"></a>3.9.2. Konfiguration</h3></div></div></div><p>Unter System->Webshops können Shops angelegt und konfiguriert
|
||
werden</p><div class="mediaobject"><img src="images/Shop_Listing.png"></div></div><div class="sect2" title="3.9.3. Webshopartikel"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6670"></a>3.9.3. Webshopartikel</h3></div></div></div><div class="sect3" title="3.9.3.1. Shopvariablenreiter in Artikelstammdaten"><div class="titlepage"><div><div><h4 class="title"><a name="d0e6673"></a>3.9.3.1. Shopvariablenreiter in Artikelstammdaten</h4></div></div></div><p>Mit dem Recht "Shopartikel anlegen und bearbeiten" und des
|
||
Markers <span class="bold"><strong>"Shopartikel" in den Basisdaten
|
||
</strong></span>zeigt sich der Reiter "Shopvariablen" in den
|
||
Artikelstammdaten. Hier können jetzt die Artikel mit
|
||
... | ... | |
Stelle können auch beliebig viele Bilder dem Shopartikel zugeordnet
|
||
werden. Artikelbilder gelten für alle Shops.</p><div class="mediaobject"><img src="images/Shop_Artikel.png"></div><p>Die Artikelgruppen werden direkt vom Shopsystem geholt somit
|
||
ist es möglich einen Artikel auch mehreren Gruppen
|
||
zuzuordenen</p></div><div class="sect3" title="3.9.3.2. Shopartikelliste"><div class="titlepage"><div><div><h4 class="title"><a name="d0e6667"></a>3.9.3.2. Shopartikelliste</h4></div></div></div><p>Unter dem Menu Webshop->Webshop Artikel hat man nochmal
|
||
zuzuordenen</p></div><div class="sect3" title="3.9.3.2. Shopartikelliste"><div class="titlepage"><div><div><h4 class="title"><a name="d0e6686"></a>3.9.3.2. Shopartikelliste</h4></div></div></div><p>Unter dem Menu Webshop->Webshop Artikel hat man nochmal
|
||
eine Gesamtübersicht. Von hier aus ist es möglich Artikel im Stapel
|
||
unter verschiedenen Kriterien <alles><nur Preis><nur
|
||
Bestand><Preis und Bestand> an die jeweiligen Shops
|
||
hochzuladen.</p><div class="mediaobject"><img src="images/Shop_Artikel_Listing.png"></div></div></div><div class="sect2" title="3.9.4. Bestellimport"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6675"></a>3.9.4. Bestellimport</h3></div></div></div><p>Unter dem Menupunkt Webshop->Webshop Import öffnet sich die
|
||
hochzuladen.</p><div class="mediaobject"><img src="images/Shop_Artikel_Listing.png"></div></div></div><div class="sect2" title="3.9.4. Bestellimport"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6694"></a>3.9.4. Bestellimport</h3></div></div></div><p>Unter dem Menupunkt Webshop->Webshop Import öffnet sich die
|
||
Bestellimportsliste. Hier ist sind Möglichkeiten gegeben Neue
|
||
Bestellungen vom Shop abzuholen, geholte Bestellungen im Stapel oder
|
||
einzeln als Auftrag zu transferieren. Die Liste kann nach
|
||
... | ... | |
auch der Grund für die Auftragssperre sein.</p></li><li class="listitem"><p>Die Buttons "Auftrag erstellen" und "Kunde mit
|
||
Rechnungsadresse überschreiben" zeigen sich erst, wenn ein Kunde
|
||
aus dem Listing ausgewählt ist.</p></li><li class="listitem"><p>Es ist aber möglich die Shopbestellung zu löschen.</p></li><li class="listitem"><p>Ist eine Bestellung schon übernommen, zeigen sich an dieser
|
||
Stelle, die dazugehörigen Belegverknüpfungen.</p></li></ul></div></div><div class="sect2" title="3.9.5. Mapping der Daten"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6728"></a>3.9.5. Mapping der Daten</h3></div></div></div><p>Das Mapping der kivitendo Daten mit den Shopdaten geschieht in
|
||
Stelle, die dazugehörigen Belegverknüpfungen.</p></li></ul></div></div><div class="sect2" title="3.9.5. Mapping der Daten"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6747"></a>3.9.5. Mapping der Daten</h3></div></div></div><p>Das Mapping der kivitendo Daten mit den Shopdaten geschieht in
|
||
der Datei SL/ShopConnector/<SHOPCONNECTORNAME>.pm
|
||
z.B.:SL/ShopConnector/Shopware.pm</p><p>In dieser Datei gibt es einen Bereich wo die Bestellpostionen,
|
||
die Bestellkopfdaten und die Artikeldaten gemapt werden. In dieser
|
doc/html/ch04.html | ||
---|---|---|
<html><head>
|
||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||
<title>Kapitel 4. Entwicklerdokumentation</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="kivitendo 3.5.1: Installation, Konfiguration, Entwicklung"><link rel="up" href="index.html" title="kivitendo 3.5.1: Installation, Konfiguration, Entwicklung"><link rel="prev" href="ch03s09.html" title="3.9. Webshop-Api"><link rel="next" href="ch04s02.html" title="4.2. Entwicklung unter FastCGI"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Kapitel 4. Entwicklerdokumentation</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s09.html">Zurück</a> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="ch04s02.html">Weiter</a></td></tr></table><hr></div><div class="chapter" title="Kapitel 4. Entwicklerdokumentation"><div class="titlepage"><div><div><h2 class="title"><a name="d0e6738"></a>Kapitel 4. Entwicklerdokumentation</h2></div></div></div><div class="sect1" title="4.1. Globale Variablen"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="devel.globals"></a>4.1. Globale Variablen</h2></div></div></div><div class="sect2" title="4.1.1. Wie sehen globale Variablen in Perl aus?"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6744"></a>4.1.1. Wie sehen globale Variablen in Perl aus?</h3></div></div></div><p>Globale Variablen liegen in einem speziellen namespace namens
|
||
<title>Kapitel 4. Entwicklerdokumentation</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="kivitendo 3.5.1: Installation, Konfiguration, Entwicklung"><link rel="up" href="index.html" title="kivitendo 3.5.1: Installation, Konfiguration, Entwicklung"><link rel="prev" href="ch03s09.html" title="3.9. Webshop-Api"><link rel="next" href="ch04s02.html" title="4.2. Entwicklung unter FastCGI"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Kapitel 4. Entwicklerdokumentation</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03s09.html">Zurück</a> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="ch04s02.html">Weiter</a></td></tr></table><hr></div><div class="chapter" title="Kapitel 4. Entwicklerdokumentation"><div class="titlepage"><div><div><h2 class="title"><a name="d0e6757"></a>Kapitel 4. Entwicklerdokumentation</h2></div></div></div><div class="sect1" title="4.1. Globale Variablen"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="devel.globals"></a>4.1. Globale Variablen</h2></div></div></div><div class="sect2" title="4.1.1. Wie sehen globale Variablen in Perl aus?"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6763"></a>4.1.1. Wie sehen globale Variablen in Perl aus?</h3></div></div></div><p>Globale Variablen liegen in einem speziellen namespace namens
|
||
"main", der von überall erreichbar ist. Darüber hinaus sind bareword
|
||
globs global und die meisten speziellen Variablen sind...
|
||
speziell.</p><p>Daraus ergeben sich folgende Formen:</p><div class="variablelist"><dl><dt><span class="term">
|
||
... | ... | |
<code class="varname">$PACKAGE::form</code>.</p></dd><dt><span class="term">
|
||
<code class="literal">local $form</code>
|
||
</span></dt><dd><p>Alle Änderungen an <code class="varname">$form</code> werden am Ende
|
||
des scopes zurückgesetzt</p></dd></dl></div></div><div class="sect2" title="4.1.2. Warum sind globale Variablen ein Problem?"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6845"></a>4.1.2. Warum sind globale Variablen ein Problem?</h3></div></div></div><p>Das erste Problem ist <span class="productname">FCGI</span>™.</p><p>
|
||
des scopes zurückgesetzt</p></dd></dl></div></div><div class="sect2" title="4.1.2. Warum sind globale Variablen ein Problem?"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6864"></a>4.1.2. Warum sind globale Variablen ein Problem?</h3></div></div></div><p>Das erste Problem ist <span class="productname">FCGI</span>™.</p><p>
|
||
<span class="productname">SQL-Ledger</span>™ hat fast alles im globalen
|
||
namespace abgelegt, und erwartet, dass es da auch wiederzufinden ist.
|
||
Unter <span class="productname">FCGI</span>™ müssen diese Sachen aber wieder
|
||
... | ... | |
dies hat, seit der Einführung, u.a. schon so manche langwierige
|
||
Bug-Suche verkürzt. Da globale Variablen aber implizit mit Package
|
||
angegeben werden, werden die nicht geprüft, und somit kann sich
|
||
schnell ein Tippfehler einschleichen.</p></div><div class="sect2" title="4.1.3. Kanonische globale Variablen"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6878"></a>4.1.3. Kanonische globale Variablen</h3></div></div></div><p>Um dieses Problem im Griff zu halten gibt es einige wenige
|
||
schnell ein Tippfehler einschleichen.</p></div><div class="sect2" title="4.1.3. Kanonische globale Variablen"><div class="titlepage"><div><div><h3 class="title"><a name="d0e6897"></a>4.1.3. Kanonische globale Variablen</h3></div></div></div><p>Um dieses Problem im Griff zu halten gibt es einige wenige
|
||
globale Variablen, die kanonisch sind, d.h. sie haben bestimmte
|
||
vorgegebenen Eigenschaften, und alles andere sollte anderweitig
|
||
umhergereicht werden.</p><p>Diese Variablen sind im Moment die folgenden neun:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>
|
||
... | ... | |
<code class="varname">$::request</code>
|
||
</p></li></ul></div><p>Damit diese nicht erneut als Müllhalde missbraucht werden, im
|
||
Folgenden eine kurze Erläuterung der bestimmten vorgegebenen
|
||
Eigenschaften (Konventionen):</p><div class="sect3" title="4.1.3.1. $::form"><div class="titlepage"><div><div><h4 class="title"><a name="d0e6942"></a>4.1.3.1. $::form</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Ist ein Objekt der Klasse
|
||
Eigenschaften (Konventionen):</p><div class="sect3" title="4.1.3.1. $::form"><div class="titlepage"><div><div><h4 class="title"><a name="d0e6961"></a>4.1.3.1. $::form</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Ist ein Objekt der Klasse
|
||
"<code class="classname">Form</code>"</p></li><li class="listitem"><p>Wird nach jedem Request gelöscht</p></li><li class="listitem"><p>Muss auch in Tests und Konsolenscripts vorhanden
|
||
sein.</p></li><li class="listitem"><p>Enthält am Anfang eines Requests die Requestparameter vom
|
||
User</p></li><li class="listitem"><p>Kann zwar intern über Requestgrenzen ein Datenbankhandle
|
||
... | ... | |
push @{ $form->{TEMPLATE_ARRAYS}{number} }, $form->{"partnumber_$i"};
|
||
push @{ $form->{TEMPLATE_ARRAYS}{description} }, $form->{"description_$i"};
|
||
# ...
|
||
}</pre></div><div class="sect3" title="4.1.3.2. %::myconfig"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7026"></a>4.1.3.2. %::myconfig</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Das einzige Hash unter den globalen Variablen</p></li><li class="listitem"><p>Wird spätestens benötigt wenn auf die Datenbank
|
||
}</pre></div><div class="sect3" title="4.1.3.2. %::myconfig"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7045"></a>4.1.3.2. %::myconfig</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Das einzige Hash unter den globalen Variablen</p></li><li class="listitem"><p>Wird spätestens benötigt wenn auf die Datenbank
|
||
zugegriffen wird</p></li><li class="listitem"><p>Wird bei jedem Request neu erstellt.</p></li><li class="listitem"><p>Enthält die Userdaten des aktuellen Logins</p></li><li class="listitem"><p>Sollte nicht ohne Filterung irgendwo gedumpt werden oder
|
||
extern serialisiert werden, weil da auch der Datenbankzugriff
|
||
für diesen user drinsteht.</p></li><li class="listitem"><p>Enthält unter anderem Datumsformat dateformat und
|
||
... | ... | |
überwiegend die Daten, die sich unter <span class="guimenu">Programm</span>
|
||
-> <span class="guimenuitem">Einstellungen</span> befinden, bzw. die
|
||
Informationen über den Benutzer die über die
|
||
Administrator-Schnittstelle eingegeben wurden.</p></div><div class="sect3" title="4.1.3.3. $::locale"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7065"></a>4.1.3.3. $::locale</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse "Locale"</p></li><li class="listitem"><p>Wird pro Request erstellt</p></li><li class="listitem"><p>Muss auch für Tests und Scripte immer verfügbar
|
||
Administrator-Schnittstelle eingegeben wurden.</p></div><div class="sect3" title="4.1.3.3. $::locale"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7084"></a>4.1.3.3. $::locale</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse "Locale"</p></li><li class="listitem"><p>Wird pro Request erstellt</p></li><li class="listitem"><p>Muss auch für Tests und Scripte immer verfügbar
|
||
sein.</p></li><li class="listitem"><p>Cached intern über Requestgrenzen hinweg benutzte
|
||
Locales</p></li></ul></div><p>Lokalisierung für den aktuellen User. Alle Übersetzungen,
|
||
Zahlen- und Datumsformatierungen laufen über dieses Objekt.</p></div><div class="sect3" title="4.1.3.4. $::lxdebug"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7083"></a>4.1.3.4. $::lxdebug</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse "LXDebug"</p></li><li class="listitem"><p>Wird global gecached</p></li><li class="listitem"><p>Muss immer verfügbar sein, in nahezu allen
|
||
Zahlen- und Datumsformatierungen laufen über dieses Objekt.</p></div><div class="sect3" title="4.1.3.4. $::lxdebug"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7102"></a>4.1.3.4. $::lxdebug</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse "LXDebug"</p></li><li class="listitem"><p>Wird global gecached</p></li><li class="listitem"><p>Muss immer verfügbar sein, in nahezu allen
|
||
Funktionen</p></li></ul></div><p>
|
||
<code class="varname">$::lxdebug</code> stellt Debuggingfunktionen
|
||
bereit, wie "<code class="function">enter_sub</code>" und
|
||
... | ... | |
"<code class="function">message</code>" und "<code class="function">dump</code>" mit
|
||
denen man flott Informationen ins Log (tmp/kivitendo-debug.log)
|
||
packen kann.</p><p>Beispielsweise so:</p><pre class="programlisting">$main::lxdebug->message(0, 'Meine Konfig:' . Dumper (%::myconfig));
|
||
$main::lxdebug->message(0, 'Wer bin ich? Kunde oder Lieferant:' . $form->{vc});</pre></div><div class="sect3" title="4.1.3.5. $::auth"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7120"></a>4.1.3.5. $::auth</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse "SL::Auth"</p></li><li class="listitem"><p>Wird global gecached</p></li><li class="listitem"><p>Hat eine permanente DB Verbindung zur Authdatenbank</p></li><li class="listitem"><p>Wird nach jedem Request resettet.</p></li></ul></div><p>
|
||
$main::lxdebug->message(0, 'Wer bin ich? Kunde oder Lieferant:' . $form->{vc});</pre></div><div class="sect3" title="4.1.3.5. $::auth"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7139"></a>4.1.3.5. $::auth</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse "SL::Auth"</p></li><li class="listitem"><p>Wird global gecached</p></li><li class="listitem"><p>Hat eine permanente DB Verbindung zur Authdatenbank</p></li><li class="listitem"><p>Wird nach jedem Request resettet.</p></li></ul></div><p>
|
||
<code class="varname">$::auth</code> stellt Funktionen bereit um die
|
||
Rechte des aktuellen Users abzufragen. Obwohl diese Informationen
|
||
vom aktuellen User abhängen wird das Objekt aus
|
||
... | ... | |
Dessen Einstellungen können über
|
||
<code class="literal">$::auth->client</code> abgefragt werden; Rückgabewert
|
||
ist ein Hash mit den Werten aus der Tabelle
|
||
<code class="literal">auth.clients</code>.</p></div><div class="sect3" title="4.1.3.6. $::lx_office_conf"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7149"></a>4.1.3.6. $::lx_office_conf</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse
|
||
<code class="literal">auth.clients</code>.</p></div><div class="sect3" title="4.1.3.6. $::lx_office_conf"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7168"></a>4.1.3.6. $::lx_office_conf</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse
|
||
"<code class="classname">SL::LxOfficeConf</code>"</p></li><li class="listitem"><p>Global gecached</p></li><li class="listitem"><p>Repräsentation der
|
||
<code class="filename">config/kivitendo.conf[.default]</code>-Dateien</p></li></ul></div><p>Globale Konfiguration. Configdateien werden zum Start gelesen
|
||
und danach nicht mehr angefasst. Es ist derzeit nicht geplant, dass
|
||
... | ... | |
file_name = /tmp/kivitendo-debug.log</pre><p>ist der Key <code class="varname">file</code> im Programm als
|
||
<code class="varname">$::lx_office_conf->{debug}{file}</code>
|
||
erreichbar.</p><div class="warning" title="Warnung" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Warning"><tr><td rowspan="2" align="center" valign="top" width="25"><img alt="[Warnung]" src="system/docbook-xsl/images/warning.png"></td><th align="left">Warnung</th></tr><tr><td align="left" valign="top"><p>Zugriff auf die Konfiguration erfolgt im Moment über
|
||
Hashkeys, sind also nicht gegen Tippfehler abgesichert.</p></td></tr></table></div></div><div class="sect3" title="4.1.3.7. $::instance_conf"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7185"></a>4.1.3.7. $::instance_conf</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse
|
||
Hashkeys, sind also nicht gegen Tippfehler abgesichert.</p></td></tr></table></div></div><div class="sect3" title="4.1.3.7. $::instance_conf"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7204"></a>4.1.3.7. $::instance_conf</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse
|
||
"<code class="classname">SL::InstanceConfiguration</code>"</p></li><li class="listitem"><p>wird pro Request neu erstellt</p></li></ul></div><p>Funktioniert wie <code class="varname">$::lx_office_conf</code>,
|
||
speichert aber Daten die von der Instanz abhängig sind. Eine Instanz
|
||
ist hier eine Mandantendatenbank. Beispielsweise überprüft
|
||
</p><pre class="programlisting">$::instance_conf->get_inventory_system eq 'perpetual'</pre><p>
|
||
ob die berüchtigte Bestandsmethode zur Anwendung kommt.</p></div><div class="sect3" title="4.1.3.8. $::dispatcher"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7206"></a>4.1.3.8. $::dispatcher</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse
|
||
ob die berüchtigte Bestandsmethode zur Anwendung kommt.</p></div><div class="sect3" title="4.1.3.8. $::dispatcher"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7225"></a>4.1.3.8. $::dispatcher</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Objekt der Klasse
|
||
"<code class="varname">SL::Dispatcher</code>"</p></li><li class="listitem"><p>wird pro Serverprozess erstellt.</p></li><li class="listitem"><p>enthält Informationen über die technische Verbindung zum
|
||
Server</p></li></ul></div><p>Der dritte Punkt ist auch der einzige Grund warum das Objekt
|
||
global gespeichert wird. Wird vermutlich irgendwann in einem anderen
|
||
Objekt untergebracht.</p></div><div class="sect3" title="4.1.3.9. $::request"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7224"></a>4.1.3.9. $::request</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Hashref (evtl später Objekt)</p></li><li class="listitem"><p>Wird pro Request neu initialisiert.</p></li><li class="listitem"><p>Keine Unterstruktur garantiert.</p></li></ul></div><p>
|
||
Objekt untergebracht.</p></div><div class="sect3" title="4.1.3.9. $::request"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7243"></a>4.1.3.9. $::request</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Hashref (evtl später Objekt)</p></li><li class="listitem"><p>Wird pro Request neu initialisiert.</p></li><li class="listitem"><p>Keine Unterstruktur garantiert.</p></li></ul></div><p>
|
||
<code class="varname">$::request</code> ist ein generischer Platz um
|
||
Daten "für den aktuellen Request" abzulegen. Sollte nicht für action
|
||
at a distance benutzt werden, sondern um lokales memoizing zu
|
||
... | ... | |
<code class="varname">$::request</code>
|
||
</p></li><li class="listitem"><p>Muss ich von anderen Teilen des Programms lesend drauf
|
||
zugreifen? Dann <code class="varname">$::request</code>, aber Zugriff über
|
||
Wrappermethode</p></li></ul></div></div></div><div class="sect2" title="4.1.4. Ehemalige globale Variablen"><div class="titlepage"><div><div><h3 class="title"><a name="d0e7266"></a>4.1.4. Ehemalige globale Variablen</h3></div></div></div><p>Die folgenden Variablen waren einmal im Programm, und wurden
|
||
entfernt.</p><div class="sect3" title="4.1.4.1. $::cgi"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7271"></a>4.1.4.1. $::cgi</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>war nötig, weil cookie Methoden nicht als
|
||
Wrappermethode</p></li></ul></div></div></div><div class="sect2" title="4.1.4. Ehemalige globale Variablen"><div class="titlepage"><div><div><h3 class="title"><a name="d0e7285"></a>4.1.4. Ehemalige globale Variablen</h3></div></div></div><p>Die folgenden Variablen waren einmal im Programm, und wurden
|
||
entfernt.</p><div class="sect3" title="4.1.4.1. $::cgi"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7290"></a>4.1.4.1. $::cgi</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>war nötig, weil cookie Methoden nicht als
|
||
Klassenfunktionen funktionieren</p></li><li class="listitem"><p>Aufruf als Klasse erzeugt Dummyobjekt was im
|
||
Klassennamespace gehalten wird und über Requestgrenzen
|
||
leaked</p></li><li class="listitem"><p>liegt jetzt unter
|
||
<code class="varname">$::request->{cgi}</code>
|
||
</p></li></ul></div></div><div class="sect3" title="4.1.4.2. $::all_units"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7287"></a>4.1.4.2. $::all_units</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>war nötig, weil einige Funktionen in Schleifen zum Teil
|
||
</p></li></ul></div></div><div class="sect3" title="4.1.4.2. $::all_units"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7306"></a>4.1.4.2. $::all_units</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>war nötig, weil einige Funktionen in Schleifen zum Teil
|
||
ein paar hundert mal pro Request eine Liste der Einheiten
|
||
brauchen, und de als Parameter durch einen Riesenstack von
|
||
Funktionen geschleift werden müssten.</p></li><li class="listitem"><p>Liegt jetzt unter
|
||
<code class="varname">$::request->{cache}{all_units}</code>
|
||
</p></li><li class="listitem"><p>Wird nur in
|
||
<code class="function">AM->retrieve_all_units()</code> gesetzt oder
|
||
gelesen.</p></li></ul></div></div><div class="sect3" title="4.1.4.3. %::called_subs"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7306"></a>4.1.4.3. %::called_subs</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>wurde benutzt um callsub deep recursions
|
||
gelesen.</p></li></ul></div></div><div class="sect3" title="4.1.4.3. %::called_subs"><div class="titlepage"><div><div><h4 class="title"><a name="d0e7325"></a>4.1.4.3. %::called_subs</h4></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>wurde benutzt um callsub deep recursions
|
||
abzufangen.</p></li><li class="listitem"><p>Wurde entfernt, weil callsub nur einen Bruchteil der
|
||
möglichen Rekursioenen darstellt, und da nie welche
|
||
auftreten.</p></li><li class="listitem"><p>komplette recursion protection wurde entfernt.</p></li></ul></div></div></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch03s09.html">Zurück</a> </td><td width="20%" align="center"> </td><td width="40%" align="right"> <a accesskey="n" href="ch04s02.html">Weiter</a></td></tr><tr><td width="40%" align="left" valign="top">3.9. Webshop-Api </td><td width="20%" align="center"><a accesskey="h" href="index.html">Zum Anfang</a></td><td width="40%" align="right" valign="top"> 4.2. Entwicklung unter FastCGI</td></tr></table></div></body></html>
|
doc/html/index.html | ||
---|---|---|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||
<title>kivitendo 3.5.1: Installation, Konfiguration, Entwicklung</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="kivitendo 3.5.1: Installation, Konfiguration, Entwicklung"><link rel="next" href="ch01.html" title="Kapitel 1. Aktuelle Hinweise"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">kivitendo 3.5.1: Installation, Konfiguration,
|
||
Entwicklung</th></tr><tr><td width="20%" align="left"> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="ch01.html">Weiter</a></td></tr></table><hr></div><div lang="de" class="book" title="kivitendo 3.5.1: Installation, Konfiguration, Entwicklung"><div class="titlepage"><div><div><h1 class="title"><a name="kivitendo-documentation"></a>kivitendo 3.5.1: Installation, Konfiguration,
|
||
Entwicklung</h1></div></div><hr></div><div class="toc"><p><b>Inhaltsverzeichnis</b></p><dl><dt><span class="chapter"><a href="ch01.html">1. Aktuelle Hinweise</a></span></dt><dt><span class="chapter"><a href="ch02.html">2. Installation und Grundkonfiguration</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch02.html#Installation-%C3%9Cbersicht">2.1. Übersicht</a></span></dt><dt><span class="sect1"><a href="ch02s02.html">2.2. Benötigte Software und Pakete</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s02.html#Betriebssystem">2.2.1. Betriebssystem</a></span></dt><dt><span class="sect2"><a href="ch02s02.html#Pakete">2.2.2. Benötigte Perl-Pakete installieren</a></span></dt><dt><span class="sect2"><a href="ch02s02.html#d0e521">2.2.3. Andere Pakete installieren</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s03.html">2.3. Manuelle Installation des Programmpaketes</a></span></dt><dt><span class="sect1"><a href="ch02s04.html">2.4. kivitendo-Konfigurationsdatei</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s04.html#config.config-file.introduction">2.4.1. Einführung</a></span></dt><dt><span class="sect2"><a href="ch02s04.html#config.config-file.sections-parameters">2.4.2. Abschnitte und Parameter</a></span></dt><dt><span class="sect2"><a href="ch02s04.html#config.config-file.prior-versions">2.4.3. Versionen vor 2.6.3</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s05.html">2.5. Anpassung der PostgreSQL-Konfiguration</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s05.html#Zeichens%C3%A4tze-die-Verwendung-von-UTF-8">2.5.1. Zeichensätze/die Verwendung von Unicode/UTF-8</a></span></dt><dt><span class="sect2"><a href="ch02s05.html#%C3%84nderungen-an-Konfigurationsdateien">2.5.2. Änderungen an Konfigurationsdateien</a></span></dt><dt><span class="sect2"><a href="ch02s05.html#Erweiterung-f%C3%BCr-servergespeicherte-Prozeduren">2.5.3. Erweiterung für servergespeicherte Prozeduren</a></span></dt><dt><span class="sect2"><a href="ch02s05.html#Erweiterung-f%C3%BCr-trigram">2.5.4. Erweiterung für Trigram Prozeduren</a></span></dt><dt><span class="sect2"><a href="ch02s05.html#Datenbankbenutzer-anlegen">2.5.5. Datenbankbenutzer anlegen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s06.html">2.6. Webserver-Konfiguration</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s06.html#d0e977">2.6.1. Grundkonfiguration mittels CGI</a></span></dt><dt><span class="sect2"><a href="ch02s06.html#Apache-Konfiguration.FCGI">2.6.2. Konfiguration für FastCGI/FCGI</a></span></dt><dt><span class="sect2"><a href="ch02s06.html#d0e1128">2.6.3. Weitergehende Konfiguration</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s07.html">2.7. Der Task-Server</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s07.html#Konfiguration-des-Task-Servers">2.7.1. Verfügbare und notwendige Konfigurationsoptionen</a></span></dt><dt><span class="sect2"><a href="ch02s07.html#Konfiguration-der-Mandanten-fuer-den-Task-Servers">2.7.2. Konfiguration der Mandanten für den Task-Server</a></span></dt><dt><span class="sect2"><a href="ch02s07.html#Einbinden-in-den-Boot-Prozess">2.7.3. Automatisches Starten des Task-Servers beim Booten</a></span></dt><dt><span class="sect2"><a href="ch02s07.html#Prozesskontrolle">2.7.4. Wie der Task-Server gestartet und beendet wird</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s08.html">2.8. Benutzerauthentifizierung und Administratorpasswort</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s08.html#Grundlagen-zur-Benutzerauthentifizierung">2.8.1. Grundlagen zur Benutzerauthentifizierung</a></span></dt><dt><span class="sect2"><a href="ch02s08.html#Administratorpasswort">2.8.2. Administratorpasswort</a></span></dt><dt><span class="sect2"><a href="ch02s08.html#Authentifizierungsdatenbank">2.8.3. Authentifizierungsdatenbank</a></span></dt><dt><span class="sect2"><a href="ch02s08.html#Passwort%C3%BCberpr%C3%BCfung">2.8.4. Passwortüberprüfung</a></span></dt><dt><span class="sect2"><a href="ch02s08.html#Name-des-Session-Cookies">2.8.5. Name des Session-Cookies</a></span></dt><dt><span class="sect2"><a href="ch02s08.html#Anlegen-der-Authentifizierungsdatenbank">2.8.6. Anlegen der Authentifizierungsdatenbank</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s09.html">2.9. Mandanten-, Benutzer- und Gruppenverwaltung</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s09.html#Zusammenh%C3%A4nge">2.9.1. Zusammenhänge</a></span></dt><dt><span class="sect2"><a href="ch02s09.html#Mandanten-Benutzer-Gruppen">2.9.2. Mandanten, Benutzer und Gruppen</a></span></dt><dt><span class="sect2"><a href="ch02s09.html#Datenbanken-anlegen">2.9.3. Datenbanken anlegen</a></span></dt><dt><span class="sect2"><a href="ch02s09.html#Gruppen-anlegen">2.9.4. Gruppen anlegen</a></span></dt><dt><span class="sect2"><a href="ch02s09.html#Benutzer-anlegen">2.9.5. Benutzer anlegen</a></span></dt><dt><span class="sect2"><a href="ch02s09.html#Mandanten-anlegen">2.9.6. Mandanten anlegen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s10.html">2.10. Drucker- und Systemverwaltung</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s10.html#Druckeradministration">2.10.1. Druckeradministration</a></span></dt><dt><span class="sect2"><a href="ch02s10.html#System">2.10.2. System sperren / entsperren</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s11.html">2.11. E-Mail-Versand aus kivitendo heraus</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s11.html#config.sending-email.sendmail">2.11.1. Versand über lokalen E-Mail-Server</a></span></dt><dt><span class="sect2"><a href="ch02s11.html#config.sending-email.smtp">2.11.2. Versand über einen SMTP-Server</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s12.html">2.12. Drucken mit kivitendo</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s12.html#Vorlagenverzeichnis-anlegen">2.12.1. Vorlagenverzeichnis anlegen</a></span></dt><dt><span class="sect2"><a href="ch02s12.html#Vorlagen-RB">2.12.2. Der Druckvorlagensatz RB</a></span></dt><dt><span class="sect2"><a href="ch02s12.html#f-tex">2.12.3. f-tex</a></span></dt><dt><span class="sect2"><a href="ch02s12.html#Vorlagen-rev-odt">2.12.4. Der Druckvorlagensatz rev-odt</a></span></dt><dt><span class="sect2"><a href="ch02s12.html#allgemeine-hinweise-zu-latex">2.12.5. Allgemeine Hinweise zu LaTeX Vorlagen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s13.html">2.13. OpenDocument-Vorlagen</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s13.html#d0e2293">2.13.1. OpenDocument (odt) Druckvorlagen mit Makros</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s14.html">2.14. Nomenklatur</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s14.html#booking.dates">2.14.1. Datum bei Buchungen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s15.html">2.15. Konfiguration zur Einnahmenüberschussrechnung/Bilanzierung:
|
||
Entwicklung</h1></div></div><hr></div><div class="toc"><p><b>Inhaltsverzeichnis</b></p><dl><dt><span class="chapter"><a href="ch01.html">1. Aktuelle Hinweise</a></span></dt><dt><span class="chapter"><a href="ch02.html">2. Installation und Grundkonfiguration</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch02.html#Installation-%C3%9Cbersicht">2.1. Übersicht</a></span></dt><dt><span class="sect1"><a href="ch02s02.html">2.2. Benötigte Software und Pakete</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s02.html#Betriebssystem">2.2.1. Betriebssystem</a></span></dt><dt><span class="sect2"><a href="ch02s02.html#Pakete">2.2.2. Benötigte Perl-Pakete installieren</a></span></dt><dt><span class="sect2"><a href="ch02s02.html#d0e540">2.2.3. Andere Pakete installieren</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s03.html">2.3. Manuelle Installation des Programmpaketes</a></span></dt><dt><span class="sect1"><a href="ch02s04.html">2.4. kivitendo-Konfigurationsdatei</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s04.html#config.config-file.introduction">2.4.1. Einführung</a></span></dt><dt><span class="sect2"><a href="ch02s04.html#config.config-file.sections-parameters">2.4.2. Abschnitte und Parameter</a></span></dt><dt><span class="sect2"><a href="ch02s04.html#config.config-file.prior-versions">2.4.3. Versionen vor 2.6.3</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s05.html">2.5. Anpassung der PostgreSQL-Konfiguration</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s05.html#Zeichens%C3%A4tze-die-Verwendung-von-UTF-8">2.5.1. Zeichensätze/die Verwendung von Unicode/UTF-8</a></span></dt><dt><span class="sect2"><a href="ch02s05.html#%C3%84nderungen-an-Konfigurationsdateien">2.5.2. Änderungen an Konfigurationsdateien</a></span></dt><dt><span class="sect2"><a href="ch02s05.html#Erweiterung-f%C3%BCr-servergespeicherte-Prozeduren">2.5.3. Erweiterung für servergespeicherte Prozeduren</a></span></dt><dt><span class="sect2"><a href="ch02s05.html#Erweiterung-f%C3%BCr-trigram">2.5.4. Erweiterung für Trigram Prozeduren</a></span></dt><dt><span class="sect2"><a href="ch02s05.html#Datenbankbenutzer-anlegen">2.5.5. Datenbankbenutzer anlegen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s06.html">2.6. Webserver-Konfiguration</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s06.html#d0e996">2.6.1. Grundkonfiguration mittels CGI</a></span></dt><dt><span class="sect2"><a href="ch02s06.html#Apache-Konfiguration.FCGI">2.6.2. Konfiguration für FastCGI/FCGI</a></span></dt><dt><span class="sect2"><a href="ch02s06.html#d0e1147">2.6.3. Weitergehende Konfiguration</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s07.html">2.7. Der Task-Server</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s07.html#Konfiguration-des-Task-Servers">2.7.1. Verfügbare und notwendige Konfigurationsoptionen</a></span></dt><dt><span class="sect2"><a href="ch02s07.html#Konfiguration-der-Mandanten-fuer-den-Task-Servers">2.7.2. Konfiguration der Mandanten für den Task-Server</a></span></dt><dt><span class="sect2"><a href="ch02s07.html#Einbinden-in-den-Boot-Prozess">2.7.3. Automatisches Starten des Task-Servers beim Booten</a></span></dt><dt><span class="sect2"><a href="ch02s07.html#Prozesskontrolle">2.7.4. Wie der Task-Server gestartet und beendet wird</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s08.html">2.8. Benutzerauthentifizierung und Administratorpasswort</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s08.html#Grundlagen-zur-Benutzerauthentifizierung">2.8.1. Grundlagen zur Benutzerauthentifizierung</a></span></dt><dt><span class="sect2"><a href="ch02s08.html#Administratorpasswort">2.8.2. Administratorpasswort</a></span></dt><dt><span class="sect2"><a href="ch02s08.html#Authentifizierungsdatenbank">2.8.3. Authentifizierungsdatenbank</a></span></dt><dt><span class="sect2"><a href="ch02s08.html#Passwort%C3%BCberpr%C3%BCfung">2.8.4. Passwortüberprüfung</a></span></dt><dt><span class="sect2"><a href="ch02s08.html#Name-des-Session-Cookies">2.8.5. Name des Session-Cookies</a></span></dt><dt><span class="sect2"><a href="ch02s08.html#Anlegen-der-Authentifizierungsdatenbank">2.8.6. Anlegen der Authentifizierungsdatenbank</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s09.html">2.9. Mandanten-, Benutzer- und Gruppenverwaltung</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s09.html#Zusammenh%C3%A4nge">2.9.1. Zusammenhänge</a></span></dt><dt><span class="sect2"><a href="ch02s09.html#Mandanten-Benutzer-Gruppen">2.9.2. Mandanten, Benutzer und Gruppen</a></span></dt><dt><span class="sect2"><a href="ch02s09.html#Datenbanken-anlegen">2.9.3. Datenbanken anlegen</a></span></dt><dt><span class="sect2"><a href="ch02s09.html#Gruppen-anlegen">2.9.4. Gruppen anlegen</a></span></dt><dt><span class="sect2"><a href="ch02s09.html#Benutzer-anlegen">2.9.5. Benutzer anlegen</a></span></dt><dt><span class="sect2"><a href="ch02s09.html#Mandanten-anlegen">2.9.6. Mandanten anlegen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s10.html">2.10. Drucker- und Systemverwaltung</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s10.html#Druckeradministration">2.10.1. Druckeradministration</a></span></dt><dt><span class="sect2"><a href="ch02s10.html#System">2.10.2. System sperren / entsperren</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s11.html">2.11. E-Mail-Versand aus kivitendo heraus</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s11.html#config.sending-email.sendmail">2.11.1. Versand über lokalen E-Mail-Server</a></span></dt><dt><span class="sect2"><a href="ch02s11.html#config.sending-email.smtp">2.11.2. Versand über einen SMTP-Server</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s12.html">2.12. Drucken mit kivitendo</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s12.html#Vorlagenverzeichnis-anlegen">2.12.1. Vorlagenverzeichnis anlegen</a></span></dt><dt><span class="sect2"><a href="ch02s12.html#Vorlagen-RB">2.12.2. Der Druckvorlagensatz RB</a></span></dt><dt><span class="sect2"><a href="ch02s12.html#f-tex">2.12.3. f-tex</a></span></dt><dt><span class="sect2"><a href="ch02s12.html#Vorlagen-rev-odt">2.12.4. Der Druckvorlagensatz rev-odt</a></span></dt><dt><span class="sect2"><a href="ch02s12.html#allgemeine-hinweise-zu-latex">2.12.5. Allgemeine Hinweise zu LaTeX Vorlagen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s13.html">2.13. OpenDocument-Vorlagen</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s13.html#d0e2312">2.13.1. OpenDocument (odt) Druckvorlagen mit Makros</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s14.html">2.14. Nomenklatur</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s14.html#booking.dates">2.14.1. Datum bei Buchungen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s15.html">2.15. Konfiguration zur Einnahmenüberschussrechnung/Bilanzierung:
|
||
EUR</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s15.html#config.eur.introduction">2.15.1. Einführung</a></span></dt><dt><span class="sect2"><a href="ch02s15.html#config.eur.parameters">2.15.2. Konfigurationsparameter</a></span></dt><dt><span class="sect2"><a href="ch02s15.html#config.eur.setting-parameters">2.15.3. Festlegen der Parameter</a></span></dt><dt><span class="sect2"><a href="ch02s15.html#config.eur.inventory-system-perpetual">2.15.4. Bemerkungen zur Bestandsmethode</a></span></dt><dt><span class="sect2"><a href="ch02s15.html#config.eur.knonw-issues">2.15.5. Bekannte Probleme</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s16.html">2.16. SKR04 19% Umstellung für innergemeinschaftlichen Erwerb</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch02s16.html#config.skr04-update-3804.introduction">2.16.1. Einführung</a></span></dt><dt><span class="sect2"><a href="ch02s16.html#config.skr04-update-3804.create-chart">2.16.2. Konto 3804 manuell anlegen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch02s17.html">2.17. Verhalten des Bilanzberichts</a></span></dt><dt><span class="sect1"><a href="ch02s18.html">2.18. Erfolgsrechnung</a></span></dt><dt><span class="sect1"><a href="ch02s19.html">2.19. Rundung in Verkaufsbelegen</a></span></dt><dt><span class="sect1"><a href="ch02s20.html">2.20. Einstellungen pro Mandant</a></span></dt><dt><span class="sect1"><a href="ch02s21.html">2.21. kivitendo ERP verwenden</a></span></dt></dl></dd><dt><span class="chapter"><a href="ch03.html">3. Features und Funktionen</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch03.html#features.periodic-invoices">3.1. Wiederkehrende Rechnungen</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03.html#features.periodic-invoices.introduction">3.1.1. Einführung</a></span></dt><dt><span class="sect2"><a href="ch03.html#features.periodic-invoices.configuration">3.1.2. Konfiguration</a></span></dt><dt><span class="sect2"><a href="ch03.html#features.periodic-invoices.variables">3.1.3. Spezielle Variablen</a></span></dt><dt><span class="sect2"><a href="ch03.html#features.periodic-invoices.reports">3.1.4. Auflisten</a></span></dt><dt><span class="sect2"><a href="ch03.html#features.periodic-invoices.task-server">3.1.5. Erzeugung der eigentlichen Rechnungen</a></span></dt><dt><span class="sect2"><a href="ch03.html#features.periodic-invoices.create-for-current-month">3.1.6. Erste Rechnung für aktuellen Monat erstellen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s02.html">3.2. Bankerweiterung</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s02.html#features.bank.introduction">3.2.1. Einführung</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s03.html">3.3. Dokumentenvorlagen und verfügbare Variablen</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s03.html#dokumentenvorlagen-und-variablen.einf%C3%BChrung">3.3.1. Einführung</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#dokumentenvorlagen-und-variablen.variablen-ausgeben">3.3.2. Variablen ausgeben</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#dokumentenvorlagen-und-variablen.verwendung-in-druckbefehlen">3.3.3. Verwendung in Druckbefehlen</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#dokumentenvorlagen-und-variablen.tag-style">3.3.4. Anfang und Ende der Tags verändern</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#dokumentenvorlagen-und-variablen.zuordnung-dateinamen">3.3.5. Zuordnung von den Dateinamen zu den Funktionen</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#dokumentenvorlagen-und-variablen.dateinamen-erweitert">3.3.6. Sprache, Drucker und E-Mail</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#dokumentenvorlagen-und-variablen.allgemeine-variablen">3.3.7. Allgemeine Variablen, die in allen Vorlagen vorhanden
|
||
sind</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#dokumentenvorlagen-und-variablen.invoice">3.3.8. Variablen in Rechnungen</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#dokumentenvorlagen-und-variablen.dunning">3.3.9. Variablen in Mahnungen und Rechnungen über Mahngebühren</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#dokumentenvorlagen-und-variablen.andere-vorlagen">3.3.10. Variablen in anderen Vorlagen</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#dokumentenvorlagen-und-variablen.bloecke">3.3.11. Blöcke, bedingte Anweisungen und Schleifen</a></span></dt><dt><span class="sect2"><a href="ch03s03.html#dokumentenvorlagen-und-variablen.markup">3.3.12. Markup-Code zur Textformatierung innerhalb von
|
||
Formularen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s04.html">3.4. Excel-Vorlagen</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s04.html#excel-templates.summary">3.4.1. Zusammenfassung</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#excel-templates.usage">3.4.2. Bedienung</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#excel-templates.syntax">3.4.3. Variablensyntax</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#excel-templates.limitations">3.4.4. Einschränkungen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s05.html">3.5. Mandantenkonfiguration Lager</a></span></dt><dt><span class="sect1"><a href="ch03s06.html">3.6. Schweizer Kontenpläne</a></span></dt><dt><span class="sect1"><a href="ch03s07.html">3.7. Artikelklassifizierung</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s07.html#d0e6363">3.7.1. Übersicht</a></span></dt><dt><span class="sect2"><a href="ch03s07.html#d0e6368">3.7.2. Basisklassifizierung</a></span></dt><dt><span class="sect2"><a href="ch03s07.html#d0e6398">3.7.3. Attribute</a></span></dt><dt><span class="sect2"><a href="ch03s07.html#d0e6429">3.7.4. Zwei-Zeichen Abkürzung</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s08.html">3.8. Dateiverwaltung (Mini-DMS)</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s08.html#d0e6441">3.8.1. Übersicht</a></span></dt><dt><span class="sect2"><a href="ch03s08.html#d0e6468">3.8.2. Struktur</a></span></dt><dt><span class="sect2"><a href="ch03s08.html#d0e6520">3.8.3. Anwendung</a></span></dt><dt><span class="sect2"><a href="ch03s08.html#d0e6563">3.8.4. Konfigurierung</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s09.html">3.9. Webshop-Api</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s09.html#d0e6628">3.9.1. Rechte für die Webshopapi</a></span></dt><dt><span class="sect2"><a href="ch03s09.html#d0e6643">3.9.2. Konfiguration</a></span></dt><dt><span class="sect2"><a href="ch03s09.html#d0e6651">3.9.3. Webshopartikel</a></span></dt><dt><span class="sect2"><a href="ch03s09.html#d0e6675">3.9.4. Bestellimport</a></span></dt><dt><span class="sect2"><a href="ch03s09.html#d0e6728">3.9.5. Mapping der Daten</a></span></dt></dl></dd></dl></dd><dt><span class="chapter"><a href="ch04.html">4. Entwicklerdokumentation</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch04.html#devel.globals">4.1. Globale Variablen</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch04.html#d0e6744">4.1.1. Wie sehen globale Variablen in Perl aus?</a></span></dt><dt><span class="sect2"><a href="ch04.html#d0e6845">4.1.2. Warum sind globale Variablen ein Problem?</a></span></dt><dt><span class="sect2"><a href="ch04.html#d0e6878">4.1.3. Kanonische globale Variablen</a></span></dt><dt><span class="sect2"><a href="ch04.html#d0e7266">4.1.4. Ehemalige globale Variablen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch04s02.html">4.2. Entwicklung unter FastCGI</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch04s02.html#devel.fcgi.general">4.2.1. Allgemeines</a></span></dt><dt><span class="sect2"><a href="ch04s02.html#devel.fcgi.exiting">4.2.2. Programmende und Ausnahmen</a></span></dt><dt><span class="sect2"><a href="ch04s02.html#devel.fcgi.globals">4.2.3. Globale Variablen</a></span></dt><dt><span class="sect2"><a href="ch04s02.html#devel.fcgi.performance">4.2.4. Performance und Statistiken</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch04s03.html">4.3. SQL-Upgradedateien</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch04s03.html#db-upgrade-files.introduction">4.3.1. Einführung</a></span></dt><dt><span class="sect2"><a href="ch04s03.html#db-upgrade-files.format">4.3.2. Format der Kontrollinformationen</a></span></dt><dt><span class="sect2"><a href="ch04s03.html#db-upgrade-files.format-perl-files">4.3.3. Format von in Perl geschriebenen
|
||
Formularen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s04.html">3.4. Excel-Vorlagen</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s04.html#excel-templates.summary">3.4.1. Zusammenfassung</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#excel-templates.usage">3.4.2. Bedienung</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#excel-templates.syntax">3.4.3. Variablensyntax</a></span></dt><dt><span class="sect2"><a href="ch03s04.html#excel-templates.limitations">3.4.4. Einschränkungen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s05.html">3.5. Mandantenkonfiguration Lager</a></span></dt><dt><span class="sect1"><a href="ch03s06.html">3.6. Schweizer Kontenpläne</a></span></dt><dt><span class="sect1"><a href="ch03s07.html">3.7. Artikelklassifizierung</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s07.html#d0e6382">3.7.1. Übersicht</a></span></dt><dt><span class="sect2"><a href="ch03s07.html#d0e6387">3.7.2. Basisklassifizierung</a></span></dt><dt><span class="sect2"><a href="ch03s07.html#d0e6417">3.7.3. Attribute</a></span></dt><dt><span class="sect2"><a href="ch03s07.html#d0e6448">3.7.4. Zwei-Zeichen Abkürzung</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s08.html">3.8. Dateiverwaltung (Mini-DMS)</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s08.html#d0e6460">3.8.1. Übersicht</a></span></dt><dt><span class="sect2"><a href="ch03s08.html#d0e6487">3.8.2. Struktur</a></span></dt><dt><span class="sect2"><a href="ch03s08.html#d0e6539">3.8.3. Anwendung</a></span></dt><dt><span class="sect2"><a href="ch03s08.html#d0e6582">3.8.4. Konfigurierung</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch03s09.html">3.9. Webshop-Api</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch03s09.html#d0e6647">3.9.1. Rechte für die Webshopapi</a></span></dt><dt><span class="sect2"><a href="ch03s09.html#d0e6662">3.9.2. Konfiguration</a></span></dt><dt><span class="sect2"><a href="ch03s09.html#d0e6670">3.9.3. Webshopartikel</a></span></dt><dt><span class="sect2"><a href="ch03s09.html#d0e6694">3.9.4. Bestellimport</a></span></dt><dt><span class="sect2"><a href="ch03s09.html#d0e6747">3.9.5. Mapping der Daten</a></span></dt></dl></dd></dl></dd><dt><span class="chapter"><a href="ch04.html">4. Entwicklerdokumentation</a></span></dt><dd><dl><dt><span class="sect1"><a href="ch04.html#devel.globals">4.1. Globale Variablen</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch04.html#d0e6763">4.1.1. Wie sehen globale Variablen in Perl aus?</a></span></dt><dt><span class="sect2"><a href="ch04.html#d0e6864">4.1.2. Warum sind globale Variablen ein Problem?</a></span></dt><dt><span class="sect2"><a href="ch04.html#d0e6897">4.1.3. Kanonische globale Variablen</a></span></dt><dt><span class="sect2"><a href="ch04.html#d0e7285">4.1.4. Ehemalige globale Variablen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch04s02.html">4.2. Entwicklung unter FastCGI</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch04s02.html#devel.fcgi.general">4.2.1. Allgemeines</a></span></dt><dt><span class="sect2"><a href="ch04s02.html#devel.fcgi.exiting">4.2.2. Programmende und Ausnahmen</a></span></dt><dt><span class="sect2"><a href="ch04s02.html#devel.fcgi.globals">4.2.3. Globale Variablen</a></span></dt><dt><span class="sect2"><a href="ch04s02.html#devel.fcgi.performance">4.2.4. Performance und Statistiken</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch04s03.html">4.3. SQL-Upgradedateien</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch04s03.html#db-upgrade-files.introduction">4.3.1. Einführung</a></span></dt><dt><span class="sect2"><a href="ch04s03.html#db-upgrade-files.format">4.3.2. Format der Kontrollinformationen</a></span></dt><dt><span class="sect2"><a href="ch04s03.html#db-upgrade-files.format-perl-files">4.3.3. Format von in Perl geschriebenen
|
||
Datenbankupgradescripten</a></span></dt><dt><span class="sect2"><a href="ch04s03.html#db-upgrade-files.dbupgrade-tool">4.3.4. Hilfsscript dbupgrade2_tool.pl</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch04s04.html">4.4. Translations and languages</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch04s04.html#translations-languages.introduction">4.4.1. Introduction</a></span></dt><dt><span class="sect2"><a href="ch04s04.html#translations-languages.character-set">4.4.2. Character set</a></span></dt><dt><span class="sect2"><a href="ch04s04.html#translations-languages.file-structure">4.4.3. File structure</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch04s05.html">4.5. Die kivitendo-Test-Suite</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch04s05.html#devel.testsuite.intro">4.5.1. Einführung</a></span></dt><dt><span class="sect2"><a href="ch04s05.html#devel.testsuite.prerequisites">4.5.2. Voraussetzungen</a></span></dt><dt><span class="sect2"><a href="ch04s05.html#devel.testsuite.execution">4.5.3. Existierende Tests ausführen</a></span></dt><dt><span class="sect2"><a href="ch04s05.html#devel.testsuite.meaning_of_scripts">4.5.4. Bedeutung der verschiedenen Test-Scripte</a></span></dt><dt><span class="sect2"><a href="ch04s05.html#devel.testsuite.create_new">4.5.5. Neue Test-Scripte erstellen</a></span></dt></dl></dd><dt><span class="sect1"><a href="ch04s06.html">4.6. Stil-Richtlinien</a></span></dt><dt><span class="sect1"><a href="ch04s07.html">4.7. Dokumentation erstellen</a></span></dt><dd><dl><dt><span class="sect2"><a href="ch04s07.html#devel.build-doc.introduction">4.7.1. Einführung</a></span></dt><dt><span class="sect2"><a href="ch04s07.html#devel.build-doc.required-software">4.7.2. Benötigte Software</a></span></dt><dt><span class="sect2"><a href="ch04s07.html#devel.build-doc.build">4.7.3. PDFs und HTML-Seiten erstellen</a></span></dt><dt><span class="sect2"><a href="ch04s07.html#devel.build-doc.repository">4.7.4. Einchecken in das Git-Repository</a></span></dt></dl></dd></dl></dd></dl></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"> </td><td width="20%" align="center"> </td><td width="40%" align="right"> <a accesskey="n" href="ch01.html">Weiter</a></td></tr><tr><td width="40%" align="left" valign="top"> </td><td width="20%" align="center"> </td><td width="40%" align="right" valign="top"> Kapitel 1. Aktuelle Hinweise</td></tr></table></div></body></html>
|
modules/fallback/Daemon/Generic.pm | ||
---|---|---|
|
||
# Copyright (C) 2006, David Muir Sharnoff <perl@dave.sharnoff.org>
|
||
|
||
package Daemon::Generic;
|
||
|
||
use strict;
|
||
use warnings;
|
||
require Exporter;
|
||
require POSIX;
|
||
use Getopt::Long;
|
||
use File::Slurp;
|
||
use File::Flock;
|
||
our @ISA = qw(Exporter);
|
||
our @EXPORT = qw(newdaemon);
|
||
|
||
our $VERSION = 0.71;
|
||
|
||
our $force_quit_delay = 15;
|
||
our $package = __PACKAGE__;
|
||
our $caller;
|
||
|
||
sub newdaemon
|
||
{
|
||
my (%args) = @_;
|
||
my $pkg = $caller || caller() || 'main';
|
||
|
||
my $foo = bless {}, $pkg;
|
||
|
||
unless ($foo->isa($package)) {
|
||
no strict qw(refs);
|
||
my $isa = \@{"${pkg}::ISA"};
|
||
unshift(@$isa, $package);
|
||
}
|
||
|
||
bless $foo, 'This::Package::Does::Not::Exist';
|
||
undef $foo;
|
||
|
||
new($pkg, %args);
|
||
}
|
||
|
||
sub new
|
||
{
|
||
my ($pkg, %args) = @_;
|
||
|
||
if ($pkg eq __PACKAGE__) {
|
||
$pkg = caller() || 'main';
|
||
}
|
||
|
||
srand(time ^ ($$ << 5))
|
||
unless $args{no_srand};
|
||
|
||
my $av0 = $0;
|
||
$av0 =~ s!/!/.!g;
|
||
|
||
my $self = {
|
||
gd_args => \%args,
|
||
gd_pidfile => $args{pidfile},
|
||
gd_logpriority => $args{logpriority},
|
||
gd_progname => $args{progname}
|
||
? $args{progname}
|
||
: $0,
|
||
gd_pidbase => $args{pidbase}
|
||
? $args{pidbase}
|
||
: ($args{progname}
|
||
? "/var/run/$args{progname}"
|
||
: "/var/run/$av0"),
|
||
gd_foreground => $args{foreground} || 0,
|
||
configfile => $args{configfile}
|
||
? $args{configfile}
|
||
: ($args{progname}
|
||
? "/etc/$args{progname}.conf"
|
||
: "/etc/$av0"),
|
||
debug => $args{debug} || 0,
|
||
};
|
||
bless $self, $pkg;
|
||
|
||
$self->gd_getopt;
|
||
$self->gd_parse_argv;
|
||
|
||
my $do = $self->{do} = $ARGV[0];
|
||
|
||
$self->gd_help if $do eq 'help';
|
||
$self->gd_version if $do eq 'version';
|
||
$self->gd_install if $do eq 'install';
|
||
$self->gd_uninstall if $do eq 'uninstall';
|
||
|
||
$self->gd_pidfile unless $self->{gd_pidfile};
|
||
|
||
my %newconfig = $self->gd_preconfig;
|
||
|
||
$self->{gd_pidfile} = $newconfig{pidfile} if $newconfig{pidfile};
|
||
|
||
print "Configuration looks okay\n" if $do eq 'check';
|
||
|
||
my $pidfile = $self->{gd_pidfile};
|
||
my $killed = 0;
|
||
my $locked = 0;
|
||
if (-e $pidfile) {
|
||
if ($locked = lock($pidfile, undef, 'nonblocking')) {
|
||
# old process is dead
|
||
if ($do eq 'status') {
|
||
print "$0 dead\n";
|
||
exit 1;
|
||
}
|
||
} else {
|
||
sleep(2) if -M $pidfile < 2/86400;
|
||
my $oldpid = read_file($pidfile);
|
||
chomp($oldpid);
|
||
if ($oldpid) {
|
||
if ($do eq 'stop' or $do eq 'restart') {
|
||
$killed = $self->gd_kill($oldpid);
|
||
$locked = lock($pidfile);
|
||
if ($do eq 'stop') {
|
||
unlink($pidfile);
|
||
exit;
|
||
}
|
||
} elsif ($do eq 'reload') {
|
||
if (kill(1,$oldpid)) {
|
||
print "Requested reconfiguration\n";
|
||
exit;
|
||
} else {
|
||
print "Kill failed: $!\n";
|
||
}
|
||
} elsif ($do eq 'status') {
|
||
if (kill(0,$oldpid)) {
|
||
print "$0 running - pid $oldpid\n";
|
||
$self->gd_check($pidfile, $oldpid);
|
||
exit 0;
|
||
} else {
|
||
print "$0 dead\n";
|
||
exit 1;
|
||
}
|
||
} elsif ($do eq 'check') {
|
||
if (kill(0,$oldpid)) {
|
||
print "$0 running - pid $oldpid\n";
|
||
$self->gd_check($pidfile, $oldpid);
|
||
exit;
|
||
}
|
||
} elsif ($do eq 'start') {
|
||
print "\u$self->{gd_progname} is already running (pid $oldpid)\n";
|
||
exit; # according to LSB, this is no error
|
||
}
|
||
} else {
|
||
$self->gd_error("Pid file $pidfile is invalid but locked, exiting\n");
|
||
}
|
||
}
|
||
} else {
|
||
$locked = lock($pidfile, undef, 'nonblocking')
|
||
or die "Could not lock pid file $pidfile: $!";
|
||
}
|
||
|
||
if ($do eq 'reload' || $do eq 'stop' || $do eq 'check' || ($do eq 'restart' && ! $killed)) {
|
||
print "No $0 running\n";
|
||
}
|
||
|
||
if ($do eq 'stop') {
|
||
unlink($pidfile);
|
||
exit;
|
||
}
|
||
|
||
if ($do eq 'status') {
|
||
print "Unused\n";
|
||
exit 3;
|
||
}
|
||
|
||
if ($do eq 'check') {
|
||
$self->gd_check($pidfile);
|
||
exit
|
||
}
|
||
|
||
unless ($do eq 'reload' || $do eq 'restart' || $do eq 'start') {
|
||
$self->gd_other_cmd($do, $locked);
|
||
}
|
||
|
||
unless ($self->{gd_foreground}) {
|
||
$self->gd_daemonize;
|
||
}
|
||
|
||
$locked or lock($pidfile, undef, 'nonblocking')
|
||
or die "Could not lock PID file $pidfile: $!";
|
||
|
||
write_file($pidfile, "$$\n");
|
||
|
||
print STDERR "Starting up...\n";
|
||
|
||
$self->gd_postconfig(%newconfig);
|
||
|
||
$self->gd_setup_signals;
|
||
|
||
$self->gd_run;
|
||
|
||
unlink($pidfile);
|
||
exit(0);
|
||
}
|
||
|
||
sub gd_check {}
|
||
|
||
sub gd_more_opt { return() }
|
||
|
||
sub gd_getopt
|
||
{
|
||
my $self = shift;
|
||
Getopt::Long::Configure("auto_version");
|
||
GetOptions(
|
||
'configfile=s' => \$self->{configfile},
|
||
'foreground!' => \$self->{gd_foreground},
|
||
'debug!' => \$self->{debug},
|
||
$self->{gd_args}{options}
|
||
? %{$self->{gd_args}{options}}
|
||
: (),
|
||
$self->gd_more_opt(),
|
||
) or exit($self->gd_usage());
|
||
|
||
if (@ARGV < ($self->{gd_args}{minimum_args} || 1)) {
|
||
exit($self->gd_usage());
|
||
}
|
||
if (@ARGV > ($self->{gd_args}{maximum_args} || 1)) {
|
||
exit($self->gd_usage());
|
||
}
|
||
}
|
||
|
||
sub gd_parse_argv { }
|
||
|
||
sub gd_help
|
||
{
|
||
my $self = shift;
|
||
exit($self->gd_usage($self->{gd_args}));
|
||
}
|
||
|
||
sub gd_version
|
||
{
|
||
my $self = shift;
|
||
no strict qw(refs);
|
||
my $v = $self->{gd_args}{version}
|
||
|| ${ref($self)."::VERSION"}
|
||
|| $::VERSION
|
||
|| $main::VERSION
|
||
|| "?";
|
||
print "$self->{gd_progname} - version $v\n";;
|
||
exit;
|
||
}
|
||
|
||
sub gd_pidfile
|
||
{
|
||
my $self = shift;
|
||
my $x = $self->{configfile};
|
||
$x =~ s!/!.!g;
|
||
$self->{gd_pidfile} = "$self->{gd_pidbase}$x.pid";
|
||
}
|
||
|
||
sub gd_other_cmd
|
||
{
|
||
my $self = shift;
|
||
$self->gd_usage;
|
||
exit(1);
|
||
}
|
||
|
||
sub gd_redirect_output
|
||
{
|
||
my $self = shift;
|
||
return if $self->{gd_foreground};
|
||
my $logname = $self->gd_logname;
|
||
my $p = $self->{gd_logpriority} ? "-p $self->{gd_logpriority}" : "";
|
||
open(STDERR, "|logger $p -t '$logname'") or (print "could not open stderr: $!" && exit(1));
|
||
close(STDOUT);
|
||
open(STDOUT, ">&STDERR") or die "redirect STDOUT -> STDERR: $!";
|
||
close(STDIN);
|
||
}
|
||
|
||
sub gd_daemonize
|
||
{
|
||
my $self = shift;
|
||
print "Starting $self->{gd_progname} server\n";
|
||
$self->gd_redirect_output();
|
||
my $pid;
|
||
POSIX::_exit(0) if $pid = fork;
|
||
die "Could not fork: $!" unless defined $pid;
|
||
POSIX::_exit(0) if $pid = fork;
|
||
die "Could not fork: $!" unless defined $pid;
|
||
|
||
POSIX::setsid();
|
||
select(STDERR);
|
||
$| = 1;
|
||
print "Sucessfully daemonized\n";
|
||
}
|
||
|
||
sub gd_logname
|
||
{
|
||
my $self = shift;
|
||
return $self->{gd_progname}."[$$]";
|
||
}
|
||
|
||
sub gd_reconfig_event
|
||
{
|
||
my $self = shift;
|
||
print STDERR "Reconfiguration requested\n";
|
||
$self->gd_postconfig($self->gd_preconfig());
|
||
}
|
||
|
||
sub gd_quit_event
|
||
{
|
||
my $self = shift;
|
||
print STDERR "Quitting...\n";
|
||
exit(0);
|
||
}
|
||
|
||
sub gd_setup_signals
|
||
{
|
||
my $self = shift;
|
||
$SIG{INT} = sub { $self->gd_quit_event() };
|
||
$SIG{HUP} = sub { $self->gd_reconfig_event() };
|
||
}
|
||
|
||
sub gd_run { die "must defined gd_run()" }
|
||
|
||
sub gd_error
|
||
{
|
||
my $self = shift;
|
||
my $e = shift;
|
||
my $do = $self->{do};
|
||
if ($do && $do eq 'stop') {
|
||
warn $e;
|
||
} else {
|
||
die $e;
|
||
}
|
||
}
|
||
|
||
sub gd_flags_more { return () }
|
||
|
||
sub gd_flags
|
||
{
|
||
my $self = shift;
|
||
return (
|
||
'-c file' => "Specify configuration file (instead of $self->{configfile})",
|
||
'-f' => "Run in the foreground (don't detach)",
|
||
$self->gd_flags_more
|
||
);
|
||
}
|
||
|
||
sub gd_commands_more { return () }
|
||
|
||
sub gd_commands
|
||
{
|
||
my $self = shift;
|
||
return (
|
||
start => "Starts a new $self->{gd_progname} if there isn't one running already",
|
||
stop => "Stops a running $self->{gd_progname}",
|
||
reload => "Causes a running $self->{gd_progname} to reload it's config file. Starts a new one if none is running.",
|
||
restart => "Stops a running $self->{gd_progname} if one is running. Starts a new one.",
|
||
$self->gd_commands_more(),
|
||
($self->gd_can_install()
|
||
? ('install' => "Setup $self->{gd_progname} to run automatically after reboot")
|
||
: ()),
|
||
($self->gd_can_uninstall()
|
||
? ('uninstall' => "Do not run $self->{gd_progname} after reboots")
|
||
: ()),
|
||
check => "Check the configuration file and report the daemon state",
|
||
help => "Display this usage info",
|
||
version => "Display the version of $self->{gd_progname}",
|
||
)
|
||
}
|
||
|
||
sub gd_positional_more { return() }
|
||
|
||
sub gd_alts
|
||
{
|
||
my $offset = shift;
|
||
my @results;
|
||
for (my $i = $offset; $i <= $#_; $i += 2) {
|
||
push(@results, $_[$i]);
|
||
}
|
||
return @results;
|
||
}
|
||
|
||
sub gd_usage
|
||
{
|
||
my $self = shift;
|
||
|
||
require Text::Wrap;
|
||
import Text::Wrap;
|
||
|
||
my $col = 15;
|
||
|
||
my @flags = $self->gd_flags;
|
||
my @commands = $self->gd_commands;
|
||
my @positional = $self->gd_positional_more;
|
||
|
||
my $summary = "Usage: $self->{gd_progname} ";
|
||
my $details = '';
|
||
for my $i (gd_alts(0, @flags)) {
|
||
$summary .= "[ $i ] ";
|
||
}
|
||
$summary .= "{ ";
|
||
$summary .= join(" | ", gd_alts(0, @commands));
|
||
$summary .= " } ";
|
||
$summary .= join(" ", gd_alts(0, @positional));
|
||
|
||
my (@all) = (@flags, @commands, @positional);
|
||
while (@all) {
|
||
my ($key, $desc) = splice(@all, 0, 2);
|
||
local($Text::Wrap::columns) = 79;
|
||
$details .= wrap(
|
||
sprintf(" %-${col}s ", $key),
|
||
" " x ($col + 2),
|
||
$desc);
|
||
$details .= "\n";
|
||
}
|
||
|
||
print "$summary\n$details";
|
||
return 0;
|
||
}
|
||
|
||
sub gd_install_pre {}
|
||
sub gd_install_post {}
|
||
|
||
sub gd_can_install
|
||
{
|
||
my $self = shift;
|
||
require File::Basename;
|
||
my $basename = File::Basename::basename($0);
|
||
if (
|
||
-x "/usr/sbin/update-rc.d"
|
||
&&
|
||
-x $0
|
||
&&
|
||
$0 !~ m{^(?:/usr|/var)?/tmp/}
|
||
&&
|
||
eval { symlink("",""); 1 }
|
||
&&
|
||
-d "/etc/init.d"
|
||
&&
|
||
! -e "/etc/init.d/$basename"
|
||
) {
|
||
return sub {
|
||
$self->gd_install_pre("update-rc.d");
|
||
require Cwd;
|
||
my $abs_path = Cwd::abs_path($0);
|
||
symlink($abs_path, "/etc/init.d/$basename")
|
||
or die "Install failed: symlink /etc/init.d/$basename -> $abs_path: $!\n";
|
||
print "+ /usr/sbin/update-rc.d $basename defaults\n";
|
||
system("/usr/sbin/update-rc.d", $basename, "defaults");
|
||
my $exit = $? >> 8;
|
||
$self->gd_install_post("update-rc.d");
|
||
exit($exit) if $exit;
|
||
};
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
sub gd_install
|
||
{
|
||
my $self = shift;
|
||
my $ifunc = $self->gd_can_install();
|
||
die "Install command not supported\n" unless $ifunc;
|
||
&$ifunc($self);
|
||
exit(0);
|
||
}
|
||
|
||
sub gd_uninstall_pre {}
|
||
sub gd_uninstall_post {}
|
||
|
||
sub gd_can_uninstall
|
||
{
|
||
my $self = shift;
|
||
require File::Basename;
|
||
my $basename = File::Basename::basename($0);
|
||
require Cwd;
|
||
my $abs_path = Cwd::abs_path($0) || 'no abs path';
|
||
my $link = readlink("/etc/init.d/$basename") || 'no link';
|
||
if (
|
||
$link eq $abs_path
|
||
&&
|
||
-x "/usr/sbin/update-rc.d"
|
||
) {
|
||
return sub {
|
||
$self->gd_uninstall_pre("update-rc.d");
|
||
unlink("/etc/init.d/$basename");
|
||
print "+ /usr/sbin/update-rc.d $basename remove\n";
|
||
system("/usr/sbin/update-rc.d", $basename, "remove");
|
||
my $exit = $? >> 8;
|
||
$self->gd_uninstall_post("update-rc.d");
|
||
exit($exit) if $exit;
|
||
}
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
sub gd_uninstall
|
||
{
|
||
my $self = shift;
|
||
my $ufunc = $self->gd_can_uninstall();
|
||
die "Cannot uninstall\n" unless $ufunc;
|
||
&$ufunc($self);
|
||
exit(0);
|
||
}
|
||
|
||
sub gd_kill
|
||
{
|
||
my ($self, $pid) = @_;
|
||
|
||
my $talkmore = 0;
|
||
my $killed = 0;
|
||
if (kill(0, $pid)) {
|
||
$killed = 1;
|
||
kill(2,$pid);
|
||
print "Killing $pid\n";
|
||
my $t = time;
|
||
sleep(1) if kill(0, $pid);
|
||
if ($force_quit_delay && kill(0, $pid)) {
|
||
print "Waiting for $pid to die...\n";
|
||
$talkmore = 1;
|
||
while(kill(0, $pid) && time - $t < $force_quit_delay) {
|
||
sleep(1);
|
||
}
|
||
}
|
||
if (kill(15, $pid)) {
|
||
print "Killing $pid with -TERM...\n";
|
||
if ($force_quit_delay) {
|
||
while(kill(0, $pid) && time - $t < $force_quit_delay * 2) {
|
||
sleep(1);
|
||
}
|
||
} else {
|
||
sleep(1) if kill(0, $pid);
|
||
}
|
||
}
|
||
if (kill(9, $pid)) {
|
||
print "Killing $pid with -KILL...\n";
|
||
my $k9 = time;
|
||
my $max = $force_quit_delay * 4;
|
||
$max = 60 if $max < 60;
|
||
while(kill(0, $pid)) {
|
||
if (time - $k9 > $max) {
|
||
print "Giving up on $pid ever dying.\n";
|
||
exit(1);
|
||
}
|
||
print "Waiting for $pid to die...\n";
|
||
sleep(1);
|
||
}
|
||
}
|
||
print "Process $pid is gone\n" if $talkmore;
|
||
} else {
|
||
print "Process $pid no longer running\n";
|
||
}
|
||
return $killed;
|
||
}
|
||
|
||
sub gd_preconfig { die "gd_preconfig() must be redefined"; }
|
||
|
||
sub gd_postconfig { }
|
||
|
||
|
||
1;
|
modules/fallback/Daemon/Generic/Event.pm | ||
---|---|---|
|
||
# Copyright (C) 2006, David Muir Sharnoff <muir@idiom.com>
|
||
|
||
package Daemon::Generic::Event;
|
||
|
||
use strict;
|
||
use warnings;
|
||
require Daemon::Generic;
|
||
require Event;
|
||
require Exporter;
|
||
|
||
our @ISA = qw(Daemon::Generic Exporter);
|
||
our @EXPORT = @Daemon::Generic::EXPORT;
|
||
our $VERSION = 0.3;
|
||
|
||
sub newdaemon
|
||
{
|
||
local($Daemon::Generic::caller) = caller() || 'main';
|
||
local($Daemon::Generic::package) = __PACKAGE__;
|
||
Daemon::Generic::newdaemon(@_);
|
||
}
|
||
|
||
sub gd_setup_signals
|
||
{
|
||
my $self = shift;
|
||
my $reload_event = Event->signal(
|
||
signal => 'HUP',
|
||
desc => 'reload on SIGHUP',
|
||
prio => 6,
|
||
cb => sub {
|
||
$self->gd_reconfig_event;
|
||
$self->{gd_timer}->cancel()
|
||
if $self->{gd_timer};
|
||
$self->gd_setup_timer();
|
||
},
|
||
);
|
||
my $quit_event = Event->signal(
|
||
signal => 'INT',
|
||
cb => sub { $self->gd_quit_event; },
|
||
);
|
||
}
|
||
|
||
sub gd_setup_timer
|
||
{
|
||
my $self = shift;
|
||
if ($self->can('gd_run_body')) {
|
||
my $interval = ($self->can('gd_interval') && $self->gd_interval()) || 1;
|
||
$self->{gd_timer} = Event->timer(
|
||
cb => [ $self, 'gd_run_body' ],
|
||
interval => $interval,
|
||
hard => 0,
|
||
);
|
||
}
|
||
}
|
||
|
||
sub gd_run
|
||
{
|
||
my $self = shift;
|
||
$self->gd_setup_timer();
|
||
Event::loop();
|
||
}
|
||
|
||
sub gd_quit_event
|
||
{
|
||
my $self = shift;
|
||
print STDERR "Quitting...\n";
|
||
Event::unloop_all();
|
||
}
|
||
|
||
1;
|
||
|
||
=head1 NAME
|
||
|
||
Daemon::Generic::Event - Generic daemon framework with Event.pm
|
||
|
||
=head1 SYNOPSIS
|
||
|
||
use Daemon::Generic::Event;
|
||
|
||
@ISA = qw(Daemon::Generic::Event);
|
||
|
||
sub gd_preconfig {
|
||
# stuff
|
||
}
|
||
|
||
=head1 DESCRIPTION
|
||
|
||
Daemon::Generic::Event is a subclass of L<Daemon::Generic> that
|
||
predefines some methods:
|
||
|
||
=over 15
|
||
|
||
=item gd_run()
|
||
|
||
Setup a periodic callback to C<gd_run_body()> if there is a C<gd_run_body()>.
|
||
Call C<Event::loop()>.
|
||
|
||
=item gd_setup_signals()
|
||
|
||
Bind SIGHUP to call C<gd_reconfig_event()>.
|
||
Bind SIGINT to call C<gd_quit_event()>.
|
||
|
||
=back
|
||
|
||
To use Daemon::Generic::Event, you have to provide a C<gd_preconfig()>
|
||
method. It can be empty if you have a C<gd_run_body()>.
|
||
|
||
Set up your own events in C<gd_preconfig()> and C<gd_postconfig()>.
|
||
|
||
If you have a C<gd_run_body()> method, it will be called once per
|
||
second or every C<gd_interval()> seconds if you have a C<gd_interval()>
|
||
method. Unlike in L<Daemon::Generic::While1>, C<gd_run_body()> should
|
||
not include a call to C<sleep()>.
|
||
|
||
=head1 THANK THE AUTHOR
|
||
|
||
If you need high-speed internet services (T1, T3, OC3 etc), please
|
||
send me your request-for-quote. I have access to very good pricing:
|
||
you'll save money and get a great service.
|
||
|
||
=head1 LICENSE
|
||
|
||
Copyright(C) 2006 David Muir Sharnoff <muir@idiom.com>.
|
||
This module may be used and distributed on the same terms
|
||
as Perl itself.
|
||
|
modules/fallback/Daemon/Generic/While1.pm | ||
---|---|---|
# Copyright (C) 2006, David Muir Sharnoff <muir@idiom.com>
|
||
|
||
package Daemon::Generic::While1;
|
||
|
||
use strict;
|
||
use warnings;
|
||
use Carp;
|
||
require Daemon::Generic;
|
||
require POSIX;
|
||
require Exporter;
|
||
|
||
our @ISA = qw(Daemon::Generic Exporter);
|
||
our @EXPORT = @Daemon::Generic::EXPORT;
|
||
our $VERSION = 0.3;
|
||
|
||
sub newdaemon
|
||
{
|
||
local($Daemon::Generic::caller) = caller() || 'main';
|
||
local($Daemon::Generic::package) = __PACKAGE__;
|
||
Daemon::Generic::newdaemon(@_);
|
||
}
|
||
|
||
sub gd_setup_signals
|
||
{
|
||
my ($self) = @_;
|
||
$SIG{HUP} = sub {
|
||
$self->{gd_sighup} = time;
|
||
};
|
||
my $child;
|
||
$SIG{INT} = sub {
|
||
$self->{gd_sigint} = time;
|
||
#
|
||
# We'll be getting a SIGTERM in a bit if we're not dead, so let's use it.
|
||
#
|
||
$SIG{TERM} = sub {
|
||
$self->gd_quit_event();
|
||
kill(15, $child) if $child; # if we're still alive, let's stay that way
|
||
};
|
||
};
|
||
}
|
||
|
||
sub gd_sleep
|
||
{
|
||
my ($self, $period) = @_;
|
||
croak "Sleep period must be defined" unless defined $period;
|
||
my $hires;
|
||
if ($period*1000 != int($period*1000)) {
|
||
$hires = 1;
|
||
require Time::HiRes;
|
||
import Time::HiRes qw(time sleep);
|
||
}
|
||
my $t = time;
|
||
while (time - $t < $period) {
|
||
return if $self->{gd_sigint};
|
||
return if $self->{gd_sighup};
|
||
if ($hires) {
|
||
my $p = (time - $t < 1)
|
||
? time - $t
|
||
: 1;
|
||
sleep($p);
|
||
} else {
|
||
sleep(1);
|
||
}
|
||
}
|
||
}
|
||
|
||
sub gd_run
|
||
{
|
||
my ($self) = @_;
|
||
while(1) {
|
||
if ($self->{gd_sigint}) {
|
||
$self->{gd_sigint} = 0;
|
||
$self->gd_quit_event();
|
||
}
|
||
|
||
if ($self->{gd_sighup}) {
|
||
$self->{gd_sighup} = 0;
|
||
$self->gd_reconfig_event();
|
||
}
|
||
|
||
$self->gd_run_body();
|
||
}
|
||
}
|
||
|
||
sub gd_reconfig_event
|
||
{
|
||
my $self = shift;
|
||
print STDERR "Reconfiguration requested\n";
|
||
$self->gd_postconfig($self->gd_preconfig());
|
||
}
|
||
|
||
sub gd_quit_event
|
||
{
|
||
print STDERR "Quitting...\n";
|
||
exit(0);
|
||
}
|
||
|
||
|
||
sub gd_run_body { die "must override gd_run_body()" }
|
||
|
||
1;
|
||
|
||
=head1 NAME
|
||
|
||
Daemon::Generic::While1 - Daemon framework with default while(1) loop
|
||
|
||
=head1 SYNOPSIS
|
||
|
||
@ISA = qw(Daemon::Generic::While1);
|
||
|
||
sub gd_run_body {
|
||
# stuff
|
||
}
|
||
|
||
=head1 DESCRIPTION
|
||
|
||
This is a slight variation on L<Daemon::Generic>: a default
|
||
C<gd_run()> provided. It has a while(1) loop that calls
|
||
C<gd_run_body()> over and over. It checks for reconifg and
|
||
and terminate events and only actions them between calls
|
||
to C<gd_run_body()>.
|
||
|
||
Terminate events will be forced through after
|
||
C<$Daemon::Generic::force_quit_delay> seconds if
|
||
C<gd_run_body()> doesn't return quickly enough.
|
||
|
||
=head1 SUBCLASS METHODS REQUIRD
|
||
|
||
The following method is required to be overridden to subclass
|
||
Daemon::Generic::While1:
|
||
|
||
=over 15
|
||
|
||
=item gd_run_body()
|
||
|
||
This method will be called over and over. This method should
|
||
include a call to C<sleep(1)> (or a bit more). Reconfig events
|
||
will not interrupt it. Quit events will only interrupt it
|
||
after 15 seconds.
|
||
|
||
=back
|
||
|
||
=head1 ADDITIONAL METHODS
|
||
|
||
The following additional methods are available for your use
|
||
(as compared to L<Daemon::Generic>):
|
||
|
||
=over 15
|
||
|
||
=item gd_sleep($period)
|
||
|
||
This will sleep for C<$period> seconds but in one-second
|
||
intervals so that if a SIGINT or SIGHUP arrives the sleep
|
||
period can end more quickly.
|
||
|
||
Using this makes it safe for C<gd_run_body()> to sleep for
|
||
longer than C<$Daemon::Generic::force_quit_delay> seconds
|
||
at a time.
|
||
|
||
=back
|
||
|
||
=head1 ADDITIONAL MEMBER DATA
|
||
|
||
The following additional bits of member data are defined:
|
||
|
||
=over 15
|
||
|
||
=item gd_sigint
|
||
|
||
The time at which an (unprocessed) SIGINT was recevied.
|
||
|
||
=item gd_sighup
|
||
|
||
The time at which an (unprocessed) SIGHUP was recevied.
|
||
|
||
=back
|
||
|
||
=head1 THANK THE AUTHOR
|
||
|
||
If you need high-speed internet services (T1, T3, OC3 etc), please
|
||
send me your request-for-quote. I have access to very good pricing:
|
||
you'll save money and get a great service.
|
||
|
||
=head1 LICENSE
|
||
|
||
Copyright(C) 2006 David Muir Sharnoff <muir@idiom.com>.
|
||
This module may be used and distributed on the same terms
|
||
as Perl itself.
|
||
|
modules/fallback/File/Flock.pm | ||
---|---|---|
# Copyright (C) 1996, 1998 David Muir Sharnoff
|
||
|
||
package File::Flock;
|
||
|
||
require Exporter;
|
||
@ISA = qw(Exporter);
|
||
@EXPORT = qw(lock unlock lock_rename);
|
||
|
||
use Carp;
|
||
use POSIX qw(EAGAIN EACCES EWOULDBLOCK ENOENT EEXIST O_EXCL O_CREAT O_RDWR);
|
||
use Fcntl qw(LOCK_SH LOCK_EX LOCK_NB LOCK_UN);
|
||
use IO::File;
|
||
|
||
use vars qw($VERSION $debug $av0debug);
|
||
|
||
BEGIN {
|
||
$VERSION = 2008.01;
|
||
$debug = 0;
|
||
$av0debug = 0;
|
||
}
|
||
|
||
use strict;
|
||
no strict qw(refs);
|
||
|
||
my %locks; # did we create the file?
|
||
my %lockHandle;
|
||
my %shared;
|
||
my %pid;
|
||
my %rm;
|
||
|
||
sub new
|
||
{
|
||
my ($pkg, $file, $shared, $nonblocking) = @_;
|
||
&lock($file, $shared, $nonblocking) or return undef;
|
||
return bless \$file, $pkg;
|
||
}
|
||
|
||
sub DESTROY
|
||
{
|
||
my ($this) = @_;
|
||
unlock($$this);
|
||
}
|
||
|
||
sub lock
|
||
{
|
||
my ($file, $shared, $nonblocking) = @_;
|
||
|
||
my $f = new IO::File;
|
||
|
||
my $created = 0;
|
||
my $previous = exists $locks{$file};
|
||
|
||
# the file may be springing in and out of existance...
|
||
OPEN:
|
||
for(;;) {
|
||
if (-e $file) {
|
||
unless (sysopen($f, $file, O_RDWR)) {
|
||
redo OPEN if $! == ENOENT;
|
||
croak "open $file: $!";
|
||
}
|
||
} else {
|
||
unless (sysopen($f, $file, O_CREAT|O_EXCL|O_RDWR)) {
|
||
redo OPEN if $! == EEXIST;
|
||
croak "open >$file: $!";
|
||
}
|
||
print STDERR " {$$ " if $debug; # }
|
||
$created = 1;
|
||
}
|
||
last;
|
||
}
|
||
$locks{$file} = $created || $locks{$file} || 0;
|
||
$shared{$file} = $shared;
|
||
$pid{$file} = $$;
|
||
|
||
$lockHandle{$file} = $f;
|
||
|
||
my $flags;
|
||
|
||
$flags = $shared ? LOCK_SH : LOCK_EX;
|
Auch abrufbar als: Unified diff
Weitere Fallback-Module entfernt und Doku angepasst (s.a. #344)