Merge remote branch 'kc/new/bug_6065' into kcmaster
[koha_gimpoz] / cataloguing / addbiblio.pl
index 32ca357..038878f 100755 (executable)
@@ -2,6 +2,7 @@
 
 
 # Copyright 2000-2002 Katipo Communications
+# Copyright 2004-2010 BibLibre
 #
 # This file is part of Koha.
 #
 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
 # A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
 #
-# You should have received a copy of the GNU General Public License along with
-# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
-# Suite 330, Boston, MA  02111-1307 USA
+# You should have received a copy of the GNU General Public License along
+# with Koha; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
 use strict;
+#use warnings; FIXME - Bug 2505
 use CGI;
 use C4::Output;
 use C4::Auth;
@@ -44,7 +46,9 @@ if ( C4::Context->preference('marcflavour') eq 'UNIMARC' ) {
 
 our($tagslib,$authorised_values_sth,$is_a_modif,$usedTagsLib,$mandatory_z3950);
 
-=item MARCfindbreeding
+=head1 FUNCTIONS
+
+=head2 MARCfindbreeding
 
     $record = MARCfindbreeding($breedingid);
 
@@ -151,7 +155,7 @@ sub MARCfindbreeding {
     return -1;
 }
 
-=item build_authorized_values_list
+=head2 build_authorized_values_list
 
 =cut
 
@@ -168,7 +172,7 @@ sub build_authorized_values_list ($$$$$$$) {
         #Use GetBranches($onlymine)
         my $onlymine=C4::Context->preference('IndependantBranches') && 
                 C4::Context->userenv && 
-                C4::Context->userenv->{flags}!=1 && 
+                C4::Context->userenv->{flags} % 2 == 0 && 
                 C4::Context->userenv->{branch};
         my $branches = GetBranches($onlymine);
         my @branchloop;
@@ -185,7 +189,7 @@ sub build_authorized_values_list ($$$$$$$) {
             "select itemtype,description from itemtypes order by description");
         $sth->execute;
         push @authorised_values, ""
-          unless ( $tagslib->{$tag}->{$subfield}->{mandatory} );
+          unless ( $tagslib->{$tag}->{$subfield}->{defaultvalue} and $tagslib->{$tag}->{$subfield}->{mandatory} );
           
         my $itemtype;
         
@@ -242,7 +246,7 @@ sub build_authorized_values_list ($$$$$$$) {
     );
 }
 
-=item CreateKey
+=head2 CreateKey
 
     Create a random value to set it into the input name
 
@@ -252,11 +256,11 @@ sub CreateKey(){
     return int(rand(1000000));
 }
 
-=item GetMandatoryFieldZ3950
+=head2 GetMandatoryFieldZ3950
 
     This function return an hashref which containts all mandatory field
     to search with z3950 server.
-    
+
 =cut
 
 sub GetMandatoryFieldZ3950($){
@@ -276,7 +280,7 @@ sub GetMandatoryFieldZ3950($){
     };
 }
 
-=item create_input
+=head2 create_input
 
  builds the <input ...> entry for a subfield.
 
@@ -298,7 +302,7 @@ sub create_input {
     }
 
     # if there is no value provided but a default value in parameters, get it
-    unless ($value) {
+    if ( $value eq '' ) {
         $value = $tagslib->{$tag}->{$subfield}->{defaultvalue};
 
         # get today date & replace YYYY, MM, DD if provided in the default value
@@ -308,6 +312,9 @@ sub create_input {
         $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;
+    
     }
     my $dbh = C4::Context->dbh;
 
@@ -360,7 +367,7 @@ sub create_input {
                     id=\"".$subfield_data{id}."\"
                     name=\"".$subfield_data{id}."\"
                     value=\"$value\"
-                    class=\"input_marceditor\"
+                    class=\"input_marceditor readonly\"
                     tabindex=\"1\"
                     size=\"5\"
                     maxlength=\"$max_length\"
@@ -376,13 +383,13 @@ sub create_input {
                     id=\"".$subfield_data{id}."\"
                     name=\"".$subfield_data{id}."\"
                     value=\"$value\"
-                    class=\"input_marceditor\"
+                    class=\"input_marceditor readonly\"
                     tabindex=\"1\"
                     size=\"67\"
                     maxlength=\"$max_length\"
                     \/>
                     <a href=\"#\" class=\"buttonDot\"
-                        onclick=\"Dopop('/cgi-bin/koha/authorities/auth_finder.pl?authtypecode=".$tagslib->{$tag}->{$subfield}->{authtypecode}."&amp;index=$subfield_data{id}','$subfield_data{id}'); return false;\" title=\"Tag Editor\">...</a>
+                        onclick=\"openAuth(this.parentNode.getElementsByTagName('input')[1].id,'".$tagslib->{$tag}->{$subfield}->{authtypecode}."'); return false;\" tabindex=\"1\" title=\"Tag Editor\">...</a>
             ";
       } else {
         $subfield_data{marc_value} =
@@ -390,13 +397,13 @@ sub create_input {
                     id=\"".$subfield_data{id}."\"
                     name=\"".$subfield_data{id}."\"
                     value=\"$value\"
-                    class=\"input_marceditor\"
+                    class=\"input_marceditor readonly\"
                     tabindex=\"1\"
                     size=\"67\"
                     maxlength=\"$max_length\"
                     readonly=\"readonly\"
                     \/><a href=\"#\" class=\"buttonDot\"
-                        onclick=\"openAuth('".$subfield_data{id}."','".$tagslib->{$tag}->{$subfield}->{authtypecode}."'); return false;\" title=\"Tag Editor\">...</a>
+                        onclick=\"openAuth(this.parentNode.getElementsByTagName('input')[1].id,'".$tagslib->{$tag}->{$subfield}->{authtypecode}."'); return false;\" tabindex=\"1\" title=\"Tag Editor\">...</a>
             ";
       }
     # it's a plugin field
@@ -426,7 +433,7 @@ sub create_input {
                             size=\"67\"
                             maxlength=\"$max_length\"
                             onblur=\"Blur$function_name($index_tag); \" \/>
-                            <a href=\"#\" class=\"buttonDot\" onclick=\"Clic$function_name('$subfield_data{id}'); return false;\" title=\"Tag Editor\">...</a>
+                            <a href=\"#\" class=\"buttonDot\" onclick=\"Clic$function_name('$subfield_data{id}'); return false;\" tabindex=\"1\" title=\"Tag Editor\">...</a>
                     $javascript";
         } else {
             warn "Plugin Failed: $plugin";
@@ -510,7 +517,7 @@ sub create_input {
 }
 
 
-=item format_indicator
+=head2 format_indicator
 
 Translate indicator value for output form - specifically, map
 indicator = ' ' to ''.  This is for the convenience of a cataloger
@@ -662,7 +669,7 @@ sub build_tabs ($$$$$) {
                             fixedfield    => $tag < 10?1:0,
                             random        => CreateKey,
                         );
-                        if ($tag >= 010){ # no indicator for theses tag
+                        if ($tag >= 10){ # no indicator for 00x tags
                            $tag_data{indicator1} = format_indicator($field->indicator(1)),
                            $tag_data{indicator2} = format_indicator($field->indicator(2)),
                         }
@@ -751,7 +758,7 @@ AND (authtypecode IS NOT NULL AND authtypecode<>\"\")|);
   my ($countcreated,$countlinked);
   while (my $data=$query->fetchrow_hashref){
     foreach my $field ($record->field($data->{tagfield})){
-      next if ($field->subfield('3')||$field->subfield('9'));
+      next if ($field->subfield('3') || $field->subfield('9'));
       # No authorities id in the tag.
       # Search if there is any authorities to link to.
       my $query='at='.$data->{authtypecode}.' ';
@@ -779,6 +786,10 @@ AND (authtypecode IS NOT NULL AND authtypecode<>\"\")|);
          my $authtypedata=GetAuthType($data->{authtypecode});
          next unless $authtypedata;
          my $marcrecordauth=MARC::Record->new();
+               if (C4::Context->preference('marcflavour') eq 'MARC21') {
+                       $marcrecordauth->leader('     nz  a22     o  4500');
+                       SetMarcUnicodeFlag($marcrecordauth, 'MARC21');
+                       }
          my $authfield=MARC::Field->new($authtypedata->{auth_tag_to_report},'','',"a"=>"".$field->subfield('a'));
          map { $authfield->add_subfields($_->[0]=>$_->[1]) if ($_->[0]=~/[A-z]/ && $_->[0] ne "a" )}  $field->subfields();
          $marcrecordauth->insert_fields_ordered($authfield);
@@ -789,9 +800,15 @@ AND (authtypecode IS NOT NULL AND authtypecode<>\"\")|);
          # FIXME: AddAuthority() instead should simply explicitly require that the MARC::Record
          # use UTF-8, but as of 2008-08-05, did not want to introduce that kind
          # of change to a core API just before the 3.0 release.
-         if (C4::Context->preference('marcflavour') eq 'MARC21') {
-            SetMarcUnicodeFlag($marcrecordauth, 'MARC21');
-         }
+
+                               if (C4::Context->preference('marcflavour') eq 'MARC21') {
+                                       $marcrecordauth->insert_fields_ordered(MARC::Field->new('667','','','a'=>"Machine generated authority record."));
+                                       my $cite = $record->author() . ", " .  $record->title_proper() . ", " . $record->publication_date() . " "; 
+                                       $cite =~ s/^[\s\,]*//;
+                                       $cite =~ s/[\s\,]*$//;
+                                       $cite = "Work cat.: (" . C4::Context->preference('MARCOrgCode') . ")". $record->subfield('999','c') . ": " . $cite;
+                                       $marcrecordauth->insert_fields_ordered(MARC::Field->new('670','','','a'=>$cite));
+                               }
 
 #          warn "AUTH RECORD ADDED : ".$marcrecordauth->as_formatted;
 
@@ -815,8 +832,11 @@ my $z3950         = $input->param('z3950');
 my $op            = $input->param('op');
 my $mode          = $input->param('mode');
 my $frameworkcode = $input->param('frameworkcode');
+my $redirect      = $input->param('redirect');
 my $dbh           = C4::Context->dbh;
 
+my $userflags = ($frameworkcode eq 'FA') ? "fast_cataloging" : "edit_catalogue";
+
 $frameworkcode = &GetFrameworkCode($biblionumber)
   if ( $biblionumber and not($frameworkcode) );
 
@@ -827,7 +847,7 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
         query           => $input,
         type            => "intranet",
         authnotrequired => 0,
-        flagsrequired   => { editcatalogue => 1 },
+        flagsrequired   => { editcatalogue => $userflags },
     }
 );
 
@@ -913,13 +933,27 @@ if ( $op eq "addbiblio" ) {
         else {
             ( $biblionumber, $oldbibitemnum ) = AddBiblio( $record, $frameworkcode );
         }
-
-        if ($mode ne "popup"){
+        if ($redirect eq "items" || ($mode ne "popup" && !$is_a_modif && $redirect ne "view")){
             print $input->redirect(
                 "/cgi-bin/koha/cataloguing/additem.pl?biblionumber=$biblionumber&frameworkcode=$frameworkcode"
             );
             exit;
-        } else {
+        }
+               elsif($is_a_modif || $redirect eq "view"){
+            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&frameworkcode=$frameworkcode");
+            } 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;
+
+               }else {
           $template->param(
             biblionumber => $biblionumber,
             done         =>1,
@@ -986,6 +1020,9 @@ elsif ( $op eq "delete" ) {
 }
 
 $template->param( title => $record->title() ) if ( $record ne "-1" );
+if (C4::Context->preference("marcflavour") eq "MARC21"){
+    $template->param(MARC21 => 1);
+}
 $template->param(
     popup => $mode,
     frameworkcode => $frameworkcode,