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