4820c6c221181968532db58485017bbb8659d06b
[misc/hallinta-metro] / ordersatz_pos.php
1 <?php
2   /*
3    Küchenbetreuer:
4    E-Mail-Adresse für Kopie
5    Telefonnr für Rückfragen:
6    Abholung am:
7    Abholung um Uhrzeit:
8
9    - Ordersatz auswählen || neuen Ordersatz erstellen || Ordersatz kopieren
10    - Ordersatz abschließen = PDF-Datei erzeugen, archivieren, per Mail, per Fax
11    */
12
13 include_once($_SESSION['sys']['basedir'].'masks/metro/utils.php');
14 include_once($_SESSION['sys']['basedir'].'lib/mail.php');
15
16 if (substr($_SERVER["SCRIPT_FILENAME"],-10) == '/index.php' &&
17     !empty($_GET['id'])) {
18   $_SESSION['ordersatz'] = $_GET['id'];
19   $done = is_done($_GET['id']);
20 }
21
22 if (!$done) {
23   $jscode = <<<EOC
24 grid_column_edit[1] = {
25     default_menu: false,
26     width: '9em',
27     values: [
28              ['löschen', '', 0],
29              ['1 mal bestellen', '1', 1],
30              ['2 mal bestellen', '2', 2],
31              ['3 mal bestellen', '3', 3],
32              ['4 mal bestellen', '4', 4],
33              ['5 mal bestellen', '5', 5],
34              ['6 mal bestellen', '6', 6],
35              ['7 mal bestellen', '7', 7],
36              ['8 mal bestellen', '8', 8],
37              ['10 mal bestellen', '10', 10],
38              ['12 mal bestellen', '12', 12],
39              ['Wert eingeben', 'Bitte geben Sie die gewünschte Menge ein', 'prompt']
40              ]
41 };
42
43 function build_pdf_callback(data)
44 {
45     info('PDF erstellt');
46     window.open('ajax/ajax.php?tmpdir='+data.tmpdir+'&source=metro__ordersatz_pos&func=file&name=download','_blank');
47 }
48
49 function build_pdf()
50 {
51   var source = document.getElementById('source');
52   if (!source) return false;
53
54   var parms = 'source=' + source.innerHTML + '&callback=pdf';
55   ajax_request('function', parms, build_pdf_callback);
56   return false;
57 }
58
59 function finish_callback(data)
60 {
61   if (data.status == true) {
62     info('Ordersatz verschickt');
63
64     confirm("Der Ordersatz wurde verschickt.");
65     window.location.href = './?mask=metro__ordersatz';
66   }
67 }
68
69 function finish()
70 {
71   var source = document.getElementById('source');
72   if (!source) return false;
73
74   var parms = 'source=' + source.innerHTML + '&callback=send';
75   ajax_request('function', parms, finish_callback);
76   return false;
77 }
78
79 function import_articles_callback(data)
80 {
81   if (data.status == true) {
82     info('Ordersatz aktualisiert');
83
84     if (data.count > 0)
85       grid_update(grid);
86
87     confirm(data.count + ' Artikel zum Ordersatz hinzugefügt.');
88   }
89 }
90
91 function import_articles()
92 {
93   var source = document.getElementById('source');
94   if (!source) return false;
95
96   var parms = 'source=' + source.innerHTML + '&callback=import';
97   ajax_request('function', parms, import_articles_callback);
98   return false;
99 }
100
101 EOC;
102   $javascript->add($jscode);
103 }
104
105 $buttons = <<<EOC
106 <p style="margin-top: 0px; margin-bottom: 4px; text-align: center;">
107 <button class="custom" onclick="return import_articles()">Artikel importieren</button>
108 &nbsp;
109 <button class="custom" onclick="return build_pdf()">PDF erstellen</button>
110 &nbsp;
111 <button class="custom" onclick="return finish()">Abschließen</button>
112 <br>Bei Abschluß wird ein Fax zu Metro und eine Kopie per Mail an den Koch geschickt.
113 </p>
114 EOC;
115
116 function get_title($id)
117 {
118   global $db;
119
120   $query = sprintf('SELECT name FROM metro_ordersatz WHERE id = %d', $id);
121   $sth = $db->query($query);
122   $row = $sth->fetch();
123   if ($row) return 'Ordersatz für ' . $row['name'];
124   else return 'Unbekannter Ordersatz';
125 }
126
127 # INSERT INTO metro_ordersatz_pos (ordersatz,artikel,sys_user,sys_edit) SELECT ORDERID,id,'joey',now() FROM metro_artikel;
128 # DELETE FROM metro_ordersatz_pos WHERE ordersatz = ORDERID AND anzahl IS NULL
129 $mask = array(
130               'table' => 'metro_ordersatz',
131               'join' => array('metro_ordersatz_pos ON ordersatz = metro_ordersatz.id',
132                               'metro_artikel ON artikel = metro_artikel.id AND removed = 0'),
133               'title' => get_title($_SESSION['ordersatz']),
134               'edit_title' => 'Ordersatz',
135               'where' => sprintf('ordersatz = %d AND owner = %d', $_SESSION['ordersatz'], $_SESSION['sys']['uid']),
136               'list' => array(
137                               'id' => array(
138                                             'name' => 'ID',
139                                             'sql' => 'metro_artikel.id',
140                                             'visible' => false,
141                                             ),
142                               'anzahl' => array(
143                                             'name' => 'Anzahl',
144                                             'width' => 60,
145                                             'specs' => "ClassName: 'alignrightpad'",
146                                             ),
147                               'artnr' => array(
148                                             'name' => 'Artnr',
149                                             'width' => 60,
150                                             'visible' => false,
151                                             ),
152                               'menge' => array(
153                                             'name' => 'Menge',
154                                             'width' => 60,
155                                             'specs' => "ClassName: 'alignrightpad', filterUI: 't2'",
156                                             ),
157                               'bezeichnung' => array(
158                                             'name' => 'Bezeichnung',
159                                             'width' => 300,
160                                             'specs' => "filterUI: 't'",
161                                             ),
162                               'preis' => array(
163                                             'name' => 'Preis',
164                                             'width' => 60,
165                                             'type' => 'number',
166                                             'specs' => "decPlaces: 2, ClassName: 'alignrightpad'",
167                                             'sql' => '(SELECT preis * ((100 + steuersatz)/100) FROM metro_artikel_preis ' .
168                                                      'WHERE artikel = metro_artikel.id ORDER BY datum DESC LIMIT 1)',
169                                             ),
170                               'datum' => array(
171                                             'name' => 'Datum',
172                                             'width' => 85,
173                                             'type' => 'text',
174                                             'sql' => '(SELECT datum FROM metro_artikel_preis ' .
175                                                      'WHERE artikel = metro_artikel.id ORDER BY datum DESC LIMIT 1)',
176                                             'visible' => false,
177                                             ),
178                               'hersteller' => array(
179                                             'name' => 'Hersteller',
180                                             'width' => 80,
181                                             'specs' => "filterUI: 't4'",
182                                             ),
183                               'vpe' => array(
184                                             'name' => 'Einheit',
185                                             'width' => 70,
186                                             'specs' => "ClassName: 'aligncenter', filterUI: 's'",
187                                             'control' => "new Rico.TableColumn.lookup(".grid_lookup_sql('metro_vpe','id','name').", 0, '')",
188                                             'distinct' => "SELECT DISTINCT vpe,metro_vpe.name FROM metro_artikel JOIN metro_vpe ON vpe = metro_vpe.id ORDER BY name",
189                                             ),
190                               'abteilung' => array(
191                                             'name' => 'Abteilung',
192                                             'width' => 80,
193                                             'specs' => "ClassName: 'aligncenter', filterUI: 's'",
194                                             'control' => "new Rico.TableColumn.lookup(".grid_lookup_sql('metro_abteilung','id','name').", 0, '')",
195                                             'distinct' => "SELECT DISTINCT abteilung,metro_abteilung.name FROM metro_artikel JOIN metro_abteilung ON abteilung = metro_abteilung.id ORDER BY name",
196                                             'visible' => false,
197                                             ),
198                               'gang' => array(
199                                             'name' => 'Gang',
200                                             'width' => 50,
201                                             'sql' => 'abteilung',
202                                             'specs' => "ClassName: 'aligncenter', filterUI: 's'",
203                                             'control' => "new Rico.TableColumn.lookup(".grid_lookup_sql('metro_abteilung','id','gang').", 0, '')",
204                                             'distinct' => "SELECT DISTINCT abteilung,metro_abteilung.gang FROM metro_artikel JOIN metro_abteilung ON abteilung = metro_abteilung.id ORDER BY gang",
205                                             'visible' => false,
206                                             ),
207                               ),
208               'edit' => array(
209                               'buttons' => array(
210                                             'type' => 'html',
211                                             'code' => $buttons,
212                                             'sql' => false,
213                                             ),
214                               ),
215               'callbacks' => array(
216                                    'cellsave' => cb_cellsave,
217                                    'pdf' => cb_pdf,
218                                    'send' => cb_send,
219                                    'import' => cb_import,
220                                 ),
221               'files' => array(
222                                'download' => process_download,
223                                ),
224               'buttons' => array(
225                                  'save' => false,
226                                  'insert' => false,
227                                  'delete' => false,
228                                  'changes' => false,
229                                  ),
230               );
231
232 if ($done) {
233   unset($mask['edit']);
234   $mask['join'] = str_replace(' AND removed = 0','',$mask['join']);
235 }
236
237 function cb_cellsave()
238 {
239   global $db;
240
241   if ($_POST['value'] == 0)
242     $sql = sprintf("UPDATE metro_ordersatz_pos SET anzahl = NULL, sys_user = %s, sys_edit = now() WHERE ordersatz = %d AND artikel = %d",
243                    $db->quote($_SESSION['sys']['login']),
244                    $_SESSION['ordersatz'], $_POST['id']);
245   else
246     $sql = sprintf("UPDATE metro_ordersatz_pos SET anzahl = %d, sys_user = %s, sys_edit = now() WHERE ordersatz = %d AND artikel = %d",
247                    $_POST['value'], $db->quote($_SESSION['sys']['login']),
248                    $_SESSION['ordersatz'], $_POST['id']);
249
250   $sth = $db->query($sql);
251 }
252
253
254 function cb_pdf()
255 {
256   $tmpdir = mk_tempdir();
257   $result = ordersatz_write($_SESSION['ordersatz'], $tmpdir, false);
258
259   if ($result !== true) {
260     error_log($tmpdir);
261     error_log($result);
262     return array('error' => $result);
263   }
264
265   return array('tmpdir' => substr($tmpdir,strlen($_SESSION['sys']['basedir'])));
266 }
267
268 function process_download()
269 {
270   if (strpos($_GET['tmpdir'], '..') !== false)
271     return false;
272
273   $fname = $_SESSION['sys']['basedir'] . $_GET['tmpdir'] . '/ordersatz.pdf';
274
275   if (!file_exists($fname) || !is_file($fname))
276     return 'File not found';
277
278   send_file($fname);
279   rm_tempdir($_SESSION['sys']['basedir'] . $_GET['tmpdir']);
280 }
281
282 function cb_send()
283 {
284   $tmpdir = mk_tempdir();
285   $result = ordersatz_write($_SESSION['ordersatz'], $tmpdir, true);
286
287   if ($result !== true)
288     return array('error' => $result);
289
290   rm_tempdir($tmpdir);
291
292   return array('status' => true);
293 }
294
295 function cb_import()
296 {
297   global $db;
298
299   $sql = sprintf("SELECT count(*) AS count FROM metro_ordersatz_pos WHERE ordersatz = %d",
300                  $_SESSION['ordersatz']);
301   $sth = $db->query($sql);
302   $row = $sth->fetch();
303   $old = $row['count'];
304
305   $sql = sprintf("INSERT INTO metro_ordersatz_pos (ordersatz,artikel,sys_user,sys_edit) " .
306                  "SELECT %d,metro_artikel.id,%s,now() FROM metro_artikel " .
307                  "LEFT JOIN metro_ordersatz_pos ON artikel = metro_artikel.id AND ordersatz = %d " .
308                  "WHERE metro_ordersatz_pos.id IS NULL",
309                  $_SESSION['ordersatz'],
310                  $db->quote($_SESSION['sys']['login']),
311                  $_SESSION['ordersatz']);
312   $db->query($sql);
313
314   $sql = sprintf("SELECT count(*) AS count FROM metro_ordersatz_pos WHERE ordersatz = %d",
315                  $_SESSION['ordersatz']);
316   $sth = $db->query($sql);
317   $row = $sth->fetch();
318   $new = $row['count'];
319
320   return array('status' => true, 'count' => $new - $old);
321 }
322
323 ?>