Display Akkord and don't exclude vacation etc.
[misc/kostenrechnung] / masks / overview_kosten.php
1 <?php
2
3 include_once($_SESSION['sys']['basedir'].'/lib/overview_utils.php');
4
5 if (empty($_SESSION['overview_kosten.year'])) $_SESSION['overview_kosten.year'] = date('Y');
6
7 $details = <<<EOC
8 <div style="padding-left: 3px; margin-top: -10px;">
9 <b>Gebiet</b>: <span id="detail_gebiet"></span><br />
10 <b>Gewässer</b>: <span id="detail_kostenstelle"></span><br />
11 <b>Länge</b>: <span id="detail_laenge"></span><br />
12 <b>Gesamtkosten</b>: <span id="detail_gewaesserkosten"></span><br />
13 <b>Personalkosten</b>: <span id="detail_personalkosten"></span><br />
14 <b>Gerätekosten</b>: <span id="detail_geraetekosten"></span><br />
15 <b>Gewässer gereinigt</b>: <span id="detail_gereinigt"></span>
16 </div>
17 EOC;
18
19 $mask = array(
20               'table' => 'einsatz',
21               'title' => 'Kostenaufwand für Kostenstellen',
22               'join' => array(
23                               'arbeitsarten ON einsatz.arbeiten = arbeitsarten.id',
24                               'gebiet ON einsatz.gebiet = gebiet.id',
25                               'kostenstellen ON einsatz.kostenstelle = kostenstellen.id',
26                               ),
27 #             'where' => "arbeitsarten.arbeitsart <> 'Urlaub' AND arbeitsarten.arbeitsart <> 'Krank' AND arbeitsarten.arbeitsart <> 'Sonstige Fehltage'"
28 #                      . " AND date_part('year', datum) = " . $_SESSION['overview_kosten.year'],
29               'where' => "date_part('year', datum) = " . $_SESSION['overview_kosten.year'],
30               'select' => array(
31                                 'title' => 'Auswahl',
32                                 'options' => discover_years(),
33                                 'default' => 'Jahr wählen',
34                                 'selected' => $_SESSION['overview_kosten.year'],
35                                 'onchange' => "setvar(this,'year',select_year_calback,select_year_status)",
36                                 ),
37               'variables' => array(
38                                    'year' => array(),
39                                    ),
40               'list' => array(
41                               'id' => array(
42                                             'name' => 'ID',
43                                             'visible' => false,
44                                             'width' => 60,
45                                             'sql' => 'einsatz.id',
46                                             ),
47                               'datum' => array(
48                                             'name' => 'Datum',
49                                             'type' => 'date',
50                                             'width' => 70,
51                                             ),
52                               'akkord' => array(
53                                             'name' => 'Akkord',
54                                             'control' => "new Rico.TableColumn.checkbox('1','0','0',true)",
55                                             'width' => 50,
56                                             'specs' => "ClassName: 'aligncenter'",
57                                             ),
58                               'gebiet' => array(
59                                             'name' => 'Gebiet',
60                                             'sql' => "gebiet.gebiet",
61                                             'width' => 150,
62                                             'specs' => "filterUI: 's'",
63                                             ),
64                               'kostenstelle' => array(
65                                             'name' => 'Kostenstelle',
66                                             'sql' => "kostenstellen.kostenstelle",
67                                             'width' => 250,
68                                             'specs' => "filterUI: 's'",
69                                             ),
70                               'arbeitsart' => array(
71                                             'name' => 'Arbeiten',
72                                             'sql' => "arbeitsarten.arbeitsart",
73                                             'width' => 250,
74                                             'specs' => "filterUI: 's'",
75                                             ),
76                               'laenge' => array(
77                                             'name' => 'Länge',
78                                             'type' => 'number',
79                                             'specs' => "decPlaces: 2, ClassName: 'alignright', suffix: '&nbsp;', canSort: false",
80                                             'width' => 70,
81                                             ),
82                               'personalkosten' => array(
83                                             'name' => 'Mitarbeiterkosten',
84                                             'type' => 'number',
85                                             'specs' => "decPlaces: 2, ClassName: 'alignright', suffix: '&nbsp;', canSort: false",
86                                             'width' => 90,
87                                             'sql' => '
88 (SELECT sum(stunden * personal.persstdsatz) FROM einsatzpersonal
89 JOIN personal ON einsatzpersonal.personal = personal.id
90 WHERE einsatz = einsatz.id)
91 ',
92                                             ),
93                               'geraetkosten' => array(
94                                             'name' => 'Gerätkosten',
95                                             'type' => 'number',
96                                             'specs' => "decPlaces: 2, ClassName: 'alignright', suffix: '&nbsp;', canSort: false",
97                                             'width' => 90,
98                                             'sql' => '
99 (SELECT sum(stunden * gerate.geraetkst_intern + stunden * CASE WHEN anbaugeraete.anbkst_intern IS NULL THEN 0.0 ELSE anbaugeraete.anbkst_intern END)
100 FROM einsatzgeraete
101 JOIN gerate ON einsatzgeraete.geraet = gerate.id
102 LEFT JOIN anbaugeraete ON einsatzgeraete.anbaugeraet = anbaugeraete.id
103 WHERE einsatz = einsatz.id)
104 ',
105                                             ),
106                               'gesamtkosten' => array(
107                                             'name' => 'Gesamtkosten',
108                                             'type' => 'number',
109                                             'specs' => "decPlaces: 2, ClassName: 'alignright', suffix: '&nbsp;', canSort: false",
110                                             'width' => 90,
111                                             'sql' => '
112 (SELECT sum(stunden * personal.persstdsatz) FROM einsatzpersonal
113 JOIN personal ON einsatzpersonal.personal = personal.id
114 WHERE einsatz = einsatz.id)
115 +
116 CASE WHEN
117 (SELECT sum(stunden * gerate.geraetkst_intern + stunden * CASE WHEN anbaugeraete.anbkst_intern IS NULL THEN 0.0 ELSE anbaugeraete.anbkst_intern END)
118 FROM einsatzgeraete
119 JOIN gerate ON einsatzgeraete.geraet = gerate.id
120 LEFT JOIN anbaugeraete ON einsatzgeraete.anbaugeraet = anbaugeraete.id
121 WHERE einsatz = einsatz.id) IS NULL THEN 0.0
122 ELSE (SELECT sum(stunden * gerate.geraetkst_intern + stunden * CASE WHEN anbaugeraete.anbkst_intern IS NULL THEN 0.0 ELSE anbaugeraete.anbkst_intern END)
123 FROM einsatzgeraete
124 JOIN gerate ON einsatzgeraete.geraet = gerate.id
125 LEFT JOIN anbaugeraete ON einsatzgeraete.anbaugeraet = anbaugeraete.id
126 WHERE einsatz = einsatz.id) END
127 ',
128                                             ),
129                               'prolfdm' => array(
130                                             'name' => 'pro lfdm',
131                                             'type' => 'number',
132                                             'specs' => "decPlaces: 2, ClassName: 'alignright', suffix: '&nbsp;', canSort: false",
133                                             'width' => 60,
134                                             'sql' => '
135 ((SELECT sum(stunden * personal.persstdsatz) FROM einsatzpersonal
136 JOIN personal ON einsatzpersonal.personal = personal.id
137 WHERE einsatz = einsatz.id)
138 +
139 CASE WHEN
140 (SELECT sum(stunden * gerate.geraetkst_intern + stunden * CASE WHEN anbaugeraete.anbkst_intern IS NULL THEN 0.0 ELSE anbaugeraete.anbkst_intern END)
141 FROM einsatzgeraete
142 JOIN gerate ON einsatzgeraete.geraet = gerate.id
143 LEFT JOIN anbaugeraete ON einsatzgeraete.anbaugeraet = anbaugeraete.id
144 WHERE einsatz = einsatz.id) IS NULL THEN 0.0
145 ELSE (SELECT sum(stunden * gerate.geraetkst_intern + stunden * CASE WHEN anbaugeraete.anbkst_intern IS NULL THEN 0.0 ELSE anbaugeraete.anbkst_intern END)
146 FROM einsatzgeraete
147 JOIN gerate ON einsatzgeraete.geraet = gerate.id
148 LEFT JOIN anbaugeraete ON einsatzgeraete.anbaugeraet = anbaugeraete.id
149 WHERE einsatz = einsatz.id) END) / laenge
150 ',
151
152
153                                             ),
154                               ),
155               'details' => array(
156                                  'html' => $details,
157                                  'list' => array(
158                                                  'gebiet' => array('fetch' => fetch_gebiet),
159                                                  'kostenstelle' => array('fetch' => fetch_kostenstelle),
160                                                  'laenge' => array('fetch' => fetch_laenge),
161                                                  'gewaesserkosten' => array('fetch' => fetch_gewaesserkosten),
162                                                  'personalkosten' => array('fetch' => fetch_personalkosten),
163                                                  'geraetekosten' => array('fetch' => fetch_geraetekosten),
164                                                  'gereinigt' => array('fetch' => fetch_gereinigt),
165                                                  ),
166
167                               ),
168               );
169
170 function fetch_gebiet()
171 {
172   $sql = 'SELECT gebiet.gebiet FROM gebiet JOIN einsatz ON einsatz.gebiet = gebiet.id WHERE einsatz.id = ' . intval($_POST['id']);
173   $res = query_db($sql);
174   if ($res === false) return '';
175
176   return $res[0]['gebiet'];
177 }
178
179 function fetch_kostenstelle()
180 {
181   $sql = 'SELECT kostenstellen.kostenstelle FROM kostenstellen JOIN einsatz ON einsatz.kostenstelle = kostenstellen.id WHERE einsatz.id = ' . intval($_POST['id']);
182   $res = query_db($sql);
183   if ($res === false) return '';
184
185   return $res[0]['kostenstelle'];
186 }
187
188 function fetch_laenge()
189 {
190   $sql = 'SELECT laenge FROM kostenstellen JOIN einsatz ON einsatz.kostenstelle = kostenstellen.id WHERE einsatz.id = ' . intval($_POST['id']);
191   $res = query_db($sql);
192   if ($res === false) return '';
193
194   return $res[0]['laenge'] . ' m';
195 }
196
197 function fetch_gewaesserkosten()
198 {
199   $sql = <<<EOC
200   SELECT sum(stunden * persstdsatz) AS gesamt
201   FROM einsatzpersonal
202   JOIN personal ON einsatzpersonal.personal = personal.id
203   WHERE einsatz IN
204     (SELECT id FROM einsatz WHERE date_part('year', datum) = %d AND kostenstelle =
205     (SELECT kostenstelle FROM einsatz WHERE id = %d))
206 EOC;
207
208   $sql = sprintf($sql, $_SESSION['overview_kosten.year'], $_POST['id']);
209   $pkosten = query_db($sql);
210   if ($pkosten === false) return '';
211
212   $sql = <<<EOC
213   SELECT sum(stunden * gerate.geraetkst_intern +
214              stunden * anbaugeraete.anbkst_intern) AS gesamt
215   FROM einsatzgeraete
216   JOIN gerate ON einsatzgeraete.geraet = gerate.id
217   JOIN anbaugeraete ON einsatzgeraete.anbaugeraet = anbaugeraete.id
218   WHERE einsatz IN
219     (SELECT id FROM einsatz WHERE date_part('year', datum) = %d AND kostenstelle =
220     (SELECT kostenstelle FROM einsatz WHERE id = %d))
221 EOC;
222
223   $sql = sprintf($sql, $_SESSION['overview_kosten.year'], $_POST['id']);
224   $gkosten = query_db($sql);
225   if ($gkosten === false) return '';
226
227   return sprintf('%.2f &euro;', $pkosten[0]['gesamt'] + $gkosten[0]['gesamt']);
228 }
229
230 function fetch_personalkosten()
231 {
232   $sql = <<<EOC
233   SELECT sum(stunden * persstdsatz) AS gesamt
234   FROM einsatzpersonal
235   JOIN personal ON einsatzpersonal.personal = personal.id
236   WHERE einsatz IN
237     (SELECT id FROM einsatz WHERE date_part('year', datum) = %d AND kostenstelle =
238     (SELECT kostenstelle FROM einsatz WHERE id = %d))
239 EOC;
240
241   $sql = sprintf($sql, $_SESSION['overview_kosten.year'], $_POST['id']);
242   $res = query_db($sql);
243   if ($res === false) return '';
244
245   return sprintf('%.2f &euro;', $res[0]['gesamt']);
246 }
247
248 function fetch_geraetekosten()
249 {
250   $sql = <<<EOC
251   SELECT sum(stunden * gerate.geraetkst_intern +
252              stunden * anbaugeraete.anbkst_intern) AS gesamt
253   FROM einsatzgeraete
254   JOIN gerate ON einsatzgeraete.geraet = gerate.id
255   JOIN anbaugeraete ON einsatzgeraete.anbaugeraet = anbaugeraete.id
256   WHERE einsatz IN
257     (SELECT id FROM einsatz WHERE date_part('year', datum) = %d AND kostenstelle =
258     (SELECT kostenstelle FROM einsatz WHERE id = %d))
259 EOC;
260
261   $sql = sprintf($sql, $_SESSION['overview_kosten.year'], $_POST['id']);
262   $res = query_db($sql);
263   if ($res === false) return '';
264
265   return sprintf('%.2f &euro;', $res[0]['gesamt']);
266 }
267
268 function fetch_gereinigt()
269 {
270   $sql = <<<EOC
271   SELECT count(*) AS count
272   FROM gereinigt
273   JOIN kostenstellen ON gereinigt.kostenstelle = kostenstellen.id
274   JOIN einsatz ON einsatz.kostenstelle = kostenstellen.id
275   WHERE jahr = %d AND einsatz.id = %d
276 EOC;
277
278   $sql = sprintf($sql, $_SESSION['overview_kosten.year'], $_POST['id']);
279
280   $res = query_db($sql);
281   if ($res === false) return '';
282
283   return $res[0]['count'] == 0 ? 'nein' : 'ja';
284 }
285
286 ?>