[Koha-patches] [PATCH] Bug 5725 : MT #2991 (Feature) Batch biblio modifications

Chris Cormack chrisc at catalyst.net.nz
Tue Feb 8 23:49:53 CET 2011


From: Paul Poulain <paul.poulain at biblibre.com>

This patch add a new feature of batch biblio modifications,
it permit to select biblios from basket, and modify fields of them setting

Rebased to fix whitespace issues.
---
 C4/Biblio.pm                                       |  171 ++++++++++++++-
 koha-tmpl/intranet-tmpl/prog/en/js/basket.js       |    6 +
 .../prog/en/modules/basket/basket.tmpl             |    5 +
 .../prog/en/modules/tools/batchedit.tmpl           |  231 ++++++++++++++++++++
 tools/batchedit.pl                                 |  222 +++++++++++++++++++
 5 files changed, 623 insertions(+), 12 deletions(-)
 create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/tools/batchedit.tmpl
 create mode 100755 tools/batchedit.pl

diff --git a/C4/Biblio.pm b/C4/Biblio.pm
index 8ea5da5..bafc2db 100644
--- a/C4/Biblio.pm
+++ b/C4/Biblio.pm
@@ -93,6 +93,8 @@ BEGIN {
       &ModBiblio
       &ModBiblioframework
       &ModZebra
+
+      &BatchModField
     );
 
     # To delete something
@@ -376,7 +378,7 @@ sub ModBiblioframework {
 
 =head2 DelBiblio
 
-  my $error = &DelBiblio($dbh,$biblionumber);
+  my $error = &DelBiblio($biblionumber);
 
 Exported function (core API) for deleting a biblio in koha.
 Deletes biblio record from Zebra and Koha tables (biblio,biblioitems,items)
@@ -1046,9 +1048,14 @@ The MARC record contains both biblio & item data.
 
 sub GetMarcBiblio {
     my $biblionumber = shift;
+    my $deletedtable = shift;
     my $dbh          = C4::Context->dbh;
-    my $sth          = $dbh->prepare("SELECT marcxml FROM biblioitems WHERE biblionumber=? ");
-    $sth->execute($biblionumber);
+    my $strsth       = qq{SELECT marcxml FROM biblioitems WHERE biblionumber=?};
+    $strsth .= qq{UNION SELECT marcxml FROM deletedbiblioitems WHERE biblionumber=?} if $deletedtable;
+    my $sth = $dbh->prepare($strsth);
+    my @params=($biblionumber);
+    push @params, $biblionumber if ($deletedtable);
+    $sth->execute(@params);
     my $row     = $sth->fetchrow_hashref;
     my $marcxml = StripNonXmlChars( $row->{'marcxml'} );
     MARC::File::XML->default_record_format( C4::Context->preference('marcflavour') );
@@ -1113,6 +1120,8 @@ sub GetCOinSBiblio {
     my $isbn      = '';
     my $issn      = '';
     my $publisher = '';
+    my $place     = '';
+    my $tpages    = '';
 
     if ( C4::Context->preference("marcflavour") eq "UNIMARC" ) {
         my $fmts6;
@@ -1159,24 +1168,70 @@ sub GetCOinSBiblio {
         $genre = ( $mtx eq 'dc' ) ? "&amp;rft.type=$genre" : "&amp;rft.genre=$genre";
 
         # Setting datas
-        $aulast  = $record->subfield( '700', 'a' );
-        $aufirst = $record->subfield( '700', 'b' );
-        $oauthors = "&amp;rft.au=$aufirst $aulast";
+
+	# authors
+        $aulast  = $record->subfield( '700', 'a' ) || '';
+        $aufirst = $record->subfield( '700', 'b' ) || '';
+
+	foreach my $field (qw/700 701/) {
+	    my $author = '';
+	    $author = $record->subfield($field, 'a') || '';
+	    $author .= ", "  . $record->subfield($field, 'b')              if ($author and $record->subfield($field, 'b'));
+	    $author .= " - " . join(' - ', $record->subfield($field, '4')) if ($record->subfield($field, '4'));
+	    $author .= " ("  . $record->subfield($field, 'f') . ")"        if ($record->subfield($field, 'f'));
+
+	    $oauthors .= "&amp;rft.au=$author" if ($author);
+	}
+
+	foreach my $field (qw/710 711/) {
+	    my $author = '';
+	    $author = $record->subfield($field, 'a') || '';
+	    $author .= ", "  . $record->subfield($field, 'b')              if ($author and $record->subfield($field, 'b'));
+	    $author .= " - " . join(' - ', $record->subfield($field, '4')) if ($record->subfield($field, '4'));
+	    $author .= " ("  . $record->subfield($field, 'c') . ")"        if ($record->subfield($field, 'c'));
+
+	    $oauthors .= "&amp;rft.au=$author" if ($author);
+	}
+
 
         # others authors
         if ( $record->field('200') ) {
+            for my $au ( $record->field('200')->subfield('f') ) {
+                $oauthors .= "&amp;rft.au=$au";
+            }
             for my $au ( $record->field('200')->subfield('g') ) {
                 $oauthors .= "&amp;rft.au=$au";
             }
+
         }
+
+	# place
+	$place = join(" - ", $record->subfield('210', 'a'));
+	$place = "&amp;rtf.place=$place" if ($place);
+
+	# tpages
+	my $i = 0;
+	foreach my $field ($record->field('215')) {
+		$tpages .= " | " if ($i > 0);
+		$tpages .= join(" - ", $field->subfield('a'));
+		$tpages .= join(" ; ", $field->subfield('d'));
+		$tpages .= join(" + ", $field->subfield('e'));
+		$i++;
+	}
+	$tpages = "&amp;rtf.tpages=$tpages" if ($tpages);
+
+	# title
+	my $btitle = join(' ; ', $record->subfield('200', 'a'));
+	$btitle .= " : " . join(' : ', $record->subfield('200', 'e')) if ($record->subfield('200', 'e'));
+
         $title =
           ( $mtx eq 'dc' )
           ? "&amp;rft.title=" . $record->subfield( '200', 'a' )
-          : "&amp;rft.title=" . $record->subfield( '200', 'a' ) . "&amp;rft.btitle=" . $record->subfield( '200', 'a' );
-        $pubyear   = $record->subfield( '210', 'd' );
-        $publisher = $record->subfield( '210', 'c' );
-        $isbn      = $record->subfield( '010', 'a' );
-        $issn      = $record->subfield( '011', 'a' );
+          : "&amp;rft.title=" . $record->subfield( '200', 'a' ) . "&amp;rft.btitle=" . $btitle;
+        $pubyear   = $record->subfield( '210', 'd' ) || '';
+        $publisher = $record->subfield( '210', 'c' ) || '';
+        $isbn      = $record->subfield( '010', 'a' ) || '';
+        $issn      = $record->subfield( '011', 'a' ) || '';
     } else {
 
         # MARC21 need some improve
@@ -1205,7 +1260,7 @@ sub GetCOinSBiblio {
 
     }
     my $coins_value =
-"ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3A$mtx$genre$title&amp;rft.isbn=$isbn&amp;rft.issn=$issn&amp;rft.aulast=$aulast&amp;rft.aufirst=$aufirst$oauthors&amp;rft.pub=$publisher&amp;rft.date=$pubyear";
+"ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3A$mtx$genre$title&amp;rft.isbn=$isbn&amp;rft.issn=$issn&amp;rft.aulast=$aulast&amp;rft.aufirst=$aufirst$oauthors&amp;rft.pub=$publisher&amp;rft.date=$pubyear$place$tpages";
     $coins_value =~ s/(\ |&[^a])/\+/g;
     $coins_value =~ s/\"/\&quot\;/g;
 
@@ -1750,6 +1805,7 @@ sub TransformHtmlToXml {
         @$values[$i] =~ s/>/&gt;/g;
         @$values[$i] =~ s/"/&quot;/g;
         @$values[$i] =~ s/'/&apos;/g;
+	@$values[$i] = NormalizeString(@$values[$i]);
 
         #         if ( !utf8::is_utf8( @$values[$i] ) ) {
         #             utf8::decode( @$values[$i] );
@@ -2313,7 +2369,9 @@ sub PrepareItemrecordDisplay {
                                 push @authorised_values, $branchcode;
                                 $authorised_lib{$branchcode} = $branchname;
                             }
+			    $defaultvalue = C4::Context->userenv->{branch};
                         }
+                        $defaultvalue = C4::Context->userenv->{branch};
 
                         #----- itemtypes
                     } elsif ( $tagslib->{$tag}->{$subfield}->{authorised_value} eq "itemtypes" ) {
@@ -3461,6 +3519,95 @@ sub get_biblio_authorised_values {
     return $authorised_values;
 }
 
+=head3 BatchModField
+
+  Mod subfields in field record
+
+  returns 1,$record if succeed
+  returns 0,$record if Action was not processed
+  returns -1 if no record
+  returns -2 if no action done on record
+
+=cut
+
+sub BatchModField {
+    my ( $record, $field, $subfield, $action, $condval, $nocond, $repval ) = @_;
+
+    return -1 unless $record;
+    $condval=NormalizeString($condval);
+    my $condition=qr/$condval/;
+
+    if($action eq "add"){
+        for my $rfield ($record->field($field)){
+            $rfield->add_subfields( $subfield => $repval );
+        }
+        return 1;
+    }elsif($action eq "addfield"){
+        my $new_field = MARC::Field->new($field,'','',
+                                         $subfield => $repval);
+        $record->insert_fields_ordered($new_field);
+        return 1;
+    } else {
+        my $done=0;
+        for my $rfield ($record->field($field)) {
+            if ($subfield && $subfield ne "@"){
+                my @subfields = $rfield->subfields();
+                my @subfields_to_add;
+            foreach my $subf (@subfields) {
+                    if ($subf->[0] eq $subfield){
+                        $subf->[1]=NormalizeString($subf->[1]);
+                        if ( $action eq "mod" ) {
+                            if ( $nocond ne "true" && $subf->[1] =~ s/$condition/$repval/) {
+                                $done=1;
+                            }
+                            if ($nocond eq "true"){
+                                $subf->[1] = $repval;
+                                $done=1;
+                    }
+                } elsif ( $action eq "del" ) {
+                            if ( $subf->[1] =~ m/$condition/ || $nocond eq "true" ) {
+                                $done=1;
+                                next;
+                            }
+                        }
+                    }
+                    push @subfields_to_add,@$subf;
+        }
+                if ($done){
+                    if (@subfields_to_add){
+                        $rfield->replace_with(MARC::Field->new($rfield->tag,$rfield->indicator(1),$rfield->indicator(2), at subfields_to_add));
+    }
+                    else {
+                        my $count= $record->delete_field($rfield);
+                    }
+                }
+            }
+            else {
+                if ($action eq "del"){
+                    my $count=$record->delete_field($rfield);
+                    $done=1;
+                }
+                else {
+                    if ($field < 10){
+                       my $value=$record->field($field)->data();
+                       if ($value=~ s/$condition/$repval/){
+                        $record->field($field)->update($value);
+                        $done=1;
+
+                       }
+                       if ( $nocond eq 'true'){
+                        $record->field($field)->update($repval);
+                        $done=1;
+                       }
+                    }
+                }
+            }
+        }
+        return ($done,$record);
+    }
+    return -2;
+}
+
 1;
 
 __END__
diff --git a/koha-tmpl/intranet-tmpl/prog/en/js/basket.js b/koha-tmpl/intranet-tmpl/prog/en/js/basket.js
index 0ab6711..0991f42 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/js/basket.js
+++ b/koha-tmpl/intranet-tmpl/prog/en/js/basket.js
@@ -433,4 +433,10 @@ $(document).ready(function(){
 	if(basketcount){ updateBasket(basketcount); }
 });
 
+function batchEdit(){
+    var valCookie = readCookie(nameCookie);
+    var strCookie = nameParam + "=" + valCookie;
 
+    var loc = CGIBIN + "tools/batchedit.pl?" + strCookie;
+    window.opener.location = loc;
+}
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/basket/basket.tmpl b/koha-tmpl/intranet-tmpl/prog/en/modules/basket/basket.tmpl
index d3d83ac..6699bde 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/basket/basket.tmpl
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/basket/basket.tmpl
@@ -86,6 +86,11 @@ function placeHold () {
 		<!-- TMPL_IF NAME="verbose" --><a href="basket.pl" class="brief" onclick="showLess(); return false;">Brief Display</a><!-- TMPL_ELSE --><a href="basket.pl" class="detail" onclick="showMore(); return false;">More Details</a><!-- /TMPL_IF -->
 	    </span></span>
 	</li>
+    <li>
+        <span id="batchedit" class="yui-button yui-link-button"><span class="first-child">
+        <a class="batchedit" href="basket.pl" onclick="batchEdit(); return false;">Batch Edit</a>
+        </span></span>
+    </li>
 	<li>
 	    <span id="receive" class="yui-button yui-link-button"><span class="first-child">
 		<a class="send" href="basket.pl" onclick="sendBasket(); return false;">Send</a>
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/batchedit.tmpl b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/batchedit.tmpl
new file mode 100644
index 0000000..f7b7589
--- /dev/null
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/batchedit.tmpl
@@ -0,0 +1,231 @@
+<!-- TMPL_INCLUDE NAME="doc-head-open.inc" -->
+<title>Koha &rsaquo; Tools &rsaquo; Batch Deletion of Items</title>
+<!-- TMPL_INCLUDE NAME="doc-head-close.inc" -->
+
+<!-- TMPL_UNLESS NAME="modsuccess" -->
+
+<script type="text/javascript" src="<!-- TMPL_VAR name="themelang" -->/lib/jquery/plugins/jquery.tablesorter.min.js"></script>
+<script type="text/JavaScript" language="JavaScript">
+//<![CDATA[
+     var CGIBIN = "/cgi-bin/koha/";
+
+     function fieldChanged(){
+        var field = $('#fieldchoice').val();
+        $.ajax({
+		url: CGIBIN + 'tools/batchedit.pl?field=' + field,
+		dataType: 'json',
+            success: function(data){
+		$("#subfieldchoice option").remove();
+
+		    var subfield = $('#subfieldchoice');
+			$("<option>").attr("value", "@")
+                                 .text( _('Whole field'))
+                                 .appendTo('#subfieldchoice');
+                for( var i=0; i < data.length ; i++){
+			$("<option>").attr("value", data[i].subfield)
+                                 .text(data[i].subfield)
+                                 .appendTo('#subfieldchoice');
+                }
+                subfieldChanged();
+            }
+        });
+     }
+
+     function subfieldChanged(){
+        var field    = $('#fieldchoice').val();
+        var subfield = $('#subfieldchoice').val();
+        $.ajax({
+		url: CGIBIN + 'tools/batchedit.pl?field=' + field + '&subfield=' + subfield,
+		dataType: 'json',
+            success: function(data){
+
+		    if( data.length > 0) {
+			$("#condvaltd").html('<select name="condvalchoice" id="condvalchoice" />');
+			$("<option>").attr("value", "")
+                        .text("")
+                        .appendTo('#condvalchoice');
+			$("#repvaltd" ).html('<select name="repvalchoice" id="repvalchoice" />'  );
+                    $("<option>").attr("value", "")
+                        .text("")
+                        .appendTo('#repvalchoice');
+
+                    for( var i=0; i < data.length ; i++){
+			$("<option>").attr("value", data[i].code)
+                            .text(data[i].value)
+                            .appendTo('#repvalchoice');
+			$("<option>").attr("value", data[i].code)
+                            .text(data[i].value)
+                            .appendTo('#condvalchoice');
+                    }
+		    }else{
+                    $("#condvaltd").html('<input type="text" name="condvalchoice" id="condvalchoice" />');
+                    $("#repvaltd").html('<input type="text" name="repvalchoice"  id="repvalchoice" />');
+		    }
+                $('<input type="checkbox" id="nocond" name="nocond" value="nocond" onClick="$(\'#condvalchoice\').attr(\'disabled\', ! $(\'#condvalchoice\').attr(\'disabled\') ) ">All</input>').appendTo("#condvaltd");
+            }
+        });
+
+     }
+
+     function addRule(){
+        var actionlabel = {
+                mod: _('Modify'),
+                del: _('Delete'),
+                add: _('Create')
+                };
+        var repvallabel  = $('#repvalchoice :selected').text()  || $("#repvalchoice").val();
+
+        var field    = $('#fieldchoice').val();
+        var subfield = $('#subfieldchoice').val();
+        var action   = $('#actionchoice').val();
+        var nocond   = $('#nocond').attr('checked')||(! $('#condvalchoice').val().length);
+
+        if( ! nocond ) {
+            var condval  = $('#condvalchoice').val();
+            var condvallabel = $('#condvalchoice :selected').text() || $("#condvalchoice").val();
+        }else{
+            var condvallabel = _("No condition");
+        }
+        var repval   = $('#repvalchoice').val();
+
+        var tmpl = "<tr>"
+                + '<td><input type="hidden" name="field" value="'    + field + '" />'    + field               + '</td>'
+                + '<td><input type="hidden" name="subfield" value="' + subfield + '" />' + subfield            + '</td>'
+                + '<td><input type="hidden" name="action" value="'   + action + '" />'   + actionlabel[action] + '</td>'
+                + '<td><input type="hidden" name="condval" value="'  + condval + '" />'
+                    + condvallabel
+                    + '<input type="hidden" name="nocondval" value="' + nocond + '" />'
+                + '</td>'
+
+                + '<td><input type="hidden" name="repval" value="'   + repval + '" />'   + repvallabel         + '</td>'
+                + '<td><input type="button" value="Delete" onclick="deleteRule(this)" /></td>'
+            + '</tr>';
+        $('#rulestable').append(tmpl);
+
+     }
+
+     function deleteRule(button){
+        $(button).parent().parent().remove();
+        return false;
+     }
+
+
+//]]>
+</script>
+<!-- /TMPL_UNLESS -->
+</head>
+<body>
+<!-- TMPL_INCLUDE NAME="header.inc" -->
+<!-- TMPL_INCLUDE NAME="cat-search.inc"-->
+<div id="doc3" class="yui-t2">
+    <div id="bd">
+        <div id="yui-main">
+            <div class="yui-b">
+
+<form method="post" enctype="multipart/form-data">
+<!-- TMPL_IF NAME="inputform" -->
+<h2>Batch records modification</h2>
+    <fieldset class="rows">
+	<legend>Use a file</legend>
+	<ol>
+	    <li><label for="uploadfile">File: </label> <input type="file" id="uploadfile" name="uploadfile" /></li>
+	</ol>
+    </fieldset>
+    <fieldset class="rows">
+	<legend>Or enter records one by one</legend>
+	<ol>
+	    <li>
+		<label for="recordslist">Records numbers list (one number per line): </label>
+		<textarea rows="10" cols="30" id="recordslist" name="recordslist"></textarea>
+	    </li>
+	</ol>
+    </fieldset>
+<!-- TMPL_ELSE -->
+<h2>List of records:</h2>
+<table id="bibliolist">
+    <thead>
+        <tr>
+            <th>Biblionumber</th><th>Title</th><th>Author</th><!-- TMPL_IF Name="moddone"--> <th>Status</th><!-- /TMPL_IF -->
+        </tr>
+    </thead>
+    <!-- TMPL_LOOP NAME="biblioinfos" -->
+        <tr>
+            <td><!-- TMPL_VAR NAME="biblionumber" --></td>
+            <td><!-- TMPL_VAR NAME="title" --></td>
+            <td><!-- TMPL_VAR NAME="author" --></td>
+            <!-- TMPL_IF Name="moddone"-->
+            <!-- TMPL_IF NAME="OK" -->
+            <td>
+            <!--TMPL_ELSE-->
+            <td class="problem">
+            <!--/TMPL_IF-->
+            <!-- TMPL_IF NAME="OK" -->OK<!--/TMPL_IF-->
+            <!-- TMPL_IF NAME="No_Actions" -->Nothing done<!--/TMPL_IF-->
+            <!-- TMPL_IF NAME="Actions_Failed" -->Some Actions failed. List Follow : <ul><!-- TMPL_LOOP NAME="failed_actions" --><li><!-- TMPL_VAR NAME="action" --></li><!--/TMPL_LOOP --></ul><!--/TMPL_IF-->
+            </td><!-- /TMPL_IF -->
+        </tr>
+    <!-- /TMPL_LOOP -->
+</table>
+<!-- /TMPL_IF -->
+
+<!-- TMPL_IF NAME="moddone" -->
+    <div class="dialog alert">All operations processed</div>
+<!-- TMPL_ELSE -->
+
+<fieldset>
+<h2>Modification rules:</h2>
+<input type="submit" value="Submit" />
+<input type="hidden" name="op" value="do" />
+<input type="hidden" name="bib_list" value="<!-- TMPL_VAR NAME="bib_list" -->" />
+<table id="rulestable">
+    <thead>
+        <tr>
+            <th>Field</th><th>Subfield</th><th>Action</th><th>Condition Value</th><th>Value</th><th>&nbsp;</th>
+        </tr>
+    </thead>
+        <tr>
+            <td>
+                <select name="fieldchoice" id="fieldchoice" onchange="fieldChanged();">
+<!-- TMPL_LOOP NAME="marcfields" -->
+                    <option value="<!-- TMPL_VAR NAME="tag" -->"><!-- TMPL_VAR NAME="tag" --></option>
+<!-- /TMPL_LOOP -->
+                </select>
+            </td>
+            <td>
+                <select name="subfieldchoice" id="subfieldchoice" onchange="subfieldChanged();">
+
+                </select>
+            </td>
+            <td>
+                <select name="actionchoice" id="actionchoice">
+                    <option value="mod">Modify subfield</option>
+                    <option value="add">Create subfield</option>
+                    <option value="addfield">Create field and subfield</option>
+                    <option value="del">Delete subfield</option>
+                </select>
+            </td>
+            <td id="condvaltd">
+                <input type="text" name="condvalchoice" id="condvalchoice" />
+                <input type="checkbox" id="nocond" name="nocond" value="nocond" onClick="$('#condvalchoice').attr('disabled', ! $('#condvalchoice').attr('disabled') ) ">All</input>
+            </td>
+            <td id="repvaltd">
+                <input type="text" name="repvalchoice" id="repvalchoice" />
+            </td>
+            <td><input type="button" value="Add" onclick="addRule();" /></td>
+        </tr>
+    </thead>
+
+<!-- TMPL_LOOP NAME="marcfields" -->
+
+<!-- /TMPL_LOOP -->
+</table>
+<input type="submit" value="Submit" />
+</fieldset>
+</form>
+<!-- /TMPL_IF -->
+            </div>
+        </div>
+    </div>
+</div>
+</body>
+</html>
diff --git a/tools/batchedit.pl b/tools/batchedit.pl
new file mode 100755
index 0000000..06fcd0f
--- /dev/null
+++ b/tools/batchedit.pl
@@ -0,0 +1,222 @@
+#!/usr/bin/perl
+
+
+# Copyright 2010 SARL BibLibre
+#
+# This file is part of Koha.
+#
+# Koha is free software; you can redistribute it and/or modify it under the
+# terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
+# 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
+
+use CGI;
+use strict;
+use C4::Output;
+use C4::Auth;
+use C4::Branch;
+use C4::Koha;
+use C4::Biblio;
+use C4::Context;
+use C4::Debug;
+use JSON;
+
+my $input = new CGI;
+my $dbh = C4::Context->dbh;
+
+my $filefh = $input->param('uploadfile');
+my $recordslist = $input->param('recordslist');
+my $bib_list = $input->param('bib_list');
+my @biblionumbers;
+
+if ($filefh) {
+    while ( my $biblionumber = <$filefh> ) {
+        $biblionumber =~ s/[\r\n]*$//g;
+        push @biblionumbers, $biblionumber if $biblionumber;
+    }
+} elsif ($recordslist) {
+    push @biblionumbers, split( /\s\n/, $recordslist );
+} elsif ($bib_list) {
+    push @biblionumbers, split('/', $bib_list);
+}
+
+my $op            = $input->param('op');
+my ($template, $loggedinuser, $cookie);
+
+my $frameworkcode="";
+my $tagslib = &GetMarcStructure(1,$frameworkcode);
+my %report_actions;
+
+if($input->param('field') and not defined $op){
+    ($template, $loggedinuser, $cookie)
+        = get_template_and_user({template_name => "acqui/ajax.tmpl",
+                 query => $input,
+                 type => "intranet",
+                 authnotrequired => 0,
+                 flagsrequired => "batchedit",
+        });
+
+
+    my $tag      = $input->param('field');
+    my $subfield = $input->param('subfield');
+
+    if($input->param('subfield')){
+        my $branches = GetBranchesLoop();
+
+        my @authorised_values;
+        if ( $tagslib->{$tag}->{$subfield}->{authorised_value} ) {
+             if ( $tagslib->{$tag}->{$subfield}->{authorised_value} eq "branches" ) {
+                foreach my $thisbranch (@$branches) {
+                    push @authorised_values, {
+                            code => $thisbranch->{value},
+                            value => $thisbranch->{branchname},
+                        };
+                    # $value = $thisbranch->{value} if $thisbranch->{selected};
+                }
+             }elsif ( $tagslib->{$tag}->{$subfield}->{authorised_value} eq "itemtypes" ) {
+                 my $sth = $dbh->prepare("SELECT itemtype,description FROM itemtypes ORDER BY description");
+                 $sth->execute();
+                 while ( my ( $itemtype, $description ) = $sth->fetchrow_array ) {
+                    push @authorised_values, {
+                        code => $itemtype,
+                        value => $description,
+                    };
+                 }
+
+            }else {
+                  # Getting the fields where the item location is
+                  my ($location_field, $location_subfield) = GetMarcFromKohaField('items.location', $frameworkcode);
+
+                  # Getting the name of the authorised values' category for item location
+                  my $item_location_category = $tagslib->{$location_field}->{$location_subfield}->{'authorised_value'};
+		      # Are we dealing with item location ?
+                  my $item_location = ($tagslib->{$tag}->{$subfield}->{authorised_value} eq $item_location_category) ? 1 : 0;
+
+                  # If so, we sort by authorised_value, else by libelle
+                  my $orderby = $item_location ? 'authorised_value' : 'lib';
+
+                  my $authorised_values_sth = $dbh->prepare("SELECT authorised_value,lib FROM authorised_values WHERE category=? ORDER BY $orderby");
+
+                  $authorised_values_sth->execute( $tagslib->{$tag}->{$subfield}->{authorised_value});
+
+
+                  while ( my ( $value, $lib ) = $authorised_values_sth->fetchrow_array ) {
+                    push @authorised_values, {
+                        code => $value,
+                        value => ($item_location) ? $value . " - " . $lib : $lib,
+                    };
+
+                  }
+            }
+        }
+      $template->param('return' => to_json(\@authorised_values));
+    }else{
+        my @modifiablesubf;
+
+        foreach my $subfield (sort keys %{$tagslib->{$tag}}) {
+            next if subfield_is_koha_internal_p($subfield);
+            next if $subfield eq "@";
+            next if ($tagslib->{$tag}->{$subfield}->{'tab'} eq "10");
+            my %subfield_data;
+            $subfield_data{subfield} = $subfield;
+            push @modifiablesubf, \%subfield_data;
+        }
+        $template->param('return' => to_json(\@modifiablesubf));
+    }
+
+
+    output_html_with_http_headers $input, $cookie, $template->output;
+    exit;
+}else{
+    ($template, $loggedinuser, $cookie)
+            = get_template_and_user({template_name => "tools/batchedit.tmpl",
+                     query => $input,
+                     type => "intranet",
+                     authnotrequired => 0,
+                     flagsrequired => "batchedit",
+                     });
+
+    $template->param( inputform => 1, ) unless @biblionumbers;
+
+    if(!defined $op) {
+        my @modifiablefields;
+
+        foreach my $tag (sort keys %{$tagslib}) {
+            my %subfield_data;
+            foreach my $subfield (sort keys %{$tagslib->{$tag}}) {
+                next if $subfield_data{tag};
+                next if subfield_is_koha_internal_p($subfield);
+                next if ($tagslib->{$tag}->{$subfield}->{'tab'} eq "10");
+
+                $subfield_data{tag}      = $tag;
+
+                push @modifiablefields, \%subfield_data;
+            }
+        }
+
+        $template->param( marcfields  => \@modifiablefields,
+                          bib_list    => $input->param('bib_list'),
+                         );
+
+    }else{
+        my @fields     = $input->param('field');
+        my @subfields  = $input->param('subfield');
+        my @actions    = $input->param('action');
+        my @condvals   = $input->param('condval');
+        my @nocondvals = $input->param('nocondval');
+        my @repvals    = $input->param('repval');
+        foreach my $biblionumber ( @biblionumbers ){
+            my $record = GetMarcBiblio($biblionumber);
+            my $biblio = GetBiblio($biblionumber);
+            my $report = 0;
+            my @failed_actions;
+            for(my $i = 0 ; $i < scalar(@fields) ; $i++ ){
+                my $field    = $fields[$i];
+                my $subfield = $subfields[$i];
+                my $action   = $actions[$i];
+                my $condval  = $condvals[$i];
+                my $nocond   = $nocondvals[$i];
+                my $repval   = $repvals[$i];
+
+                my ($result,$record)   = BatchModField($record, $field, $subfield, $action, $condval, $nocond, $repval);
+                push @failed_actions, {action=>"$field $subfield $action ".($nocond eq "true"?"all":$condval)." $repval"} if ($result<=0);
+            }
+            if (@failed_actions == scalar(@fields)){
+                $report_actions{$biblionumber}->{status}="No_Actions";
+            }
+            elsif (@failed_actions>0 and @failed_actions < scalar(@fields)){
+                $report_actions{$biblionumber}->{status}="Actions_Failed";
+                $report_actions{$biblionumber}->{failed_actions}=\@failed_actions;
+            }
+            elsif (@failed_actions == 0){
+                $report_actions{$biblionumber}->{status}="OK";
+            }
+            ModBiblio($record, $biblionumber, $biblio->{frameworkcode}) unless ($report);
+        }
+        $template->param('moddone' => 1);
+    }
+
+}
+
+my @biblioinfos;
+
+for my $biblionumber (@biblionumbers){
+    my $biblio = GetBiblio($biblionumber);
+    if (defined $op){
+        $biblio->{$report_actions{$biblionumber}->{status}}=1;
+        $biblio->{failed_actions}=$report_actions{$biblionumber}->{failed_actions};
+    }
+    push @biblioinfos, $biblio;
+}
+
+$template->param(biblioinfos => \@biblioinfos);
+output_html_with_http_headers $input, $cookie, $template->output;
+exit;
-- 
1.7.1



More information about the Koha-patches mailing list