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