93732ae8905c29b4303342b3c98898010c262888
[misc/kostenrechnung] / masks / arbeitsberichte.php
1 <?php
2
3 $jscode[] = <<<EOC
4
5 Rico.loadModule('Calendar');
6
7 function get_number(name)
8 {
9   var elems = name.split(':');
10   if (elems.length == 1) return 0;
11   return Number(elems[elems.length-1]);
12 }
13
14 function select_gebiet_callback(data)
15 {
16     select_update('edit_kostenstelle',data.info,1);
17 }
18
19 function select_gebiet(obj)
20 {
21     get_info('kostenstellen', {gebiet: obj.options[obj.selectedIndex].value}, select_gebiet_callback);
22 }
23
24 function select_geraet_callback(data)
25 {
26     var num = get_number(data.parameter.id);
27
28     var id = 'edit_anbaugeraet';
29     if (num > 0) id += ':' + num;
30
31     var obj = document.getElementById(id);
32
33     if (data.info.length) {
34       if (obj.options.length == 0)
35         obj.options[0] = new Option('Bitte wählen Sie','',false,false);
36       select_update(id,data.info, 1);
37     } else
38       obj.options.length = 0;
39
40 }
41
42 function select_geraet(obj)
43 {
44     get_info('anbaugeraete',
45              {geraet: obj.options[obj.selectedIndex].value, id: obj.id},
46              select_geraet_callback);
47 }
48
49 function form_onload()
50 {
51     get_info('gebiete', {}, function (data) { select_update('edit_gebiet',data.info, 1); });
52     get_info('ordnungen', {}, function (data) { select_update('edit_ordnung',data.info,1); });
53     get_info('mitarbeiter', {}, function (data) { select_update('edit_personal',data.info, 1); });
54     get_info('geraete', {}, function (data) { select_update('edit_geraet',data.info, 1); });
55     get_info('arbeitsarten', {}, function (data) { select_update('edit_arbeitsart',data.info,1); });
56 }
57
58 function replicate_personal()
59 {
60     var elem;
61     var personal = document.getElementById('edit_personal');
62     var stunden = document.getElementById('edit_stunden');
63
64     var number = get_number(personal.parentNode.children[personal.parentNode.children.length-1].name) + 1;
65
66     elem = document.createElement('br');
67     personal.parentNode.appendChild(elem);
68
69     elem = document.createElement('select');
70     elem.id = 'edit_personal:' + number;
71     elem.name = 'personal:' + number;
72     elem.options[0] = new Option('Bitte wählen Sie','',false,false);
73     personal.parentNode.appendChild(elem);
74     get_info('mitarbeiter', {}, function (data) { select_update('edit_personal:'+number,data.info, 1); });
75
76     elem = document.createElement('br');
77     stunden.parentNode.appendChild(elem);
78
79     elem = document.createElement('input');
80     elem.id = 'edit_stunden:' + number;
81     elem.name = 'stunden:' + number;
82     elem.type = 'text';
83     elem.size = 5;
84     stunden.parentNode.appendChild(elem);
85
86     return false;
87 }
88
89 function replicate_geraete()
90 {
91     var elem;
92     var geraet = document.getElementById('edit_geraet');
93     var anbaugeraet = document.getElementById('edit_anbaugeraet');
94     var geraetstunden = document.getElementById('edit_geraetstunden');
95
96     var number = get_number(geraet.parentNode.children[geraet.parentNode.children.length-1].name) + 1;
97
98     elem = document.createElement('br');
99     geraet.parentNode.appendChild(elem);
100
101     elem = document.createElement('select');
102     elem.id = 'edit_geraet:' + number;
103     elem.name = 'geraet:' + number;
104     elem.options[0] = new Option('Bitte wählen Sie','',false,false);
105     elem.onchange = function() { select_geraet(this); };
106     geraet.parentNode.appendChild(elem);
107     get_info('geraete', {}, function (data) { select_update('edit_geraet:'+number,data.info, 1); });
108
109     elem = document.createElement('br');
110     anbaugeraet.parentNode.appendChild(elem);
111
112     elem = document.createElement('select');
113     elem.id = 'edit_anbaugeraet:' + number;
114     elem.name = 'anbaugeraet:' + number;
115     anbaugeraet.parentNode.appendChild(elem);
116
117     elem = document.createElement('br');
118     geraetstunden.parentNode.appendChild(elem);
119
120     elem = document.createElement('input');
121     elem.id = 'edit_geraetstunden:' + number;
122     elem.name = 'geraetstunden:' + number;
123     elem.type = 'text';
124     elem.size = 5;
125     geraetstunden.parentNode.appendChild(elem);
126
127     return false;
128 }
129
130 function einsatz_check()
131 {
132     var fields = {
133         datum: 'Datum',
134         gebiet: 'Gebiet',
135         kostenstelle: 'Gewässer',
136         ordnung: 'Gewässerordnung',
137         arbeitsart: 'Arbeiten',
138         personal: 'Mitarbeiter',
139         stunden: 'Stunden'};
140
141     for (id in fields) {
142         var elem = document.getElementById('edit_' + id);
143
144         if (elem.nodeName.toLowerCase() == 'input') {
145             if (!elem.value.length) {
146                 alert('Das Feld ' + fields[id] + ' muß ausgefüllt werden');
147                 return false;
148             }
149             continue;
150         }
151
152         if (elem.nodeName.toLowerCase() == 'select') {
153             if (!elem.options[elem.selectedIndex].value.length) {
154                 alert('Das Feld ' + fields[id] + ' muß ausgefüllt werden');
155                 return false;
156             }
157             continue;
158         }
159     }
160
161     return true;
162 }
163
164 function einsatz_callback(data)
165 {
166     info('Neuer Arbeitsbericht gespeichert');
167     window.location.reload();
168 }
169
170 function einsatz_submit()
171 {
172     if (!einsatz_check()) return false;
173
174     var form = document.getElementById('edit_form');
175     var source = document.getElementById('source');
176     if (!source || !form) return false;
177
178     ajax_request('insert', Form.serialize(form) + '&source=' + source.innerHTML, einsatz_callback);
179
180     return false;
181 }
182
183 Rico.onLoad(form_onload);
184
185 EOC;
186
187 $formular = <<<EOC
188 <div class="form">
189 <form id="edit_form">
190
191 <table width="100%" cellspacing="2" border="0">
192 <tr>
193  <td width="25%"><label for="edit_datum">Datum</label></td>
194  <td width="25%"><label for="edit_gebiet">Gebiet</label></td>
195  <td width="25%"><label for="edit_kostenstelle">Gewässer</label></td>
196  <td width="25%"><label for="edit_ordnung">Gewässerordnung</label></td>
197 </tr>
198 <tr>
199  <td width="25%"><input id="edit_datum" name="datum" size="8">&nbsp;<img class="calendar" src="images/icons/calendar.gif" onclick="calendar('edit_datum',event)"></td>
200  <td width="25%"><select id="edit_gebiet" name="gebiet" onchange="select_gebiet(this)"><option value="">Bitte wählen Sie</option></select></td>
201  <td width="25%"><select id="edit_kostenstelle" name="kostenstelle"><option value="">Bitte wählen Sie</option></select></td>
202  <td width="25%"><select id="edit_ordnung" name="ordnung"><option value="">Bitte wählen Sie</option></select></td>
203 </tr>
204 </table>
205
206 <table width="100%" cellspacing="2" border="0" style="border: 1px solid #CCC; border-bottom: none; background: #e5e5e5;">
207 <tr>
208  <td width="30%"><label for="edit_personal">Mitarbeiter</label></td>
209  <td width="30%"><label for="edit_stunden">Stunden</label></td>
210  <td width="30%">&nbsp;</td>
211  <td width="10%">&nbsp;</td>
212 </tr>
213 <tr>
214  <td width="30%"><select id="edit_personal" name="personal"><option value="">Bitte wählen Sie</option></select></td>
215  <td width="30%"><input id="edit_stunden" name="stunden" size="5" type="text"></td>
216   <td width="30%">&nbsp;</td>
217  <td width="10%" align="right"valign="bottom"><button onclick="return replicate_personal()" style="color: red; font-weight: bold;">+&nbsp;</button></td>
218 </tr>
219 </table>
220
221 <table width="100%" cellspacing="2" border="0" style="border: 1px solid #CCC; background: #e5e5e5;">
222 <tr>
223  <td width="30%"><label for="edit_geraet">Gerät</label></td>
224  <td width="30%"><label for="edit_anbaugeraet">Anbaugerät</label></td>
225  <td width="30%"><label for="edit_geraetstunden">Stunden</label></td>
226  <td width="10%">&nbsp;</td>
227 </tr>
228 <tr>
229  <td width="30%"><select id="edit_geraet" name="geraet" onchange="select_geraet(this)"><option value="">Bitte wählen Sie</option></select></td>
230  <td width="30%"><select id="edit_anbaugeraet" name="anbaugeraet"></select></td>
231  <td width="30%"><input id="edit_geraetstunden" name="stunden" size="5" type="text"></td>
232  <td width="10%" align="right"valign="bottom"><button onclick="return replicate_geraete()" style="color: red; font-weight: bold;">+&nbsp;</button></td>
233 </tr>
234 </table>
235
236 <table width="100%" cellspacing="2" border="0" style="margin-top: 5px;">
237 <tr>
238  <td width="50%"><label for="edit_bemerkung">Bemerkung</label></td>
239  <td width="25%"><label for="edit_arbeitsart">Arbeiten</label></td>
240  <td width="25%"><label for="edit_akkord">Akkord</label></td>
241 </tr>
242 <tr>
243  <td width="50%" valign="top"><textarea id="edit_bemerkung" name="bemerkung" cols="66" rows="5"></textarea></td>
244  <td width="25%" valign="top"><select id="edit_arbeitsart" name="arbeitsart"><option value="">Bitte wählen Sie</option></select></td>
245  <td width="25%" valign="top"><input id="edit_akkord" name="akkord" type="checkbox"></td>
246 </tr>
247 </table>
248
249
250 <div align="center" style="margin-bottom: 5px;"><button onclick="return einsatz_submit()">Hinzufügen</button></div>
251 </form>
252 </div>
253 EOC;
254
255 function einsatz_insert($mask)
256 {
257   $date = explode('.',$_POST['datum']);
258   $date = sprintf('%04d-%02d-%02d', $date[2], $date[1], $date[0]);
259
260   $sql = sprintf("INSERT INTO einsatz (datum,ordnung,gebiet,kostenstelle,arbeiten,akkord,bemerkung,sys_user,sys_edit) " .
261                  "VALUES ('%s',%d,%d,%d,%d,%d,%s,'%s',now())",
262                  $date,
263                  $_POST['ordnung'],
264                  $_POST['gebiet'],
265                  $_POST['kostenstelle'],
266                  $_POST['arbeitsart'],
267                  $_POST['akkord'],
268                  empty($_POST['bemerkung']) ? 'NULL' : "'" . pg_escape_string($_POST['bemerkung']) . "'",
269                  pg_escape_string($_SESSION['sys']['login']));
270
271   $sth = pg_query($sql);
272
273   if ($sth === false) {
274     error_log($sql . ': ' . pg_last_error());
275     return array('error' => pg_last_error(),
276                  'sql' => $sql);
277   }
278
279   $sql = "SELECT currval('einsatz_id_seq')";
280   $sth =  pg_query($sql);
281
282   if ($sth === false) {
283     error_log($sql . ': ' . pg_last_error());
284     return array('error' => pg_last_error(),
285                  'sql' => $sql);
286   }
287
288   $row = pg_fetch_assoc($sth);
289   $einsatz = $row['currval'];
290
291   $num = 0;$app='';
292   while (true) {
293     if ($num) {
294       $app = ':'.$num;
295       if (empty($_POST['personal'.$app])) break;
296     }
297     $sql = sprintf("INSERT INTO einsatzpersonal (einsatz,personal,stunden,sys_user,sys_edit) " .
298                    "VALUES (%d,%d,%.2f,'%s',now())",
299                    $einsatz,
300                    $_POST['personal'.$app],
301                    $_POST['stunden'.$app],
302                    pg_escape_string($_SESSION['sys']['login']));
303
304     $sth = pg_query($sql);
305
306     if ($sth === false) {
307       error_log($sql . ': ' . pg_last_error());
308       return array('error' => pg_last_error(),
309                    'sql' => $sql);
310     }
311
312     $num++;
313   }
314
315   $num = 0;$app='';
316   while (true) {
317     if ($num) $app = ':'.$num;
318     if (empty($_POST['geraet'.$app])) break;
319     $sql = sprintf("INSERT INTO einsatzgeraete (einsatz,geraet,anbaugeraet,stunden,sys_user,sys_edit) " .
320                    "VALUES (%d,%d,%s,%.2f,'%s',now())",
321                    $einsatz,
322                    $_POST['geraet'.$app],
323                    empty($_POST['anbaugeraet'.$app]) ? 'NULL' : intval($_POST['anbaugeraet'.$app]),
324                    $_POST['stunden'.$app],
325                    pg_escape_string($_SESSION['sys']['login']));
326
327     $sth = pg_query($sql);
328
329     if ($sth === false) {
330       error_log($sql . ': ' . pg_last_error());
331       return array('error' => pg_last_error(),
332                    'sql' => $sql);
333     }
334
335     $num++;
336   }
337
338   return array('status' => true);
339 }
340
341 $mask = array(
342               'table' => 'einsatz',
343               'title' => 'Arbeitsberichte',
344               'html' => $formular,
345               'insert' => einsatz_insert,
346               'info' => array(
347                               'gebiete' => array(
348                                             'sql' => 'SELECT id,gebiet AS text FROM gebiet ORDER BY text',
349                                             ),
350                               'ordnungen' => array(
351                                             'sql' => 'SELECT id,name AS text FROM ordnungen ORDER BY id',
352                                             ),
353                               'mitarbeiter' => array(
354                                             'sql' => 'SELECT id,name || \', \' || vorname AS text FROM personal WHERE aktiv = 1 ORDER BY text',
355                                             ),
356                               'geraete' => array(
357                                             'sql' => 'SELECT id,geraet AS text FROM gerate ORDER BY text',
358                                             ),
359                               'arbeitsarten' => array(
360                                             'sql' => 'SELECT id,arbeitsart AS text FROM arbeitsarten ORDER BY text',
361                                             ),
362                               'kostenstellen' => array(
363                                             'sql' => 'SELECT id,kostenstelle AS text FROM kostenstellen WHERE gebiet = {gebiet} ORDER BY text',
364                                             ),
365                               'anbaugeraete' => array(
366                                             'sql' => 'SELECT anbaugeraete.id,anbaugeraet as text FROM anbaugeraete ' .
367                                                      'JOIN gerate ON anbaugeraete.geraetetyp = gerate.geraetetyp ' .
368                                                      'WHERE gerate.id = {geraet} ORDER BY text',
369                                             ),
370                                    ),
371               );
372
373 ?>