X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=acqui%2Fneworderempty.pl;h=7dc7cb5924b0b7c2cb30267b1c64be1509956ced;hb=HEAD;hp=e475b175b11b1cd3634dc8665403a190a6f065ae;hpb=d347b15163a86f6c40e587469da61eb9d4d3efed;p=koha_gimpoz diff --git a/acqui/neworderempty.pl b/acqui/neworderempty.pl index e475b175b1..7dc7cb5924 100755 --- a/acqui/neworderempty.pl +++ b/acqui/neworderempty.pl @@ -16,9 +16,9 @@ # 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, write to the Free Software Foundation, Inc., 59 Temple Place, -# Suite 330, Boston, MA 02111-1307 USA +# You should have received a copy of the GNU General Public License along +# with Koha; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. =head1 NAME @@ -26,6 +26,7 @@ neworderempty.pl =head1 DESCRIPTION + this script allows to create a new record to order it. This record shouldn't exist on database. @@ -42,10 +43,10 @@ the title of this new record. =item author the author of this new record. -=item copyright -the copyright of this new record. +=item publication year +the publication year of this new record. -=item ordnum +=item ordernumber the number of this order. =item biblio @@ -74,37 +75,36 @@ use C4::Input; use C4::Auth; use C4::Budgets; use C4::Input; -#use C4::Bookfund; -use C4::Bookseller; # GetBookSellerFromId +use C4::Bookseller qw/ GetBookSellerFromId /; use C4::Acquisition; use C4::Suggestions; # GetSuggestion -use C4::Biblio; # GetBiblioData +use C4::Biblio; # GetBiblioData GetMarcPrice +use C4::Items; #PrepareItemRecord use C4::Output; use C4::Input; use C4::Koha; use C4::Branch; # GetBranches use C4::Members; -use C4::Search qw/FindDuplicate BiblioAddAuthorities/; +use C4::Search qw/FindDuplicate/; #needed for z3950 import: -use C4::ImportBatch qw/GetImportRecordMarc/; - -my $input = new CGI; -my $booksellerid = $input->param('booksellerid'); # FIXME: else ERROR! -my $budget_id = $input->param('budget_id'); # FIXME: else ERROR! -my $title = $input->param('title'); -my $author = $input->param('author'); -my $copyright = $input->param('copyright'); -my $bookseller = GetBookSellerFromId($booksellerid); # FIXME: else ERROR! -my $ordnum = $input->param('ordnum') || ''; -my $biblionumber = $input->param('biblionumber'); -my $basketno = $input->param('basketno'); -my $purchaseorder= $input->param('purchaseordernumber'); -my $suggestionid = $input->param('suggestionid'); -# my $donation = $input->param('donation'); -my $close = $input->param('close'); -my $uncertainprice = $input->param('uncertainprice'); +use C4::ImportBatch qw/GetImportRecordMarc SetImportRecordStatus/; + +my $input = new CGI; +my $booksellerid = $input->param('booksellerid'); # FIXME: else ERROR! +my $budget_id = $input->param('budget_id') || 0; +my $title = $input->param('title'); +my $author = $input->param('author'); +my $publicationyear = $input->param('publicationyear'); +my $bookseller = GetBookSellerFromId($booksellerid); # FIXME: else ERROR! +my $ordernumber = $input->param('ordernumber') || ''; +my $biblionumber = $input->param('biblionumber'); +my $basketno = $input->param('basketno'); +my $suggestionid = $input->param('suggestionid'); +my $close = $input->param('close'); +my $uncertainprice = $input->param('uncertainprice'); +my $import_batch_id = $input->param('import_batch_id'); # if this is filled, we come from a staged file, and we will return here after saving the order ! my $data; my $new = 'no'; @@ -121,47 +121,56 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user( } ); +my $marcflavour = C4::Context->preference('marcflavour'); + +if(!$basketno) { + my $order = GetOrder($ordernumber); + $basketno = $order->{'basketno'}; +} + +my $basket = GetBasket($basketno); +my $contract = &GetContract($basket->{contractnumber}); + #simple parameters reading (all in one :-) my $params = $input->Vars; -if ( $ordnum eq '' and defined $params->{'breedingid'}){ +my $listprice=0; # the price, that can be in MARC record if we have one +if ( $ordernumber eq '' and defined $params->{'breedingid'}){ #we want to import from the breeding reservoir (from a z3950 search) my ($marcrecord, $encoding) = MARCfindbreeding($params->{'breedingid'}); die("Could not find the selected record in the reservoir, bailing") unless $marcrecord; + # Remove all the items (952) from the imported record + foreach my $item ($marcrecord->field('952')) { + $marcrecord->delete_field($item); + } + my $duplicatetitle; #look for duplicates - if (! (($biblionumber,$duplicatetitle) = FindDuplicate($marcrecord))){ - my $itemtypes = GetItemTypes(); - my $marcflavour = C4::Context->preference("marcflavour"); -# warn("$marcflavour----itemtype"."-------------marcflavour".$marcflavour."---------subfield".$marcrecord->subfield('200', 'b')); -#use the itemtype field of the UNIMARC standard. - if ( $marcflavour eq 'UNIMARC' ) { - my $itemtype = $marcrecord->subfield('200', 'b'); -#Check wether the itemtype is known - warn(grep { $itemtypes->{$_}->{itemtype} =~ /$itemtype/ } keys %$itemtypes); - if (scalar(grep { $itemtypes->{$_}->{itemtype} =~ /$itemtype/ } keys %$itemtypes) == 0) { - my @itemtypes = sort {lc($itemtypes->{$a}->{'description'}) cmp lc($itemtypes->{$b}->{'description'})} keys %$itemtypes; - $itemtype = $itemtypes[0]; -# warn(YAML->Dump(@itemtypes)); - $marcrecord->field('200')->update('b' => $itemtype); - } - } + ($biblionumber,$duplicatetitle) = FindDuplicate($marcrecord); + if($biblionumber && !$input->param('use_external_source')) { + #if duplicate record found and user did not decide yet, first warn user + #and let him choose between using new record or existing record + Load_Duplicate($duplicatetitle); + exit; + } + #from this point: add a new record if (C4::Context->preference("BiblioAddsAuthorities")){ - my ($countlinked,$countcreated)=BiblioAddAuthorities($marcrecord, $params->{'frameworkcode'}); + my $headings_linked=BiblioAutoLink($marcrecord, $params->{'frameworkcode'}); } my $bibitemnum; $params->{'frameworkcode'} or $params->{'frameworkcode'} = ""; ( $biblionumber, $bibitemnum ) = AddBiblio( $marcrecord, $params->{'frameworkcode'} ); - } + # get the price if there is one. + $listprice = GetMarcPrice($marcrecord, $marcflavour); + SetImportRecordStatus($params->{'breedingid'}, 'imported'); } -my $cur = GetCurrency(); -if ( $ordnum eq '' ) { # create order +if ( $ordernumber eq '' ) { # create order $new = 'yes'; - # $ordnum=newordernum; + # $ordernumber=newordernum; if ( $biblionumber && !$suggestionid ) { $data = GetBiblioData($biblionumber); } @@ -169,11 +178,11 @@ if ( $ordnum eq '' ) { # create order # get suggestion fields if applicable. If it's a subscription renewal, then the biblio already exists # otherwise, retrieve suggestion information. if ($suggestionid) { - $data = ($biblionumber) ? GetBiblioData($biblionumber) : GetSuggestion($suggestionid); + $data = ($biblionumber) ? GetBiblioData($biblionumber) : GetSuggestion($suggestionid); } } else { #modify order - $data = GetOrder($ordnum); + $data = GetOrder($ordernumber); $biblionumber = $data->{'biblionumber'}; $budget_id = $data->{'budget_id'}; @@ -183,47 +192,57 @@ else { #modify order $booksellerid = $data2->{'booksellerid'}; } +my $suggestion; +$suggestion = GetSuggestionInfo($suggestionid) if $suggestionid; + # get currencies (for change rates calcs if needed) +my $active_currency = GetCurrency(); +my $default_currency; +if (! $data->{currency} ) { # New order no currency set + if ( $bookseller->{listprice} ) { + $default_currency = $bookseller->{listprice}; + } + else { + $default_currency = $active_currency->{currency}; + } +} + my @rates = GetCurrencies(); -my $count = scalar @rates; # ## @rates my @loop_currency = (); -for ( my $i = 0 ; $i < $count ; $i++ ) { - my %line; - $line{currency} = $rates[$i]->{'currency'}; - $line{rate} = $rates[$i]->{'rate'}; - push @loop_currency, \%line; -} - - # ## @loop_currency - - -# build itemtype list -my $itemtypes = GetItemTypes; - -my @itemtypesloop; -foreach my $thisitemtype (sort {$itemtypes->{$a}->{'description'} cmp $itemtypes->{$b}->{'description'}} keys %$itemtypes) { - push @itemtypesloop, { itemtype => $itemtypes->{$thisitemtype}->{'itemtype'} , desc => $itemtypes->{$thisitemtype}->{'description'} } ; +for my $curr ( @rates ) { + my $selected; + if ($data->{currency} ) { + $selected = $curr->{currency} eq $data->{currency}; + } + else { + $selected = $curr->{currency} eq $default_currency; + } + push @loop_currency, { + currcode => $curr->{currency}, + rate => $curr->{rate}, + selected => $selected, + } } # build branches list my $onlymine=C4::Context->preference('IndependantBranches') && - C4::Context->userenv && - C4::Context->userenv->{flags}!=1 && - C4::Context->userenv->{branch}; + C4::Context->userenv && + C4::Context->userenv->{flags}!=1 && + C4::Context->userenv->{branch}; my $branches = GetBranches($onlymine); my @branchloop; foreach my $thisbranch ( sort {$branches->{$a}->{'branchname'} cmp $branches->{$b}->{'branchname'}} keys %$branches ) { - my %row = ( + my %row = ( value => $thisbranch, branchname => $branches->{$thisbranch}->{'branchname'}, ); - $row{'selected'} = 1 if( $thisbranch eq $data->{branchcode}) ; + $row{'selected'} = 1 if( $thisbranch && $data->{branchcode} && $thisbranch eq $data->{branchcode}) ; push @branchloop, \%row; } -$template->param( branchloop => \@branchloop , itypeloop => \@itemtypesloop ); +$template->param( branchloop => \@branchloop ); # build bookfund list my $borrower= GetMember('borrowernumber' => $loggedinuser); @@ -231,38 +250,38 @@ my ( $flags, $homebranch )= ($borrower->{'flags'},$borrower->{'branchcode'}); my $budget = GetBudget($budget_id); # build budget list -my %labels; -my @values; -my $budgets = GetBudgetHierarchy('','',$borrower->{'borrowernumber'}); -foreach my $r (@$budgets) { - $labels{"$r->{budget_id}"} = $r->{budget_name}; - next if sprintf ("%00d", $r->{budget_amount}) == 0; - push @values, $r->{budget_id}; +my $budget_loop = []; +my $budgets = GetBudgetHierarchy(q{},$borrower->{branchcode},$borrower->{borrowernumber}); +foreach my $r (@{$budgets}) { + if (!defined $r->{budget_amount} || $r->{budget_amount} == 0) { + next; + } + push @{$budget_loop}, { + b_id => $r->{budget_id}, + b_txt => $r->{budget_name}, + b_active => $r->{budget_period_active}, + b_sel => ( $r->{budget_id} == $budget_id ) ? 1 : 0, + }; } -# if no budget_id is passed then its an add -my $budget_dropbox = CGI::scrolling_list( - -name => 'budget_id', - -id => 'budget_id', - -values => \@values, - -size => 1, - -labels => \%labels, - -onChange => "fetchSortDropbox(this.form)", -); + +@{$budget_loop} = + sort { uc( $a->{b_txt}) cmp uc( $b->{b_txt}) } @{$budget_loop}; if ($close) { $budget_id = $data->{'budget_id'}; - $budget_name = $budget->{'budget_name'}; + $budget_name = $budget->{'budget_name'}; } - my $CGIsort1; if ($budget) { # its a mod .. if ( defined $budget->{'sort1_authcat'} ) { # with custom Asort* planning values - $CGIsort1 = GetAuthvalueDropbox( 'sort1', $budget->{'sort1_authcat'}, $data->{'sort1'} ); + $CGIsort1 = GetAuthvalueDropbox( $budget->{'sort1_authcat'}, $data->{'sort1'} ); } -} else { - $CGIsort1 = GetAuthvalueDropbox( 'sort1', @$budgets[0]->{'sort1_authcat'}, '' ); +} elsif(@{$budgets}){ + $CGIsort1 = GetAuthvalueDropbox( @$budgets[0]->{'sort1_authcat'}, '' ); +}else{ + $CGIsort1 = GetAuthvalueDropbox( '', '' ); } # if CGIsort is successfully fetched, the use it @@ -276,114 +295,109 @@ if ($CGIsort1) { my $CGIsort2; if ($budget) { if ( defined $budget->{'sort2_authcat'} ) { - $CGIsort2 = GetAuthvalueDropbox( 'sort2', $budget->{'sort2_authcat'}, $data->{'sort2'} ); + $CGIsort2 = GetAuthvalueDropbox( $budget->{'sort2_authcat'}, $data->{'sort2'} ); } -} else { - $CGIsort2 = GetAuthvalueDropbox( 'sort2', @$budgets[0]->{sort2_authcat}, '' ); +} elsif(@{$budgets}) { + $CGIsort2 = GetAuthvalueDropbox( @$budgets[0]->{sort2_authcat}, '' ); +}else{ + $CGIsort2 = GetAuthvalueDropbox( '', '' ); } + if ($CGIsort2) { $template->param( CGIsort2 => $CGIsort2 ); } else { $template->param( sort2 => $data->{'sort2'} ); } - - -# #do a biblioitems lookup on bib -# my @bibitems = GetBiblioItemByBiblioNumber($biblionumber); -# my $bibitemscount = scalar @bibitems; -# -# if ( $bibitemscount > 0 ) { -# # warn "NEWBIBLIO: bibitems for $biblio exists\n"; -# my @bibitemloop; -# for ( my $i = 0 ; $i < $bibitemscount ; $i++ ) { -# my %line; -# $line{biblioitemnumber} = $bibitems[$i]->{'biblioitemnumber'}; -# $line{isbn} = $bibitems[$i]->{'isbn'}; -# $line{itemtype} = $bibitems[$i]->{'itemtype'}; -# $line{volumeddesc} = $bibitems[$i]->{'volumeddesc'}; -# push( @bibitemloop, \%line ); -# -# $template->param( bibitemloop => \@bibitemloop ); -# } -# $template->param( bibitemexists => "1" ); -# } - -if (C4::Context->preference('AcqCreateItem') eq 'ordering' && !$ordnum) { - # prepare empty item form - my $cell = PrepareItemrecordDisplay(); - my @itemloop; - push @itemloop,$cell; - - $template->param(items => \@itemloop); +if (C4::Context->preference('AcqCreateItem') eq 'ordering' && !$ordernumber) { + # Check if ACQ framework exists + my $marc = GetMarcStructure(1, 'ACQ'); + unless($marc) { + $template->param('NoACQframework' => 1); + } + $template->param( + AcqCreateItemOrdering => 1, + UniqueItemFields => C4::Context->preference('UniqueItemFields'), + ); } +# Get the item types list, but only if item_level_itype is YES. Otherwise, it will be in the item, no need to display it in the biblio +my @itemtypes; +@itemtypes = C4::ItemType->all unless C4::Context->preference('item-level_itypes'); + +# Find the items.barcode subfield for barcode validations +my (undef, $barcode_subfield) = GetMarcFromKohaField('items.barcode', ''); # fill template $template->param( close => $close, budget_id => $budget_id, budget_name => $budget_name - ) - if ($close); +) if ($close); - # ## @loop_currency, $template->param( existing => $biblionumber, - ordnum => $ordnum, - basketno => $basketno, - booksellerid => $booksellerid, - suggestionid => $suggestionid, + ordernumber => $ordernumber, + # basket informations + basketno => $basketno, + basketname => $basket->{'basketname'}, + basketnote => $basket->{'note'}, + booksellerid => $basket->{'booksellerid'}, + basketbooksellernote => $basket->{booksellernote}, + basketcontractno => $basket->{contractnumber}, + basketcontractname => $contract->{contractname}, + creationdate => $basket->{creationdate}, + authorisedby => $basket->{'authorisedby'}, + authorisedbyname => $basket->{'authorisedbyname'}, + closedate => $basket->{'closedate'}, + # order details + suggestionid => $suggestion->{suggestionid}, + surnamesuggestedby => $suggestion->{surnamesuggestedby}, + firstnamesuggestedby => $suggestion->{firstnamesuggestedby}, biblionumber => $biblionumber, uncertainprice => $data->{'uncertainprice'}, authorisedbyname => $borrower->{'firstname'} . " " . $borrower->{'surname'}, - biblioitemnumber => $data->{'biblioitemnumber'}, - itemtype => $data->{'itemtype'}, - itemtype_desc => $itemtypes->{$data->{'itemtype'}}->{description}, + biblioitemnumber => $data->{'biblioitemnumber'}, discount_2dp => sprintf( "%.2f", $bookseller->{'discount'}) , # for display discount => $bookseller->{'discount'}, listincgst => $bookseller->{'listincgst'}, invoiceincgst => $bookseller->{'invoiceincgst'}, - invoicedisc => $bookseller->{'invoicedisc'}, - nocalc => $bookseller->{'nocalc'}, name => $bookseller->{'name'}, - cur_active_sym => $cur->{symbol}, - cur_active => $cur->{currency}, - currency => $bookseller->{'listprice'}, # eg: 'EUR' + cur_active_sym => $active_currency->{'symbol'}, + cur_active => $active_currency->{'currency'}, loop_currencies => \@loop_currency, orderexists => ( $new eq 'yes' ) ? 0 : 1, title => $data->{'title'}, author => $data->{'author'}, - copyrightdate => $data->{'copyrightdate'}, - budget_dropbox => $budget_dropbox, + publicationyear => $data->{'publicationyear'} ? $data->{'publicationyear'} : $data->{'copyrightdate'}, + editionstatement => $data->{'editionstatement'}, + budget_loop => $budget_loop, isbn => $data->{'isbn'}, seriestitle => $data->{'seriestitle'}, + itemtypeloop => \@itemtypes, quantity => $data->{'quantity'}, quantityrec => $data->{'quantity'}, - - rrp => $data->{'rrp'}, - list_price => sprintf("%.2f", $data->{'listprice'}), # watch the '-' - total => sprintf("%.2f", $data->{ecost}*$data->{quantity} ), - invoice => $data->{'booksellerinvoicenumber'}, + listprice => sprintf("%.2f", $data->{'listprice'}||$data->{'price'}||$listprice), + total => sprintf("%.2f", ($data->{'ecost'}||0)*($data->{'quantity'}||0) ), ecost => $data->{'ecost'}, - purchaseordernumber => $data->{'purchaseordernumber'}, + unitprice => sprintf("%.2f", $data->{'unitprice'}), notes => $data->{'notes'}, publishercode => $data->{'publishercode'}, - + barcode_subfield => $barcode_subfield, + + import_batch_id => $import_batch_id, # CHECKME: gst-stuff needs verifing, mason. - gstrate => $bookseller->{gstrate} || C4::Context->preference("gist"), + gstrate => $bookseller->{'gstrate'} // C4::Context->preference("gist") // 0, gstreg => $bookseller->{'gstreg'}, - -# donation => $donation ); output_html_with_http_headers $input, $cookie, $template->output; -=item MARCfindbreeding +=head2 MARCfindbreeding - $record = MARCfindbreeding($breedingid); + $record = MARCfindbreeding($breedingid); Look up the import record repository for the record with record with id $breedingid. If found, returns the decoded @@ -409,7 +423,7 @@ sub MARCfindbreeding { } } # fix the unimarc 100 coded field (with unicode information) - if (C4::Context->preference('marcflavour') eq 'UNIMARC' && $record->subfield(100,'a')) { + if ($marcflavour eq 'UNIMARC' && $record->subfield(100,'a')) { my $f100a=$record->subfield(100,'a'); my $f100 = $record->field(100); my $f100temp = $f100->as_string; @@ -421,7 +435,7 @@ sub MARCfindbreeding { $record->insert_fields_ordered($f100); } } - + if ( !defined(ref($record)) ) { return -1; } @@ -432,28 +446,28 @@ sub MARCfindbreeding { { my ( $tag, $subfield ) = GetMarcFromKohaField("biblio.author"); - # my $summary = C4::Context->preference("z3950authortemplate"); +# my $summary = C4::Context->preference("z3950authortemplate"); my $auth_fields = - C4::Context->preference("z3950AuthorAuthFields"); + C4::Context->preference("z3950AuthorAuthFields"); my @auth_fields = split /,/, $auth_fields; my $field; if ( $record->field($tag) ) { foreach my $tmpfield ( $record->field($tag)->subfields ) { - # foreach my $subfieldcode ($tmpfield->subfields){ + # foreach my $subfieldcode ($tmpfield->subfields){ my $subfieldcode = shift @$tmpfield; my $subfieldvalue = shift @$tmpfield; if ($field) { $field->add_subfields( "$subfieldcode" => $subfieldvalue ) - if ( $subfieldcode ne $subfield ); + if ( $subfieldcode ne $subfield ); } else { $field = - MARC::Field->new( $tag, "", "", + MARC::Field->new( $tag, "", "", $subfieldcode => $subfieldvalue ) - if ( $subfieldcode ne $subfield ); + if ( $subfieldcode ne $subfield ); } } } @@ -469,15 +483,15 @@ sub MARCfindbreeding { # $field->add_subfields("$subfield"=>"[ ".ucfirst($title).ucfirst($firstname)." ".$number." ]"); $field->add_subfields( "$subfield" => ucfirst($title) . " " - . ucfirst($firstname) . " " - . $number ); + . ucfirst($firstname) . " " + . $number ); } else { # $field->add_subfields("$subfield"=>"[ ".ucfirst($firstname).", ".ucfirst($lastname)." ]"); $field->add_subfields( "$subfield" => ucfirst($firstname) . ", " - . ucfirst($lastname) ); + . ucfirst($lastname) ); } } $record->insert_fields_ordered($field); @@ -488,3 +502,26 @@ sub MARCfindbreeding { return -1; } +sub Load_Duplicate { + my ($duplicatetitle)= @_; + ($template, $loggedinuser, $cookie) = get_template_and_user( + { + template_name => "acqui/neworderempty_duplicate.tmpl", + query => $input, + type => "intranet", + authnotrequired => 0, + flagsrequired => { acquisition => 'order_manage' }, +# debug => 1, + } + ); + + $template->param( + biblionumber => $biblionumber, + basketno => $basketno, + booksellerid => $basket->{'booksellerid'}, + breedingid => $params->{'breedingid'}, + duplicatetitle => $duplicatetitle, + ); + + output_html_with_http_headers $input, $cookie, $template->output; +}