a799e2986f78e963198f4ea4daca6a4a372cb297
[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       $_POST['stunden'.$app] = str_replace(',','.',$_POST['stunden'.$app]);
460
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']),
466                        $_POST['id'.$app]);
467         pg_query($sql);
468       }
469     }
470   } elseif ($_POST['data_type'] == 'geraete') {
471     $num = 0;
472     while (true) {
473       $app = ':'.($num++);
474       if (empty($_POST['id'.$app])) break;
475
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);
479
480       $_POST['stunden'.$app] = str_replace(',','.',$_POST['stunden'.$app]);
481
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]);
487
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],
490                        $anbaugeraet,
491                        $_POST['stunden'.$app],
492                        pg_escape_string($_SESSION['sys']['login']),
493                        $_POST['id'.$app]);
494         pg_query($sql);
495       }
496     }
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);
501
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']) {
509
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']),
514                      $_POST['ordnung'],
515                      $_POST['gebiet'],
516                      $_POST['kostenstelle'],
517                      $_POST['arbeiten'],
518                      $_POST['akkord'],
519                      $bemerkung,
520                      pg_escape_string($_SESSION['sys']['login']),
521                      $_POST['id']);
522       pg_query($sql);
523     }
524   } else {
525     return array('status' => false, 'error' => 'Unknown data type "'.$_POST['data_type'].'" for this call');
526   }
527
528   return array('status' => true);
529 }
530
531 function korrektur_delete($mask)
532 {
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']);
535
536   $id = $_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);
542
543     $ret = delete_or_copy_row($table, $row['id']);
544
545     if ($ret['status'] !== true) return $ret;
546   }
547
548   return delete_or_copy_row($mask['table'], $id);
549 }
550
551 $mask = array(
552               'table' => 'einsatz',
553               'tables_delete' => array('einsatzpersonal','einsatzgeraete'),
554               'title' => 'Korrektur von Arbeitsberichten',
555               'join' => array(
556                               'kostenstellen ON einsatz.kostenstelle = kostenstellen.id',
557                               'gebiet ON kostenstellen.gebiet = gebiet.id',
558                               ),
559               'list' => array(
560                               'id' => array(
561                                             'name' => 'ID',
562                                             'sql' => 'einsatz.id',
563                                             'width' => 60,
564                                             'visible' => false,
565                                             ),
566                               'datum' => array(
567                                             'name' => 'Datum',
568                                             'type' => 'date',
569                                             'width' => 70,
570                                             'specs' => "filterUI: 't'",
571                                             ),
572                               'gebiet' => array(
573                                             'name' => 'Gebiet',
574                                             'width' => 230,
575                                             'sql' => 'gebiet.gebiet',
576                                             'specs' => "filterUI: 's'",
577                                             ),
578                               'kostenstelle' => array(
579                                             'name' => 'Kostenstelle',
580                                             'width' => 230,
581                                             'sql' => 'kostenstellen.kostenstelle',
582                                             'specs' => "filterUI: 't'",
583                                             ),
584                               'personal' => array(
585                                             'name' => 'Personal',
586                                             'width' => 230,
587                                             'sql' => "(SELECT name || ', ' || vorname FROM personal " . 
588                                                      "JOIN einsatzpersonal ON einsatzpersonal.personal = personal.id " .
589                                                      "WHERE einsatzpersonal.einsatz = einsatz.id LIMIT 1)",
590                                             'specs' => "filterUI: 't'",
591                                             ),
592                               'controla' => array(
593                                             'name' => 'Personal',
594                                             'width' => 70,
595                                             'control' => "new Rico.TableColumn.link('javascript:personal_load({0})')",
596                                             'specs' => "ClassName: 'aligncenter', canSort: false",
597                                             'sql' => "'bearbeiten'",
598                                             ),
599                               'controlb' => array(
600                                             'name' => 'Geräte',
601                                             'width' => 70,
602                                             'control' => "new Rico.TableColumn.link('javascript:geraete_load({0})')",
603                                             'specs' => "ClassName: 'aligncenter', canSort: false",
604                                             'sql' => "'bearbeiten'",
605                                             ),
606                               'controlc' => array(
607                                             'name' => 'Einsatz',
608                                             'width' => 70,
609                                             'control' => "new Rico.TableColumn.link('javascript:einsatz_load({0})')",
610                                             'specs' => "ClassName: 'aligncenter', canSort: false",
611                                             'sql' => "'bearbeiten'",
612                                             ),
613                               ),
614               'edit' => array(),
615               'save' => korrektur_save,
616               'delete' => korrektur_delete,
617               'buttons' => array(
618                         'insert' => false,
619                         ),
620               'info' => array(
621                               'einheit' => array(
622                                             'sql' => 'SELECT einheiten.einheit FROM einheiten ' .
623                                                      'JOIN materialien ON materialien.einheit = einheiten.id ' .
624                                                      'WHERE materialien.id = {id}',
625                                             ),
626                               'einsatz' => array(
627                                             'sql' => "SELECT id,ordnung,datum,kostenstelle,gebiet,arbeiten,akkord,bemerkung " .
628                                             'FROM einsatz ' .
629                                             'WHERE id = {id}',
630                                             ),
631                               'einsatzpersonal' => array(
632                                             'sql' => "SELECT id,personal,stunden " .
633                                             'FROM einsatzpersonal ' .
634                                             'WHERE einsatz = {id}',
635                                             ),
636                               'einsatzgeraete' => array(
637                                             'sql' => "SELECT id,geraet,anbaugeraet,stunden " .
638                                             'FROM einsatzgeraete ' .
639                                             'WHERE einsatz = {id}',
640                                             ),
641                               'gebiete' => array(
642                                             'sql' => 'SELECT id,gebiet AS text FROM gebiet ORDER BY text',
643                                             ),
644                               'kostenstellen' => array(
645                                             'sql' => 'SELECT id,kostenstelle AS text FROM kostenstellen WHERE gebiet = {gebiet} ORDER BY text',
646                                             ),
647                               'ordnungen' => array(
648                                             'sql' => 'SELECT id,name AS text FROM ordnungen ORDER BY text',
649                                             ),
650                               'arbeiten' => array(
651                                             'sql' => 'SELECT id,arbeitsart AS text FROM arbeitsarten ORDER BY text',
652                                             ),
653                               'mitarbeiter' => array(
654                                             'sql' => 'SELECT id,name || \', \' || vorname AS text FROM personal WHERE aktiv = 1 ORDER BY text',
655                                             ),
656                               'geraete' => array(
657                                             'sql' => 'SELECT id,geraet AS text FROM gerate ORDER BY text',
658                                             ),
659                               'anbaugeraete' => array(
660                                             'sql' => 'SELECT anbaugeraete.id,anbaugeraet as text FROM anbaugeraete ' .
661                                                      'JOIN gerate ON anbaugeraete.geraetetyp = gerate.geraetetyp ' .
662                                                      'WHERE gerate.id = {geraet} ORDER BY text',
663                                             ),
664                               ),
665               );
666
667 ?>