@@ -, +, @@ --- C4/Acquisition.pm | 88 ++++++++++++++++++++++- acqui/addorder.pl | 124 +++++++++++++++++++++++++------- admin/koha2marclinks.pl | 8 +-- admin/marc_subfields_structure.pl | 6 ++ installer/data/mysql/kohastructure.sql | 1 + installer/data/mysql/updatedatabase.pl | 11 +++ 6 files changed, 204 insertions(+), 34 deletions(-) --- a/C4/Acquisition.pm +++ a/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 --- a/acqui/addorder.pl +++ a/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,41 +194,114 @@ 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} : "", - }); + 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} : "", + "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'); --- a/admin/koha2marclinks.pl +++ a/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 --- a/admin/marc_subfields_structure.pl +++ a/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; --- a/installer/data/mysql/kohastructure.sql +++ a/installer/data/mysql/kohastructure.sql @@ -2634,6 +2634,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`), --- a/installer/data/mysql/updatedatabase.pl +++ a/installer/data/mysql/updatedatabase.pl @@ -4684,7 +4684,18 @@ if (C4::Context->preference("Version") < TransformToNum($DBversion)) { SetVersion($DBversion); } +$DBversion = "3.07.00.015"; +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 +======= + +=item DropAllForeignKeys($table) =head2 DropAllForeignKeys($table) --