Update-Script für constraints in der acc_trans
[kivitendo-erp.git] / sql / Pg-upgrade2 / acc_trans_constraints.pl
1 # @tag: acc_trans_constraints
2 # @description: Fügt NOT-NULL-Constraints ein für die Spalten
3 # @depends:
4 # @charset: UTF-8
5
6 use utf8;
7 use strict;
8
9 die("This script cannot be run from the command line.") unless ($main::form);
10
11 sub mydberror {
12   my ($msg) = @_;
13   die($dbup_locale->text("Database update error:") . "<br>$msg<br>" . $DBI::errstr);
14 }
15
16 sub do_query {
17   my ($query, $may_fail) = @_;
18
19   if (!$dbh->do($query)) {
20     mydberror($query) unless ($may_fail);
21     $dbh->rollback();
22     $dbh->begin_work();
23   }
24 }
25
26 sub do_update {
27   my $query = qq|SELECT count(*) FROM acc_trans WHERE chart_id IS NULL|;
28   my ($no_chart_id) = $dbh->selectrow_array($query);
29   $query = qq|SELECT count(*) FROM acc_trans WHERE trans_id IS NULL|;
30   my ($no_trans_id) = $dbh->selectrow_array($query);
31
32   $form->{no_chart_id}=$no_chart_id;
33   $form->{no_trans_id}=$no_trans_id;
34
35   if ($no_chart_id > 0 or $no_trans_id > 0){
36     #list all invalid transactions where only chart_id is null:
37     $query = qq|SELECT acc.acc_trans_id,
38                   acc.gldate,
39                   acc.transdate,
40                   ABS(acc.amount) AS amount,
41                   acc.trans_id,
42                   acc.source,
43                   gl.reference,
44                   gl.description,
45                   gl.notes,
46                   e.name,
47                   e.login AS user,
48                   p.projectnumber,
49                   p.description AS projectdescription
50                 FROM acc_trans acc
51                 JOIN gl ON (gl.id=acc.trans_id)
52                 LEFT JOIN employee e ON (gl.employee_id=e.id)
53                 LEFT JOIN project p ON (p.id=acc.project_id)
54                 WHERE acc.chart_id IS NULL
55
56                 UNION
57
58                 SELECT acc.acc_trans_id,
59                   acc.gldate,
60                   acc.transdate,
61                   ABS(acc.amount) AS amount,
62                   acc.trans_id,
63                   acc.source,
64                   a.invnumber AS reference,
65                   c.name AS description,
66                   a.notes,
67                   e.name,
68                   e.login AS user,
69                   p.projectnumber,
70                   p.description AS projectdescription
71                 FROM acc_trans acc
72                 JOIN ar a ON (a.id=acc.trans_id)
73                 LEFT JOIN employee e ON (a.employee_id=e.id)
74                 LEFT JOIN customer c ON (a.customer_id=c.id)
75                 LEFT JOIN project p ON (p.id=acc.project_id)
76                 WHERE acc.chart_id IS NULL
77
78                 UNION
79
80                 SELECT acc.acc_trans_id,
81                   acc.gldate,
82                   acc.transdate,
83                   ABS(acc.amount) AS amount,
84                   acc.trans_id,
85                   acc.source,
86                   a.invnumber AS reference,
87                   v.name AS description,
88                   a.notes,
89                   e.name,
90                   e.login AS user,
91                   p.projectnumber,
92                   p.description AS projectdescription
93                 FROM acc_trans acc
94                 JOIN ap a ON (a.id=acc.trans_id)
95                 LEFT JOIN employee e ON (a.employee_id=e.id)
96                 LEFT JOIN vendor v ON (a.vendor_id=v.id)
97                 LEFT JOIN project p ON (p.id=acc.project_id)
98                 WHERE acc.chart_id IS NULL;|;
99
100     my $sth = $dbh->prepare($query);
101     $sth->execute || $main::form->dberror($query);
102
103     $main::form->{NO_CHART_ID} = [];
104     while (my $ref = $sth->fetchrow_hashref("NAME_lc")) {
105       map {$ref->{$_} = $::locale->{iconv_utf8}->convert($ref->{$_})} keys %$ref;
106       push @{ $main::form->{NO_CHART_ID} }, $ref;
107     }
108     $sth->finish;
109
110     #List all invalid transactions where trans_id is null:
111     $query = qq|SELECT acc.acc_trans_id,
112                   acc.gldate,
113                   acc.transdate,
114                   ABS(acc.amount) AS amount,
115                   acc.source,
116                   c.accno,
117                   c.description,
118                   c.category,
119                   p.projectnumber,
120                   p.description AS projectdescription
121                 FROM acc_trans acc
122                 LEFT JOIN chart c ON (c.id=acc.chart_id)
123                 LEFT JOIN project p ON (p.id=acc.project_id)
124                 WHERE acc.trans_id IS NULL;|;
125
126     $sth = $dbh->prepare($query);
127     $sth->execute || $main::form->dberror($query);
128
129     $main::form->{NO_TRANS_ID} = [];
130     while (my $ref = $sth->fetchrow_hashref("NAME_lc")) {
131       map {$ref->{$_} = $::locale->{iconv_utf8}->convert($ref->{$_})} keys %$ref;
132       $ref->{category} = ($ref->{category} eq 'A') ? $::locale->text('Account Category A')
133         : ($ref->{category} eq 'E') ? $::locale->text('Account Category E')
134         : ($ref->{category} eq 'L') ? $::locale->text('Account Category L')
135         : ($ref->{category} eq 'I') ? $::locale->text('Account Category I')
136         : ($ref->{category} eq 'Q') ? $::locale->text('Account Category Q')
137         : ($ref->{category} eq 'C') ? $::locale->text('Account Category C')
138         : ($ref->{category} eq 'G') ? $::locale->text('Account Category G')
139         : $::locale->text('Unknown Category') . ': ' . $ref->{category};
140       push @{ $main::form->{NO_TRANS_ID} }, $ref;
141     }
142     $sth->finish;
143
144     print_error_message();
145     return 0;
146   }
147
148   $query = qq|ALTER TABLE acc_trans ALTER COLUMN chart_id SET NOT NULL;|;
149   $query .= qq|ALTER TABLE acc_trans ALTER COLUMN trans_id SET NOT NULL;|;
150
151   do_query($query);
152   return 1;
153 }
154
155 sub print_error_message {
156   print $main::form->parse_html_template("dbupgrade/acc_trans_constraints");
157 }
158
159 return do_update();