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