Bug 7364: Possible to get to FA item add without current branch being defined.
[koha.git] / cataloguing / additem.pl
index c5dd7d9..d22558f 100755 (executable)
@@ -1,8 +1,8 @@
 #!/usr/bin/perl
 
-
 # Copyright 2000-2002 Katipo Communications
 # Copyright 2004-2010 BibLibre
+# Parts Copyright Catalyst IT 2011
 #
 # This file is part of Koha.
 #
@@ -34,6 +34,7 @@ use C4::Dates;
 use List::MoreUtils qw/any/;
 
 use MARC::File::XML;
+use URI::Escape;
 
 my $dbh = C4::Context->dbh;
 
@@ -65,12 +66,16 @@ sub get_item_from_barcode {
 
 sub set_item_default_location {
     my $itemnumber = shift;
+    my $item = GetItem( $itemnumber );
     if ( C4::Context->preference('NewItemsDefaultLocation') ) {
-        my $item = GetItem( $itemnumber );
         $item->{'permanent_location'} = $item->{'location'};
         $item->{'location'} = C4::Context->preference('NewItemsDefaultLocation');
         ModItem( $item, undef, $itemnumber);
     }
+    else {
+      $item->{'permanent_location'} = $item->{'location'} if !defined($item->{'permanent_location'});
+      ModItem( $item, undef, $itemnumber);
+    }
 }
 
 # NOTE: This code is subject to change in the future with the implemenation of ajax based autobarcode code
@@ -95,7 +100,8 @@ sub _increment_barcode {
 
 sub generate_subfield_form {
         my ($tag, $subfieldtag, $value, $tagslib,$subfieldlib, $branches, $today_iso, $biblionumber, $temp, $loop_data, $i) = @_;
-        
+  
+  my $frameworkcode = &GetFrameworkCode($biblionumber);
         my %subfield_data;
         my $dbh = C4::Context->dbh;        
         my $authorised_values_sth = $dbh->prepare("SELECT authorised_value,lib FROM authorised_values WHERE category=? ORDER BY lib");
@@ -139,6 +145,10 @@ sub generate_subfield_form {
             }
         }
         
+        if ($frameworkcode eq 'FA' && $subfieldlib->{kohafield} eq 'items.barcode'){
+           my $input = new CGI;
+           $value = $input->param('barcode');
+       }
         my $attributes_no_value = qq(tabindex="1" id="$subfield_data{id}" name="field_value" class="input_marceditor" size="67" maxlength="255" );
         my $attributes          = qq($attributes_no_value value="$value" );
         
@@ -150,7 +160,7 @@ sub generate_subfield_form {
                 foreach my $thisbranch (@$branches) {
                     push @authorised_values, $thisbranch->{value};
                     $authorised_lib{$thisbranch->{value}} = $thisbranch->{branchname};
-                    $value = $thisbranch->{value} if $thisbranch->{selected};
+                    $value = $thisbranch->{value} if $thisbranch->{selected} && !$value;
                 }
             }
             elsif ( $subfieldlib->{authorised_value} eq "itemtypes" ) {
@@ -196,28 +206,33 @@ sub generate_subfield_form {
                   }
             }
 
-            $subfield_data{marc_value} =CGI::scrolling_list(      # FIXME: factor out 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_".$subfieldtag."_".$index_subfield,
-                  -class    => "input_marceditor",
-            );
+            if ($subfieldlib->{'hidden'}) {
+                $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
+                    -name     => "field_value",
+                    -values   => \@authorised_values,
+                    -default  => $value,
+                    -labels   => \%authorised_lib,
+                    -override => 1,
+                    -size     => 1,
+                    -multiple => 0,
+                    -tabindex => 1,
+                    -id       => "tag_".$tag."_subfield_".$subfieldtag."_".$index_subfield,
+                    -class    => "input_marceditor",
+                );
+            }
 
-            # it's a thesaurus / authority field
         }
+            # it's a thesaurus / authority field
         elsif ( $subfieldlib->{authtypecode} ) {
                 $subfield_data{marc_value} = "<input type=\"text\" $attributes />
                     <a href=\"#\" class=\"buttonDot\"
                         onclick=\"Dopop('/cgi-bin/koha/authorities/auth_finder.pl?authtypecode=".$subfieldlib->{authtypecode}."&index=$subfield_data{id}','$subfield_data{id}'); return false;\" title=\"Tag Editor\">...</a>
             ";
-            # it's a plugin field
         }
+            # it's a plugin field
         elsif ( $subfieldlib->{value_builder} ) {
                 # opening plugin
                 my $plugin = C4::Context->intranetdir . "/cataloguing/value_builder/" . $subfieldlib->{'value_builder'};
@@ -262,11 +277,12 @@ sub generate_subfield_form {
 
 
 my $input        = new CGI;
-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 $hostitemnumber = $input->param('hostitemnumber');
+my $marcflavour  = C4::Context->preference("marcflavour");
 
 my $frameworkcode = &GetFrameworkCode($biblionumber);
 
@@ -281,7 +297,7 @@ if (not defined $userflags) {
 }
 
 my ($template, $loggedinuser, $cookie)
-    = get_template_and_user({template_name => "cataloguing/additem.tmpl",
+    = get_template_and_user({template_name => "cataloguing/additem.tt",
                  query => $input,
                  type => "intranet",
                  authnotrequired => 0,
@@ -365,7 +381,8 @@ if ($op eq "additem") {
         my ($tagfield,$tagsubfield) = &GetMarcFromKohaField("items.barcode",$frameworkcode);
 
        # If there is a barcode and we can't find him new values, we can't add multiple copies
-        my $testbarcode = $barcodeobj->next_value($oldbarcode) if $barcodeobj;
+       my $testbarcode;
+        $testbarcode = $barcodeobj->next_value($oldbarcode) if $barcodeobj;
        if ($oldbarcode && !$testbarcode) {
 
            push @errors, "no_next_barcode";
@@ -412,6 +429,14 @@ if ($op eq "additem") {
            }
            undef($itemrecord);
        }
+    }  
+    if ($frameworkcode eq 'FA' && $input->param('borrowernumber')){
+       my $redirect_string = 'borrowernumber=' . uri_escape($input->param('borrowernumber')) .
+         '&barcode=' . uri_escape($input->param('barcode'));
+       $redirect_string .= '&duedatespec=' . uri_escape($input->param('duedatespec')) . 
+         '&stickyduedate=1';
+       print $input->redirect("/cgi-bin/koha/circ/circulation.pl?" . $redirect_string);
+       exit;
     }
 
 
@@ -456,7 +481,17 @@ if ($op eq "additem") {
             $nextop="additem";
         } 
         else {
-            print $input->redirect("/cgi-bin/koha/catalogue/moredetail.pl?biblionumber=$biblionumber");
+            my $defaultview = C4::Context->preference('IntranetBiblioDefaultView');
+            my $views = { C4::Search::enabled_staff_search_views };
+            if ($defaultview eq 'isbd' && $views->{can_view_ISBD}) {
+                print $input->redirect("/cgi-bin/koha/catalogue/ISBDdetail.pl?biblionumber=$biblionumber");
+            } elsif  ($defaultview eq 'marc' && $views->{can_view_MARC}) {
+                print $input->redirect("/cgi-bin/koha/catalogue/MARCdetail.pl?biblionumber=$biblionumber");
+            } elsif  ($defaultview eq 'labeled_marc' && $views->{can_view_labeledMARC}) {
+                print $input->redirect("/cgi-bin/koha/catalogue/labeledMARCdetail.pl?biblionumber=$biblionumber");
+            } else {
+                print $input->redirect("/cgi-bin/koha/catalogue/detail.pl?biblionumber=$biblionumber");
+            }
             exit;
         }
        }
@@ -481,10 +516,24 @@ if ($op eq "additem") {
     if ($exist_itemnumber && $exist_itemnumber != $itemnumber) {
         push @errors,"barcode_not_unique";
     } else {
-        my ($oldbiblionumber,$oldbibnum,$oldbibitemnum) = ModItemFromMarc($itemtosave,$biblionumber,$itemnumber);
+        ModItemFromMarc($itemtosave,$biblionumber,$itemnumber);
         $itemnumber="";
     }
     $nextop="additem";
+} elsif ($op eq "delinkitem"){
+    my $analyticfield = '773';
+       if ($marcflavour  eq 'MARC21' || $marcflavour eq 'NORMARC'){
+        $analyticfield = '773';
+    } elsif ($marcflavour eq 'UNIMARC') {
+        $analyticfield = '461';
+    }
+    foreach my $field ($record->field($analyticfield)){
+        if ($field->subfield('9') eq $hostitemnumber){
+            $record->delete_field($field);
+            last;
+        }
+    }
+       my $modbibresult = ModBiblio($record, $biblionumber,'');
 }
 
 #
@@ -494,13 +543,40 @@ if ($op eq "additem") {
 
 # now, build existiing item list
 my $temp = GetMarcBiblio( $biblionumber );
-my @fields = $temp->fields();
 #my @fields = $record->fields();
+
+
 my %witness; #---- stores the list of subfields used at least once, with the "meaning" of the code
 my @big_array;
 #---- finds where items.itemnumber is stored
 my (  $itemtagfield,   $itemtagsubfield) = &GetMarcFromKohaField("items.itemnumber", $frameworkcode);
 my ($branchtagfield, $branchtagsubfield) = &GetMarcFromKohaField("items.homebranch", $frameworkcode);
+C4::Biblio::EmbedItemsInMarcBiblio($temp, $biblionumber);
+my @fields = $temp->fields();
+
+
+my @hostitemnumbers;
+if ( C4::Context->preference('EasyAnalyticalRecords') ) {
+    my $analyticfield = '773';
+    if ($marcflavour  eq 'MARC21' || $marcflavour eq 'NORMARC') {
+        $analyticfield = '773';
+    } elsif ($marcflavour eq 'UNIMARC') {
+        $analyticfield = '461';
+    }
+    foreach my $hostfield ($temp->field($analyticfield)){
+       if ($hostfield->subfield('0')){
+            my $hostrecord = GetMarcBiblio($hostfield->subfield('0'), 1);
+           my ($itemfield, undef) = GetMarcFromKohaField( 'items.itemnumber', GetFrameworkCode($hostfield->subfield('0')) );
+           foreach my $hostitem ($hostrecord->field($itemfield)){
+               if ($hostitem->subfield('9') eq $hostfield->subfield('9')){
+                   push (@fields, $hostitem);
+                    push (@hostitemnumbers, $hostfield->subfield('9'));
+                }
+            }
+        }
+    }
+}
+
 
 foreach my $field (@fields) {
     next if ( $field->tag() < 10 );
@@ -532,6 +608,22 @@ foreach my $field (@fields) {
             }
         }
         $this_row{itemnumber} = $subfieldvalue if ($field->tag() eq $itemtagfield && $subfieldcode eq $itemtagsubfield);
+
+       if ( C4::Context->preference('EasyAnalyticalRecords') ) {
+           foreach my $hostitemnumber (@hostitemnumbers){
+               if ($this_row{itemnumber} eq $hostitemnumber){
+                       $this_row{hostitemflag} = 1;
+                       $this_row{hostbiblionumber}= GetBiblionumberFromItemnumber($hostitemnumber);
+                       last;
+               }
+           }
+
+#          my $countanalytics=GetAnalyticsCount($this_row{itemnumber});
+#           if ($countanalytics > 0){
+#                $this_row{countanalytics} = $countanalytics;
+#           }
+       }
+
     }
     if (%this_row) {
         push(@big_array, \%this_row);
@@ -552,6 +644,9 @@ for my $row ( @big_array ) {
     $row_data{itemnumber} = $row->{itemnumber};
     #reporting this_row values
     $row_data{'nomod'} = $row->{'nomod'};
+    $row_data{'hostitemflag'} = $row->{'hostitemflag'};
+    $row_data{'hostbiblionumber'} = $row->{'hostbiblionumber'};
+#      $row_data{'countanalytics'} = $row->{'countanalytics'};
     push(@item_value_loop,\%row_data);
 }
 foreach my $subfield_code (sort keys(%witness)) {
@@ -570,10 +665,11 @@ my $onlymine = C4::Context->preference('IndependantBranches') &&
                C4::Context->userenv                           && 
                C4::Context->userenv->{flags}!=1               && 
                C4::Context->userenv->{branch};
-my $branches = GetBranchesLoop(undef,$onlymine);  # build once ahead of time, instead of multiple times later.
+my $branch = $input->param('branch') || C4::Context->userenv->{branch};
+my $branches = GetBranchesLoop($branch,$onlymine);  # build once ahead of time, instead of multiple times later.
 
 # We generate form, from actuel record
-my @fields;
+@fields = ();
 if($itemrecord){
     foreach my $field ($itemrecord->fields()){
         my $tag = $field->{_tag};
@@ -586,6 +682,8 @@ if($itemrecord){
             next if subfield_is_koha_internal_p($subfieldtag);
             next if ($tagslib->{$tag}->{$subfieldtag}->{'tab'} ne "10");
 
+            $subfieldlib->{hidden} = 1
+              if $tagslib->{$tag}->{$subfieldtag}->{authorised_value} eq 'LOST';
             my $subfield_data = generate_subfield_form($tag, $subfieldtag, $value, $tagslib, $subfieldlib, $branches, $today_iso, $biblionumber, $temp, \@loop_data, $i);        
 
             push @fields, "$tag$subfieldtag";
@@ -630,6 +728,14 @@ $template->param(
     opisadd => ($nextop eq "saveitem") ? 0 : 1,
     C4::Search::enabled_staff_search_views,
 );
+
+if ($frameworkcode eq 'FA'){
+    $template->{VARS}->{'borrowernumber'}=$input->param('borrowernumber');
+    $template->{VARS}->{'barcode'}=$input->param('barcode');
+    $template->{VARS}->{'stickyduedate'}=$input->param('stickduedate');
+    $template->{VARS}->{'duedatespec'}=$input->param('duedatespec');
+}    
+
 foreach my $error (@errors) {
     $template->param($error => 1);
 }