Bug 13487: Fix pagination for the item search
[koha-ffzg.git] / cataloguing / additem.pl
index 7110f7f..047b733 100755 (executable)
@@ -36,7 +36,7 @@ use List::MoreUtils qw/any/;
 use C4::Search;
 use Storable qw(thaw freeze);
 use URI::Escape;
-
+use C4::Members;
 
 use MARC::File::XML;
 use URI::Escape;
@@ -104,9 +104,10 @@ sub _increment_barcode {
 
 
 sub generate_subfield_form {
-        my ($tag, $subfieldtag, $value, $tagslib,$subfieldlib, $branches, $today_iso, $biblionumber, $temp, $loop_data, $i) = @_;
+        my ($tag, $subfieldtag, $value, $tagslib,$subfieldlib, $branches, $today_iso, $biblionumber, $temp, $loop_data, $i, $restrictededition) = @_;
   
-  my $frameworkcode = &GetFrameworkCode($biblionumber);
+        my $frameworkcode = &GetFrameworkCode($biblionumber);
+
         my %subfield_data;
         my $dbh = C4::Context->dbh;
         
@@ -156,6 +157,24 @@ sub generate_subfield_form {
        }
         my $attributes_no_value = qq(id="$subfield_data{id}" name="field_value" class="input_marceditor" size="50" maxlength="$subfield_data{maxlength}" );
         my $attributes_no_value_textarea = qq(id="$subfield_data{id}" name="field_value" class="input_marceditor" rows="5" cols="64" );
+
+        # Getting list of subfields to keep when restricted editing is enabled
+        my $subfieldsToAllowForRestrictedEditing = C4::Context->preference('SubfieldsToAllowForRestrictedEditing');
+        my $allowAllSubfields = (
+            not defined $subfieldsToAllowForRestrictedEditing
+              or $subfieldsToAllowForRestrictedEditing == q||
+        ) ? 1 : 0;
+        my @subfieldsToAllow = split(/ /, $subfieldsToAllowForRestrictedEditing);
+
+        # If we're on restricted editing, and our field is not in the list of subfields to allow,
+        # then it is read-only
+        $attributes_no_value .= 'readonly="readonly" '
+            if (
+                not $allowAllSubfields
+                and $restrictededition
+                and !grep { $tag . '$' . $subfieldtag  eq $_ } @subfieldsToAllow
+            );
+
         my $attributes          = qq($attributes_no_value value="$value" );
         
         if ( $subfieldlib->{authorised_value} ) {
@@ -216,7 +235,7 @@ sub generate_subfield_form {
                 $subfield_data{marc_value} = qq(<input type="hidden" $attributes /> $authorised_lib{$value});
             }
             else {
-                $subfield_data{marc_value} =CGI::scrolling_list(      # FIXME: factor out scrolling_list
+                my @scrparam = (
                     -name     => "field_value",
                     -values   => \@authorised_values,
                     -default  => $value,
@@ -227,6 +246,16 @@ sub generate_subfield_form {
                     -id       => "tag_".$tag."_subfield_".$subfieldtag."_".$index_subfield,
                     -class    => "input_marceditor",
                 );
+
+                # If we're on restricted editing, and our field is not in the list of subfields to allow,
+                # then it is read-only
+                push @scrparam, (-readonly => "readonly"), (-disabled => "disabled")
+                    if (
+                        not $allowAllSubfields
+                        and $restrictededition
+                        and !grep { $tag . '$' . $subfieldtag  eq $_ } @subfieldsToAllow
+                    );
+                $subfield_data{marc_value} =CGI::scrolling_list(@scrparam);
             }
 
         }
@@ -345,6 +374,14 @@ my ($template, $loggedinuser, $cookie)
                  });
 
 
+# Does the user have a restricted item editing permission?
+my $uid = $loggedinuser ? GetMember( borrowernumber => $loggedinuser )->{userid} : undef;
+my $restrictededition = $uid ? haspermission($uid,  {'editcatalogue' => 'edit_items_restricted'}) : undef;
+# In case user is a superlibrarian, editing is not restricted
+$restrictededition = 0 if ($restrictededition != 0 &&  C4::Context->IsSuperLibrarian());
+# In case user has fast cataloging permission (and we're in fast cataloging), editing is not restricted
+$restrictededition = 0 if ($restrictededition != 0 && $frameworkcode eq 'FA' && haspermission($uid, {'editcatalogue' => 'fast_cataloging'}));
+
 my $today_iso = C4::Dates->today('iso');
 my $tagslib = &GetMarcStructure(1,$frameworkcode);
 my $record = GetMarcBiblio($biblionumber);
@@ -777,8 +814,7 @@ if($itemrecord){
             next if subfield_is_koha_internal_p($subfieldtag);
             next if ($tagslib->{$tag}->{$subfieldtag}->{'tab'} ne "10");
 
-            my $subfield_data = generate_subfield_form($tag, $subfieldtag, $value, $tagslib, $subfieldlib, $branches, $today_iso, $biblionumber, $temp, \@loop_data, $i);        
-
+            my $subfield_data = generate_subfield_form($tag, $subfieldtag, $value, $tagslib, $subfieldlib, $branches, $today_iso, $biblionumber, $temp, \@loop_data, $i, $restrictededition);
             push @fields, "$tag$subfieldtag";
             push (@loop_data, $subfield_data);
             $i++;
@@ -802,10 +838,10 @@ foreach my $tag ( keys %{$tagslib}){
         my @values = (undef);
         @values = $itemrecord->field($tag)->subfield($subtag) if ($itemrecord && defined($itemrecord->field($tag)) && defined($itemrecord->field($tag)->subfield($subtag)));
         for my $value (@values){
-            my $subfield_data = generate_subfield_form($tag, $subtag, $value, $tagslib, $tagslib->{$tag}->{$subtag}, $branches, $today_iso, $biblionumber, $temp, \@loop_data, $i); 
+            my $subfield_data = generate_subfield_form($tag, $subtag, $value, $tagslib, $tagslib->{$tag}->{$subtag}, $branches, $today_iso, $biblionumber, $temp, \@loop_data, $i, $restrictededition);
             push (@loop_data, $subfield_data);
             $i++;
-        } 
+        }
   }
 }
 @loop_data = sort {$a->{subfield} cmp $b->{subfield} } @loop_data;