From 8535f22ffca4e87c88533920fb654c67cbc3682a Mon Sep 17 00:00:00 2001
From: jeremy breuillard <jeremy.breuillard@biblibre.com>
Date: Wed, 15 Dec 2021 15:24:41 +0100
Subject: [PATCH] Bug 29983: Display the pretend claim column in overdue.tt

This patch displays the column "Return claims" from the page "moremember.pl" to the page "overdues.pl"

Test plan:
1)Use a patron with at least 1 item who should be checked out soon
2)Home > Patron > Patron details for [name]
3)Click on the 'Checkout' button down the page to show the full table and notice the "Return Claims" column
4)Now go to Home > Circulation > Overdues
5)Find the patron who has to check out and have a look at the table
6)Apply patch and repeat 4) and 5) -> the "Return Claim" column is now displayed on the table
---
 circ/overdue.pl                               |  12 +-
 .../prog/en/includes/checkouts-table.inc      |  37 +------
 .../prog/en/includes/js-date-format.inc       |   2 +-
 .../prog/en/includes/modal-claims.inc         | 104 ++++++++++++++++++
 .../prog/en/modules/circ/overdue.tt           |  27 ++++-
 .../prog/en/modules/members/moremember.tt     |   5 +-
 koha-tmpl/intranet-tmpl/prog/js/checkouts.js  |  52 +--------
 7 files changed, 150 insertions(+), 89 deletions(-)
 create mode 100644 koha-tmpl/intranet-tmpl/prog/en/includes/modal-claims.inc

diff --git a/circ/overdue.pl b/circ/overdue.pl
index 1ce791fe24..88b8c822b8 100755
--- a/circ/overdue.pl
+++ b/circ/overdue.pl
@@ -248,12 +248,15 @@ if ($noreport) {
         items.replacementprice,
         items.enumchron,
         items.itemnotes_nonpublic,
-        items.itype
+        items.itype,
+        return_claims.created_on AS return_claim_created_on,
+        return_claims.id AS return_claim_id
       FROM issues
     LEFT JOIN borrowers   ON (issues.borrowernumber=borrowers.borrowernumber )
     LEFT JOIN items       ON (issues.itemnumber=items.itemnumber)
     LEFT JOIN biblioitems ON (biblioitems.biblioitemnumber=items.biblioitemnumber)
     LEFT JOIN biblio      ON (biblio.biblionumber=items.biblionumber )
+    LEFT JOIN return_claims ON (return_claims.borrowernumber=borrowers.borrowernumber AND return_claims.itemnumber=items.itemnumber)
     WHERE 1=1 "; # placeholder, since it is possible that none of the additional
                  # conditions will be selected by user
     $strsth.=" AND date_due               < '" . $todaysdate     . "' " unless ($showall);
@@ -301,6 +304,11 @@ if ($noreport) {
         my $pattrs = $borrowernumber_to_attributes{$data->{borrowernumber}} || {};  # patron attrs for this borrower
         # $pattrs is a hash { attrcode => [  [value,displayvalue], [value,displayvalue]... ] }
 
+        my $return_claim_created_on = $data->{return_claim_created_on};
+        if ( defined $return_claim_created_on ) {
+            $return_claim_created_on = output_pref({ dt => dt_from_string( $return_claim_created_on ) });
+        }
+
         my @patron_attr_value_loop;   # template array [ {value=>v1}, {value=>v2} ... } ]
         for my $pattr_filter (grep { ! $_->{isclone} } @patron_attr_filter_loop) {
             my @displayvalues = map { $_->[1] } @{ $pattrs->{$pattr_filter->{code}} };   # grab second value from each subarray
@@ -336,6 +344,8 @@ if ($noreport) {
             itemcallnumber         => $data->{itemcallnumber},
             replacementprice       => $data->{replacementprice},
             itemnotes_nonpublic    => $data->{itemnotes_nonpublic},
+            return_claim_created_on => $return_claim_created_on,
+            return_claim_id        => $data->{return_claim_id},
             enumchron              => $data->{enumchron},
             itemtype               => $data->{itype},
             patron_attr_value_loop => \@patron_attr_value_loop,
diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/checkouts-table.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/checkouts-table.inc
index 38a4700416..34f86e6f90 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/includes/checkouts-table.inc
+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/checkouts-table.inc
@@ -1,4 +1,5 @@
 [% USE Koha %]
+[% PROCESS 'modal-claims.inc' %]
 <div id="checkouts">
     [% IF ( issuecount ) %]
         <div id="issues-table-loading-message">
@@ -92,41 +93,7 @@
 </div>
 
 <!-- Claims Returned Modal -->
-<div class="modal fade" id="claims-returned-modal" tabindex="-1" role="dialog" aria-labelledby="claims-returned-modal-label">
-  <div class="modal-dialog" role="document">
-    <div class="modal-content">
-      <div class="modal-header">
-        <h4 class="modal-title" id="claims-returned-modal-label">Claim returned</h4>
-      </div>
-      <div class="modal-body">
-
-          <div class="form-group">
-            <label for="claims-returned-notes" class="control-label">Notes</label>
-            <div>
-              <textarea id="claims-returned-notes" class="form-control" rows="3"></textarea>
-            </div>
-          </div>
-
-          [% IF Koha.Preference('ClaimReturnedChargeFee') == 'ask' %]
-            <div class="form-group">
-              <div class="checkbox">
-                <label for="claims-returned-charge-lost-fee">
-                  <input id="claims-returned-charge-lost-fee" type="checkbox" value="1">
-                  Charge lost fee
-                </label>
-              </div>
-            </div>
-          [% END %]
-
-          <input type="hidden" id="claims-returned-itemnumber" />
-      </div>
-      <div class="modal-footer">
-        <button id="claims-returned-modal-btn-submit" type="button" class="btn btn-primary"><i class="fa fa-exclamation-circle"></i> Make claim</button>
-        <button class="btn btn-default deny cancel" href="#" data-dismiss="modal" aria-hidden="true"><i class="fa fa-times"></i> Cancel</button>
-      </div>
-    </div>
-  </div>
-</div>
+[% PROCESS 'modal-claims-display' %]
 
 <!-- Resolve Return Claim Modal -->
 <div class="modal fade" id="claims-returned-resolved-modal" tabindex="-1" role="dialog" aria-labelledby="claims-returned-resolved-modal-label">
diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/js-date-format.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/js-date-format.inc
index 3dae094b8d..92445eca31 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/includes/js-date-format.inc
+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/js-date-format.inc
@@ -57,7 +57,7 @@
 
         window.$time = function(value, options) {
             if(!value) return '';
-            var tz = (opitons&&options.tz)||def_tz;
+            var tz = (options&&options.tz)||def_tz;
             var m = moment(value);
             if(tz) m.tz(tz);
 
diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/modal-claims.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/modal-claims.inc
new file mode 100644
index 0000000000..bb0e408d41
--- /dev/null
+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/modal-claims.inc
@@ -0,0 +1,104 @@
+
+[% USE Koha %]
+<!-- modal-claims.inc -->
+
+[% BLOCK 'modal-claims-display' %]
+    <!-- Claims Returned Modal -->
+    <div class="modal fade" id="claims-returned-modal" tabindex="-1" role="dialog" aria-labelledby="claims-returned-modal-label">
+        <div class="modal-dialog" role="document">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <h4 class="modal-title" id="claims-returned-modal-label">Claim returned</h4>
+                </div>
+                <div class="modal-body">
+
+                    <div class="form-group">
+                        <label for="claims-returned-notes" class="control-label">Notes</label>
+                        <div>
+                        <textarea id="claims-returned-notes" class="form-control" rows="3"></textarea>
+                        </div>
+                    </div>
+
+                    [% IF Koha.Preference('ClaimReturnedChargeFee') == 'ask' %]
+                        <div class="form-group">
+                        <div class="checkbox">
+                            <label for="claims-returned-charge-lost-fee">
+                            <input id="claims-returned-charge-lost-fee" type="checkbox" value="1">
+                            Charge lost fee
+                            </label>
+                        </div>
+                        </div>
+                    [% END %]
+
+                    <input type="hidden" id="claims-returned-itemnumber" />
+                </div>
+                <div class="modal-footer">
+                    <button id="claims-returned-modal-btn-submit" type="button" class="btn btn-primary"><i class="fa fa-exclamation-circle"></i> Make claim</button>
+                    <button class="btn btn-default deny cancel" href="#" data-dismiss="modal" aria-hidden="true"><i class="fa fa-times"></i> Cancel</button>
+                </div>
+            </div>
+        </div>
+    </div>
+[% END %] 
+
+[% BLOCK 'modal-claims-js' %]
+<script>
+
+    // Verify if the syspref is defined
+    var ClaimReturnedLostValue = "[% Koha.Preference('ClaimReturnedLostValue') | html %]";
+
+    var logged_in_user_borrowernumber = "[% logged_in_user.borrowernumber | html %]";
+    var interface = "[% interface | html %]";
+    var theme = "[% theme | html %]";
+
+    // Handle return claims
+    $(document).on("click", '.claim-returned-btn', function(e){
+        e.preventDefault();
+        itemnumber = $(this).data('itemnumber');
+
+        $('#claims-returned-itemnumber').val(itemnumber);
+        $('#claims-returned-notes').val("");
+        $('#claims-returned-charge-lost-fee').attr('checked', false);
+        $('#claims-returned-modal').modal();
+    });
+    $(document).on("click", '#claims-returned-modal-btn-submit', function(e){
+        let itemnumber = $('#claims-returned-itemnumber').val();
+        let notes = $('#claims-returned-notes').val();
+        let fee = $('#claims-returned-charge-lost-fee').attr('checked') ? true : false;
+
+        $('#claims-returned-modal').modal('hide');
+
+        const button = $('.claim-returned-btn[data-itemnumber="' + itemnumber + '"]');
+        const img = '<img id="return_claim_spinner_' + itemnumber + '" src="' + interface + '/' + theme + '/img/spinner-small.gif" />';
+        button.replaceWith(img);
+
+        params = {
+            item_id: itemnumber,
+            notes: notes,
+            charge_lost_fee: fee,
+            created_by: logged_in_user_borrowernumber,
+        };
+
+        $.post( '/api/v1/return_claims', JSON.stringify(params), function( data ) {
+
+            id = "#return_claim_spinner_" + data.item_id;
+
+            let created_on = new Date(data.created_on);
+            let formated_date = $datetime(created_on);
+
+            let content = "";
+            if ( data.claim_id ) {
+                content = '<span class="badge">' + formated_date + '</span>';
+                $(id).parent().parent().addClass('ok');
+            } else {
+                content = __("Unable to claim as returned");
+                $(id).parent().parent().addClass('warn');
+            }
+            
+            $(id).replaceWith( content );
+
+            $('body').trigger('refreshClaimModal');
+        }, "json")
+    });
+</script>
+[% END %]
\ No newline at end of file
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/overdue.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/overdue.tt
index 7d14c2662d..8a6532d112 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/overdue.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/overdue.tt
@@ -2,6 +2,7 @@
 [% USE Asset %]
 [% USE AuthorisedValues %]
 [% USE KohaDates %]
+[% USE Koha %]
 [%- USE Branches -%]
 [%- USE Price -%]
 [%- USE ItemTypes -%]
@@ -9,6 +10,7 @@
 [%- USE TablesSettings -%]
 [% SET footerjs = 1 %]
 [% INCLUDE 'doc-head-open.inc' %]
+[% PROCESS 'modal-claims.inc' %]
 <title>Koha &rsaquo; Circulation &rsaquo; Items overdue as of [% todaysdate | html %]</title>
 [% INCLUDE 'doc-head-close.inc' %]
 [% FILTER collapse %]
@@ -77,6 +79,7 @@
           <th>Item type</th>
           <th>Price</th>
           <th>Non-public note</th>
+          <th>Return claims</th>
         </tr>
       </thead>
       [%- BLOCK subject -%]Overdue:[%- END -%]
@@ -100,12 +103,28 @@
             <td>[% ItemTypes.GetDescription( overdueloo.itemtype ) | html %]</td>
           <td>[% overdueloo.replacementprice | $Price %]</td>
           <td>[% overdueloo.itemnotes_nonpublic | html %]</td>
+          <td>
+            [% IF ( overdueloo.return_claim_created_on ) %]
+                <span class="badge">[% overdueloo.return_claim_created_on %]</span>
+            [% ELSIF Koha.Preference('ClaimReturnedLostValue') %]
+                <a class="btn btn-default btn-xs claim-returned-btn" data-itemnumber=[% overdueloo.itemnum | html %]>
+                    <i class="fa fa-exclamation-circle"></i> Claim returned
+                </a>
+            [% ELSE %]
+                <a class="btn btn-default btn-xs" disabled="disabled" title="ClaimReturnedLostValue is not set, this feature is disabled">
+                    <i class="fa fa-exclamation-circle"></i> Claim returned
+                </a>    
+            [% END %]
+          </td>
         </tr>
       [% END %]
-      </tbody>
+     </tbody>
     </table>
   </div>
 
+  <!-- Claims Returned Modal -->
+    [% PROCESS 'modal-claims-display' %]
+
 [% ELSE %]
 
   <h2>Overdue report</h2>
@@ -249,7 +268,11 @@
     [% INCLUDE 'datatables.inc' %]
     [% INCLUDE 'columns_settings.inc' %]
     [% INCLUDE 'select2.inc' %]
+    [% INCLUDE 'js-date-format.inc' %]
+    [% PROCESS 'modal-claims-js' %]
     <script>
+
+
         function clone_input( node, original_id ) {
             var original = node;
             var clone = original.clone();
@@ -307,7 +330,7 @@
                 clone_input( $(this).parent(), $(this).data("original-id") );
             })
         });
-  </script>
+    </script>
 [% END %]
 
 [% INCLUDE 'intranet-bottom.inc' %]
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt
index 7b7fd26e67..1f9906cf8a 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt
@@ -914,6 +914,8 @@
     [% INCLUDE 'calendar.inc' %]
     [% Asset.js("lib/jquery/plugins/jquery-ui-timepicker-addon.min.js") | $raw %]
     [% INCLUDE 'timepicker.inc' %]
+    [% INCLUDE 'js-date-format.inc' %]
+    [% PROCESS 'modal-claims-js' %]
     <script>
         /* Set some variable needed in circulation.js */
         var logged_in_user_borrowernumber = "[% logged_in_user.borrowernumber | html %]";
@@ -979,7 +981,6 @@
                 "bPaginate": false
             }));
 
-
             $("#view_restrictions").on("click",function(){
                 $('#debarments-tab-link').click();
             });
@@ -994,8 +995,8 @@
                 e.preventDefault();
                 $("#picture-upload, #show-picture-upload").toggle();
             });
-
          });
+
         function uncheck_sibling(me){
             nodename=me.getAttribute("name");
             if (nodename =="barcodes[]"){
diff --git a/koha-tmpl/intranet-tmpl/prog/js/checkouts.js b/koha-tmpl/intranet-tmpl/prog/js/checkouts.js
index 7668a41ee4..39169b2fdf 100644
--- a/koha-tmpl/intranet-tmpl/prog/js/checkouts.js
+++ b/koha-tmpl/intranet-tmpl/prog/js/checkouts.js
@@ -888,56 +888,12 @@ $(document).ready(function() {
         } ).prop('checked', false);
     }
 
-    // Handle return claims
-    $(document).on("click", '.claim-returned-btn', function(e){
-        e.preventDefault();
-        itemnumber = $(this).data('itemnumber');
-
-        $('#claims-returned-itemnumber').val(itemnumber);
-        $('#claims-returned-notes').val("");
-        $('#claims-returned-charge-lost-fee').attr('checked', false)
-        $('#claims-returned-modal').modal()
-    });
-    $(document).on("click", '#claims-returned-modal-btn-submit', function(e){
-        let itemnumber = $('#claims-returned-itemnumber').val();
-        let notes = $('#claims-returned-notes').val();
-        let fee = $('#claims-returned-charge-lost-fee').attr('checked') ? true : false;
-
-        $('#claims-returned-modal').modal('hide')
-
-        $('.claim-returned-btn[data-itemnumber="' + itemnumber + '"]').replaceWith('<img id="return_claim_spinner_' + itemnumber + ' src=' + interface + '/' + theme + '/img/spinner-small.gif />');
-
-        params = {
-            item_id: itemnumber,
-            notes: notes,
-            charge_lost_fee: fee,
-            created_by: logged_in_user_borrowernumber,
-        };
-
-        $.post( '/api/v1/return_claims', JSON.stringify(params), function( data ) {
-
-            id = "#return_claim_spinner_" + data.item_id;
-
-            let created_on = new Date(data.created_on);
-
-            let content = "";
-            if ( data.claim_id ) {
-                content = '<span class="badge">' + created_on.toLocaleDateString() + '</span>';
-                $(id).parent().parent().addClass('ok');
-            } else {
-                content = __("Unable to claim as returned");
-                $(id).parent().parent().addClass('warn');
-            }
-
-            $(id).replaceWith( content );
-
-            refreshReturnClaimsTable();
-            issuesTable.api().ajax.reload();
-        }, "json")
-
+    // Refresh after return claim
+    $('body').on('refreshClaimModal', function () {
+        refreshReturnClaimsTable();
+        issuesTable.api().ajax.reload();
     });
 
-
     // Don't load return claims table unless it is clicked on
     var returnClaimsTable;
     $("#return-claims-tab").click( function() {
-- 
2.17.1