]> wagnertech.de Git - mfinanz.git/blob - sql/Pg-upgrade2/currencies.pl
Artikelsuchmaske auf L.checkbox_tag/L.radio_button_tag umgestellt
[mfinanz.git] / sql / Pg-upgrade2 / currencies.pl
1 # @tag: currencies
2 # @description: Erstellt neue Tabelle currencies. Währungen können dann einfacher eingegeben und unkritisch geändert werden.
3 # @depends: release_3_0_0 rm_whitespaces
4
5 package SL::DBUpgrade2::currencies;
6
7 use utf8;
8 use strict;
9
10 use parent qw(SL::DBUpgrade2::Base);
11
12
13 sub run {
14   my ($self) = @_;
15   #Check wheather default currency exists
16   my $query = qq|SELECT curr FROM defaults|;
17   my ($currencies) = $self->dbh->selectrow_array($query);
18
19   if (length($currencies) == 0 and length($main::form->{defaultcurrency}) == 0){
20     print_no_default_currency();
21     return 2;
22   } else {
23     if (length($main::form->{defaultcurrency}) == 0){
24       $main::form->{defaultcurrency} = (split m/:/, $currencies)[0];
25     }
26   }
27   my @currency_array = grep {$_ ne '' } split m/:/, $currencies;
28
29   $query = qq|SELECT DISTINCT curr FROM ar
30               UNION
31               SELECT DISTINCT curr FROM ap
32               UNION
33               SELECT DISTINCT curr FROM oe
34               UNION
35               SELECT DISTINCT curr FROM customer
36               UNION
37               SELECT DISTINCT curr FROM delivery_orders
38               UNION
39               SELECT DISTINCT curr FROM exchangerate
40               UNION
41               SELECT DISTINCT curr FROM vendor|;
42
43   my $sth = $self->dbh->prepare($query);
44   $sth->execute || $self->dberror($query);
45
46   $main::form->{ORPHANED_CURRENCIES} = [];
47   my $is_orphaned;
48   my $rowcount = 0;
49   while (my $ref = $sth->fetchrow_hashref("NAME_lc")) {
50     next unless length($ref->{curr}) > 0;
51     $is_orphaned = 1;
52     foreach my $key (split(/:/, $currencies)) {
53       if ($ref->{curr} eq $key) {
54         $is_orphaned = 0;
55         last;
56       }
57     }
58     if ($is_orphaned) {
59      push @{ $main::form->{ORPHANED_CURRENCIES} }, $ref;
60      $main::form->{ORPHANED_CURRENCIES}[$rowcount]->{name} = "curr_$rowcount";
61      $rowcount++;
62     }
63   }
64
65   $sth->finish;
66
67   if (scalar @{ $main::form->{ORPHANED_CURRENCIES} } > 0 and not ($main::form->{continue_options})) {
68     print_orphaned_currencies();
69     return 2;
70   }
71
72   if ($main::form->{continue_options} eq 'break_up') {
73     return 0;
74   }
75
76   if ($main::form->{continue_options} eq 'insert') {
77     for my $i (0..($rowcount-1)){
78       push @currency_array, $main::form->{"curr_$i"};
79     }
80     create_and_fill_table($self, @currency_array);
81     return 1;
82   }
83
84   my $still_orphaned;
85   if ($main::form->{continue_options} eq 'replace') {
86     for my $i (0..($rowcount - 1)){
87       $still_orphaned = 1;
88       for my $item (@currency_array){
89         if ($main::form->{"curr_$i"} eq $item){
90           $still_orphaned = 0;
91           $query = qq|DELETE FROM exchangerate WHERE curr = '| . $main::form->{"old_curr_$i"} . qq|'|;
92           $self->db_query($query);
93           $query = qq|UPDATE ap SET curr = '| . $main::form->{"curr_$i"} . qq|' WHERE curr = '| . $main::form->{"old_curr_$i"} . qq|'|;
94           $self->db_query($query);
95           $query = qq|UPDATE ar SET curr = '| . $main::form->{"curr_$i"} . qq|' WHERE curr = '| . $main::form->{"old_curr_$i"} . qq|'|;
96           $self->db_query($query);
97           $query = qq|UPDATE oe SET curr = '| . $main::form->{"curr_$i"} . qq|' WHERE curr = '| . $main::form->{"old_curr_$i"} . qq|'|;
98           $self->db_query($query);
99           $query = qq|UPDATE customer SET curr = '| . $main::form->{"curr_$i"} . qq|' WHERE curr = '| . $main::form->{"old_curr_$i"} . qq|'|;
100           $self->db_query($query);
101           $query = qq|UPDATE delivery_orders SET curr = '| . $main::form->{"curr_$i"} . qq|' WHERE curr = '| . $main::form->{"old_curr_$i"} . qq|'|;
102           $self->db_query($query);
103           $query = qq|UPDATE vendor SET curr = '| . $main::form->{"curr_$i"} . qq|' WHERE curr = '| . $main::form->{"old_curr_$i"} . qq|'|;
104           $self->db_query($query);
105           last;
106         }
107       }
108       if ($still_orphaned){
109         $main::form->{continue_options} = '';
110         return do_update();
111       }
112     }
113     create_and_fill_table($self, @currency_array);
114     return 1;
115   }
116
117   #No orphaned currencies, so create table:
118   create_and_fill_table($self, @currency_array);
119   return 1;
120 }; # end do_update
121
122 sub create_and_fill_table {
123   my $self = shift;
124   #Create an fill table currencies:
125   my $query = qq|CREATE TABLE currencies (id INTEGER DEFAULT nextval(('id'::text)::regclass) UNIQUE NOT NULL, curr TEXT PRIMARY KEY)|;
126   $self->db_query($query);
127   foreach my $item ( @_ ) {
128     $query = qq|INSERT INTO currencies (curr) VALUES ('| . $item . qq|')|;
129     $self->db_query($query);
130   }
131
132   #Set default currency if no currency was chosen:
133   $query = qq|UPDATE ap SET curr = '| . $main::form->{"defaultcurrency"} . qq|' WHERE curr IS NULL or curr='';|;
134   $query .= qq|UPDATE ar SET curr = '| . $main::form->{"defaultcurrency"} . qq|' WHERE curr IS NULL or curr='';|;
135   $query .= qq|UPDATE oe SET curr = '| . $main::form->{"defaultcurrency"} . qq|' WHERE curr IS NULL or curr='';|;
136   $query .= qq|UPDATE customer SET curr = '| . $main::form->{"defaultcurrency"} . qq|' WHERE curr IS NULL or curr='';|;
137   $query .= qq|UPDATE delivery_orders SET curr = '| . $main::form->{"defaultcurrency"} . qq|' WHERE curr IS NULL or curr='';|;
138   $query .= qq|UPDATE vendor SET curr = '| . $main::form->{"defaultcurrency"} . qq|' WHERE curr IS NULL or curr='';|;
139   $query .= qq|DELETE FROM exchangerate WHERE curr IS NULL or curr='';|;
140   $self->db_query($query);
141
142   #Check wheather defaultcurrency is already in table currencies:
143   $query = qq|SELECT curr FROM currencies WHERE curr = '| . $main::form->{defaultcurrency} . qq|'|;
144   my ($insert_default) = $self->dbh->selectrow_array($query);
145
146   if (!$insert_default) {
147     $query = qq|INSERT INTO currencies (curr) VALUES ('| . $main::form->{defaultcurrency} . qq|')|;
148     $self->db_query($query);
149   }
150
151   #Create a new columns currency and update with curr.id:
152   $query = qq|ALTER TABLE ap ADD currency INTEGER;
153               ALTER TABLE ar ADD currency INTEGER;
154               ALTER TABLE oe ADD currency INTEGER;
155               ALTER TABLE customer ADD currency INTEGER;
156               ALTER TABLE delivery_orders ADD currency INTEGER;
157               ALTER TABLE exchangerate ADD currency INTEGER;
158               ALTER TABLE vendor ADD currency INTEGER;
159               ALTER TABLE defaults ADD currency INTEGER;|;
160   $self->db_query($query);
161   #Set defaultcurrency:
162   $query = qq|UPDATE defaults SET currency= (SELECT id FROM currencies WHERE curr = '| . $main::form->{defaultcurrency} . qq|')|;
163   $self->db_query($query);
164   $query = qq|UPDATE ap SET currency = (SELECT id FROM currencies c WHERE c.curr = ap.curr);
165               UPDATE ar SET currency = (SELECT id FROM currencies c WHERE c.curr = ar.curr);
166               UPDATE oe SET currency = (SELECT id FROM currencies c WHERE c.curr = oe.curr);
167               UPDATE customer SET currency = (SELECT id FROM currencies c WHERE c.curr = customer.curr);
168               UPDATE delivery_orders SET currency = (SELECT id FROM currencies c WHERE c.curr = delivery_orders.curr);
169               UPDATE exchangerate SET currency = (SELECT id FROM currencies c WHERE c.curr = exchangerate.curr);
170               UPDATE vendor SET currency = (SELECT id FROM currencies c WHERE c.curr = vendor.curr);|;
171   $self->db_query($query);
172
173   #Drop column 'curr':
174   $query = qq|ALTER TABLE ap DROP COLUMN curr;
175               ALTER TABLE ar DROP COLUMN curr;
176               ALTER TABLE oe DROP COLUMN curr;
177               ALTER TABLE customer DROP COLUMN curr;
178               ALTER TABLE delivery_orders DROP COLUMN curr;
179               ALTER TABLE exchangerate DROP COLUMN curr;
180               ALTER TABLE vendor DROP COLUMN curr;
181               ALTER TABLE defaults DROP COLUMN curr;|;
182   $self->db_query($query);
183
184   #Rename currency to curr:
185   $query = qq|ALTER TABLE defaults RENAME COLUMN currency TO curr;
186               ALTER TABLE ap RENAME COLUMN currency TO curr;
187               ALTER TABLE ar RENAME COLUMN currency TO curr;
188               ALTER TABLE oe RENAME COLUMN currency TO curr;
189               ALTER TABLE customer RENAME COLUMN currency TO curr;
190               ALTER TABLE delivery_orders RENAME COLUMN currency TO curr;
191               ALTER TABLE exchangerate RENAME COLUMN currency TO curr;
192               ALTER TABLE vendor RENAME COLUMN currency TO curr;|;
193   $self->db_query($query);
194
195   #Set NOT NULL constraints:
196   $query = qq|ALTER TABLE ap ALTER COLUMN curr SET NOT NULL;
197               ALTER TABLE ar ALTER COLUMN curr SET NOT NULL;
198               ALTER TABLE oe ALTER COLUMN curr SET NOT NULL;
199               ALTER TABLE customer ALTER COLUMN curr SET NOT NULL;
200               ALTER TABLE delivery_orders ALTER COLUMN curr SET NOT NULL;
201               ALTER TABLE exchangerate ALTER COLUMN curr SET NOT NULL;
202               ALTER TABLE vendor ALTER COLUMN curr SET NOT NULL;
203               ALTER TABLE defaults ALTER COLUMN curr SET NOT NULL;|;
204   $self->db_query($query);
205
206   #Set foreign keys:
207   $query = qq|ALTER TABLE ap ADD FOREIGN KEY (curr) REFERENCES currencies(id);
208               ALTER TABLE ar ADD FOREIGN KEY (curr) REFERENCES currencies(id);
209               ALTER TABLE oe ADD FOREIGN KEY (curr) REFERENCES currencies(id);
210               ALTER TABLE customer ADD FOREIGN KEY (curr) REFERENCES currencies(id);
211               ALTER TABLE delivery_orders ADD FOREIGN KEY (curr) REFERENCES currencies(id);
212               ALTER TABLE exchangerate ADD FOREIGN KEY (curr) REFERENCES currencies(id);
213               ALTER TABLE vendor ADD FOREIGN KEY (curr) REFERENCES currencies(id);
214               ALTER TABLE defaults ADD FOREIGN KEY (curr) REFERENCES currencies(id);|;
215   $self->db_query($query);
216
217 };
218
219 sub print_no_default_currency {
220   print $main::form->parse_html_template("dbupgrade/no_default_currency");
221 };
222
223 sub print_orphaned_currencies {
224   print $main::form->parse_html_template("dbupgrade/orphaned_currencies");
225 };
226
227 1;