Bug 26265: (QA follow-up) Remove g option from regex, add few dirs
[koha-equinox.git] / cataloguing / addbiblio.pl
index 013c312..909b9e9 100755 (executable)
@@ -19,8 +19,8 @@
 # You should have received a copy of the GNU General Public License
 # along with Koha; if not, see <http://www.gnu.org/licenses>.
 
-use strict;
-#use warnings; FIXME - Bug 2505
+use Modern::Perl;
+
 use CGI q(-utf8);
 use C4::Output;
 use C4::Auth;
@@ -72,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) ) {
@@ -105,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;
@@ -116,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) {
@@ -140,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) );
@@ -176,17 +170,16 @@ 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" ) {
-        push @authorised_values, ""
-          unless ( $tagslib->{$tag}->{$subfield}->{mandatory}
-            && ( $value || $tagslib->{$tag}->{$subfield}->{defaultvalue} ) );
+    elsif ( $category eq "itemtypes" ) {
+        push @authorised_values, "";
 
         my $itemtype;
         my $itemtypes = Koha::ItemTypes->search_with_localization;
@@ -196,9 +189,8 @@ sub build_authorized_values_list {
         }
         $value = $itemtype unless ($value);
     }
-    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();
 
@@ -220,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;
@@ -230,6 +220,7 @@ sub build_authorized_values_list {
         }
     }
     $authorised_values_sth->finish;
+
     return {
         type     => 'select',
         id       => "tag_".$tag."_subfield_".$subfield."_".$index_tag."_".$index_subfield,
@@ -237,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 ) ),
     };
 
 }
@@ -253,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',
@@ -286,18 +278,18 @@ sub create_input {
     
     my $index_subfield = CreateKey(); # create a specifique key for each subfield
 
-    $value =~ s/"/&quot;/g;
-
     # if there is no value provided but a default value in parameters, get it
     if ( $value eq '' ) {
-        $value = $tagslib->{$tag}->{$subfield}->{defaultvalue};
+        $value = $tagslib->{$tag}->{$subfield}->{defaultvalue} // q{};
 
-        # get today date & replace <<YYYY>>, <<MM>>, <<DD>> if provided in the default value
+        # get today date & replace <<YYYY>>, <<YY>>, <<MM>>, <<DD>> 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/<<YYYY>>/$year/g;
+        $value =~ s/<<YY>>/$shortyear/g;
         $value =~ s/<<MM>>/$month/g;
         $value =~ s/<<DD>>/$day/g;
         # And <<USER>> with surname (?)
@@ -318,6 +310,7 @@ sub create_input {
         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,
@@ -331,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'));
 
@@ -494,7 +489,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
@@ -502,16 +497,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){
@@ -521,7 +519,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);
@@ -569,7 +567,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(
@@ -617,6 +615,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,
@@ -663,8 +662,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,
@@ -694,7 +694,7 @@ my $biblionumber  = $input->param('biblionumber'); # if biblionumber exists, it'
 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');
@@ -711,7 +711,7 @@ 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( defined $frameworkcode) and $op ne 'addbiblio' );
 
@@ -730,6 +730,14 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
     }
 );
 
+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(
@@ -739,11 +747,15 @@ if ($frameworkcode eq 'FA'){
         'stickyduedate'      => $fa_stickyduedate,
         'duedatespec'        => $fa_duedatespec,
     );
-} elsif ( $op ne "delete" && C4::Context->preference('EnableAdvancedCatalogingEditor') && $input->cookie( 'catalogue_editor_' . $loggedinuser ) eq 'advanced' && !$breedingid ) {
+} 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 ? ( '#catalog/' . $biblionumber ) : '' ) );
+    print $input->redirect( '/cgi-bin/koha/cataloguing/editor.pl' . ( $biblionumber ? ( ($op eq 'duplicate'?'#duplicate/':'#catalog/') . $biblionumber ) : '' ) );
     exit;
 }
 
@@ -770,7 +782,7 @@ my (
 );
 
 if (($biblionumber) && !($breedingid)){
-       $record = GetMarcBiblio($biblionumber);
+    $record = GetMarcBiblio({ biblionumber => $biblionumber });
 }
 if ($breedingid) {
     ( $record, $encoding ) = MARCfindbreeding( $breedingid ) ;
@@ -798,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;
@@ -806,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);
@@ -834,9 +846,6 @@ if ( $op eq "addbiblio" ) {
     # 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 $oldbibitemnum;
-        if (C4::Context->preference("BiblioAddsAuthorities")){
-            BiblioAutoLink( $record, $frameworkcode );
-        } 
         if ( $is_a_modif ) {
             ModBiblio( $record, $biblionumber, $frameworkcode );
         }
@@ -921,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 {