X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=cataloguing%2Fadditem.pl;h=a82b621b427628f5a713f0c619fb95bb01f1dd33;hb=e6ee69b4a32cf707f6188013f68b1f5547812c34;hp=64ba8af254bba3f92d21b18fe5c1237e42d5a3da;hpb=e14fdf1f5e9a54fe693f48daabf36a07a47e759b;p=koha_fer diff --git a/cataloguing/additem.pl b/cataloguing/additem.pl index 64ba8af254..a82b621b42 100755 --- a/cataloguing/additem.pl +++ b/cataloguing/additem.pl @@ -1,6 +1,5 @@ #!/usr/bin/perl -# $Id$ # Copyright 2000-2002 Katipo Communications # @@ -26,6 +25,10 @@ use C4::Output; use C4::Biblio; use C4::Context; use C4::Koha; # XXX subfield_is_koha_internal_p +use C4::Branch; # XXX subfield_is_koha_internal_p +use C4::ClassSource; + +use Date::Calc qw(Today); use MARC::File::XML; @@ -60,15 +63,22 @@ my $dbh = C4::Context->dbh; my $error = $input->param('error'); my $biblionumber = $input->param('biblionumber'); my $itemnumber = $input->param('itemnumber'); - my $op = $input->param('op'); +my ($template, $loggedinuser, $cookie) + = get_template_and_user({template_name => "cataloguing/additem.tmpl", + query => $input, + type => "intranet", + authnotrequired => 0, + flagsrequired => {editcatalogue => 1}, + debug => 1, + }); + # find itemtype my $frameworkcode = &GetFrameworkCode($biblionumber); my $tagslib = &GetMarcStructure(1,$frameworkcode); my $record = GetMarcBiblio($biblionumber); -warn "==>".$record->as_formatted; my $oldrecord = TransformMarcToKoha($dbh,$record); my $itemrecord; my $nextop="additem"; @@ -102,12 +112,12 @@ if ($op eq "additem") { } # check for item barcode # being unique my $addedolditem = TransformMarcToKoha($dbh,$record); - my $exists = get_item_from_barcode($addedolditem->{'barcode'}); - push @errors,"barcode_not_unique" if($exists); + my $exist_itemnumber = get_item_from_barcode($addedolditem->{'barcode'}); + push @errors,"barcode_not_unique" if($exist_itemnumber); # if barcode exists, don't create, but report The problem. - my ($oldbiblionumber,$oldbibnum,$oldbibitemnum) = AddItem($record,$biblionumber) unless ($exists); - if ($exists) { - $nextop = "additem"; + my ($oldbiblionumber,$oldbibnum,$oldbibitemnum) = AddItem($record,$biblionumber) unless ($exist_itemnumber); + if ($exist_itemnumber) { + $nextop = "additem"; $itemrecord = $record; } else { $nextop = "additem"; @@ -129,7 +139,7 @@ if ($op eq "additem") { if ($onloan){ $nextop="additem"; } else { - &DelItem($biblionumber,$itemnumber); + &DelItem($dbh,$biblionumber,$itemnumber); print $input->redirect("additem.pl?biblionumber=$biblionumber&frameworkcode=$frameworkcode"); #$nextop="additem"; } @@ -143,13 +153,20 @@ if ($op eq "additem") { # build indicator hash. my @ind_tag = $input->param('ind_tag'); my @indicator = $input->param('indicator'); -# my $itemnumber = $input->param('itemnumber'); + # my $itemnumber = $input->param('itemnumber'); my $xml = TransformHtmlToXml(\@tags,\@subfields,\@values,\@indicator,\@ind_tag,'ITEM'); - my $itemrecord=MARC::Record::new_from_xml($xml, 'UTF-8'); -# MARC::Record builded => now, record in DB -# warn "R: ".$record->as_formatted; - my ($oldbiblionumber,$oldbibnum,$oldbibitemnum) = ModItem($itemrecord,$biblionumber,$itemnumber,0); + my $itemtosave=MARC::Record::new_from_xml($xml, 'UTF-8'); + # MARC::Record builded => now, record in DB + # warn "R: ".$record->as_formatted; + # check that the barcode don't exist already + my $addedolditem = TransformMarcToKoha($dbh,$itemtosave); + my $exist_itemnumber = get_item_from_barcode($addedolditem->{'barcode'}); + if ($exist_itemnumber && $exist_itemnumber != $itemnumber) { + push @errors,"barcode_not_unique"; + } else { + my ($oldbiblionumber,$oldbibnum,$oldbibitemnum) = ModItem($itemtosave,$biblionumber,$itemnumber,0); $itemnumber=""; + } $nextop="additem"; } @@ -157,17 +174,7 @@ if ($op eq "additem") { #------------------------------------------------------------------------------- # build screen with existing items. and "new" one #------------------------------------------------------------------------------- -my ($template, $loggedinuser, $cookie) - = get_template_and_user({template_name => "cataloguing/additem.tmpl", - query => $input, - type => "intranet", - authnotrequired => 0, - flagsrequired => {editcatalogue => 1}, - debug => 1, - }); -my %indicators; -$indicators{995}=' '; # now, build existiing item list my $temp = GetMarcBiblio( $biblionumber ); my @fields = $temp->fields(); @@ -184,12 +191,17 @@ foreach my $field (@fields) { my %this_row; # loop through each subfield for my $i (0..$#subf) { - next if ($tagslib->{$field->tag()}->{$subf[$i][0]}->{tab} ne 10 && ($field->tag() ne $itemtagfield && $subf[$i][0] ne $itemtagsubfield)); + next if ($tagslib->{$field->tag()}->{$subf[$i][0]}->{tab} ne 10 + && ($field->tag() ne $itemtagfield + && $subf[$i][0] ne $itemtagsubfield)); + $witness{$subf[$i][0]} = $tagslib->{$field->tag()}->{$subf[$i][0]}->{lib} if ($tagslib->{$field->tag()}->{$subf[$i][0]}->{tab} eq 10); + $this_row{$subf[$i][0]} =$subf[$i][1] if ($tagslib->{$field->tag()}->{$subf[$i][0]}->{tab} eq 10); + if (($field->tag eq $branchtagfield) && ($subf[$i][$0] eq $branchtagsubfield) && C4::Context->preference("IndependantBranches")) { #verifying rights - my $userenv = C4::Context->userenv; + my $userenv = C4::Context->userenv(); unless (($userenv->{'flags'} == 1) or (($userenv->{'branch'} eq $subf[$i][1]))){ $this_row{'nomod'}=1; } @@ -200,7 +212,7 @@ foreach my $field (@fields) { push(@big_array, \%this_row); } } -#fill big_row with missing datas +#fill big_row with missing data foreach my $subfield_code (keys(%witness)) { for (my $i=0;$i<=$#big_array;$i++) { $big_array[$i]{$subfield_code}=" " unless ($big_array[$i]{$subfield_code}); @@ -210,6 +222,7 @@ my ($holdingbrtagf,$holdingbrtagsubf) = &GetMarcFromKohaField("items.holdingbran @big_array = sort {$a->{$holdingbrtagsubf} cmp $b->{$holdingbrtagsubf}} @big_array; # now, construct template ! +# First, the existing items for display my @item_value_loop; my @header_value_loop; for (my $i=0;$i<=$#big_array; $i++) { @@ -231,10 +244,10 @@ foreach my $subfield_code (sort keys(%witness)) { push(@header_value_loop, \%header_value); } -# next item form +# now, build the item form for entering a new item my @loop_data =(); my $i=0; -my $authorised_values_sth = $dbh->prepare("select authorised_value,lib from authorised_values where category=? order by lib"); +my $authorised_values_sth = $dbh->prepare("SELECT authorised_value,lib FROM authorised_values WHERE category=? ORDER BY lib"); foreach my $tag (sort keys %{$tagslib}) { my $previous_tag = ''; @@ -243,16 +256,35 @@ foreach my $tag (sort keys %{$tagslib}) { next if subfield_is_koha_internal_p($subfield); next if ($tagslib->{$tag}->{$subfield}->{'tab'} ne "10"); my %subfield_data; + + my $index_subfield= int(rand(1000000)); + if($subfield eq '@'){ + $subfield_data{id} = "tag_".$tag."_subfield_00_".$index_subfield; + } else { + $subfield_data{id} = "tag_".$tag."_subfield_".$subfield."_".$index_subfield; + } $subfield_data{tag}=$tag; $subfield_data{subfield}=$subfield; + $subfield_data{random}=int(rand(1000000)); # $subfield_data{marc_lib}=$tagslib->{$tag}->{$subfield}->{lib}; - $subfield_data{marc_lib}="{$tag}->{$subfield}->{lib}."\">".substr($tagslib->{$tag}->{$subfield}->{lib},0,12).""; + $subfield_data{marc_lib}="{$tag}->{$subfield}->{lib}."\">".$tagslib->{$tag}->{$subfield}->{lib}.""; $subfield_data{mandatory}=$tagslib->{$tag}->{$subfield}->{mandatory}; $subfield_data{repeatable}=$tagslib->{$tag}->{$subfield}->{repeatable}; - $subfield_data{hidden}= "display:none" if $tagslib->{$tag}->{$subfield}->{hidden}; my ($x,$value); ($x,$value) = find_value($tag,$subfield,$itemrecord) if ($itemrecord); $value =~ s/"/"/g; + unless ($value) { + $value = $tagslib->{$tag}->{$subfield}->{defaultvalue}; + + # get today date & replace YYYY, MM, DD if provided in the default value + my ( $year, $month, $day ) = Today(); + $month = sprintf( "%02d", $month ); + $day = sprintf( "%02d", $day ); + $value =~ s/YYYY/$year/g; + $value =~ s/MM/$month/g; + $value =~ s/DD/$day/g; + } + $subfield_data{visibility} = "display:none;" if (($tagslib->{$tag}->{$subfield}->{hidden} % 2 == 1)); #testing branch value if IndependantBranches. my $test = (C4::Context->preference("IndependantBranches")) && ($tag eq $branchtagfield) && ($subfield eq $branchtagsubfield) && @@ -260,76 +292,224 @@ foreach my $tag (sort keys %{$tagslib}) { # print $input->redirect(".pl?biblionumber=$biblionumber") if ($test); # search for itemcallnumber if applicable if (!$value && $tagslib->{$tag}->{$subfield}->{kohafield} eq 'items.itemcallnumber' && C4::Context->preference('itemcallnumber')) { - my $CNtag = substr(C4::Context->preference('itemcallnumber'),0,3); - my $CNsubfield = substr(C4::Context->preference('itemcallnumber'),3,1); - my $CNsubfield2 = substr(C4::Context->preference('itemcallnumber'),4,1); - my $temp2 = $temp->field($CNtag); - if ($temp2) { - $value = ($temp2->subfield($CNsubfield)).' '.($temp2->subfield($CNsubfield2)); + my $CNtag = substr(C4::Context->preference('itemcallnumber'),0,3); + my $CNsubfield = substr(C4::Context->preference('itemcallnumber'),3,1); + my $CNsubfield2 = substr(C4::Context->preference('itemcallnumber'),4,1); + my $temp2 = $temp->field($CNtag); + if ($temp2) { + $value = ($temp2->subfield($CNsubfield)).' '.($temp2->subfield($CNsubfield2)); #remove any trailing space incase one subfield is used $value=~s/^\s+|\s+$//g; } } - if ($tagslib->{$tag}->{$subfield}->{authorised_value}) { + if ( $tagslib->{$tag}->{$subfield}->{authorised_value} ) { my @authorised_values; my %authorised_lib; + my $dbh=C4::Context->dbh; + # builds list, depending on authorised value... + #---- branch - if ($tagslib->{$tag}->{$subfield}->{'authorised_value'} eq "branches" ) { - if ((C4::Context->preference("IndependantBranches")) && (C4::Context->userenv->{flags} != 1)){ - my $sth=$dbh->prepare("select branchcode,branchname from branches where branchcode = ? order by branchname"); - $sth->execute(C4::Context->userenv->{branch}); - push @authorised_values, "" unless ($tagslib->{$tag}->{$subfield}->{mandatory}); - while (my ($branchcode,$branchname) = $sth->fetchrow_array) { - push @authorised_values, $branchcode; - $authorised_lib{$branchcode}=$branchname; + if ( $tagslib->{$tag}->{$subfield}->{'authorised_value'} eq "branches" ) { + #Use GetBranches($onlymine) + my $onlymine=C4::Context->preference('IndependantBranches') && + C4::Context->userenv && + C4::Context->userenv->{flags}!=1 && + C4::Context->userenv->{branch}; + my $branches = GetBranches($onlymine); + my @branchloop; + foreach my $thisbranch ( sort keys %$branches ) { + push @authorised_values, $thisbranch; + $authorised_lib{$thisbranch} = $branches->{$thisbranch}->{'branchname'}; } - } else { - my $sth=$dbh->prepare("select branchcode,branchname from branches order by branchname"); + + #----- itemtypes + } + elsif ( $tagslib->{$tag}->{$subfield}->{authorised_value} eq "itemtypes" ) { + my $sth = + $dbh->prepare( + "select itemtype,description from itemtypes order by description"); $sth->execute; - push @authorised_values, "" unless ($tagslib->{$tag}->{$subfield}->{mandatory}); - while (my ($branchcode,$branchname) = $sth->fetchrow_array) { - push @authorised_values, $branchcode; - $authorised_lib{$branchcode}=$branchname; + push @authorised_values, "" + unless ( $tagslib->{$tag}->{$subfield}->{mandatory} ); + + my $itemtype; + + while ( my ( $itemtype, $description ) = $sth->fetchrow_array ) { + push @authorised_values, $itemtype; + $authorised_lib{$itemtype} = $description; } - } - #----- itemtypes - } elsif ($tagslib->{$tag}->{$subfield}->{authorised_value} eq "itemtypes") { - my $sth=$dbh->prepare("select itemtype,description from itemtypes order by description"); - $sth->execute; - push @authorised_values, "" unless ($tagslib->{$tag}->{$subfield}->{mandatory}); - while (my ($itemtype,$description) = $sth->fetchrow_array) { - push @authorised_values, $itemtype; - $authorised_lib{$itemtype}=$description; - } - #---- "true" authorised value - } else { - $authorised_values_sth->execute($tagslib->{$tag}->{$subfield}->{authorised_value}); - push @authorised_values, "" unless ($tagslib->{$tag}->{$subfield}->{mandatory}); - while (my ($authvalue,$lib) = $authorised_values_sth->fetchrow_array) { - push @authorised_values, $authvalue; - $authorised_lib{$authvalue}=$lib; + $value = $itemtype unless ($value); + + #---- class_sources + } + elsif ( $tagslib->{$tag}->{$subfield}->{authorised_value} eq "cn_source" ) { + push @authorised_values, "" + unless ( $tagslib->{$tag}->{$subfield}->{mandatory} ); + + my $class_sources = GetClassSources(); + + my $default_source = C4::Context->preference("DefaultClassificationSource"); + + foreach my $class_source (sort keys %$class_sources) { + next unless $class_sources->{$class_source}->{'used'} or + ($value and $class_source eq $value) or + ($class_source eq $default_source); + push @authorised_values, $class_source; + $authorised_lib{$class_source} = $class_sources->{$class_source}->{'description'}; + $value = $class_source unless ($value); + $value = $default_source unless ($value); } + + #---- "true" authorised value } - $subfield_data{marc_value}= CGI::scrolling_list(-name=>'field_value', - -values=> \@authorised_values, - -default=>"$value", - -labels => \%authorised_lib, - -size=>1, - -tabindex=>'', - -multiple=>0, - ); - } elsif ($tagslib->{$tag}->{$subfield}->{thesaurus_category}) { - $subfield_data{marc_value}=" {$tag}->{$subfield}->{thesaurus_category}&index=$i',$i)\">..."; - #" - } elsif ($tagslib->{$tag}->{$subfield}->{'value_builder'}) { - my $plugin="value_builder/".$tagslib->{$tag}->{$subfield}->{'value_builder'}; - require $plugin; - my $extended_param = plugin_parameters($dbh,$record,$tagslib,$i,0); - my ($function_name,$javascript) = plugin_javascript($dbh,$record,$tagslib,$i,0); - $subfield_data{marc_value}=" ... $javascript"; - } else { - $subfield_data{marc_value}=""; + else { + $authorised_values_sth->execute( + $tagslib->{$tag}->{$subfield}->{authorised_value} ); + + push @authorised_values, "" + unless ( $tagslib->{$tag}->{$subfield}->{mandatory} ); + + while ( my ( $value, $lib ) = $authorised_values_sth->fetchrow_array ) { + push @authorised_values, $value; + $authorised_lib{$value} = $lib; + } + } + $subfield_data{marc_value} =CGI::scrolling_list( + -name => "field_value", + -values => \@authorised_values, + -default => $value, + -labels => \%authorised_lib, + -override => 1, + -size => 1, + -multiple => 0, + -tabindex => 1, + -id => "tag_".$tag."_subfield_".$subfield."_".$index_subfield, + -class => "input_marceditor", + ); + # it's a thesaurus / authority field + } + elsif ( $tagslib->{$tag}->{$subfield}->{authtypecode} ) { + $subfield_data{marc_value} = + " + {$tag}->{$subfield}->{authtypecode}."&index=$subfield_data{id}','$subfield_data{id}'); return false;\" title=\"Tag Editor\">... + "; + # it's a plugin field + } + elsif ( $tagslib->{$tag}->{$subfield}->{'value_builder'} ) { + + # opening plugin. Just check wether we are on a developper computer on a production one + # (the cgidir differs) + my $cgidir = C4::Context->intranetdir . "/cgi-bin/cataloguing/value_builder"; + unless ( opendir( DIR, "$cgidir" ) ) { + $cgidir = C4::Context->intranetdir . "/cataloguing/value_builder"; + closedir( DIR ); + } + my $plugin = $cgidir . "/" . $tagslib->{$tag}->{$subfield}->{'value_builder'}; + if (do $plugin) { + my $extended_param = plugin_parameters( $dbh, $temp, $tagslib, $subfield_data{id}, \@loop_data ); + my ( $function_name, $javascript ) = plugin_javascript( $dbh, $temp, $tagslib, $subfield_data{id}, \@loop_data ); + + $subfield_data{marc_value} = + " + ... + $javascript"; + } else { + warn "Plugin Failed: $plugin"; + # supply default input form + $subfield_data{marc_value} = + " + "; + } + # it's an hidden field + } + elsif ( $tag eq '' ) { + $subfield_data{marc_value} = + " + "; + } + elsif ( $tagslib->{$tag}->{$subfield}->{'hidden'} ) { + $subfield_data{marc_value} = + ""; + + # it's a standard field + } + else { + if ( + length($value) > 100 + or + ( C4::Context->preference("marcflavour") eq "UNIMARC" && $tag >= 300 + and $tag < 400 && $subfield eq 'a' ) + or ( $tag >= 500 + and $tag < 600 + && C4::Context->preference("marcflavour") eq "MARC21" ) + ) + { + $subfield_data{marc_value} = + " + "; + } + else { + $subfield_data{marc_value} = + " + "; + } } # $subfield_data{marc_value}=""; push(@loop_data, \%subfield_data);