Merge von 704,707,730,731 aus unstable: USTVA Bugfix
[kivitendo-erp.git] / SL / USTVA.pm
1 #=====================================================================
2 # Lx-Office ERP
3 # Copyright (c) 2004 by Udo Spallek, Aachen
4 #
5 #  Author: Udo Spallek
6 #   Email: udono@gmx.net
7 #     Web: http://www.lx-office.org
8 #
9 #
10 # This program is free software; you can redistribute it and/or modify
11 # it under the terms of the GNU General Public License as published by
12 # the Free Software Foundation; either version 2 of the License, or
13 # (at your option) any later version.
14 #
15 # This program is distributed in the hope that it will be useful,
16 # but WITHOUT ANY WARRANTY; without even the implied warranty of
17 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 # GNU General Public License for more details.
19 # You should have received a copy of the GNU General Public License
20 # along with this program; if not, write to the Free Software
21 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 #======================================================================
23 # Utilities for ustva
24 #=====================================================================
25
26 package USTVA;
27
28 sub create_steuernummer {
29   $main::lxdebug->enter_sub();
30
31   $part           = $form->{part};
32   $patterncount   = $form->{patterncount};
33   $delimiter      = $form->{delimiter};
34   $elster_pattern = $form->{elster_pattern};
35
36   # rebuild steuernummer and elstersteuernummer
37   # es gibt eine gespeicherte steuernummer $form->{steuernummer}
38   # und die parts und delimiter
39
40   my $h = 0;
41   my $i = 0;
42
43   $steuernummer_new       = $part;
44   $elstersteuernummer_new = $elster_FFFF;
45   $elstersteuernummer_new .= '0';
46
47   for ($h = 1; $h < $patterncount; $h++) {
48     $steuernummer_new .= qq|$delimiter|;
49     for ($i = 1; $i <= length($elster_pattern); $i++) {
50       $steuernummer_new       .= $form->{"part_$h\_$i"};
51       $elstersteuernummer_new .= $form->{"part_$h\_$i"};
52     }
53   }
54   if ($form->{steuernummer} ne $steuernummer_new) {
55     $form->{steuernummer}       = $steuernummer_new;
56     $form->{elstersteuernummer} = $elstersteuernummer_new;
57     $form->{steuernummer_new}   = $steuernummer_new;
58   }
59   $main::lxdebug->leave_sub();
60   return ($steuernummer_new, $elstersteuernummer_new);
61 }
62
63 sub steuernummer_input {
64   $main::lxdebug->enter_sub();
65
66   ($elsterland, $elsterFFFF, $steuernummer) = @_;
67
68   $elster_land  = $elsterland;
69   $elster_FFFF  = $elsterFFFF;
70   $steuernummer = '0000000000' if ($steuernummer eq '');
71
72   # $steuernummer formatieren (nur Zahlen) -> $stnr
73   $stnr = $steuernummer;
74   $stnr =~ s/\D+//g;
75
76   #Pattern description Elstersteuernummer
77   my %elster_STNRformat = (
78                         'Mecklenburg Vorpommern' => 'FFF/BBB/UUUUP',    # '/' 3
79                         'Hessen'                 => '0FF BBB UUUUP',    # ' ' 3
80                         'Nordrhein Westfalen'    => 'FFF/BBBB/UUUP',    # '/' 3
81                         'Schleswig Holstein'     => 'FF BBB UUUUP',     # ' ' 2
82                         'Berlin'                 => 'FF/BBB/UUUUP',     # '/' 3
83                         'Thüringen'              => 'FFF/BBB/UUUUP',    # '/' 3
84                         'Sachsen'                => 'FFF/BBB/UUUUP',    # '/' 3
85                         'Hamburg'                => 'FF/BBB/UUUUP',     # '/' 3
86                         'Baden Würtemberg'       => 'FF/BBB/UUUUP',     # '/' 2
87                         'Sachsen Anhalt'         => 'FFF/BBB/UUUUP',    # '/' 3
88                         'Saarland'               => 'FFF/BBB/UUUUP',    # '/' 3
89                         'Bremen'                 => 'FF BBB UUUUP',     # ' ' 3
90                         'Bayern'                 => 'FFF/BBB/UUUUP',    # '/' 3
91                         'Rheinland Pfalz'        => 'FF/BBB/UUUU/P',    # '/' 4
92                         'Niedersachsen'          => 'FF/BBB/UUUUP',     # '/' 3
93                         'Brandenburg'            => 'FFF/BBB/UUUUP',    # '/' 3
94   );
95
96   #split the pattern
97   $elster_pattern = $elster_STNRformat{$elster_land};
98   my @elster_pattern = split(' ', $elster_pattern);
99   my $delimiter      = '&nbsp;';
100   my $patterncount   = @elster_pattern;
101   if ($patterncount < 2) {
102     @elster_pattern = ();
103     @elster_pattern = split('/', $elster_pattern);
104     $delimiter      = '/';
105     $patterncount   = @elster_pattern;
106   }
107
108   # no we have an array of patternparts and a delimiter
109   # create the first automated and fixed part and delimiter
110
111   print qq|<b><font size="+1">|;
112   $part = '';
113 SWITCH: {
114     $elster_pattern[0] eq 'FFF' && do {
115       $part = substr($elster_FFFF, 1, 4);
116       print qq|$part|;
117       last SWITCH;
118     };
119     $elster_pattern[0] eq '0FF' && do {
120       $part = '0' . substr($elster_FFFF, 2, 4);
121       print qq|$part|;
122       last SWITCH;
123     };
124     $elster_pattern[0] eq 'FF' && do {
125       $part = substr($elster_FFFF, 2, 4);
126       print qq|$part|;
127       last SWITCH;
128     };
129     1 == 1 && do {
130       print qq|Fehler!|;
131       last SWITCH;
132     };
133   }
134
135   #now the rest of the Steuernummer ...
136   print qq|</b></font>|;
137   print qq|\n
138            <input type=hidden name="elster_pattern" value="$elster_pattern">
139            <input type=hidden name="patterncount" value="$patterncount">
140            <input type=hidden name="patternlength" value="$patterncount">
141            <input type=hidden name="delimiter" value="$delimiter">
142            <input type=hidden name="part" value="$part">
143   |;
144   my $h = 0;
145   my $i = 0;
146   my $j = 0;
147   $k = 0;
148
149   for ($h = 1; $h < $patterncount; $h++) {
150     print qq|&nbsp;$delimiter&nbsp;\n|;
151     for ($i = 1; $i <= length($elster_pattern[$h]); $i++) {
152       print qq|<select name="part_$h\_$i">\n|;
153
154       for ($j = 0; $j <= 9; $j++) {
155         print qq|      <option value="$j"|;
156         if ($steuernummer ne '') {
157           if ($j eq substr($stnr, length($part) + $k, 1)) {
158             print qq| selected|;
159           }
160         }
161         print qq|>$j</option>\n|;
162       }
163       $k++;
164       print qq|</select>\n|;
165     }
166   }
167   $main::lxdebug->leave_sub();
168 }
169
170 sub fa_auswahl {
171   $main::lxdebug->enter_sub();
172
173   use SL::Form;
174
175   # Referenz wird übergeben, hash of hash wird nicht
176   # in neues  Hash kopiert, sondern direkt über die Referenz verändert
177   # Prototyp für diese Konstruktion
178
179   my ($land, $elsterFFFF, $elster_init) =
180     @_;    #Referenz auf Hash von Hash übergeben
181   my $terminal = '';
182   my $FFFF     = $elsterFFFF;
183   my $ffff     = '';
184   my $checked  = '';
185   $checked = 'checked' if ($elsterFFFF eq '' and $land eq '');
186
187   #if ($ENV{HTTP_USER_AGENT} =~ /(mozilla|opera|w3m)/i){
188   #$terminal='mozilla';
189   #} elsif ($ENV{HTTP_USER_AGENT} =~ /(links|lynx)/i){
190   #$terminal = 'lynx';
191   #}
192
193   #if ( $terminal eq 'mozilla' or $terminal eq 'js' ) {
194   print qq|
195         <br>
196         <script language="Javascript">
197         function update_auswahl()
198         {
199                 var elsterBLAuswahl = document.verzeichnis.elsterland_new;
200                 var elsterFAAuswahl = document.verzeichnis.elsterFFFF_new;
201
202                 elsterFAAuswahl.options.length = 0; // dropdown aufräumen
203                 |;
204
205   foreach $elster_land (sort keys %$elster_init) {
206     print qq|
207                if (elsterBLAuswahl.options[elsterBLAuswahl.selectedIndex].
208                value == "$elster_land")
209                {
210                |;
211     my $j              = 0;
212     my %elster_land_fa = ();
213     $FFFF = '';
214     for $FFFF (keys %{ $elster_init->{$elster_land} }) {
215       $elster_land_fa{$FFFF} = $elster_init->{$elster_land}->{$FFFF}->[0];
216     }
217     foreach $ffff (sort { $elster_land_fa{$a} cmp $elster_land_fa{$b} }
218                    keys(%elster_land_fa)) {
219       print qq|
220                    elsterFAAuswahl.options[$j] = new Option("$elster_land_fa{$ffff} ($ffff)","$ffff");|;
221       $j++;
222     }
223     print qq|
224                }|;
225   }
226   print qq|
227         }
228         </script>
229
230         <table width="100%">
231           <tr>
232             <td>
233                Bundesland
234             </td>
235             <td>
236               <select size="1" name="elsterland_new" onchange="update_auswahl()">|;
237   if ($land eq '') {
238     print qq|<option value="Auswahl" $checked>hier auswählen...</option>\n|;
239   }
240   foreach $elster_land (sort keys %$elster_init) {
241     print qq|
242                   <option value="$elster_land"|;
243     if ($elster_land eq $land and $checked eq '') {
244       print qq| selected|;
245     }
246     print qq|>$elster_land</option>
247              |;
248   }
249   print qq|
250             </td>
251           </tr>
252           |;
253
254   my $elster_land = '';
255   $elster_land = ($land ne '') ? $land : '';
256   %elster_land_fa = ();
257   for $FFFF (keys %{ $elster_init->{$elster_land} }) {
258     $elster_land_fa{$FFFF} = $elster_init->{$elster_land}->{$FFFF}->[0];
259   }
260
261   print qq|
262            <tr>
263               <td>Finanzamt
264               </td>
265               <td>
266                  <select size="1" name="elsterFFFF_new">|;
267   if ($elsterFFFF eq '') {
268     print qq|<option value="Auswahl" $checked>hier auswählen...</option>|;
269   } else {
270     foreach $ffff (sort { $elster_land_fa{$a} cmp $elster_land_fa{$b} }
271                    keys(%elster_land_fa)) {
272
273       print qq|
274                         <option value="$ffff"|;
275       if ($ffff eq $elsterFFFF and $checked eq '') {
276         print qq| selected|;
277       }
278       print qq|>$elster_land_fa{$ffff} ($ffff)</option>|;
279     }
280   }
281   print qq|
282                  </td>
283               </tr>
284             </table>
285             </select>|;
286
287   $main::lxdebug->leave_sub();
288 }
289
290 sub info {
291   $main::lxdebug->enter_sub();
292
293   my $msg = $_[0];
294
295   if ($ENV{HTTP_USER_AGENT}) {
296     $msg =~ s/\n/<br>/g;
297
298     print qq|<body><h2 class=info>Hinweis</h2>
299
300     <p><b>$msg</b>
301     <br>
302     <br>
303     <hr>
304     <input type=button value="zurück" onClick="history.go(-1)">
305     </body>
306     |;
307
308     exit;
309
310   } else {
311
312     if ($form->{error_function}) {
313       &{ $form->{error_function} }($msg);
314     } else {
315       die "Hinweis: $msg\n";
316     }
317   }
318
319   $main::lxdebug->leave_sub();
320 }
321
322 sub stichtag {
323   $main::lxdebug->enter_sub();
324
325   # noch nicht fertig
326   # soll mal eine Erinnerungsfunktion für USTVA Abgaben werden, die automatisch
327   # den Termin der nächsten USTVA anzeigt.
328   #
329   #
330   my ($today, $FA_dauerfrist, $FA_voranmeld) = @_;
331
332   #$today zerlegen:
333
334   #$today =today * 1;
335   $today =~ /(\d\d\d\d)(\d\d)(\d\d)/;
336   $year     = $1;
337   $month    = $2;
338   $day      = $3;
339   $yy       = $year;
340   $mm       = $month;
341   $yymmdd   = "$year$month$day" * 1;
342   $mmdd     = "$month$day" * 1;
343   $stichtag = '';
344
345   #$tage_bis = '1234';
346   #$ical = '...vcal format';
347
348   #if ($FA_voranmeld eq 'month'){
349
350   %liste = ("0110" => 'December',
351             "0210" => 'January',
352             "0310" => 'February',
353             "0410" => 'March',
354             "0510" => 'April',
355             "0610" => 'May',
356             "0710" => 'June',
357             "0810" => 'July',
358             "0910" => 'August',
359             "1010" => 'September',
360             "1110" => 'October',
361             "1210" => 'November');
362
363   #$mm += $dauerfrist
364   #$month *= 1;
365   $month += 1 if ($day > 10);
366   $month    = sprintf("%02d", $month);
367   $stichtag = $year . $month . "10";
368   $ust_va   = $month . "10";
369
370   foreach $date (%liste) {
371     $ust_va = $liste{$date} if ($date eq $stichtag);
372   }
373
374   #} elsif ($FA_voranmeld eq 'quarter'){
375   #1;
376
377   #}
378
379   #@stichtag = ('10.04.2004', '10.05.2004');
380
381   #@liste = ['0110', '0210', '0310', '0410', '0510', '0610', '0710', '0810', '0910',
382   #          '1010', '1110', '1210', ];
383   #
384   #foreach $key (@liste){
385   #  #if ($ddmm < ('0110' * 1));
386   #  if ($ddmm ){}
387   #  $stichtag = $liste[$key - 1] if ($ddmm > $key);
388   #
389   #}
390   #
391   #$stichtag =~ /([\d]\d)(\d\d)$/
392   #$stichtag = "$1.$2.$yy"
393   #$stichtag=$1;
394   $main::lxdebug->leave_sub();
395   return ($stichtag, $description, $tage_bis, $ical);
396 }
397
398 sub query_finanzamt {
399   $main::lxdebug->enter_sub();
400
401   my ($myconfig, $form) = @_;
402   my $dbh = $form->dbconnect($myconfig) or $self->error(DBI->errstr);
403
404   #Test, if table finanzamt exist
405   my $table    = 'finanzamt';
406   my $filename = "sql/$table.sql";
407
408   my $tst = $dbh->prepare("SELECT * FROM $table");
409   $tst->execute;
410   if ($DBI::err) {
411
412     #There is no table, read the table from sql/finanzamt.sql
413     print qq|<p>Bitte warten, Tabelle $table wird einmalig in Datenbank:
414     $myconfig->{dbname} als Benutzer: $myconfig->{dbuser} hinzugefügt...</p>|;
415     process_query($form, $dbh, $filename) || $self->error(DBI->errstr);
416
417     #execute second last call
418     my $dbh = $form->dbconnect($myconfig) or $self->error(DBI->errstr);
419     $dbh->disconnect();
420   }
421   $tst->finish();
422
423   #$dbh->disconnect();
424
425   my @vars = (
426     'FA_Land_Nr',             #  0
427     'FA_BUFA_Nr',             #  1
428                               #'FA_Verteiler',                          #  2
429     'FA_Name',                #  3
430     'FA_Strasse',             #  4
431     'FA_PLZ',                 #  5
432     'FA_Ort',                 #  6
433     'FA_Telefon',             #  7
434     'FA_Fax',                 #  8
435     'FA_PLZ_Grosskunden',     #  9
436     'FA_PLZ_Postfach',        # 10
437     'FA_Postfach',            # 11
438     'FA_BLZ_1',               # 12
439     'FA_Kontonummer_1',       # 13
440     'FA_Bankbezeichnung_1',   # 14
441                               #'FA_BankIBAN_1',                         # 15
442                               #'FA_BankBIC_1',                          # 16
443                               #'FA_BankInhaber_BUFA_Nr_1',                      # 17
444     'FA_BLZ_2',               # 18
445     'FA_Kontonummer_2',       # 19
446     'FA_Bankbezeichnung_2',   # 20
447                               #'FA_BankIBAN_2',                         # 21
448                               #'FA_BankBIC_2',                          # 22
449                               #'FA_BankInhaber_BUFA_Nr_2',                      # 23
450     'FA_Oeffnungszeiten',     # 24
451     'FA_Email',               # 25
452     'FA_Internet'             # 26
453                               #'FA_zustaendige_Hauptstelle_BUFA_Nr',            # 27
454                               #'FA_zustaendige_vorgesetzte_Finanzbehoerde'      # 28
455   );
456
457   my $field = join(', ', @vars);
458
459   my $query = "SELECT $field FROM finanzamt ORDER BY FA_Land_nr";
460   my $sth = $dbh->prepare($query) or $self->error($dbh->errstr);
461   $sth->execute || $form->dberror($query);
462   my $array_ref = $sth->fetchall_arrayref();
463   my $land      = '';
464   foreach my $row (@$array_ref) {
465     my $FA_finanzamt = $row;
466     $land = 'Schleswig Holstein'     if (@$FA_finanzamt[0] eq '1');
467     $land = 'Hamburg'                if (@$FA_finanzamt[0] eq '2');
468     $land = 'Niedersachsen'          if (@$FA_finanzamt[0] eq '3');
469     $land = 'Bremen'                 if (@$FA_finanzamt[0] eq '4');
470     $land = 'Nordrhein Westfalen'    if (@$FA_finanzamt[0] eq '5');
471     $land = 'Hessen'                 if (@$FA_finanzamt[0] eq '6');
472     $land = 'Rheinland Pfalz'        if (@$FA_finanzamt[0] eq '7');
473     $land = 'Baden Würtemberg'       if (@$FA_finanzamt[0] eq '8');
474     $land = 'Bayern'                 if (@$FA_finanzamt[0] eq '9');
475     $land = 'Saarland'               if (@$FA_finanzamt[0] eq '10');
476     $land = 'Berlin'                 if (@$FA_finanzamt[0] eq '11');
477     $land = 'Brandenburg'            if (@$FA_finanzamt[0] eq '12');
478     $land = 'Mecklenburg Vorpommern' if (@$FA_finanzamt[0] eq '13');
479     $land = 'Sachsen'                if (@$FA_finanzamt[0] eq '14');
480     $land = 'Sachsen Anhalt'         if (@$FA_finanzamt[0] eq '15');
481     $land = 'Thüringen'              if (@$FA_finanzamt[0] eq '16');
482
483     my $ffff = @$FA_finanzamt[1];
484
485     my $rec = {};
486     $rec->{$land} = $ffff;
487
488     shift @$row;
489     shift @$row;
490
491     $finanzamt{$land}{$ffff} = [@$FA_finanzamt];
492   }
493
494   $sth->finish();
495   $dbh->disconnect();
496
497   $main::lxdebug->leave_sub();
498
499   return \%finanzamt;
500 }
501
502 sub process_query {
503   $main::lxdebug->enter_sub();
504
505   # Copyright D. Simander -> SL::Form under Gnu GPL.
506   my ($form, $dbh, $filename) = @_;
507
508   #  return unless (-f $filename);
509
510   open(FH, "$filename") or $form->error("$filename : $!\n");
511   my $query = "";
512   my $sth;
513   my @quote_chars;
514
515   while (<FH>) {
516
517     # Remove DOS and Unix style line endings.
518     s/[\r\n]//g;
519
520     # don't add comments or empty lines
521     next if /^(--.*|\s+)$/;
522
523     for (my $i = 0; $i < length($_); $i++) {
524       my $char = substr($_, $i, 1);
525
526       # Are we inside a string?
527       if (@quote_chars) {
528         if ($char eq $quote_chars[-1]) {
529           pop(@quote_chars);
530         }
531         $query .= $char;
532
533       } else {
534         if (($char eq "'") || ($char eq "\"")) {
535           push(@quote_chars, $char);
536
537         } elsif ($char eq ";") {
538
539           # Query is complete. Send it.
540
541           $sth = $dbh->prepare($query);
542           $sth->execute || $form->dberror($query);
543           $sth->finish;
544
545           $char  = "";
546           $query = "";
547         }
548
549         $query .= $char;
550       }
551     }
552   }
553
554   close FH;
555
556   $main::lxdebug->leave_sub();
557 }
558
559
560 sub ustva {
561   $main::lxdebug->enter_sub();
562
563   my ($self, $myconfig, $form) = @_;
564
565   # connect to database
566   my $dbh = $form->dbconnect($myconfig);
567
568   my $last_period     = 0;
569   my $category        = "pos_ustva";
570   my @categories_cent = qw(511 861 36 80 971 931 98 96 53 74 
571                            85 65 66 61 62 67 63 64 59 69 39 83 
572                            Z43 Z45 Z53 Z62 Z65 Z67);
573                            
574   my @categories_euro = qw(41 44 49 43 48 51 86 35 77 76 91 97 93 
575                            95 94 42 60 45 52 73 84);
576
577   $form->{decimalplaces} *= 1;
578
579   foreach $item (@categories_cent) {
580     $form->{"$item"} = 0;
581   }
582   foreach $item (@categories_euro) {
583     $form->{"$item"} = 0;
584   }
585
586
587   &get_accounts_ustva($dbh, $last_period, $form->{fromdate}, $form->{todate},
588                   $form, $category);
589
590
591   #
592   # Berechnung der USTVA Formularfelder
593   #
594   $form->{"51r"} = $form->{"511"};
595   $form->{"86r"} = $form->{"861"};
596   $form->{"97r"} = $form->{"971"};
597   $form->{"93r"} = $form->{"931"};
598   $form->{"Z43"} = $form->{"511"}+ $form->{"861"} + 
599                    $form->{"36"} + $form->{"80"}  +
600                    $form->{"971"}+ $form->{"931"} + 
601                    $form->{"96"} + $form->{"98"};
602   $form->{"Z45"} = $form->{"Z43"};
603   $form->{"Z53"} = $form->{"Z43"};
604   $form->{"Z62"} = $form->{"Z43"}- $form->{"66"} -
605                    $form->{"61"} - $form->{"62"} -
606                    $form->{"63"} - $form->{"64"} -
607                    $form->{"59"};
608   $form->{"Z65"} = $form->{"Z62"}- $form->{"69"};
609   $form->{"83"}  = $form->{"Z65"}- $form->{"39"};
610   
611   foreach $item (@categories_cent) {
612     $form->{$item} =
613       $form->format_amount($myconfig, $form->round_amount($form->{$item}, 2), 2, '0');
614   }
615
616   foreach $item (@categories_euro) {
617     $form->{$item} =
618       $form->format_amount($myconfig, $form->round_amount($form->{$item}, 0), 0, '0');
619   }
620
621   $dbh->disconnect;
622
623   $main::lxdebug->leave_sub();
624 }
625
626 sub get_accounts_ustva {
627   $main::lxdebug->enter_sub();
628
629   my ($dbh, $last_period, $fromdate, $todate, $form, $category) = @_;
630
631   my ($null, $department_id) = split /--/, $form->{department};
632
633   my $query;
634   my $dpt_where;
635   my $dpt_join;
636   my $project;
637   my $where    = "1 = 1";
638   my $glwhere  = "";
639   my $subwhere = "";
640   my $ARwhere = "";
641   my $arwhere = "";
642   my $item;
643
644   if ($fromdate) {
645     if ($form->{method} eq 'cash') {
646       $subwhere .= " AND transdate >= '$fromdate'";
647       $glwhere = " AND ac.transdate >= '$fromdate'";
648       $ARwhere .= " AND acc.transdate >= '$fromdate'";
649       $where .= " AND ac.transdate >= '$fromdate'";
650       
651     }
652   }
653
654   if ($todate) {
655     $where    .= " AND ac.transdate <= '$todate'";
656     $ARwhere    .= " AND acc.transdate <= '$todate'";
657     $subwhere .= " AND transdate <= '$todate'";
658   }
659
660   if ($department_id) {
661     $dpt_join = qq|
662                JOIN department t ON (a.department_id = t.id)
663                   |;
664     $dpt_where = qq|
665                AND t.id = $department_id
666                    |;
667   }
668
669   if ($form->{project_id}) {
670     $project = qq|
671                  AND ac.project_id = $form->{project_id}
672                  |;
673   }
674
675   if ($form->{method} eq 'cash') {
676
677     $query = qq|
678
679  SELECT
680    SUM( ac.amount *
681       -- Bezahlt / Rechnungssumme
682      ( 
683        SELECT SUM(acc.amount)
684        FROM acc_trans acc
685        INNER JOIN chart c ON (acc.chart_id = c.id AND c.link like '%AR_paid%')
686        WHERE
687         1=1 
688         $ARwhere
689         AND acc.trans_id = ac.trans_id
690         )
691      / 
692      ( 
693       select amount from ar where id = ac.trans_id  
694      )
695    ) AS amount,
696    c.pos_ustva
697    FROM acc_trans ac
698    JOIN chart c ON (c.id = ac.chart_id)
699    --JOIN ar ON (ar.id = ac.trans_id)
700    where 
701      1=1 
702      -- Here no where, please. All Transactions ever should be
703      -- testet if they are paied in the USTVA report period.
704    GROUP BY c.pos_ustva
705         UNION
706
707                  SELECT sum(ac.amount) AS amount,
708                  c.$category
709                  FROM acc_trans ac
710                  JOIN chart c ON (c.id = ac.chart_id)
711                  JOIN ap a ON (a.id = ac.trans_id)
712                  $dpt_join
713                  WHERE $where
714                  $dpt_where
715                  AND ac.trans_id IN
716                    (
717                      SELECT trans_id
718                      FROM acc_trans
719                      JOIN chart ON (chart_id = id)
720                      WHERE link LIKE '%AP_amount%'
721                      $subwhere
722                    )
723
724                  $project
725                  GROUP BY c.$category
726
727         UNION
728
729                  SELECT sum(ac.amount) AS amount,
730                  c.$category
731                  FROM acc_trans ac
732                  JOIN chart c ON (c.id = ac.chart_id)
733                  JOIN gl a ON (a.id = ac.trans_id)
734                  $dpt_join
735                  WHERE $where
736                  $glwhere
737                  $dpt_from
738                  AND NOT (c.link = 'AR' OR c.link = 'AP')
739                  $project
740                  GROUP BY c.$category
741
742                  |;
743
744     if ($form->{project_id}) {
745
746       $query .= qq|
747
748          UNION
749
750                  SELECT SUM(ac.sellprice * ac.qty) AS amount,
751                  c.$category
752                  FROM invoice ac
753                  JOIN ar a ON (a.id = ac.trans_id)
754                  JOIN parts p ON (ac.parts_id = p.id)
755                  JOIN chart c on (p.income_accno_id = c.id)
756                  $dpt_join
757         -- use transdate from subwhere
758                  WHERE 1 = 1 $subwhere
759                  AND c.category = 'I'
760                  $dpt_where
761                  AND ac.trans_id IN
762                    (
763                      SELECT trans_id
764                      FROM acc_trans
765                      JOIN chart ON (chart_id = id)
766                      WHERE link LIKE '%AR_paid%'
767                      $subwhere
768                    )
769
770                  $project
771                  GROUP BY c.$category
772
773          UNION
774
775                  SELECT SUM(ac.sellprice) AS amount,
776                  c.$category
777                  FROM invoice ac
778                  JOIN ap a ON (a.id = ac.trans_id)
779                  JOIN parts p ON (ac.parts_id = p.id)
780                  JOIN chart c on (p.expense_accno_id = c.id)
781                  $dpt_join
782                  WHERE 1 = 1 $subwhere
783                  AND c.category = 'E'
784                  $dpt_where
785                  AND ac.trans_id IN
786                    (
787                      SELECT trans_id
788                      FROM acc_trans
789                      JOIN chart ON (chart_id = id)
790                      WHERE link LIKE '%AP_paid%'
791                      $subwhere
792                    )
793
794                  $project
795                  GROUP BY c.$category
796                  |;
797     }
798
799   } else {
800
801     if ($department_id) {
802       $dpt_join = qq|
803               JOIN dpt_trans t ON (t.trans_id = ac.trans_id)
804               |;
805       $dpt_where = qq|
806                AND t.department_id = $department_id
807               |;
808     }
809
810     $query = qq|
811
812                  SELECT sum(ac.amount) AS amount,
813                  c.$category
814                  FROM acc_trans ac
815                  JOIN chart c ON (c.id = ac.chart_id)
816                  $dpt_join
817                  WHERE $where
818                  $dpt_where
819                  $project
820                  GROUP BY c.$category
821                  |;
822
823     if ($form->{project_id}) {
824
825       $query .= qq|
826
827         UNION
828
829                  SELECT SUM(ac.sellprice * ac.qty) AS amount,
830                  c.$category
831                  FROM invoice ac
832                  JOIN ar a ON (a.id = ac.trans_id)
833                  JOIN parts p ON (ac.parts_id = p.id)
834                  JOIN chart c on (p.income_accno_id = c.id)
835                  $dpt_join
836         -- use transdate from subwhere
837                  WHERE 1 = 1 $subwhere
838                  AND c.category = 'I'
839                  $dpt_where
840                  $project
841                  GROUP BY c.$category
842
843         UNION
844
845                  SELECT SUM(ac.sellprice * ac.qty) * -1 AS amount,
846                  c.$category
847                  FROM invoice ac
848                  JOIN ap a ON (a.id = ac.trans_id)
849                  JOIN parts p ON (ac.parts_id = p.id)
850                  JOIN chart c on (p.expense_accno_id = c.id)
851                  $dpt_join
852                  WHERE 1 = 1 $subwhere
853                  AND c.category = 'E'
854                  $dpt_where
855                  $project
856                  GROUP BY c.$category
857                  |;
858
859     }
860   }
861
862   my @accno;
863   my $accno;
864   my $ref;
865   #print $query;
866   my $sth = $dbh->prepare($query);
867   $sth->execute || $form->dberror($query);
868
869   while ($ref = $sth->fetchrow_hashref(NAME_lc)) {
870     if ($ref->{amount} < 0) {
871       $ref->{amount} *= -1;
872     }
873     if ($category eq "pos_bwa") {
874       if ($last_period) {
875         $form->{ $ref->{$category} }{kumm} += $ref->{amount};
876       } else {
877         $form->{ $ref->{$category} }{jetzt} += $ref->{amount};
878       }
879     } else {
880       $form->{ $ref->{$category} } += $ref->{amount};
881     }
882   }
883   $sth->finish;
884
885   $main::lxdebug->leave_sub();
886 }
887
888
889 1;