DBUpgrade: Bei 3 alten Upgrades print Noise entfernt
[kivitendo-erp.git] / sql / Pg-upgrade2 / fix_acc_trans_ap_taxkey_bug.pl
1 # @tag: fix_acc_trans_ap_taxkey_bug
2 # @description: Korrektur falscher Steuerschlüssel in acc_trans bei Eingangsrechnungen
3 # @depends: release_2_6_0
4 package SL::DBUpgrade2::fix_acc_trans_ap_taxkey_bug;
5
6 use strict;
7 use utf8;
8
9 use parent qw(SL::DBUpgrade2::Base);
10
11 sub run {
12   my ($self) = @_;
13
14   my $q_find = <<SQL;
15     SELECT * FROM (
16       SELECT
17         -- Einige Felder zum Debuggen:
18         ap.id, c.accno, c.description AS chartdescription,
19         -- Felder, die zum eigentlichen Vergleich und zum spaeteren Update
20         -- benoetigt werden:
21         ac.acc_trans_id, ac.taxkey AS actual_taxkey,
22         -- Zum Rechnungsdatum gueltigen Steuerschluessel fuer Konto auslesen:
23         (SELECT tk.taxkey_id
24          FROM taxkeys tk
25          WHERE (tk.chart_id = c.id)
26            AND (tk.startdate <= ap.transdate)
27          ORDER BY tk.startdate DESC
28          LIMIT 1) AS wanted_taxkey
29         FROM acc_trans ac
30         LEFT JOIN ap ON (ac.trans_id = ap.id)
31         LEFT JOIN chart c ON (ac.chart_id = c.id)
32         WHERE
33           -- Nur Einkaufsrechnungen, aber keine Kreditorenbuchungen betrachten.
34               (ap.id IS NOT NULL)
35           AND ap.invoice
36           -- Nur Eintraege betrachten, die Konten bebuchen, die fuer die
37           -- jeweils aktuelle Rechnung in der dazugehoerigen Buchungsgruppe
38           -- angesprochen werden. Die Buchungsgruppen sind all diejenigen,
39           -- die in der Rechnung in mindestens einer Position ueber die
40           -- Parts verlinkt sind.
41           AND (ac.chart_id IN (
42                 -- Teil 1: Aufwandskonto der Buchungsgruppe fuer die in der
43                 -- aktuellen Rechnung ausgewaehlte Steuerzone
44                 SELECT
45                   CASE
46                     WHEN ap.taxzone_id = 0 THEN bg.expense_accno_id_0
47                     WHEN ap.taxzone_id = 1 THEN bg.expense_accno_id_1
48                     WHEN ap.taxzone_id = 2 THEN bg.expense_accno_id_2
49                     ELSE                        bg.expense_accno_id_3
50                   END
51                 FROM invoice i
52                 LEFT JOIN parts p ON (i.parts_id = p.id)
53                 LEFT JOIN buchungsgruppen bg ON (p.buchungsgruppen_id = bg.id)
54                 WHERE (i.trans_id = ap.id)
55
56                 UNION
57
58                 -- Teil 2: Inventarkonto der Buchungsgruppe fuer Nicht-Dienstleistungen
59                 SELECT bg.inventory_accno_id
60                 FROM invoice i
61                 LEFT JOIN parts p ON (i.parts_id = p.id)
62                 LEFT JOIN buchungsgruppen bg ON (p.buchungsgruppen_id = bg.id)
63                 WHERE (i.trans_id = ap.id)
64                   AND (COALESCE(p.inventory_accno_id, 0) <> 0)
65               ))
66         ORDER BY ap.id
67       ) AS the_query
68     WHERE the_query.actual_taxkey <> the_query.wanted_taxkey
69 SQL
70
71   my $q_change = <<SQL;
72     UPDATE acc_trans
73     SET taxkey = ?
74     WHERE acc_trans_id = ?
75 SQL
76
77   my $h_find   = $self->dbh->prepare($q_find)   || $self->db_error($q_find);
78   my $h_change = $self->dbh->prepare($q_change) || $self->db_error($q_change);
79
80   $h_find->execute() || $self->db_error($q_find);
81
82   my $num_changed = 0;
83
84   while (my $ref = $h_find->fetchrow_hashref()) {
85     # $::lxdebug->dump(0, "ref", $ref);
86     $h_change->execute($ref->{wanted_taxkey}, $ref->{acc_trans_id}) || $self->db_error($q_change);
87     $num_changed++;
88   }
89
90   $h_find->finish();
91   $h_change->finish();
92
93 #  print $::locale->text('Number of entries changed: #1', $num_changed) . "<br/>\n";
94
95   return 1;
96 }
97
98 1;