View | Details | Raw Unified | Return to bug 23916
Collapse All | Expand All

(-)a/installer/data/mysql/atomicupdate/bug_23916_add_issues_issuer.perl (+50 lines)
Line 0 Link Here
1
$DBversion = 'XXX'; # will be replaced by the RM
2
if( CheckVersion( $DBversion ) ) {
3
    if( !column_exists( 'issues', 'issuer' ) ) {
4
        $dbh->do( q| ALTER TABLE issues ADD issuer INT(11) AFTER borrowernumber | );
5
    }
6
    if (!foreign_key_exists( 'issues', 'issues_ibfk_borrowers_borrowernumber' )) {
7
        $dbh->do( q| ALTER TABLE issues ADD CONSTRAINT `issues_ibfk_borrowers_borrowernumber` FOREIGN KEY (`issuer`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE SET NULL ON UPDATE CASCADE | );
8
    }
9
    if( !column_exists( 'old_issues', 'issuer' ) ) {
10
        $dbh->do( q| ALTER TABLE old_issues ADD issuer INT(11) AFTER borrowernumber | );
11
    }
12
    if (!foreign_key_exists( 'old_issues', 'old_issues_ibfk_borrowers_borrowernumber' )) {
13
        $dbh->do( q| ALTER TABLE old_issues ADD CONSTRAINT `old_issues_ibfk_borrowers_borrowernumber` FOREIGN KEY (`issuer`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE SET NULL ON UPDATE CASCADE | );
14
    }
15
16
    # Now attempt to migrate previously action logged issues into issues.issuer
17
    # We assume that an item issued to a borrower on the same day is the same issue
18
    #
19
    # Get existing action logs
20
    # - user = issuer
21
    # - object = borrowernumber
22
    # - info = itemnumber
23
    my $action_logs = $dbh->selectall_arrayref("SELECT DATE(timestamp) AS dt, user, object, info FROM action_logs WHERE module='CIRCULATION' and action='ISSUE'", { Slice => {} });
24
25
    foreach my $log( @{$action_logs} ) {
26
        # Look for an issue of this item, to this borrower, on this day
27
        # We're doing DATE comparison in the database to avoid invoking
28
        # DateTime and it's performance sapping ways...
29
        #
30
        # If we're dealing with an actual borrower
31
        if ($log->{user} != 0) {
32
            my $done_issue = $dbh->do(
33
                "UPDATE issues SET issuer = ? WHERE DATE(timestamp) = ? AND borrowernumber = ? AND itemnumber = ?",
34
                undef,
35
                ( $log->{user}, $log->{dt}, $log->{object}, $log->{info} )
36
            );
37
            # If we didn't find the issue in 'issues', look in 'old_issues'
38
            if (!$done_issue) {
39
                $dbh->do(
40
                    "UPDATE old_issues SET issuer = ? WHERE DATE(timestamp) = ? AND borrowernumber = ? AND itemnumber = ?",
41
                    undef,
42
                    ( $log->{user}, $log->{dt}, $log->{object}, $log->{info} )
43
                );
44
            }
45
        }
46
    }
47
48
    SetVersion( $DBversion );
49
    print "Upgrade to $DBversion done (Bug 23916 - Add issues.issuer)\n";
50
}
(-)a/installer/data/mysql/kohastructure.sql (-3 / +7 lines)
Lines 1662-1667 DROP TABLE IF EXISTS `issues`; Link Here
1662
CREATE TABLE `issues` ( -- information related to check outs or issues
1662
CREATE TABLE `issues` ( -- information related to check outs or issues
1663
  `issue_id` int(11) NOT NULL AUTO_INCREMENT, -- primary key for issues table
1663
  `issue_id` int(11) NOT NULL AUTO_INCREMENT, -- primary key for issues table
1664
  `borrowernumber` int(11), -- foreign key, linking this to the borrowers table for the patron this item was checked out to
1664
  `borrowernumber` int(11), -- foreign key, linking this to the borrowers table for the patron this item was checked out to
1665
  `issuer` int(11), -- foreign key, linking this to the borrowers table for the user who checked out this item
1665
  `itemnumber` int(11), -- foreign key, linking this to the items table for the item that was checked out
1666
  `itemnumber` int(11), -- foreign key, linking this to the items table for the item that was checked out
1666
  `date_due` datetime default NULL, -- datetime the item is due (yyyy-mm-dd hh:mm::ss)
1667
  `date_due` datetime default NULL, -- datetime the item is due (yyyy-mm-dd hh:mm::ss)
1667
  `branchcode` varchar(10) default NULL, -- foreign key, linking to the branches table for the location the item was checked out
1668
  `branchcode` varchar(10) default NULL, -- foreign key, linking to the branches table for the location the item was checked out
Lines 1683-1689 CREATE TABLE `issues` ( -- information related to check outs or issues Link Here
1683
  KEY `branchcode_idx` (`branchcode`),
1684
  KEY `branchcode_idx` (`branchcode`),
1684
  KEY `bordate` (`borrowernumber`,`timestamp`),
1685
  KEY `bordate` (`borrowernumber`,`timestamp`),
1685
  CONSTRAINT `issues_ibfk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE RESTRICT ON UPDATE CASCADE,
1686
  CONSTRAINT `issues_ibfk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE RESTRICT ON UPDATE CASCADE,
1686
  CONSTRAINT `issues_ibfk_2` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`) ON DELETE RESTRICT ON UPDATE CASCADE
1687
  CONSTRAINT `issues_ibfk_2` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`) ON DELETE RESTRICT ON UPDATE CASCADE,
1688
  CONSTRAINT `issues_ibfk_borrowers_borrowernumber` FOREIGN KEY (`issuer`) REFERENCES `borrowers` (`borrowernumber`) ON DELETE SET NULL ON UPDATE CASCADE
1687
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
1689
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
1688
1690
1689
--
1691
--
Lines 1694-1699 DROP TABLE IF EXISTS `old_issues`; Link Here
1694
CREATE TABLE `old_issues` ( -- lists items that were checked out and have been returned
1696
CREATE TABLE `old_issues` ( -- lists items that were checked out and have been returned
1695
  `issue_id` int(11) NOT NULL, -- primary key for issues table
1697
  `issue_id` int(11) NOT NULL, -- primary key for issues table
1696
  `borrowernumber` int(11) default NULL, -- foreign key, linking this to the borrowers table for the patron this item was checked out to
1698
  `borrowernumber` int(11) default NULL, -- foreign key, linking this to the borrowers table for the patron this item was checked out to
1699
  `issuer` int(11) default NULL, -- foreign key, linking this to the borrowers table for the user who checked out this item
1697
  `itemnumber` int(11) default NULL, -- foreign key, linking this to the items table for the item that was checked out
1700
  `itemnumber` int(11) default NULL, -- foreign key, linking this to the items table for the item that was checked out
1698
  `date_due` datetime default NULL, -- date the item is due (yyyy-mm-dd)
1701
  `date_due` datetime default NULL, -- date the item is due (yyyy-mm-dd)
1699
  `branchcode` varchar(10) default NULL, -- foreign key, linking to the branches table for the location the item was checked out
1702
  `branchcode` varchar(10) default NULL, -- foreign key, linking to the branches table for the location the item was checked out
Lines 1716-1722 CREATE TABLE `old_issues` ( -- lists items that were checked out and have been r Link Here
1716
  CONSTRAINT `old_issues_ibfk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`)
1719
  CONSTRAINT `old_issues_ibfk_1` FOREIGN KEY (`borrowernumber`) REFERENCES `borrowers` (`borrowernumber`)
1717
    ON DELETE SET NULL ON UPDATE SET NULL,
1720
    ON DELETE SET NULL ON UPDATE SET NULL,
1718
  CONSTRAINT `old_issues_ibfk_2` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`)
1721
  CONSTRAINT `old_issues_ibfk_2` FOREIGN KEY (`itemnumber`) REFERENCES `items` (`itemnumber`)
1719
    ON DELETE SET NULL ON UPDATE SET NULL
1722
    ON DELETE SET NULL ON UPDATE SET NULL,
1723
  CONSTRAINT `old_issues_ibfk_borrowers_borrowernumber` FOREIGN KEY (`issuer`) REFERENCES `borrowers` (`borrowernumber`)
1724
    ON DELETE SET NULL ON UPDATE CASCADE
1720
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
1725
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
1721
1726
1722
--
1727
--
1723
- 

Return to bug 23916