"\\#", "$"=>"\\$", "%"=>"\\%", "&"=>"\\&", "~"=>"\\~{}", "_"=>"\\_", "^"=>"\\^{}", "\\"=>"\\textbackslash", "{"=>"\\{", "}"=>"\\}", ); return preg_replace("/([\^\%~\\\\#\$%&_\{\}])/e", "\$map['$1']", $string); } function latex_encode($text) { return latexspecialchars(utf8_decode($text)); } function ordersatz_archive($id, $title, $filename) { global $db; $parts = pathinfo($filename); $base = $_SESSION['sys']['basedir'] . 'archive/' . MODULE; if (!is_dir($base)) return 'Basis-Verzeichnis nicht vorhanden'; $base .= '/'; $path = date('Y'); if (!is_dir($base.$path)) if (mkdir($base.$path) === false) return 'Kann Verzeichnis nicht anlegen: ' . $path; $path .= '/' . date('m'); if (!is_dir($base.$path)) if (mkdir($base.$path) === false) return 'Kann Verzeichnis nicht anlegen: ' . $path; $parts['filename'] = utf8_encode($parts['filename']); $path .= '/' . $parts['filename']; $max = 100; for ($i=0; $i < $max; $i++) { $fname = $path; if ($i > 0) $fname .= '('.$i.')'; if (!empty($parts['extension'])) $fname .= '.' . $parts['extension']; if (!is_file($base.$fname)) { if (copy($filename, $base.$fname) === false) return 'Kann Datei nicht speichern'; chmod($base.$fname, 0640); break; } } $sql = sprintf("INSERT INTO metro_files (ordersatz,date,title,path,sys_user,sys_edit) " . "VALUES (%d,now(),%s,%s,%s,now())", $id, $db->quote($title), $db->quote($fname), $db->quote($_SESSION['sys']['login'])); $sth = $db->query($sql); return true; } function ordersatz_finish($id) { global $db; $sql = sprintf("DELETE FROM metro_ordersatz_pos WHERE ordersatz = %d AND anzahl IS NULL", $id); $sth = $db->query($sql); $sql = sprintf("UPDATE metro_ordersatz SET done = now(), sys_edit = now(), sys_user = %s WHERE id = %d", $db->quote($_SESSION['sys']['login']), $id); $sth = $db->query($sql); } function ordersatz_write($id, $dir, $send) { global $db; $fname = sprintf("%smasks/%s/%s", $_SESSION['sys']['basedir'], MODULE, TEMPLATE); if (!file_exists($fname)) return "Vorlage nicht gefunden"; copy($fname, $dir . '/ordersatz.tex'); chdir($dir); $sql = sprintf("SELECT name,koch,email,telefon,datum,uhrzeit,owner FROM metro_ordersatz WHERE id = %d", $id); $satz = query_db($sql); $f = fopen(FNAME_VARS, 'w'); fwrite($f, sprintf('\newcommand{\koch}{%s}'."\n", latex_encode($satz[0]['koch']))); fwrite($f, sprintf('\newcommand{\reise}{%s}'."\n", latex_encode($satz[0]['name']))); fwrite($f, sprintf('\newcommand{\telefon}{%s}'."\n", latex_encode($satz[0]['telefon']))); fwrite($f, sprintf('\newcommand{\uhrzeit}{%s}'."\n", latex_encode($satz[0]['uhrzeit']))); $d = explode('-', $satz[0]['datum']); fwrite($f, sprintf('\newcommand{\datum}{%d.%d.%d}'."\n", $d[2], $d[1], $d[0])); fclose($f); $sql = sprintf("SELECT artnr,gang,metro_vpe.short AS vpname,menge,bezeichnung,hinweis,hersteller,anzahl " . "FROM metro_ordersatz_pos " . "JOIN metro_artikel ON artikel = metro_artikel.id " . "JOIN metro_abteilung ON abteilung = metro_abteilung.id " . "JOIN metro_vpe ON vpe = metro_vpe.id " . "WHERE ordersatz = %d AND anzahl IS NOT NULL " . "ORDER BY gang,metro_abteilung.name,bezeichnung", $id); $result = query_db($sql); if (count($result) == 0) return "Keine Artikel zur Bestellung ausgewählt"; $f = fopen(FNAME_ITEMS, 'w'); foreach ($result as $row) { $bez = latex_encode($row['bezeichnung']); if (strlen($row['hersteller'])) $bez .= ' (' . latex_encode($row['hersteller']) . ')'; if (strlen($row['hinweis'])) $bez .= sprintf("\\newline\\textbf{%s}", latex_encode($row['hinweis'])); fwrite($f, sprintf('\order{%d}{%s}{%s %s}{%s}{%s}'."\n", $row['anzahl'], $row['artnr'] ? (int)$row['artnr'] : '', latex_encode($row['menge']), $bez, latex_encode($row['vpname']), latex_encode($row['gang']))); } fclose($f); system("latex ordersatz > ordersatz.out 2>&1 && dvips ordersatz >> ordersatz.out 2>&1 && pdflatex ordersatz >> ordersatz.out", $ret); if ($ret !== 0) { $fname = sprintf("ordersatz-%d-%d.tar.bz2", $id, time()); $cmd = sprintf("tar cfj %s ordersatz.tex ordersatz_vars.tex ordersatz_items.tex ordersatz.out && " . "mail -s 'Probleme beim Compilieren des Ordersatzes %d' %s < %s && " . "sendfile -Q -c='Probleme beim Compilieren des Ordersatzes %d' %s %s", $fname, $id, ERROR_MAIL, $fname, $id, $fname, ERROR_SAFT); system($cmd); return "Probleme beim Compilieren des Ordersatzes"; } if (!file_exists('ordersatz.ps')) return "Postscript-Datei nicht erstellt"; if ($send) { $ret = ordersatz_archive($id, 'Ordersatz '.$satz[0]['name'], $dir . '/ordersatz.pdf'); if ($ret !== true) return $ret; if (empty($satz[0]['email'])) $satz[0]['email'] = 'joey@infodrom.org'; $cmd = sprintf("faxspool -f %s %s %s > /dev/null 2>&1", $satz[0]['email'], FAXNUMBER, 'ordersatz.ps'); system($cmd); $message = sprintf("Hallo %s!\n\nDer angehängte Ordersatz wurde gerade an Metro Oldenburg verschickt.\n" . "Eine Bestätigung über den Versand kommt per Mail.\n\n", $satz[0]['koch']); mail_attach($satz[0]['email'], mb_encode_mimeheader(utf8_decode('Ordersatz ' . $satz[0]['name']),'latin1'), $satz[0]['email'], mb_encode_mimeheader(utf8_decode('Infodrom ' . $satz[0]['koch']),'latin1'), array($dir . '/ordersatz.pdf'), $message); ordersatz_finish($id); } return true; } ?>