X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=cataloguing%2Faddbiblio.pl;h=815e2a80d4d63ece9144e513cd239abb66034c00;hb=f41f272ff087d65ed11d760e6c7c58818c3a24d4;hp=4bbf81df9a80ea58e9255b2c5093984b157002af;hpb=0629d4082fec2474a25c18fca4f134d4b75c3ad3;p=koha-ffzg.git diff --git a/cataloguing/addbiblio.pl b/cataloguing/addbiblio.pl index 4bbf81df9a..815e2a80d4 100755 --- a/cataloguing/addbiblio.pl +++ b/cataloguing/addbiblio.pl @@ -21,31 +21,42 @@ use Modern::Perl; -use CGI q(-utf8); -use C4::Output; -use C4::Auth; -use C4::Biblio; -use C4::Search; -use C4::AuthoritiesMarc; +use CGI; +use C4::Output qw( output_html_with_http_headers ); +use C4::Auth qw( get_template_and_user haspermission ); +use C4::Biblio qw( + AddBiblio + DelBiblio + GetFrameworkCode + GetMarcFromKohaField + GetMarcStructure + GetUsedMarcStructure + ModBiblio + prepare_host_field + PrepHostMarcField + TransformHtmlToMarc + ApplyMarcOverlayRules +); +use C4::Search qw( FindDuplicate enabled_staff_search_views ); +use C4::Auth qw( get_template_and_user haspermission ); use C4::Context; use MARC::Record; -use C4::Log; -use C4::Koha; -use C4::ClassSource; -use C4::ImportBatch; -use C4::Charset; +use C4::ClassSource qw( GetClassSources ); +use C4::ImportBatch qw( GetImportRecordMarc ); +use C4::Charset qw( SetMarcUnicodeFlag ); use Koha::BiblioFrameworks; -use Koha::DateUtils; +use Koha::DateUtils qw( dt_from_string ); +use Koha::Biblios; use Koha::ItemTypes; use Koha::Libraries; use Koha::BiblioFrameworks; +use Koha::Patrons; -use Date::Calc qw(Today); use MARC::File::USMARC; use MARC::File::XML; -use URI::Escape; +use URI::Escape qw( uri_escape_utf8 ); if ( C4::Context->preference('marcflavour') eq 'UNIMARC' ) { MARC::File::XML->default_record_format('UNIMARC'); @@ -72,6 +83,10 @@ sub MARCfindbreeding { # remove the - in isbn, koha store isbn without any - if ($marc) { my $record = MARC::Record->new_from_usmarc($marc); + if(C4::Context->preference('autoControlNumber') eq 'biblionumber'){ + my @control_num = $record->field('001'); + $record->delete_fields(@control_num); + } my ($isbnfield,$isbnsubfield) = GetMarcFromKohaField( 'biblioitems.isbn' ); if ( $record->field($isbnfield) ) { foreach my $field ( $record->field($isbnfield) ) { @@ -170,14 +185,15 @@ sub build_authorized_values_list { # builds list, depending on authorised value... #---- branch - if ( $tagslib->{$tag}->{$subfield}->{'authorised_value'} eq "branches" ) { + 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; } } - elsif ( $tagslib->{$tag}->{$subfield}->{authorised_value} eq "itemtypes" ) { + elsif ( $category eq "itemtypes" ) { push @authorised_values, ""; my $itemtype; @@ -188,7 +204,7 @@ sub build_authorized_values_list { } $value = $itemtype unless ($value); } - elsif ( $tagslib->{$tag}->{$subfield}->{authorised_value} eq "cn_source" ) { + elsif ( $category eq "cn_source" ) { push @authorised_values, ""; my $class_sources = GetClassSources(); @@ -219,6 +235,7 @@ sub build_authorized_values_list { } } $authorised_values_sth->finish; + return { type => 'select', id => "tag_".$tag."_subfield_".$subfield."_".$index_tag."_".$index_subfield, @@ -226,6 +243,7 @@ sub build_authorized_values_list { default => $value, values => \@authorised_values, labels => \%authorised_lib, + ( ( grep { $_ eq $category } ( qw(branches itemtypes cn_source) ) ) ? () : ( category => $category ) ), }; } @@ -271,12 +289,23 @@ sub GetMandatoryFieldZ3950 { =cut sub create_input { - my ( $tag, $subfield, $value, $index_tag, $tabloop, $rec, $authorised_values_sth,$cgi ) = @_; - + my ( $tag, $subfield, $value, $index_tag, $rec, $authorised_values_sth,$cgi ) = @_; + my $index_subfield = CreateKey(); # create a specifique key for each subfield - # if there is no value provided but a default value in parameters, get it - if ( $value eq '' ) { + # Apply optional framework default value when it is a new record, + # or when editing as new (duplicating a record), + # or when changing a record's framework, + # or when importing a record, + # based on the ApplyFrameworkDefaults setting. + # Substitute date parts, user name + my $applydefaults = C4::Context->preference('ApplyFrameworkDefaults'); + if ( $value eq '' && ( + ( $applydefaults =~ /new/ && !$cgi->param('biblionumber') ) || + ( $applydefaults =~ /duplicate/ && $cgi->param('op') eq 'duplicate' ) || + ( $applydefaults =~ /changed/ && $cgi->param('changed_framework') ) || + ( $applydefaults =~ /imported/ && $cgi->param('breedingid') ) + ) ) { $value = $tagslib->{$tag}->{$subfield}->{defaultvalue} // q{}; # get today date & replace <>, <>, <>, <
> if provided in the default value @@ -292,8 +321,8 @@ sub create_input { # And <> with surname (?) my $username=(C4::Context->userenv?C4::Context->userenv->{'surname'}:"superlibrarian"); $value=~s/<>/$username/g; - } + my $dbh = C4::Context->dbh; # map '@' as "subfield" label for fixed fields @@ -340,13 +369,14 @@ sub create_input { build_authorized_values_list( $tag, $subfield, $value, $dbh, $authorised_values_sth,$index_tag,$index_subfield ); - # it's a subfield $9 linking to an authority record - see bug 2206 + # it's a subfield $9 linking to an authority record - see bug 2206 and 28022 } elsif ($subfield eq "9" and exists($tagslib->{$tag}->{'a'}->{authtypecode}) and defined($tagslib->{$tag}->{'a'}->{authtypecode}) and - $tagslib->{$tag}->{'a'}->{authtypecode} ne '') { - + $tagslib->{$tag}->{'a'}->{authtypecode} ne '' and + $tagslib->{$tag}->{'a'}->{hidden} > -4 and + $tagslib->{$tag}->{'a'}->{hidden} < 5) { $subfield_data{marc_value} = { type => 'text', id => $subfield_data{id}, @@ -361,7 +391,7 @@ sub create_input { } elsif ( $tagslib->{$tag}->{$subfield}->{authtypecode} ) { # when authorities auto-creation is allowed, do not set readonly - my $is_readonly = !C4::Context->preference("BiblioAddsAuthorities"); + my $is_readonly = C4::Context->preference("RequireChoosingExistingAuthority"); $subfield_data{marc_value} = { type => 'text', @@ -381,7 +411,7 @@ sub create_input { name => $tagslib->{$tag}->{$subfield}->{'value_builder'}, }); my $pars= { dbh => $dbh, record => $rec, tagslib => $tagslib, - id => $subfield_data{id}, tabloop => $tabloop }; + id => $subfield_data{id} }; $plugin->build( $pars ); if( !$plugin->errstr ) { $subfield_data{marc_value} = { @@ -392,6 +422,7 @@ sub create_input { size => 67, maxlength => $subfield_data{maxlength}, javascript => $plugin->javascript, + plugin => $plugin->name, noclick => $plugin->noclick, }; } else { @@ -553,7 +584,7 @@ sub build_tabs { push( @subfields_data, &create_input( - $tag, $subfield, $value, $index_tag, $tabloop, $record, + $tag, $subfield, $value, $index_tag, $record, $authorised_values_sth,$input ) ); @@ -568,7 +599,7 @@ sub build_tabs { push( @subfields_data, &create_input( - $tag, $subfield, $value, $index_tag, $tabloop, + $tag, $subfield, $value, $index_tag, $record, $authorised_values_sth,$input ) ); @@ -587,16 +618,18 @@ sub build_tabs { and not ( $subfield eq "9" and exists($tagslib->{$tag}->{'a'}->{authtypecode}) and defined($tagslib->{$tag}->{'a'}->{authtypecode}) and - $tagslib->{$tag}->{'a'}->{authtypecode} ne "" + $tagslib->{$tag}->{'a'}->{authtypecode} ne "" and + $tagslib->{$tag}->{'a'}->{hidden} > -4 and + $tagslib->{$tag}->{'a'}->{hidden} < 5 ) ; #check for visibility flag # if subfield is $9 in a field whose $a is authority-controlled, - # always include in the form regardless of the hidden setting - bug 2206 + # always include in the form regardless of the hidden setting - bug 2206 and 28022 next if ( defined( $field->subfield($subfield) ) ); push( @subfields_data, &create_input( - $tag, $subfield, '', $index_tag, $tabloop, $record, + $tag, $subfield, '', $index_tag, $record, $authorised_values_sth,$input ) ); @@ -629,25 +662,30 @@ sub build_tabs { } else { my @subfields_data; - foreach my $subfield ( sort( keys %{ $tagslib->{$tag} } ) ) { - next if ( length $subfield != 1 ); + foreach my $subfield ( + sort { $a->{display_order} <=> $b->{display_order} || $a->{subfield} cmp $b->{subfield} } + grep { ref($_) && %$_ } # Not a subfield (values for "important", "lib", "mandatory", etc.) or empty + values %{ $tagslib->{$tag} } ) + { next - if ( ( $tagslib->{$tag}->{$subfield}->{hidden} <= -4 ) - or ( $tagslib->{$tag}->{$subfield}->{hidden} >= 5 ) ) - and not ( $subfield eq "9" and + if ( ( $subfield->{hidden} <= -4 ) + or ( $subfield->{hidden} >= 5 ) ) + and not ( $subfield->{subfield} eq "9" and exists($tagslib->{$tag}->{'a'}->{authtypecode}) and defined($tagslib->{$tag}->{'a'}->{authtypecode}) and - $tagslib->{$tag}->{'a'}->{authtypecode} ne "" + $tagslib->{$tag}->{'a'}->{authtypecode} ne "" and + $tagslib->{$tag}->{'a'}->{hidden} > -4 and + $tagslib->{$tag}->{'a'}->{hidden} < 5 ) ; #check for visibility flag # if subfield is $9 in a field whose $a is authority-controlled, - # always include in the form regardless of the hidden setting - bug 2206 + # always include in the form regardless of the hidden setting - bug 2206 and 28022 next - if ( $tagslib->{$tag}->{$subfield}->{tab} ne $tabloop ); + if ( $subfield->{tab} ne $tabloop ); push( @subfields_data, &create_input( - $tag, $subfield, '', $index_tag, $tabloop, $record, + $tag, $subfield->{subfield}, '', $index_tag, $record, $authorised_values_sth,$input ) ); @@ -685,17 +723,17 @@ 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') // q{}; -my $mode = $input->param('mode'); +my $mode = $input->param('mode') // q{}; my $frameworkcode = $input->param('frameworkcode'); my $redirect = $input->param('redirect'); -my $searchid = $input->param('searchid'); +my $searchid = $input->param('searchid') // ""; my $dbh = C4::Context->dbh; my $hostbiblionumber = $input->param('hostbiblionumber'); my $hostitemnumber = $input->param('hostitemnumber'); @@ -722,14 +760,14 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user( template_name => "cataloguing/addbiblio.tt", query => $input, type => "intranet", - authnotrequired => 0, flagsrequired => { editcatalogue => $userflags }, } ); +my $biblio; if ($biblionumber){ - my $does_bib_exist = Koha::Biblios->find($biblionumber); - if (!defined $does_bib_exist){ + $biblio = Koha::Biblios->find($biblionumber); + unless ( $biblio ) { $biblionumber = undef; $template->param( bib_doesnt_exist => 1 ); } @@ -778,13 +816,17 @@ my ( $biblioitemnumber ); -if (($biblionumber) && !($breedingid)){ - $record = GetMarcBiblio({ biblionumber => $biblionumber }); +if ( $biblio && !$breedingid ) { + $record = $biblio->metadata->record; } if ($breedingid) { ( $record, $encoding ) = MARCfindbreeding( $breedingid ) ; } - +if ( $record && $op eq 'duplicate' && + C4::Context->preference('autoControlNumber') eq 'biblionumber' ){ + my @control_num = $record->field('001'); + $record->delete_fields(@control_num); +} #populate hostfield if hostbiblionumber is available if ($hostbiblionumber) { my $marcflavour = C4::Context->preference("marcflavour"); @@ -823,6 +865,20 @@ if ($biblionumber) { my $sth = $dbh->prepare("select biblioitemnumber from biblioitems where biblionumber=?"); $sth->execute($biblionumber); ($biblioitemnumber) = $sth->fetchrow; + if (C4::Context->preference('MARCOverlayRules')) { + my $member = Koha::Patrons->find($loggedinuser); + $record = ApplyMarcOverlayRules( + { + biblionumber => $biblionumber, + record => $record, + overlay_context => { + source => $z3950 ? 'z3950' : 'intranet', + categorycode => $member->categorycode, + userid => $member->userid + } + } + ); + } } #------------------------------------------------------------------------------------- @@ -844,7 +900,19 @@ if ( $op eq "addbiblio" ) { if ( !$duplicatebiblionumber or $confirm_not_duplicate ) { my $oldbibitemnum; if ( $is_a_modif ) { - ModBiblio( $record, $biblionumber, $frameworkcode ); + my $member = Koha::Patrons->find($loggedinuser); + ModBiblio( + $record, + $biblionumber, + $frameworkcode, + { + overlay_context => { + source => $z3950 ? 'z3950' : 'intranet', + categorycode => $member->categorycode, + userid => $member->userid + } + } + ); } else { ( $biblionumber, $oldbibitemnum ) = AddBiblio( $record, $frameworkcode ); @@ -927,7 +995,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 { @@ -937,6 +1005,7 @@ elsif ( $op eq "delete" ) { $template->param( biblionumberdata => $biblionumber, op => $op, + z3950 => $z3950 ); if ( $op eq "duplicate" ) { $biblionumber = "";