#!/usr/bin/perl #script to add a new item and to mark orders as received #written 1/3/00 by chris@katipo.co.nz # Copyright 2000-2002 Katipo Communications # # This file is part of Koha. # # Koha is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # Koha is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Koha; if not, see . use Modern::Perl; use CGI qw ( -utf8 ); use C4::Auth qw( checkauth ); use JSON qw( encode_json ); use C4::Output; use C4::Context; use C4::Acquisition qw( GetInvoice GetOrder ModReceiveOrder ); use C4::Biblio qw( GetFrameworkCode GetMarcFromKohaField TransformHtmlToXml ); use C4::Items qw( GetMarcItem ModItemFromMarc AddItemFromMarc ); use C4::Log qw(logaction); use C4::Search; use Koha::Number::Price; use Koha::Acquisition::Booksellers; use Koha::Acquisition::Orders; my $input = CGI->new; if ( $input->request_method ne "POST" ) { print $input->header( -status => 400 ); exit; } my $flagsrequired = { acquisition => 'order_receive' }; checkauth($input, 0, $flagsrequired, 'intranet'); my $user = $input->remote_user; my $biblionumber = $input->param('biblionumber'); my $ordernumber = $input->param('ordernumber'); my $origquantityrec = $input->param('origquantityrec'); my $quantityrec = $input->param('quantityrec'); my $quantity = $input->param('quantity'); my $unitprice = $input->param('unitprice'); my $replacementprice = $input->param('replacementprice'); my $datereceived = $input->param('datereceived'); my $invoice_unitprice = $input->param('invoice_unitprice'); my $invoice_currency = $input->param('invoice_currency'); my $invoiceid = $input->param('invoiceid'); my $invoice = GetInvoice($invoiceid); my $invoiceno = $invoice->{invoicenumber}; my $booksellerid = $input->param('booksellerid'); my $cnt = 0; my $bookfund = $input->param("bookfund"); my $suggestion_id = $input->param("suggestionid"); my $order = GetOrder($ordernumber); my $new_ordernumber = $ordernumber; #bug18723 regression fix if (C4::Context->preference("CurrencyFormat") eq 'FR') { if (rindex($unitprice, '.') ge 0) { substr($unitprice, rindex($unitprice, '.'), 1, ','); } if (rindex($replacementprice,'.') ge 0) { substr($replacementprice, rindex($replacementprice, '.'), 1, ','); } } $unitprice = Koha::Number::Price->new( $unitprice )->unformat(); $replacementprice = Koha::Number::Price->new( $replacementprice )->unformat(); my $order_obj = Koha::Acquisition::Orders->find( $ordernumber ); my $basket = $order_obj->basket; #need old receivedate if we update the order, parcel.pl only shows the right parcel this way FIXME if ($quantityrec > $origquantityrec ) { my @received_items = (); if ($basket->effective_create_items eq 'ordering') { @received_items = $input->multi_param('items_to_receive[]'); my @affects = split q{\|}, C4::Context->preference("AcqItemSetSubfieldsWhenReceived"); if ( @affects ) { my $frameworkcode = GetFrameworkCode($biblionumber); my ( $itemfield ) = GetMarcFromKohaField( 'items.itemnumber' ); for my $in ( @received_items ) { my $item = C4::Items::GetMarcItem( $biblionumber, $in ); for my $affect ( @affects ) { my ( $sf, $v ) = split q{=}, $affect, 2; foreach ( $item->field($itemfield) ) { $_->update( $sf => $v ); } } C4::Items::ModItemFromMarc( $item, $biblionumber, $in ); } } } $order_obj->set( { order_internalnote => scalar $input->param("order_internalnote"), tax_rate_on_receiving => scalar $input->param("tax_rate"), replacementprice => $replacementprice, unitprice => $unitprice, ( $invoice_unitprice && $invoice_unitprice ne '' ? ( invoice_unitprice => $invoice_unitprice, invoice_currency => $invoice_currency, ) : ( invoice_unitprice => undef, invoice_currency => undef, ) ), } ); $order_obj->populate_with_prices_for_receiving(); # save the quantity received. if ( $quantityrec > 0 ) { if ( $order_obj->subscriptionid ) { # Quantity can only be modified if linked to a subscription $order_obj->quantity($quantity); # quantityrec will be deduced from this value in ModReceiveOrder } ( $datereceived, $new_ordernumber ) = ModReceiveOrder( { biblionumber => $biblionumber, order => $order_obj->unblessed, quantityreceived => $quantityrec, user => $user, invoice => $invoice, budget_id => $bookfund, datereceived => $datereceived, received_items => \@received_items, } ); } # now, add items if applicable if ($basket->effective_create_items eq 'receiving') { my @tags = $input->multi_param('tag[]'); my @subfields = $input->multi_param('subfield[]'); my @field_values = $input->multi_param('field_value[]'); my @serials = $input->multi_param('serial[]'); my @itemid = $input->multi_param('itemid[]'); #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]; } my $new_order = Koha::Acquisition::Orders->find( $new_ordernumber ); foreach my $item (keys %itemhash){ my $xml = TransformHtmlToXml( $itemhash{$item}->{'tags'}, $itemhash{$item}->{'subfields'}, $itemhash{$item}->{'field_values'}, undef, undef, 'ITEM' ); my $record=MARC::Record::new_from_xml($xml, 'UTF-8'); my (undef,$bibitemnum,$itemnumber) = AddItemFromMarc($record,$biblionumber); $new_order->add_item( $itemnumber ); } } } my $new_order_object = Koha::Acquisition::Orders->find( $new_ordernumber ); # FIXME we should not need to refetch it my $items = $new_order_object->items; while ( my $item = $items->next ) { $item->update({ booksellerid => $booksellerid, dateaccessioned => $datereceived, datelastseen => $datereceived, price => $unitprice, replacementprice => $replacementprice, replacementpricedate => $datereceived, }); } if ($suggestion_id) { my $reason = $input->param("reason") || ''; my $other_reason = $input->param("other_reason"); $reason = $other_reason if $reason eq 'other'; my $suggestion = Koha::Suggestions->find($suggestion_id); $suggestion->update( { reason => $reason } ) if $suggestion; } # Log the receipt if (C4::Context->preference("AcquisitionLog")) { my $infos = { quantityrec => $quantityrec, bookfund => $bookfund || 'unchanged', tax_rate => $input->param("tax_rate"), replacementprice => $replacementprice, unitprice => $unitprice, ( defined $invoice_unitprice && $invoice_unitprice ne '' ? ( invoice_unitprice => $invoice_unitprice, invoice_currency => $invoice_currency, ) : () ), }; logaction( 'ACQUISITIONS', 'RECEIVE_ORDER', $ordernumber, encode_json($infos) ); } print $input->redirect("/cgi-bin/koha/acqui/parcel.pl?invoiceid=$invoiceid");