Revision 3ccf1a99
Von Moritz Bunkus vor etwa 12 Jahren hinzugefügt
SL/CT.pm | ||
---|---|---|
552 | 552 |
my @columns = qw(cp_title cp_givenname cp_name cp_email cp_phone1 cp_phone2 cp_abteilung cp_fax |
553 | 553 |
cp_mobile1 cp_mobile2 cp_satphone cp_satfax cp_project cp_privatphone cp_privatemail cp_birthday cp_gender |
554 | 554 |
cp_street cp_zipcode cp_city); |
555 |
my @values = map { $_ eq 'cp_gender' ? ($form->{$_} eq 'f' ? 'f' : 'm') : $form->{$_} } @columns; |
|
555 |
my @values = map( |
|
556 |
{ |
|
557 |
if ( $_ eq 'cp_gender' ) { |
|
558 |
$form->{$_} eq 'f' ? 'f' : 'm'; |
|
559 |
} elsif ( $_ eq 'cp_birthday' && $form->{cp_birthday} eq '' ) { |
|
560 |
undef; |
|
561 |
} else { |
|
562 |
$form->{$_}; |
|
563 |
} |
|
564 |
} |
|
565 |
@columns |
|
566 |
); |
|
556 | 567 |
|
557 | 568 |
my ($query, $cp_id); |
558 | 569 |
if ($form->{cp_id}) { |
SL/DB/MetaSetup/Contact.pm | ||
---|---|---|
28 | 28 |
cp_project => { type => 'text' }, |
29 | 29 |
cp_privatphone => { type => 'text' }, |
30 | 30 |
cp_privatemail => { type => 'text' }, |
31 |
cp_birthday => { type => 'text' }, |
|
32 | 31 |
cp_abteilung => { type => 'text' }, |
33 | 32 |
cp_gender => { type => 'character', length => 1 }, |
33 |
cp_street => { type => 'text' }, |
|
34 |
cp_zipcode => { type => 'text' }, |
|
35 |
cp_city => { type => 'text' }, |
|
36 |
cp_birthday => { type => 'date' }, |
|
34 | 37 |
], |
35 | 38 |
|
36 | 39 |
primary_key_columns => [ 'cp_id' ], |
locale/de/all | ||
---|---|---|
296 | 296 |
'Bins saved.' => 'Lagerplätze gespeichert.', |
297 | 297 |
'Bins that have been used in the past cannot be deleted anymore. For these bins there\'s no checkbox in the "Delete" column.' => 'Lagerplätze, die bereits benutzt wurden, können nicht mehr gelöscht werden. Deswegen fehlt bei ihnen die Checkbox in der Spalte "Löschen".', |
298 | 298 |
'Birthday' => 'Geburtstag', |
299 |
'Birthday (after conversion)' => 'Geburtstag (nach Umstellung)', |
|
300 |
'Birthday (before conversion)' => 'Geburtstag (vor Umstellung)', |
|
299 | 301 |
'Bis' => 'bis', |
300 | 302 |
'Bis Konto: ' => 'bis Konto: ', |
301 | 303 |
'Block' => 'Block', |
... | ... | |
446 | 448 |
'Contacts' => 'Ansprechpersonen', |
447 | 449 |
'Continue' => 'Weiter', |
448 | 450 |
'Contra' => 'gegen', |
451 |
'Conversion of "birthday" contact person attribute' => 'Umstellung des Kontaktpersonenfeldes "Geburtstag"', |
|
449 | 452 |
'Copies' => 'Kopien', |
450 | 453 |
'Correct taxkey' => 'Richtiger Steuerschlüssel', |
451 | 454 |
'Corrections' => 'Korrekturen', |
... | ... | |
562 | 565 |
'Database Administration' => 'Datenbankadministration', |
563 | 566 |
'Database Connection Test' => 'Test der Datenbankverbindung', |
564 | 567 |
'Database Host' => 'Datenbankcomputer', |
568 |
'Database ID' => 'Datenbank-ID', |
|
565 | 569 |
'Database User' => 'Datenbankbenutzer', |
566 | 570 |
'Database User missing!' => 'Datenbankbenutzer fehlt!', |
567 | 571 |
'Database backups and restorations are disabled in the configuration.' => 'Datenbanksicherungen und -wiederherstellungen sind in der Konfiguration deaktiviert.', |
... | ... | |
796 | 800 |
'Enter longdescription' => 'Langtext eingeben', |
797 | 801 |
'Enter the abbreviations separated by a colon (i.e CAD:USD:EUR) for your native and foreign currencies' => 'Geben Sie Ihre und weitere Währungen als Abkürzungen durch Doppelpunkte getrennt ein (z.B. EUR:USD:CAD)', |
798 | 802 |
'Enter the requested execution date or leave empty for the quickest possible execution:' => 'Geben Sie das jeweils gewünschte Ausführungsdatum an, oder lassen Sie das Feld leer für die schnellstmögliche Ausführung:', |
803 |
'Entries for which automatic conversion failed:' => 'Einträge, für die die automatische Umstellung fehlschlug:', |
|
804 |
'Entries for which automatic conversion succeeded:' => 'Einträge, für die die automatische Umstellung erfolgreich war:', |
|
799 | 805 |
'Equity' => 'Passiva', |
800 | 806 |
'Error' => 'Fehler', |
801 | 807 |
'Error in database control file \'%s\': %s' => 'Fehler in Datenbankupgradekontrolldatei \'%s\': %s', |
... | ... | |
1901 | 1907 |
'The connection to the database could not be established.' => 'Die Verbindung zur Datenbank konnte nicht hergestellt werden.', |
1902 | 1908 |
'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:', |
1903 | 1909 |
'The connection was established successfully.' => 'Die Verbindung zur Datenbank wurde erfolgreich hergestellt.', |
1910 |
'The contact person attribute "birthday" is converted from a free-form text field into a date field.' => 'Das Kontaktpersonenfeld "Geburtstag" wird von einem freien Textfeld auf ein Datumsfeld umgestellt.', |
|
1904 | 1911 |
'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:', |
1905 | 1912 |
'The custom variable has been deleted.' => 'Die benutzerdefinierte Variable wurde gelöscht.', |
1906 | 1913 |
'The custom variable has been saved.' => 'Die benutzerdefinierte Variable wurde gespeichert.', |
... | ... | |
2059 | 2066 |
'This option controls the method used for profit determination.' => 'Dieser Parameter legt die Berechnungsmethode für die Gewinnermittlung fest.', |
2060 | 2067 |
'This option controls the posting and calculation behavior for the accounting method.' => 'Dieser Parameter steuert die Buchungs- und Berechnungsmethoden für die Versteuerungsart.', |
2061 | 2068 |
'This partnumber is not unique. You should change it.' => 'Diese Artikelnummer ist nicht eindeutig. Bitte wählen Sie eine andere.', |
2069 |
'This requires you to manually correct entries for which an automatic conversion failed and to check those for which it succeeded.' => 'Dies erfordert, dass Sie diejenigen Einträge manuell korrigieren, für die die automatische Umstellung fehlschlug, sowie dass Sie diejenigen überprüfen, für die die Umstellung erfolgreich war.', |
|
2062 | 2070 |
'This transaction has to be split into several transactions manually.' => 'Diese Buchung muss manuell in mehrere Buchungen aufgeteilt werden.', |
2063 | 2071 |
'This update will change the nature the onhand of goods is tracked.' => 'Dieses update ändert die Art und Weise wie Lagermengen gezält werden.', |
2064 | 2072 |
'This upgrade script tries to map all existing parts in the database to the newly created Buchungsgruppen.' => 'Dieses Upgradescript versucht, bei allen bestehenden Artikeln neu erstellte Buchungsgruppen zuzuordnen.', |
sql/Pg-upgrade2/contacts_convert_cp_birthday_to_date.pl | ||
---|---|---|
1 |
# @tag: contacts_convert_cp_birthday_to_date |
|
2 |
# @description: Umstellung cp_birthday von Freitext auf Datumsfeld |
|
3 |
# @depends: release_2_7_0 |
|
4 |
package contacts_convert_cp_birthday_to_date; |
|
5 |
use strict; |
|
6 |
|
|
7 |
die 'This script cannot be run from the command line.' if !$::form; |
|
8 |
|
|
9 |
sub convert_to_date { |
|
10 |
my ($str) = @_; |
|
11 |
|
|
12 |
return '' if !$str; |
|
13 |
|
|
14 |
my $sth = $dbh->prepare('SELECT ?::date AS date') or return undef; |
|
15 |
$sth->execute($str) or return undef; |
|
16 |
|
|
17 |
return $sth->fetchrow_hashref->{date}; |
|
18 |
} |
|
19 |
|
|
20 |
sub update { |
|
21 |
my @data = (); |
|
22 |
my @auto_data = (); |
|
23 |
my $sql = <<SQL; |
|
24 |
SELECT |
|
25 |
cp_id, |
|
26 |
cp_givenname, |
|
27 |
cp_name, |
|
28 |
cp_birthday AS cp_birthday_old |
|
29 |
FROM contacts |
|
30 |
ORDER BY cp_id; |
|
31 |
SQL |
|
32 |
|
|
33 |
my $sth = $dbh->prepare($sql) or die $dbh->errstr; |
|
34 |
$sth->execute or die $dbh->errstr; |
|
35 |
|
|
36 |
my $i = -1; |
|
37 |
while (my $row = $sth->fetchrow_hashref) { |
|
38 |
$i++; |
|
39 |
$row->{cp_birthday} = convert_to_date($::form->{form_submitted} ? $::form->{'cp_birthday_'. $i} : $row->{cp_birthday_old}); |
|
40 |
$row->{row_index} = $i; |
|
41 |
|
|
42 |
if ( defined($row->{cp_birthday}) ) { |
|
43 |
push(@auto_data, $row); |
|
44 |
} else { |
|
45 |
push(@data, $row); |
|
46 |
} |
|
47 |
} |
|
48 |
|
|
49 |
$::form->{data} = \@data; |
|
50 |
$::form->{auto_data} = \@auto_data; |
|
51 |
$::form->{row_length} = $i; |
|
52 |
|
|
53 |
if (@data) { |
|
54 |
print $::form->parse_html_template('dbupgrade/contacts_convert_cp_birthday_to_date_form'); |
|
55 |
return 2; |
|
56 |
} else { |
|
57 |
$sql = <<SQL; |
|
58 |
ALTER TABLE contacts DROP COLUMN cp_birthday; |
|
59 |
ALTER TABLE contacts ADD COLUMN cp_birthday date; |
|
60 |
SQL |
|
61 |
|
|
62 |
$dbh->do($sql); |
|
63 |
|
|
64 |
$sql = <<SQL; |
|
65 |
UPDATE contacts |
|
66 |
SET cp_birthday = ? |
|
67 |
WHERE cp_id = ? |
|
68 |
SQL |
|
69 |
|
|
70 |
$sth = $dbh->prepare($sql) or die $dbh->errstr; |
|
71 |
|
|
72 |
foreach (grep { $_->{cp_birthday} ne '' } @auto_data) { |
|
73 |
$sth->execute($_->{cp_birthday}, $_->{cp_id}) or die $dbh->errstr; |
|
74 |
} |
|
75 |
|
|
76 |
return 1; |
|
77 |
} |
|
78 |
} |
|
79 |
|
|
80 |
return update(); |
templates/webpages/ct/_contact.html | ||
---|---|---|
115 | 115 |
|
116 | 116 |
<tr> |
117 | 117 |
<th align="left" nowrap>[% 'Birthday' | $T8 %]</th> |
118 |
<td><input id="cp_birthday" name="cp_birthday" size="40" value="[% HTML.escape(cp_birthday) %]"></td> |
|
118 |
<td> |
|
119 |
[% L.date_tag('cp_birthday', cp_birthday) %] |
|
120 |
</td> |
|
119 | 121 |
</tr> |
120 | 122 |
|
121 | 123 |
<tr> |
templates/webpages/dbupgrade/contacts_convert_cp_birthday_to_date_form.html | ||
---|---|---|
1 |
[%- USE HTML %] |
|
2 |
[%- USE L %] |
|
3 |
[%- USE LxERP %] |
|
4 |
|
|
5 |
<h1>[%- LxERP.t8('Conversion of "birthday" contact person attribute') %]</h1> |
|
6 |
|
|
7 |
<p> |
|
8 |
[%- LxERP.t8('The contact person attribute "birthday" is converted from a free-form text field into a date field.') %] |
|
9 |
[%- LxERP.t8('This requires you to manually correct entries for which an automatic conversion failed and to check those for which it succeeded.') %] |
|
10 |
</p> |
|
11 |
|
|
12 |
[% BLOCK birthday_table %] |
|
13 |
<table> |
|
14 |
|
|
15 |
<tr> |
|
16 |
<th>[%- LxERP.t8('Database ID') %]</th> |
|
17 |
<th>[%- LxERP.t8('Name') %]</th> |
|
18 |
<th>[%- LxERP.t8('Given Name') %]</th> |
|
19 |
<th>[%- LxERP.t8('Birthday (before conversion)') %]</th> |
|
20 |
<th>[%- LxERP.t8('Birthday (after conversion)') %]</th> |
|
21 |
</tr> |
|
22 |
|
|
23 |
[% FOREACH row IN data %] |
|
24 |
<tr class="listrow[% loop.count % 2 %]"> |
|
25 |
<input type="hidden" name="cp_id_[% row.row_index %]" value="[% row.cp_id %]"> |
|
26 |
|
|
27 |
<td>[% row.cp_id %]</td> |
|
28 |
<td>[% row.cp_givenname | html %]</td> |
|
29 |
<td>[% row.cp_name | html %]</td> |
|
30 |
<td>[% row.cp_birthday_old | html %]</td> |
|
31 |
<td>[% L.date_tag('cp_birthday_'_ row.row_index, row.cp_birthday) %]</td> |
|
32 |
</tr> |
|
33 |
[% END %] |
|
34 |
|
|
35 |
</table> |
|
36 |
[% END %] |
|
37 |
|
|
38 |
<form action="[% script %]" method="POST"> |
|
39 |
<h2>[%- LxERP.t8('Entries for which automatic conversion failed:') %]</h2> |
|
40 |
[% PROCESS birthday_table data = data %] |
|
41 |
|
|
42 |
<h2>[%- LxERP.t8('Entries for which automatic conversion succeeded:') %]</h2> |
|
43 |
[% PROCESS birthday_table data = auto_data %] |
|
44 |
|
|
45 |
<input type="hidden" name="row_length" value="[% row_length %]"> |
|
46 |
<input type="hidden" name="action" value="LoginScreen/login"> |
|
47 |
<input type="submit" name="form_submitted" value="save"> |
|
48 |
</form> |
Auch abrufbar als: Unified diff
Kontaktpersonenfeld von Freitext auf Datum umstelen
Basierend auf Patch von Thomas Heck <t.heck@linet-services.de> mit
Verfeinerungen von mir.
Implementiert #2021.