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