[Koha-patches] [PATCH] Early patch for analytical records feature. Users can create an analytical record by choosing an item record belonging to the parent bib, the analytical record is then linked to both the item and the parent bib in a new table.

amit amit.gupta at osslabs.biz
Thu Oct 21 13:43:53 CEST 2010


From: Amit Gupta <amit.gupta at osslabs.biz>

In the records detail page in the staff interface, we display both items belonging exclusively to the analytical record and those that it links to via the parent bib.

To dos - automatically populate 773 and 774, also a way to import analytical records including relationships to items and parent bibs.
---
 C4/Biblio.pm                                       |   38 +++++++++++++++++++
 C4/Items.pm                                        |   40 ++++++++++++++++++--
 catalogue/detail.pl                                |    6 +++
 cataloguing/addbiblio.pl                           |   35 ++++++++++++++++-
 installer/data/mysql/kohastructure.sql             |   16 ++++++++
 installer/data/mysql/updatedatabase.pl             |   23 ++++++++++-
 .../prog/en/modules/catalogue/detail.tmpl          |   10 +++++
 .../prog/en/modules/catalogue/moredetail.tmpl      |    2 +-
 .../prog/en/modules/cataloguing/addbiblio.tmpl     |    6 +++
 kohaversion.pl                                     |    2 +-
 10 files changed, 167 insertions(+), 11 deletions(-)

diff --git a/C4/Biblio.pm b/C4/Biblio.pm
index 81ccfbb..4422fe9 100644
--- a/C4/Biblio.pm
+++ b/C4/Biblio.pm
@@ -72,6 +72,7 @@ BEGIN {
       &GetMarcBiblio
       &GetMarcAuthors
       &GetMarcSeries
+      &GetMarcAnalytical
       GetMarcUrls
       &GetUsedMarcStructure
       &GetXmlBiblio
@@ -1553,6 +1554,43 @@ sub GetMarcSeries {
     return $marcseriessarray;
 }    #end getMARCseriess
 
+=head2 GetMarcAnalytical
+=cut
+
+sub GetMarcAnalytical {
+    my ( $record, $marcflavour ) = @_;
+    my ( $tag);
+    if ( $marcflavour eq "MARC21" ) {
+        $tag = "773";
+    } else {    # assume unimarc if not marc21
+           $tag="773"; 
+            }
+
+    my $hostbibnumber;
+    my $hosttitle;
+
+    foreach my $field ( $record->field('773')) {
+        my @subfields_loop;
+
+        my @subfields = $field->subfields();
+
+        for my $host_subfield (@subfields) {
+       
+           
+            if ( $host_subfield->[0] eq 'w' ) {  #Record control number
+               $hostbibnumber=$host_subfield->[1];
+            }
+
+            if ( $host_subfield->[0] eq 'a' ) {  #Main entry heading
+                $hosttitle=$host_subfield->[1];
+            }
+                  
+        }
+   
+    }
+  	return ($hostbibnumber, $hosttitle);
+}    
+
 =head2 GetFrameworkCode
 
   $frameworkcode = GetFrameworkCode( $biblionumber )
diff --git a/C4/Items.pm b/C4/Items.pm
index 794bff7..79d73f5 100644
--- a/C4/Items.pm
+++ b/C4/Items.pm
@@ -1169,6 +1169,7 @@ sub GetItemsInfo {
     my ( $biblionumber, $type ) = @_;
     my $dbh   = C4::Context->dbh;
     # note biblioitems.* must be avoided to prevent large marc and marcxml fields from killing performance.
+    # Introducing union all, this is for analytical records - to fetch regular items and items linked to parent bibs
     my $query = "
     SELECT items.*,
            biblio.*,
@@ -1186,16 +1187,47 @@ sub GetItemsInfo {
            items.notforloan as itemnotforloan,
            itemtypes.description,
            itemtypes.notforloan as notforloan_per_itemtype,
-           branchurl
+           branchurl,
+	   branches.branchname,
+           items.dateaccessioned
+     FROM analytical_records
+     LEFT JOIN items ON analytical_records.itemnumber = items.itemnumber
+     LEFT JOIN branches ON items.homebranch = branches.branchcode
+     LEFT JOIN biblio ON analytical_records.biblionumber = biblio.biblionumber
+     LEFT JOIN biblioitems ON analytical_records.biblioitemnumber =biblioitems.biblioitemnumber
+     LEFT JOIN itemtypes   ON   itemtypes.itemtype         = "
+. (C4::Context->preference('item-level_itypes') ? 'items.itype' : 'biblioitems.itemtype');
+$query .=" WHERE analytical_records.biblionumber =".$biblionumber;        
+$query .=" UNION
+SELECT items.*,
+           biblio.*,
+           biblioitems.volume,
+           biblioitems.number,
+           biblioitems.itemtype,
+           biblioitems.isbn,
+           biblioitems.issn,
+           biblioitems.publicationyear,
+           biblioitems.publishercode,
+           biblioitems.volumedate,
+           biblioitems.volumedesc,
+           biblioitems.lccn,
+           biblioitems.url,
+           items.notforloan as itemnotforloan,
+           itemtypes.description,
+           itemtypes.notforloan as notforloan_per_itemtype,
+           branchurl,
+	   branches.branchname,
+           items.dateaccessioned
      FROM items
      LEFT JOIN branches ON items.homebranch = branches.branchcode
      LEFT JOIN biblio      ON      biblio.biblionumber     = items.biblionumber
      LEFT JOIN biblioitems ON biblioitems.biblioitemnumber = items.biblioitemnumber
      LEFT JOIN itemtypes   ON   itemtypes.itemtype         = "
-     . (C4::Context->preference('item-level_itypes') ? 'items.itype' : 'biblioitems.itemtype');
-    $query .= " WHERE items.biblionumber = ? ORDER BY branches.branchname,items.dateaccessioned desc" ;
+   . (C4::Context->preference('item-level_itypes') ? 'items.itype' : 'biblioitems.itemtype');
+   $query .="   WHERE items.biblionumber =".$biblionumber;
+   $query .=" ORDER BY 19" ;
     my $sth = $dbh->prepare($query);
-    $sth->execute($biblionumber);
+    $sth->execute();
     my $i = 0;
     my @results;
     my $serial;
diff --git a/catalogue/detail.pl b/catalogue/detail.pl
index 4f6c23f..3f7bbae 100755
--- a/catalogue/detail.pl
+++ b/catalogue/detail.pl
@@ -93,6 +93,9 @@ my $marcseriesarray  = GetMarcSeries($record,$marcflavour);
 my $marcurlsarray    = GetMarcUrls    ($record,$marcflavour);
 my $subtitle         = GetRecordValue('subtitle', $record, $fw);
 
+# get host (773) title and biblionumber for display
+my ($hostbibnumber, $hosttitle)  = GetMarcAnalytical($record,$marcflavour);
+
 # Get Branches, Itemtypes and Locations
 my $branches = GetBranches();
 my $itemtypes = GetItemTypes();
@@ -206,6 +209,9 @@ $template->param(
 	MARCSUBJCTS => $marcsubjctsarray,
 	MARCAUTHORS => $marcauthorsarray,
 	MARCSERIES  => $marcseriesarray,
+# Next two fields related to host (773) of the biblio
+        hostbibnumber  => $hostbibnumber, 
+        hosttitle => $hosttitle,
 	MARCURLS => $marcurlsarray,
 	subtitle    => $subtitle,
 	itemdata_ccode      => $itemfields{ccode},
diff --git a/cataloguing/addbiblio.pl b/cataloguing/addbiblio.pl
index fc56047..6961624 100755
--- a/cataloguing/addbiblio.pl
+++ b/cataloguing/addbiblio.pl
@@ -818,18 +818,35 @@ AND (authtypecode IS NOT NULL AND authtypecode<>\"\")|);
   return ($countlinked,$countcreated);
 }
 
-# ========================
+# Sub to link analytical records to parent biblio and to corressponding item record
+sub link_analytical_to_parent {
+    my ($parentbiblionumber, $analyticalbiblionumber, $itemnumber, $bibitemnum ) = @_;
+    my $dbh = C4::Context->dbh;
+    my $sth = $dbh->prepare( 'INSERT INTO analytical_records (parentbiblionumber, biblionumber, itemnumber, biblioitemnumber) values(?,?,?,?)' );
+    $sth->execute( $parentbiblionumber, $analyticalbiblionumber, $itemnumber, $bibitemnum  );
+  }
+
+
+#========================
 #          MAIN
 #=========================
 my $input = new CGI;
 my $error = $input->param('error');
 my $biblionumber  = $input->param('biblionumber'); # if biblionumber exists, it's a modif, not a new biblio.
+my $itemnumber  = $input->param('itemnumber');
+my $oldbibitemnum => $input->param('oldbibitemnum');
 my $breedingid    = $input->param('breedingid');
 my $z3950         = $input->param('z3950');
 my $op            = $input->param('op');
 my $mode          = $input->param('mode');
 my $frameworkcode = $input->param('frameworkcode');
 my $redirect      = $input->param('redirect');
+
+# Next three parameters related to analytical records
+my $parentbiblionumber  = $input->param('parentbiblionumber');
+my $analytical_record = $input->param('analytical_record'); #if this is an analytical record
+my $analyticalbiblionumber  = $input->param('analyticalbiblionumber');
+
 my $dbh           = C4::Context->dbh;
 
 my $userflags = ($frameworkcode eq 'FA') ? "fast_cataloging" : "edit_catalogue";
@@ -931,6 +948,14 @@ if ( $op eq "addbiblio" ) {
             ( $biblionumber, $oldbibitemnum ) = AddBiblio( $record, $frameworkcode );
         }
 
+
+# if analytical record, call sub to link record to parent biblio and to item record
+        if ($analytical_record eq 1){
+
+		link_analytical_to_parent($parentbiblionumber, $biblionumber, $itemnumber, $oldbibitemnum );
+	}
+	     
+       
         if (($mode ne "popup" && !$is_a_modif) || $redirect eq "items"){
             print $input->redirect(
                 "/cgi-bin/koha/cataloguing/additem.pl?biblionumber=$biblionumber&frameworkcode=$frameworkcode"
@@ -954,6 +979,7 @@ if ( $op eq "addbiblio" ) {
 		}else {
           $template->param(
             biblionumber => $biblionumber,
+            
             done         =>1,
             popup        =>1
           );
@@ -1014,6 +1040,11 @@ elsif ( $op eq "delete" ) {
         biblioitemnumtagfield    => $biblioitemnumtagfield,
         biblioitemnumtagsubfield => $biblioitemnumtagsubfield,
         biblioitemnumber         => $biblioitemnumber,
+
+# parameters related to analytical records        
+	parentbiblionumber => $parentbiblionumber,
+        analytical_record => $analytical_record,
+        itemnumber => $itemnumber,
     );
 }
 
@@ -1022,6 +1053,6 @@ $template->param(
     popup => $mode,
     frameworkcode => $frameworkcode,
     itemtype => $frameworkcode,
-);
+   );
 
 output_html_with_http_headers $input, $cookie, $template->output;
diff --git a/installer/data/mysql/kohastructure.sql b/installer/data/mysql/kohastructure.sql
index e42652c..d1f57fb 100644
--- a/installer/data/mysql/kohastructure.sql
+++ b/installer/data/mysql/kohastructure.sql
@@ -2585,6 +2585,22 @@ CREATE TABLE `fieldmapping` (
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
 
+--
+-- Table structure for table `analytical_records`
+--
+
+DROP TABLE IF EXISTS `analytical_records`;
+CREATE TABLE `analytical_records` (
+       `analyticalrecordid` int(11) NOT NULL auto_increment,
+       `parentbiblionumber` int(11) NOT NULL default '0',
+       `biblionumber` int(11) NOT NULL default '0',
+       `itemnumber` int(11) NOT NULL default '0',
+       `biblioitemnumber` int(11) NOT NULL default '0',
+        KEY `analyticalrecordididx` (`analyticalrecordid`),
+        KEY `bibidx` (`parentbiblionumber`,`biblionumber`,`itemnumber`,`biblioitemnumber`),
+        CONSTRAINT `parentbiblionumber_ibfk_1` FOREIGN KEY (`parentbiblionumber`) REFERENCES `biblio` (`biblionumber`) ON DELETE CASCADE
+     ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
 /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
 /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
 /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl
index 2bd4e21..0f7225e 100755
--- a/installer/data/mysql/updatedatabase.pl
+++ b/installer/data/mysql/updatedatabase.pl
@@ -1396,7 +1396,7 @@ if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
 
 $DBversion = "3.00.00.074";
 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
-    $dbh->do( q(update itemtypes set imageurl = concat( 'npl/', imageurl )
+    $dbh->do(qq(update itemtypes set imageurl = concat( 'npl/', imageurl )
                   where imageurl not like 'http%'
                     and imageurl is not NULL
                     and imageurl != '') );
@@ -1406,7 +1406,7 @@ if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
 
 $DBversion = "3.00.00.075";
 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
-    $dbh->do( q(alter table authorised_values add imageurl varchar(200) default NULL) );
+    $dbh->do( qq(alter table authorised_values add imageurl varchar(200) default NULL) );
     print "Upgrade to $DBversion done (adding imageurl field to authorised_values table)\n";
     SetVersion ($DBversion);
 }
@@ -1541,7 +1541,7 @@ if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
 
 $DBversion = "3.00.00.082";
 if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
-    $dbh->do( q(alter table accountlines add column lastincrement decimal(28,6) default NULL) );
+    $dbh->do( qq(alter table accountlines add column lastincrement decimal(28,6) default NULL) );
     print "Upgrade to $DBversion done (adding lastincrement column to accountlines table)\n";
     SetVersion ($DBversion);
 }
@@ -3745,6 +3745,23 @@ if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
 }
 
 
+$DBversion = "3.01.01.000";
+ if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
+     $dbh->do("CREATE TABLE `analytical_records` (
+       `analyticalrecordid` int(11) NOT NULL auto_increment,
+       `parentbiblionumber` int(11) NOT NULL default '0',
+       `biblionumber` int(11) NOT NULL default '0',
+       `itemnumber` int(11) NOT NULL default '0',
+       `biblioitemnumber` int(11) NOT NULL default '0',
+        KEY `analyticalrecordididx` (`analyticalrecordid`),
+        KEY `bibidx` (`parentbiblionumber`,`biblionumber`,`itemnumber`,`biblioitemnumber`),
+        CONSTRAINT `parentbiblionumber_ibfk_1` FOREIGN KEY (`parentbiblionumber`) REFERENCES `biblio` (`biblionumber`) ON DELETE CASCADE
+     ) ENGINE=InnoDB;");
+  print "Upgrade to $DBversion done (Analytical Records)\n";
+  SetVersion ($DBversion);
+}
+
+
 =item DropAllForeignKeys($table)
 
   Drop all foreign keys of the table $table
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tmpl b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tmpl
index 1861028..8e2af82 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tmpl
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tmpl
@@ -101,6 +101,16 @@ function verify_images() {
 		</ul>
 		</li>
 <!-- /TMPL_IF -->
+<!-- TMPL_IF NAME="hosttitle" -->
+		<li><strong>Host Record: </strong>
+		Title:<a href="/cgi-bin/koha/catalogue/search.pl?q=Local-number:<!-- TMPL_VAR NAME="hostbibnumber" ESCAPE="url"-->"><!-- TMPL_VAR NAME="hosttitle" --></a>
+		
+		
+		</li>
+<!-- /TMPL_IF -->
+
+
+
         <!-- TMPL_IF name="publishercode" -->
     <li><strong>Published by:</strong>
         <a href="/cgi-bin/koha/catalogue/search.pl?q=pb:<!-- TMPL_VAR NAME="publishercode" ESCAPE="url" -->">
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/moredetail.tmpl b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/moredetail.tmpl
index 8577193..cfdd24a 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/moredetail.tmpl
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/moredetail.tmpl
@@ -42,7 +42,7 @@
     <!-- TMPL_LOOP NAME="ITEM_DATA" -->
     <div class="yui-g">
         <h3 id="item<!-- TMPL_VAR NAME="itemnumber" -->">Barcode <!-- TMPL_VAR NAME="barcode" -->  <!-- TMPL_IF name="notforloantext" --><!-- TMPL_VAR name="notforloantext" --> <!-- /TMPL_IF --></h3>
-        <div class="listgroup"><h4>Item Information <!-- TMPL_IF NAME="CAN_user_editcatalogue_edit_catalogue" --><!-- TMPL_UNLESS name="nomod" --><a href="/cgi-bin/koha/cataloguing/additem.pl?op=edititem&amp;biblionumber=<!-- TMPL_VAR NAME="biblionumber"-->&amp;itemnumber=<!-- TMPL_VAR NAME="itemnumber" -->">[Edit Items]</a><!-- /TMPL_IF --><!-- /TMPL_UNLESS --></h4>
+        <div class="listgroup"><h4>Item Information <!-- TMPL_IF NAME="CAN_user_editcatalogue_edit_catalogue" --><!-- TMPL_UNLESS name="nomod" --><a href="/cgi-bin/koha/cataloguing/additem.pl?op=edititem&amp;biblionumber=<!-- TMPL_VAR NAME="biblionumber"-->&amp;itemnumber=<!-- TMPL_VAR NAME="itemnumber" -->">[Edit Items]</a>&nbsp;&nbsp;<a href="/cgi-bin/koha/cataloguing/addbiblio.pl?analytical_record=1&parentbiblionumber=<!-- TMPL_VAR NAME="biblionumber" -->&amp;itemnumber=<!-- TMPL_VAR NAME="itemnumber" -->">[Create Analytical Record]</a><!-- /TMPL_IF --><!-- /TMPL_UNLESS --></h4>
             <ol class="bibliodetails">
             <li><span class="label">Home Library:</span> <!-- TMPL_VAR NAME="homebranchname" -->&nbsp;</li>
 	    <!-- TMPL_IF NAME="item-level_itypes" -->
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/addbiblio.tmpl b/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/addbiblio.tmpl
index 3e510c5..4f4a6bc 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/addbiblio.tmpl
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/addbiblio.tmpl
@@ -721,6 +721,12 @@ function unHideSubfield(index,labelindex) { // FIXME :: is it used ?
 <!--/TMPL_IF-->
         <input type="hidden" name="frameworkcode" value="<!-- TMPL_VAR NAME="frameworkcode" -->" />
         <input type="hidden" name="biblionumber" value="<!-- TMPL_VAR NAME="biblionumber" -->" />
+	<!--TMPL_IF Name="parentbiblionumber"-->
+        <input type="hidden" name="parentbiblionumber" value="<!-- TMPL_VAR NAME="parentbiblionumber" -->" />
+        <!--/TMPL_IF--><!--TMPL_IF Name="itemnumber"-->
+        <input type="hidden" name="itemnumber" value="<!-- TMPL_VAR NAME="itemnumber" -->" /><!--/TMPL_IF-->
+       <!--TMPL_IF Name="analytical_record"-->
+        <input type="hidden" name="analytical_record" value="<!-- TMPL_VAR NAME="analytical_record" -->" /><!--/TMPL_IF-->
         <input type="hidden" name="breedingid" value="<!-- TMPL_VAR NAME="breedingid" -->" />
 
 <div id="addbibliotabs" class="toptabs numbered">
diff --git a/kohaversion.pl b/kohaversion.pl
index 0272b60..4261d9c 100644
--- a/kohaversion.pl
+++ b/kohaversion.pl
@@ -11,7 +11,7 @@ use strict;
 
 sub kohaversion {
 
-    our $VERSION = '3.01.00.999';
+    our $VERSION = '3.01.01.000';
 
     # version needs to be set this way
     # so that it can be picked up by Makefile.PL
-- 
1.5.4.5



More information about the Koha-patches mailing list