Merge branch 'b-3.6.1' of ../kivitendo-erp_20220811
[kivitendo-erp.git] / sql / Pg-upgrade2 / orderitems_delivery_order_items_positions.pl
1 # @tag: orderitems_delivery_order_items_positions
2 # @description: Spalte für Positionen der Einträge in Angeboten/Auftträgen und Lieferscheinen.
3 # @depends: release_3_1_0
4 package SL::DBUpgrade2::orderitems_delivery_order_items_positions;
5
6 use strict;
7 use utf8;
8
9 use parent qw(SL::DBUpgrade2::Base);
10
11 sub run {
12   my ($self) = @_;
13
14   my %order_id_cols = (
15     orderitems           => 'trans_id',
16     delivery_order_items => 'delivery_order_id',
17   );
18
19   foreach my $table ( keys %order_id_cols ) {
20
21     my $query = qq|ALTER TABLE $table ADD position INTEGER|;
22     $self->db_query($query);
23
24
25     my $order_id_col = $order_id_cols{ $table };
26     $query = qq|SELECT * FROM $table ORDER BY $order_id_col, id|;
27     my $query2 = qq|UPDATE $table SET position = ? WHERE id = ?|;
28
29     my $sth = $self->dbh->prepare($query);
30     my $sth2 = $self->dbh->prepare($query2);
31     $sth->execute || $::form->dberror($query);
32
33     # set new position field in order of ids, starting by one for each order
34     my $last_order_id;
35     my $position;
36     while (my $ref = $sth->fetchrow_hashref("NAME_lc")) {
37       if ($ref->{ $order_id_col } != $last_order_id) {
38         $position = 1;
39       } else {
40         $position++;
41       }
42       $last_order_id = $ref->{ $order_id_col };
43
44       $sth2->execute($position, $ref->{id});
45     }
46     $sth->finish;
47     $sth2->finish;
48
49
50     $query = qq|ALTER TABLE $table ALTER COLUMN position SET NOT NULL|;
51     $self->db_query($query);
52   }
53
54   return 1;
55 }
56
57 1;