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

(-)a/Koha/List/Patron.pm (+24 lines)
Lines 42-47 BEGIN { Link Here
42
      AddPatronList
42
      AddPatronList
43
      ModPatronList
43
      ModPatronList
44
44
45
      GetListsWithPatron
45
      AddPatronsToList
46
      AddPatronsToList
46
      DelPatronsFromList
47
      DelPatronsFromList
47
    );
48
    );
Lines 156-161 sub ModPatronList { Link Here
156
    return $list->update($params);
157
    return $list->update($params);
157
}
158
}
158
159
160
=head2 GetListsWithPatron
161
162
    GetListsWithPatron({ borrowernumber => $borrowernumber });
163
164
=cut
165
166
sub GetListsWithPatron {
167
    my ($params) = @_;
168
169
    my $borrowernumber = $params->{'borrowernumber'};
170
171
    return Koha::Database->new()->schema()->resultset('PatronList')->search(
172
        {
173
            'patron_list_patrons.borrowernumber' => $borrowernumber,
174
        },
175
        {
176
            join => 'patron_list_patrons',
177
            collapse => 1,
178
            order_by => 'name',
179
        }
180
    );
181
}
182
159
=head2 AddPatronsToList
183
=head2 AddPatronsToList
160
184
161
    AddPatronsToList({ list => $list, cardnumbers => \@cardnumbers });
185
    AddPatronsToList({ list => $list, cardnumbers => \@cardnumbers });
(-)a/circ/circulation.pl (+3 lines)
Lines 54-59 use Koha::Items; Link Here
54
use Koha::SearchEngine;
54
use Koha::SearchEngine;
55
use Koha::SearchEngine::Search;
55
use Koha::SearchEngine::Search;
56
use Koha::Patron::Modifications;
56
use Koha::Patron::Modifications;
57
use Koha::List::Patron qw( GetListsWithPatron );
57
use Koha::Token;
58
use Koha::Token;
58
59
59
use List::MoreUtils qw( uniq );
60
use List::MoreUtils qw( uniq );
Lines 623-628 if ( C4::Context->preference("ExportCircHistory") ) { Link Here
623
}
624
}
624
625
625
my $has_modifications = Koha::Patron::Modifications->search( { borrowernumber => $borrowernumber } )->count;
626
my $has_modifications = Koha::Patron::Modifications->search( { borrowernumber => $borrowernumber } )->count;
627
my $patron_lists_count = GetListsWithPatron({borrowernumber => $borrowernumber})->count();
626
$template->param(
628
$template->param(
627
    debt_confirmed            => $debt_confirmed,
629
    debt_confirmed            => $debt_confirmed,
628
    SpecifyDueDate            => $duedatespec_allow,
630
    SpecifyDueDate            => $duedatespec_allow,
Lines 631-636 $template->param( Link Here
631
    todaysdate                => dt_from_string()->set(hour => 23)->set(minute => 59),
633
    todaysdate                => dt_from_string()->set(hour => 23)->set(minute => 59),
632
    restriction_types         => scalar Koha::Patron::Restriction::Types->keyed_on_code(),
634
    restriction_types         => scalar Koha::Patron::Restriction::Types->keyed_on_code(),
633
    has_modifications         => $has_modifications,
635
    has_modifications         => $has_modifications,
636
    patron_lists_count        => $patron_lists_count,
634
    override_high_holds       => $override_high_holds,
637
    override_high_holds       => $override_high_holds,
635
    nopermission              => scalar $query->param('nopermission'),
638
    nopermission              => scalar $query->param('nopermission'),
636
    autoswitched              => $autoswitched,
639
    autoswitched              => $autoswitched,
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt (+21 lines)
Lines 893-898 Link Here
893
                                </a>
893
                                </a>
894
                            </li>
894
                            </li>
895
                        [% END %]
895
                        [% END %]
896
897
                        [% IF CAN_user_tools_manage_patron_lists || patron_lists_count %]
898
                            <li role="presentation">
899
                                <a id="pat_lists-tab-link" href="#pat_lists-tab" aria-controls="pat_lists-tab" role="tab" data-toggle="tab">
900
                                    Patron Lists ([% patron_lists_count | html %])
901
                                </a>
902
                            </li>
903
                        [% END %]
896
                    </ul>
904
                    </ul>
897
905
898
                    <div class="tab-content">
906
                    <div class="tab-content">
Lines 908-913 Link Here
908
                            </div> <!-- /#clubs-tab -->
916
                            </div> <!-- /#clubs-tab -->
909
                        [% END %]
917
                        [% END %]
910
918
919
                        [% IF CAN_user_tools_manage_patron_lists || patron_lists_count %]
920
                            <div id="pat_lists-tab" role="tabpanel" class="tab-pane">
921
                                Loading...
922
                            </div>
923
                        [% END %]
924
911
                        [% INCLUDE borrower_debarments.inc %]
925
                        [% INCLUDE borrower_debarments.inc %]
912
926
913
                        <div id="reserves" role="tabpanel" class="tab-pane">
927
                        <div id="reserves" role="tabpanel" class="tab-pane">
Lines 1116-1121 Link Here
1116
                });
1130
                });
1117
            }
1131
            }
1118
1132
1133
            if ( $('#pat_lists-tab').length ) {
1134
                $('#pat_lists-tab-link').on('click', function() {
1135
                    $('#pat_lists-tab').text(_("Loading..."));
1136
                    $('#pat_lists-tab').load('/cgi-bin/koha/patron_lists/patron-lists-tab.pl?borrowernumber=[% patron.borrowernumber | html %]');
1137
                });
1138
            }
1139
1119
            // listen submit to trigger qslip on empty checkout
1140
            // listen submit to trigger qslip on empty checkout
1120
            $('#mainform').bind('submit',function() {
1141
            $('#mainform').bind('submit',function() {
1121
                if ($('#barcode').val() == '') {
1142
                if ($('#barcode').val() == '') {
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt (+21 lines)
Lines 725-730 Link Here
725
                                    </a>
725
                                    </a>
726
                                </li>
726
                                </li>
727
                            [% END %]
727
                            [% END %]
728
729
                            [% IF CAN_user_tools_manage_patron_lists || patron_lists_count %]
730
                                <li role="presentation">
731
                                    <a id="pat_lists-tab-link" href="#pat_lists-tab" aria-controls="pat_lists-tab" role="tab" data-toggle="tab">
732
                                        Patron Lists ([% patron_lists_count | html %])
733
                                    </a>
734
                                </li>
735
                            [% END %]
728
                        </ul>
736
                        </ul>
729
737
730
                        <div class="tab-content">
738
                        <div class="tab-content">
Lines 748-753 Link Here
748
                                </div>
756
                                </div>
749
                            [% END %]
757
                            [% END %]
750
758
759
                            [% IF CAN_user_tools_manage_patron_lists || patron_lists_count %]
760
                                <div id="pat_lists-tab" role="tabpanel" class="tab-pane">
761
                                    Loading...
762
                                </div>
763
                            [% END %]
764
751
                            [% INCLUDE borrower_debarments.inc %]
765
                            [% INCLUDE borrower_debarments.inc %]
752
766
753
                            [% IF ( CAN_user_circulate_circulate_remaining_permissions ) %]
767
                            [% IF ( CAN_user_circulate_circulate_remaining_permissions ) %]
Lines 902-907 Link Here
902
                });
916
                });
903
            }
917
            }
904
918
919
            if ( $('#pat_lists-tab').length ) {
920
                $('#pat_lists-tab-link').on('click', function() {
921
                    $('#pat_lists-tab').text(_("Loading..."));
922
                    $('#pat_lists-tab').load('/cgi-bin/koha/patron_lists/patron-lists-tab.pl?borrowernumber=[% patron.borrowernumber | html %]');
923
                });
924
            }
925
905
            $("#finesholdsissues a[data-toggle='tab']").on("shown.bs.tab", function(e){
926
            $("#finesholdsissues a[data-toggle='tab']").on("shown.bs.tab", function(e){
906
                var oTable = $('div.dataTables_wrapper > table', $(e.target.hash) ).dataTable();
927
                var oTable = $('div.dataTables_wrapper > table', $(e.target.hash) ).dataTable();
907
                if ( oTable.length > 0 ) {
928
                if ( oTable.length > 0 ) {
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/patron_lists/patron-lists-tab.tt (+204 lines)
Line 0 Link Here
1
[% USE KohaDates %]
2
3
[% IF no_access_to_patron %]
4
   <span class="blocker">Patron not in your library group</span>
5
[% END %]
6
7
[% IF in_lists %]
8
<div class="patroninfo-section">
9
    <h4>Patron lists currently in</h4>
10
11
    <table id="table_inlists">
12
        <thead>
13
            <tr>
14
                <th>Name</th>
15
                <th>Patrons in list</th>
16
                <th>Shared</th>
17
                [% IF CAN_user_tools_manage_patron_lists %]
18
                    <th class="NoSort">Actions</th>
19
                [% END %]
20
            </tr>
21
        </thead>
22
23
        <tbody>
24
            [% FOREACH l IN in_lists %]
25
                [% SET shared_by_other = l.owner.id != logged_in_user.id %]
26
                <tr>
27
                    <td>
28
                        [% IF CAN_user_tools_manage_patron_lists %]
29
                            <a href="/cgi-bin/koha/patron_lists/list.pl?patron_list_id=[% l.patron_list_id | uri %]">[% l.name | html %]</a>
30
                        [% ELSE %]
31
                            [% l.name | html %]
32
                        [% END %]
33
                    </td>
34
                    <td>[% l.patron_list_patrons_rs.count || 0 | html %]</td>
35
                    <td>
36
                        [% IF l.shared %]
37
                            [% IF shared_by_other %]
38
                                by <a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% l.owner.id | uri %]">[% INCLUDE 'patron-title.inc' patron=l.owner %]</a>
39
                            [% ELSE %]
40
                                by you
41
                            [% END %]
42
                        [% END %]
43
                    </td>
44
                    [% IF CAN_user_tools_manage_patron_lists %]
45
                        <td>
46
                            <div class="btn-group dropup">
47
                                <a class="btn btn-default btn-xs dropdown-toggle" id="listactions[% l.patron_list_id | html %]" role="button" data-toggle="dropdown" href="#">
48
                                    Actions <b class="caret"></b>
49
                                </a>
50
                                <ul class="dropdown-menu pull-right" role="menu" aria-labelledby="listactions[% l.patron_list_id | html %]">
51
                                    <li><a onclick="removeFromList('[% l.patron_list_id | html %]','[% list_id_lookup.${l.patron_list_id} | html %]')"><i class="fa fa-remove"></i> Remove patron from list</a></li>
52
                                    <li class="divider"></li>
53
                                    <li><a href="/cgi-bin/koha/patron_lists/list.pl?patron_list_id=[% l.patron_list_id | uri %]"><i class="fa fa-user"></i> Add patrons</a></li>
54
                                    [% UNLESS shared_by_other %]
55
                                        <li><a href="/cgi-bin/koha/patron_lists/add-modify.pl?patron_list_id=[% l.patron_list_id | uri %]"><i class="fa fa-pencil"></i> Edit list</a></li>
56
                                        <li><a class="delete_patron" href="/cgi-bin/koha/patron_lists/delete.pl?patron_list_id=[% l.patron_list_id | html %]" data-list-name="[% l.name | html %]"><i class="fa fa-trash"></i> Delete list</a></li>
57
                                    [% END %]
58
                                    [% IF ( l.patron_list_patrons_rs.count ) %]
59
                                        <li class="divider"></li>
60
                                        <li>
61
                                            <a class="print_cards" href="/cgi-bin/koha/patroncards/print.pl?patronlist_id=[% l.patron_list_id | html %]" data-patron_list_id="[% l.patron_list_id | html %]"><i class="fa fa-print"></i> Print patron cards</a>
62
                                        </li>
63
                                        [% IF CAN_user_tools_edit_patrons %]
64
                                            <li>
65
                                                <a href="/cgi-bin/koha/tools/modborrowers.pl?patron_list_id=[% l.patron_list_id | uri %]&op=show">
66
                                                    <i class="fa fa-pencil"></i> Batch edit patrons
67
                                                </a>
68
                                            </li>
69
                                        [% END %]
70
                                        [% IF CAN_user_tools_delete_anonymize_patrons %]
71
                                            <li>
72
                                                <a href="/cgi-bin/koha/tools/cleanborrowers.pl?step=2&patron_list_id=[% l.patron_list_id | uri %]&checkbox=borrower">
73
                                                    <i class="fa fa-trash"></i> Batch delete patrons
74
                                                </a>
75
                                            </li>
76
                                        [% END %]
77
                                    [% END %]
78
                                </ul>
79
                            </div>
80
                        </td>
81
                    [% END %]
82
                </tr>
83
            [% END %]
84
        </tbody>
85
    </table>
86
</div>
87
88
[% IF available_lists %]
89
<hr>
90
[% END %]
91
[% END %]
92
93
[% IF available_lists %]
94
<div class="patroninfo-section">
95
    <h4>Patron lists not in</h4>
96
97
    <table id="table_listnopatron">
98
        <thead>
99
            <tr>
100
                <th>Name</th>
101
                <th>Patrons in list</th>
102
                <th>Shared</th>
103
                [% IF CAN_user_tools_manage_patron_lists %]
104
                    <th class="NoSort">Actions</th>
105
                [% END %]
106
            </tr>
107
        </thead>
108
109
        <tbody>
110
            [% FOREACH l IN available_lists %]
111
                [% SET shared_by_other = l.owner.id != logged_in_user.id %]
112
                <tr>
113
                    <td>
114
                        [% IF CAN_user_tools_manage_patron_lists %]
115
                            <a href="/cgi-bin/koha/patron_lists/list.pl?patron_list_id=[% l.patron_list_id | uri %]">[% l.name | html %]</a>
116
                        [% ELSE %]
117
                            [% l.name | html %]
118
                        [% END %]
119
                    </td>
120
                    <td>[% l.patron_list_patrons_rs.count || 0 | html %]</td>
121
                    <td>
122
                        [% IF l.shared %]
123
                            [% IF shared_by_other %]
124
                                by <a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% l.owner.id | uri %]">[% INCLUDE 'patron-title.inc' patron=l.owner %]</a>
125
                            [% ELSE %]
126
                                by you
127
                            [% END %]
128
                        [% END %]
129
                    </td>
130
                    [% IF CAN_user_tools_manage_patron_lists %]
131
                        <td>
132
                            <div class="btn-group dropup">
133
                                <a class="btn btn-default btn-xs dropdown-toggle" id="listactions[% l.patron_list_id | html %]" role="button" data-toggle="dropdown" href="#">
134
                                    Actions <b class="caret"></b>
135
                                </a>
136
                                <ul class="dropdown-menu pull-right" role="menu" aria-labelledby="listactions[% l.patron_list_id | html %]">
137
                                    <li><a onclick="addToList('[% l.patron_list_id | html %]','[% cardnumber | html %]')"><i class="fa fa-plus"></i> Add patron to list</a></li>
138
                                    <li class="divider"></li>
139
                                    <li><a href="/cgi-bin/koha/patron_lists/list.pl?patron_list_id=[% l.patron_list_id | uri %]"><i class="fa fa-user"></i> Add patrons</a></li>
140
                                    [% UNLESS shared_by_other %]
141
                                        <li><a href="/cgi-bin/koha/patron_lists/add-modify.pl?patron_list_id=[% l.patron_list_id | uri %]"><i class="fa fa-pencil"></i> Edit list</a></li>
142
                                        <li><a class="delete_patron" href="/cgi-bin/koha/patron_lists/delete.pl?patron_list_id=[% l.patron_list_id | html %]" data-list-name="[% l.name | html %]"><i class="fa fa-trash"></i> Delete list</a></li>
143
                                    [% END %]
144
                                    [% IF ( l.patron_list_patrons_rs.count ) %]
145
                                        <li class="divider"></li>
146
                                        <li>
147
                                            <a class="print_cards" href="/cgi-bin/koha/patroncards/print.pl?patronlist_id=[% l.patron_list_id | html %]" data-patron_list_id="[% l.patron_list_id | html %]"><i class="fa fa-print"></i> Print patron cards</a>
148
                                        </li>
149
                                        [% IF CAN_user_tools_edit_patrons %]
150
                                            <li>
151
                                                <a href="/cgi-bin/koha/tools/modborrowers.pl?patron_list_id=[% l.patron_list_id | uri %]&op=show">
152
                                                    <i class="fa fa-pencil"></i> Batch edit patrons
153
                                                </a>
154
                                            </li>
155
                                        [% END %]
156
                                        [% IF CAN_user_tools_delete_anonymize_patrons %]
157
                                            <li>
158
                                                <a href="/cgi-bin/koha/tools/cleanborrowers.pl?step=2&patron_list_id=[% l.patron_list_id | uri %]&checkbox=borrower">
159
                                                    <i class="fa fa-trash"></i> Batch delete patrons
160
                                                </a>
161
                                            </li>
162
                                        [% END %]
163
                                    [% END %]
164
                                </ul>
165
                            </div>
166
                        </td>
167
                    [% END %]
168
                </tr>
169
            [% END %]
170
        </tbody>
171
    </table>
172
</div>
173
[% END %]
174
175
<script>
176
    $("#table_listnopatron, #table_inlists").dataTable($.extend(true, {}, dataTablesDefaults, {
177
        "columnDefs": [
178
            { 'sortable': false, 'targets': [ 'NoSort' ] }
179
        ],
180
        paginate: true
181
    }));
182
183
    [% IF CAN_user_tools_manage_patron_lists %]
184
        function addToList( list_id, cardnumber ) {
185
            $('#pat_lists-tab').text(_("Loading..."));
186
            $("body").css("cursor", "progress");
187
            $('#pat_lists-tab').load('/cgi-bin/koha/patron_lists/patron-lists-tab.pl?borrowernumber=[% borrowernumber | html %]&patron_list_id=' + list_id + '&patrons_to_add=' + cardnumber, function() {
188
                $("body").css("cursor", "default");
189
            });
190
191
            return false;
192
        }
193
194
        function removeFromList( list_id, patron_list_patron_id ) {
195
            $('#pat_lists-tab').text(_("Loading..."));
196
            $("body").css("cursor", "progress");
197
            $('#pat_lists-tab').load('/cgi-bin/koha/patron_lists/patron-lists-tab.pl?borrowernumber=[% borrowernumber | html %]&patron_list_id=' + list_id + '&patrons_to_remove=' + patron_list_patron_id, function() {
198
                $("body").css("cursor", "default");
199
            });
200
201
            return false;
202
        }
203
    [% END %]
204
</script>
(-)a/members/moremember.pl (+3 lines)
Lines 43-48 use Koha::CsvProfiles; Link Here
43
use Koha::Holds;
43
use Koha::Holds;
44
use Koha::Patrons;
44
use Koha::Patrons;
45
use Koha::Patron::Files;
45
use Koha::Patron::Files;
46
use Koha::List::Patron qw( GetListsWithPatron );
46
use Koha::Token;
47
use Koha::Token;
47
use Koha::Checkouts;
48
use Koha::Checkouts;
48
49
Lines 266-271 elsif ( $patron->is_going_to_expire ) { Link Here
266
267
267
268
268
my $has_modifications = Koha::Patron::Modifications->search( { borrowernumber => $borrowernumber } )->count;
269
my $has_modifications = Koha::Patron::Modifications->search( { borrowernumber => $borrowernumber } )->count;
270
my $patron_lists_count = GetListsWithPatron({borrowernumber => $borrowernumber})->count();
269
271
270
$template->param(
272
$template->param(
271
    patron          => $patron,
273
    patron          => $patron,
Lines 283-288 $template->param( Link Here
283
    files => Koha::Patron::Files->new( borrowernumber => $borrowernumber ) ->GetFilesInfo(),
285
    files => Koha::Patron::Files->new( borrowernumber => $borrowernumber ) ->GetFilesInfo(),
284
    #debarments                => scalar GetDebarments({ borrowernumber => $borrowernumber }),
286
    #debarments                => scalar GetDebarments({ borrowernumber => $borrowernumber }),
285
    has_modifications         => $has_modifications,
287
    has_modifications         => $has_modifications,
288
    patron_lists_count => $patron_lists_count,
286
);
289
);
287
290
288
if ( C4::Context->preference('UseRecalls') ) {
291
if ( C4::Context->preference('UseRecalls') ) {
(-)a/patron_lists/patron-lists-tab.pl (-1 / +91 lines)
Line 0 Link Here
0
- 
1
#!/usr/bin/perl
2
3
# Copyright 2013 ByWater Solutions
4
#
5
# This file is part of Koha.
6
#
7
# Koha is free software; you can redistribute it and/or modify it
8
# under the terms of the GNU General Public License as published by
9
# the Free Software Foundation; either version 3 of the License, or
10
# (at your option) any later version.
11
#
12
# Koha is distributed in the hope that it will be useful, but
13
# WITHOUT ANY WARRANTY; without even the implied warranty of
14
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
# GNU General Public License for more details.
16
#
17
# You should have received a copy of the GNU General Public License
18
# along with Koha; if not, see <http://www.gnu.org/licenses>.
19
20
use Modern::Perl;
21
22
use CGI;
23
24
use C4::Auth qw( get_template_and_user );
25
use C4::Output qw( output_html_with_http_headers );
26
27
use Koha::Patrons;
28
use Koha::List::Patron qw( GetPatronLists GetListsWithPatron AddPatronsToList DelPatronsFromList );
29
30
my $cgi = CGI->new;
31
32
my ( $template, $loggedinuser, $cookie, $userflags ) = get_template_and_user(
33
    {
34
        template_name   => "patron_lists/patron-lists-tab.tt",
35
        query           => $cgi,
36
        type            => "intranet",
37
        flagsrequired   => [ { circulate => 'circulate_remaining_permissions' }, { borrowers => '*' }, { tools => 'manage_patron_lists' } ],
38
    }
39
);
40
41
my $logged_in_user = Koha::Patrons->find( { borrowernumber =>  $loggedinuser } );
42
my $patronnumber = $cgi->param('borrowernumber');
43
my $patron = Koha::Patrons->find($patronnumber);
44
my ( @in_lists, %list_id_lookup, @available_lists );
45
46
my $list_id = $cgi->param('patron_list_id');
47
my @patrons_to_add = $cgi->multi_param('patrons_to_add');
48
my @patrons_to_remove = $cgi->multi_param('patrons_to_remove');
49
50
if ( ! $logged_in_user->can_see_patron_infos($patron) ) {
51
    $template->param('no_access_to_patron' => 1);
52
}
53
else {
54
    my $has_perms = C4::Auth::haspermission($logged_in_user->userid, {'tools'=>'manage_patron_lists'});
55
    if ( $list_id && $has_perms ) {
56
        my ($list) = GetPatronLists( { patron_list_id => $list_id } );
57
58
        if (@patrons_to_add) {
59
            AddPatronsToList( { list => $list, cardnumbers => \@patrons_to_add } );
60
        }
61
62
        if (@patrons_to_remove) {
63
            DelPatronsFromList( { list => $list, patron_list_patrons => \@patrons_to_remove } );
64
        }
65
    }
66
67
    if ( $patron ) {
68
        @in_lists = GetListsWithPatron({borrowernumber=>$patronnumber});
69
        foreach my $list ( @in_lists ) {
70
            my @existing = $list->patron_list_patrons;
71
            for my $plp ( @existing ) {
72
                if ( $plp->borrowernumber->borrowernumber == $patronnumber ) {
73
                    $list_id_lookup{$list->patron_list_id} = $plp->patron_list_patron_id;
74
                    last;
75
                }
76
            }
77
        }
78
    }
79
    @available_lists = GetPatronLists();
80
    @available_lists = grep { ! $list_id_lookup{$_->patron_list_id} } @available_lists;
81
}
82
83
$template->param(
84
    in_lists => \@in_lists,
85
    list_id_lookup => \%list_id_lookup,
86
    available_lists => \@available_lists,
87
    borrowernumber => $patronnumber,
88
    cardnumber => $patron->cardnumber,
89
);
90
91
output_html_with_http_headers( $cgi, $cookie, $template->output );

Return to bug 32730