View | Details | Raw Unified | Return to bug 14697
Collapse All | Expand All

(-)a/circ/circulation.pl (+1 lines)
Lines 643-648 $template->param( Link Here
643
    override_high_holds       => $override_high_holds,
643
    override_high_holds       => $override_high_holds,
644
    nopermission              => scalar $query->param('nopermission'),
644
    nopermission              => scalar $query->param('nopermission'),
645
    autoswitched              => $autoswitched,
645
    autoswitched              => $autoswitched,
646
    logged_in_user            => $logged_in_user,
646
);
647
);
647
648
648
output_html_with_http_headers $query, $cookie, $template->output;
649
output_html_with_http_headers $query, $cookie, $template->output;
(-)a/circ/returns.pl (-1 / +3 lines)
Lines 542-548 foreach my $code ( keys %$messages ) { Link Here
542
    elsif ( $code eq 'DataCorrupted' ) {
542
    elsif ( $code eq 'DataCorrupted' ) {
543
        $err{data_corrupted} = 1;
543
        $err{data_corrupted} = 1;
544
    }
544
    }
545
    else {
545
    elsif ( $code eq 'ReturnClaims' ) {
546
        $template->param( ReturnClaims => $messages->{ReturnClaims} );
547
    } else {
546
        die "Unknown error code $code";    # note we need all the (empty) elsif's above, or we die.
548
        die "Unknown error code $code";    # note we need all the (empty) elsif's above, or we die.
547
        # This forces the issue of staying in sync w/ Circulation.pm
549
        # This forces the issue of staying in sync w/ Circulation.pm
548
    }
550
    }
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/checkouts-table.inc (+71 lines)
Lines 28-33 Link Here
28
                        <th scope="col">Price</th>
28
                        <th scope="col">Price</th>
29
                        <th scope="col">Renew <p class="column-tool"><a href="#" id="CheckAllRenewals">select all</a> | <a href="#" id="UncheckAllRenewals">none</a></p></th>
29
                        <th scope="col">Renew <p class="column-tool"><a href="#" id="CheckAllRenewals">select all</a> | <a href="#" id="UncheckAllRenewals">none</a></p></th>
30
                        <th scope="col">Check in <p class="column-tool"><a href="#" id="CheckAllCheckins">select all</a> | <a href="#" id="UncheckAllCheckins">none</a></p></th>
30
                        <th scope="col">Check in <p class="column-tool"><a href="#" id="CheckAllCheckins">select all</a> | <a href="#" id="UncheckAllCheckins">none</a></p></th>
31
                        <th scope="col">Return claims</th>
31
                        <th scope="col">Export <p class="column-tool"><a href="#" id="CheckAllExports">select all</a> | <a href="#" id="UncheckAllExports">none</a></p></th>
32
                        <th scope="col">Export <p class="column-tool"><a href="#" id="CheckAllExports">select all</a> | <a href="#" id="UncheckAllExports">none</a></p></th>
32
                    </tr>
33
                    </tr>
33
                </thead>
34
                </thead>
Lines 83-85 Link Here
83
        <p>Patron has nothing checked out.</p>
84
        <p>Patron has nothing checked out.</p>
84
    [% END %]
85
    [% END %]
85
</div>
86
</div>
87
88
<!-- Claims Returned Modal -->
89
<div class="modal fade" id="claims-returned-modal" tabindex="-1" role="dialog" aria-labelledby="claims-returned-modal-label">
90
  <div class="modal-dialog" role="document">
91
    <div class="modal-content">
92
      <div class="modal-header">
93
        <h4 class="modal-title" id="claims-returned-modal-label">Claim returned</h4>
94
      </div>
95
      <div class="modal-body">
96
97
          <div class="form-group">
98
            <label for="claims-returned-notes" class="control-label">Notes</label>
99
            <div>
100
              <textarea id="claims-returned-notes" class="form-control" rows="3"></textarea>
101
            </div>
102
          </div>
103
104
          [% IF Koha.Preference('ClaimReturnedChargeFee') == 'ask' %]
105
            <div class="form-group">
106
              <div class="checkbox">
107
                <label for="claims-returned-charge-lost-fee">
108
                  <input id="claims-returned-charge-lost-fee" type="checkbox" value="1">
109
                  Charge lost fee
110
                </label>
111
              </div>
112
            </div>
113
          [% END %]
114
115
          <input type="hidden" id="claims-returned-itemnumber" />
116
      </div>
117
      <div class="modal-footer">
118
        <button id="claims-returned-modal-btn-submit" type="button" class="btn btn-primary"><i class="fa fa-exclamation-circle"></i> Make claim</button>
119
        <button class="btn btn-default deny cancel" href="#" data-dismiss="modal" aria-hidden="true"><i class="fa fa-times"></i> Cancel</button>
120
      </div>
121
    </div>
122
  </div>
123
</div>
124
125
<!-- Resolve Return Claim Modal -->
126
<div class="modal fade" id="claims-returned-resolved-modal" tabindex="-1" role="dialog" aria-labelledby="claims-returned-resolved-modal-label">
127
  <div class="modal-dialog" role="document">
128
    <div class="modal-content">
129
      <div class="modal-header">
130
        <h4 class="modal-title" id="claims-returned-resolved-modal-label">Resolve return claim</h4>
131
      </div>
132
      <div class="modal-body">
133
134
          <div class="form-group">
135
            <label for="claims-returned-resolved-code">Resolution</label>
136
            [% SET resolutions = AuthorisedValues.GetAuthValueDropbox('RETURN_CLAIM_RESOLUTION') %]
137
            <select class="form-control" id="claims-returned-resolved-modal-resolved-code">
138
              [% FOREACH r IN resolutions %]
139
                  <option value="[% r.authorised_value | html %]">[% r.lib | html %]</option>
140
              [% END %]
141
            </select>
142
          </div>
143
144
          <input type="hidden" id="claims-returned-resolved-modal-id"/>
145
      </div>
146
      <div class="modal-footer">
147
        <button id="claims-returned-resolved-modal-btn-submit" type="button" class="btn btn-primary">
148
          <i id="claims-returned-resolved-modal-btn-submit-icon" class="fa fa-exclamation-circle"></i>
149
          <i id="claims-returned-resolved-modal-btn-submit-spinner" class="fa fa-spinner fa-pulse fa-fw" style="display:none"></i>
150
          Resolve claim
151
         </button>
152
        <button class="btn btn-default deny cancel" href="#" data-dismiss="modal" aria-hidden="true"><i class="fa fa-times"></i> Cancel</button>
153
      </div>
154
    </div>
155
  </div>
156
</div>
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/patron-return-claims.inc (+15 lines)
Line 0 Link Here
1
<div id="return-claims">
2
  <table id="return-claims-table" class="table table-bordered table-striped">
3
      <thead>
4
          <tr>
5
              <th class="return-claim-id">Claim ID</th>
6
              <th class="return-claim-record-title anti-the">Title</th>
7
              <th class="return-claim-notes">Notes</th>
8
              <th class="return-claim-created-on">Created on</th>
9
              <th class="return-claim-updated-on">Updated on</th>
10
              <th class="return-claim-resolution">Resolution</th>
11
              <th class="return-claim-actions">&nbsp;</th>
12
          </tr>
13
      </thead>
14
  </table>
15
</div>
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/strings.inc (+5 lines)
Lines 5-10 Link Here
5
    var NOT_RENEWABLE_RESTRICTION = _("Not allowed: patron restricted");
5
    var NOT_RENEWABLE_RESTRICTION = _("Not allowed: patron restricted");
6
    var CIRCULATION_RENEWED_DUE = _("Renewed, due:");
6
    var CIRCULATION_RENEWED_DUE = _("Renewed, due:");
7
    var CIRCULATION_RENEW_FAILED = _("Renew failed:");
7
    var CIRCULATION_RENEW_FAILED = _("Renew failed:");
8
    var RETURN_CLAIMED = _("Return claimed");
9
    var RETURN_CLAIMED_FAILURE = _("Unable to claim as returned");
10
    var RETURN_CLAIMED_MAKE = _("Claim returned");
11
    var RETURN_CLAIMED_NOTES = _("Notes about return claim");
8
    var NOT_CHECKED_OUT = _("not checked out");
12
    var NOT_CHECKED_OUT = _("not checked out");
9
    var TOO_MANY_RENEWALS = _("too many renewals");
13
    var TOO_MANY_RENEWALS = _("too many renewals");
10
    var ON_RESERVE = _("on hold");
14
    var ON_RESERVE = _("on hold");
Lines 47-50 Link Here
47
    var MSG_NO_ITEMTYPE = _("No itemtype");
51
    var MSG_NO_ITEMTYPE = _("No itemtype");
48
    var MSG_CHECKOUTS_BY_ITEMTYPE = _("Number of checkouts by item type");
52
    var MSG_CHECKOUTS_BY_ITEMTYPE = _("Number of checkouts by item type");
49
    var PATRON_NOTE = _("Patron note");
53
    var PATRON_NOTE = _("Patron note");
54
    var CONFIRM_DELETE_RETURN_CLAIM = _("Are you sure you want to delete this return claim?");
50
</script>
55
</script>
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref (+19 lines)
Lines 1084-1086 Circulation: Link Here
1084
                pages: Pages
1084
                pages: Pages
1085
                chapters: Chapters
1085
                chapters: Chapters
1086
            -
1086
            -
1087
    Return Claims:
1088
        -
1089
            - When marking a checkout as "claims returned",
1090
            - pref: ClaimReturnedChargeFee
1091
              default: ask
1092
              choices:
1093
                  ask: ask if a lost fee should be charged
1094
                  charge: charge a lost fee
1095
                  no_charge: don't charge a lost fee
1096
            - .
1097
        -
1098
            - Use the LOST authorised value
1099
            - pref: ClaimReturnedLostValue
1100
            - to represent returns claims
1101
        -
1102
            - Warn librarians that a patron has excessive return cliams if the patron has claimed the return of more than
1103
            - pref: ClaimReturnedWarningThreshold
1104
              class: integer
1105
            - items.
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/moredetail.tt (-13 / +23 lines)
Lines 100-120 Link Here
100
                <li><span class="label">Lost status:</span>
100
                <li><span class="label">Lost status:</span>
101
                    [% IF ( CAN_user_circulate ) %]
101
                    [% IF ( CAN_user_circulate ) %]
102
                        <form action="updateitem.pl" method="post">
102
                        <form action="updateitem.pl" method="post">
103
                        <input type="hidden" name="biblionumber" value="[% ITEM_DAT.biblionumber | html %]" />
103
                            <input type="hidden" name="biblionumber" value="[% ITEM_DAT.biblionumber | html %]" />
104
                        <input type="hidden" name="biblioitemnumber" value="[% ITEM_DAT.biblioitemnumber | html %]" />
104
                            <input type="hidden" name="biblioitemnumber" value="[% ITEM_DAT.biblioitemnumber | html %]" />
105
                        <input type="hidden" name="itemnumber" value="[% ITEM_DAT.itemnumber | html %]" />
105
                            <input type="hidden" name="itemnumber" value="[% ITEM_DAT.itemnumber | html %]" />
106
                        <select name="itemlost" >
106
                            <select name="itemlost" >
107
                                    <option value="">Choose</option>
107
                                <option value="">Choose</option>
108
                        [% FOREACH itemlostloo IN itemlostloop %]
108
                                [% FOREACH itemlostloo IN itemlostloop %]
109
                            [% IF itemlostloo.authorised_value == ITEM_DAT.itemlost %]
109
                                    [% IF itemlostloo.authorised_value == ITEM_DAT.itemlost %]
110
                                    <option value="[% itemlostloo.authorised_value | html %]" selected="selected">[% itemlostloo.lib | html %]</option>
110
                                        <option value="[% itemlostloo.authorised_value | html %]" selected="selected">[% itemlostloo.lib | html %]</option>
111
                                    [% ELSE %]
112
                                        <option value="[% itemlostloo.authorised_value | html %]">[% itemlostloo.lib | html %]</option>
113
                                    [% END %]
114
                                [% END %]
115
                            </select>
116
                            <input type="hidden" name="withdrawn" value="[% ITEM_DAT.withdrawn | html %]" />
117
                            <input type="hidden" name="damaged" value="[% ITEM_DAT.damaged | html %]" />
118
119
                            [% SET ClaimReturnedLostValue = Koha.Preference('ClaimReturnedLostValue') %]
120
                            [% IF ClaimReturnedLostValue && ITEM_DAT.itemlost == ClaimReturnedLostValue %]
121
                                <input type="submit" name="submit" class="submit" value="Set status" disabled="disabled"/>
122
                                <p class="help-block">Item has been claimed as returned.</p>
111
                            [% ELSE %]
123
                            [% ELSE %]
112
                                    <option value="[% itemlostloo.authorised_value | html %]">[% itemlostloo.lib | html %]</option>
124
                                <input type="hidden" name="op" value="set_lost" />
125
                                <input type="submit" name="submit" class="submit" value="Set status" /></form>
113
                            [% END %]
126
                            [% END %]
114
                        [% END %]
127
                        </form>
115
                        </select>
116
                        <input type="hidden" name="op" value="set_lost" />
117
                        <input type="submit" name="submit" class="submit" value="Set status" /></form>
118
                    [% ELSE %]
128
                    [% ELSE %]
119
                        [% FOREACH itemlostloo IN itemlostloop %]
129
                        [% FOREACH itemlostloo IN itemlostloop %]
120
                            [% IF ( itemlostloo.selected ) %]
130
                            [% IF ( itemlostloo.selected ) %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt (+36 lines)
Lines 732-737 Link Here
732
                                        <li><span class="circ-hlt">Overdues: Patron has ITEMS OVERDUE.</span> <a href="#checkouts">See highlighted items below</a></li>
732
                                        <li><span class="circ-hlt">Overdues: Patron has ITEMS OVERDUE.</span> <a href="#checkouts">See highlighted items below</a></li>
733
                                    [% END %]
733
                                    [% END %]
734
734
735
                                    [% SET ClaimReturnedWarningThreshold = Koha.Preference('ClaimReturnedWarningThreshold') %]
736
                                    [% SET return_claims = patron.return_claims %]
737
                                    [% IF return_claims.count %]
738
                                        <li><span class="circ-hlt return-claims">Return claims: Patron has [% return_claims.count | html %] RETURN CLAIMS.</span>
739
                                    [% END %]
740
735
                                    [% IF ( charges ) %]
741
                                    [% IF ( charges ) %]
736
                                        [% INCLUDE 'blocked-fines.inc' fines = chargesamount %]
742
                                        [% INCLUDE 'blocked-fines.inc' fines = chargesamount %]
737
                                    [% END %]
743
                                    [% END %]
Lines 845-850 Link Here
845
                                </li>
851
                                </li>
846
                            [% END %]
852
                            [% END %]
847
853
854
                            <li>
855
                                [% IF ( patron.return_claims.count ) %]
856
                                    <a href="#return-claims" id="return-claims-tab">
857
                                        <span id="return-claims-count-resolved">[% patron.return_claims.resolved.count | html %]</span>
858
                                        /
859
                                        <span id="return-claims-count-unresolved">[% patron.return_claims.unresolved.count | html %]</span>
860
                                        Claim(s)
861
                                    </a>
862
                                [% ELSE %]
863
                                    <a href="#return-claims" id="return-claims-tab">
864
                                        <span id="return-claims-count-resolved">0</span>
865
                                        /
866
                                        <span id="return-claims-count-unresolved">0</span>
867
                                        Claim(s)
868
                                    </a>
869
                                [% END %]
870
                            </li>
871
872
                            [% IF Koha.Preference('ArticleRequests') %]
873
                                <li>
874
                                    <a href="#article-requests" id="article-requests-tab"> [% patron.article_requests_current.count | html %] Article requests</a>
875
                                </li>
876
                            [% END %]
877
848
                            <li><a id="debarments-tab-link" href="#reldebarments">[% debarments.count | html %] Restrictions</a></li>
878
                            <li><a id="debarments-tab-link" href="#reldebarments">[% debarments.count | html %] Restrictions</a></li>
849
879
850
                            [% SET enrollments = patron.get_club_enrollments(1) %]
880
                            [% SET enrollments = patron.get_club_enrollments(1) %]
Lines 928-933 Link Here
928
                            [% END # /IF holds_count %]
958
                            [% END # /IF holds_count %]
929
                        </div> <!-- /#reserves -->
959
                        </div> <!-- /#reserves -->
930
960
961
                        [% INCLUDE 'patron-return-claims.inc' %]
962
931
                        [% IF Koha.Preference('ArticleRequests') %]
963
                        [% IF Koha.Preference('ArticleRequests') %]
932
                            [% INCLUDE 'patron-article-requests.inc' %]
964
                            [% INCLUDE 'patron-article-requests.inc' %]
933
                        [% END %]
965
                        [% END %]
Lines 995-1000 Link Here
995
    [% Asset.js("js/circ-patron-search-results.js") | $raw %]
1027
    [% Asset.js("js/circ-patron-search-results.js") | $raw %]
996
    <script type="text/javascript">
1028
    <script type="text/javascript">
997
        /* Set some variable needed in circulation.js */
1029
        /* Set some variable needed in circulation.js */
1030
        var logged_in_user_borrowernumber = "[% logged_in_user.borrowernumber | html %]";
1031
        var ClaimReturnedLostValue = "[% Koha.Preference('ClaimReturnedLostValue') | html %]";
1032
        var ClaimReturnedChargeFee = "[% Koha.Preference('ClaimReturnedChargeFee') | html %]";
1033
        var ClaimReturnedWarningThreshold = "[% Koha.Preference('ClaimReturnedWarningThreshold') | html %]";
998
        var MSG_DT_LOADING_RECORDS = _("Loading... you may continue scanning.");
1034
        var MSG_DT_LOADING_RECORDS = _("Loading... you may continue scanning.");
999
        var interface = "[% interface | html %]";
1035
        var interface = "[% interface | html %]";
1000
        var theme = "[% theme | html %]";
1036
        var theme = "[% theme | html %]";
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/returns.tt (+19 lines)
Lines 156-161 Link Here
156
                                </div>
156
                                </div>
157
                            [% END %]
157
                            [% END %]
158
158
159
							<!-- Item has return claim(s) -->
160
							[% IF ( ReturnClaims ) %]
161
								<div class="dialog alert return-claim">
162
									<h3>
163
										This item has been claimed as returned by:
164
										<ul>
165
										[% FOREACH rc IN ReturnClaims %]
166
											[% SET patron = rc.patron %]
167
											<li>
168
												<a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% patron.borrowernumber | uri %]">
169
													[% patron.firstname | html %] [% patron.surname | html %]
170
												</a>
171
											</li>
172
										[% END %]
173
										</ul>
174
									</h3>
175
								</div>
176
							[% END %]
177
159
                            <!-- Patron has waiting holds -->
178
                            <!-- Patron has waiting holds -->
160
                            [% IF ( waiting_holds ) %]
179
                            [% IF ( waiting_holds ) %]
161
                                <div id="awaiting-pickup" class="dialog message">
180
                                <div id="awaiting-pickup" class="dialog message">
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt (+25 lines)
Lines 715-720 Link Here
715
                                    <a href="#article-requests" id="article-requests-tab"> [% patron.article_requests_current.count | html %] Article requests</a>
715
                                    <a href="#article-requests" id="article-requests-tab"> [% patron.article_requests_current.count | html %] Article requests</a>
716
                                </li>
716
                                </li>
717
                            [% END %]
717
                            [% END %]
718
719
                            <li>
720
                                [% IF ( patron.return_claims.count ) %]
721
                                    <a href="#return-claims" id="return-claims-tab">
722
                                        <span id="return-claims-count-resolved">[% patron.return_claims.resolved.count | html %]</span>
723
                                        /
724
                                        <span id="return-claims-count-unresolved">[% patron.return_claims.unresolved.count | html %]</span>
725
                                        Claim(s)
726
                                    </a>
727
                                [% ELSE %]
728
                                    <a href="#return-claims" id="return-claims-tab">
729
                                        <span id="return-claims-count-resolved">0</span>
730
                                        /
731
                                        <span id="return-claims-count-unresolved">0</span>
732
                                        Claim(s)
733
                                    </a>
734
                                [% END %]
735
                            </li>
736
718
                            <li>
737
                            <li>
719
                                <a id="debarments-tab-link" href="#reldebarments">[% debarments.size | html %] Restrictions</a>
738
                                <a id="debarments-tab-link" href="#reldebarments">[% debarments.size | html %] Restrictions</a>
720
                            </li>
739
                            </li>
Lines 807-812 Link Here
807
                            </div> [% # /div#reserves %]
826
                            </div> [% # /div#reserves %]
808
                        [% END %]
827
                        [% END %]
809
828
829
                        [% INCLUDE 'patron-return-claims.inc' %]
830
810
                        [% IF Koha.Preference('ArticleRequests') %]
831
                        [% IF Koha.Preference('ArticleRequests') %]
811
                            [% INCLUDE 'patron-article-requests.inc' %]
832
                            [% INCLUDE 'patron-article-requests.inc' %]
812
                        [% END %]
833
                        [% END %]
Lines 839-844 Link Here
839
    [% Asset.js("js/messaging-preference-form.js") | $raw %]
860
    [% Asset.js("js/messaging-preference-form.js") | $raw %]
840
    <script>
861
    <script>
841
        /* Set some variable needed in circulation.js */
862
        /* Set some variable needed in circulation.js */
863
        var logged_in_user_borrowernumber = "[% logged_in_user.borrowernumber | html %]";
864
        var ClaimReturnedLostValue = "[% Koha.Preference('ClaimReturnedLostValue') | html %]";
865
        var ClaimReturnedChargeFee = "[% Koha.Preference('ClaimReturnedChargeFee') | html %]";
866
        var ClaimReturnedWarningThreshold = "[% Koha.Preference('ClaimReturnedWarningThreshold') | html %]";
842
        var interface = "[% interface | html %]";
867
        var interface = "[% interface | html %]";
843
        var theme = "[% theme | html %]";
868
        var theme = "[% theme | html %]";
844
        var borrowernumber = "[% patron.borrowernumber | html %]";
869
        var borrowernumber = "[% patron.borrowernumber | html %]";
(-)a/koha-tmpl/intranet-tmpl/prog/js/checkouts.js (-1 / +281 lines)
Lines 270-276 $(document).ready(function() { Link Here
270
270
271
                        due = "<span id='date_due_" + oObj.itemnumber + "' class='date_due'>" + due + "</span>";
271
                        due = "<span id='date_due_" + oObj.itemnumber + "' class='date_due'>" + due + "</span>";
272
272
273
                        if ( oObj.lost ) {
273
                        if ( oObj.lost && oObj.claims_returned ) {
274
                            due += "<span class='lost claims_returned'>" + oObj.lost.escapeHtml() + "</span>";
275
                        } else if ( oObj.lost ) {
274
                            due += "<span class='lost'>" + oObj.lost.escapeHtml() + "</span>";
276
                            due += "<span class='lost'>" + oObj.lost.escapeHtml() + "</span>";
275
                        }
277
                        }
276
278
Lines 540-545 $(document).ready(function() { Link Here
540
                        }
542
                        }
541
                    }
543
                    }
542
                },
544
                },
545
                {
546
                    "bVisible": ClaimReturnedLostValue ? true : false,
547
                    "bSortable": false,
548
                    "mDataProp": function ( oObj ) {
549
                        let content = "";
550
551
                        if ( oObj.return_claim_id ) {
552
                          content = `<span class="badge">${oObj.return_claim_created_on_formatted}</span>`;
553
                        } else {
554
                          content = `<a class="btn btn-default btn-xs claim-returned-btn" data-itemnumber="${oObj.itemnumber}"><i class="fa fa-exclamation-circle"></i> ${RETURN_CLAIMED_MAKE}</a>`;
555
                        }
556
                        return content;
557
                    }
558
                },
543
                {
559
                {
544
                    "bVisible": exports_enabled == 1 ? true : false,
560
                    "bVisible": exports_enabled == 1 ? true : false,
545
                    "bSortable": false,
561
                    "bSortable": false,
Lines 810-813 $(document).ready(function() { Link Here
810
            }
826
            }
811
        } ).prop('checked', false);
827
        } ).prop('checked', false);
812
    }
828
    }
829
830
    // Handle return claims
831
    $(document).on("click", '.claim-returned-btn', function(e){
832
        e.preventDefault();
833
        itemnumber = $(this).data('itemnumber');
834
835
        $('#claims-returned-itemnumber').val(itemnumber);
836
        $('#claims-returned-notes').val("");
837
        $('#claims-returned-charge-lost-fee').attr('checked', false)
838
        $('#claims-returned-modal').modal()
839
    });
840
    $(document).on("click", '#claims-returned-modal-btn-submit', function(e){
841
        let itemnumber = $('#claims-returned-itemnumber').val();
842
        let notes = $('#claims-returned-notes').val();
843
        let fee = $('#claims-returned-charge-lost-fee').attr('checked') ? true : false;
844
845
        $('#claims-returned-modal').modal('hide')
846
847
        $(`.claim-returned-btn[data-itemnumber='${itemnumber}']`).replaceWith(`<img id='return_claim_spinner_${itemnumber}' src='${interface}/${theme}/img/spinner-small.gif' />`);
848
849
        params = {
850
            item_id: itemnumber,
851
            notes: notes,
852
            charge_lost_fee: fee,
853
            created_by: logged_in_user_borrowernumber,
854
        };
855
856
        $.post( '/api/v1/return_claims', JSON.stringify(params), function( data ) {
857
858
            id = "#return_claim_spinner_" + data.item_id;
859
860
            let created_on = new Date(data.created_on);
861
862
            let content = "";
863
            if ( data.claim_id ) {
864
                content = `<span class="badge">${created_on.toLocaleDateString()}</span>`;
865
                $(id).parent().parent().addClass('ok');
866
            } else {
867
                content = RETURN_CLAIMED_FAILURE;
868
                $(id).parent().parent().addClass('warn');
869
            }
870
871
            $(id).replaceWith( content );
872
873
            refreshReturnClaimsTable();
874
        }, "json")
875
876
    });
877
878
879
    // Don't load return claims table unless it is clicked on
880
    var returnClaimsTable;
881
    $("#return-claims-tab").click( function() {
882
        refreshReturnClaimsTable();
883
    });
884
885
    function refreshReturnClaimsTable(){
886
        loadReturnClaimsTable();
887
        $("#return-claims-table").DataTable().ajax.reload();
888
    }
889
    function loadReturnClaimsTable() {
890
        if ( ! returnClaimsTable ) {
891
            returnClaimsTable = $("#return-claims-table").dataTable({
892
                "bAutoWidth": false,
893
                "sDom": "rt",
894
                "aaSorting": [],
895
                "aoColumns": [
896
                    {
897
                        "mDataProp": "id",
898
                        "bVisible": false,
899
                    },
900
                    {
901
                        "mDataProp": function ( oObj ) {
902
                              let title = `<a class="return-claim-title strong" href="/cgi-bin/koha/circ/request-rcticle.pl?biblionumber=[% rc.checkout.item.biblionumber | html %]">
903
                                  ${oObj.title}
904
                                  ${oObj.enumchron || ""}
905
                              </a>`;
906
                              if ( oObj.author ) {
907
                                title += `by ${oObj.author}`;
908
                              }
909
                              title += `<a href="/cgi-bin/koha/catalogue/moredetail.pl?biblionumber=${oObj.biblionumber}&itemnumber=${oObj.itemnumber}">${oObj.barcode}</a>`;
910
911
                              return title;
912
                        }
913
                    },
914
                    {
915
                        "sClass": "return-claim-notes-td",
916
                        "mDataProp": function ( oObj ) {
917
                            return `
918
                                <span id="return-claim-notes-static-${oObj.id}" class="return-claim-notes" data-return-claim-id="${oObj.id}">${oObj.notes}</span>
919
                                <i style="float:right" class="fa fa-pencil-square-o" title="Double click to edit"></i>
920
                            `;
921
                        }
922
                    },
923
                    {
924
                        "mDataProp": function ( oObj ) {
925
                            let created_on = new Date( oObj.created_on );
926
                            return created_on.toLocaleDateString();
927
                        }
928
                    },
929
                    {
930
                        "mDataProp": function ( oObj ) {
931
                            let updated_on = new Date( oObj.updated_on );
932
                            return updated_on.toLocaleDateString();
933
                        }
934
                    },
935
                    {
936
                        "mDataProp": function ( oObj ) {
937
                            if ( ! oObj.resolution ) return "";
938
939
                            let desc = `<strong>${oObj.resolution_data.lib}</strong> on <i>${oObj.resolved_on}</i>`;
940
                            if (oObj.resolved_by_data) desc += ` by <a href="/cgi-bin/koha/circ/circulation.pl?borrowernumber=${oObj.resolved_by_data.borrowernumber}">${oObj.resolved_by_data.firstname || ""} ${oObj.resolved_by_data.surname || ""}</a>`;
941
                            return desc;
942
                        }
943
                    },
944
                    {
945
                        "mDataProp": function ( oObj ) {
946
                            let delete_html = oObj.resolved_on
947
                                ? `<li><a href="#" class="return-claim-tools-delete" data-return-claim-id="${oObj.id}"><i class="fa fa-trash"></i> Delete</a></li>`
948
                                : "";
949
                            let resolve_html = ! oObj.resolution
950
                                ? `<li><a href="#" class="return-claim-tools-resolve" data-return-claim-id="${oObj.id}"><i class="fa fa-check-square"></i> Resolve</a></li>`
951
                                : "";
952
953
                            return `
954
                                <div class="btn-group">
955
                                  <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
956
                                    Actions <span class="caret"></span>
957
                                  </button>
958
                                  <ul class="dropdown-menu">
959
                                    <li><a href="#" class="return-claim-tools-editnotes" data-return-claim-id="${oObj.id}"><i class="fa fa-edit"></i> Edit notes</a></li>
960
                                    ${resolve_html}
961
                                    ${delete_html}
962
                                  </ul>
963
                                </div>
964
                            `;
965
                        }
966
                    },
967
                ],
968
                "bPaginate": false,
969
                "bProcessing": true,
970
                "bServerSide": false,
971
                "sAjaxSource": '/cgi-bin/koha/svc/return_claims',
972
                "fnServerData": function ( sSource, aoData, fnCallback ) {
973
                    aoData.push( { "name": "borrowernumber", "value": borrowernumber } );
974
975
                    $.getJSON( sSource, aoData, function (json) {
976
                        let resolved = json.resolved;
977
                        let unresolved = json.unresolved;
978
979
                        $('#return-claims-count-resolved').text(resolved);
980
                        $('#return-claims-count-unresolved').text(unresolved);
981
982
                        fnCallback(json)
983
                    } );
984
                },
985
            });
986
        }
987
    }
988
989
    $('body').on('click', '.return-claim-tools-editnotes', function() {
990
        let id = $(this).data('return-claim-id');
991
        $(`#return-claim-notes-static-${id}`).parent().dblclick();
992
    });
993
    $('body').on('dblclick', '.return-claim-notes-td', function() {
994
        let elt = $(this).children('.return-claim-notes');
995
        let id = elt.data('return-claim-id');
996
        if ( $(`#return-claim-notes-editor-textarea-${id}`).length == 0 ) {
997
            let note = elt.text();
998
            let editor = `
999
                <span id="return-claim-notes-editor-${id}">
1000
                    <textarea id="return-claim-notes-editor-textarea-${id}">${note}</textarea>
1001
                    <br/>
1002
                    <a class="btn btn-default btn-xs claim-returned-notes-editor-submit" data-return-claim-id="${id}"><i class="fa fa-save"></i> Update</a>
1003
                    <a class="claim-returned-notes-editor-cancel" data-return-claim-id="${id}" href="#">Cancel</a>
1004
                </span>
1005
            `;
1006
            elt.hide();
1007
            $(editor).insertAfter( elt );
1008
        }
1009
    });
1010
1011
    $('body').on('click', '.claim-returned-notes-editor-submit', function(){
1012
        let id = $(this).data('return-claim-id');
1013
        let notes = $(`#return-claim-notes-editor-textarea-${id}`).val();
1014
1015
        let params = {
1016
            notes: notes,
1017
            updated_by: logged_in_user_borrowernumber
1018
        };
1019
1020
        $(this).parent().remove();
1021
1022
        $.ajax({
1023
            url: `/api/v1/return_claims/${id}/notes`,
1024
            type: 'PUT',
1025
            data: JSON.stringify(params),
1026
            success: function( data ) {
1027
                let notes = $(`#return-claim-notes-static-${id}`);
1028
                notes.text(data.notes);
1029
                notes.show();
1030
            },
1031
            contentType: "json"
1032
        });
1033
    });
1034
1035
    $('body').on('click', '.claim-returned-notes-editor-cancel', function(){
1036
        let id = $(this).data('return-claim-id');
1037
        $(this).parent().remove();
1038
        $(`#return-claim-notes-static-${id}`).show();
1039
    });
1040
1041
    // Hanld return claim deletion
1042
    $('body').on('click', '.return-claim-tools-delete', function() {
1043
        let confirmed = confirm(CONFIRM_DELETE_RETURN_CLAIM);
1044
        if ( confirmed ) {
1045
            let id = $(this).data('return-claim-id');
1046
1047
            $.ajax({
1048
                url: `/api/v1/return_claims/${id}`,
1049
                type: 'DELETE',
1050
                success: function( data ) {
1051
                    refreshReturnClaimsTable();
1052
                }
1053
            });
1054
        }
1055
    });
1056
1057
    // Handle return claim resolution
1058
    $('body').on('click', '.return-claim-tools-resolve', function() {
1059
        let id = $(this).data('return-claim-id');
1060
1061
        $('#claims-returned-resolved-modal-id').val(id);
1062
        $('#claims-returned-resolved-modal').modal()
1063
    });
1064
1065
    $(document).on('click', '#claims-returned-resolved-modal-btn-submit', function(e) {
1066
        let resolution = $('#claims-returned-resolved-modal-resolved-code').val();
1067
        let id = $('#claims-returned-resolved-modal-id').val();
1068
1069
        $('#claims-returned-resolved-modal-btn-submit-spinner').show();
1070
        $('#claims-returned-resolved-modal-btn-submit-icon').hide();
1071
1072
        params = {
1073
          resolution: resolution,
1074
          updated_by: logged_in_user_borrowernumber
1075
        };
1076
1077
        $.ajax({
1078
            url: `/api/v1/return_claims/${id}/resolve`,
1079
            type: 'PUT',
1080
            data: JSON.stringify(params),
1081
            success: function( data ) {
1082
                $('#claims-returned-resolved-modal-btn-submit-spinner').hide();
1083
                $('#claims-returned-resolved-modal-btn-submit-icon').show();
1084
                $('#claims-returned-resolved-modal').modal('hide')
1085
1086
                refreshReturnClaimsTable();
1087
            },
1088
            contentType: "json"
1089
        });
1090
1091
    });
1092
813
 });
1093
 });
(-)a/members/moremember.pl (+1 lines)
Lines 209-214 $template->param( Link Here
209
    housebound_role => scalar $patron->housebound_role,
209
    housebound_role => scalar $patron->housebound_role,
210
    relatives_issues_count => $relatives_issues_count,
210
    relatives_issues_count => $relatives_issues_count,
211
    relatives_borrowernumbers => \@relatives,
211
    relatives_borrowernumbers => \@relatives,
212
    logged_in_user => $logged_in_user,
212
);
213
);
213
214
214
output_html_with_http_headers $input, $cookie, $template->output;
215
output_html_with_http_headers $input, $cookie, $template->output;
(-)a/svc/checkouts (-21 / +40 lines)
Lines 64-91 print $input->header( -type => 'text/plain', -charset => 'UTF-8' ); Link Here
64
my @parameters;
64
my @parameters;
65
my $sql = '
65
my $sql = '
66
    SELECT
66
    SELECT
67
        issuedate,
67
        issues.issuedate,
68
        date_due,
68
        issues.date_due,
69
        date_due < now() as date_due_overdue,
69
        issues.date_due < now() as date_due_overdue,
70
        issues.timestamp,
70
        issues.timestamp,
71
71
72
        onsite_checkout,
72
        issues.onsite_checkout,
73
73
74
        biblionumber,
74
        biblio.biblionumber,
75
        biblio.title,
75
        biblio.title,
76
        biblio.subtitle,
76
        biblio.subtitle,
77
        biblio.medium,
77
        biblio.medium,
78
        biblio.part_number,
78
        biblio.part_number,
79
        biblio.part_name,
79
        biblio.part_name,
80
        author,
80
        biblio.author,
81
81
82
        itemnumber,
82
        items.itemnumber,
83
        barcode,
83
        items.barcode,
84
        branches2.branchname AS homebranch,
84
        branches2.branchname AS homebranch,
85
        itemnotes,
85
        items.itemnotes,
86
        itemnotes_nonpublic,
86
        items.itemnotes_nonpublic,
87
        itemcallnumber,
87
        items.itemcallnumber,
88
        replacementprice,
88
        items.replacementprice,
89
89
90
        issues.branchcode,
90
        issues.branchcode,
91
        branches.branchname,
91
        branches.branchname,
Lines 95-111 my $sql = ' Link Here
95
95
96
        items.ccode AS collection,
96
        items.ccode AS collection,
97
97
98
        borrowernumber,
98
        borrowers.borrowernumber,
99
        surname,
99
        borrowers.surname,
100
        firstname,
100
        borrowers.firstname,
101
        cardnumber,
101
        borrowers.cardnumber,
102
102
103
        itemlost,
103
        items.itemlost,
104
        damaged,
104
        items.damaged,
105
        location,
105
        items.location,
106
        items.enumchron,
106
        items.enumchron,
107
107
108
        DATEDIFF( issuedate, CURRENT_DATE() ) AS not_issued_today
108
        DATEDIFF( issues.issuedate, CURRENT_DATE() ) AS not_issued_today,
109
110
        return_claims.id AS return_claim_id,
111
        return_claims.notes AS return_claim_notes,
112
        return_claims.created_on AS return_claim_created_on,
113
        return_claims.updated_on AS return_claim_updated_on
114
109
    FROM issues
115
    FROM issues
110
        LEFT JOIN items USING ( itemnumber )
116
        LEFT JOIN items USING ( itemnumber )
111
        LEFT JOIN biblio USING ( biblionumber )
117
        LEFT JOIN biblio USING ( biblionumber )
Lines 113-119 my $sql = ' Link Here
113
        LEFT JOIN borrowers USING ( borrowernumber )
119
        LEFT JOIN borrowers USING ( borrowernumber )
114
        LEFT JOIN branches ON ( issues.branchcode = branches.branchcode )
120
        LEFT JOIN branches ON ( issues.branchcode = branches.branchcode )
115
        LEFT JOIN branches branches2 ON ( items.homebranch = branches2.branchcode )
121
        LEFT JOIN branches branches2 ON ( items.homebranch = branches2.branchcode )
116
    WHERE borrowernumber
122
        LEFT JOIN return_claims USING ( issue_id )
123
    WHERE issues.borrowernumber
117
';
124
';
118
125
119
if ( @borrowernumber == 1 ) {
126
if ( @borrowernumber == 1 ) {
Lines 131-136 my $sth = $dbh->prepare($sql); Link Here
131
$sth->execute(@parameters);
138
$sth->execute(@parameters);
132
139
133
my $item_level_itypes = C4::Context->preference('item-level_itypes');
140
my $item_level_itypes = C4::Context->preference('item-level_itypes');
141
my $claims_returned_lost_value = C4::Context->preference('ClaimReturnedLostValue');
134
142
135
my @checkouts_today;
143
my @checkouts_today;
136
my @checkouts_previous;
144
my @checkouts_previous;
Lines 165-173 while ( my $c = $sth->fetchrow_hashref() ) { Link Here
165
        $collection = $av->count ? $av->next->lib : '';
173
        $collection = $av->count ? $av->next->lib : '';
166
    }
174
    }
167
    my $lost;
175
    my $lost;
176
    my $claims_returned;
168
    if ( $c->{itemlost} ) {
177
    if ( $c->{itemlost} ) {
169
        my $av = Koha::AuthorisedValues->search({ category => 'LOST', authorised_value => $c->{itemlost} });
178
        my $av = Koha::AuthorisedValues->search({ category => 'LOST', authorised_value => $c->{itemlost} });
170
        $lost = $av->count ? $av->next->lib : '';
179
        $lost = $av->count ? $av->next->lib : '';
180
        $claims_returned = $c->{itemlost} eq $claims_returned_lost_value;
171
    }
181
    }
172
    my $damaged;
182
    my $damaged;
173
    if ( $c->{damaged} ) {
183
    if ( $c->{damaged} ) {
Lines 212-217 while ( my $c = $sth->fetchrow_hashref() ) { Link Here
212
        renewals_count      => $renewals_count,
222
        renewals_count      => $renewals_count,
213
        renewals_allowed    => $renewals_allowed,
223
        renewals_allowed    => $renewals_allowed,
214
        renewals_remaining  => $renewals_remaining,
224
        renewals_remaining  => $renewals_remaining,
225
226
        return_claim_id         => $c->{return_claim_id},
227
        return_claim_notes      => $c->{return_claim_notes},
228
        return_claim_created_on => $c->{return_claim_created_on},
229
        return_claim_updated_on => $c->{return_claim_updated_on},
230
        return_claim_created_on_formatted => $c->{return_claim_created_on} ? output_pref({ dt => dt_from_string( $c->{return_claim_created_on} ) }) : undef,
231
        return_claim_updated_on_formatted => $c->{return_claim_updated_on} ? output_pref({ dt => dt_from_string( $c->{return_claim_updated_on} ) }) : undef,
232
215
        issuedate_formatted => output_pref(
233
        issuedate_formatted => output_pref(
216
            {
234
            {
217
                dt          => dt_from_string( $c->{issuedate} ),
235
                dt          => dt_from_string( $c->{issuedate} ),
Lines 225-230 while ( my $c = $sth->fetchrow_hashref() ) { Link Here
225
            }
243
            }
226
        ),
244
        ),
227
        lost    => $lost,
245
        lost    => $lost,
246
        claims_returned => $claims_returned,
228
        damaged => $damaged,
247
        damaged => $damaged,
229
        borrower => {
248
        borrower => {
230
            surname    => $c->{surname},
249
            surname    => $c->{surname},
(-)a/svc/return_claims (-1 / +127 lines)
Line 0 Link Here
0
- 
1
#!/usr/bin/perl
2
3
# Copyright 2019 ByWater Solutions
4
#
5
# This file is part of Koha.
6
#
7
# Koha is free software; you can redistribute it and/or modify it under the
8
# terms of the GNU General Public License as published by the Free Software
9
# Foundation; either version 3 of the License, or (at your option) any later
10
# version.
11
#
12
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14
# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License along
17
# with Koha; if not, write to the Free Software Foundation, Inc.,
18
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
20
use Modern::Perl;
21
22
use CGI;
23
use JSON qw(to_json);
24
25
use C4::Auth qw(check_cookie_auth haspermission get_session);
26
use C4::Context;
27
28
use Koha::AuthorisedValues;
29
use Koha::DateUtils;
30
use Koha::Patrons;
31
32
my $input = new CGI;
33
34
my ( $auth_status, $sessionID ) =
35
  check_cookie_auth( $input->cookie('CGISESSID') );
36
37
my $session = get_session($sessionID);
38
my $userid  = $session->param('id');
39
40
unless (
41
    haspermission(
42
        $userid, { circulate => 'circulate_remaining_permissions' }
43
    )
44
    || haspermission( $userid, { borrowers => 'edit_borrowers' } )
45
  )
46
{
47
    exit 0;
48
}
49
50
my @sort_columns = qw/title notes created_on updated_on/;
51
52
my $borrowernumber   = $input->param('borrowernumber');
53
my $offset           = $input->param('iDisplayStart');
54
my $results_per_page = $input->param('iDisplayLength') || -1;
55
56
my $sorting_column = $input->param('iSortCol_0') || q{};
57
$sorting_column =
58
  ( $sorting_column && $sort_columns[$sorting_column] )
59
  ? $sort_columns[$sorting_column]
60
  : 'created_on';
61
62
my $sorting_direction = $input->param('sSortDir_0') || q{};
63
$sorting_direction = $sorting_direction eq 'asc' ? 'asc' : 'desc';
64
65
$results_per_page = undef if ( $results_per_page == -1 );
66
67
binmode STDOUT, ":encoding(UTF-8)";
68
print $input->header( -type => 'text/plain', -charset => 'UTF-8' );
69
70
my $sql = qq{
71
    SELECT
72
        return_claims.*,
73
74
        biblio.biblionumber,
75
        biblio.title,
76
        biblio.author,
77
78
        items.enumchron,
79
        items.barcode
80
    FROM return_claims
81
        LEFT JOIN items USING ( itemnumber )
82
        LEFT JOIN biblio USING ( biblionumber )
83
        LEFT JOIN biblioitems USING ( biblionumber )
84
    WHERE return_claims.borrowernumber = ?
85
    ORDER BY $sorting_column $sorting_direction
86
};
87
88
my $dbh = C4::Context->dbh();
89
my $sth = $dbh->prepare($sql);
90
$sth->execute($borrowernumber);
91
92
my $resolved = 0;
93
my $unresolved = 0;
94
my @return_claims;
95
while ( my $claim = $sth->fetchrow_hashref() ) {
96
    $claim->{created_on_formatted}  = output_pref( { dt => dt_from_string( $claim->{created_on} ) } ) if $claim->{created_on};
97
    $claim->{updated_on_formatted}  = output_pref( { dt => dt_from_string( $claim->{updated_on} ) } ) if $claim->{updated_on};
98
    $claim->{resolved_on_formatted} = output_pref( { dt => dt_from_string( $claim->{resolved_on} ) } ) if $claim->{resolved_on};
99
100
    my $patron = $claim->{resolved_by} ? Koha::Patrons->find( $claim->{resolved_by} ) : undef;
101
    $claim->{resolved_by_data} = $patron->unblessed if $patron;
102
103
    my $resolution = $claim->{resolution}
104
      ? Koha::AuthorisedValues->find(
105
        {
106
            category         => 'RETURN_CLAIM_RESOLUTION',
107
            authorised_value => $claim->{resolution},
108
        }
109
      )
110
      : undef;
111
    $claim->{resolution_data} = $resolution->unblessed if $resolution;
112
113
    $claim->{resolved_on} ? $resolved++ : $unresolved++;
114
115
    push( @return_claims, $claim );
116
}
117
118
my $data = {
119
    iTotalRecords        => scalar @return_claims,
120
    iTotalDisplayRecords => scalar @return_claims,
121
    sEcho                => $input->param('sEcho') || undef,
122
    aaData               => \@return_claims,
123
    resolved             => $resolved,
124
    unresolved           => $unresolved
125
};
126
127
print to_json($data);

Return to bug 14697