Switch to mpack
[misc/hallinta-metro] / utils.php
1 <?php
2
3 define('MODULE', 'metro');
4 define('TEMPLATE', 'ordersatz.tex');
5 define('FNAME_VARS', 'ordersatz_vars.tex');
6 define('FNAME_ITEMS', 'ordersatz_items.tex');
7 define('FAXNUMBER','2002-364');
8 define('ERROR_SAFT','joey@finlandia');
9 define('ERROR_MAIL','joey@finlandia');
10
11 function mk_tempdir()
12 {
13   $tmpdir = sprintf("%sarchive/%s/%s",
14                     $_SESSION['sys']['basedir'],
15                     MODULE,
16                     md5(date('c')));
17   mkdir($tmpdir,0777);
18
19   return $tmpdir;
20 }
21
22 function rm_tempdir($dir)
23 {
24   system(sprintf("rm -rf %s", $dir));
25 }
26
27 function latexspecialchars($string)
28 {
29   $map = array(
30                "#"=>"\\#",
31                "$"=>"\\$",
32                "%"=>"\\%",
33                "&"=>"\\&",
34                "~"=>"\\~{}",
35                "_"=>"\\_",
36                "^"=>"\\^{}",
37                "\\"=>"\\textbackslash",
38                "{"=>"\\{",
39                "}"=>"\\}",
40                );
41   return preg_replace("/([\^\%~\\\\#\$%&_\{\}])/e", "\$map['$1']", $string);
42 }
43
44 function latex_encode($text)
45 {
46   return latexspecialchars(utf8_decode($text));
47 }
48
49 function ordersatz_archive($id, $title, $filename)
50 {
51   global $db;
52
53   $parts = pathinfo($filename);
54
55   $base = $_SESSION['sys']['basedir'] . 'archive/' . MODULE;
56
57   if (!is_dir($base))
58     return 'Basis-Verzeichnis nicht vorhanden';
59
60   $base .= '/';
61
62   $path = date('Y');
63   if (!is_dir($base.$path))
64     if (mkdir($base.$path) === false)
65       return 'Kann Verzeichnis nicht anlegen: ' . $path;
66
67   $path .= '/' . date('m');
68   if (!is_dir($base.$path))
69     if (mkdir($base.$path) === false)
70       return 'Kann Verzeichnis nicht anlegen: ' . $path;
71
72
73   $parts['filename'] = utf8_encode($parts['filename']);
74   $path .= '/' . $parts['filename'];
75
76   $max = 100;
77   for ($i=0; $i < $max; $i++) {
78     $fname = $path;
79     if ($i > 0) $fname .= '('.$i.')';
80     if (!empty($parts['extension']))
81       $fname .= '.' . $parts['extension'];
82
83     if (!is_file($base.$fname)) {
84       if (copy($filename, $base.$fname) === false)
85         return 'Kann Datei nicht speichern';
86
87       chmod($base.$fname, 0640);
88       break;
89     }
90   }
91
92   $sql = sprintf("INSERT INTO metro_files (ordersatz,date,title,path,sys_user,sys_edit) " .
93                  "VALUES (%d,now(),%s,%s,%s,now())",
94                  $id,
95                  $db->quote($title),
96                  $db->quote($fname),
97                  $db->quote($_SESSION['sys']['login']));
98   $sth = $db->query($sql);
99
100   return true;
101 }
102
103 function ordersatz_finish($id)
104 {
105   global $db;
106
107   $sql = sprintf("DELETE FROM metro_ordersatz_pos WHERE ordersatz = %d AND anzahl IS NULL",
108                  $id);
109   $sth = $db->query($sql);
110
111   $sql = sprintf("UPDATE metro_ordersatz SET done = now(), sys_edit = now(), sys_user = %s WHERE id = %d",
112                  $db->quote($_SESSION['sys']['login']),
113                  $id);
114   $sth = $db->query($sql);
115 }
116
117 function ordersatz_write($id, $dir, $send)
118 {
119   global $db;
120
121   $fname = sprintf("%smasks/%s/%s",
122                    $_SESSION['sys']['basedir'],
123                    MODULE,
124                    TEMPLATE);
125
126   if (!file_exists($fname))
127     return "Vorlage nicht gefunden";
128
129   copy($fname, $dir . '/ordersatz.tex');
130   chdir($dir);
131
132   $sql = sprintf("SELECT name,koch,email,telefon,datum,uhrzeit,owner FROM metro_ordersatz WHERE id = %d",
133                  $id);
134   $satz = query_db($sql);
135
136   $f = fopen(FNAME_VARS, 'w');
137   fwrite($f, sprintf('\newcommand{\koch}{%s}'."\n", latex_encode($satz[0]['koch'])));
138   fwrite($f, sprintf('\newcommand{\reise}{%s}'."\n", latex_encode($satz[0]['name'])));
139   fwrite($f, sprintf('\newcommand{\telefon}{%s}'."\n", latex_encode($satz[0]['telefon'])));
140   fwrite($f, sprintf('\newcommand{\uhrzeit}{%s}'."\n", latex_encode($satz[0]['uhrzeit'])));
141
142   $d = explode('-', $satz[0]['datum']);
143   fwrite($f, sprintf('\newcommand{\datum}{%d.%d.%d}'."\n", $d[2], $d[1], $d[0]));
144   fclose($f);
145
146   $sql = sprintf("SELECT artnr,gang,metro_vpe.short AS vpname,menge,bezeichnung,hinweis,hersteller,anzahl " .
147                  "FROM metro_ordersatz_pos " .
148                  "JOIN metro_artikel ON artikel = metro_artikel.id " .
149                  "JOIN metro_abteilung ON abteilung = metro_abteilung.id " .
150                  "JOIN metro_vpe ON vpe = metro_vpe.id " .
151                  "WHERE ordersatz = %d AND anzahl IS NOT NULL " .
152                  "ORDER BY gang,metro_abteilung.name,bezeichnung",
153                  $id);
154
155   $result = query_db($sql);
156
157   if (count($result) == 0)
158     return "Keine Artikel zur Bestellung ausgewählt";
159
160   $f = fopen(FNAME_ITEMS, 'w');
161
162   foreach ($result as $row) {
163     $bez = latex_encode($row['bezeichnung']);
164     if (strlen($row['hersteller']))
165       $bez .= ' (' . latex_encode($row['hersteller']) . ')';
166     if (strlen($row['hinweis']))
167       $bez .= sprintf("\\newline\\textbf{%s}", latex_encode($row['hinweis']));
168
169     fwrite($f, sprintf('\order{%d}{%s}{%s %s}{%s}{%s}'."\n",
170                        $row['anzahl'],
171                        $row['artnr'] ? (int)$row['artnr'] : '',
172                        latex_encode($row['menge']),
173                        $bez,
174                        latex_encode($row['vpname']),
175                        latex_encode($row['gang'])));
176   }
177
178   fclose($f);
179
180   system("latex ordersatz > ordersatz.out 2>&1 && dvips ordersatz >> ordersatz.out 2>&1 && pdflatex ordersatz >> ordersatz.out", $ret);
181
182   if ($ret !== 0) {
183     $fname = sprintf("ordersatz-%d-%d.tar.bz2", $id, time());
184     $cmd = sprintf("tar cfj %s ordersatz.tex ordersatz_vars.tex ordersatz_items.tex ordersatz.out && " .
185                    "mpack -s 'Probleme beim Compilieren des Ordersatzes %d' -d ordersatz.out %s %s && " .
186                    "sendfile -Q -c='Probleme beim Compilieren des Ordersatzes %d' %s %s",
187                    $fname,
188                    $id, $fname, ERROR_MAIL,
189                    $id, $fname, ERROR_SAFT);
190     system($cmd);
191     return "Probleme beim Compilieren des Ordersatzes";
192   }
193
194   if (!file_exists('ordersatz.ps'))
195     return "Postscript-Datei nicht erstellt";
196
197   if ($send) {
198     $ret = ordersatz_archive($id, 'Ordersatz '.$satz[0]['name'], $dir . '/ordersatz.pdf');
199
200     if ($ret !== true)
201       return $ret;
202
203     if (empty($satz[0]['email']))
204       $satz[0]['email'] = 'joey@infodrom.org';
205
206     $cmd = sprintf("faxspool -f %s %s %s > /dev/null 2>&1",
207                    $satz[0]['email'],
208                    FAXNUMBER,
209                    'ordersatz.ps');
210     system($cmd);
211
212     $message = sprintf("Hallo %s!\n\nDer angehängte Ordersatz wurde gerade an Metro Oldenburg verschickt.\n" .
213                        "Eine Bestätigung über den Versand kommt per Mail.\n\n",
214                        $satz[0]['koch']);
215
216     mail_attach($satz[0]['email'],
217                 mb_encode_mimeheader(utf8_decode('Ordersatz ' . $satz[0]['name']),'latin1'),
218                 $satz[0]['email'],
219                 mb_encode_mimeheader(utf8_decode('Infodrom ' . $satz[0]['koch']),'latin1'),
220                 array($dir . '/ordersatz.pdf'),
221                 $message);
222
223     ordersatz_finish($id);
224   }
225
226   return true;
227 }
228
229 ?>