Move real deletion into function, allow external deletion function
[misc/kostenrechnung] / masks / korrektur.php
1 <?php
2
3 $jscode[] = <<<EOC
4
5 post_save = false;
6
7 var personal = false;
8 var geraete = false;
9 function label_create(name, number, text)
10 {
11   var elem = document.createElement('label');
12   elem.for = 'edit_'+name+':' + number;
13   elem.innerHTML = text;
14   return elem;
15 }
16
17 function input_create(name,number,size,value)
18 {
19   var elem = document.createElement('input');
20   elem.id = 'edit_'+name+':' + number;
21   elem.name = name + ':' + number;
22   elem.type = 'text';
23   elem.size = size;
24   elem.value = value;
25   return elem;
26 }
27
28 function select_create(name,number,options,selected)
29 {
30   var elem = document.createElement('select');
31   elem.id = 'edit_'+name+':' + number;
32   elem.name = name + ':' + number;
33
34   var idx;
35   for (var i=0; i < options.length; i++) {
36     elem.options[i] = new Option(options[i].text,options[i].id,false,false);
37     if (options[i].id == selected) idx = i;
38   }
39   elem.selectedIndex = idx;
40
41   return elem;
42 }
43
44 function personal_add_record(obj,number,data)
45 {
46   var div = document.createElement('div');
47   div.style.margin = '2px';
48   div.style.padding = '2px';
49   div.style.paddingLeft = '4px';
50   div.style.marginBottom = '4px';
51   div.style.border = '1px solid #aaaaaa';
52   div.style.backgroundColor = '#dbdbdb';
53   div.style.overflow = 'hidden';
54   obj.appendChild(div);
55
56   var elem = input_create('id',number,20,data.id);
57   elem.type = 'hidden';
58   div.appendChild(elem);
59   elem = label_create('personal',number,'Mitarbeiter');
60   div.appendChild(elem);
61   elem = document.createElement('br');
62   div.appendChild(elem);
63   elem = select_create('personal',number,personal,data.personal);
64   div.appendChild(elem);
65   elem = document.createElement('br');
66   div.appendChild(elem);
67   elem = label_create('stunden',number,'Stunden');
68   div.appendChild(elem);
69   elem = document.createElement('br');
70   div.appendChild(elem);
71   elem = input_create('stunden',number,5,data.stunden);
72   div.appendChild(elem);
73 }
74
75 function select_geraet_callback(data)
76 {
77   var id = 'edit_anbaugeraet';
78   id += ':' + data.parameter.number;
79
80   if (data.info.length)
81     select_update(id,data.info, 0);
82
83   var obj = document.getElementById(id);
84   for (var i=0; i < data.info.length; i++)
85     if (data.info[i].id == data.parameter.selected)
86       obj.selectedIndex = i;
87 }
88
89 function geraete_add_record(obj,number,data)
90 {
91   var div = document.createElement('div');
92   div.style.margin = '2px';
93   div.style.padding = '2px';
94   div.style.paddingLeft = '4px';
95   div.style.marginBottom = '4px';
96   div.style.border = '1px solid #aaaaaa';
97   div.style.backgroundColor = '#dbdbdb';
98   div.style.overflow = 'hidden';
99   obj.appendChild(div);
100
101   var elem = input_create('id',number,20,data.id);
102   elem.type = 'hidden';
103   div.appendChild(elem);
104   elem = label_create('personal',number,'Gerät');
105   div.appendChild(elem);
106   elem = document.createElement('br');
107   div.appendChild(elem);
108   elem = select_create('geraet',number,geraete,data.geraet);
109   div.appendChild(elem);
110   elem = document.createElement('br');
111   div.appendChild(elem);
112
113   if (data.anbaugeraet != null) {
114     elem = label_create('anbaugeraet',number,'Anbaugerät');
115     div.appendChild(elem);
116     elem = select_create('anbaugeraet',number,geraete,data.geraet);
117     div.appendChild(elem);
118     elem = document.createElement('br');
119     div.appendChild(elem);
120
121     get_info('anbaugeraete',
122              {geraet: data.geraet, number: number, selected: data.anbaugeraet},
123              select_geraet_callback);
124   }
125
126   elem = label_create('stunden',number,'Stunden');
127   div.appendChild(elem);
128   elem = document.createElement('br');
129   div.appendChild(elem);
130   elem = input_create('stunden',number,5,data.stunden);
131   div.appendChild(elem);
132 }
133
134 function personal_load_callback(data)
135 {
136   var div = document.getElementById('form_edit_parent');
137
138   while (div.childNodes.length)
139     div.removeChild(div.firstChild);
140
141   for (var i=0; i < data.info.length; i++) {
142     personal_add_record(div,i,data.info[i]);
143   }
144 }
145
146 function geraete_load_callback(data)
147 {
148   var div = document.getElementById('form_edit_parent');
149
150   while (div.childNodes.length)
151     div.removeChild(div.firstChild);
152
153   for (var i=0; i < data.info.length; i++) {
154     geraete_add_record(div,i,data.info[i]);
155   }
156 }
157
158 function personal_load(id)
159 {
160   get_info('einsatzpersonal', {id: id}, personal_load_callback);
161
162   var title = document.getElementById('mask_edit_title');
163   title.innerHTML = 'Personaleinsatz bearbeiten';
164
165   var type = document.getElementById('edit_data_type');
166   type.value = 'personal';
167 }
168
169 function geraete_load(id)
170 {
171   get_info('einsatzgeraete', {id: id}, geraete_load_callback);
172
173   var title = document.getElementById('mask_edit_title');
174   title.innerHTML = 'Geräteeinsatz bearbeiten';
175
176   var type = document.getElementById('edit_data_type');
177   type.value = 'geraete';
178 }
179
180 function form_onload()
181 {
182   get_info('mitarbeiter', {}, function (data) { personal = data.info });
183   get_info('geraete', {}, function (data) { geraete = data.info });
184
185   var form = document.getElementById('form_edit');
186
187   var div = document.createElement('div');
188   div.id = 'form_edit_parent';
189   form.insertBefore(div,form.firstChild);
190
191   var elem = document.createElement('input');
192   elem.id = 'edit_data_type';
193   elem.name = 'data_type';
194   elem.type = 'hidden';
195   form.insertBefore(elem,form.firstChild);
196
197   var status = document.getElementById('form_status');
198   status.style.display = 'none';
199 }
200
201 Rico.onLoad(form_onload);
202
203 EOC;
204
205 function korrektur_save($mask)
206 {
207   if ($_POST['data_type'] == 'personal') {
208     $num = 0;
209     while (true) {
210       $app = ':'.($num++);
211       if (empty($_POST['id'.$app])) break;
212
213       $sql = sprintf("SELECT personal,stunden FROM einsatzpersonal WHERE id = %d", $_POST['id'.$app]);
214       $sth = pg_query($sql);
215       $row = pg_fetch_assoc($sth);
216
217       if ($row['personal'] != $_POST['personal'.$app] ||
218           $row['stunden'] != $_POST['stunden'.$app]) {
219         $sql = sprintf("UPDATE einsatzpersonal SET personal=%d,stunden=%.2f,sys_user='%s',sys_edit=now() WHERE id = %d",
220                        $_POST['personal'.$app], $_POST['stunden'.$app],
221                        pg_escape_string($_SESSION['sys']['login']),
222                        $_POST['id'.$app]);
223         pg_query($sql);
224       }
225     }
226   } elseif ($_POST['data_type'] == 'geraete') {
227     $num = 0;
228     while (true) {
229       $app = ':'.($num++);
230       if (empty($_POST['id'.$app])) break;
231
232       $sql = sprintf("SELECT geraet,anbaugeraet,stunden FROM einsatzgeraete WHERE id = %d", $_POST['id'.$app]);
233       $sth = pg_query($sql);
234       $row = pg_fetch_assoc($sth);
235
236       if ($row['geraet'] != $_POST['geraet'.$app] ||
237           ($row['anbaugeraet'] === NULL && !empty($_POST['anbaugeraet'.$app])) ||
238           ($row['anbaugeraet'] !== NULL && $row['anbaugeraet'] != $_POST['anbaugeraet'.$app]) ||
239           $row['stunden'] != $_POST['stunden'.$app]) {
240         $anbaugeraet = empty($_POST['anbaugeraet'.$app]) ? 'NULL' : intval($_POST['anbaugeraet'.$app]);
241
242         $sql = sprintf("UPDATE einsatzgeraete SET geraet=%d,anbaugeraet=%s,stunden=%.2f,sys_user='%s',sys_edit=now() WHERE id = %d",
243                        $_POST['geraet'.$app],
244                        $anbaugeraet,
245                        $_POST['stunden'.$app],
246                        pg_escape_string($_SESSION['sys']['login']),
247                        $_POST['id'.$app]);
248         pg_query($sql);
249       }
250     }
251   }
252
253   return array('status' => true);
254 }
255
256 $mask = array(
257               'table' => 'einsatz',
258               'title' => 'Korrektur von Arbeitsberichten',
259               'join' => array(
260                               'kostenstellen ON einsatz.kostenstelle = kostenstellen.id',
261                               'gebiet ON kostenstellen.gebiet = gebiet.id',
262                               ),
263               'list' => array(
264                               'id' => array(
265                                             'name' => 'ID',
266                                             'sql' => 'einsatz.id',
267                                             'width' => 60,
268                                             'visible' => false,
269                                             ),
270                               'datum' => array(
271                                             'name' => 'Datum',
272                                             'type' => 'date',
273                                             'width' => 70,
274                                             ),
275                               'gebiet' => array(
276                                             'name' => 'Gebiet',
277                                             'width' => 230,
278                                             'sql' => 'gebiet.gebiet',
279                                             ),
280                               'kostenstelle' => array(
281                                             'name' => 'Kostenstelle',
282                                             'width' => 230,
283                                             'sql' => 'kostenstellen.kostenstelle',
284                                             ),
285                               'personal' => array(
286                                             'name' => 'Personal',
287                                             'width' => 230,
288                                             'sql' => "(SELECT name || ', ' || vorname FROM personal " . 
289                                                      "JOIN einsatzpersonal ON einsatzpersonal.personal = personal.id " .
290                                                      "WHERE einsatzpersonal.einsatz = einsatz.id LIMIT 1)",
291                                             ),
292                               'controla' => array(
293                                             'name' => 'Personal',
294                                             'width' => 70,
295                                             'control' => "new Rico.TableColumn.link('javascript:personal_load({0})')",
296                                             'specs' => "filterUI: 'c', ClassName: 'aligncenter', canSort: false",
297                                             'sql' => "'bearbeiten'",
298                                             ),
299                               'controlb' => array(
300                                             'name' => 'Geräte',
301                                             'width' => 70,
302                                             'control' => "new Rico.TableColumn.link('javascript:geraete_load({0})')",
303                                             'specs' => "filterUI: 'c', ClassName: 'aligncenter', canSort: false",
304                                             'sql' => "'bearbeiten'",
305                                             ),
306                               ),
307               'edit_table' => 'materialverbrauch',
308               'edit' => array(),
309               'save' => korrektur_save,
310               'buttons' => array(
311                         'insert' => false,
312                         'delete' => false,
313                         ),
314               'info' => array(
315                               'einheit' => array(
316                                             'sql' => 'SELECT einheiten.einheit FROM einheiten ' .
317                                                      'JOIN materialien ON materialien.einheit = einheiten.id ' .
318                                                      'WHERE materialien.id = {id}',
319                                             ),
320                               'einsatzpersonal' => array(
321                                             'sql' => "SELECT id,personal,stunden " .
322                                             'FROM einsatzpersonal ' .
323                                             'WHERE einsatz = {id}',
324                                             ),
325                               'einsatzgeraete' => array(
326                                             'sql' => "SELECT id,geraet,anbaugeraet,stunden " .
327                                             'FROM einsatzgeraete ' .
328                                             'WHERE einsatz = {id}',
329                                             ),
330                               'mitarbeiter' => array(
331                                             'sql' => 'SELECT id,name || \', \' || vorname AS text FROM personal WHERE aktiv = 1 ORDER BY text',
332                                             ),
333                               'geraete' => array(
334                                             'sql' => 'SELECT id,geraet AS text FROM gerate ORDER BY text',
335                                             ),
336                               'anbaugeraete' => array(
337                                             'sql' => 'SELECT anbaugeraete.id,anbaugeraet as text FROM anbaugeraete ' .
338                                                      'JOIN gerate ON anbaugeraete.geraetetyp = gerate.geraetetyp ' .
339                                                      'WHERE gerate.id = {geraet} ORDER BY text',
340                                             ),
341                               ),
342               );
343
344 ?>