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