Bug 18426: Allow to edit subscriptions in batch
authorJulian Maurice <julian.maurice@biblibre.com>
Tue, 11 Apr 2017 16:07:47 +0000 (18:07 +0200)
committerJonathan Druart <jonathan.druart@bugs.koha-community.org>
Mon, 23 Apr 2018 17:22:13 +0000 (14:22 -0300)
This adds a checkbox column in serials-search.pl tables that allow to edit
selected subscriptions.
The following fields can be modified:
 - Bookseller
 - Location
 - Library
 - Item type
 - Public note
 - Nonpublic note
 - "Create item when receiving" flag
 - Expiration date
+ the additional fields defined in serials/add_fields.pl

Test plan:

1. Go to Serials module
2. If there is no additional fields defined, define some (at least one with an
   authorized value and one without)
3. Start a subscription search
4. Select some results using the checkboxes and click the "Edit" button above
   the table
5. Select values for some fields (not all) and click "Start batch edit"
6. Verify you are being redirected to the previous search results
7. Verify that the fields for which you selected a value were modified and that
   the others fields weren't
8. Repeat steps 4 to 7 but this time, modify the other fields.

Signed-off-by: Katrin Fischer <katrin.fischer.83@web.de>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>

koha-tmpl/intranet-tmpl/prog/en/modules/serials/serials-search.tt
koha-tmpl/intranet-tmpl/prog/en/modules/serials/subscription-batchedit.tt [new file with mode: 0644]
serials/subscription-batchedit.pl [new file with mode: 0755]

index 48cf07d..7ee6e70 100644 (file)
@@ -1,6 +1,7 @@
 [% USE Asset %]
 [% USE AuthorisedValues %]
 [% USE Branches %]
+[% USE CGI %]
 [% USE KohaDates %]
 [% SET footerjs = 1 %]
 [% INCLUDE 'doc-head-open.inc' %]
 
 
 [% BLOCK subscriptions_table %]
-    <table id="osrlt">
+  <form method="post">
+
+    [% url_params = [] %]
+    [% FOREACH param IN CGI.params.pairs %]
+        [% escaped_value = BLOCK %][% param.value | uri %][% END %]
+        [% url_params.push(param.key _ '=' _ escaped_value) %]
+    [% END %]
+    <input type="hidden" name="referrer" value="/cgi-bin/koha/serials/serials-search.pl?[% url_params.join('&') %]"/>
+
+    <div class="actions">
+        <a class="select-all" href="#"><i class="fa fa-check"></i> Select all</a>
+        |
+        <a class="clear-all" href="#"><i class="fa fa-remove"></i> Clear all</a>
+        |
+        <button class="btn btn-default btn-xs" type="submit" formaction="/cgi-bin/koha/serials/subscription-batchedit.pl"><i class="fa fa-pencil"></i> Edit</button>
+    </div>
+    <table>
       <thead>
         <tr>
+            <th></th>
             <th>ISSN</th>
             <th class="anti-the">Title</th>
             <th>Notes</th>
@@ -38,6 +56,7 @@
       </thead>
       <tfoot>
         <tr>
+          <td></td>
           <td><input type="text" class="dt-filter" data-column_num="0" placeholder="Search ISSN" /></td>
           <td><input type="text" class="dt-filter" data-column_num="1" placeholder="Search title" /></td>
           <td><input type="text" class="dt-filter" data-column_num="2" placeholder="Search notes" /></td>
@@ -57,6 +76,7 @@
         [% FOREACH subscription IN subscriptions %]
         [% UNLESS subscription.cannotdisplay %]
           <tr>
+            <td><input type="checkbox" name="subscriptionid" value="[% subscription.subscriptionid %]"/></td>
             <td>
             [% IF ( subscription.issn ) %][% subscription.issn %]
             [% END %]
         [% END %]
       </tbody>
     </table>
+  </form>
 [% END %]
 
 <div id="doc3" class="yui-t2">
             $("#reopensub").click(function(){
                 return confirm(_("Are you sure you want to reopen this subscription?"));
             });
+
+            $('.select-all, .clear-all').on('click', function(e) {
+                e.preventDefault();
+                var checkboxes = $(this).parents('form').find('input[type="checkbox"]');
+                checkboxes.prop('checked', $(this).hasClass('select-all'));
+            });
         });
     </script>
 [% END %]
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/serials/subscription-batchedit.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/serials/subscription-batchedit.tt
new file mode 100644 (file)
index 0000000..d2ca0e2
--- /dev/null
@@ -0,0 +1,153 @@
+[% USE AuthorisedValues %]
+[% USE Branches %]
+[% USE ItemTypes %]
+[% USE KohaDates %]
+[% INCLUDE 'doc-head-open.inc' %]
+    <title>Koha &rsaquo; Serials &rsaquo; Batch edit</title>
+    [% INCLUDE 'doc-head-close.inc' %]
+    [% INCLUDE 'calendar.inc' %]
+</head>
+<body id="ser_subscription-batchedit" class="ser">
+    [% INCLUDE 'header.inc' %]
+    [% INCLUDE 'serials-search.inc' %]
+
+    <div id="breadcrumbs">
+        <a href="/cgi-bin/koha/mainpage.pl">Home</a>
+        &rsaquo;
+        <a href="/cgi-bin/koha/serials/serials-home.pl">Serials</a>
+        &rsaquo;
+        Batch edit
+    </div>
+
+    <div id="doc3" class="yui-t2">
+        <div id="bd">
+            <div id="yui-main">
+                <div class="yui-b">
+                    <h1>Subscription batch edit</h1>
+
+                    <div>
+                        <p>You are about to edit the following subscriptions:</p>
+                        <table>
+                            <thead>
+                                <tr>
+                                    <th>ISSN</th>
+                                    <th>Title</th>
+                                    <th>Notes</th>
+                                    <th>Library</th>
+                                    <th>Location</th>
+                                    <th>Call number</th>
+                                    <th>Expiration date</th>
+                                </tr>
+                            </thead>
+                            <tbody>
+                                [% FOREACH subscription IN subscriptions %]
+                                    <tr>
+                                        <td>[% subscription.biblio.biblioitem.issn %]</td>
+                                        <td><a href="/cgi-bin/koha/serials/subscription-detail.pl?subscriptionid=[% subscription.subscriptionid %]">[% subscription.biblio.title %] (#[% subscription.subscriptionid %])</a></td>
+                                        <td>[% subscription.notes %] [% IF subscription.internalnotes %]([% subscription.internalnotes %])[% END %]</td>
+                                        <td>[% Branches.GetName(subscription.branchcode) %]</td>
+                                        <td>[% AuthorisedValues.GetByCode('LOC', subscription.location) %]</td>
+                                        <td>[% subscription.callnumber %]</td>
+                                        <td>[% subscription.enddate | $KohaDates %]</td>
+                                    </tr>
+                                [% END %]
+                            </tbody>
+                        </table>
+                    </div>
+
+                    <form method="post">
+                        [% FOREACH subscription IN subscriptions %]
+                            <input type="hidden" name="subscriptionid" value="[% subscription.subscriptionid %]"/>
+                        [% END %]
+                        [% IF referrer %]
+                            <input type="hidden" name="referrer" value="[% referrer %]"/>
+                        [% END %]
+                        <fieldset class="rows">
+                            <ol>
+                                <li>
+                                    <label for="booksellerid">Bookseller</label>
+                                    <select id="booksellerid" name="booksellerid">
+                                        <option value="">No change</option>
+                                        [% FOREACH bookseller IN booksellers %]
+                                            <option value="[% bookseller.id %]">[% bookseller.name %]</option>
+                                        [% END %]
+                                    </select>
+                                </li>
+                                <li>
+                                    <label for="location">Location</label>
+                                    <select id="location" name="location">
+                                        <option value="">No change</option>
+                                        [% FOREACH av IN AuthorisedValues.Get('LOC') %]
+                                            <option value="[% av.authorised_value | html %]">[% av.lib %]</option>
+                                        [% END %]
+                                    </select>
+                                </li>
+                                <li>
+                                    <label for="branchcode">Library</label>
+                                    <select id="branchcode" name="branchcode">
+                                        <option value="">No change</option>
+                                        [% FOREACH branch IN Branches.all %]
+                                            <option value="[% branch.branchcode | html %]">[% branch.branchname %]</option>
+                                        [% END %]
+                                    </select>
+                                </li>
+                                <li>
+                                    <label for="itemtype">Item type</label>
+                                    <select id="itemtype" name="itemtype">
+                                        <option value="">No change</option>
+                                        [% FOREACH itemtype IN ItemTypes.Get() %]
+                                            <option value="[% itemtype.itemtype %]">[% itemtype.description %]</option>
+                                        [% END %]
+                                    </select>
+                                </li>
+                                <li>
+                                    <label for="notes">Public note</label>
+                                    <textarea id="notes" name="notes" placeholder="No change"></textarea>
+                                </li>
+                                <li>
+                                    <label for="internalnotes">Nonpublic note</label>
+                                    <textarea id="internalnotes" name="internalnotes" placeholder="No change"></textarea>
+                                </li>
+                                <li>
+                                    <label for="serialsadditems">Create item when receiving</label>
+                                    <select id="serialsadditems" name="serialsadditems">
+                                        <option value="">No change</option>
+                                        <option value="0">No</option>
+                                        <option value="1">Yes</option>
+                                    </select>
+
+                                </li>
+                                <li>
+                                    <label for="enddate">Expiration date</label>
+                                    <input type="date" class="datepicker" id="enddate" name="enddate" placeholder="No change"/>
+                                </li>
+                                [% FOREACH field IN additional_fields %]
+                                    <li>
+                                        <label for="field_[% field.id %]">[% field.name %]</label>
+                                        [% IF field.authorised_value_category %]
+                                            <select id="field_[% field.id %]" name="field_[% field.id %]">
+                                                <option value="">No change</option>
+                                                [% FOREACH av IN AuthorisedValues.Get(field.authorised_value_category) %]
+                                                    <option value="[% av.authorised_value %]">[% av.lib %]</option>
+                                                [% END %]
+                                            </select>
+                                        [% ELSE %]
+                                            <input id="field_[% field.id %]" name="field_[% field.id %]" placeholder="No change"/>
+                                        [% END %]
+                                    </li>
+                                [% END %]
+                            </ol>
+                        </fieldset>
+
+                        <fieldset class="action">
+                            <button type="submit" name="batchedit" value="1">Start batch edit</button>
+                        </fieldset>
+                    </form>
+                </div>
+            </div>
+            <div class="yui-b">
+                [% INCLUDE 'serials-menu.inc' %]
+            </div>
+        </div>
+
+    [% INCLUDE 'intranet-bottom.inc' %]
diff --git a/serials/subscription-batchedit.pl b/serials/subscription-batchedit.pl
new file mode 100755 (executable)
index 0000000..865116a
--- /dev/null
@@ -0,0 +1,107 @@
+#!/usr/bin/perl
+
+# Copyright 2017 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 3 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, see <http://www.gnu.org/licenses>.
+
+use Modern::Perl;
+
+use CGI qw( -utf8 );
+
+use C4::Auth;
+use C4::Output;
+use Koha::Subscriptions;
+use Koha::Acquisition::Booksellers;
+use Koha::AdditionalField;
+use Koha::DateUtils;
+
+my $cgi = new CGI;
+
+my ($template, $loggedinuser, $cookie) = get_template_and_user({
+    template_name => 'serials/subscription-batchedit.tt',
+    query => $cgi,
+    type => 'intranet',
+    authnotrequired => 0,
+    flagsrequired => {serials => 'edit_subscription'},
+});
+
+my @subscriptionids = $cgi->multi_param('subscriptionid');
+
+my @subscriptions;
+foreach my $subscriptionid (@subscriptionids) {
+    my $subscription = Koha::Subscriptions->find($subscriptionid);
+
+    push @subscriptions, $subscription if $subscription;
+}
+
+my $additional_fields = Koha::AdditionalField->all({tablename => 'subscription'});
+
+my $batchedit = $cgi->param('batchedit');
+if ($batchedit) {
+    my %params = (
+        aqbooksellerid => scalar $cgi->param('booksellerid'),
+        location => scalar $cgi->param('location'),
+        branchcode => scalar $cgi->param('branchcode'),
+        itemtype => scalar $cgi->param('itemtype'),
+        notes => scalar $cgi->param('notes'),
+        internalnotes => scalar $cgi->param('internalnotes'),
+        serialsadditems => scalar $cgi->param('serialsadditems'),
+        enddate => dt_from_string(scalar $cgi->param('enddate')),
+    );
+
+    my $field_values = {};
+    foreach my $field (@$additional_fields) {
+        my $value = $cgi->param('field_' . $field->{id});
+        $field_values->{$field->{id}} = $value;
+    }
+
+    foreach my $subscription (@subscriptions) {
+        while (my ($key, $value) = each %params) {
+            if (defined $value and $value ne '') {
+                $subscription->$key($value);
+            }
+        }
+
+        foreach my $field (@$additional_fields) {
+            my $value = $field_values->{$field->{id}};
+            if (defined $value and $value ne '') {
+                $field->{values} //= {};
+                $field->{values}->{$subscription->subscriptionid} = $value;
+            }
+        }
+
+        $subscription->store;
+    }
+
+    foreach my $field (@$additional_fields) {
+        if (defined $field->{values}) {
+            $field->insert_values();
+        }
+    }
+
+    my $redirect_url = $cgi->param('referrer') // '/cgi-bin/koha/serials/serials-home.pl';
+    print $cgi->redirect($redirect_url);
+    exit;
+}
+
+$template->param(
+    subscriptions => \@subscriptions,
+    booksellers => [ Koha::Acquisition::Booksellers->search() ],
+    additional_fields => $additional_fields,
+    referrer => scalar $cgi->param('referrer'),
+);
+
+output_html_with_http_headers $cgi, $cookie, $template->output;