176516572fbe8064e3d1e3068434a74778eda1e0
[kivitendo-erp.git] / sql / Pg-upgrade2 / cp_greeting_migration.pl
1 # @tag: cp_greeting_migration
2 # @description: Migration of cp_greeting to cp_gender
3 # @depends: generic_translations
4
5 use strict;
6
7 die("This script cannot be run from the command line.") unless ($main::form);
8
9 sub mydberror {
10   my ($msg) = @_;
11   die($dbup_locale->text("Database update error:") . "<br>$msg<br>" . $DBI::errstr);
12 }
13
14 sub do_query {
15   my ($query, $may_fail) = @_;
16
17   if (!$dbh->do($query)) {
18     mydberror($query) unless ($may_fail);
19     $dbh->rollback();
20     $dbh->begin_work();
21   }
22 }
23
24
25 sub query_result {
26
27   # list of all entries where cp_greeting is empty, meaning can't determine gender from parsing Herr/Frau/...
28   # this assumes cp_greeting still exists, i.e. gender.sql was not run yet
29   my ($gender_table, $mchecked, $fchecked);
30
31   my $sql2 = "select cp_id,cp_givenname,cp_name,cp_title,cp_greeting from contacts where not (cp_greeting ILIKE '%frau%' OR cp_greeting ILIKE '%herr%' or cp_greeting ILIKE '%mrs.%' or cp_greeting ILIKE '%miss%') ";
32   my $sth2 = $dbh->prepare($sql2) or die $dbh->errstr();
33   $sth2->execute() or die $dbh->errstr();
34
35   my $i = 1;
36   $gender_table .= '<table border="1"><tr><th>cp_givenname</th><th>cp_name</th><th>cp_title</th><th>cp_greeting</th><th><translate>male/female</th></tr>';
37   $gender_table .= "\n";
38
39   while (my $row = $sth2->fetchrow_hashref()) {
40     if ($main::form->{"gender_$i"} eq "f" ) {
41       $mchecked = "";
42       $fchecked = "checked";
43     } else {
44       $mchecked = "checked";
45       $fchecked = "";
46     };
47
48     $gender_table .= "<tr><input type=hidden name=\"cp_id_$i\" value=\"$row->{cp_id}\"> <td>$row->{cp_givenname}</td> <td>$row->{cp_name}</td> <td>$row->{cp_title} </td> <td>$row->{cp_greeting} </td><td> <input type=\"radio\" name=\"gender_$i\" value=\"m\" $mchecked> <input type=\"radio\" name=\"gender_$i\" value=\"f\" $fchecked></td></tr>\n";
49     $i++;
50   }
51
52   $gender_table .= "<input type=hidden name=\"number_of_gender_entries\" value=\"$i\">";
53   $gender_table .= "</table>";
54
55   $main::form->{gender_table} = $gender_table;
56
57   my $title_table;
58
59   my $sql3 = "select cp_id,cp_givenname,cp_name,cp_title,cp_greeting from contacts where not ( (cp_greeting ILIKE '%frau%' OR cp_greeting ILIKE '%herr%' or cp_greeting ILIKE '%mrs.%' or cp_greeting ILIKE '%miss%')) and not (cp_greeting like ''); ";
60
61   my $sth3 = $dbh->prepare($sql3) or die $dbh->errstr();
62   $sth3->execute() or die $dbh->errstr();
63
64   $title_table = '<table border="1"><tr><th>cp_givenname</th><th>cp_name</th><th>cp_title</th><th>cp_greeting</th><th>cp_title new</th></tr>';
65
66   my $j = 1;
67   while (my $row = $sth3->fetchrow_hashref()) {
68 # Vorschlagsfeld fuer neuen Titel mit Werten von cp_greeting und cp_title vorbelegen
69     my $value = "$row->{cp_greeting}";
70     $value .= " " if $row->{cp_greeting};
71     $value .= "$row->{cp_title}";
72
73     $title_table .= "<tr> <td><input type=hidden name=\"cp_id_title_$j\" value=$row->{cp_id}> $row->{cp_givenname}</td> <td>$row->{cp_name}</td><td>$row->{cp_title}</td> <td>$row->{cp_greeting}</td><td><input type=\"text\" id=\"cp_title_$j\" name=\"cp_name_$j\" value=\"$value\"></td> </tr>\n";
74     $j++;
75   }
76
77   $title_table .= "<input type=hidden name=\"number_of_title_entries\" value=\"$j\">";
78   $title_table .= "</table>";
79   $main::form->{title_table} = $title_table;
80 }
81
82 sub print_question {
83   query_result();
84   # parse html form in /templates/webpages/dbupgrade/cp_greeting_update_form
85   print $main::form->parse_html_template("dbupgrade/cp_greeting_update_form");
86 }
87
88 sub alter_schema_only {
89   my $sqlcode = <<SQL;
90     ALTER TABLE contacts ADD COLUMN cp_gender char(1);
91     ALTER TABLE contacts DROP COLUMN cp_greeting;
92 SQL
93
94   $dbh->do($sqlcode);
95 }
96
97 sub do_update {
98   # main function
99
100   # Do not ask the user anything if there are no entries in the
101   # contacts table.
102   my ($data_exists) = $dbh->selectrow_array("SELECT * FROM contacts LIMIT 1");
103   if (!$data_exists) {
104     alter_schema_only();
105     return 1;
106   }
107
108   # first of all check if gender.sql was already run and thus cp_gender exists
109   # if it exists there is no need for this update anymore, so return
110   # without doing anything
111
112   my $column_exists = 1;
113   if (!$dbh->do("SELECT cp_gender FROM contacts LIMIT 1")) {
114     $dbh->rollback();
115     $dbh->begin_work();
116     $column_exists = 0;
117   }
118   return 1 if $column_exists;
119
120
121   if (!$main::form->{do_migrate}) {
122     # case 1: first call of page
123     set_default_greetings();
124     print_question();
125     return 2;
126   } else {
127     # case 2: submit button was pressed, hidden field do_migrate was set
128     migrate_data();
129   }
130
131   return 1;
132
133 }
134
135 sub migrate_data {
136
137   my $sqlcode = <<EOF
138 ALTER TABLE contacts ADD COLUMN cp_gender char(1);
139 UPDATE contacts SET cp_gender = 'm';
140 UPDATE contacts SET cp_gender = 'f'
141   WHERE (cp_greeting ILIKE '%frau%')
142      OR (cp_greeting ILIKE '%mrs.%')
143      OR (cp_greeting ILIKE '%miss%');
144 EOF
145 ;
146
147   for (my $i = 1; $i <= $main::form->{number_of_gender_entries}; $i++ ) {
148     next unless $main::form->{"cp_id_$i"};
149     if ( $main::form->{"gender_$i"} eq "f" ) {
150       $sqlcode .= "UPDATE contacts SET cp_gender = \'f\' WHERE cp_id = $main::form->{\"cp_id_$i\"};\n";
151     }
152   }
153
154   for (my $i = 1; $i <= $main::form->{number_of_title_entries}; $i++ ) {
155     next unless $main::form->{"cp_id_title_$i"} and $main::form->{"cp_id_$i"};
156     $sqlcode .= "UPDATE contacts SET cp_title = \'$main::form->{\"cp_name_$i\"}\' WHERE cp_id = $main::form->{\"cp_id_$i\"};\n";
157   }
158   $sqlcode .= "ALTER TABLE contacts DROP COLUMN cp_greeting;";
159
160   # insert chosen default values
161   $sqlcode .= "INSERT INTO generic_translations (translation_type, translation) VALUES ('greetings::male','$main::form->{default_male}');";
162   $sqlcode .= "INSERT INTO generic_translations (translation_type, translation) VALUES ('greetings::female','$main::form->{default_female}');";
163
164   my $query  = $sqlcode;
165   do_query($query);
166 }
167
168 sub set_default_greetings {
169   # add html input boxes to template so user can specify default greetings
170
171    my $default_male                            = "Herr";
172    my $default_female                          = "Frau";
173    my $default_greeting_text_male              = "<input type=\"text\" id=\"default_male\" name=\"default_male\" value=\"$default_male\"><br>";
174    my $default_greeting_text_female            = "<input type=\"text\" id=\"default_female\" name=\"default_female\" value=\"$default_female\"><br>";
175    $main::form->{default_greeting_text_male}   = $default_greeting_text_male;
176    $main::form->{default_greeting_text_female} = $default_greeting_text_female;
177 }
178
179 return do_update();
180