Telefonnotizen: in Berichten Angebot/Auftrag filtern können.
[kivitendo-erp.git] / sql / Pg-upgrade2 / acc_trans_id_uniqueness.pl
1 # @tag: acc_trans_id_uniqueness
2 # @description: Sorgt dafür, dass acc_trans.acc_trans_id eindeutig ist
3 # @depends: release_2_6_1
4 package SL::DBUpgrade2::acc_trans_id_uniqueness;
5
6 use utf8;
7 use strict;
8
9 use parent qw(SL::DBUpgrade2::Base);
10
11 use SL::DBUtils;
12
13 sub run {
14   my ($self) = @_;
15
16   my $query = <<SQL;
17     SELECT acc_trans_id, trans_id, itime, mtime
18     FROM acc_trans
19     WHERE acc_trans_id IN (
20       SELECT acc_trans_id FROM acc_trans GROUP BY acc_trans_id HAVING COUNT(*) > 1
21     )
22     ORDER BY trans_id, itime, mtime NULLS FIRST
23 SQL
24
25   my @entries = selectall_hashref_query($::form, $self->dbh, $query);
26
27   return 1 unless @entries;
28
29   $query = <<SQL;
30     SELECT setval('acc_trans_id_seq', (
31       SELECT COALESCE(MAX(acc_trans_id), 0) + 1
32       FROM acc_trans
33     ))
34 SQL
35
36   $self->db_query($query);
37
38   my %skipped_acc_trans_ids;
39   foreach my $entry (@entries) {
40     if (!$skipped_acc_trans_ids{ $entry->{acc_trans_id} }) {
41       $skipped_acc_trans_ids{ $entry->{acc_trans_id} } = 1;
42     } else {
43       my $mtime = $entry->{mtime} ? "= '$entry->{mtime}'" : 'IS NULL';
44       $query    = <<SQL;
45         UPDATE acc_trans
46         SET acc_trans_id = nextval('acc_trans_id_seq')
47         WHERE (acc_trans_id = $entry->{acc_trans_id})
48           AND (trans_id     = $entry->{trans_id})
49           AND (itime        = '$entry->{itime}')
50           AND (mtime $mtime)
51 SQL
52
53       $self->db_query($query);
54     }
55   }
56
57   return 1;
58 }
59
60 1;