[Koha-patches] [PATCH] Bug 5725 : Batch Modifications for Biblios

Chris Cormack chrisc at catalyst.net.nz
Mon Feb 21 20:45:38 CET 2011


Squashed commit of the following:

commit 66282fed94564969f0368e27c7231116a2d1c0fe
Author: Chris Cormack <chrisc at catalyst.net.nz>
Date:   Tue Feb 22 08:43:24 2011 +1300

    Bug 5725 : Follow up fixing permissions thanks to Paul Poulain

commit 4d0241aea5be13b00abbc6100dc98ec87f816081
Author: Paul Poulain <paul.poulain at biblibre.com>
Date:   Mon Jan 10 17:22:31 2011 +0100

    Bug 5725 follow up

    Owen noticed the batchedit was not working. This was because we made a patch months ago to change the GetBiblio API
    (the 1st returned arg is useless)
    This patch is not in main trunk, resulting in the error owen has noticed.

    This patch goes back to official API (even if it is clumsy : the patch we did does not apply anymore)

commit 19b3e0ecc57af1c2151340328bf06e26882b7863
Author: Paul Poulain <paul.poulain at biblibre.com>
Date:   Wed Dec 15 20:47:21 2010 +0100

    Bug 5725 : MT #2991 (Feature) Batch biblio modifications

    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 9946cf7..03dc306 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..ccc0323
--- /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 => { tools => "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 ($count, $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 ($count,$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