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