X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=cataloguing%2Faddbiblio.pl;h=a4614cc941d753a6f4f15f6c936263741f33f641;hb=dff16710ae53ebfab8596f27b35a7c8e35f81edf;hp=71195c03db14ad5ad0f292a40df10aff3834fde6;hpb=a6c9bd0eb55c32d5632625144775271f20aa15f7;p=srvgit diff --git a/cataloguing/addbiblio.pl b/cataloguing/addbiblio.pl index 71195c03db..a4614cc941 100755 --- a/cataloguing/addbiblio.pl +++ b/cataloguing/addbiblio.pl @@ -19,8 +19,8 @@ # You should have received a copy of the GNU General Public License # along with Koha; if not, see . -use strict; -#use warnings; FIXME - Bug 2505 +use Modern::Perl; + use CGI q(-utf8); use C4::Output; use C4::Auth; @@ -30,11 +30,17 @@ use C4::AuthoritiesMarc; use C4::Context; use MARC::Record; use C4::Log; -use C4::Koha; # XXX subfield_is_koha_internal_p -use C4::Branch; # XXX subfield_is_koha_internal_p +use C4::Koha; use C4::ClassSource; use C4::ImportBatch; use C4::Charset; +use Koha::BiblioFrameworks; +use Koha::DateUtils; + +use Koha::ItemTypes; +use Koha::Libraries; + +use Koha::BiblioFrameworks; use Date::Calc qw(Today); use MARC::File::USMARC; @@ -66,7 +72,7 @@ sub MARCfindbreeding { # remove the - in isbn, koha store isbn without any - if ($marc) { my $record = MARC::Record->new_from_usmarc($marc); - my ($isbnfield,$isbnsubfield) = GetMarcFromKohaField('biblioitems.isbn',''); + my ($isbnfield,$isbnsubfield) = GetMarcFromKohaField( 'biblioitems.isbn' ); if ( $record->field($isbnfield) ) { foreach my $field ( $record->field($isbnfield) ) { foreach my $subfield ( $field->subfield($isbnsubfield) ) { @@ -99,9 +105,8 @@ sub MARCfindbreeding { and C4::Context->preference("z3950AuthorAuthFields") and C4::Context->preference("marcflavour") eq 'UNIMARC' ) { - my ( $tag, $subfield ) = GetMarcFromKohaField("biblio.author", ''); + my ( $tag, $subfield ) = GetMarcFromKohaField( "biblio.author" ); - # my $summary = C4::Context->preference("z3950authortemplate"); my $auth_fields = C4::Context->preference("z3950AuthorAuthFields"); my @auth_fields = split /,/, $auth_fields; @@ -110,7 +115,6 @@ sub MARCfindbreeding { if ( $record->field($tag) ) { foreach my $tmpfield ( $record->field($tag)->subfields ) { - # foreach my $subfieldcode ($tmpfield->subfields){ my $subfieldcode = shift @$tmpfield; my $subfieldvalue = shift @$tmpfield; if ($field) { @@ -134,16 +138,12 @@ sub MARCfindbreeding { my $title = $record->field($fieldtag)->subfield('c'); my $number = $record->field($fieldtag)->subfield('d'); if ($title) { - -# $field->add_subfields("$subfield"=>"[ ".ucfirst($title).ucfirst($firstname)." ".$number." ]"); $field->add_subfields( "$subfield" => ucfirst($title) . " " . ucfirst($firstname) . " " . $number ); } else { - -# $field->add_subfields("$subfield"=>"[ ".ucfirst($firstname).", ".ucfirst($lastname)." ]"); $field->add_subfields( "$subfield" => ucfirst($firstname) . ", " . ucfirst($lastname) ); @@ -170,44 +170,27 @@ sub build_authorized_values_list { # builds list, depending on authorised value... #---- branch - if ( $tagslib->{$tag}->{$subfield}->{'authorised_value'} eq "branches" ) { - #Use GetBranches($onlymine) - my $onlymine = - C4::Context->preference('IndependentBranches') - && C4::Context->userenv - && !C4::Context->IsSuperLibrarian() - && 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'}; + my $category = $tagslib->{$tag}->{$subfield}->{authorised_value}; + if ( $category eq "branches" ) { + my $libraries = Koha::Libraries->search_filtered({}, {order_by => ['branchname']}); + while ( my $l = $libraries->next ) { + push @authorised_values, $l->branchcode;; + $authorised_lib{$l->branchcode} = $l->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} - && ( $value || $tagslib->{$tag}->{$subfield}->{defaultvalue} ) ); - + elsif ( $category eq "itemtypes" ) { + push @authorised_values, ""; + my $itemtype; - - while ( my ( $itemtype, $description ) = $sth->fetchrow_array ) { - push @authorised_values, $itemtype; - $authorised_lib{$itemtype} = $description; + my $itemtypes = Koha::ItemTypes->search_with_localization; + while ( $itemtype = $itemtypes->next ) { + push @authorised_values, $itemtype->itemtype; + $authorised_lib{$itemtype->itemtype} = $itemtype->translated_description; } $value = $itemtype unless ($value); - - #---- class_sources } - elsif ( $tagslib->{$tag}->{$subfield}->{authorised_value} eq "cn_source" ) { - push @authorised_values, "" - unless ( $tagslib->{$tag}->{$subfield}->{mandatory} ); + elsif ( $category eq "cn_source" ) { + push @authorised_values, ""; my $class_sources = GetClassSources(); @@ -229,9 +212,7 @@ sub build_authorized_values_list { $branch_limit ? $branch_limit : (), ); - push @authorised_values, "" - unless ( $tagslib->{$tag}->{$subfield}->{mandatory} - && ( $value || $tagslib->{$tag}->{$subfield}->{defaultvalue} ) ); + push @authorised_values, ""; while ( my ( $value, $lib ) = $authorised_values_sth->fetchrow_array ) { push @authorised_values, $value; @@ -239,6 +220,7 @@ sub build_authorized_values_list { } } $authorised_values_sth->finish; + return { type => 'select', id => "tag_".$tag."_subfield_".$subfield."_".$index_tag."_".$index_subfield, @@ -246,6 +228,7 @@ sub build_authorized_values_list { default => $value, values => \@authorised_values, labels => \%authorised_lib, + ( ( grep { $_ eq $category } ( qw(branches itemtypes cn_source) ) ) ? () : ( category => $category ) ), }; } @@ -262,18 +245,18 @@ sub CreateKey { =head2 GetMandatoryFieldZ3950 - This function return an hashref which containts all mandatory field + This function returns a hashref which contains all mandatory field to search with z3950 server. =cut sub GetMandatoryFieldZ3950 { my $frameworkcode = shift; - my @isbn = GetMarcFromKohaField('biblioitems.isbn',$frameworkcode); - my @title = GetMarcFromKohaField('biblio.title',$frameworkcode); - my @author = GetMarcFromKohaField('biblio.author',$frameworkcode); - my @issn = GetMarcFromKohaField('biblioitems.issn',$frameworkcode); - my @lccn = GetMarcFromKohaField('biblioitems.lccn',$frameworkcode); + my @isbn = GetMarcFromKohaField( 'biblioitems.isbn' ); + my @title = GetMarcFromKohaField( 'biblio.title' ); + my @author = GetMarcFromKohaField( 'biblio.author' ); + my @issn = GetMarcFromKohaField( 'biblioitems.issn' ); + my @lccn = GetMarcFromKohaField( 'biblioitems.lccn' ); return { $isbn[0].$isbn[1] => 'isbn', @@ -295,21 +278,23 @@ sub create_input { my $index_subfield = CreateKey(); # create a specifique key for each subfield - $value =~ s/"/"/g; - # if there is no value provided but a default value in parameters, get it if ( $value eq '' ) { - $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; - my $username=(C4::Context->userenv?C4::Context->userenv->{'surname'}:"superlibrarian"); - $value=~s/user/$username/g; + $value = $tagslib->{$tag}->{$subfield}->{defaultvalue} // q{}; + + # get today date & replace <>, <>, <>, <
> if provided in the default value + my $today_dt = dt_from_string; + my $year = $today_dt->strftime('%Y'); + my $shortyear = $today_dt->strftime('%y'); + my $month = $today_dt->strftime('%m'); + my $day = $today_dt->strftime('%d'); + $value =~ s/<>/$year/g; + $value =~ s/<>/$shortyear/g; + $value =~ s/<>/$month/g; + $value =~ s/<
>/$day/g; + # And <> with surname (?) + my $username=(C4::Context->userenv?C4::Context->userenv->{'surname'}:"superlibrarian"); + $value=~s/<>/$username/g; } my $dbh = C4::Context->dbh; @@ -322,10 +307,10 @@ sub create_input { my %subfield_data = ( tag => $tag, subfield => $id_subfield, - marc_lib => substr( $tagslib->{$tag}->{$subfield}->{lib}, 0, 22 ), - marc_lib_plain => $tagslib->{$tag}->{$subfield}->{lib}, + marc_lib => $tagslib->{$tag}->{$subfield}->{lib}, tag_mandatory => $tagslib->{$tag}->{mandatory}, mandatory => $tagslib->{$tag}->{$subfield}->{mandatory}, + important => $tagslib->{$tag}->{$subfield}->{important}, repeatable => $tagslib->{$tag}->{$subfield}->{repeatable}, kohafield => $tagslib->{$tag}->{$subfield}->{kohafield}, index => $index_tag, @@ -339,13 +324,15 @@ sub create_input { $subfield_data{z3950_mandatory} = $mandatory_z3950->{$tag.$subfield}; } # Subfield is hidden depending of hidden and mandatory flag, and is always - # shown if it contains anything or if its field is mandatory. + # shown if it contains anything or if its field is mandatory or important. my $tdef = $tagslib->{$tag}; $subfield_data{visibility} = "display:none;" if $tdef->{$subfield}->{hidden} % 2 == 1 && $value eq '' && !$tdef->{$subfield}->{mandatory} && - !$tdef->{mandatory}; + !$tdef->{mandatory} && + !$tdef->{$subfield}->{important} && + !$tdef->{important}; # expand all subfields of 773 if there is a host item provided in the input $subfield_data{visibility} ="" if ($tag eq 773 and $cgi->param('hostitemnumber')); @@ -408,6 +395,7 @@ sub create_input { size => 67, maxlength => $subfield_data{maxlength}, javascript => $plugin->javascript, + plugin => $plugin->name, noclick => $plugin->noclick, }; } else { @@ -502,7 +490,7 @@ sub build_tabs { $query .= qq{ LEFT JOIN authorised_values_branches ON ( id = av_id )} if $branch_limit; $query .= " WHERE category = ?"; $query .= " AND ( branchcode = ? OR branchcode IS NULL )" if $branch_limit; - $query .= " GROUP BY lib ORDER BY lib, lib_opac"; + $query .= " GROUP BY authorised_value,lib ORDER BY lib, lib_opac"; my $authorised_values_sth = $dbh->prepare( $query ); # in this array, we will push all the 10 tabs @@ -510,16 +498,19 @@ sub build_tabs { my @BIG_LOOP; my %seen; my @tab_data; # all tags to display - + + my $max_num_tab=-1; + my ( $itemtag, $itemsubfield ) = GetMarcFromKohaField( "items.itemnumber" ); foreach my $used ( @$usedTagsLib ){ + push @tab_data,$used->{tagfield} if not $seen{$used->{tagfield}}; $seen{$used->{tagfield}}++; - } - - my $max_num_tab=-1; - foreach(@$usedTagsLib){ - if($_->{tab} > -1 && $_->{tab} >= $max_num_tab && $_->{tagfield} != '995'){ # FIXME : MARC21 ? - $max_num_tab = $_->{tab}; + + if ( $used->{tab} > -1 + && $used->{tab} >= $max_num_tab + && $used->{tagfield} ne $itemtag ) + { + $max_num_tab = $used->{tab}; } } if($max_num_tab >= 9){ @@ -529,7 +520,7 @@ sub build_tabs { for ( my $tabloop = 0 ; $tabloop <= $max_num_tab ; $tabloop++ ) { my @loop_data = (); #innerloop in the template. my $i = 0; - foreach my $tag (@tab_data) { + foreach my $tag (sort @tab_data) { $i++; next if ! $tag; my ($indicator1, $indicator2); @@ -577,7 +568,7 @@ sub build_tabs { my $subfield = $subfields[$subfieldcount][0]; my $value = $subfields[$subfieldcount][1]; next if ( length $subfield != 1 ); - next if ( $tagslib->{$tag}->{$subfield}->{tab} ne $tabloop ); + next if ( !defined $tagslib->{$tag}->{$subfield} || $tagslib->{$tag}->{$subfield}->{tab} ne $tabloop ); push( @subfields_data, &create_input( @@ -625,6 +616,7 @@ sub build_tabs { tag_lib => $tagslib->{$tag}->{lib}, repeatable => $tagslib->{$tag}->{repeatable}, mandatory => $tagslib->{$tag}->{mandatory}, + important => $tagslib->{$tag}->{important}, subfield_loop => \@subfields_data, fixedfield => $tag < 10?1:0, random => CreateKey, @@ -671,8 +663,9 @@ sub build_tabs { tag_lib => $tagslib->{$tag}->{lib}, repeatable => $tagslib->{$tag}->{repeatable}, mandatory => $tagslib->{$tag}->{mandatory}, - indicator1 => $indicator1, - indicator2 => $indicator2, + important => $tagslib->{$tag}->{important}, + indicator1 => ( $indicator1 || $tagslib->{$tag}->{ind1_defaultvalue} ), #if not set, try to load the default value + indicator2 => ( $indicator2 || $tagslib->{$tag}->{ind2_defaultvalue} ), #use short-circuit operator for efficiency subfield_loop => \@subfields_data, tagfirstsubfield => $subfields_data[0], fixedfield => $tag < 10?1:0, @@ -696,13 +689,13 @@ sub build_tabs { # ======================== # MAIN #========================= -my $input = new CGI; +my $input = CGI->new; my $error = $input->param('error'); my $biblionumber = $input->param('biblionumber'); # if biblionumber exists, it's a modif, not a new biblio. my $parentbiblio = $input->param('parentbiblionumber'); my $breedingid = $input->param('breedingid'); my $z3950 = $input->param('z3950'); -my $op = $input->param('op'); +my $op = $input->param('op') // q{}; my $mode = $input->param('mode'); my $frameworkcode = $input->param('frameworkcode'); my $redirect = $input->param('redirect'); @@ -719,9 +712,9 @@ my $fa_duedatespec = $input->param('duedatespec'); my $userflags = 'edit_catalogue'; -my $changed_framework = $input->param('changed_framework'); +my $changed_framework = $input->param('changed_framework') // q{}; $frameworkcode = &GetFrameworkCode($biblionumber) - if ( $biblionumber and not($frameworkcode) and $op ne 'addbiblio' ); + if ( $biblionumber and not( defined $frameworkcode) and $op ne 'addbiblio' ); if ($frameworkcode eq 'FA'){ $userflags = 'fast_cataloging'; @@ -733,11 +726,18 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user( template_name => "cataloguing/addbiblio.tt", query => $input, type => "intranet", - authnotrequired => 0, flagsrequired => { editcatalogue => $userflags }, } ); +if ($biblionumber){ + my $does_bib_exist = Koha::Biblios->find($biblionumber); + if (!defined $does_bib_exist){ + $biblionumber = undef; + $template->param( bib_doesnt_exist => 1 ); + } +} + if ($frameworkcode eq 'FA'){ # We need to grab and set some variables in the template for use on the additems screen $template->param( @@ -747,24 +747,23 @@ if ($frameworkcode eq 'FA'){ 'stickyduedate' => $fa_stickyduedate, 'duedatespec' => $fa_duedatespec, ); +} elsif ( $op ne "delete" && + C4::Context->preference('EnableAdvancedCatalogingEditor') && + C4::Auth::haspermission(C4::Context->userenv->{id},{'editcatalogue'=>'advanced_editor'}) && + $input->cookie( 'catalogue_editor_' . $loggedinuser ) eq 'advanced' && + !$breedingid ) { + # Only use the advanced editor for non-fast-cataloging. + # breedingid is not handled because those would only come off a Z39.50 + # search initiated by the basic editor. + print $input->redirect( '/cgi-bin/koha/cataloguing/editor.pl' . ( $biblionumber ? ( ($op eq 'duplicate'?'#duplicate/':'#catalog/') . $biblionumber ) : '' ) ); + exit; } -# Getting the list of all frameworks -# get framework list -my $frameworks = getframeworks; -my @frameworkcodeloop; -foreach my $thisframeworkcode ( keys %$frameworks ) { - my %row = ( - value => $thisframeworkcode, - frameworktext => $frameworks->{$thisframeworkcode}->{'frameworktext'}, - ); - if ($frameworkcode eq $thisframeworkcode){ - $row{'selected'} = 1; - } - push @frameworkcodeloop, \%row; -} -$template->param( frameworkcodeloop => \@frameworkcodeloop, - breedingid => $breedingid ); +my $frameworks = Koha::BiblioFrameworks->search({}, { order_by => ['frameworktext'] }); +$template->param( + frameworks => $frameworks, + breedingid => $breedingid, +); # ++ Global $tagslib = &GetMarcStructure( 1, $frameworkcode ); @@ -779,12 +778,11 @@ my ( $biblionumbertagsubfield, $biblioitemnumtagfield, $biblioitemnumtagsubfield, - $bibitem, $biblioitemnumber ); if (($biblionumber) && !($breedingid)){ - $record = GetMarcBiblio($biblionumber); + $record = GetMarcBiblio({ biblionumber => $biblionumber }); } if ($breedingid) { ( $record, $encoding ) = MARCfindbreeding( $breedingid ) ; @@ -812,7 +810,7 @@ if ($parentbiblio) { } $is_a_modif = 0; - + if ($biblionumber) { $is_a_modif = 1; my $title = C4::Context->preference('marcflavour') eq "UNIMARC" ? $record->subfield('200', 'a') : $record->title; @@ -820,10 +818,10 @@ if ($biblionumber) { # if it's a modif, retrieve bibli and biblioitem numbers for the future modification of old-DB. ( $biblionumbertagfield, $biblionumbertagsubfield ) = - &GetMarcFromKohaField( "biblio.biblionumber", $frameworkcode ); + &GetMarcFromKohaField( "biblio.biblionumber" ); ( $biblioitemnumtagfield, $biblioitemnumtagsubfield ) = - &GetMarcFromKohaField( "biblioitems.biblioitemnumber", $frameworkcode ); - + &GetMarcFromKohaField( "biblioitems.biblioitemnumber" ); + # search biblioitems value my $sth = $dbh->prepare("select biblioitemnumber from biblioitems where biblionumber=?"); $sth->execute($biblionumber); @@ -837,8 +835,8 @@ if ( $op eq "addbiblio" ) { biblionumberdata => $biblionumber, ); # getting html input - my @params = $input->param(); - $record = TransformHtmlToMarc( $input ); + my @params = $input->multi_param(); + $record = TransformHtmlToMarc( $input, 1 ); # check for a duplicate my ( $duplicatebiblionumber, $duplicatetitle ); if ( !$is_a_modif ) { @@ -847,13 +845,8 @@ if ( $op eq "addbiblio" ) { my $confirm_not_duplicate = $input->param('confirm_not_duplicate'); # it is not a duplicate (determined either by Koha itself or by user checking it's not a duplicate) if ( !$duplicatebiblionumber or $confirm_not_duplicate ) { - my $oldbibnum; my $oldbibitemnum; - if (C4::Context->preference("BiblioAddsAuthorities")){ - BiblioAutoLink( $record, $frameworkcode ); - } if ( $is_a_modif ) { - ModBiblioframework( $biblionumber, $frameworkcode ); ModBiblio( $record, $biblionumber, $frameworkcode ); } else { @@ -937,7 +930,7 @@ elsif ( $op eq "delete" ) { exit; } - print $input->redirect('/cgi-bin/koha/catalogue/search.pl'); + print $input->redirect('/cgi-bin/koha/catalogue/search.pl' . ($searchid ? "?searchid=$searchid" : "")); exit; } else { @@ -953,7 +946,7 @@ elsif ( $op eq "delete" ) { } if($changed_framework eq "changed"){ - $record = TransformHtmlToMarc( $input ); + $record = TransformHtmlToMarc( $input, 1 ); } elsif( $record ne -1 ) { #FIXME: it's kind of silly to go from MARC::Record to MARC::File::XML and then back again just to fix the encoding @@ -987,7 +980,7 @@ $template->param( frameworkcode => $frameworkcode, itemtype => $frameworkcode, borrowernumber => $loggedinuser, - tab => $input->param('tab') + tab => scalar $input->param('tab') ); $template->{'VARS'}->{'searchid'} = $searchid;