cda92006c3eaf015dab80a0b83b9e305595eadd1
[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 # @encoding: utf-8
5 package SL::DBUpgrade2::orderitems_delivery_order_items_positions;
6
7 use strict;
8 use utf8;
9
10 use parent qw(SL::DBUpgrade2::Base);
11
12 sub run {
13   my ($self) = @_;
14
15   my %order_id_cols = (
16     orderitems           => 'trans_id',
17     delivery_order_items => 'delivery_order_id',
18   );
19
20   foreach my $table ( keys %order_id_cols ) {
21
22     my $query = qq|ALTER TABLE $table ADD position INTEGER|;
23     $self->db_query($query);
24
25
26     my $order_id_col = $order_id_cols{ $table };
27     $query = qq|SELECT * FROM $table ORDER BY $order_id_col, id|;
28
29     my $sth = $self->dbh->prepare($query);
30     $sth->execute || $::form->dberror($query);
31
32     # set new position field in order of ids, starting by one for each order
33     my $last_order_id;
34     my $position;
35     while (my $ref = $sth->fetchrow_hashref("NAME_lc")) {
36       if ($ref->{ $order_id_col } != $last_order_id) {
37         $position = 1;
38       } else {
39         $position++;
40       }
41       $last_order_id = $ref->{ $order_id_col };
42
43       $query = qq|UPDATE $table SET position = ? WHERE id = ?|;
44       $self->db_query($query, bind => [ $position, $ref->{id} ]);
45     }
46     $sth->finish;
47
48
49     $query = qq|ALTER TABLE $table ALTER COLUMN position SET NOT NULL|;
50     $self->db_query($query);
51   }
52
53   return 1;
54 }
55
56 1;