e1d1f12f489b583e4b430c6ecd3e73d88093465e
[misc/kostenrechnung] / masks / korrektur.php
1 <?php
2
3 $jscode[] = <<<EOC
4
5 post_save = false;
6
7 function button_delete(obj)
8 {
9   var foo = this.id.split(':');
10   var number = foo[1];
11   var bar = foo[0].split('_');
12   var name = bar[1];
13   var id = document.getElementById('edit_id:'+number);
14   var source = document.getElementById('edit_source');
15
16   id.parentNode.style.display = 'none';
17
18   info('');
19   var params = 'id='+id.value + '&source='+source.value + '&table=einsatz'+name;
20
21   ajax_request('delete', params, false);
22
23   return false;
24 }
25
26 var personal = false;
27 var geraete = false;
28 var gebiete = false;
29 var kostenstelle_selected = false;
30 var ordnungen = false;
31 var arbeiten = false;
32 var akkord = [{id: 0, text: 'kein Akkord'},
33               {id: 1, text: 'Akkord'}];
34 function label_create(name, number, text)
35 {
36   var elem = document.createElement('label');
37   elem.for = 'edit_'+name+':' + number;
38   elem.innerHTML = text;
39   return elem;
40 }
41
42 function input_create(name,number,size,value)
43 {
44   var elem = document.createElement('input');
45   var appendix = '';
46   if (number !== false) appendix = ':' + number;
47
48   elem.id = 'edit_'+name+appendix;
49   elem.name = name + appendix;
50   elem.type = 'text';
51   elem.size = size;
52   elem.value = value;
53   return elem;
54 }
55
56 function button_create(name,number)
57 {
58   var elem = document.createElement('button');
59   var appendix = '';
60   if (number !== false) appendix = ':' + number;
61
62   elem.id = 'button_'+name+appendix;
63   elem.onclick = button_delete;
64   elem.innerHTML = 'Löschen';
65   return elem;
66 }
67
68 function select_create(name,number,options,selected)
69 {
70   var elem = document.createElement('select');
71   var appendix = '';
72   if (number !== false) appendix = ':' + number;
73
74   elem.id = 'edit_'+name+appendix;
75   elem.name = name + appendix;
76
77   var idx;
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;
81   }
82   elem.selectedIndex = idx;
83
84   return elem;
85 }
86
87 function textarea_create(name,number,cols,value)
88 {
89   var elem = document.createElement('textarea');
90   var appendix = '';
91   if (number !== false) appendix = ':' + number;
92
93   elem.id = 'edit_'+name+appendix;
94   elem.name = name + appendix;
95   elem.value = value;
96   elem.cols = cols;
97
98   return elem;
99 }
100
101 function personal_add_record(obj,number,data)
102 {
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);
112
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);
133 }
134
135 function select_geraet_callback(data)
136 {
137   var id = 'edit_anbaugeraet:' + data.parameter.number;
138   var obj = document.getElementById(id);
139   var fix = 0;
140
141   if (data.parameter.selected == null) {
142     obj.options[0] = new Option('Bitte wählen Sie','',false,false);
143     fix = 1;
144   }
145
146   if (data.info.length)
147     select_update(id,data.info, fix);
148   else
149     obj.options.length = 0;
150
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;
155 }
156
157 function select_geraet(event)
158 {
159   var foo = event.originalTarget.id.split(':');
160   var number = foo[1];
161
162   get_info('anbaugeraete',
163            {geraet: event.originalTarget.options[event.originalTarget.selectedIndex].value, number: number},
164            select_geraet_callback);
165 }
166
167 function geraete_add_record(obj,number,data)
168 {
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);
178
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);
191
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);
198
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);
204
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);
214 }
215
216 function kostenstellen_callback(data)
217 {
218   select_update('edit_kostenstelle',data.info,0);
219
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;
224       break;
225     }
226 }
227
228 function select_gebiet_callback(data)
229 {
230   var id = 'edit_kostenstelle';
231   var obj = document.getElementById(id);
232   var fix = 0;
233
234   if (data.parameter.selected == null) {
235     obj.options[0] = new Option('Bitte wählen Sie','',false,false);
236     fix = 1;
237   }
238
239   if (data.info.length)
240     select_update(id,data.info, fix);
241   else
242     obj.options.length = 0;
243
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;
248 }
249
250 function select_gebiet(event)
251 {
252   get_info('kostenstellen', {gebiet: event.originalTarget.options[event.originalTarget.selectedIndex].value},
253            select_gebiet_callback);
254 }
255
256 function einsatz_add_record(obj,data)
257 {
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);
267
268   var id = document.getElementById('edit_id');
269   id.value = data.id;
270
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);
277
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);
287
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);
296
297   elem = select_create('kostenstelle',false,[],data.kostenstelle);
298   div.appendChild(elem);
299   elem = document.createElement('br');
300   div.appendChild(elem);
301
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);
310
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);
319
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);
328
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);
337 }
338
339 function personal_load_callback(data)
340 {
341   var div = document.getElementById('form_edit_parent');
342
343   while (div.childNodes.length)
344     div.removeChild(div.firstChild);
345
346   for (var i=0; i < data.info.length; i++) {
347     personal_add_record(div,i,data.info[i]);
348   }
349 }
350
351 function geraete_load_callback(data)
352 {
353   var div = document.getElementById('form_edit_parent');
354
355   while (div.childNodes.length)
356     div.removeChild(div.firstChild);
357
358   for (var i=0; i < data.info.length; i++) {
359     geraete_add_record(div,i,data.info[i]);
360   }
361 }
362
363 function einsatz_load_callback(data)
364 {
365   var div = document.getElementById('form_edit_parent');
366
367   while (div.childNodes.length)
368     div.removeChild(div.firstChild);
369
370   einsatz_add_record(div,data.info[0]);
371 }
372
373 function personal_load(id)
374 {
375   get_info('einsatzpersonal', {id: id}, personal_load_callback);
376
377   var title = document.getElementById('mask_edit_title');
378   title.innerHTML = 'Personaleinsatz bearbeiten';
379
380   var type = document.getElementById('edit_data_type');
381   type.value = 'personal';
382
383   var button = document.getElementById('button_delete');
384   button.style.display = 'none';
385 }
386
387 function geraete_load(id)
388 {
389   get_info('einsatzgeraete', {id: id}, geraete_load_callback);
390
391   var title = document.getElementById('mask_edit_title');
392   title.innerHTML = 'Geräteeinsatz bearbeiten';
393
394   var type = document.getElementById('edit_data_type');
395   type.value = 'geraete';
396
397   var button = document.getElementById('button_delete');
398   button.style.display = 'none';
399 }
400
401 function einsatz_load(id)
402 {
403   get_info('einsatz', {id: id}, einsatz_load_callback);
404
405   var title = document.getElementById('mask_edit_title');
406   title.innerHTML = 'Einsatz bearbeiten';
407
408   var type = document.getElementById('edit_data_type');
409   type.value = 'einsatz';
410
411   var button = document.getElementById('button_delete');
412   button.style.display = '';
413 }
414
415 function load_data()
416 {
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 });
422 }
423
424 function form_onload()
425 {
426   setTimeout(load_data, 500);
427   var form = document.getElementById('form_edit');
428
429   var div = document.createElement('div');
430   div.id = 'form_edit_parent';
431   form.insertBefore(div,form.firstChild);
432
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);
438
439   var status = document.getElementById('form_status');
440   status.style.display = 'none';
441 }
442
443 Rico.onLoad(form_onload);
444
445 EOC;
446
447 function korrektur_save($mask)
448 {
449   if ($_POST['data_type'] == 'personal') {
450     $num = 0;
451     while (true) {
452       $app = ':'.($num++);
453       if (empty($_POST['id'.$app])) break;
454
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);
458
459       if ($row['personal'] != $_POST['personal'.$app] ||
460           $row['stunden'] != $_POST['stunden'.$app]) {
461         $sql = sprintf("UPDATE einsatzpersonal SET personal=%d,stunden=%.2f,sys_user='%s',sys_edit=now() WHERE id = %d",
462                        $_POST['personal'.$app], $_POST['stunden'.$app],
463                        pg_escape_string($_SESSION['sys']['login']),
464                        $_POST['id'.$app]);
465         pg_query($sql);
466       }
467     }
468   } elseif ($_POST['data_type'] == 'geraete') {
469     $num = 0;
470     while (true) {
471       $app = ':'.($num++);
472       if (empty($_POST['id'.$app])) break;
473
474       $sql = sprintf("SELECT geraet,anbaugeraet,stunden FROM einsatzgeraete WHERE id = %d", $_POST['id'.$app]);
475       $sth = pg_query($sql);
476       $row = pg_fetch_assoc($sth);
477
478       if ($row['geraet'] != $_POST['geraet'.$app] ||
479           ($row['anbaugeraet'] === NULL && !empty($_POST['anbaugeraet'.$app])) ||
480           ($row['anbaugeraet'] !== NULL && $row['anbaugeraet'] != $_POST['anbaugeraet'.$app]) ||
481           $row['stunden'] != $_POST['stunden'.$app]) {
482         $anbaugeraet = empty($_POST['anbaugeraet'.$app]) ? 'NULL' : intval($_POST['anbaugeraet'.$app]);
483
484         $sql = sprintf("UPDATE einsatzgeraete SET geraet=%d,anbaugeraet=%s,stunden=%.2f,sys_user='%s',sys_edit=now() WHERE id = %d",
485                        $_POST['geraet'.$app],
486                        $anbaugeraet,
487                        $_POST['stunden'.$app],
488                        pg_escape_string($_SESSION['sys']['login']),
489                        $_POST['id'.$app]);
490         pg_query($sql);
491       }
492     }
493   } elseif ($_POST['data_type'] == 'einsatz') {
494     $sql = sprintf("SELECT datum,ordnung,gebiet,kostenstelle,arbeiten,akkord,bemerkung FROM einsatz WHERE id = %d", $_POST['id']);
495     $sth = pg_query($sql);
496     $row = pg_fetch_assoc($sth);
497
498     if ($row['datum'] != $_POST['datum'] ||
499         $row['ordnung'] != $_POST['ordnung'] ||
500         $row['gebiet'] != $_POST['gebiet'] ||
501         $row['kostenstelle'] != $_POST['kostenstelle'] ||
502         $row['arbeiten'] != $_POST['arbeiten'] ||
503         $row['akkord'] != $_POST['akkord'] ||
504         $row['bemerkung'] != $_POST['bemerkung']) {
505
506       $bemerkung = empty($_POST['bemerkung']) ? 'NULL' : "'".pg_escape_string($_POST['bemerkung'])."'";
507       $sql = sprintf("UPDATE einsatz SET datum='%s',ordnung=%d,gebiet=%d,kostenstelle=%d,arbeiten=%d,akkord=%d,bemerkung=%s, " .
508                      "sys_user='%s',sys_edit=now() WHERE id = %d",
509                      pg_escape_string($_POST['datum']),
510                      $_POST['ordnung'],
511                      $_POST['gebiet'],
512                      $_POST['kostenstelle'],
513                      $_POST['arbeiten'],
514                      $_POST['akkord'],
515                      $bemerkung,
516                      pg_escape_string($_SESSION['sys']['login']),
517                      $_POST['id']);
518       pg_query($sql);
519     }
520   } else {
521     return array('status' => false, 'error' => 'Unknown data type "'.$_POST['data_type'].'" for this call');
522   }
523
524   return array('status' => true);
525 }
526
527 function korrektur_delete($mask)
528 {
529   if (!empty($_POST['table']) && is_array($mask['tables_delete']) && in_array($_POST['table'], $mask['tables_delete']))
530     return delete_or_copy_row($_POST['table'],$_POST['id']);
531
532   $id = $_POST['id'];
533   $subtables = array('einsatzpersonal','einsatzgeraete');
534   foreach ($subtables as $table) {
535     $sql = sprintf("SELECT id FROM %s WHERE einsatz = %d", $table, $id);
536     $sth = pg_query($sql);
537     $row = pg_fetch_assoc($sth);
538
539     $ret = delete_or_copy_row($table, $row['id']);
540
541     if ($ret['status'] !== true) return $ret;
542   }
543
544   return delete_or_copy_row($mask['table'], $id);
545 }
546
547 $mask = array(
548               'table' => 'einsatz',
549               'tables_delete' => array('einsatzpersonal','einsatzgeraete'),
550               'title' => 'Korrektur von Arbeitsberichten',
551               'join' => array(
552                               'kostenstellen ON einsatz.kostenstelle = kostenstellen.id',
553                               'gebiet ON kostenstellen.gebiet = gebiet.id',
554                               ),
555               'list' => array(
556                               'id' => array(
557                                             'name' => 'ID',
558                                             'sql' => 'einsatz.id',
559                                             'width' => 60,
560                                             'visible' => false,
561                                             ),
562                               'datum' => array(
563                                             'name' => 'Datum',
564                                             'type' => 'date',
565                                             'width' => 70,
566                                             ),
567                               'gebiet' => array(
568                                             'name' => 'Gebiet',
569                                             'width' => 230,
570                                             'sql' => 'gebiet.gebiet',
571                                             ),
572                               'kostenstelle' => array(
573                                             'name' => 'Kostenstelle',
574                                             'width' => 230,
575                                             'sql' => 'kostenstellen.kostenstelle',
576                                             ),
577                               'personal' => array(
578                                             'name' => 'Personal',
579                                             'width' => 230,
580                                             'sql' => "(SELECT name || ', ' || vorname FROM personal " . 
581                                                      "JOIN einsatzpersonal ON einsatzpersonal.personal = personal.id " .
582                                                      "WHERE einsatzpersonal.einsatz = einsatz.id LIMIT 1)",
583                                             ),
584                               'controla' => array(
585                                             'name' => 'Personal',
586                                             'width' => 70,
587                                             'control' => "new Rico.TableColumn.link('javascript:personal_load({0})')",
588                                             'specs' => "filterUI: 'c', ClassName: 'aligncenter', canSort: false",
589                                             'sql' => "'bearbeiten'",
590                                             ),
591                               'controlb' => array(
592                                             'name' => 'Geräte',
593                                             'width' => 70,
594                                             'control' => "new Rico.TableColumn.link('javascript:geraete_load({0})')",
595                                             'specs' => "filterUI: 'c', ClassName: 'aligncenter', canSort: false",
596                                             'sql' => "'bearbeiten'",
597                                             ),
598                               'controlc' => array(
599                                             'name' => 'Einsatz',
600                                             'width' => 70,
601                                             'control' => "new Rico.TableColumn.link('javascript:einsatz_load({0})')",
602                                             'specs' => "filterUI: 'c', ClassName: 'aligncenter', canSort: false",
603                                             'sql' => "'bearbeiten'",
604                                             ),
605                               ),
606               'edit' => array(),
607               'save' => korrektur_save,
608               'delete' => korrektur_delete,
609               'buttons' => array(
610                         'insert' => false,
611                         ),
612               'info' => array(
613                               'einheit' => array(
614                                             'sql' => 'SELECT einheiten.einheit FROM einheiten ' .
615                                                      'JOIN materialien ON materialien.einheit = einheiten.id ' .
616                                                      'WHERE materialien.id = {id}',
617                                             ),
618                               'einsatz' => array(
619                                             'sql' => "SELECT id,ordnung,datum,kostenstelle,gebiet,arbeiten,akkord,bemerkung " .
620                                             'FROM einsatz ' .
621                                             'WHERE id = {id}',
622                                             ),
623                               'einsatzpersonal' => array(
624                                             'sql' => "SELECT id,personal,stunden " .
625                                             'FROM einsatzpersonal ' .
626                                             'WHERE einsatz = {id}',
627                                             ),
628                               'einsatzgeraete' => array(
629                                             'sql' => "SELECT id,geraet,anbaugeraet,stunden " .
630                                             'FROM einsatzgeraete ' .
631                                             'WHERE einsatz = {id}',
632                                             ),
633                               'gebiete' => array(
634                                             'sql' => 'SELECT id,gebiet AS text FROM gebiet ORDER BY text',
635                                             ),
636                               'kostenstellen' => array(
637                                             'sql' => 'SELECT id,kostenstelle AS text FROM kostenstellen WHERE gebiet = {gebiet} ORDER BY text',
638                                             ),
639                               'ordnungen' => array(
640                                             'sql' => 'SELECT id,name AS text FROM ordnungen ORDER BY text',
641                                             ),
642                               'arbeiten' => array(
643                                             'sql' => 'SELECT id,arbeitsart AS text FROM arbeitsarten ORDER BY text',
644                                             ),
645                               'mitarbeiter' => array(
646                                             'sql' => 'SELECT id,name || \', \' || vorname AS text FROM personal WHERE aktiv = 1 ORDER BY text',
647                                             ),
648                               'geraete' => array(
649                                             'sql' => 'SELECT id,geraet AS text FROM gerate ORDER BY text',
650                                             ),
651                               'anbaugeraete' => array(
652                                             'sql' => 'SELECT anbaugeraete.id,anbaugeraet as text FROM anbaugeraete ' .
653                                                      'JOIN gerate ON anbaugeraete.geraetetyp = gerate.geraetetyp ' .
654                                                      'WHERE gerate.id = {geraet} ORDER BY text',
655                                             ),
656                               ),
657               );
658
659 ?>