Improve printed ordersatz
[misc/hallinta-metro] / ordersatz_pos.php
index b060b8b..70a4c1f 100644 (file)
 include_once($_SESSION['sys']['basedir'].'masks/metro/utils.php');
 include_once($_SESSION['sys']['basedir'].'lib/mail.php');
 
+$done = true;
 if (substr($_SERVER["SCRIPT_FILENAME"],-10) == '/index.php' &&
-    !empty($_GET['id']))
+    !empty($_GET['id'])) {
   $_SESSION['ordersatz'] = $_GET['id'];
+  $done = is_done($_GET['id']);
+}
+
+if (!$done) {
+  Actions::instance()->addLink(new Link(array('id' => 'btn_import',
+                                               'icon' => 'masks/metro/import.png',
+                                               'title' => 'Neue Artikel importieren',
+                                               'function' => 'import_articles')));
+}
+
+Actions::instance()->addLink(new Link(array('id' => 'btn_pdf',
+                                           'icon' => 'masks/metro/pdf_document.png',
+                                           'title' => 'PDF Vorschau',
+                                           'function' => 'build_pdf')));
 
-$jscode[] = <<<EOC
-grid_column_edit[1] = {
-    default_menu: false,
+if (!$done) {
+  Actions::instance()->addLink(new Link(array('id' => 'btn_finish',
+                                               'icon' => 'masks/metro/hp_folder_finished.png',
+                                               'title' => 'Ordersatz Abschließen und Versenden',
+                                               'function' => 'confirm_finish')));
+}
+
+$jscode = '';
+if (!$done) {
+  $jscode .= <<<EOC
+Hallinta.registerGridMenu('main', 1, {
+    defaultMenu: false,
     width: '9em',
     values: [
             ['löschen', '', 0],
@@ -33,36 +57,65 @@ grid_column_edit[1] = {
             ['8 mal bestellen', '8', 8],
             ['10 mal bestellen', '10', 10],
             ['12 mal bestellen', '12', 12],
-            ['14 mal bestellen', '14', 14]
+            ['Wert eingeben', 'Bitte geben Sie die gewünschte Menge ein', 'prompt']
             ]
-};
+      });
+EOC;
+}
+
+$jscode .= <<<EOC
 
 function build_pdf_callback(data)
 {
     info('PDF erstellt');
-    window.open('ajax/ajax.php?tmpdir='+data.tmpdir+'&source=metro__ordersatz_pos&func=file&name=download','_blank');
+    window.open('ajax/ajax.php?tmpdir='+data.tmpdir+'&source='+Hallinta.pageSource+'&func=file&name=download','_blank');
 }
 
 function build_pdf()
 {
-  var source = document.getElementById('source');
-  if (!source) return false;
+  ajax_request('function', 'callback=pdf', build_pdf_callback);
+  return false;
+}
+
+function finish_callback(data)
+{
+  if (data.status == true) {
+    info('Ordersatz verschickt');
 
-  var parms = 'source=' + source.innerHTML + '&callback=pdf&';
-  ajax_request('function', parms, build_pdf_callback);
+    confirm("Der Ordersatz wurde verschickt.");
+    window.location.href = './?mask=metro__ordersatz';
+  }
+}
+
+function confirm_finish()
+{
+  if (confirm("Bei Abschluß wird ein Fax zu Metro und eine Kopie per Mail an den Koch geschickt."))
+    ajax_request('function', 'callback=send', finish_callback);
+  return false;
+}
+
+function import_articles_callback(data)
+{
+  if (data.status == true) {
+    info('Ordersatz aktualisiert');
+
+    if (data.count > 0)
+      grid_update(Hallinta.grid);
+
+    confirm(data.count + ' Artikel zum Ordersatz hinzugefügt.');
+  }
+}
+
+function import_articles()
+{
+  ajax_request('function', 'callback=import', import_articles_callback);
   return false;
 }
-EOC;
 
-$buttons = <<<EOC
-<p style="margin-top: 0px; margin-bottom: 4px; text-align: center;">
-<button onclick="return build_pdf()">PDF erstellen</button>
-&nbsp;
-<button onclick="return finish()">Abschließen</button>
-<br>Bei Abschluß wird ein Fax zu Metro und eine Kopie per Mail an den Koch geschickt.
-</p>
 EOC;
 
+JavaScript::instance()->add($jscode);
+
 function get_title($id)
 {
   global $db;
@@ -79,9 +132,10 @@ function get_title($id)
 $mask = array(
              'table' => 'metro_ordersatz',
              'join' => array('metro_ordersatz_pos ON ordersatz = metro_ordersatz.id',
-                             'metro_artikel ON artikel = metro_artikel.id'),
+                             'metro_artikel ON artikel = metro_artikel.id AND removed = 0'),
              'title' => get_title($_SESSION['ordersatz']),
-             'where' => sprintf('ordersatz = %d AND owner = %d AND done IS NULL', $_SESSION['ordersatz'], $_SESSION['sys']['uid']),
+             'edit_title' => 'Ordersatz',
+             'where' => sprintf('ordersatz = %d AND owner = %d', $_SESSION['ordersatz'], $_SESSION['sys']['uid']),
              'list' => array(
                              'id' => array(
                                            'name' => 'ID',
@@ -91,65 +145,101 @@ $mask = array(
                              'anzahl' => array(
                                            'name' => 'Anzahl',
                                            'width' => 60,
-                                           'specs' => "ClassName: 'alignrightpad', filterUI: 't'",
+                                           'specs' => array('ClassName' => 'alignrightpad'),
                                            ),
                              'artnr' => array(
-                                           'name' => 'Artnr',
+                                           'name' => 'ArtNr',
+                                           'sqltype' => 'int',
                                            'width' => 60,
-                                           'specs' => "filterUI: 't'",
+                                           'type' => 'number',
+                                           'filter' => 't=3',
+                                           'specs' => array('decPlaces' => 0, 'thouSep' => ''),
+                                           'visible' => false,
                                            ),
                              'menge' => array(
                                            'name' => 'Menge',
                                            'width' => 60,
-                                           'specs' => "ClassName: 'alignrightpad', filterUI: 't'",
+                                           'filter' => 't2',
+                                           'specs' => array('ClassName' => 'alignrightpad'),
                                            ),
                              'bezeichnung' => array(
                                            'name' => 'Bezeichnung',
-                                           'width' => 260,
-                                           'specs' => "filterUI: 't'",
+                                           'width' => 300,
+                                           'filter' => 't',
+                                           ),
+                             'preis' => array(
+                                           'name' => 'Preis',
+                                           'width' => 60,
+                                           'type' => 'number',
+                                           'specs' => array('decPlaces' => 2, 'ClassName' => 'alignrightpad'),
+                                           'sql' => '(SELECT preis * ((100 + steuersatz)/100) FROM metro_artikel_preis ' .
+                                                    'WHERE artikel = metro_artikel.id ORDER BY datum DESC LIMIT 1)',
+                                           ),
+                             'datum' => array(
+                                           'name' => 'Datum',
+                                           'width' => 85,
+                                           'type' => 'text',
+                                           'sql' => '(SELECT datum FROM metro_artikel_preis ' .
+                                                    'WHERE artikel = metro_artikel.id ORDER BY datum DESC LIMIT 1)',
+                                           'visible' => false,
                                            ),
                              'hersteller' => array(
                                            'name' => 'Hersteller',
                                            'width' => 80,
-                                           'specs' => "filterUI: 't'",
+                                           'filter' => 't4',
                                            ),
                              'vpe' => array(
                                            'name' => 'Einheit',
+                                           'sqltype' => 'int',
                                            'width' => 70,
-                                           'specs' => "ClassName: 'aligncenter', filterUI: 's'",
+                                           'filter' => 's',
+                                           'specs' => array('ClassName' => 'aligncenter'),
                                            'control' => "new Rico.TableColumn.lookup(".grid_lookup_sql('metro_vpe','id','name').", 0, '')",
+                                           'distinct' => "SELECT DISTINCT vpe,metro_vpe.name FROM metro_artikel JOIN metro_vpe ON vpe = metro_vpe.id ORDER BY name",
                                            ),
                              'abteilung' => array(
                                            'name' => 'Abteilung',
+                                           'sqltype' => 'int',
                                            'width' => 80,
-                                           'specs' => "ClassName: 'aligncenter', filterUI: 's'",
+                                           'filter' => 's',
+                                           'specs' => array('ClassName' => 'aligncenter'),
                                            'control' => "new Rico.TableColumn.lookup(".grid_lookup_sql('metro_abteilung','id','name').", 0, '')",
+                                           'distinct' => "SELECT DISTINCT abteilung,metro_abteilung.name FROM metro_artikel JOIN metro_abteilung ON abteilung = metro_abteilung.id ORDER BY name",
                                            ),
                              'gang' => array(
                                            'name' => 'Gang',
+                                           'sqltype' => 'int',
                                            'width' => 50,
                                            'sql' => 'abteilung',
-                                           'specs' => "ClassName: 'aligncenter', filterUI: 's'",
+                                           'filter' => 's',
+                                           'specs' => array('ClassName' => 'aligncenter'),
                                            'control' => "new Rico.TableColumn.lookup(".grid_lookup_sql('metro_abteilung','id','gang').", 0, '')",
-                                           ),
-                             ),
-             'edit' => array(
-                             'buttons' => array(
-                                           'type' => 'html',
-                                           'code' => $buttons,
-                                           'sql' => false,
+                                           'distinct' => "SELECT DISTINCT abteilung,metro_abteilung.gang FROM metro_artikel JOIN metro_abteilung ON abteilung = metro_abteilung.id ORDER BY gang",
+                                           'visible' => false,
                                            ),
                              ),
              'callbacks' => array(
                                   'cellsave' => cb_cellsave,
                                   'pdf' => cb_pdf,
                                   'send' => cb_send,
+                                  'import' => cb_import,
                                ),
              'files' => array(
                               'download' => process_download,
                               ),
+             'buttons' => array(
+                                'save' => false,
+                                'insert' => false,
+                                'delete' => false,
+                                'changes' => false,
+                                ),
              );
 
+if ($done) {
+  unset($mask['edit']);
+  $mask['join'] = str_replace(' AND removed = 0','',$mask['join']);
+}
+
 function cb_cellsave()
 {
   global $db;
@@ -164,7 +254,6 @@ function cb_cellsave()
                   $_SESSION['ordersatz'], $_POST['id']);
 
   $sth = $db->query($sql);
-  error_log($sql);
 }
 
 
@@ -173,8 +262,11 @@ function cb_pdf()
   $tmpdir = mk_tempdir();
   $result = ordersatz_write($_SESSION['ordersatz'], $tmpdir, false);
 
-  if ($result !== true)
+  if ($result !== true) {
+    error_log($tmpdir);
+    error_log($result);
     return array('error' => $result);
+  }
 
   return array('tmpdir' => substr($tmpdir,strlen($_SESSION['sys']['basedir'])));
 }
@@ -201,9 +293,37 @@ function cb_send()
   if ($result !== true)
     return array('error' => $result);
 
-  $fname = $tmpdir . '/ordersatz.pdf';
-
   rm_tempdir($tmpdir);
+
+  return array('status' => true);
+}
+
+function cb_import()
+{
+  global $db;
+
+  $sql = sprintf("SELECT count(*) AS count FROM metro_ordersatz_pos WHERE ordersatz = %d",
+                $_SESSION['ordersatz']);
+  $sth = $db->query($sql);
+  $row = $sth->fetch();
+  $old = $row['count'];
+
+  $sql = sprintf("INSERT INTO metro_ordersatz_pos (ordersatz,artikel,sys_user,sys_edit) " .
+                "SELECT %d,metro_artikel.id,%s,now() FROM metro_artikel " .
+                "LEFT JOIN metro_ordersatz_pos ON artikel = metro_artikel.id AND ordersatz = %d " .
+                "WHERE metro_ordersatz_pos.id IS NULL",
+                $_SESSION['ordersatz'],
+                $db->quote($_SESSION['sys']['login']),
+                $_SESSION['ordersatz']);
+  $db->query($sql);
+
+  $sql = sprintf("SELECT count(*) AS count FROM metro_ordersatz_pos WHERE ordersatz = %d",
+                $_SESSION['ordersatz']);
+  $sth = $db->query($sql);
+  $row = $sth->fetch();
+  $new = $row['count'];
+
+  return array('status' => true, 'count' => $new - $old);
 }
 
 ?>