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
5 package SL::DBUpgrade2::currencies;
10 use parent qw(SL::DBUpgrade2::Base);
15 #Check wheather default currency exists
16 my $query = qq|SELECT curr FROM defaults|;
17 my ($currencies) = $self->dbh->selectrow_array($query);
19 if (length($currencies) == 0 and length($main::form->{defaultcurrency}) == 0){
20 print_no_default_currency();
23 if (length($main::form->{defaultcurrency}) == 0){
24 $main::form->{defaultcurrency} = (split m/:/, $currencies)[0];
27 my @currency_array = grep {$_ ne '' } split m/:/, $currencies;
29 $query = qq|SELECT DISTINCT curr FROM ar
31 SELECT DISTINCT curr FROM ap
33 SELECT DISTINCT curr FROM oe
35 SELECT DISTINCT curr FROM customer
37 SELECT DISTINCT curr FROM delivery_orders
39 SELECT DISTINCT curr FROM exchangerate
41 SELECT DISTINCT curr FROM vendor|;
43 my $sth = $self->dbh->prepare($query);
44 $sth->execute || $self->dberror($query);
46 $main::form->{ORPHANED_CURRENCIES} = [];
49 while (my $ref = $sth->fetchrow_hashref("NAME_lc")) {
50 next unless length($ref->{curr}) > 0;
52 foreach my $key (split(/:/, $currencies)) {
53 if ($ref->{curr} eq $key) {
59 push @{ $main::form->{ORPHANED_CURRENCIES} }, $ref;
60 $main::form->{ORPHANED_CURRENCIES}[$rowcount]->{name} = "curr_$rowcount";
67 if (scalar @{ $main::form->{ORPHANED_CURRENCIES} } > 0 and not ($main::form->{continue_options})) {
68 print_orphaned_currencies();
72 if ($main::form->{continue_options} eq 'break_up') {
76 if ($main::form->{continue_options} eq 'insert') {
77 for my $i (0..($rowcount-1)){
78 push @currency_array, $main::form->{"curr_$i"};
80 create_and_fill_table($self, @currency_array);
85 if ($main::form->{continue_options} eq 'replace') {
86 for my $i (0..($rowcount - 1)){
88 for my $item (@currency_array){
89 if ($main::form->{"curr_$i"} eq $item){
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);
108 if ($still_orphaned){
109 $main::form->{continue_options} = '';
113 create_and_fill_table($self, @currency_array);
117 #No orphaned currencies, so create table:
118 create_and_fill_table($self, @currency_array);
122 sub create_and_fill_table {
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);
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);
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);
146 if (!$insert_default) {
147 $query = qq|INSERT INTO currencies (curr) VALUES ('| . $main::form->{defaultcurrency} . qq|')|;
148 $self->db_query($query);
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);
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);
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);
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);
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);
219 sub print_no_default_currency {
220 print $main::form->parse_html_template("dbupgrade/no_default_currency");
223 sub print_orphaned_currencies {
224 print $main::form->parse_html_template("dbupgrade/orphaned_currencies");