5ee8b4d54653a926c28cd6c8137f699a4ca907c1
[infodrom.org/service.infodrom.org] / src / InfoCon / stempel / status.wml
1 #include <infocon.style>
2 #include "common.inc"
3
4 <future>
5 <page func=InfoCon title="Stempeluhr">
6 <script type="text/javascript" src="<root_prefix>jquery.editable.js"></script>
7
8 <?
9   session_name('STEMPEL');
10   session_start();
11
12   function update_db()
13   {
14     global $dbh;
15
16     $count = 0;
17     for ($idx=0; $idx < $_POST["fields"]; $idx++) {
18       if (isset($_POST["oid_".$idx])) {
19         $query = sprintf('UPDATE stempel SET status=%d WHERE oid=%d',
20                  $_POST["status"], $_POST["oid_".$idx]);
21         $count++;
22         $sth = pg_exec ($dbh, $query);
23       }
24     }
25     return sprintf("<br>%d records updated.", $count);
26   }
27
28   $stati = false;
29   function display_tables()
30   {
31     global $month;
32     global $cust;
33     global $status;
34     global $dbh;
35     global $stati;
36
37     $name = load_customers();
38
39     $table_head = '<h3 class="bar">Kunde: %s</h3><script type="text/javascript">plant(%d,%.2f);</script>
40   <form action="status.php" method="POST">
41   <table class="smallfont border" id="table_%d" width="100%%" cellpadding=0 cellspacing=0>
42   <thead>
43   <tr class="head">
44     <th width=15%%>Datum</th>
45     <th width=5%%>Dauer</th>
46     <th width=5%%>St.</th>
47     <th width=75%% align=left>Arbeitsbeschreibung</th>
48   </tr>
49   </thead>
50   <tbody>';
51
52     if (!is_array($stati))
53       $stati = find_status();
54
55     $table_foot = '</table><div align="center"><p>';
56
57     foreach ($stati as $k=>$v)
58       $table_foot .= sprintf('<input type="radio" name="status" value="%s"%s>%s&nbsp;', $k, 0==$k?' checked':'', $v);
59     $table_foot .= '<input type="submit" class="button" value="Aktualisieren" onclick="return status_change(event)"></p></div>'.
60                   '<input type="hidden" name="fields" value="%d">'.
61                   '</form>';
62
63     $table_row = '<tr class="t%d" status="%d"><td>%s</td><td align="center" onclick="toggle_checkbox(%d,this)">%s</td>' .
64       '<td align="center" onclick="toggle_checkbox(%d,this)">%s</td><td><span route="Stempel/EditTask" item_id="%d">%s</span></td></tr>';
65     $table_sum = '</tbody><tfoot><tr class="t%d"><td>&nbsp;</td><td align="center">%s</td><td>&nbsp;</td><td>Summe</td></tr></tfoot>';
66
67     $query = "SELECT stempel.oid,stempel.id,stempel.status,start,customer,time,task,kurz FROM stempel JOIN stempel_status ON (stempel.status = stempel_status.id) WHERE time IS NOT NULL ";
68     if (isset($month) && strlen($month))
69       $query .= "AND cast(start AS TEXT) LIKE '".$month."-%' ";
70     if (isset($cust) && strlen($cust))
71       $query .= "AND customer ='".$cust."' ";
72
73     if (isset($status) && strlen($status)) {
74       if ($status != 'all')
75         $query .= "AND status = $status ";
76     } else
77       $query .= "AND status = 0 ";
78     $query .= "ORDER BY customer,start";
79
80     $sth = pg_exec ($dbh, $query);
81
82     $form = 0;
83     $customer = '';
84     while ($row = pg_fetch_array ($sth)) {
85
86       if ($customer != $row['customer']) {
87         if (strlen($customer)) {
88           printf($table_sum, $color, min2hour($sum));
89           printf($table_foot, $fieldnr);
90           $form++;
91         }
92         $cname = $name[$row['customer']]['name'];
93         if (!strlen($cname)) $cname = ucfirst($row['customer']);
94         printf($table_head, $cname, $form, $name[$row['customer']]['rate'], $form);
95         $customer = $row['customer'];
96         $fieldnr = 0;
97         $sum = 0;
98         $color = 0;
99       }
100
101       $sum += $row['time'];
102       $d = explode(' ', $row['start']);
103
104       $check = sprintf('<input type="checkbox" class="checkbox" name="oid_%d" value="%d" onclick="add_sum(%d,this)">',
105                        $fieldnr++,
106                        $row['oid'],
107                        $form);
108       $date = sprintf('<span onclick="toggle_checkbox(%d,this)">%s</span>', $form, $d[0]);
109       printf($table_row, $color, $row['status'], $check.$date, $form, min2hour($row['time']), $form, $row['kurz'],
110              $row['id'],
111              htmlspecialchars($row['task'], ENT_COMPAT | ENT_HTML401, 'ISO-8859-1'));
112       $color = !$color;
113     }
114     if (pg_num_rows($sth) > 0) {
115       printf($table_sum, $color, min2hour($sum));
116       printf($table_foot, $fieldnr);
117     }
118   }
119
120   function find_customers()
121   {
122     global $dbh;
123
124     $a = array();
125     $query = "SELECT DISTINCT customer FROM stempel ORDER BY customer";
126     $sth = pg_exec ($dbh, $query);
127
128     while ($row = pg_fetch_array ($sth))
129       $a[] = $row[0];
130
131     return $a;
132   }
133
134   $dbh = pg_pconnect ("<dbhost>", "<dbport>", "<dbname>")
135          or die("Unable to connect to SQL server");
136
137   pg_exec ($dbh, "SET DateStyle = 'ISO'") or die("Datenbank-Abfrage!");
138
139   if (isset($_POST["status"]) && isset($_POST["fields"])) {
140     $msg = update_db();
141     $_SESSION['redirect'] = true;
142     header('Location: status.php');
143     exit;
144   } elseif ($_SESSION['redirect']) {
145     $month = $_SESSION['save']["month"];
146     $cust = $_SESSION['save']["customer"];
147     $status = $_SESSION['save']["status"];
148     $_SESSION['redirect'] = false;
149   } else {
150     if (isset($_GET['month'])) {
151       $month = $_GET['month'];
152       $_SESSION['save']['month'] = $month;
153       unset($_SESSION['save']['customer']);
154       unset($_SESSION['save']['status']);
155     } else
156       if (isset($_POST["filter"])) {
157         $month = $_POST["month"];
158         $cust = $_POST["customer"];
159         $status = $_POST["status"];
160         $_SESSION['save']['month'] = $month;
161         $_SESSION['save']['customer'] = $cust;
162         $_SESSION['save']['status'] = $status;
163       } else {
164         $month = date('Y-m');
165         $_SESSION['save']['month'] = $month;
166         unset($_SESSION['save']['customer']);
167         unset($_SESSION['save']['status']);
168       }
169   }
170 ?>
171
172 <script src="<root_prefix>basics.js"></script>
173 <script type="text/javascript">
174 <protect>
175 var color_checked = '#c4ffc3';
176 function format_int(value, width)
177 {
178   var s = value.toString();
179
180   while (s.length < width)
181     s = '0' + s;
182
183   return s;
184 }
185
186 function timestr(duration)
187 {
188     return format_int(Math.floor(duration / 60), 1) + ':'
189         + format_int(duration - (Math.floor(duration / 60) * 60), 2);
190 }
191
192 function strtime(time)
193 {
194     var a = time.split(':');
195     return parseInt(a[0],10) * 60 + parseInt(a[1],10);
196 }
197
198 function check(id, value)
199 {
200     var hours = $('#time_'+id);
201     var rate = $('#rate_'+id);
202     var sum = $('#sum_'+id);
203     var newval = 0;
204
205     $('table#table_'+id+' tbody tr:visible').each(function(i,e){
206         var checkbox = $(this).find('input[type="checkbox"]');
207         if (checkbox.prop('checked') != value) {
208             checkbox.prop('checked', !checkbox.prop('checked'));
209             if (checkbox.prop('checked'))
210                 $(this).css('background-color', color_checked);
211             else
212                 $(this).css('background-color', '');
213             add_sum(id, checkbox);
214         }
215     });
216
217     return false;
218 }
219
220 function plant(form, rate)
221 {
222   document.write('<div class="jscode">');
223   document.write('<input class="filter" id="filter_'+form+'" size="10" value="">');
224   document.write('<img class="filter" id="img_'+form+'" src="/pix/Actions-edit-delete-icon.png" border="0" ' +
225                  'title="Filter löschen">');
226   document.write('<input type="hidden" id="rate_'+form+'" value="'+rate+'">');
227   document.write('<a href="#" onclick="return check('+form+',true)">Check all</a>');
228   document.write("&nbsp;/&nbsp;");
229   document.write('<a href="#" onclick="return check('+form+',false)">Uncheck all</a>');
230   document.write("&nbsp;");
231   document.write('<span id="time_'+form+'" class="sum">0:00</span>' );
232   document.write('<span id="sum_'+form+'" class="sum">&euro;0.00</span>');
233   document.write("&nbsp;");
234   document.write('</div>');
235 }
236
237 function add_sum(form, checkbox)
238 {
239     var hours = $('#time_'+form);
240     var rate = $('#rate_'+form);
241     var sum = $('#sum_'+form);
242     var time = strtime($(checkbox).parents('tr:first').find('td:nth-child(2)').text());
243     var newval;
244
245     if ($(checkbox).prop('checked')) {
246         newval = strtime(hours.text()) + time;
247         $(checkbox).parents('tr:first').css('background-color', color_checked);
248     } else {
249         newval = strtime(hours.text()) - time;
250         $(checkbox).parents('tr:first').css('background-color', '');
251     }
252     hours.text(timestr(newval));
253     sum.html('&euro;' + ((newval/60)*rate.val()).toFixed(2));
254 }
255
256 function toggle_checkbox(form, obj)
257 {
258     var row = $(obj).parents('tr:first');
259     var checkbox = row.find('input[type="checkbox"]')
260     checkbox.prop('checked', !checkbox.prop('checked'));
261
262     checkbox.checked = !checkbox.checked;
263     add_sum(form, checkbox);
264 }
265
266 function filter_change(e)
267 {
268     var form = $(this).attr('id').split('_')[1];
269     var filter = $('input#filter_'+form).val();
270
271     var cnum = 0;
272     $('table#table_'+form+' tbody tr').not('.deleted').each(function(i,e){
273         if (filter.length) {
274             var td = $(this).find('td:nth-child(4)');
275             if (td.text().toLowerCase().indexOf(filter) > -1) {
276                 $(this).removeClass('t0').removeClass('t1').addClass('t'+cnum).show();
277                 cnum = cnum ? 0 : 1;
278             } else {
279                 if ($(this).find('input[type="checkbox"]').prop('checked')) {
280                     toggle_checkbox(form, td);
281                 }
282                 $(this).hide();
283             }
284         } else {
285             $(this).removeClass('t0').removeClass('t1').addClass('t'+cnum).show();
286             cnum = cnum ? 0 : 1;
287         }
288     });
289 }
290
291 function filter_clear(e)
292 {
293     var form = $(this).attr('id').split('_')[1];
294     $('div.jscode input.filter#filter_'+form).val('').keyup();
295 }
296
297 function status_change(e)
298 {
299     var ids = [];
300     var form = $(e.target).parents('form:first');
301     var p = $(e.target).parents('p:first');
302     form.find('tr').not('.deleted').find('input.checkbox').each(function(i,e){
303         if ($(this).prop('checked') == true)
304             ids.push($(this).val());
305     });
306
307     var new_status = 0;
308     p.find('input[name="status"]').each(function(i,e){
309         if ($(this).prop('checked') == true)
310             new_status = $(this).val();
311     });
312
313     $.invoke('Sales/SetStatus', {status: new_status, ids: ids}, function(data){
314         for (var i=0; i < ids.length; i++) {
315             show_message('Positionen aktualisiert');
316             var checkbox = form.find('input.checkbox[value="'+ids[i]+'"]');
317             var row = checkbox.parents('tr:first');
318
319             checkbox.prop('checked',false);
320             add_sum(form.find('table:first').attr('id').split('_')[1], checkbox);
321
322             if (row.attr('status') != new_status)
323                 row.addClass('deleted').hide();
324         }
325     });
326
327     return false;
328 }
329
330 $(function(){
331     $('div.jscode input.filter').keyup(filter_change);
332     $('div.jscode img.filter').click(filter_clear);
333     make_editable('table.smallfont tr span');
334 });
335 </protect>
336 </script>
337
338 <style type="text/css">
339 div.jscode {
340   text-align: right;
341   margin-top: -13px;
342   font-size: 12px;
343 }
344 div.jscode input.filter {
345   font-size: 90%;
346   position: relative;
347   bottom: 2px;
348 }
349 div.jscode img.filter {
350   position: relative;
351   bottom: -3px;
352   margin-left: 1px;
353   margin-right: 10px;
354 }
355 span.sum {
356   display: inline;
357   border: 1px solid #9b9b9b;
358   background: #d9e2ea;
359   width: 20px;
360   margin-left: 3px;
361 }
362 </style>
363
364 <?
365   if (!empty($msg))
366     echo $msg;
367   else {
368     display_tables();
369 ?>
370
371 <h3 class=bar>Display</h3>
372
373 <form action=status.php method=POST>
374 <select name=month>
375 <?
376   if (!is_array($months))
377     $months = find_months();
378
379   printf('<option value=""%s>alle</option>', !strlen($month)?' selected':'');
380   foreach ($months as $m) {
381     printf('<option value="%s"%s>%s</option>', $m, $month==$m?' selected':'', $m);
382   }
383 ?>
384 </select>
385
386 <select name=customer>
387 <?
388   if (!is_array($customers))
389     $customers = find_customers();
390
391   printf('<option value=""%s>alle</option>', !strlen($cust)?' selected':'');
392   foreach ($customers as $c) {
393     printf('<option value="%s"%s>%s</option>', $c, $cust==$c?' selected':'', $c);
394   }
395 ?>
396 </select>
397
398 <?
399   if (!is_array($stati))
400     $stati = find_status();
401
402   printf('<input type="radio" name="status" value="all"%s>alle&nbsp;', $status=='all'?' checked':'');
403   foreach ($stati as $k=>$v)
404     printf('<input type="radio" name="status" value="%s"%s>%s&nbsp;', $k, $status==$k?' checked':'', $v);
405 ?>
406
407 <input type="hidden" name="filter" value="form">
408 <input class="button" type="submit" value="Display">
409 </form>
410
411 <? } ?>
412 </page>
413
414 # Local variables:
415 # mode: php
416 # end: