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