[Koha-patches] [PATCH] bug_3966: Update items on receive

Srdjan srdjan at catalyst.net.nz
Tue Apr 3 05:42:52 CEST 2012


Use sane interface for items as when creating order.
Changed AddItem() and ModItem() interface so now they return item
record.
AddItemFromMarc() looks for itemnumber, and calls ModItem() if one is
found.
---
 C4/Acquisition.pm                                  |   51 ++-----
 C4/Biblio.pm                                       |    2 -
 C4/ImportBatch.pm                                  |    4 +-
 C4/Items.pm                                        |   25 ++--
 acqui/addorder.pl                                  |    5 +-
 acqui/addorderiso2709.pl                           |    4 +-
 acqui/finishreceive.pl                             |  115 +++++++++-----
 acqui/orderreceive.pl                              |   60 ++++----
 cataloguing/additem.pl                             |    8 +-
 .../prog/en/modules/acqui/orderreceive.tt          |  157 ++++++++++----------
 .../prog/en/modules/services/itemrecorddisplay.tt  |    3 +-
 t/db_dependent/lib/KohaTest.pm                     |   16 +--
 .../lib/KohaTest/Acquisition/GetParcel.pm          |   17 +--
 .../lib/KohaTest/Acquisition/GetParcels.pm         |   18 +--
 t/db_dependent/lib/KohaTest/Biblio/ModBiblio.pm    |    6 +-
 15 files changed, 246 insertions(+), 245 deletions(-)

diff --git a/C4/Acquisition.pm b/C4/Acquisition.pm
index 4fd5cc2..cd64368 100644
--- a/C4/Acquisition.pm
+++ b/C4/Acquisition.pm
@@ -1118,16 +1118,14 @@ sub GetCancelledOrders {
 
 =head3 ModReceiveOrder
 
-  &ModReceiveOrder($biblionumber, $ordernumber, $quantityreceived, $user,
-    $unitprice, $booksellerinvoicenumber, $biblioitemnumber,
-    $freight, $bookfund, $rrp);
+  &ModReceiveOrder($biblionumber, $ordernumber, $quantityreceived, $receiveditems);
 
 Updates an order, to reflect the fact that it was received, at least
-in part. All arguments not mentioned below update the fields with the
-same name in the aqorders table of the Koha database.
+in part.
 
 If a partial order is received, splits the order into two.  The received
-portion must have a booksellerinvoicenumber.
+portion must have a booksellerinvoicenumber. If $receiveditems are supplied,
+the rest of the items will be moved to the new order.
 
 Updates the order with bibilionumber C<$biblionumber> and ordernumber
 C<$ordernumber>.
@@ -1136,13 +1134,9 @@ C<$ordernumber>.
 
 
 sub ModReceiveOrder {
-    my (
-        $biblionumber,    $ordernumber,  $quantrec, $user, $cost,
-        $invoiceno, $freight, $rrp, $budget_id, $datereceived
-    )
-    = @_;
+    my ( $biblionumber, $ordernumber,  $quantrec, $receiveditems ) = @_;
     my $dbh = C4::Context->dbh;
-    $datereceived = C4::Dates->output('iso') unless $datereceived;
+
     my $suggestionid = GetSuggestionFromBiblionumber( $dbh, $biblionumber );
     if ($suggestionid) {
         ModSuggestion( {suggestionid=>$suggestionid,
@@ -1160,36 +1154,23 @@ sub ModReceiveOrder {
     $sth->finish();
 
     if ( $order->{quantity} > $quantrec ) {
-        $sth=$dbh->prepare("
-            UPDATE aqorders
-            SET quantityreceived=?
-                , datereceived=?
-                , booksellerinvoicenumber=?
-                , unitprice=?
-                , freight=?
-                , rrp=?
-                , quantity=?
-            WHERE biblionumber=? AND ordernumber=?");
-
-        $sth->execute($quantrec,$datereceived,$invoiceno,$cost,$freight,$rrp,$quantrec,$biblionumber,$ordernumber);
-        $sth->finish;
-
         # create a new order for the remaining items, and set its bookfund.
         foreach my $orderkey ( "linenumber", "allocation" ) {
             delete($order->{'$orderkey'});
         }
         $order->{'quantity'} -= $quantrec;
         $order->{'quantityreceived'} = 0;
-        my $newOrder = NewOrder($order);
-} 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;
+        my (undef, $newOrder) = NewOrder($order);
+
+        if ($receiveditems && @$receiveditems) {
+            my $sql = "
+                UPDATE aqorders_items
+                SET ordernumber = ?
+                WHERE ordernumber = ?
+                AND itemnumber NOT IN (".join(",", map "?", @$receiveditems).")";
+            $dbh->do($sql, undef, $newOrder, $ordernumber, @$receiveditems);
+        }
     }
-    return $datereceived;
 }
 #------------------------------------------------------------#
 
diff --git a/C4/Biblio.pm b/C4/Biblio.pm
index 56cd94e..8ba2807 100644
--- a/C4/Biblio.pm
+++ b/C4/Biblio.pm
@@ -2603,8 +2603,6 @@ sub TransformMarcToKohaOneField {
 }
 
 
-#"
-
 #
 # true ModZebra commented until indexdata fixes zebraDB crashes (it seems they occur on multiple updates
 # at the same time
diff --git a/C4/ImportBatch.pm b/C4/ImportBatch.pm
index 63cc60b..cc054ad 100644
--- a/C4/ImportBatch.pm
+++ b/C4/ImportBatch.pm
@@ -547,10 +547,10 @@ sub BatchCommitItems {
             $updsth->execute();
             $num_items_errored++;
         } else {
-            my ($item_biblionumber, $biblioitemnumber, $itemnumber) = AddItemFromMarc($item_marc, $biblionumber);
+            my $item = AddItemFromMarc($item_marc, $biblionumber);
             my $updsth = $dbh->prepare("UPDATE import_items SET status = ?, itemnumber = ? WHERE import_items_id = ?");
             $updsth->bind_param(1, 'imported');
-            $updsth->bind_param(2, $itemnumber);
+            $updsth->bind_param(2, $item->{itemnumber});
             $updsth->bind_param(3, $row->{'import_items_id'});
             $updsth->execute();
             $updsth->finish();
diff --git a/C4/Items.pm b/C4/Items.pm
index 0b2f99b..0f01492 100644
--- a/C4/Items.pm
+++ b/C4/Items.pm
@@ -195,11 +195,11 @@ sub CartToShelf {
 
 =head2 AddItemFromMarc
 
-  my ($biblionumber, $biblioitemnumber, $itemnumber) 
-      = AddItemFromMarc($source_item_marc, $biblionumber);
+  my $item = AddItemFromMarc($source_item_marc, $biblionumber);
 
 Given a MARC::Record object containing an embedded item
-record and a biblionumber, create a new item record.
+record and a biblionumber, create a new item record or update
+existing one.
 
 =cut
 
@@ -215,13 +215,15 @@ sub AddItemFromMarc {
 	$localitemmarc->append_fields($source_item_marc->field($itemtag));
     my $item = &TransformMarcToKoha( $dbh, $localitemmarc, $frameworkcode ,'items');
     my $unlinked_item_subfields = _get_unlinked_item_subfields($localitemmarc, $frameworkcode);
+    if (my $itemnumber = $item->{itemnumber}) {
+        return ModItem($item, $biblionumber, $itemnumber, $dbh, $frameworkcode, $unlinked_item_subfields);
+    }
     return AddItem($item, $biblionumber, $dbh, $frameworkcode, $unlinked_item_subfields);
 }
 
 =head2 AddItem
 
-  my ($biblionumber, $biblioitemnumber, $itemnumber) 
-      = AddItem($item, $biblionumber[, $dbh, $frameworkcode, $unlinked_item_subfields]);
+  my $item = AddItem($item, $biblionumber[, $dbh, $frameworkcode, $unlinked_item_subfields]);
 
 Given a hash containing item column names as keys,
 create a new Koha item record.
@@ -273,7 +275,7 @@ sub AddItem {
    
     logaction("CATALOGUING", "ADD", $itemnumber, "item") if C4::Context->preference("CataloguingLog");
     
-    return ($item->{biblionumber}, $item->{biblioitemnumber}, $itemnumber);
+    return $item;
 }
 
 =head2 AddItemBatchFromMarc
@@ -455,6 +457,7 @@ sub ModItemFromMarc {
         $item->{$item_field} = $default_values_for_mod_from_marc{$item_field} unless (exists $item->{$item_field});
     }
     my $unlinked_item_subfields = _get_unlinked_item_subfields( $localitemmarc, $frameworkcode );
+    $itemnumber ||= $item->{itemnumber};
 
     ModItem($item, $biblionumber, $itemnumber, $dbh, $frameworkcode, $unlinked_item_subfields); 
     return $item;
@@ -462,7 +465,7 @@ sub ModItemFromMarc {
 
 =head2 ModItem
 
-  ModItem({ column => $newvalue }, $biblionumber, $itemnumber);
+  my $item = ModItem({ column => $newvalue }, $biblionumber, $itemnumber);
 
 Change one or more columns in an item record and update
 the MARC representation of the item.
@@ -525,6 +528,8 @@ sub ModItem {
     ModZebra( $biblionumber, "specialUpdate", "biblioserver", undef, undef );
 
     logaction("CATALOGUING", "MODIFY", $itemnumber, Dumper($item)) if C4::Context->preference("CataloguingLog");
+
+    return $item;
 }
 
 =head2 ModItemTransfer
@@ -2540,7 +2545,7 @@ sub _find_value {
 
 =head2 PrepareItemrecordDisplay
 
-  PrepareItemrecordDisplay($itemrecord,$bibnum,$itemumber,$frameworkcode);
+  PrepareItemrecordDisplay(bibnum,$itemumber,$itemrecord,$$frameworkcode);
 
 Returns a hash with all the fields for Display a given item data in a template
 
@@ -2718,14 +2723,14 @@ sub PrepareItemrecordDisplay {
                             my $extended_param = plugin_parameters( $dbh, $temp, $tagslib, $subfield_data{id}, undef );
                             my ( $function_name, $javascript ) = plugin_javascript( $dbh, $temp, $tagslib, $subfield_data{id}, undef );
                             $subfield_data{random}     = int(rand(1000000));    # why do we need 2 different randoms?
-                            $subfield_data{marc_value} = qq[<input tabindex="1" id="$subfield_data{id}" name="field_value" class="input_marceditor" size="67" maxlength="255"
+                            $subfield_data{marc_value} = qq[<input tabindex="1" id="$subfield_data{id}" name="field_value" class="input_marceditor" size="67" maxlength="255" value="$defaultvalue"
                                 onfocus="Focus$function_name($subfield_data{random}, '$subfield_data{id}');"
                                  onblur=" Blur$function_name($subfield_data{random}, '$subfield_data{id}');" />
                                 <a href="#" class="buttonDot" onclick="Clic$function_name('$subfield_data{id}'); return false;" title="Tag Editor">...</a>
                                 $javascript];
                         } else {
                             warn "Plugin Failed: $plugin";
-                            $subfield_data{marc_value} = qq(<input tabindex="1" id="$subfield_data{id}" name="field_value" class="input_marceditor" size="67" maxlength="255" />); # supply default input form
+                            $subfield_data{marc_value} = qq(<input tabindex="1" id="$subfield_data{id}" name="field_value" class="input_marceditor" size="67" maxlength="255" value="$defaultvalue" />); # supply default input form
                         }
                 }
                 elsif ( $tag eq '' ) {       # it's an hidden field
diff --git a/acqui/addorder.pl b/acqui/addorder.pl
index 279084b..e977c23 100755
--- a/acqui/addorder.pl
+++ b/acqui/addorder.pl
@@ -262,9 +262,8 @@ if ( $orderinfo->{quantity} ne '0' ) {
                                     $itemhash{$item}->{'indicator'},
                                     'ITEM');
             my $record=MARC::Record::new_from_xml($xml, 'UTF-8');
-            my ($biblionumber,$bibitemnum,$itemnumber) = AddItemFromMarc($record,$$orderinfo{biblionumber});
-            NewOrderItem($itemnumber, $$orderinfo{ordernumber});
-
+            my $item = AddItemFromMarc($record,$$orderinfo{biblionumber});
+            NewOrderItem($item->{itemnumber}, $$orderinfo{ordernumber});
         }
     }
 
diff --git a/acqui/addorderiso2709.pl b/acqui/addorderiso2709.pl
index 8d9c0e3..ef17469 100755
--- a/acqui/addorderiso2709.pl
+++ b/acqui/addorderiso2709.pl
@@ -259,8 +259,8 @@ if ($op eq ""){
             my $xml = TransformHtmlToXml( \@tags, \@subfields, \@field_values, \@ind_tag, \@indicator );
             my $record = MARC::Record::new_from_xml( $xml, 'UTF-8' );
             for (my $qtyloop=1;$qtyloop <=$quantity;$qtyloop++) {
-                my ( $biblionumber, $bibitemnum, $itemnumber ) = AddItemFromMarc( $record, $biblionumber );
-                NewOrderItem( $itemnumber, $ordernumber );
+                my $item = AddItemFromMarc( $record, $biblionumber );
+                NewOrderItem( $item->{itemnumber}, $ordernumber );
             }
         } else {
             SetImportRecordStatus( $biblio->{'import_record_id'}, 'imported' );
diff --git a/acqui/finishreceive.pl b/acqui/finishreceive.pl
index d09a40a..651903b 100755
--- a/acqui/finishreceive.pl
+++ b/acqui/finishreceive.pl
@@ -26,10 +26,10 @@ use CGI;
 use C4::Auth;
 use C4::Output;
 use C4::Context;
+use C4::Dates;
 use C4::Acquisition;
 use C4::Biblio;
 use C4::Items;
-use C4::Search;
 use List::MoreUtils qw/any/;
 
 my $input=new CGI;
@@ -46,57 +46,89 @@ my $quantityrec=$input->param('quantityrec');
 my $quantity=$input->param('quantity');
 my $unitprice=$input->param('cost');
 my $invoiceno=$input->param('invoice');
-my $datereceived=$input->param('datereceived');
+my $datereceived=$input->param('datereceived') || C4::Dates->output('iso');
 my $replacement=$input->param('rrp');
 my $gst=$input->param('gst');
 my $freight=$input->param('freight');
 my $booksellerid = $input->param('booksellerid');
 my $cnt=0;
-my $error_url_str;
+my $error_url_str = '';
 my $ecost = $input->param('ecost');
 my $note = $input->param("note");
 
+my $order = GetOrder($ordernumber);
+$order->{booksellerinvoicenumber} = $invoiceno;
+$order->{datereceived} = $datereceived;
+$order->{freight} = $freight;
+$order->{quantity} = $quantity;
+$order->{quantityreceived} = $quantityrec;
+$order->{notes} = $note;
+$order->{rrp} = $replacement;
+$order->{ecost} = $ecost;
+$order->{unitprice} = $unitprice;
+ModOrder($order);
+
 #need old recievedate if we update the order, parcel.pl only shows the right parcel this way FIXME
-if ($quantityrec > $origquantityrec ) {
-    # now, add items if applicable
-    if (C4::Context->preference('AcqCreateItem') eq 'receiving') {
-
-        my @tags         = $input->param('tag');
-        my @subfields    = $input->param('subfield');
-        my @field_values = $input->param('field_value');
-        my @serials      = $input->param('serial');
-        my @itemid       = $input->param('itemid');
-        my @ind_tag      = $input->param('ind_tag');
-        my @indicator    = $input->param('indicator');
-        #Rebuilding ALL the data for items into a hash
-        # parting them on $itemid.
-        my %itemhash;
-        my $countdistinct;
-        my $range=scalar(@itemid);
-        for (my $i=0; $i<$range; $i++){
-            unless ($itemhash{$itemid[$i]}){
-            $countdistinct++;
-            }
-            push @{$itemhash{$itemid[$i]}->{'tags'}},$tags[$i];
-            push @{$itemhash{$itemid[$i]}->{'subfields'}},$subfields[$i];
-            push @{$itemhash{$itemid[$i]}->{'field_values'}},$field_values[$i];
-            push @{$itemhash{$itemid[$i]}->{'ind_tag'}},$ind_tag[$i];
-            push @{$itemhash{$itemid[$i]}->{'indicator'}},$indicator[$i];
-        }
-        foreach my $item (keys %itemhash){
-            my $xml = TransformHtmlToXml( $itemhash{$item}->{'tags'},
-                                          $itemhash{$item}->{'subfields'},
-                                          $itemhash{$item}->{'field_values'},
-                                          $itemhash{$item}->{'ind_tag'},
-                                          $itemhash{$item}->{'indicator'},'ITEM');
-            my $record=MARC::Record::new_from_xml($xml, 'UTF-8');
-            my (undef,$bibitemnum,$itemnumber) = AddItemFromMarc($record,$biblionumber);
-            NewOrderItem($itemnumber, $ordernumber);
-        }
+
+# now, add or update items if applicable
+my @tags         = $input->param('tag');
+my @subfields    = $input->param('subfield');
+my @field_values = $input->param('field_value');
+my @serials      = $input->param('serial');
+my @itemid       = $input->param('itemid');
+my @ind_tag      = $input->param('ind_tag');
+my @indicator    = $input->param('indicator');
+my @itemnumber   = $input->param('itemnumber');
+#Rebuilding ALL the data for items into a hash
+# parting them on $itemid.
+# XXX this is all too flakey. HTML spec says explicitly that input order is arbitrary, yet we
+# depend on the order for multiple items. This whole thing should be rewritten.
+my %itemhash;
+my $countdistinct = 0;
+my $range=scalar(@itemid);
+for (my $i=0; $i<$range; $i++){
+    unless ($itemhash{$itemid[$i]}){
+        $itemhash{$itemid[$i]}->{'itemnumber'} = $itemnumber[$countdistinct];
+        $countdistinct++;
+    }
+    push @{$itemhash{$itemid[$i]}->{'tags'}},$tags[$i];
+    push @{$itemhash{$itemid[$i]}->{'subfields'}},$subfields[$i];
+    push @{$itemhash{$itemid[$i]}->{'field_values'}},$field_values[$i];
+    push @{$itemhash{$itemid[$i]}->{'ind_tag'}},$ind_tag[$i];
+    push @{$itemhash{$itemid[$i]}->{'indicator'}},$indicator[$i];
+}
+my $error;
+my %itemnumbers = map { $_ => 1 } GetItemnumbersFromOrder($ordernumber);
+my @received;
+foreach my $id (keys %itemhash){
+    my $itemnumber = $itemhash{$id}->{'itemnumber'};
+    my $xml = TransformHtmlToXml( $itemhash{$id}->{'tags'},
+                                  $itemhash{$id}->{'subfields'},
+                                  $itemhash{$id}->{'field_values'},
+                                  $itemhash{$id}->{'ind_tag'},
+                                  $itemhash{$id}->{'indicator'},'ITEM');
+    my $record=MARC::Record::new_from_xml($xml, 'UTF-8');
+    my $item;
+    if ($itemnumber) {
+        $item = ModItemFromMarc($record,$biblionumber, $itemnumber);
+    } else {
+        $item = AddItemFromMarc($record,$biblionumber);
+    }
+    if ($item) {
+        $itemnumber = $item->{itemnumber};
+        push @received, $itemnumber;
+        NewOrderItem($itemnumber, $ordernumber) unless $itemnumbers{$itemnumber};
+    } else {
+        $error++;
     }
-    
+}
+
+if ($error) {
+    $error_url_str = "&error=Datbase+write+error";
+}
+else {
     # save the quantity received.
-    $datereceived = ModReceiveOrder($biblionumber,$ordernumber, $quantityrec ,$user,$unitprice,$invoiceno,$freight,$replacement,undef,$datereceived);
+    ModReceiveOrder($biblionumber,$ordernumber, $quantityrec, \@received);
 }
 
 update_item( $_ ) foreach GetItemnumbersFromOrder( $ordernumber );
@@ -116,3 +148,4 @@ sub update_item {
         replacementpricedate => $datereceived,
     }, $biblionumber, $itemnumber );
 }
+
diff --git a/acqui/orderreceive.pl b/acqui/orderreceive.pl
index 2b59698..46783e0d 100755
--- a/acqui/orderreceive.pl
+++ b/acqui/orderreceive.pl
@@ -87,21 +87,13 @@ my $search       = $input->param('receive');
 my $invoice      = $input->param('invoice');
 my $freight      = $input->param('freight');
 my $datereceived = $input->param('datereceived');
-
-
 $datereceived = $datereceived ? C4::Dates->new($datereceived, 'iso') : C4::Dates->new();
 
 my $bookseller = GetBookSellerFromId($booksellerid);
 my $input_gst = ($input->param('gst') eq '' ? undef : $input->param('gst'));
 my $gst= $input_gst // $bookseller->{gstrate} // C4::Context->preference("gist") // 0;
 my $results = SearchOrder($ordernumber,$search);
-
-
 my $count   = scalar @$results;
-my $order 	= GetOrder($ordernumber);
-
-
-my $date = @$results[0]->{'entrydate'};
 
 my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
     {
@@ -116,7 +108,14 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
 
 # prepare the form for receiving
 if ( $count == 1 ) {
-    if (C4::Context->preference('AcqCreateItem') eq 'receiving') {
+    my $order 	= GetOrder($results->[0]->{ordernumber});
+    my $biblionumber = $order->{biblionumber};
+
+    my @itemnumbers = GetItemnumbersFromOrder($ordernumber);
+    $template->param(items => \@itemnumbers);
+
+    my $AcqCreateItem = C4::Context->preference('AcqCreateItem');
+    if ($AcqCreateItem eq 'receiving' || $AcqCreateItem eq 'ordering') {
         # Check if ACQ framework exists
         my $marc = GetMarcStructure(1, 'ACQ');
         unless($marc) {
@@ -127,12 +126,9 @@ if ( $count == 1 ) {
             UniqueItemFields => C4::Context->preference('UniqueItemFields'),
         );
     }
-
-    if ( @$results[0]->{'quantityreceived'} == 0 ) {
-        @$results[0]->{'quantityreceived'} = '';
-    }
-    if ( @$results[0]->{'unitprice'} == 0 ) {
-        @$results[0]->{'unitprice'} = '';
+        
+    if ( $order->{'unitprice'} == 0 ) {
+        $order->{'unitprice'} = '';
     }
 
     my $suggestion   = GetSuggestionInfoFromBiblionumber(@$results[0]->{'biblionumber'});
@@ -144,26 +140,26 @@ if ( $count == 1 ) {
 
     $template->param(
         count                 => 1,
-        biblionumber          => @$results[0]->{'biblionumber'},
-        ordernumber           => @$results[0]->{'ordernumber'},
-        biblioitemnumber      => @$results[0]->{'biblioitemnumber'},
-        booksellerid            => @$results[0]->{'booksellerid'},
+        biblionumber          => $biblionumber,
+        ordernumber           => $order->{'ordernumber'},
+        biblioitemnumber      => $order->{'biblioitemnumber'},
+        booksellerid          => $booksellerid,
         freight               => $freight,
         gst                   => $gst,
         name                  => $bookseller->{'name'},
-        date                  => format_date($date),
-        title                 => @$results[0]->{'title'},
-        author                => @$results[0]->{'author'},
-        copyrightdate         => @$results[0]->{'copyrightdate'},
-        isbn                  => @$results[0]->{'isbn'},
-        seriestitle           => @$results[0]->{'seriestitle'},
-        bookfund              => $budget->{budget_name},
-        quantity              => @$results[0]->{'quantity'},
-        quantityreceivedplus1 => @$results[0]->{'quantityreceived'} + 1,
-        quantityreceived      => @$results[0]->{'quantityreceived'},
-        rrp                   => @$results[0]->{'rrp'},
-        ecost                 => @$results[0]->{'ecost'},
-        unitprice             => @$results[0]->{'unitprice'},
+        date                  => format_date($order->{'entrydate'}),
+        title                 => $order->{'title'},
+        author                => $order->{'author'},
+        copyrightdate         => $order->{'copyrightdate'},
+        isbn                  => $order->{'isbn'},
+        seriestitle           => $order->{'seriestitle'},
+        bookfund              => $order->{'bookfundid'},
+        quantity              => $order->{'quantity'},
+        quantityreceived      => scalar(@itemnumbers),
+        origquantityrec       => $order->{'quantityreceived'},
+        rrp                   => $order->{'rrp'},
+        ecost                 => $order->{'ecost'},
+        unitprice             => $order->{'unitprice'},
         memberfirstname       => $member->{firstname} || "",
         membersurname         => $member->{surname} || "",
         invoice               => $invoice,
diff --git a/cataloguing/additem.pl b/cataloguing/additem.pl
index 9c8120e..c6a9b3f 100755
--- a/cataloguing/additem.pl
+++ b/cataloguing/additem.pl
@@ -347,8 +347,8 @@ if ($op eq "additem") {
 	push @errors,"barcode_not_unique" if($exist_itemnumber);
 	# if barcode exists, don't create, but report The problem.
     unless ($exist_itemnumber) {
-	    my ($oldbiblionumber,$oldbibnum,$oldbibitemnum) = AddItemFromMarc($record,$biblionumber);
-        set_item_default_location($oldbibitemnum);
+	    my $item = AddItemFromMarc($record,$biblionumber);
+        set_item_default_location($item->{biblioitemnumber});
     }
 	$nextop = "additem";
 	if ($exist_itemnumber) {
@@ -415,8 +415,8 @@ if ($op eq "additem") {
 
 		# Adding the item
         if (!$exist_itemnumber) {
-            my ($oldbiblionumber,$oldbibnum,$oldbibitemnum) = AddItemFromMarc($record,$biblionumber);
-            set_item_default_location($oldbibitemnum);
+	        my $item = AddItemFromMarc($record,$biblionumber);
+            set_item_default_location($item->{biblioitemnumber});
 
             # We count the item only if it was really added
             # That way, all items are added, even if there was some already existing barcodes
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/orderreceive.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/orderreceive.tt
index bb706ec..b8cfca5 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/orderreceive.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/orderreceive.tt
@@ -6,7 +6,6 @@
 <script type="text/javascript">
 //<![CDATA[
     function Check(form) {
-        [% IF (AcqCreateItemReceiving) %]
             // Remove last itemblock if it is not in items_list
             var lastitemblock = $("#outeritemblock > div:last");
             var tobedeleted = true;
@@ -27,7 +26,6 @@
                 }
                 return false;
             };
-        [% END %]
 
         return true;
     }
@@ -86,48 +84,81 @@
         </fieldset>
     [% END %]
 
-    [% IF (AcqCreateItemReceiving) %]
-        <div id="items_list" style="display:none">
-            <p><b>Items list</b></p>
-            <div style="width:100%;overflow:auto;">
-                <table>
-                    <thead>
-                        <tr>
-                            <th>&nbsp;</th>
-                            <th>&nbsp;</th>
-                            <th>Barcode</th>
-                            <th>Home branch</th>
-                            <th>Holding branch</th>
-                            <th>Not for loan</th>
-                            <th>Restricted</th>
-                            <th>Location</th>
-                            <th>Call number</th>
-                            <th>Copy number</th>
-                            <th>Stock number</th>
-                            <th>Collection code</th>
-                            <th>Item type</th>
-                            <th>Materials</th>
-                            <th>Notes</th>
-                        </tr>
-                    </thead>
-                    <tbody>
-                    </tbody>
-                </table>
-            </div>
+    <div id="items_list" style="display:none">
+        <p><b>Items list</b></p>
+        <div style="width:100%;overflow:auto;">
+            <table>
+                <thead>
+                    <tr>
+                        <th>&nbsp;</th>
+                        <th>&nbsp;</th>
+                        <th>Barcode</th>
+                        <th>Home branch</th>
+                        <th>Holding branch</th>
+                        <th>Not for loan</th>
+                        <th>Restricted</th>
+                        <th>Location</th>
+                        <th>Call number</th>
+                        <th>Copy number</th>
+                        <th>Stock number</th>
+                        <th>Collection code</th>
+                        <th>Item type</th>
+                        <th>Materials</th>
+                        <th>Notes</th>
+                    </tr>
+                </thead>
+                <tbody>
+                </tbody>
+            </table>
         </div>
+    </div>
+
+    <fieldset class="rows" id="itemfieldset">
+        <legend>Item</legend>
+        [% IF ( NoACQframework ) %]
+            <p class="required">
+                No ACQ framework, using default. You should create a
+                framework with code ACQ, the items framework would be
+                used
+            </p>
+        [% END %]
+        <div id="outeritemblock">
+        [% IF ( items ) %]
+            [% itemid = 1 %]
+            [% FOREACH itemnumber IN items %]
+            <div id="itemblock[% itemid %]" style="display:none"></div>
+            <script type="text/javascript">
+                $(document).ready(function() {
+                    var unique_item_fields = 'barcode';
+                    $.ajax({
+                        url: "/cgi-bin/koha/services/itemrecorddisplay.pl",
+                        dataType: 'html',
+                        data: {
+                            frameworkcode: 'ACQ',
+                            biblionumber: [% biblionumber %],
+                            itemnumber: [% itemnumber %]
+                        },
+                        success: function(data, textStatus, jqXHR) {
+                            /* Create the item block */
+                            var buttonPlus = '<a name="buttonPlus" style="cursor:pointer; margin:0 1em;" onclick="addItem(this,\'' + unique_item_fields + '\')">Update</a>';
+                            var buttonClear = '<a name="buttonClear" style="cursor:pointer;" onclick="clearItemBlock(this)">' + (window.MSG_ADDITEM_JS_CLEAR || 'Clear') + '</a>';
+
+                            $("#itemblock[% itemid %]").append(data).append(buttonPlus).append(buttonClear);
+                            $("#itemblock[% itemid %]").find("input[name='itemid']").each(function(){
+                                $(this).val([% itemid %]);
+                            });
+                        }
+                    });
+
+                    addItemInList("itemblock[% itemid %]", unique_item_fields);
+                });
+            </script>
+            [% itemid = itemid + 1 %]
+            [% END %] <!-- /items -->
+        [% END %] <!-- if items -->
+        </div>
+    </fieldset>
 
-        <fieldset class="rows" id="itemfieldset">
-            <legend>Item</legend>
-            [% IF ( NoACQframework ) %]
-                <p class="required">
-                    No ACQ framework, using default. You should create a
-                    framework with code ACQ, the items framework would be
-                    used
-                </p>
-            [% END %]
-            <div id="outeritemblock"></div>
-        </fieldset>
-    [% END %][%# IF (AcqCreateItemReceiving) %]
     <input type="hidden" name="biblionumber" value="[% biblionumber %]" />
     <input type="hidden" name="ordernumber" value="[% ordernumber %]" />
     <input type="hidden" name="biblioitemnumber" value="[% biblioitemnumber %]" />
@@ -139,42 +170,16 @@
 	<div class="yui-u">
     <fieldset class="rows">
     <legend>Accounting details</legend>
-       <ol>
-       <li><label for="datereceived">Date received: </label><span> [% datereceived %] </span></li>
-       <li><label for="bookfund">Budget: </label><span> [% bookfund %] </span></li>
-       <li><label for="creator">Created by: </label><span> [% IF ( memberfirstname and membersurname ) %][% IF ( memberfirstname ) %][% memberfirstname %][% END %] [% membersurname %][% ELSE %]No name[% END %]</span></li>
-       <li><label for="quantityto">Quantity to receive: </label><span class="label">
-           [% IF ( edit ) %]
-               <input type="text" id="quantity_to_receive" name="quantity" value="[% quantity %]" />
-           [% ELSE %]
-               <input type="text" readonly="readonly" id="quantity_to_receive" name="quantity" value="[% quantity %]" />
-           [% END %]
+    <ol>
+        <li><label for="datereceived">Date received: </label><span> [% datereceived %] </span></li>
+        <li><label for="bookfund">Budget: </label><span> [% bookfund %] </span></li>
+        <li><label for="creator">Created by: </label><span> [% IF ( memberfirstname and membersurname ) %][% IF ( memberfirstname ) %][% memberfirstname %][% END %] [% membersurname %][% ELSE %]No name[% END %]</span></li>
+        <li><label for="quantity">Quantity to receive: </label><span class="label">
+            <input type="text" readonly="readonly" name="quantity" value="[% quantity %]" />
            </span></li>
         <li><label for="quantity">Quantity received: </label>
-          [% IF (AcqCreateItemReceiving) %]
-            <input readonly="readonly" type="text" size="20" name="quantityrec" id="quantity" value="0" />
-          [% ELSE %]
-            [% IF ( quantityreceived ) %]
-                [% IF ( edit ) %]
-                    <input type="text" size="20" name="quantityrec" id="quantity" value="[% quantityreceived %]" />
-                    <input id="origquantityrec" READONLY type="hidden" name="origquantityrec" value="[% quantityreceived %]" />
-                [% ELSE %]
-                [% IF ( items ) %]
-                    <input READONLY type="text" size="20" name="quantityrec" id="quantity" value="[% quantityreceivedplus1 %]" />
-                [% ELSE %]
-                    <input type="text" size="20" name="quantityrec" id="quantity" value="[% quantityreceivedplus1 %]" />
-                [% END %]
-                <input id="origquantityrec" READONLY type="hidden" name="origquantityrec" value="[% quantityreceived %]" />
-                [% END %]
-            [% ELSE %]
-                [% IF ( items ) %]
-                    <input READONLY type="text" id="quantity" size="20" name="quantityrec" value="1" />
-                [% ELSE %]
-                    <input type="text" size="20" id="quantity" name="quantityrec" value="1" />
-                [% END %]
-                <input id="origquantityrec" READONLY type="hidden" name="origquantityrec" value="0" />
-            [% END %]
-          [% END %][%# IF (AcqCreateItemReceiving) %]
+            <input readonly="readonly" type="text" size="20" name="quantityrec" id="quantity" value="[% quantityreceived || 0 %]" />
+            <input id="origquantityrec" type="hidden" name="origquantityrec" value="[% origquantityrec %]" />
 		</li>
         <li><label for="rrp">Replacement cost: </label><input type="text" size="20" name="rrp" id="rrp" value="[% rrp %]" /></li>
         <li><label for="ecost">Budgeted cost: </label><input type="text" size="20" name="ecost" id="ecost" value="[% ecost %]" /></li>
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/services/itemrecorddisplay.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/services/itemrecorddisplay.tt
index 6790b3d..1b92907 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/services/itemrecorddisplay.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/services/itemrecorddisplay.tt
@@ -13,7 +13,7 @@
             [% END %]
         </label>
         [% iteminfo.marc_value %]
-        <input type="hidden" name="itemid" value="1" />
+        <input type="hidden" name="itemid" />
         <input type="hidden" name="kohafield" value="[% iteminfo.kohafield %]" />
         <input type="hidden" name="tag" value="[% iteminfo.tag %]" />
         <input type="hidden" name="subfield" value="[% iteminfo.subfield %]" />
@@ -22,3 +22,4 @@
     </li>
   [% END %]
 </ol>
+<input type="hidden" name="itemnumber" value="[% itemnumber %]" />
diff --git a/t/db_dependent/lib/KohaTest.pm b/t/db_dependent/lib/KohaTest.pm
index d8cf495..c632740 100644
--- a/t/db_dependent/lib/KohaTest.pm
+++ b/t/db_dependent/lib/KohaTest.pm
@@ -572,16 +572,12 @@ sub add_biblios {
         ok( $biblionumber, "the biblionumber is $biblionumber" );
         ok( $biblioitemnumber, "the biblioitemnumber is $biblioitemnumber" );
         if ( $param{'add_items'} ) {
-            # my @iteminfo = AddItem( {}, $biblionumber );
-            my @iteminfo = AddItemFromMarc( $marcrecord, $biblionumber );
-            is( $iteminfo[0], $biblionumber,     "biblionumber is $biblionumber" );
-            is( $iteminfo[1], $biblioitemnumber, "biblioitemnumber is $biblioitemnumber" );
-            ok( $iteminfo[2], "itemnumber is $iteminfo[2]" );
-        push @{ $self->{'items'} },
-          { biblionumber     => $iteminfo[0],
-            biblioitemnumber => $iteminfo[1],
-            itemnumber       => $iteminfo[2],
-          };
+            # my $item = AddItem( {}, $biblionumber );
+            my $item = AddItemFromMarc( $marcrecord, $biblionumber );
+            is( $item->{biblionumber},     "biblionumber is $biblionumber" );
+            is( $item->{biblioitemnumber}, "biblioitemnumber is $biblioitemnumber" );
+            ok( $item->{itemnumber}, "itemnumber is $item->{itemnumber}" );
+            push @{ $self->{'items'} }, $item;
         }
         push @{$self->{'biblios'}}, $biblionumber;
     }
diff --git a/t/db_dependent/lib/KohaTest/Acquisition/GetParcel.pm b/t/db_dependent/lib/KohaTest/Acquisition/GetParcel.pm
index c26e5f2..b42ea9c 100644
--- a/t/db_dependent/lib/KohaTest/Acquisition/GetParcel.pm
+++ b/t/db_dependent/lib/KohaTest/Acquisition/GetParcel.pm
@@ -43,18 +43,11 @@ sub one_parcel : Test( 17 ) {
     
     ok( $basketno, "my basket number is $basketno" );
     ok( $ordernumber,   "my order number is $ordernumber" );
-    my $datereceived = ModReceiveOrder( $self->{'biblios'}[0],             # biblionumber
-                                        $ordernumber,       # $ordernumber,
-                                        undef,         # $quantrec,
-                                        undef,         # $user,
-                                        undef,         # $cost,
-                                        $invoice,         # $invoiceno,
-                                        undef,         # $freight,
-                                        undef,         # $rrp,
-                                        $self->{'bookfundid'},         # $bookfund,
-                                        $today,         # $datereceived
-                                   );
-    is( $datereceived, $today, "the parcel was received on $datereceived" );
+    ModReceiveOrder( $self->{'biblios'}[0],             # biblionumber
+                     $ordernumber,       # $ordernumber,
+                     1,         # $quantrec,
+                   );
+    pass( "the parcel was received" );
 
     my @parcel = GetParcel( $self->{'booksellerid'}, $invoice, $today );
     is( scalar @parcel, 1, 'we found one (1) parcel.' )
diff --git a/t/db_dependent/lib/KohaTest/Acquisition/GetParcels.pm b/t/db_dependent/lib/KohaTest/Acquisition/GetParcels.pm
index fd3ad0f..b14095f 100644
--- a/t/db_dependent/lib/KohaTest/Acquisition/GetParcels.pm
+++ b/t/db_dependent/lib/KohaTest/Acquisition/GetParcels.pm
@@ -271,18 +271,12 @@ sub create_order {
 
     my ( $basketno, $ordernumber ) = $self->create_new_basket( %param );
 
-    my $datereceived = ModReceiveOrder( $self->{'biblios'}[0],             # biblionumber
-                                        $ordernumber,       # $ordernumber,
-                                        undef,         # $quantrec,
-                                        undef,         # $user,
-                                        undef,         # $cost,
-                                        $param{'invoice'},         # $invoiceno,
-                                        undef,         # $freight,
-                                        undef,         # $rrp,
-                                        $self->{'bookfundid'},         # $bookfund,
-                                        $param{'date'},         # $datereceived
-                                   );
-    is( $datereceived, $param{'date'}, "the parcel was received on $datereceived" );
+    ModReceiveOrder( $self->{'biblios'}[0],             # biblionumber
+                     $ordernumber,       # $ordernumber,
+                     1,         # $quantrec,
+                   );
+    # XXX Needs proper tests for partial receiving
+    pass( "the parcel was received" );
 
 }
 
diff --git a/t/db_dependent/lib/KohaTest/Biblio/ModBiblio.pm b/t/db_dependent/lib/KohaTest/Biblio/ModBiblio.pm
index 5b29ea8..8a83268 100644
--- a/t/db_dependent/lib/KohaTest/Biblio/ModBiblio.pm
+++ b/t/db_dependent/lib/KohaTest/Biblio/ModBiblio.pm
@@ -31,10 +31,10 @@ sub add_bib_to_modify : Test( startup => 3 ) {
     $self->{'bib_to_modify'} = $bibnum;
 
     # add an item
-    my ($item_bibnum, $item_bibitemnum, $itemnumber) = AddItem({ homebranch => 'CPL', holdingbranch => 'CPL' } , $bibnum);
+    my $item = AddItem({ homebranch => 'CPL', holdingbranch => 'CPL' } , $bibnum);
 
-    cmp_ok($item_bibnum, '==', $bibnum, "new item is linked to correct biblionumber"); 
-    cmp_ok($item_bibitemnum, '==', $bibitemnum, "new item is linked to correct biblioitemnumber"); 
+    cmp_ok($item->{biblionumber}, '==', $bibnum, "new item is linked to correct biblionumber"); 
+    cmp_ok($item->{biblioitemnumber}, '==', $bibitemnum, "new item is linked to correct biblioitemnumber"); 
 
     $self->reindex_marc(); 
 
-- 
1.7.5.4



More information about the Koha-patches mailing list