Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 3ccf1a99

Von Moritz Bunkus vor etwa 12 Jahren hinzugefügt

  • ID 3ccf1a99fce36f76d43c8394b683b88ff14679ff
  • Vorgänger 8c62c86a
  • Nachfolger 5c7cee58

Kontaktpersonenfeld von Freitext auf Datum umstelen

Basierend auf Patch von Thomas Heck <> mit
Verfeinerungen von mir.

Implementiert #2021.

Unterschiede anzeigen:

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&auml;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 &quot;Delete&quot; column.' => 'Lagerpl&auml;tze, die bereits benutzt wurden, k&ouml;nnen nicht mehr gel&ouml;scht werden. Deswegen fehlt bei ihnen die Checkbox in der Spalte &quot;L&ouml;schen&quot;.',
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&ouml;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 &auml;ndert die Art und Weise wie Lagermengen gez&auml;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