X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=sql%2FPg-upgrade2%2Fcurrencies.pl;h=30f779537a47911efec1d68d3428d9f2dfe0343a;hb=958b82d600cebec78ff208257b1fd348ee0439bf;hp=2497be983cbd27b32b73a640b3d6cbbf26bc2a5a;hpb=9c8450d924f0318190cf451a533e1ff883a2fa16;p=kivitendo-erp.git diff --git a/sql/Pg-upgrade2/currencies.pl b/sql/Pg-upgrade2/currencies.pl index 2497be983..30f779537 100644 --- a/sql/Pg-upgrade2/currencies.pl +++ b/sql/Pg-upgrade2/currencies.pl @@ -1,39 +1,26 @@ # @tag: currencies # @description: Erstellt neue Tabelle currencies. Währungen können dann einfacher eingegeben und unkritisch geändert werden. # @depends: release_3_0_0 rm_whitespaces -# @charset: utf-8 + +package SL::DBUpgrade2::currencies; use utf8; use strict; -die("This script cannot be run from the command line.") unless ($main::form); - -sub mydberror { - my ($msg) = @_; - die($dbup_locale->text("Database update error:") . "
$msg
" . $DBI::errstr); -} - -sub do_query { - my ($query, $may_fail) = @_; - - if (!$dbh->do($query)) { - mydberror($query) unless ($may_fail); - $dbh->rollback(); - $dbh->begin_work(); - } -} +use parent qw(SL::DBUpgrade2::Base); -sub do_update { +sub run { + my ($self) = @_; #Check wheather default currency exists my $query = qq|SELECT curr FROM defaults|; - my ($currencies) = $dbh->selectrow_array($query); + my ($currencies) = $self->dbh->selectrow_array($query); if (length($currencies) == 0 and length($main::form->{defaultcurrency}) == 0){ print_no_default_currency(); return 2; } else { - if (length($main::form->{defaultcurrency}) == 0){ + if (!defined $::form->{defaultcurrency} || length($main::form->{defaultcurrency}) == 0){ $main::form->{defaultcurrency} = (split m/:/, $currencies)[0]; } } @@ -53,7 +40,7 @@ sub do_update { UNION SELECT DISTINCT curr FROM vendor|; - my $sth = $dbh->prepare($query); + my $sth = $self->dbh->prepare($query); $sth->execute || $self->dberror($query); $main::form->{ORPHANED_CURRENCIES} = []; @@ -82,63 +69,67 @@ sub do_update { return 2; } - if ($main::form->{continue_options} eq 'break_up') { - return 0; - } + if (defined $::form->{continue_options}) { + if ($::form->{continue_options} eq 'break_up') { + return 0; + } - if ($main::form->{continue_options} eq 'insert') { - for my $i (0..($rowcount-1)){ - push @currency_array, $form->{"curr_$i"}; + if ($::form->{continue_options} eq 'insert') { + for my $i (0..($rowcount-1)){ + push @currency_array, $main::form->{"curr_$i"}; + } + create_and_fill_table($self, @currency_array); + return 1; } - create_and_fill_table(@currency_array); - return 1; - } - my $still_orphaned; - if ($main::form->{continue_options} eq 'replace') { - for my $i (0..($rowcount - 1)){ - $still_orphaned = 1; - for my $item (@currency_array){ - if ($main::form->{"curr_$i"} eq $item){ - $still_orphaned = 0; - $query = qq|DELETE FROM exchangerate WHERE curr = '| . $main::form->{"old_curr_$i"} . qq|'|; - do_query($query); - $query = qq|UPDATE ap SET curr = '| . $main::form->{"curr_$i"} . qq|' WHERE curr = '| . $main::form->{"old_curr_$i"} . qq|'|; - do_query($query); - $query = qq|UPDATE ar SET curr = '| . $main::form->{"curr_$i"} . qq|' WHERE curr = '| . $main::form->{"old_curr_$i"} . qq|'|; - do_query($query); - $query = qq|UPDATE oe SET curr = '| . $main::form->{"curr_$i"} . qq|' WHERE curr = '| . $main::form->{"old_curr_$i"} . qq|'|; - do_query($query); - $query = qq|UPDATE customer SET curr = '| . $main::form->{"curr_$i"} . qq|' WHERE curr = '| . $main::form->{"old_curr_$i"} . qq|'|; - do_query($query); - $query = qq|UPDATE delivery_orders SET curr = '| . $main::form->{"curr_$i"} . qq|' WHERE curr = '| . $main::form->{"old_curr_$i"} . qq|'|; - do_query($query); - $query = qq|UPDATE vendor SET curr = '| . $main::form->{"curr_$i"} . qq|' WHERE curr = '| . $main::form->{"old_curr_$i"} . qq|'|; - do_query($query); - last; + my $still_orphaned; + if ($::form->{continue_options} eq 'replace') { + for my $i (0..($rowcount - 1)){ + $still_orphaned = 1; + for my $item (@currency_array){ + if ($main::form->{"curr_$i"} eq $item){ + $still_orphaned = 0; + $query = qq|DELETE FROM exchangerate WHERE curr = '| . $main::form->{"old_curr_$i"} . qq|'|; + $self->db_query($query); + $query = qq|UPDATE ap SET curr = '| . $main::form->{"curr_$i"} . qq|' WHERE curr = '| . $main::form->{"old_curr_$i"} . qq|'|; + $self->db_query($query); + $query = qq|UPDATE ar SET curr = '| . $main::form->{"curr_$i"} . qq|' WHERE curr = '| . $main::form->{"old_curr_$i"} . qq|'|; + $self->db_query($query); + $query = qq|UPDATE oe SET curr = '| . $main::form->{"curr_$i"} . qq|' WHERE curr = '| . $main::form->{"old_curr_$i"} . qq|'|; + $self->db_query($query); + $query = qq|UPDATE customer SET curr = '| . $main::form->{"curr_$i"} . qq|' WHERE curr = '| . $main::form->{"old_curr_$i"} . qq|'|; + $self->db_query($query); + $query = qq|UPDATE delivery_orders SET curr = '| . $main::form->{"curr_$i"} . qq|' WHERE curr = '| . $main::form->{"old_curr_$i"} . qq|'|; + $self->db_query($query); + $query = qq|UPDATE vendor SET curr = '| . $main::form->{"curr_$i"} . qq|' WHERE curr = '| . $main::form->{"old_curr_$i"} . qq|'|; + $self->db_query($query); + last; + } + } + if ($still_orphaned){ + $main::form->{continue_options} = ''; + return do_update(); } } - if ($still_orphaned){ - $main::form->{continue_options} = ''; - return do_update(); - } + create_and_fill_table($self, @currency_array); + return 1; } - create_and_fill_table(@currency_array); - return 1; } #No orphaned currencies, so create table: - create_and_fill_table(@currency_array); + create_and_fill_table($self, @currency_array); return 1; }; # end do_update sub create_and_fill_table { + my $self = shift; #Create an fill table currencies: - my $query = qq|CREATE TABLE currencies (id INTEGER DEFAULT nextval(('id'::text)::regclass) UNIQUE NOT NULL, curr TEXT PRIMARY KEY)|; - do_query($query); + my $query = qq|CREATE TABLE currencies (id SERIAL PRIMARY KEY, + name TEXT NOT NULL UNIQUE)|; + $self->db_query($query); foreach my $item ( @_ ) { - $query = qq|INSERT INTO currencies (curr) VALUES ('| . $item . qq|')|; - do_query($query); + $query = qq|INSERT INTO currencies (name) VALUES ('| . $item . qq|')|; + $self->db_query($query); } #Set default currency if no currency was chosen: @@ -149,38 +140,38 @@ sub create_and_fill_table { $query .= qq|UPDATE delivery_orders SET curr = '| . $main::form->{"defaultcurrency"} . qq|' WHERE curr IS NULL or curr='';|; $query .= qq|UPDATE vendor SET curr = '| . $main::form->{"defaultcurrency"} . qq|' WHERE curr IS NULL or curr='';|; $query .= qq|DELETE FROM exchangerate WHERE curr IS NULL or curr='';|; - do_query($query); + $self->db_query($query); #Check wheather defaultcurrency is already in table currencies: - $query = qq|SELECT curr FROM currencies WHERE curr = '| . $main::form->{defaultcurrency} . qq|'|; - my ($insert_default) = $dbh->selectrow_array($query); + $query = qq|SELECT name FROM currencies WHERE name = '| . $main::form->{defaultcurrency} . qq|'|; + my ($insert_default) = $self->dbh->selectrow_array($query); if (!$insert_default) { - $query = qq|INSERT INTO currencies (curr) VALUES ('| . $main::form->{defaultcurrency} . qq|')|; - do_query($query); + $query = qq|INSERT INTO currencies (name) VALUES ('| . $main::form->{defaultcurrency} . qq|')|; + $self->db_query($query); } - #Create a new columns currency and update with curr.id: - $query = qq|ALTER TABLE ap ADD currency INTEGER; - ALTER TABLE ar ADD currency INTEGER; - ALTER TABLE oe ADD currency INTEGER; - ALTER TABLE customer ADD currency INTEGER; - ALTER TABLE delivery_orders ADD currency INTEGER; - ALTER TABLE exchangerate ADD currency INTEGER; - ALTER TABLE vendor ADD currency INTEGER; - ALTER TABLE defaults ADD currency INTEGER;|; - do_query($query); + #Create a new columns currency_id and update with curr.id: + $query = qq|ALTER TABLE ap ADD currency_id INTEGER; + ALTER TABLE ar ADD currency_id INTEGER; + ALTER TABLE oe ADD currency_id INTEGER; + ALTER TABLE customer ADD currency_id INTEGER; + ALTER TABLE delivery_orders ADD currency_id INTEGER; + ALTER TABLE exchangerate ADD currency_id INTEGER; + ALTER TABLE vendor ADD currency_id INTEGER; + ALTER TABLE defaults ADD currency_id INTEGER;|; + $self->db_query($query); #Set defaultcurrency: - $query = qq|UPDATE defaults SET currency= (SELECT id FROM currencies WHERE curr = '| . $main::form->{defaultcurrency} . qq|')|; - do_query($query); - $query = qq|UPDATE ap SET currency = (SELECT id FROM currencies c WHERE c.curr = ap.curr); - UPDATE ar SET currency = (SELECT id FROM currencies c WHERE c.curr = ar.curr); - UPDATE oe SET currency = (SELECT id FROM currencies c WHERE c.curr = oe.curr); - UPDATE customer SET currency = (SELECT id FROM currencies c WHERE c.curr = customer.curr); - UPDATE delivery_orders SET currency = (SELECT id FROM currencies c WHERE c.curr = delivery_orders.curr); - UPDATE exchangerate SET currency = (SELECT id FROM currencies c WHERE c.curr = exchangerate.curr); - UPDATE vendor SET currency = (SELECT id FROM currencies c WHERE c.curr = vendor.curr);|; - do_query($query); + $query = qq|UPDATE defaults SET currency_id= (SELECT id FROM currencies WHERE name = '| . $main::form->{defaultcurrency} . qq|')|; + $self->db_query($query); + $query = qq|UPDATE ap SET currency_id = (SELECT id FROM currencies c WHERE c.name = ap.curr); + UPDATE ar SET currency_id = (SELECT id FROM currencies c WHERE c.name = ar.curr); + UPDATE oe SET currency_id = (SELECT id FROM currencies c WHERE c.name = oe.curr); + UPDATE customer SET currency_id = (SELECT id FROM currencies c WHERE c.name = customer.curr); + UPDATE delivery_orders SET currency_id = (SELECT id FROM currencies c WHERE c.name = delivery_orders.curr); + UPDATE exchangerate SET currency_id = (SELECT id FROM currencies c WHERE c.name = exchangerate.curr); + UPDATE vendor SET currency_id = (SELECT id FROM currencies c WHERE c.name = vendor.curr);|; + $self->db_query($query); #Drop column 'curr': $query = qq|ALTER TABLE ap DROP COLUMN curr; @@ -191,40 +182,29 @@ sub create_and_fill_table { ALTER TABLE exchangerate DROP COLUMN curr; ALTER TABLE vendor DROP COLUMN curr; ALTER TABLE defaults DROP COLUMN curr;|; - do_query($query); - - #Rename currency to curr: - $query = qq|ALTER TABLE defaults RENAME COLUMN currency TO curr; - ALTER TABLE ap RENAME COLUMN currency TO curr; - ALTER TABLE ar RENAME COLUMN currency TO curr; - ALTER TABLE oe RENAME COLUMN currency TO curr; - ALTER TABLE customer RENAME COLUMN currency TO curr; - ALTER TABLE delivery_orders RENAME COLUMN currency TO curr; - ALTER TABLE exchangerate RENAME COLUMN currency TO curr; - ALTER TABLE vendor RENAME COLUMN currency TO curr;|; - do_query($query); + $self->db_query($query); #Set NOT NULL constraints: - $query = qq|ALTER TABLE ap ALTER COLUMN curr SET NOT NULL; - ALTER TABLE ar ALTER COLUMN curr SET NOT NULL; - ALTER TABLE oe ALTER COLUMN curr SET NOT NULL; - ALTER TABLE customer ALTER COLUMN curr SET NOT NULL; - ALTER TABLE delivery_orders ALTER COLUMN curr SET NOT NULL; - ALTER TABLE exchangerate ALTER COLUMN curr SET NOT NULL; - ALTER TABLE vendor ALTER COLUMN curr SET NOT NULL; - ALTER TABLE defaults ALTER COLUMN curr SET NOT NULL;|; - do_query($query); + $query = qq|ALTER TABLE ap ALTER COLUMN currency_id SET NOT NULL; + ALTER TABLE ar ALTER COLUMN currency_id SET NOT NULL; + ALTER TABLE oe ALTER COLUMN currency_id SET NOT NULL; + ALTER TABLE customer ALTER COLUMN currency_id SET NOT NULL; + ALTER TABLE delivery_orders ALTER COLUMN currency_id SET NOT NULL; + ALTER TABLE exchangerate ALTER COLUMN currency_id SET NOT NULL; + ALTER TABLE vendor ALTER COLUMN currency_id SET NOT NULL; + ALTER TABLE defaults ALTER COLUMN currency_id SET NOT NULL;|; + $self->db_query($query); #Set foreign keys: - $query = qq|ALTER TABLE ap ADD FOREIGN KEY (curr) REFERENCES currencies(id); - ALTER TABLE ar ADD FOREIGN KEY (curr) REFERENCES currencies(id); - ALTER TABLE oe ADD FOREIGN KEY (curr) REFERENCES currencies(id); - ALTER TABLE customer ADD FOREIGN KEY (curr) REFERENCES currencies(id); - ALTER TABLE delivery_orders ADD FOREIGN KEY (curr) REFERENCES currencies(id); - ALTER TABLE exchangerate ADD FOREIGN KEY (curr) REFERENCES currencies(id); - ALTER TABLE vendor ADD FOREIGN KEY (curr) REFERENCES currencies(id); - ALTER TABLE defaults ADD FOREIGN KEY (curr) REFERENCES currencies(id);|; - do_query($query); + $query = qq|ALTER TABLE ap ADD FOREIGN KEY (currency_id) REFERENCES currencies(id); + ALTER TABLE ar ADD FOREIGN KEY (currency_id) REFERENCES currencies(id); + ALTER TABLE oe ADD FOREIGN KEY (currency_id) REFERENCES currencies(id); + ALTER TABLE customer ADD FOREIGN KEY (currency_id) REFERENCES currencies(id); + ALTER TABLE delivery_orders ADD FOREIGN KEY (currency_id) REFERENCES currencies(id); + ALTER TABLE exchangerate ADD FOREIGN KEY (currency_id) REFERENCES currencies(id); + ALTER TABLE vendor ADD FOREIGN KEY (currency_id) REFERENCES currencies(id); + ALTER TABLE defaults ADD FOREIGN KEY (currency_id) REFERENCES currencies(id);|; + $self->db_query($query); }; @@ -236,4 +216,4 @@ sub print_orphaned_currencies { print $main::form->parse_html_template("dbupgrade/orphaned_currencies"); }; -return do_update(); +1;