[Koha-patches] [PATCH 1/1] Bug 7294: Adds acquisition informations in marc record

Jonathan Druart jonathan.druart at biblibre.com
Thu Mar 8 13:06:31 CET 2012


From: Matthias Meusburger <matthias.meusburger at biblibre.com>

"View status 'in order' to the OPAC and staff interface. Specific
fields from aqorders can be mapped to marc fields (using ACQ bibliographic
framework):
aqorders.branchcode
aqorders.quantity
aqorders.listprice
aqorders.uncertainprice
aqorders.rrp
aqorders.ecost
aqorders.notes
aqorders.supplierreference
aqorders.ordernumber

This way, you can keep track on what is currently on order
at biblio level until you receive everything. Once all items have been
received, the marc field is deleted.
---
 C4/Acquisition.pm                      |   88 +++++++++++++++++++++-
 acqui/addorder.pl                      |  126 +++++++++++++++++++++++++-------
 admin/koha2marclinks.pl                |    8 +--
 admin/marc_subfields_structure.pl      |    6 ++
 installer/data/mysql/kohastructure.sql |    1 +
 installer/data/mysql/updatedatabase.pl |    7 ++
 6 files changed, 201 insertions(+), 35 deletions(-)

diff --git a/C4/Acquisition.pm b/C4/Acquisition.pm
index 0a96a02..3803894 100644
--- a/C4/Acquisition.pm
+++ b/C4/Acquisition.pm
@@ -1124,6 +1124,8 @@ sub ModReceiveOrder {
     my $order = $sth->fetchrow_hashref();
     $sth->finish();
 
+
+    # If there are still items to be received
     if ( $order->{quantity} > $quantrec ) {
         $sth=$dbh->prepare("
             UPDATE aqorders
@@ -1145,15 +1147,53 @@ sub ModReceiveOrder {
         }
         $order->{'quantity'} -= $quantrec;
         $order->{'quantityreceived'} = 0;
-        my $newOrder = NewOrder($order);
-} else {
-        $sth=$dbh->prepare("update aqorders
+        my ($newOrder, $newordernumber) = NewOrder($order);
+
+	# Do we have to update order informations from the marc record?
+	my ($ordertag, $ordersubtag) = GetMarcFromKohaField('aqorders.ordernumber', 'ACQ');
+
+	# Updating MARC order field if exists
+	if ($ordertag and $ordersubtag) {
+	    $debug and warn "updating MARC";
+	    # Getting record
+	    my $record = GetMarcBiblio($biblionumber);
+	    if ($record) {
+		$debug and warn "updating Record";
+		foreach ($record->field($ordertag)) {
+		    if ($_->subfield($ordersubtag) eq $ordernumber) {
+		       # Updating ordernumber
+		       $debug and warn "updating ordernumber $ordernumber => $newordernumber";
+		       $_->update($ordersubtag => $newordernumber); 
+
+		       # Updating quantity
+		       my ($quantitytag, $quantitysubtag) = GetMarcFromKohaField('aqorders.quantity', 'ACQ');
+		       if ($quantitysubtag) {
+			    $debug and warn "updating quantity " . $order->{quantity};
+			    $_->update($quantitysubtag => $order->{quantity});
+		       }
+		    }
+		}
+
+		# Applying changes
+		ModBiblio($record, $biblionumber, 'ACQ'); 
+	    }	
+	}
+
+
+    } else {
+        $sth = $dbh->prepare(
+            "update aqorders
                             set quantityreceived=?,datereceived=?,booksellerinvoicenumber=?,
                                 unitprice=?,freight=?,rrp=?
                             where biblionumber=? and ordernumber=?");
         $sth->execute($quantrec,$datereceived,$invoiceno,$cost,$freight,$rrp,$biblionumber,$ordernumber);
         $sth->finish;
+
+	# Removing MARC order field if exists
+	DelMarcOrder($biblionumber, $ordernumber);
     }
+
+    
     return $datereceived;
 }
 #------------------------------------------------------------#
@@ -1253,6 +1293,10 @@ sub DelOrder {
     my $sth = $dbh->prepare($query);
     $sth->execute( $bibnum, $ordernumber );
     $sth->finish;
+
+    # Removing MARC order field if exists
+    DelMarcOrder($bibnum, $ordernumber);
+
     my @itemnumbers = GetItemnumbersFromOrder( $ordernumber );
     foreach my $itemnumber (@itemnumbers){
     	C4::Items::DelItem( $dbh, $bibnum, $itemnumber );
@@ -1260,6 +1304,44 @@ sub DelOrder {
     
 }
 
+=head3 DelMarcOrder
+
+=over 4
+
+&DelMarcOrder($biblionumber, $ordernumber);
+
+Delete the order field from the MARC record. aqorders.ordernumber needs
+to be linked to a MARC field/subfield. The field is deleted if the value of
+the subfield containing the ordernumber matches the ordernumber given
+in parameter
+
+=back
+
+=cut
+
+sub DelMarcOrder {
+    my ($biblionumber, $ordernumber) = @_;
+
+    # Do we have to remove order informations from the marc record?
+    my ($ordertag, $ordersubtag) = GetMarcFromKohaField('aqorders.ordernumber', 'ACQ');
+
+    # Removing MARC order field if exists
+    if ($ordertag and $ordersubtag) {
+	# Getting record
+	my $record = GetMarcBiblio($biblionumber);
+	if ($record) {
+	    # Looking for the right field
+	    foreach ($record->field($ordertag)) {
+		if ($_->subfield($ordersubtag) eq $ordernumber) {
+		   $record->delete_field($_); 
+		}
+	    }
+	    # Applying changes
+	    ModBiblio($record, $biblionumber, 'ACQ'); 
+	}
+    }
+}
+
 =head2 FUNCTIONS ABOUT PARCELS
 
 =cut
diff --git a/acqui/addorder.pl b/acqui/addorder.pl
index 279084b..78b6ff3 100755
--- a/acqui/addorder.pl
+++ b/acqui/addorder.pl
@@ -122,10 +122,11 @@ if it is an order from an existing suggestion : the id of this suggestion.
 use strict;
 use warnings;
 use CGI;
-use C4::Auth;			# get_template_and_user
-use C4::Acquisition;	# NewOrder DelOrder ModOrder
-use C4::Suggestions;	# ModStatus
-use C4::Biblio;			# AddBiblio TransformKohaToMarc
+use C4::Auth;           # get_template_and_user
+use C4::Acquisition;    # NewOrder DelOrder ModOrder
+use C4::Suggestions;    # ModStatus
+use C4::Biblio;         # AddBiblio TransformKohaToMarc
+use C4::Bookseller qw/GetBookSellerFromId/;
 use C4::Items;
 use C4::Output;
 
@@ -193,42 +194,115 @@ my $user          = $input->remote_user;
 # delete biblio if delbiblio has been set to 1 by the librarian
 my $bibitemnum;
 if ( $orderinfo->{quantity} ne '0' ) {
+
+    # Getting bookseller's name
+    my $supplierreference;
+    if ($$orderinfo{booksellerid}) {
+        my $bookseller = GetBookSellerFromId($$orderinfo{booksellerid});
+        $supplierreference = $bookseller->{name};
+    }
+
+    # Do we have to add order informations to the marc record?
+    my ($ordertag, $ordersubtag) = GetMarcFromKohaField('aqorders.ordernumber', 'ACQ'); 
+    my $record;
+    my $existingbiblio; # Was the order made on an existing biblio?
+    my $ordermodif;     # Is this an order modification?
+
     #TODO:check to see if biblio exists
     unless ( $$orderinfo{biblionumber} ) {
         #if it doesnt create it
-        my $record = TransformKohaToMarc(
-            {
-                "biblio.title"                => "$$orderinfo{title}",
-                "biblio.author"               => $$orderinfo{author}          ? $$orderinfo{author}        : "",
-                "biblio.seriestitle"          => $$orderinfo{series}          ? $$orderinfo{series}        : "",
-                "biblioitems.isbn"            => $$orderinfo{isbn}            ? $$orderinfo{isbn}          : "",
-                "biblioitems.publishercode"   => $$orderinfo{publishercode}   ? $$orderinfo{publishercode} : "",
-                "biblioitems.publicationyear" => $$orderinfo{publicationyear} ? $$orderinfo{publicationyear}: "",
-                "biblio.copyrightdate"        => $$orderinfo{publicationyear} ? $$orderinfo{publicationyear}: "",
-                "biblioitems.itemtype"        => $$orderinfo{itemtype} ? $$orderinfo{itemtype} : "",
-                "biblioitems.editionstatement"=> $$orderinfo{editionstatement} ? $$orderinfo{editionstatement} : "",
-            });
+        my $tmprecord = TransformKohaToMarc(
+            {   "biblio.title"                => "$$orderinfo{title}",
+                "biblio.author"               => $$orderinfo{author}          ? $$orderinfo{author}          : "",
+                "biblio.seriestitle"          => $$orderinfo{series}          ? $$orderinfo{series}          : "",
+                "biblioitems.isbn"            => $$orderinfo{isbn}            ? $$orderinfo{isbn}            : "",
+                "biblioitems.ean"             => $$orderinfo{ean}             ? $$orderinfo{ean}             : "",
+                "biblioitems.publishercode"   => $$orderinfo{publishercode}   ? $$orderinfo{publishercode}   : "",
+                "biblioitems.publicationyear" => $$orderinfo{publicationyear} ? $$orderinfo{publicationyear} : "",
+                "biblioitems.itemtype"        => $$orderinfo{itemtype}        ? $$orderinfo{itemtype}        : "",
+                "biblioitems.editionstatement"=> $$orderinfo{editionstatement}? $$orderinfo{editionstatement}: "",
+                "aqorders.branchcode"         => $$orderinfo{branchcode}      ? $$orderinfo{branchcode}      : "",
+                "aqorders.quantity"           => $$orderinfo{quantity}        ? $$orderinfo{quantity}        : "",
+                "aqorders.listprice"          => $$orderinfo{listprice}       ? $$orderinfo{listprice}       : "",
+                "aqorders.uncertainprice"     => $$orderinfo{uncertainprice}  ? $$orderinfo{uncertainprice}  : "",
+                "aqorders.rrp"                => $$orderinfo{rrp}             ? $$orderinfo{rrp}             : "",
+                "aqorders.ecost"              => $$orderinfo{ecost}           ? $$orderinfo{ecost}           : "",
+                "aqorders.notes"              => $$orderinfo{notes}           ? $$orderinfo{notes}           : "",
+                "aqorders.supplierreference"  => $supplierreference           ? $supplierreference           : "",
+                "aqorders.sort1"              => $$orderinfo{sort1}           ? $$orderinfo{sort1}           : "",
+                "aqorders.sort2"              => $$orderinfo{sort2}           ? $$orderinfo{sort2}           : ""
+            }
+        );
 
         # create the record in catalogue, with framework ''
-        my ($biblionumber,$bibitemnum) = AddBiblio($record,'');
+        my ( $biblionumber, $bibitemnum ) = AddBiblio( $tmprecord, '' );
+
         # change suggestion status if applicable
         if ($$orderinfo{suggestionid}) {
             ModSuggestion( {suggestionid=>$$orderinfo{suggestionid}, STATUS=>'ORDERED', biblionumber=>$biblionumber} );
         }
-		$orderinfo->{biblioitemnumber}=$bibitemnum;
-		$orderinfo->{biblionumber}=$biblionumber;
+        $orderinfo->{biblioitemnumber} = $bibitemnum;
+        $orderinfo->{biblionumber}     = $biblionumber;
+    } else {
+	$existingbiblio = 1;
     }
 
-    # if we already have $ordernumber, then it's an ordermodif
-    if ($$orderinfo{ordernumber}) {
-        ModOrder( $orderinfo);
-    }
-    else { # else, it's a new line
+    # Getting record
+    $record = GetMarcBiblio($$orderinfo{biblionumber});
+
+    
+
+     # if we already have $ordernumber, then it's an ordermodif
+    if ( $$orderinfo{ordernumber} ) {
+        ModOrder($orderinfo);
+	$ordermodif = 1;
+	
+    } else {    # else, it's a new line
         @$orderinfo{qw(basketno ordernumber )} = NewOrder($orderinfo);
+
+	# We have to add the ordernumber in the designated subfield
+	if ($ordertag && $record && !$ordermodif) {
+	    # To which field do we add it : to the one with currently no ordernumber
+	    foreach ($record->field($ordertag)) {
+		if (!$_->subfield($ordersubtag)) {
+		    $_->update($ordersubtag, $$orderinfo{ordernumber});
+		}
+	    }
+	    ModBiblio($record, $$orderinfo{biblionumber}, 'ACQ');
+	}
+
+
+    }
+
+    if ($record) {
+
+	# If we have to add order infos to the marc record
+	if ($ordertag) {
+
+	    # If the order was made on an existing biblio and it is not a modification, we add the field 
+	    $record->insert_fields_ordered(new MARC::Field($ordertag, '', '', $ordersubtag => $$orderinfo{ordernumber})) if (!$ordermodif && $existingbiblio);
+
+	    foreach ($record->field($ordertag)) {
+		# Looking for the matching one
+		if ($_->subfield($ordersubtag) eq $$orderinfo{ordernumber}) {
+
+		    # Replacing or creating subfields
+		    my ($t, $st);
+		    for my $tablefield (qw/branchcode quantity listprice uncertainprice rrp ecost notes supplierreference sort1 sort2/) {
+			($t, $st) = GetMarcFromKohaField("aqorders.$tablefield", 'ACQ');
+			$_->update($st, $$orderinfo{$tablefield}) if ($$orderinfo{$tablefield} and $st);
+		    }
+		    ModBiblio($record, $$orderinfo{biblionumber}, 'ACQ');
+		}
+	    }
+
+	}
+
     }
 
-    # now, add items if applicable
-    if (C4::Context->preference('AcqCreateItem') eq 'ordering') {
+
+      # now, add items if applicable
+    if ( C4::Context->preference('AcqCreateItem') eq 'ordering' ) {
 
         my @tags         = $input->param('tag');
         my @subfields    = $input->param('subfield');
diff --git a/admin/koha2marclinks.pl b/admin/koha2marclinks.pl
index a89681d..046aa6d 100755
--- a/admin/koha2marclinks.pl
+++ b/admin/koha2marclinks.pl
@@ -157,12 +157,8 @@ q|select tagfield,tagsubfield,liblibrarian,kohafield from marc_subfield_structur
     $template->param(
         loop      => \@loop_data,
         tablename => CGI::scrolling_list(
-            -name   => 'tablename',
-            -values => [
-                'biblio',
-                'biblioitems',
-                'items',
-            ],
+            -name     => 'tablename',
+            -values   => [ 'biblio', 'biblioitems', 'items', 'aqorders'],
             -default  => $tablename,
             -size     => 1,
             -multiple => 0
diff --git a/admin/marc_subfields_structure.pl b/admin/marc_subfields_structure.pl
index 2c69733..6414c03 100755
--- a/admin/marc_subfields_structure.pl
+++ b/admin/marc_subfields_structure.pl
@@ -123,6 +123,12 @@ if ( $op eq 'add_form' ) {
     while ( ( my $field ) = $sth2->fetchrow_array ) {
         push @kohafields, "items." . $field;
     }
+    $sth2 = $dbh->prepare("SHOW COLUMNS from aqorders");
+    $sth2->execute;
+    while ( ( my $field ) = $sth2->fetchrow_array ) {
+        push @kohafields, "aqorders." . $field;
+    }
+
 
     # build authorised value list
     $sth2->finish;
diff --git a/installer/data/mysql/kohastructure.sql b/installer/data/mysql/kohastructure.sql
index 597a8be..a41b212 100644
--- a/installer/data/mysql/kohastructure.sql
+++ b/installer/data/mysql/kohastructure.sql
@@ -2653,6 +2653,7 @@ CREATE TABLE `aqorders` (
   `uncertainprice` tinyint(1),
   `claims_count` int(11) default 0,
   `claimed_date` date default NULL,
+  `branchcode` varchar(10) default NULL,
   PRIMARY KEY  (`ordernumber`),
   KEY `basketno` (`basketno`),
   KEY `biblionumber` (`biblionumber`),
diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl
index 33a3df6..53084c4 100755
--- a/installer/data/mysql/updatedatabase.pl
+++ b/installer/data/mysql/updatedatabase.pl
@@ -4765,6 +4765,13 @@ if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
     SetVersion($DBversion);
 }
 
+$DBversion = "3.07.00.XXX";
+if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
+    $dbh->do("ALTER TABLE `aqorders` ADD `branchcode` VARCHAR( 10 ) NULL");
+    print "Upgrade to $DBversion done (Adding branchcode in aqorders)\n";
+    SetVersion($DBversion);
+}
+
 =head1 FUNCTIONS
 
 =head2 DropAllForeignKeys($table)
-- 
1.7.7.3



More information about the Koha-patches mailing list