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