<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>eenga - Interaktiv</title>
	<atom:link href="http://eenga.de/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://eenga.de/blog</link>
	<description>Web-Briefing</description>
	<lastBuildDate>Fri, 29 Jul 2011 09:19:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Rechnungsstellung aus dem Online-Kalender</title>
		<link>http://eenga.de/blog/blog/rechnungsstellung-aus-dem-online-kalender/</link>
		<comments>http://eenga.de/blog/blog/rechnungsstellung-aus-dem-online-kalender/#comments</comments>
		<pubDate>Tue, 03 May 2011 22:54:32 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://eenga.de/blog/?p=143</guid>
		<description><![CDATA[Letztes Jahr haben wir gebaut, dieses Jahr kommen noch immer Rechnungen für Leistungen, die bereits Monate her sind. Das die Zahlungsmoral von Kunden sinkt, wenn eine lange Zeit zwischen Leistungserbringung und Abrechnung liegt, sollte sich eigentlich rumgesprochen haben. &#8220;Er ist pleite, den er hat nie Rechnungen gestellt&#8221; Leider kein Witz, sondern Realität im deutschen Traditionshandwerk. Gute [...]]]></description>
			<content:encoded><![CDATA[<div>
<p><img class="alignleft" title="Rechnung" src="http://www.cyber-junk.de/wp-content/uploads/2011/05/Rechnung-150x150.jpg" alt="Langer Weg bis zur Rechnung" width="150" height="150" /></p>
<p>Letztes Jahr haben wir <a href="http://www.banedon.de/">gebaut</a>, dieses Jahr kommen noch immer Rechnungen für Leistungen, die bereits Monate her sind. Das die Zahlungsmoral von Kunden sinkt, wenn eine lange Zeit zwischen Leistungserbringung und Abrechnung liegt, sollte sich eigentlich rumgesprochen haben.</p>
<blockquote><p>&#8220;Er ist pleite, den er hat nie Rechnungen gestellt&#8221;</p></blockquote>
<p>Leider kein Witz, sondern Realität im deutschen Traditionshandwerk. Gute Arbeit geleistet, volle Auftragsbücher &#8211; und trotzdem in Zahlungsschwierigkeiten. Schaue ich mir an, wie der Weg zur Rechnungsstellung ist, wird zumindest mir recht schnell klar, dass dies viel zu kompliziert ist. Als Handwerker muss man sich ohne IT-Kenntnisse und noch weniger Erfahrung mit Buchhaltung kryptisch hinsetzen und vom Notizblock sinnvolle Dokumente Zaubern, die dann den Kunden zum Zahlen animieren sollen.</p>
<p><em>Warum so kompliziert?</em></p>
<p><img title="Weiterlesen..." src="http://www.cyber-junk.de/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif" alt="" /></p>
<p>Die Termine, werden ohnehin verwaltet. Viele der Handwerker, die bei uns im letzten Jahr waren, hatten Smartphones dabei. Wieso nicht die absoluten Grundlagen miteinander verbinden.</p>
<p><a href="http://www.cyber-junk.de/wp-content/uploads/2011/05/KaReBu.png"><img class="alignright" title="KaReBu" src="http://www.cyber-junk.de/wp-content/uploads/2011/05/KaReBu-150x150.png" alt="" width="150" height="150" /></a><strong>KaReBu (Kalender-&gt;Rechnung-&gt;Buchen)</strong></p>
<p>Entstanden war eine einfach Idee inkl. Versuch. Man nehme einen beliebigen Kalender (hier <a href="https://www.google.com/calendar/render?tab=mc">Google Kalender</a>). In diesem werden wie gewohnt die Termine gespeichert. Der Titel ist die Person/Firma, bei der die Leistung erbracht wird. Das &#8220;Wo&#8221; beschreibt den Ort. Beide Informationen werden 1:1 später verwendet in den Rechnungsdaten.</p>
<p>Wirklich sensibel ist die Beschreibung, denn hier wird festgelegt, welche Positionen später auf der Rechnung erscheinen sollen.</p>
<p>&nbsp;</p>
<div id="_mcePaste">In diesem Beispiel:</div>
<pre>POS 3 Stk. Superklemmen 14,20€</pre>
<pre>POS 1,5 Std. Fachmeister</pre>
<pre>POS 16 km Anfahrt</pre>
<p><strong>Theoretisch</strong> reicht dies aus, damit eine Rechnung <a href="http://www.cyber-junk.de/wp-content/uploads/2011/05/RE20110011.pdf">(Beispiel)</a> direkt an den Kunden verschickt wird, denn im Hintergrund läuft regelmäßig folgendes:</p>
<ul>
<li>Ein Script liest automatisch die Kalendereinträge aus</li>
<li>Prüft diese auf Veränderungen und erstellt Nachweise</li>
<li>Die Nachweise werden zu Rechnungen umgewandelt und die Kundendaten ergänzt</li>
<li>Fehlende Preisangaben werden aus der Preisliste ermittelt</li>
<li>Via Mail2Post Service wird die Rechnung automatisch per Post verschickt</li>
<li>Die Rechnung wird in die OP-Liste eingetragen</li>
</ul>
<p><strong>Praktisch</strong> kann mit einem solchen automatischen Script, bereits wenige Minuten nach Verlassen des Kunden die Rechnung in der Post liegen. Die Buchhaltung freut sich, da die Daten nicht mehr händisch abgearbeitet werden müssen und die OP-Liste sauber gepflegt ist.</p>
<h3>Kosten</h3>
<p>Da die Scripte mittlerweile vorhanden sind, fallen lediglich die Anpassungen an. Das Script selbst ist unter Creative Commons lizensiert und kann somit frei verwendet werden.</p>
<p><strong>Setup Kosten</strong><br />
Angepasst werden muss für den jeweiligen Anwendungsfall (Handwerker) das Rechnunglayout und die Einstellungen welcher Kalender, welche Kontaktdaten etc&#8230; verwendet werden sollen. Ebenso sollte die Preisliste erfasst werden.</p>
<p><strong>Stückkosten</strong><br />
Selbstverständlich kostet die Nutzung eines Mail2Print/Web2Print Angebotes etwas Geld. Bei den FullService-Anbietern, die ich bislang für den Druck und den Versand genutzt habe, fallen ca. 1,20-2,00€ pro Briefsendung an Kosten an. Zusätzlich sollte man etwas Reserve einbauen, da es immer irgendwo zu Schwierigkeiten kommen kann (fehlende Preise in der Preisliste, Falsche oder fehlender Kundenname, etc&#8230;). Mehr als 3,00€  wird dies jedoch nicht sein.</p>
<p><strong>Regelmäßige Kosten</strong><br />
Das Script braucht natürlich etwas Wartung. Hierzu zählen nicht nur die Änderungen der MwST (sollte dies mal wieder kommen), sondern auch die Anbindung an die Buchhaltung etc&#8230; &#8211; zusätzlich muss das Script regelmäßig gestartet werden. Geht man von einer vollständigen Cloud-Lösung aus, so denke ich, dass hier 40,00€ ein kostendeckender Betrag sein sollte.</p>
</div>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://eenga.de/blog/blog/rechnungsstellung-aus-dem-online-kalender/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mail to Dropbox</title>
		<link>http://eenga.de/blog/blog/mail-to-dropbox/</link>
		<comments>http://eenga.de/blog/blog/mail-to-dropbox/#comments</comments>
		<pubDate>Fri, 22 Apr 2011 14:27:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://eenga.de/blog/?p=108</guid>
		<description><![CDATA[Die eigenen Dateien überall zugreifbar zu haben. Mit anderen an bestimmten Dateien arbeiten  - egal ob vom Desktoprechner, IPhone oder Android Smartphone. Das erlaubt Dropbox. Doch wie viele Dokumente finden überhaupt den Weg bis zum Dateisystem via Datei speichern?  Reiseplan, Whitepaper, Präsentation &#8211; recht häufig bekommen wir Dokumente lediglich per Mail gesendet. Den Anhang dennoch [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://db.tt/RT61hid"><img class="alignleft size-full wp-image-111" title="dropbox_to_mail" src="http://eenga.de/blog/wp-content/uploads/2011/04/dropbox_to_mail.png" alt="" width="241" height="76" /></p>
<p></a><strong>Die eigenen Dateien überall zugreifbar zu haben. Mit anderen an bestimmten Dateien arbeiten  - egal ob vom Desktoprechner, IPhone oder Android Smartphone. Das erlaubt <a href="http://db.tt/RT61hid">Dropbox</a>. Doch wie viele Dokumente finden überhaupt den Weg bis zum Dateisystem via <em>Datei speichern</em>?  Reiseplan, Whitepaper, Präsentation &#8211; recht häufig bekommen wir Dokumente lediglich per Mail gesendet. Den Anhang dennoch direkt auf die Dropbox zu speichern erlaubt &#8220;Mail to Dropbox&#8221;.</strong></p>
<p><strong>Für ganz eilige</strong>: Einfach eine Mail mit Dateianhang senden an &#8220;<a title="Dateianhang von Mails in Dropbox speichern." href="mailto:post@dropbox.eenga.de">post@dropbox.eenga.de</a>&#8220;. Nach einigen Minuten sollte eine E-Mail im Postfach sein mit der Bitte sich einmalig die Verlinkung zwischen Dropbox und dem<em> Mail to Dropbox</em> System herzustellen. Innerhalb des Dropbox Startortners wird im Anschluss ein Ordner &#8220;eenga_attachments&#8221; angelegt, indem nun alle Dateianhänge verfügbar sind.</p>
<p><span id="more-108"></span></p>
<h2>Regelmäßige Nutzung</h2>
<p>Wer dieses System regelmäßig nutzen möchte, der kann dies entweder hier auf diesem System machen (für 6 $ US einmalig) und weiterhin &#8220;post@dropbox.eenga.de&#8221; nutzen &#8211; oder sich die notwendigen Konfigurationen selbst vornehmen. Hierzu wird etwas Kenntnisse über Linux und die Funktion von Web, Mail, PHP benötigt.</p>
<h4>Schritt 1 &#8211; Voraussetzungen prüfen</h4>
<ul>
<li>Domain Name kann frei konfiguriert werden (Nameserver editierbar)</li>
<li>Webserver mit PHP vorhanden, Verwendung von PEAR möglich</li>
<li>Procmail installiert und lauffähig</li>
<li>Dropbox Zugang vorhanden.</li>
</ul>
<h4>Schritt 2 &#8211; Neue Dropbox Anwendung einrichten</h4>
<p>Auf Dropbox anmelden und dort eine <a href="https://www.dropbox.com/developers/apps">neue Anwendung beantragen</a>. Die weiteren Optionen sind eigentlich egal. Benötigt wird lediglich der &#8220;Schlüssel&#8221; und &#8220;Geheim&#8221; Wert, der am Ende der Seite angezeigt wird.</p>
<p><strong>Schritt 3 &#8211; DNS Server editieren</strong></p>
<p>Um das &#8220;normale&#8221; E-Mail System nicht zu beeinträchtigen würde ich empfehlen eine neue Sub-Domain anzulegen und für diesen auch den MX Eintrag beim Nameserver zu setzten. Für post@dropbox.eenga.de läuft das alles auf einem eigenen VServer, da die folgenden Scripte nicht unbedingt 100% sicher sind.</p>
<p><strong>Schritt 4 &#8211; Procmail konfigurieren</strong></p>
<p>zunächst einen neuen Nutzer im System anlegen und prüfen, dass dieser auch Mails empfangen kann. Anschliessend in dessen Home-Verzeichnis eine .procmailrc mit folgendem Inhalt anlegen:</p>
<p><code> </code></p>
<p><code>LOGABSTRACT=yes</p>
<p>LOGFILE=/var/log/procmail.log</p>
<p>:0</p>
<p>*</p>
<p>| /usr/bin/php -q /home/benutzername/recmail.php</p>
<p></code></p>
<p>Den Wert für &#8220;Benutzername&#8221; entsprechend anpassen.</p>
<p><strong>Schritt 5 &#8211; Mail Processing PHP (recmail.php) anlegen</strong></p>
<p><code></p>
<p>&st;?$stdin = fopen("php://stdin","r"); while(!feof($stdin)) { $email .= fread($stdin, 1024); } $consumerKey = '#####EINTRAGEN######'; $consumerSecret = '#####EINTRAGEN######'; require_once 'Mail.php'; require_once 'Mail/mimeDecode.php'; require_once 'Mail/mime.php'; $params['include_bodies'] = true; $params['decode_bodies'] = true; $params['decode_headers'] = true; $decoder = new Mail_mimeDecode($email); $structure = $decoder->decode($params);</p>
<p>$from = $structure->headers["from"];</p>
<p>$user = md5("benutzername-".$from);</p>
<p>if(!is_dir("/home/benutzername/msg/".$user)) {</p>
<p>  mkdir("/home/benutzername/msg/".$user);</p>
<p>}</p>
<p>$auth=array();</p>
<p>if(!is_file("/home/benutzername/msg/".$user.".auth")) {</p>
<p>   $msg="";</p>
<p>   $msg.="Thanks for sending in a file to the EEnga Mail to Dropbox system.\n\r";</p>
<p>   $msg.="In order to save it please grant access visiting the following URL:\n\r";</p>
<p>   $msg.=" http://dropbox.eenga.de/grant.php?".$user."\n\r";</p>
<p>   $headers="";</p>
<p>   $headers .= 'From: Eenga Mail to Dropbox</p>
<post@dropbox.eenga.de>' . "\r\n";</p>
<p>   mail( $from,"Dropbox Authentication required",$msg,$headers);</p>
<p>} else {</p>
<p>  $auth=json_decode(file_get_contents("/home/benutzername/msg/".$user.".auth"),true);</p>
<p>}</p>
<p>foreach ($structure->parts as $part) {</p>
<p>    // only save if an attachment</p>
<p>    if (isset($part->disposition)  &#038;&#038; ($part->disposition=='attachment')) {</p>
<p>        // open file</p>
<p>        file_put_contents("/home/benutzername/msg/".$user."/".$part->d_parameters["filename"],$part->body);</p>
<p>        if(isset($auth["token"])) {</p>
<p>               include 'Dropbox/autoload.php';</p>
<p>               $oauth = new Dropbox_OAuth_PEAR($consumerKey, $consumerSecret);</p>
<p>               include 'Dropbox/autoload.php';</p>
<p>               $oauth = new Dropbox_OAuth_PEAR($consumerKey, $consumerSecret);</p>
<p>               $oauth->setToken($auth);</p>
<p>                $dropbox = new Dropbox_API($oauth);</p>
<p>        try {        $dropbox->createFolder("eenga_attachments"); } catch(Exception $ex) {}</p>
<p>               $dropbox->putFile("eenga_attachments/".$part->d_parameters["filename"],"//home/benutzername/msg/".$user."/".$part->d_parameters["filename"]);</p>
<p>        }</p>
<p>    }</p>
<p>}</p>
<p>?&gt;</p>
<p>
</code></p>
<p>Benutzername immer entsprechend austauschen, den Consumer Key &#038; Secret setzen, URL für die grant.php anpassen.</p>
<p><strong>Schritt 6 &#8211; grant.php anlegen</strong></p>
<p><code><br />
&st;?<br />
php</p>
<p>/* Please supply your own consumer key and consumer secret */<br />
$consumerKey = '#### EINFÜGEN#####';<br />
$consumerSecret = '#### EINFÜGEN#####';</p>
<p>include 'Dropbox/autoload.php';</p>
<p>/* We need a session to store the token, use whatever you want though to store these */<br />
session_start();<br />
if(isset($_REQUEST["user"])) {<br />
$_SESSION["user"]=$_REQUEST["user"];<br />
$_SESSION["state"]=1;<br />
}</p>
<p>$oauth = new Dropbox_OAuth_PHP($consumerKey, $consumerSecret);</p>
<p>// If the PHP OAuth extension is not available, you can try<br />
// PEAR's HTTP_OAUTH instead.<br />
// $oauth = new Dropbox_OAuth_PEAR($consumerKey, $consumerSecret);</p>
<p>if (isset($_SESSION['state'])) {<br />
    $state = $_SESSION['state'];<br />
} else {<br />
    $state = 1;<br />
}<br />
//$state=1;<br />
switch($state) {</p>
<p>    case 1 :<br />
        $tokens = $oauth->getRequestToken();</p>
<p>        // Note that if you want the user to automatically redirect back, you can<br />
        // add the 'callback' argument to getAuthorizeUrl.<br />
        $redir=str_replace("api.dropbox","www.dropbox",$oauth->getAuthorizeUrl());<br />
	$redir.="&#038;callback=".urlencode("http://dropbox.eenga.de/grant.php")."\n";</p>
<p>        $_SESSION['state'] = 2;<br />
        $_SESSION['oauth_tokens'] = $tokens;<br />
        header("Location: ".$redir);<br />
        die();<br />
    case 2 :<br />
        $oauth->setToken($_SESSION['oauth_tokens']);<br />
        $tokens = $oauth->getAccessToken();<br />
        $_SESSION['state'] = 3;<br />
        $_SESSION['oauth_tokens'] = $tokens;<br />
        header("Location: /grant.php");<br />
    case 3 :<br />
        echo "Your user is authenticated\n";<br />
        echo "Mails send to post@dropbox.eenga.de will be saved to your Dropbox.\n";<br />
        file_put_contents("/home/benutzername/msg/".$_SESSION["user"].".auth",json_encode($_SESSION['oauth_tokens']));</p>
<p>        $oauth->setToken($_SESSION['oauth_tokens']);<br />
        break;<br />
}</p>
<p>?&gt;<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://eenga.de/blog/blog/mail-to-dropbox/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

