7 function button_delete(obj)
9 var foo = this.id.split(':');
11 var bar = foo[0].split('_');
13 var id = document.getElementById('edit_id:'+number);
14 var source = document.getElementById('edit_source');
16 id.parentNode.style.display = 'none';
19 var params = 'id='+id.value + '&source='+source.value + '&table=einsatz'+name;
21 ajax_request('delete', params, false);
29 var kostenstelle_selected = false;
30 var ordnungen = false;
32 var akkord = [{id: 0, text: 'kein Akkord'},
33 {id: 1, text: 'Akkord'}];
34 function label_create(name, number, text)
36 var elem = document.createElement('label');
37 elem.for = 'edit_'+name+':' + number;
38 elem.innerHTML = text;
42 function input_create(name,number,size,value)
44 var elem = document.createElement('input');
46 if (number !== false) appendix = ':' + number;
48 elem.id = 'edit_'+name+appendix;
49 elem.name = name + appendix;
56 function button_create(name,number)
58 var elem = document.createElement('button');
60 if (number !== false) appendix = ':' + number;
62 elem.id = 'button_'+name+appendix;
63 elem.onclick = button_delete;
64 elem.innerHTML = 'Löschen';
68 function select_create(name,number,options,selected)
70 var elem = document.createElement('select');
72 if (number !== false) appendix = ':' + number;
74 elem.id = 'edit_'+name+appendix;
75 elem.name = name + appendix;
78 for (var i=0; i < options.length; i++) {
79 elem.options[i] = new Option(options[i].text,options[i].id,false,false);
80 if (options[i].id == selected) idx = i;
82 elem.selectedIndex = idx;
87 function textarea_create(name,number,cols,value)
89 var elem = document.createElement('textarea');
91 if (number !== false) appendix = ':' + number;
93 elem.id = 'edit_'+name+appendix;
94 elem.name = name + appendix;
101 function personal_add_record(obj,number,data)
103 var div = document.createElement('div');
104 div.style.margin = '2px';
105 div.style.padding = '2px';
106 div.style.paddingLeft = '4px';
107 div.style.marginBottom = '4px';
108 div.style.border = '1px solid #aaaaaa';
109 div.style.backgroundColor = '#dbdbdb';
110 div.style.overflow = 'hidden';
111 obj.appendChild(div);
113 var elem = input_create('id',number,20,data.id);
114 elem.type = 'hidden';
115 div.appendChild(elem);
116 elem = label_create('personal',number,'Mitarbeiter');
117 div.appendChild(elem);
118 elem = document.createElement('br');
119 div.appendChild(elem);
120 elem = select_create('personal',number,personal,data.personal);
121 div.appendChild(elem);
122 elem = document.createElement('br');
123 div.appendChild(elem);
124 elem = label_create('stunden',number,'Stunden');
125 div.appendChild(elem);
126 elem = document.createElement('br');
127 div.appendChild(elem);
128 elem = input_create('stunden',number,5,data.stunden);
129 div.appendChild(elem);
130 elem = button_create('personal',number);
131 elem.style.marginLeft = '20px';
132 div.appendChild(elem);
135 function select_geraet_callback(data)
137 var id = 'edit_anbaugeraet:' + data.parameter.number;
138 var obj = document.getElementById(id);
141 if (data.parameter.selected == null) {
142 obj.options[0] = new Option('Bitte wählen Sie','',false,false);
146 if (data.info.length)
147 select_update(id,data.info, fix);
149 obj.options.length = 0;
151 if (data.parameter.selected != null)
152 for (var i=0; i < data.info.length; i++)
153 if (data.info[i].id == data.parameter.selected)
154 obj.selectedIndex = i;
157 function select_geraet(event)
159 var foo = event.originalTarget.id.split(':');
162 get_info('anbaugeraete',
163 {geraet: event.originalTarget.options[event.originalTarget.selectedIndex].value, number: number},
164 select_geraet_callback);
167 function geraete_add_record(obj,number,data)
169 var div = document.createElement('div');
170 div.style.margin = '2px';
171 div.style.padding = '2px';
172 div.style.paddingLeft = '4px';
173 div.style.marginBottom = '4px';
174 div.style.border = '1px solid #aaaaaa';
175 div.style.backgroundColor = '#dbdbdb';
176 div.style.overflow = 'hidden';
177 obj.appendChild(div);
179 var elem = input_create('id',number,20,data.id);
180 elem.type = 'hidden';
181 div.appendChild(elem);
182 elem = label_create('personal',number,'Gerät');
183 div.appendChild(elem);
184 elem = document.createElement('br');
185 div.appendChild(elem);
186 elem = select_create('geraet',number,geraete,data.geraet);
187 elem.onchange = select_geraet;
188 div.appendChild(elem);
189 elem = document.createElement('br');
190 div.appendChild(elem);
192 elem = label_create('anbaugeraet',number,'Anbaugerät');
193 div.appendChild(elem);
194 elem = document.createElement('br');
195 div.appendChild(elem);
196 elem = select_create('anbaugeraet',number,[],data.anbaugeraet);
197 div.appendChild(elem);
199 get_info('anbaugeraete',
200 {geraet: data.geraet, number: number, selected: data.anbaugeraet, id: elem.id},
201 select_geraet_callback);
202 elem = document.createElement('br');
203 div.appendChild(elem);
205 elem = label_create('stunden',number,'Stunden');
206 div.appendChild(elem);
207 elem = document.createElement('br');
208 div.appendChild(elem);
209 elem = input_create('stunden',number,5,data.stunden);
210 div.appendChild(elem);
211 elem = button_create('geraete',number);
212 elem.style.marginLeft = '20px';
213 div.appendChild(elem);
216 function kostenstellen_callback(data)
218 select_update('edit_kostenstelle',data.info,0);
220 var obj = document.getElementById('edit_kostenstelle');
221 for (var i=0; i < obj.options.length; i++)
222 if (obj.options[i].value == kostenstelle_selected) {
223 obj.selectedIndex = i;
228 function select_gebiet_callback(data)
230 var id = 'edit_kostenstelle';
231 var obj = document.getElementById(id);
234 if (data.parameter.selected == null) {
235 obj.options[0] = new Option('Bitte wählen Sie','',false,false);
239 if (data.info.length)
240 select_update(id,data.info, fix);
242 obj.options.length = 0;
244 if (data.parameter.selected != null)
245 for (var i=0; i < data.info.length; i++)
246 if (data.info[i].id == data.parameter.selected)
247 obj.selectedIndex = i;
250 function select_gebiet(event)
252 get_info('kostenstellen', {gebiet: event.originalTarget.options[event.originalTarget.selectedIndex].value},
253 select_gebiet_callback);
256 function einsatz_add_record(obj,data)
258 var div = document.createElement('div');
259 div.style.margin = '2px';
260 div.style.padding = '2px';
261 div.style.paddingLeft = '4px';
262 div.style.marginBottom = '4px';
263 div.style.border = '1px solid #aaaaaa';
264 div.style.backgroundColor = '#dbdbdb';
265 div.style.overflow = 'hidden';
266 obj.appendChild(div);
268 var id = document.getElementById('edit_id');
271 var elem = label_create('datum',false,'Datum');
272 div.appendChild(elem);
273 elem = document.createElement('br');
274 div.appendChild(elem);
275 elem = input_create('datum',false,12,data.datum);
276 div.appendChild(elem);
278 elem = document.createElement('br');
279 div.appendChild(elem);
280 elem = label_create('gebiet',false,'Gebiet');
281 div.appendChild(elem);
282 elem = document.createElement('br');
283 div.appendChild(elem);
284 elem = select_create('gebiet',false,gebiete,data.gebiet);
285 elem.onchange = select_gebiet;
286 div.appendChild(elem);
288 elem = document.createElement('br');
289 div.appendChild(elem);
290 elem = label_create('kostenstelle',false,'Gewässer');
291 div.appendChild(elem);
292 elem = document.createElement('br');
293 div.appendChild(elem);
294 kostenstelle_selected = data.kostenstelle;
295 get_info('kostenstellen', {gebiet: data.gebiet, selected: data.kostenstelle}, select_gebiet_callback);
297 elem = select_create('kostenstelle',false,[],data.kostenstelle);
298 div.appendChild(elem);
299 elem = document.createElement('br');
300 div.appendChild(elem);
302 elem = label_create('ordnung',false,'Ordnung');
303 div.appendChild(elem);
304 elem = document.createElement('br');
305 div.appendChild(elem);
306 elem = select_create('ordnung',false,ordnungen,data.ordnung);
307 div.appendChild(elem);
308 elem = document.createElement('br');
309 div.appendChild(elem);
311 elem = label_create('arbeiten',false,'Arbeiten');
312 div.appendChild(elem);
313 elem = document.createElement('br');
314 div.appendChild(elem);
315 elem = select_create('arbeiten',false,arbeiten,data.arbeiten);
316 div.appendChild(elem);
317 elem = document.createElement('br');
318 div.appendChild(elem);
320 elem = label_create('akkord',false,'Akkord');
321 div.appendChild(elem);
322 elem = document.createElement('br');
323 div.appendChild(elem);
324 elem = select_create('akkord',false,akkord,data.akkord);
325 div.appendChild(elem);
326 elem = document.createElement('br');
327 div.appendChild(elem);
329 elem = label_create('bemerkung',false,'Bemerkung');
330 div.appendChild(elem);
331 elem = document.createElement('br');
332 div.appendChild(elem);
333 elem = textarea_create('bemerkung',false,28,data.bemerkung);
334 div.appendChild(elem);
335 elem = document.createElement('br');
336 div.appendChild(elem);
339 function personal_load_callback(data)
341 var div = document.getElementById('form_edit_parent');
343 while (div.childNodes.length)
344 div.removeChild(div.firstChild);
346 for (var i=0; i < data.info.length; i++) {
347 personal_add_record(div,i,data.info[i]);
351 function geraete_load_callback(data)
353 var div = document.getElementById('form_edit_parent');
355 while (div.childNodes.length)
356 div.removeChild(div.firstChild);
358 for (var i=0; i < data.info.length; i++) {
359 geraete_add_record(div,i,data.info[i]);
363 function einsatz_load_callback(data)
365 var div = document.getElementById('form_edit_parent');
367 while (div.childNodes.length)
368 div.removeChild(div.firstChild);
370 einsatz_add_record(div,data.info[0]);
373 function personal_load(id)
375 get_info('einsatzpersonal', {id: id}, personal_load_callback);
377 var title = document.getElementById('mask_edit_title');
378 title.innerHTML = 'Personaleinsatz bearbeiten';
380 var type = document.getElementById('edit_data_type');
381 type.value = 'personal';
383 var button = document.getElementById('button_delete');
384 button.style.display = 'none';
387 function geraete_load(id)
389 get_info('einsatzgeraete', {id: id}, geraete_load_callback);
391 var title = document.getElementById('mask_edit_title');
392 title.innerHTML = 'Geräteeinsatz bearbeiten';
394 var type = document.getElementById('edit_data_type');
395 type.value = 'geraete';
397 var button = document.getElementById('button_delete');
398 button.style.display = 'none';
401 function einsatz_load(id)
403 get_info('einsatz', {id: id}, einsatz_load_callback);
405 var title = document.getElementById('mask_edit_title');
406 title.innerHTML = 'Einsatz bearbeiten';
408 var type = document.getElementById('edit_data_type');
409 type.value = 'einsatz';
411 var button = document.getElementById('button_delete');
412 button.style.display = '';
417 get_info('mitarbeiter', {}, function (data) { personal = data.info });
418 get_info('geraete', {}, function (data) { geraete = data.info });
419 get_info('gebiete', {}, function (data) { gebiete = data.info });
420 get_info('ordnungen', {}, function (data) { ordnungen = data.info });
421 get_info('arbeiten', {}, function (data) { arbeiten = data.info });
424 function form_onload()
426 setTimeout(load_data, 500);
427 var form = document.getElementById('form_edit');
429 var div = document.createElement('div');
430 div.id = 'form_edit_parent';
431 form.insertBefore(div,form.firstChild);
433 var elem = document.createElement('input');
434 elem.id = 'edit_data_type';
435 elem.name = 'data_type';
436 elem.type = 'hidden';
437 form.insertBefore(elem,form.firstChild);
439 var status = document.getElementById('form_status');
440 status.style.display = 'none';
443 Rico.onLoad(form_onload);
447 function korrektur_save($mask)
449 if ($_POST['data_type'] == 'personal') {
453 if (empty($_POST['id'.$app])) break;
455 $sql = sprintf("SELECT personal,stunden FROM einsatzpersonal WHERE id = %d", $_POST['id'.$app]);
456 $sth = pg_query($sql);
457 $row = pg_fetch_assoc($sth);
459 $_POST['stunden'.$app] = str_replace(',','.',$_POST['stunden'.$app]);
461 if ($row['personal'] != $_POST['personal'.$app] ||
462 $row['stunden'] != $_POST['stunden'.$app]) {
463 $sql = sprintf("UPDATE einsatzpersonal SET personal=%d,stunden=%.2f,sys_user='%s',sys_edit=now() WHERE id = %d",
464 $_POST['personal'.$app], $_POST['stunden'.$app],
465 pg_escape_string($_SESSION['sys']['login']),
470 } elseif ($_POST['data_type'] == 'geraete') {
474 if (empty($_POST['id'.$app])) break;
476 $sql = sprintf("SELECT geraet,anbaugeraet,stunden FROM einsatzgeraete WHERE id = %d", $_POST['id'.$app]);
477 $sth = pg_query($sql);
478 $row = pg_fetch_assoc($sth);
480 $_POST['stunden'.$app] = str_replace(',','.',$_POST['stunden'.$app]);
482 if ($row['geraet'] != $_POST['geraet'.$app] ||
483 ($row['anbaugeraet'] === NULL && !empty($_POST['anbaugeraet'.$app])) ||
484 ($row['anbaugeraet'] !== NULL && $row['anbaugeraet'] != $_POST['anbaugeraet'.$app]) ||
485 $row['stunden'] != $_POST['stunden'.$app]) {
486 $anbaugeraet = empty($_POST['anbaugeraet'.$app]) ? 'NULL' : intval($_POST['anbaugeraet'.$app]);
488 $sql = sprintf("UPDATE einsatzgeraete SET geraet=%d,anbaugeraet=%s,stunden=%.2f,sys_user='%s',sys_edit=now() WHERE id = %d",
489 $_POST['geraet'.$app],
491 $_POST['stunden'.$app],
492 pg_escape_string($_SESSION['sys']['login']),
497 } elseif ($_POST['data_type'] == 'einsatz') {
498 $sql = sprintf("SELECT datum,ordnung,gebiet,kostenstelle,arbeiten,akkord,bemerkung FROM einsatz WHERE id = %d", $_POST['id']);
499 $sth = pg_query($sql);
500 $row = pg_fetch_assoc($sth);
502 if ($row['datum'] != $_POST['datum'] ||
503 $row['ordnung'] != $_POST['ordnung'] ||
504 $row['gebiet'] != $_POST['gebiet'] ||
505 $row['kostenstelle'] != $_POST['kostenstelle'] ||
506 $row['arbeiten'] != $_POST['arbeiten'] ||
507 $row['akkord'] != $_POST['akkord'] ||
508 $row['bemerkung'] != $_POST['bemerkung']) {
510 $bemerkung = empty($_POST['bemerkung']) ? 'NULL' : "'".pg_escape_string($_POST['bemerkung'])."'";
511 $sql = sprintf("UPDATE einsatz SET datum='%s',ordnung=%d,gebiet=%d,kostenstelle=%d,arbeiten=%d,akkord=%d,bemerkung=%s, " .
512 "sys_user='%s',sys_edit=now() WHERE id = %d",
513 pg_escape_string($_POST['datum']),
516 $_POST['kostenstelle'],
520 pg_escape_string($_SESSION['sys']['login']),
525 return array('status' => false, 'error' => 'Unknown data type "'.$_POST['data_type'].'" for this call');
528 return array('status' => true);
531 function korrektur_delete($mask)
533 if (!empty($_POST['table']) && is_array($mask['tables_delete']) && in_array($_POST['table'], $mask['tables_delete']))
534 return delete_or_copy_row($_POST['table'],$_POST['id']);
537 $subtables = array('einsatzpersonal','einsatzgeraete');
538 foreach ($subtables as $table) {
539 $sql = sprintf("SELECT id FROM %s WHERE einsatz = %d", $table, $id);
540 $sth = pg_query($sql);
541 $row = pg_fetch_assoc($sth);
543 $ret = delete_or_copy_row($table, $row['id']);
545 if ($ret['status'] !== true) return $ret;
548 return delete_or_copy_row($mask['table'], $id);
553 $sql = "SELECT id,gebiet FROM gebiet ORDER BY id";
554 $sth = pg_query($sql);
557 while ($row = pg_fetch_assoc($sth))
558 $result[] = sprintf("%d: '%s'", $row['id'], $row['gebiet']);
560 return '{' . implode(', ', $result) . '}';
564 'table' => 'einsatz',
565 'tables_delete' => array('einsatzpersonal','einsatzgeraete'),
566 'title' => 'Korrektur von Arbeitsberichten',
568 'kostenstellen ON einsatz.kostenstelle = kostenstellen.id',
573 'sql' => 'einsatz.id',
581 'specs' => "filterUI: 't'",
586 'sql' => 'einsatz.gebiet',
587 'control' => "new Rico.TableColumn.lookup(".gebiete().", 0, '')",
588 'specs' => "filterUI: 's'",
590 'kostenstelle' => array(
591 'name' => 'Kostenstelle',
593 'sql' => 'kostenstellen.kostenstelle',
594 'specs' => "filterUI: 't'",
597 'name' => 'Personal',
599 'sql' => "(SELECT name || ', ' || vorname FROM personal " .
600 "JOIN einsatzpersonal ON einsatzpersonal.personal = personal.id " .
601 "WHERE einsatzpersonal.einsatz = einsatz.id LIMIT 1)",
602 'specs' => "filterUI: 't'",
605 'name' => 'Personal',
607 'control' => "new Rico.TableColumn.link('javascript:personal_load({0})')",
608 'specs' => "ClassName: 'aligncenter', canSort: false",
609 'sql' => "'bearbeiten'",
614 'control' => "new Rico.TableColumn.link('javascript:geraete_load({0})')",
615 'specs' => "ClassName: 'aligncenter', canSort: false",
616 'sql' => "'bearbeiten'",
621 'control' => "new Rico.TableColumn.link('javascript:einsatz_load({0})')",
622 'specs' => "ClassName: 'aligncenter', canSort: false",
623 'sql' => "'bearbeiten'",
627 'save' => korrektur_save,
628 'delete' => korrektur_delete,
634 'sql' => 'SELECT einheiten.einheit FROM einheiten ' .
635 'JOIN materialien ON materialien.einheit = einheiten.id ' .
636 'WHERE materialien.id = {id}',
639 'sql' => "SELECT id,ordnung,datum,kostenstelle,gebiet,arbeiten,akkord,bemerkung " .
643 'einsatzpersonal' => array(
644 'sql' => "SELECT id,personal,stunden " .
645 'FROM einsatzpersonal ' .
646 'WHERE einsatz = {id}',
648 'einsatzgeraete' => array(
649 'sql' => "SELECT id,geraet,anbaugeraet,stunden " .
650 'FROM einsatzgeraete ' .
651 'WHERE einsatz = {id}',
654 'sql' => 'SELECT id,gebiet AS text FROM gebiet ORDER BY text',
656 'kostenstellen' => array(
657 'sql' => 'SELECT id,kostenstelle AS text FROM kostenstellen WHERE gebiet = {gebiet} ORDER BY text',
659 'ordnungen' => array(
660 'sql' => 'SELECT id,name AS text FROM ordnungen ORDER BY text',
663 'sql' => 'SELECT id,arbeitsart AS text FROM arbeitsarten ORDER BY text',
665 'mitarbeiter' => array(
666 'sql' => 'SELECT id,name || \', \' || vorname AS text FROM personal WHERE aktiv = 1 ORDER BY text',
669 'sql' => 'SELECT id,geraet AS text FROM gerate ORDER BY text',
671 'anbaugeraete' => array(
672 'sql' => 'SELECT anbaugeraete.id,anbaugeraet as text FROM anbaugeraete ' .
673 'JOIN gerate ON anbaugeraete.geraetetyp = gerate.geraetetyp ' .
674 'WHERE gerate.id = {geraet} ORDER BY text',