From e3cf3c1daa1c80bba9dcaff8d1e540d12e61f186 Mon Sep 17 00:00:00 2001
From: morgane alonso <morgane.alonso@biblibre.com>
Date: Thu, 25 Aug 2016 10:06:12 +0000
Subject: [PATCH] Bug 17047 ability to search subscription model on mana

- add a class SharedContent.pm to communicate with mana server
- add a link in serials-menu.inc to serials_search.pl to open
a mana-subscription research form
- modify the research form in serials-search.tt to show the right fields
for mana
- create datatable in mana-subscription-search-result.inc to show
results from a research on mana
- modify serials-search.pl to manage research on mana
---
 Koha/SharedContent.pm                              |  56 ++++++++++
 .../includes/mana-subscription-search-result.inc   |  40 +++++++
 .../prog/en/includes/serials-menu.inc              |   3 +
 .../prog/en/modules/serials/serials-home.tt        |   1 +
 .../prog/en/modules/serials/serials-search.tt      |  49 +++++++--
 serials/serials-search.pl                          | 121 +++++++++++++++------
 6 files changed, 227 insertions(+), 43 deletions(-)
 create mode 100644 Koha/SharedContent.pm
 create mode 100644 koha-tmpl/intranet-tmpl/prog/en/includes/mana-subscription-search-result.inc

diff --git a/Koha/SharedContent.pm b/Koha/SharedContent.pm
new file mode 100644
index 0000000..ced0e6c
--- /dev/null
+++ b/Koha/SharedContent.pm
@@ -0,0 +1,56 @@
+package Koha::SharedContent;
+
+# Copyright 2016 BibLibre Morgane Alonso
+#
+# 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, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+use Modern::Perl;
+use JSON;
+use HTTP::Request;
+use LWP::UserAgent;
+
+our $MANA_IP = "http://10.25.159.107:5000";
+
+sub manaRequest {
+    my $mana_request = shift;
+    my $result;
+
+    $mana_request->content_type('application/json');
+    my $userAgent = LWP::UserAgent->new;
+    my $response  = $userAgent->request($mana_request);
+
+    if ( $response->code ne "204" ) {
+        $result = from_json( $response->decoded_content );
+    }
+    $result->{code} = $response->code;
+
+    return $result if ( $response->code =~ /^2..$/ );
+}
+
+sub manaGetRequest {
+    my $resource   = shift;
+    my $parameters = shift;
+
+    $parameters = join '&',
+      map { defined $parameters->{$_} ? $_ . "=" . $parameters->{$_} : () }
+      keys %$parameters;
+    my $url = "$MANA_IP/$resource.json?$parameters";
+    my $request = HTTP::Request->new( GET => $url );
+
+    return manaRequest($request);
+}
+
+1;
diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/mana-subscription-search-result.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/mana-subscription-search-result.inc
new file mode 100644
index 0000000..acaadec
--- /dev/null
+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/mana-subscription-search-result.inc
@@ -0,0 +1,40 @@
+[% USE KohaDates %]
+<table id="mana_results_datatable">
+    <thead>
+        <tr>
+            <th>ISSN</th>
+            <th class="anti-the">Title</th>
+            <th>Frequency</th>
+            <th>Numbering pattern</th>
+            <th class="NoSort">Number of users</th>
+            <th class="title-string">Last Import</th>
+            <th class="NoSort">Actions</th>
+        </tr>
+    </thead>
+    <tfoot>
+        <tr>
+            <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 frequency" /></td>
+            <td><input type="text" class="dt-filter" data-column_num="3" placeholder="Search numbering pattern" /></td>
+            <td></td>
+            <td><input type="text" class="dt-filter" data-column_num="5" placeholder="Search last import" /></td>
+            <td></td>
+        </tr>
+    </tfoot>
+    <tbody>
+        [% FOREACH subscription IN subscriptions %]
+            [% UNLESS subscription.cannotdisplay %]
+                <tr id="row[% subscription.subscriptionid %]">
+                    <td>[% IF ( subscription.issn ) %][% subscription.issn %][% END %]</td>
+                    <td>[% subscription.title %]</a></td>
+                    <td>[% IF ( subscription.sfdescription ) %][% subscription.sfdescription %][% END %]</td>
+                    <td>[% IF ( subscription.numberingmethod ) %][% subscription.numberingmethod %][% END %]</td>
+                    <td>[% IF ( subscription.nbofusers ) %][% subscription.nbofusers %][% END %]</td>
+                    <td><span title="[% subscription.lastimport %]">[% subscription.lastimport | $KohaDates %]</span></td>
+                    <td><a style="cursor:pointer" onclick="mana_use([% subscription.id %])"> <i class="fa fa-inbox"></i> Use</a></td>
+                </tr>
+            [% END %]
+        [% END %]
+    </tbody>
+</table>
diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/serials-menu.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/serials-menu.inc
index 21dff3a..ee66508 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/includes/serials-menu.inc
+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/serials-menu.inc
@@ -31,4 +31,7 @@
         </a>
     </li>
     <li><a href="/cgi-bin/koha/serials/add_fields.pl">Add subscription fields</a></li>
+    [% IF Koha.Preference('Mana') %]
+        <li><a href="/cgi-bin/koha/serials/serials-search.pl?mana=1">Search on Mana</a></li>
+    [% END %]
 </ul>
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/serials/serials-home.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/serials/serials-home.tt
index eaafc94..f587b28 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/serials/serials-home.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/serials/serials-home.tt
@@ -1,5 +1,6 @@
 [% INCLUDE 'doc-head-open.inc' %]
 [% USE KohaDates %]
+[% USE Koha %]
 <title>Koha &rsaquo; Serials [% biblionumber %]</title>
 [% INCLUDE 'doc-head-close.inc' %]
 </head>
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/serials/serials-search.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/serials/serials-search.tt
index 1728fb0..6131ed1 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/serials/serials-search.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/serials/serials-search.tt
@@ -1,6 +1,7 @@
 [% USE Branches %]
 [% INCLUDE 'doc-head-open.inc' %]
 [% USE KohaDates %]
+[% USE Koha %]
 [% USE AuthorisedValues %]
 <title>Koha &rsaquo; Serials [% biblionumber %]</title>
 [% INCLUDE 'doc-head-close.inc' %]
@@ -10,6 +11,14 @@
 <script type="text/javascript">
 //<![CDATA[
  $(document).ready(function() {
+    var manarlt = $("#mana_results_datatable").dataTable($.extend(true, {}, dataTablesDefaults, {
+        "sPaginationType": "four_button",
+        "aoColumnDefs": [
+            { 'bSortable': false, "bSearchable": false, 'aTargets': [ 'NoSort' ] },
+            { "sType": "title-string", "aTargets" : [ "title-string" ] },
+            { 'sType': "anti-the", 'aTargets' : [ 'anti-the'] }
+        ]
+    } ) );
     var osrlt = $("#osrlt").dataTable($.extend(true, {}, dataTablesDefaults, {
         "sPaginationType": "four_button",
         "aoColumnDefs": [
@@ -28,6 +37,7 @@
         ]
     } ) );
 
+    manarlt.fnAddFilters("dt-filter", 750);
     osrlt.fnAddFilters("dt-filter", 750);
     csrlt.fnAddFilters("dt-filter", 750);
 
@@ -35,6 +45,17 @@
     $("#reopensub").click(function(){
       return confirm(_("Are you sure you want to reopen this subscription?"));
     });
+    [% IF ( mana ) %]
+        $("label[for=callnumber], input#callnumber").hide();
+        $("label[for=bookseller], input#bookseller").hide();
+        $("label[for=branch], select#branch").hide();
+        $("label[for=to], input#to").hide();
+        $(".ui-datepicker-trigger").hide();
+        $("label[for=location], select#location_filter").hide();
+        [% FOR field IN additional_fields_for_subscription %]
+              $("label[for=additional_field_[% field.id %]], input#additional_field_[% field.id %]").hide();
+        [% END %]
+    [% END %]
  });
  //]]>
 </script>
@@ -123,6 +144,7 @@
                 [% END %]
               </ol>
               <input type="hidden" name="searched" value="1" />
+              [% IF ( mana ) %]<input type="hidden" name="mana" value="1" />[% END %]
               <fieldset class="action">
                 <input type="submit" value="Search" />
               </fieldset>
@@ -130,13 +152,22 @@
         </form>
       </div>
       [% END %]
-      [% IF ( done_searched ) %]
-        [% IF ( total ) %]
-          <div id="serialstabs" class="toptabs" style="clear:both;">
-            <ul class="ui-tabs-nav">
-              <li><a href="#opened">Open ([% openedsubscriptions.size || 0 %])</a></li>
-              <li><a href="#closed">Closed ([% closedsubscriptions.size || 0 %])</a></li>
-            </ul>
+            [% IF ( done_searched ) %]
+                [% IF ( total ) %]
+                    <div id="serialstabs" class="toptabs" style="clear:both;">
+                        <ul class="ui-tabs-nav">
+                            [% IF mana %]
+                                <li><a href="#mana">Mana ([% total || 0 %])</a></li>
+                            [% ELSE %]
+                                <li><a href="#opened">Open ([% openedsubscriptions.size || 0 %])</a></li>
+                                <li><a href="#closed">Closed ([% closedsubscriptions.size || 0 %])</a></li>
+                            [% END %]
+                        </ul>
+                        [% IF mana %]
+                            <div id="mana">
+                                [% INCLUDE 'mana-subscription-search-result.inc' %]
+                            </div>
+                        [% ELSE %]
             <div id="opened">
               [% IF openedsubscriptions %]
                 <table id="osrlt">
@@ -354,6 +385,7 @@
                 </div>
               [% END %]
             </div>
+            [% END %]
           </div>
         [% ELSE %]
             <div class="dialog message">
@@ -367,6 +399,7 @@
   <div class="yui-b">
     [% INCLUDE 'serials-menu.inc' %]
     [% IF ( done_searched ) %]
+    [% UNLESS ( mana ) %]
     <div id="advsearch">
         <form action="/cgi-bin/koha/serials/serials-search.pl" method="get">
           <fieldset class="brief">
@@ -439,10 +472,12 @@
               <fieldset class="action">
                 <input type="submit" value="Search" />
               </fieldset>
+
             </div>
           </fieldset>
         </form>
       [% END %]
+    [% END %]
   </div>
 </div>
 [% INCLUDE 'intranet-bottom.inc' %]
diff --git a/serials/serials-search.pl b/serials/serials-search.pl
index 30bf7db..bd52cd7 100755
--- a/serials/serials-search.pl
+++ b/serials/serials-search.pl
@@ -38,6 +38,7 @@ use C4::Serials;
 use Koha::AdditionalField;
 
 use Koha::DateUtils;
+use Koha::SharedContent;
 
 my $query         = new CGI;
 my $title         = $query->param('title_filter') || '';
@@ -52,6 +53,7 @@ my $location      = $query->param('location_filter') || '';
 my $expiration_date = $query->param('expiration_date_filter') || '';
 my $routing       = $query->param('routing') || C4::Context->preference("RoutingSerials");
 my $searched      = $query->param('searched') || 0;
+my $mana      = $query->param('mana') || 0;
 my @subscriptionids = $query->multi_param('subscriptionid');
 my $op            = $query->param('op');
 
@@ -95,7 +97,17 @@ for my $field ( @$additional_fields ) {
 my $expiration_date_dt = $expiration_date ? dt_from_string( $expiration_date ) : undef;
 my @subscriptions;
 if ($searched){
-    @subscriptions = SearchSubscriptions(
+    if ($mana) {
+        my $result = Koha::SharedContent::manaGetRequest("subscription",{
+            title        => $title,
+            issn         => $ISSN,
+            ean          => $EAN,
+            publisher    => $publisher
+        });
+        @subscriptions = @{ $result->{data} };
+    }
+    else {
+        @subscriptions = SearchSubscriptions(
         {
             biblionumber => $biblionumber,
             title        => $title,
@@ -108,46 +120,83 @@ if ($searched){
             additional_fields => [ map{ { name => $_, value => $additional_field_filters->{$_}{value}, authorised_value_category => $additional_field_filters->{$_}{authorised_value_category} } } keys %$additional_field_filters ],
             location     => $location,
             expiration_date => $expiration_date_dt,
-        }
-    );
+        });
+    }
 }
 
-# to toggle between create or edit routing list options
-if ($routing) {
-    for my $subscription ( @subscriptions) {
-        $subscription->{routingedit} = check_routing( $subscription->{subscriptionid} );
-    }
+if ($mana) {
+    $template->param(
+        subscriptions => \@subscriptions,
+        total         => scalar @subscriptions,
+        title_filter  => $title,
+        ISSN_filter   => $ISSN,
+        EAN_filter    => $EAN,
+        callnumber_filter => $callnumber,
+        publisher_filter => $publisher,
+        bookseller_filter  => $bookseller,
+        branch_filter => $branch,
+        location_filter => $location,
+        expiration_date_filter => $expiration_date_dt,
+        done_searched => $searched,
+        routing       => $routing,
+        additional_field_filters => $additional_field_filters,
+        additional_fields_for_subscription => $additional_fields,
+        marcflavour   => (uc(C4::Context->preference("marcflavour"))),
+        mana => $mana
+    );
 }
+else
+{
+    # to toggle between create or edit routing list options
+    if ($routing) {
+        for my $subscription ( @subscriptions) {
+            $subscription->{routingedit} = check_routing( $subscription->{subscriptionid} );
+        }
+    }
 
-my (@openedsubscriptions, @closedsubscriptions);
-for my $sub ( @subscriptions ) {
-    unless ( $sub->{closed} ) {
-        push @openedsubscriptions, $sub
-            unless $sub->{cannotdisplay};
-    } else {
-        push @closedsubscriptions, $sub
-            unless $sub->{cannotdisplay};
+    my (@openedsubscriptions, @closedsubscriptions);
+    for my $sub ( @subscriptions ) {
+        unless ( $sub->{closed} ) {
+            push @openedsubscriptions, $sub
+                unless $sub->{cannotdisplay};
+        } else {
+            push @closedsubscriptions, $sub
+                unless $sub->{cannotdisplay};
+        }
     }
-}
 
-$template->param(
-    openedsubscriptions => \@openedsubscriptions,
-    closedsubscriptions => \@closedsubscriptions,
-    total         => @openedsubscriptions + @closedsubscriptions,
-    title_filter  => $title,
-    ISSN_filter   => $ISSN,
-    EAN_filter    => $EAN,
-    callnumber_filter => $callnumber,
-    publisher_filter => $publisher,
-    bookseller_filter  => $bookseller,
-    branch_filter => $branch,
-    location_filter => $location,
-    expiration_date_filter => $expiration_date_dt,
-    done_searched => $searched,
-    routing       => $routing,
-    additional_field_filters => $additional_field_filters,
-    additional_fields_for_subscription => $additional_fields,
-    marcflavour   => (uc(C4::Context->preference("marcflavour")))
-);
+    my $branches = GetBranches();
+    my @branches_loop;
+    foreach (sort keys %$branches){
+        my $selected = 0;
+        $selected = 1 if( defined $branch and $branch eq $_ );
+        push @branches_loop, {
+            branchcode  => $_,
+            branchname  => $branches->{$_}->{'branchname'},
+            selected    => $selected,
+        };
+    }
 
+    $template->param(
+        openedsubscriptions => \@openedsubscriptions,
+        closedsubscriptions => \@closedsubscriptions,
+        total         => @openedsubscriptions + @closedsubscriptions,
+        title_filter  => $title,
+        ISSN_filter   => $ISSN,
+        EAN_filter    => $EAN,
+        callnumber_filter => $callnumber,
+        publisher_filter => $publisher,
+        bookseller_filter  => $bookseller,
+        branch_filter => $branch,
+        location_filter => $location,
+        expiration_date_filter => $expiration_date_dt,
+        branches_loop => \@branches_loop,
+        done_searched => $searched,
+        routing       => $routing,
+        additional_field_filters => $additional_field_filters,
+        additional_fields_for_subscription => $additional_fields,
+        marcflavour   => (uc(C4::Context->preference("marcflavour"))),
+        mana => $mana
+    );
+}
 output_html_with_http_headers $query, $cookie, $template->output;
-- 
2.7.4