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