From 7b382f804160011194926bdfe7e38dd7794dcc20 Mon Sep 17 00:00:00 2001 From: Jonathan Druart Date: Tue, 9 Apr 2013 17:56:24 +0200 Subject: [PATCH] Bug 7294: Adds acquisition informations in marc record --- C4/Acquisition.pm | 169 ++++++++++++-------- acqui/addorder.pl | 41 +++-- acqui/addorderiso2709.pl | 5 +- t/db_dependent/lib/KohaTest/Acquisition.pm | 3 +- .../lib/KohaTest/Acquisition/NewOrder.pm | 9 +- 5 files changed, 137 insertions(+), 90 deletions(-) diff --git a/C4/Acquisition.pm b/C4/Acquisition.pm index ca0cc72..793a325 100644 --- a/C4/Acquisition.pm +++ b/C4/Acquisition.pm @@ -24,6 +24,7 @@ use Carp; use C4::Context; use C4::Debug; use C4::Dates qw(format_date format_date_in_iso); +use MARC::Field; use MARC::Record; use C4::Suggestions; use C4::Biblio; @@ -1130,6 +1131,7 @@ sub NewOrder { my $ordernumber=InsertInTable("aqorders",$orderinfo); if (not $orderinfo->{parent_ordernumber}) { + $orderinfo->{parent_ordernumber} = $ordernumber; my $sth = $dbh->prepare(" UPDATE aqorders SET parent_ordernumber = ordernumber @@ -1137,7 +1139,9 @@ sub NewOrder { "); $sth->execute($ordernumber); } - return ( $orderinfo->{'basketno'}, $ordernumber ); + + $orderinfo->{ordernumber} = $ordernumber; + return $orderinfo; } @@ -1388,18 +1392,30 @@ sub ModReceiveOrder { $sth->execute($order->{quantity} - $quantrec, $ordernumber); - $sth->finish; + $order->{quantity} -= $quantrec; + + UpdateMarcOrder( { + biblionumber => $biblionumber, + order => $order, + } ); delete $order->{'ordernumber'}; $order->{'quantity'} = $quantrec; + $order->{'orderstatus'} = 3; # totally received $order->{'quantityreceived'} = $quantrec; $order->{'datereceived'} = $datereceived; $order->{'invoiceid'} = $invoiceid; $order->{'unitprice'} = $cost; $order->{'rrp'} = $rrp; $order->{ecost} = $ecost; - $order->{'orderstatus'} = 3; # totally received - $new_ordernumber = NewOrder($order); + + my $neworder = NewOrder( $order ); + my $newordernumber = $neworder->{ordernumber}; + + UpdateMarcOrder( { + biblionumber => $biblionumber, + order => $order, + } ); if ($received_items) { foreach my $itemnumber (@$received_items) { @@ -1407,68 +1423,18 @@ sub ModReceiveOrder { } } - # 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, $newordernumber) = NewOrder($order); - # Change ordernumber in aqorders_items for items not received - my @orderitems = GetItemnumbersFromOrder( $order->{'ordernumber'} ); - my $count = scalar @orderitems; - - for (my $i=0; $i<$count; $i++){ - foreach (@$received_items){ - splice (@orderitems, $i, 1) if ($orderitems[$i] == $_); - } - } - foreach (@orderitems) { - ModItemOrder($_, $newOrder); - } - - # 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=?,invoiceid=?, unitprice=?,rrp=?,ecost=? where biblionumber=? and ordernumber=?"); $sth->execute($quantrec,$datereceived,$invoiceid,$cost,$rrp,$ecost,$biblionumber,$ordernumber); - $sth->finish; # Removing MARC order field if exists - DelMarcOrder($biblionumber, $ordernumber); + DelMarcOrder({ + biblionumber => $biblionumber, + ordernumber => $ordernumber + } ); } return ($datereceived, $new_ordernumber); } @@ -1520,6 +1486,8 @@ sub CancelReceipt { }; $sth = $dbh->prepare($query); $sth->execute(0, undef, undef, $ordernumber); + + UpdateMarcOrder( { ordernumber => $ordernumber } ); } else { # The order line has a parent, increase parent quantity and delete # the order line. @@ -1582,6 +1550,8 @@ sub CancelReceipt { $sth = $dbh->prepare($query); $sth->execute($ordernumber); + DelMarcOrder( { ordernumber => $ordernumber } ); + UpdateMarcOrder( { ordernumber => $parent_ordernumber } ); } return $parent_ordernumber; @@ -1690,7 +1660,10 @@ sub DelOrder { $sth->finish; # Removing MARC order field if exists - DelMarcOrder($bibnum, $ordernumber); + DelMarcOrder( { + biblionumber => $bibnum, + ordernumber => $ordernumber, + } ); my @itemnumbers = GetItemnumbersFromOrder( $ordernumber ); foreach my $itemnumber (@itemnumbers){ @@ -1711,7 +1684,13 @@ in parameter =cut sub DelMarcOrder { - my ($biblionumber, $ordernumber) = @_; + my ( $params ) = @_; + my $biblionumber = $params->{biblionumber}; + my $ordernumber = $params->{ordernumber}; + + unless ( $biblionumber ) { + $biblionumber = GetBiblionumberFromOrdernumber( $ordernumber ); + } # Do we have to remove order informations from the marc record? my ($ordertag, $ordersubtag) = GetMarcFromKohaField('aqorders.ordernumber', 'ACQ'); @@ -1722,9 +1701,9 @@ sub DelMarcOrder { my $record = GetMarcBiblio($biblionumber); if ($record) { # Looking for the right field - foreach ($record->field($ordertag)) { - if ($_->subfield($ordersubtag) eq $ordernumber) { - $record->delete_field($_); + foreach my $field ( $record->field($ordertag) ) { + if ($field->subfield($ordersubtag) eq $ordernumber) { + $record->delete_field($field); } } # Applying changes @@ -1733,6 +1712,70 @@ sub DelMarcOrder { } } +sub GetBiblionumberFromOrdernumber { + my $ordernumber = shift; + my $dbh = C4::Context->dbh; + my $biblionumber = $dbh->selectrow_array(q| + SELECT biblionumber + FROM aqorders + WHERE ordernumber = ? + |, {}, $ordernumber ); + + return $biblionumber; +} + +sub UpdateMarcOrder { + my ( $params ) = @_; + my $biblionumber = $params->{biblionumber}; + my $order = $params->{order}; + my $ordernumber = $params->{ordernumber}; + my $old_ordernumber = $params->{old_ordernumber}; + + if ( $ordernumber and not $order ) { + $order = GetOrder( $ordernumber ); + } + unless ( $order ) { + carp "A parameter is missing, ordernumber or order is required"; + return; + } + unless ( $biblionumber ) { + $biblionumber = GetBiblionumberFromOrdernumber( $ordernumber ); + } + $old_ordernumber ||= $order->{ordernumber}; + + # Do we have to update order informations from the marc record? + my ($ordertag, $ordersubtag) = GetMarcFromKohaField('aqorders.ordernumber', 'ACQ'); + + return 0 unless $ordertag or $ordersubtag; + + # Updating MARC order field if exists + my $record = GetMarcBiblio($biblionumber); + return unless $record; + my $matching_field; + foreach my $field ($record->field($ordertag)) { + if ( $field->subfield($ordersubtag) eq $old_ordernumber ) { + $matching_field = $field; + last; + } + } + + unless ( $matching_field ) { + $matching_field = MARC::Field->new( $ordertag, '', '', $ordersubtag => $order->{ordernumber} ); + $record->insert_fields_ordered( $matching_field ); + } + # Updating ordernumber + $matching_field->update($ordersubtag => $order->{ordernumber}); + + # Updating quantity + my ($quantitytag, $quantitysubtag) = GetMarcFromKohaField('aqorders.quantity', 'ACQ'); + if ($quantitysubtag) { + $matching_field->update($quantitysubtag => $order->{quantity}); + } + + # Applying changes + ModBiblio($record, $biblionumber, 'ACQ'); +} + =head2 FUNCTIONS ABOUT PARCELS =cut diff --git a/acqui/addorder.pl b/acqui/addorder.pl index 932c901..19c0776 100755 --- a/acqui/addorder.pl +++ b/acqui/addorder.pl @@ -194,6 +194,7 @@ if ( $orderinfo->{quantity} ne '0' ) { "biblioitems.editionstatement"=> $$orderinfo{editionstatement}? $$orderinfo{editionstatement}: "", "aqorders.branchcode" => $$orderinfo{branchcode} ? $$orderinfo{branchcode} : "", "aqorders.quantity" => $$orderinfo{quantity} ? $$orderinfo{quantity} : "", + "aqorders.quantityreceived" => $$orderinfo{quantityreceived}? $$orderinfo{quantityreceived}: "", "aqorders.listprice" => $$orderinfo{listprice} ? $$orderinfo{listprice} : "", "aqorders.uncertainprice" => $$orderinfo{uncertainprice} ? $$orderinfo{uncertainprice} : "", "aqorders.rrp" => $$orderinfo{rrp} ? $$orderinfo{rrp} : "", @@ -224,66 +225,62 @@ if ( $orderinfo->{quantity} ne '0' ) { # Getting record $record = GetMarcBiblio($orderinfo->{biblionumber}); - - - # if we already have $ordernumber, then it's an ordermodif + # 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); + my $neworder = NewOrder($orderinfo); + $orderinfo->{basketno} = $neworder->{basketno}; + $orderinfo->{ordernumber} = $neworder->{ordernumber}; # We have to add the ordernumber in the designated subfield - if ($ordertag && $record && !$ordermodif) { + if ( $ordertag and $record ) { # If it's a new line, but we don't have any $ordertag field yet, - if (!$record->field($ordertag)) { + if ( not $record->field($ordertag) ) { # We add a new $ordertag field, with the ordernumber as subfield (other fields will be populated later) $record->insert_fields_ordered(new MARC::Field($ordertag, '', '', $ordersubtag => $orderinfo->{ordernumber})) if (!$record->field($ordertag)); } else { # Else, it's a new line, and we already have a $ordertag field - foreach ($record->field($ordertag)) { + foreach my $field ( $record->field($ordertag) ) { # If there's a $ordertag field without ordernumber, we create it - if (!$_->subfield($ordersubtag)) { - $_->update($ordersubtag, $orderinfo->{ordernumber}); + if ( not $field->subfield($ordersubtag) ) { + $field->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); + if ( not $ordermodif and $existingbiblio and not $record->field($ordertag) ) { + $record->insert_fields_ordered(new MARC::Field($ordertag, '', '', $ordersubtag => $$orderinfo{ordernumber})) + } - foreach ($record->field($ordertag)) { + foreach my $field ($record->field($ordertag)) { # Looking for the matching one - if ($_->subfield($ordersubtag) eq $orderinfo->{ordernumber}) { + if ($field->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/) { + for my $tablefield (qw/branchcode quantity quantityreceived listprice uncertainprice rrp ecost notes supplierreference sort1 sort2/) { ($t, $st) = GetMarcFromKohaField("aqorders.$tablefield", 'ACQ'); - $_->update($st, $orderinfo->{$tablefield}) if ($orderinfo->{$tablefield} and $st); + $field->update($st, $orderinfo->{$tablefield}) + if $orderinfo->{$tablefield} and $st; } ModBiblio($record, $orderinfo->{biblionumber}, 'ACQ'); } } - } - } - - # now, add items if applicable + # now, add items if applicable if ( C4::Context->preference('AcqCreateItem') eq 'ordering' ) { my @tags = $input->param('tag'); diff --git a/acqui/addorderiso2709.pl b/acqui/addorderiso2709.pl index abfb870..c234b65 100755 --- a/acqui/addorderiso2709.pl +++ b/acqui/addorderiso2709.pl @@ -233,8 +233,9 @@ if ($op eq ""){ # remove uncertainprice flag if we have found a price in the MARC record $orderinfo{uncertainprice} = 0 if $orderinfo{listprice}; - my $basketno; - ( $basketno, $ordernumber ) = NewOrder( \%orderinfo ); + my $order = NewOrder( \%orderinfo ); + my $basketno = $order->{basketno}; + $ordernumber = $order->{ordernumber}; # 4th, add items if applicable # parse the item sent by the form, and create an item just for the import_record_id we are dealing with diff --git a/t/db_dependent/lib/KohaTest/Acquisition.pm b/t/db_dependent/lib/KohaTest/Acquisition.pm index e7618c9..9507695 100644 --- a/t/db_dependent/lib/KohaTest/Acquisition.pm +++ b/t/db_dependent/lib/KohaTest/Acquisition.pm @@ -76,7 +76,7 @@ sub create_new_basket { # $basketnote, $basketbooksellernote, $basketcontractnumber ); # The following keys are used: "biblionumber", "title", "basketno", "quantity", "notes", "biblioitemnumber", "rrp", "ecost", "gst", "unitprice", "subscription", "sort1", "sort2", "booksellerinvoicenumber", "listprice", "budgetdate", "purchaseordernumber", "branchcode", "booksellerinvoicenumber", "bookfundid". my $budget_id = AddBudget( { budget_name => "Budget $rand" } ); - my ( undef, $ordernumber ) = NewOrder( { + my $order = NewOrder( { basketno => $basketno, budget_id => $budget_id, biblionumber => $self->{'biblios'}[0], @@ -86,6 +86,7 @@ sub create_new_basket { ecost => 1, booksellerinvoicenumber => $param{'invoice'}, } ); + my $ordernumber = $order->{ordernumber}; ok( $basketno, "my basket number is $basketno" ); ok( $ordernumber, "my order number is $ordernumber" ); diff --git a/t/db_dependent/lib/KohaTest/Acquisition/NewOrder.pm b/t/db_dependent/lib/KohaTest/Acquisition/NewOrder.pm index 972cde2..803ab9a 100644 --- a/t/db_dependent/lib/KohaTest/Acquisition/NewOrder.pm +++ b/t/db_dependent/lib/KohaTest/Acquisition/NewOrder.pm @@ -25,7 +25,8 @@ sub new_order_no_budget : Test( 4 ) { localtime->year() + 1900, localtime->mon() + 1, localtime->mday() ); - my ( $basketno, $ordernumber ) = NewOrder( undef, # $basketno, + + my $order = NewOrder( undef, # $basketno, 1, # $bibnum, undef, # $title, undef, # $quantity, @@ -47,6 +48,8 @@ sub new_order_no_budget : Test( 4 ) { undef, # $purchaseorder, undef, # $branchcode ); + my $basketno = $order->{basketno}; + my $ordernumber = $order->{ordernumber}; ok( $basketno, "my basket number is $basketno" ); ok( $ordernumber, "my order number is $ordernumber" ); @@ -73,7 +76,7 @@ sub new_order_set_budget : Test( 4 ) { localtime->year() + 1900, localtime->mon() + 1, localtime->mday() ); - my ( $basketno, $ordernumber ) = NewOrder( undef, # $basketno, + my $order = NewOrder( undef, # $basketno, 1, # $bibnum, undef, # $title, undef, # $quantity, @@ -95,6 +98,8 @@ sub new_order_set_budget : Test( 4 ) { undef, # $purchaseorder, undef, # $branchcode ); + my $basketno = $order->{basketno}; + my $ordernumber = $order->{ordernumber}; ok( $basketno, "my basket number is $basketno" ); ok( $ordernumber, "my order number is $ordernumber" ); -- 1.7.10.4