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