Support pre-checking of duplicate item numbers before saving
[misc/hallinta-metro] / artikel.php
index 76398ad..577eae3 100644 (file)
@@ -1,5 +1,181 @@
 <?php
 
+$style[] = <<<EOC
+div#form_price {
+  padding-left: 10px;
+  padding-right: 10px;
+  font-size: 90%;
+  color: #555;
+}
+EOC;
+
+$form = '
+<div id="form_price">
+<form>
+<input id="form_artikel" name="artikel" type="hidden" />
+<label for="form_datum">Rechnungsdatum</label><br>
+<input id="form_datum" name="datum" size="8">&nbsp;<img class="calendar" src="images/icons/calendar.gif" onclick="calendar(\\\'form_datum\\\',event)" />
+<br>
+<label for="form_steuer">Steuersatz</label><br>
+<input id="form_steuer" name="steuer" size="10">
+<br>
+<label for="form_preis">Preis</label><br>
+<input id="form_preis" name="preis" size="10">
+<div class="buttons" style="margin-top: 15px;">
+<button class="custom" onclick="return add_price(this);">Hinzufügen</button>
+</div>
+</form>
+</div>
+';
+
+$javascript = <<<EOC
+var custom_this = false;
+function custom_save_callback(data)
+{
+    if (data.count > 0) {
+       var text = "Diese Artikelnummer ist bereits " + data.count + " mal vorhanden.\\nSoll der Artikel trotzdem gespeichert werden?";
+       if (confirm(text))
+           form_save(custom_this);
+    } else {
+       form_save(custom_this);
+    }
+}
+
+function custom_save(obj)
+{
+    custom_this = obj;
+    var id = document.getElementById('edit_id');
+
+    if (!id.value.length)
+       return custom_insert(obj);
+
+    var artnr = document.getElementById('edit_artnr');
+
+    var parms = 'source=' + source.innerHTML + '&callback=artnr';
+    parms += '&artnr=' + artnr.value;
+    parms += '&artikel=' + id.value;
+    ajax_request('function', parms, custom_save_callback);
+
+    return false;
+}
+
+function custom_insert_callback(data)
+{
+    if (data.count > 0) {
+       var text = "Diese Artikelnummer ist bereits " + data.count + " mal vorhanden.\\nSoll der Artikel trotzdem hinzugefügt werden?";
+       if (confirm(text))
+           form_insert(custom_this);
+    } else {
+       form_insert(custom_this);
+    }
+}
+
+function custom_insert(obj)
+{
+    custom_this = obj;
+    var artnr = document.getElementById('edit_artnr');
+
+    var parms = 'source=' + source.innerHTML + '&callback=artnr';
+    parms += '&artnr=' + artnr.value;
+    ajax_request('function', parms, custom_insert_callback);
+
+    return false;
+}
+
+var price_popup = false;
+function price_popup_open()
+{
+    if (!price_popup) {
+       var options = { hideOnClick: false, canDragFunc: true };
+       var content = 'CONTENT_FORM';
+
+       price_popup = new Rico.Popup(options, false, false);
+       price_popup.createWindow('<strong>Verbinden</strong>',content,'auto','130px');
+
+       price_popup.openPopup(100,300);
+    } else
+       price_popup.openPopup();
+
+    price_popup.titleDiv.childNodes[0].innerHTML = 'Preis hinzufügen';
+
+    var form_id = document.getElementById('edit_id');
+    var artikel = document.getElementById('form_artikel');
+    artikel.value = form_id.value;
+
+    var datum = document.getElementById('form_datum');
+    var preis = document.getElementById('form_preis');
+    if (datum.value.length)
+      preis.activate();
+    else
+      datum.activate();
+}
+
+function open_popup()
+{
+    var eid = document.getElementById('edit_id');
+    if (!eid || !eid.value.length) return false;
+
+    price_popup_open();
+    return false;
+}
+
+function add_price_callback(data)
+{
+    info('Preis gespeichert');
+    grid_update(grid);
+}
+
+function add_price(obj)
+{
+    price_popup.closePopup();
+
+    var datum = document.getElementById('form_datum');
+    if (!datum.value.length) {
+       error('Kein Rechnungsdatum angegeben');
+       return false;
+    }
+
+    var steuer = document.getElementById('form_steuer');
+    if (!steuer.value.length) {
+       error('Kein Steuersatz angegeben');
+       return false;
+    }
+
+    var preis = document.getElementById('form_preis');
+    if (!preis.value.length) {
+       error('Kein Preis angegeben');
+       return false;
+    }
+
+    var source = document.getElementById('source');
+    if (!source) return false;
+
+    var parms = 'source=' + source.innerHTML + '&callback=price&';
+    ajax_request('function', parms+Form.serialize(obj.form), add_price_callback);
+
+    preis.value = '';
+
+    return false;
+}
+
+Rico.onLoad(function(){
+    var btn = document.getElementById('button_save');
+    btn.onclick = function () {return custom_save(this);};
+    var btn = document.getElementById('button_insert');
+    btn.onclick = function () {return custom_insert(this);};
+});
+EOC;
+
+$jscode[] = str_replace('CONTENT_FORM', str_replace(array("\n"),
+                                                   array("\\\n"), $form), $javascript);
+
+
+$buttons = <<<EOC
+<p style="margin-top: 5px; margin-bottom: 4px; text-align: center;">
+<button class="custom" onclick="return open_popup()">Preis hinzufügen</button>
+</p>
+EOC;
+
 $mask = array(
              'table' => 'metro_artikel',
              'title' => 'Artikelstammdaten',
@@ -13,25 +189,43 @@ $mask = array(
                              'artnr' => array(
                                            'name' => 'ArtNr',
                                            'width' => 60,
+                                           'type' => 'number',
+                                           'specs' => "decPlaces: 0, thouSep: '', filterUI: 't='",
                                            ),
                              'menge' => array(
                                            'name' => 'Menge',
                                            'width' => 60,
-                                           'specs' => "ClassName: 'alignrightpad'",
+                                           'specs' => "ClassName: 'alignrightpad', filterUI: 't3'",
                                            ),
                              'bezeichnung' => array(
                                            'name' => 'Bezeichnung',
                                            'width' => 300,
                                            'specs' => "filterUI: 't'",
                                            ),
+                             'netto' => array(
+                                           'name' => 'netto',
+                                           'width' => 60,
+                                           'type' => 'number',
+                                           'specs' => "decPlaces: 2, ClassName: 'alignrightpad'",
+                                           'sql' => '(SELECT preis FROM metro_artikel_preis ' .
+                                                    'WHERE artikel = metro_artikel.id ORDER BY datum DESC LIMIT 1)',
+                                           ),
                              'preis' => array(
                                            'name' => 'Preis',
                                            'width' => 60,
                                            'type' => 'number',
-                                           'specs' => "decPlaces: 2, ClassName: 'alignrightpad', filterUI: 't'",
+                                           'specs' => "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' => 100,
@@ -42,6 +236,7 @@ $mask = array(
                                            'width' => 200,
                                            'specs' => "filterUI: 's'",
                                            '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",
                                            'visible' => false,
                                            ),
                              'gang' => array(
@@ -55,6 +250,7 @@ $mask = array(
                                            'width' => 70,
                                            'specs' => "ClassName: 'aligncenter', filterUI: 's'",
                                            '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",
                                            ),
                              ),
              'edit' => array(
@@ -90,13 +286,108 @@ $mask = array(
                                            'size' => 21,
                                            'required' => true,
                                            ),
+                             'hinweis' => array(
+                                           'name' => 'Hinweis',
+                                           'type' => 'text',
+                                           'size' => 21,
+                                           'null' => true,
+                                           ),
                              'hersteller' => array(
                                            'name' => 'Hersteller',
                                            'type' => 'text',
                                            'size' => 21,
                                            'null' => true,
                                            ),
+                             'buttons' => array(
+                                           'type' => 'html',
+                                           'code' => $buttons,
+                                           'sql' => false,
+                                           ),
                              ),
+             'second' => array(
+                               'title' => 'Preisverlauf',
+                               'rows' => 5,
+                               'table' => 'metro_artikel_preis',
+                               'where' => 'artikel = {id} ORDER BY datum DESC',
+                               'list' => array(
+                                               'id' => array(
+                                                             'name' => 'ID',
+                                                             'visible' => false,
+                                                             ),
+                                               'datum' => array(
+                                                             'name' => 'Datum',
+                                                             'width' => 180,
+                                                             ),
+                                               'steuersatz' => array(
+                                                             'name' => 'Steuer',
+                                                             'width' => 60,
+                                                             'type' => 'number',
+                                                             'specs' => "decPlaces: 2, ClassName: 'alignrightpad'",
+                                                             ),
+                                               'preis' => array(
+                                                             'name' => 'netto',
+                                                             'width' => 60,
+                                                             'type' => 'number',
+                                                             'specs' => "decPlaces: 2, ClassName: 'alignrightpad'",
+                                                             ),
+                                               'brutto' => array(
+                                                             'name' => 'Preis',
+                                                             'width' => 60,
+                                                             'type' => 'number',
+                                                             'specs' => "decPlaces: 2, ClassName: 'alignrightpad'",
+                                                             'sql' => 'preis * ((100 + steuersatz)/100)',
+                                                             ),
+                                               'empty' => array(
+                                                             'name' => '',
+                                                             'width' => 10,
+                                                             'sql' => "''",
+                                                             ),
+                                               ),
+                               ),
+             'callbacks' => array(
+                                  'price' => cb_price,
+                                  'artnr' => cb_artnr,
+                               ),
              );
 
+function cb_price()
+{
+  global $db;
+
+  if (empty($_POST['artikel']) || empty($_POST['datum']) || empty($_POST['preis']))
+    return array('error' => 'Nicht ausreichend Daten übermittelt');
+
+  $date = format_date($_POST['datum']);
+  $_POST['preis'] = str_replace(',','.',$_POST['preis']);
+
+  $sql = sprintf("INSERT INTO metro_artikel_preis (artikel,preis,steuersatz,datum,sys_user,sys_edit) " .
+                "VALUES (%d,%.3f,%d,'%s',%s,now())",
+                $_POST['artikel'],
+                $_POST['preis'],
+                $_POST['steuer'],
+                $date,
+                $db->quote($_SESSION['sys']['login']), $row['id']);
+
+  $sth = $db->query($sql);
+
+  return true;
+}
+
+function cb_artnr()
+{
+  global $db;
+
+  if (empty($_POST['artnr']))
+    return array('error' => 'Nicht ausreichend Daten übermittelt');
+
+  $sql = sprintf("SELECT count(*) AS count FROM metro_artikel WHERE artnr = %d", $_POST['artnr']);
+  if (!empty($_POST['artikel']))
+    $sql .= sprintf(" AND id <> %d", $_POST['artikel']);
+
+  $sth = $db->query($sql);
+  $row = $sth->fetch();
+
+  return array('count' => $row['count']);
+}
+
 ?>