New form for editing einsaetze
authorJoey Schulze <joey@infodrom.org>
Fri, 16 Apr 2010 10:01:54 +0000 (12:01 +0200)
committerJoey Schulze <joey@infodrom.org>
Fri, 16 Apr 2010 10:01:54 +0000 (12:01 +0200)
masks/korrektur.php [new file with mode: 0644]

diff --git a/masks/korrektur.php b/masks/korrektur.php
new file mode 100644 (file)
index 0000000..9ff80cb
--- /dev/null
@@ -0,0 +1,351 @@
+<?php
+
+$jscode[] = <<<EOC
+
+post_save = false;
+
+var personal = false;
+var geraete = false;
+function label_create(name, number, text)
+{
+  var elem = document.createElement('label');
+  elem.for = 'edit_'+name+':' + number;
+  elem.innerHTML = text;
+  return elem;
+}
+
+function input_create(name,number,size,value)
+{
+  var elem = document.createElement('input');
+  elem.id = 'edit_'+name+':' + number;
+  elem.name = name + ':' + number;
+  elem.type = 'text';
+  elem.size = size;
+  elem.value = value;
+  return elem;
+}
+
+function select_create(name,number,options,selected)
+{
+  var elem = document.createElement('select');
+  elem.id = 'edit_'+name+':' + number;
+  elem.name = name + ':' + number;
+
+  var idx;
+  for (var i=0; i < options.length; i++) {
+    elem.options[i] = new Option(options[i].text,options[i].id,false,false);
+    if (options[i].id == selected) idx = i;
+  }
+  elem.selectedIndex = idx;
+
+  return elem;
+}
+
+function personal_add_record(obj,number,data)
+{
+  var div = document.createElement('div');
+  div.style.margin = '2px';
+  div.style.padding = '2px';
+  div.style.paddingLeft = '4px';
+  div.style.marginBottom = '4px';
+  div.style.border = '1px solid #aaaaaa';
+  div.style.backgroundColor = '#dbdbdb';
+  div.style.overflow = 'hidden';
+  obj.appendChild(div);
+
+  var elem = input_create('id',number,20,data.id);
+  elem.type = 'hidden';
+  div.appendChild(elem);
+  elem = label_create('personal',number,'Mitarbeiter');
+  div.appendChild(elem);
+  elem = document.createElement('br');
+  div.appendChild(elem);
+  elem = select_create('personal',number,personal,data.personal);
+  div.appendChild(elem);
+  elem = document.createElement('br');
+  div.appendChild(elem);
+  elem = label_create('stunden',number,'Stunden');
+  div.appendChild(elem);
+  elem = document.createElement('br');
+  div.appendChild(elem);
+  elem = input_create('stunden',number,20,data.stunden);
+  div.appendChild(elem);
+}
+
+function select_geraet_callback(data)
+{
+  var id = 'edit_anbaugeraet';
+  id += ':' + data.parameter.number;
+
+  if (data.info.length)
+    select_update(id,data.info, 0);
+
+  var obj = document.getElementById(id);
+  for (var i=0; i < data.info.length; i++)
+    if (data.info[i].id == data.parameter.selected)
+      obj.selectedIndex = i;
+}
+
+function geraete_add_record(obj,number,data)
+{
+  var div = document.createElement('div');
+  div.style.margin = '2px';
+  div.style.padding = '2px';
+  div.style.paddingLeft = '4px';
+  div.style.marginBottom = '4px';
+  div.style.border = '1px solid #aaaaaa';
+  div.style.backgroundColor = '#dbdbdb';
+  div.style.overflow = 'hidden';
+  obj.appendChild(div);
+
+  var elem = input_create('id',number,20,data.id);
+  elem.type = 'hidden';
+  div.appendChild(elem);
+  elem = label_create('personal',number,'Gerät');
+  div.appendChild(elem);
+  elem = document.createElement('br');
+  div.appendChild(elem);
+  elem = select_create('geraet',number,geraete,data.geraet);
+  div.appendChild(elem);
+  elem = document.createElement('br');
+  div.appendChild(elem);
+
+  if (data.anbaugeraet != null) {
+    elem = label_create('anbaugeraet',number,'Anbaugerät');
+    div.appendChild(elem);
+    elem = select_create('anbaugeraet',number,geraete,data.geraet);
+    div.appendChild(elem);
+    elem = document.createElement('br');
+    div.appendChild(elem);
+
+    get_info('anbaugeraete',
+            {geraet: data.geraet, number: number, selected: data.anbaugeraet},
+            select_geraet_callback);
+  }
+
+  elem = label_create('stunden',number,'Stunden');
+  div.appendChild(elem);
+  elem = document.createElement('br');
+  div.appendChild(elem);
+  elem = input_create('stunden',number,20,data.stunden);
+  div.appendChild(elem);
+}
+
+function personal_load_callback(data)
+{
+  var div = document.getElementById('form_edit_parent');
+
+  while (div.childNodes.length)
+    div.removeChild(div.firstChild);
+
+  for (var i=0; i < data.info.length; i++) {
+    personal_add_record(div,i,data.info[i]);
+  }
+}
+
+function geraete_load_callback(data)
+{
+  var div = document.getElementById('form_edit_parent');
+
+  while (div.childNodes.length)
+    div.removeChild(div.firstChild);
+
+  for (var i=0; i < data.info.length; i++) {
+    geraete_add_record(div,i,data.info[i]);
+  }
+}
+
+function personal_load(id)
+{
+  get_info('einsatzpersonal', {id: id}, personal_load_callback);
+
+  var title = document.getElementById('mask_edit_title');
+  title.innerHTML = 'Personaleinsatz bearbeiten';
+
+  var type = document.getElementById('edit_data_type');
+  type.value = 'personal';
+}
+
+function geraete_load(id)
+{
+  get_info('einsatzgeraete', {id: id}, geraete_load_callback);
+
+  var title = document.getElementById('mask_edit_title');
+  title.innerHTML = 'Geräteeinsatz bearbeiten';
+
+  var type = document.getElementById('edit_data_type');
+  type.value = 'geraete';
+}
+
+function form_onload()
+{
+  get_info('mitarbeiter', {}, function (data) { personal = data.info });
+  get_info('geraete', {}, function (data) { geraete = data.info });
+
+  var form = document.getElementById('form_edit');
+
+  var div = document.createElement('div');
+  div.id = 'form_edit_parent';
+  form.insertBefore(div,form.firstChild);
+
+  var elem = document.createElement('input');
+  elem.id = 'edit_data_type';
+  elem.name = 'data_type';
+  elem.type = 'hidden';
+  form.insertBefore(elem,form.firstChild);
+
+  var status = document.getElementById('form_status');
+  status.style.display = 'none';
+}
+
+Rico.onLoad(form_onload);
+
+EOC;
+
+function korrektur_save($mask)
+{
+  if ($_POST['data_type'] == 'personal') {
+    $num = 0;
+    while (true) {
+      $app = ':'.($num++);
+      if (empty($_POST['id'.$app])) break;
+
+      $sql = sprintf("SELECT personal,stunden FROM einsatzpersonal WHERE id = %d", $_POST['id'.$app]);
+      $sth = pg_query($sql);
+      $row = pg_fetch_assoc($sth);
+
+      if ($row['personal'] != $_POST['personal'.$app] ||
+         $row['stunden'] != $_POST['stunden'.$app]) {
+       $sql = sprintf("UPDATE einsatzpersonal SET personal=%d,stunden=%.2f,sys_user='%s',sys_edit=now() WHERE id = %d",
+                      $_POST['personal'.$app], $_POST['stunden'.$app],
+                      pg_escape_string($_SESSION['sys']['login']),
+                      $_POST['id'.$app]);
+       pg_query($sql);
+      }
+    }
+  } elseif ($_POST['data_type'] == 'geraete') {
+    $num = 0;
+    while (true) {
+      $app = ':'.($num++);
+      if (empty($_POST['id'.$app])) break;
+
+      $sql = sprintf("SELECT geraet,anbaugeraet,stunden FROM einsatzgeraete WHERE id = %d", $_POST['id'.$app]);
+      $sth = pg_query($sql);
+      $row = pg_fetch_assoc($sth);
+
+      if ($row['geraet'] != $_POST['geraet'.$app] ||
+         ($row['anbaugeraet'] === NULL && !empty($_POST['anbaugeraet'.$app])) ||
+         ($row['anbaugeraet'] !== NULL && $row['anbaugeraet'] != $_POST['anbaugeraet'.$app]) ||
+         $row['stunden'] != $_POST['stunden'.$app]) {
+       $anbaugeraet = empty($_POST['anbaugeraet'.$app]) ? 'NULL' : sprintf('%d', $_POST['anbaugeraet'.$app]);
+
+       $sql = sprintf("UPDATE einsatzgeraete SET geraet=%d,anbaugeraet=%s,stunden=%.2f,sys_user='%s',sys_edit=now() WHERE id = %d",
+                      $_POST['geraet'.$app],
+                      $anbaugeraet,
+                      $_POST['stunden'.$app],
+                      pg_escape_string($_SESSION['sys']['login']),
+                      $_POST['id'.$app]);
+       pg_query($sql);
+      }
+    }
+  }
+
+  return array('status' => true);
+}
+
+$mask = array(
+             'table' => 'einsatz',
+             'title' => 'Korrektur von Arbeitsberichten',
+             'join' => array(
+                             'kostenstellen ON einsatz.kostenstelle = kostenstellen.id',
+                             'gebiet ON kostenstellen.gebiet = gebiet.id',
+                             ),
+             'list' => array(
+                             'id' => array(
+                                           'name' => 'ID',
+                                           'sql' => 'einsatz.id',
+                                           'width' => 60,
+                                           'visible' => false,
+                                           ),
+                             'datum' => array(
+                                           'name' => 'Datum',
+                                           'type' => 'date',
+                                           'width' => 70,
+                                           ),
+                             'controla' => array(
+                                           'name' => 'Personal',
+                                           'width' => 70,
+                                           'control' => "new Rico.TableColumn.link('javascript:personal_load({0})')",
+                                           'specs' => "filterUI: 'c', ClassName: 'aligncenter', canSort: false",
+                                           'sql' => "'bearbeiten'",
+                                           ),
+                             'controlb' => array(
+                                           'name' => 'Geräte',
+                                           'width' => 70,
+                                           'control' => "new Rico.TableColumn.link('javascript:geraete_load({0})')",
+                                           'specs' => "filterUI: 'c', ClassName: 'aligncenter', canSort: false",
+                                           'sql' => "'bearbeiten'",
+                                           ),
+                             'gebiet' => array(
+                                           'name' => 'Gebiet',
+                                           'width' => 230,
+                                           'sql' => 'gebiet.gebiet',
+                                           ),
+                             'kostenstelle' => array(
+                                           'name' => 'Kostenstelle',
+                                           'width' => 230,
+                                           'sql' => 'kostenstellen.kostenstelle',
+                                           ),
+                             'personal' => array(
+                                           'name' => 'Personal',
+                                           'width' => 230,
+                                           'sql' => "(SELECT name || ', ' || vorname FROM personal " . 
+                                                    "JOIN einsatzpersonal ON einsatzpersonal.personal = personal.id " .
+                                                    "WHERE einsatzpersonal.einsatz = einsatz.id LIMIT 1)",
+                                           ),
+                             'material' => array(
+                                           'name' => 'Material',
+                                           'width' => 70,
+                                           'control' => "new Rico.TableColumn.checkbox('t','f','0',true)",
+                                           'sql' => '(SELECT count(*) > 0 FROM materialverbrauch WHERE einsatz = einsatz.id)',
+                                           'specs' => "ClassName: 'aligncenter', canSort: false",
+                                           ),
+                             ),
+             'edit_table' => 'materialverbrauch',
+             'edit' => array(),
+             'save' => korrektur_save,
+             'buttons' => array(
+                       'insert' => false,
+                       'delete' => false,
+                       ),
+             'info' => array(
+                             'einheit' => array(
+                                           'sql' => 'SELECT einheiten.einheit FROM einheiten ' .
+                                                    'JOIN materialien ON materialien.einheit = einheiten.id ' .
+                                                    'WHERE materialien.id = {id}',
+                                           ),
+                             'einsatzpersonal' => array(
+                                           'sql' => "SELECT id,personal,stunden " .
+                                           'FROM einsatzpersonal ' .
+                                           'WHERE einsatz = {id}',
+                                           ),
+                             'einsatzgeraete' => array(
+                                           'sql' => "SELECT id,geraet,anbaugeraet,stunden " .
+                                           'FROM einsatzgeraete ' .
+                                           'WHERE einsatz = {id}',
+                                           ),
+                             'mitarbeiter' => array(
+                                           'sql' => 'SELECT id,name || \', \' || vorname AS text FROM personal WHERE aktiv = 1 ORDER BY text',
+                                           ),
+                             'geraete' => array(
+                                           'sql' => 'SELECT id,geraet AS text FROM gerate ORDER BY text',
+                                           ),
+                             'anbaugeraete' => array(
+                                           'sql' => 'SELECT anbaugeraete.id,anbaugeraet as text FROM anbaugeraete ' .
+                                                    'JOIN gerate ON anbaugeraete.geraetetyp = gerate.geraetetyp ' .
+                                                    'WHERE gerate.id = {geraet} ORDER BY text',
+                                           ),
+                             ),
+             );
+
+?>