Merge branch 'b-3.6.1' of ../kivitendo-erp_20220811
[kivitendo-erp.git] / sql / Pg-upgrade2 / record_links_bt_acc_trans.pl
1 # @tag: record_links_bt_acc_trans
2 # @description: RecordLinks von bt nach acc_trans
3 # @depends: release_3_5_3
4 package SL::DBUpgrade2::record_links_bt_acc_trans;
5
6 use strict;
7 use utf8;
8
9 use parent qw(SL::DBUpgrade2::Base);
10
11 use SL::DBUtils;
12 use SL::RecordLinks;
13
14
15 sub run {
16   my ($self) = @_;
17
18   my $query_table =
19     qq|
20
21       CREATE SEQUENCE bank_transaction_acc_trans_id_seq;
22       CREATE TABLE bank_transaction_acc_trans (
23         id                      integer NOT NULL DEFAULT nextval('bank_transaction_acc_trans_id_seq'),
24         bank_transaction_id     integer NOT NULL,
25         acc_trans_id            bigint  NOT NULL,
26         ar_id                   integer,
27         ap_id                   integer,
28         gl_id                   integer,
29         itime                   TIMESTAMP      DEFAULT now(),
30         mtime                   TIMESTAMP,
31         PRIMARY KEY (bank_transaction_id, acc_trans_id),
32         FOREIGN KEY (bank_transaction_id)      REFERENCES bank_transactions (id),
33         FOREIGN KEY (acc_trans_id)             REFERENCES acc_trans (acc_trans_id),
34         FOREIGN KEY (ar_id)                    REFERENCES ar (id),
35         FOREIGN KEY (ap_id)                    REFERENCES ap (id),
36         FOREIGN KEY (gl_id)                    REFERENCES gl (id));|;
37
38   $self->db_query($query_table);
39
40
41   my $query = qq|SELECT to_id, itime, from_id, to_table
42                  FROM record_links
43                  WHERE from_table='bank_transactions'|;
44
45   my $sth = $self->dbh->prepare($query);
46
47   my $sql       = <<SQL;
48     SELECT
49      acc_trans_id
50     FROM acc_trans
51     WHERE trans_id = ?
52     AND itime = ?
53     AND (chart_link='AR' OR chart_link='AP' OR chart_link ilike '%paid%');
54 SQL
55
56   my $sth_acc_trans_ids = $self->dbh->prepare($sql) or die $self->dbh->errstr;
57
58   my $sql_insert       = <<SQL;
59   INSERT INTO bank_transaction_acc_trans (bank_transaction_id, acc_trans_id, ar_id, ap_id, gl_id)
60   VALUES ( ?, ?, ?, ?, ?);
61 SQL
62
63   my $sth_insert = $self->dbh->prepare($sql_insert) or die $self->dbh->errstr;
64
65
66   # get all current record links from bank to arap
67   $sth->execute() or die $self->dbh->errstr;
68
69   while (my $rl_ref = $sth->fetchrow_hashref("NAME_lc")) {
70
71     # get all concurrent acc_trans entries (payment) for this transaction
72     $sth_acc_trans_ids->execute($rl_ref->{to_id}, $rl_ref->{itime}) or die $self->dbh->errstr;
73     while (my $ac_ref = $sth_acc_trans_ids->fetchrow_hashref("NAME_lc")) {
74       my $ar_id = $rl_ref->{to_table} eq 'ar' ? $rl_ref->{to_id} : undef;
75       my $ap_id = $rl_ref->{to_table} eq 'ap' ? $rl_ref->{to_id} : undef;
76       my $gl_id = $rl_ref->{to_table} eq 'gl' ? $rl_ref->{to_id} : undef;
77       $sth_insert->execute($rl_ref->{from_id},$ac_ref->{acc_trans_id},
78                            $ar_id, $ap_id, $gl_id) or die $self->dbh->errstr;
79     }
80   }
81   return 1;
82 }
83
84 1;