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

(-)a/Koha/List/Patron.pm (+22 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 unless ( $borrowernumber );
172
173
    my @list_ids = map { $_->patron_list_id } Koha::Database->new()->schema()->resultset('PatronListPatron')->search( { borrowernumber => $borrowernumber } );
174
    my $pl_rs = Koha::Database->new()->schema()->resultset('PatronList');
175
    my $where = { patron_list_id => { 'IN' => \@list_ids } };
176
    my $order = {order_by => 'name'};
177
178
    return $pl_rs->search( $where, $order );
179
}
180
159
=head2 AddPatronsToList
181
=head2 AddPatronsToList
160
182
161
    AddPatronsToList({ list => $list, cardnumbers => \@cardnumbers });
183
    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 631-636 if ( C4::Context->preference("ExportCircHistory") ) { Link Here
631
}
632
}
632
633
633
my $has_modifications = Koha::Patron::Modifications->search( { borrowernumber => $borrowernumber } )->count;
634
my $has_modifications = Koha::Patron::Modifications->search( { borrowernumber => $borrowernumber } )->count;
635
my $patron_lists_count = GetListsWithPatron({borrowernumber => $borrowernumber})->count();
634
$template->param(
636
$template->param(
635
    debt_confirmed            => $debt_confirmed,
637
    debt_confirmed            => $debt_confirmed,
636
    SpecifyDueDate            => $duedatespec_allow,
638
    SpecifyDueDate            => $duedatespec_allow,
Lines 639-644 $template->param( Link Here
639
    todaysdate                => dt_from_string()->set(hour => 23)->set(minute => 59),
641
    todaysdate                => dt_from_string()->set(hour => 23)->set(minute => 59),
640
    restriction_types         => scalar Koha::Patron::Restriction::Types->keyed_on_code(),
642
    restriction_types         => scalar Koha::Patron::Restriction::Types->keyed_on_code(),
641
    has_modifications         => $has_modifications,
643
    has_modifications         => $has_modifications,
644
    patron_lists_count        => $patron_lists_count,
642
    override_high_holds       => $override_high_holds,
645
    override_high_holds       => $override_high_holds,
643
    nopermission              => scalar $query->param('nopermission'),
646
    nopermission              => scalar $query->param('nopermission'),
644
    autoswitched              => $autoswitched,
647
    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 (+197 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
    <h4>Patron Lists currently in</h4>
9
10
    <table id="table_inlists">
11
        <thead>
12
            <tr>
13
                <th>Name</th>
14
                <th>Patrons in list</th>
15
                <th>Shared</th>
16
                [% IF CAN_user_tools_manage_patron_lists %]
17
                <th class="NoSort">Actions</th>
18
                [% END %]
19
            </tr>
20
        </thead>
21
22
        <tbody>
23
            [% FOREACH l IN in_lists %]
24
                [% SET shared_by_other = l.owner.id != logged_in_user.id %]
25
                <tr>
26
                    <td>
27
                        [% IF CAN_user_tools_manage_patron_lists %]
28
                        <a href="/cgi-bin/koha/patron_lists/list.pl?patron_list_id=[% l.patron_list_id | uri %]">[% l.name | html %]</a>
29
                        [% ELSE %]
30
                        [% l.name | html %]
31
                        [% END %]
32
                    </td>
33
                    <td>[% l.patron_list_patrons_rs.count || 0 | html %]</td>
34
                    <td>
35
                        [% IF l.shared %]
36
                            [% IF shared_by_other %]
37
                                by <a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% l.owner.id | uri %]">[% INCLUDE 'patron-title.inc' patron=l.owner %]</a>
38
                            [% ELSE %]
39
                                by you
40
                            [% END %]
41
                        [% END %]
42
                    </td>
43
                    [% IF CAN_user_tools_manage_patron_lists %]
44
                    <td>
45
                        <div class="btn-group dropup">
46
                            <a class="btn btn-default btn-xs dropdown-toggle" id="listactions[% l.patron_list_id | html %]" role="button" data-toggle="dropdown" href="#">
47
                                Actions <b class="caret"></b>
48
                            </a>
49
                            <ul class="dropdown-menu pull-right" role="menu" aria-labelledby="listactions[% l.patron_list_id | html %]">
50
                                <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>
51
                                <li class="divider"></li>
52
                                <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>
53
                                [% UNLESS shared_by_other %]
54
                                    <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>
55
                                    <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>
56
                                [% END %]
57
                                [% IF ( l.patron_list_patrons_rs.count ) %]
58
                                    <li class="divider"></li>
59
                                    <li>
60
                                        <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>
61
                                    </li>
62
                                    [% IF CAN_user_tools_edit_patrons %]
63
                                        <li>
64
                                            <a href="/cgi-bin/koha/tools/modborrowers.pl?patron_list_id=[% l.patron_list_id | uri %]&op=show">
65
                                                <i class="fa fa-pencil"></i> Batch edit patrons
66
                                            </a>
67
                                        </li>
68
                                    [% END %]
69
                                    [% IF CAN_user_tools_delete_anonymize_patrons %]
70
                                        <li>
71
                                            <a href="/cgi-bin/koha/tools/cleanborrowers.pl?step=2&patron_list_id=[% l.patron_list_id | uri %]&checkbox=borrower">
72
                                                <i class="fa fa-trash"></i> Batch delete patrons
73
                                            </a>
74
                                        </li>
75
                                    [% END %]
76
                                [% END %]
77
                            </ul>
78
                        </div>
79
                    </td>
80
                    [% END %]
81
                </tr>
82
            [% END %]
83
        </tbody>
84
    </table>
85
[% END %]
86
87
[% IF available_lists %]
88
89
    <h4>Patron lists not in</h4>
90
91
    <table id="table_listnopatron">
92
        <thead>
93
            <tr>
94
                <th>Name</th>
95
                <th>Patrons in list</th>
96
                <th>Shared</th>
97
                [% IF CAN_user_tools_manage_patron_lists %]
98
                <th class="NoSort">Actions</th>
99
                [% END %]
100
            </tr>
101
        </thead>
102
103
        <tbody>
104
            [% FOREACH l IN available_lists %]
105
                [% SET shared_by_other = l.owner.id != logged_in_user.id %]
106
                <tr>
107
                    <td>
108
                        [% IF CAN_user_tools_manage_patron_lists %]
109
                        <a href="/cgi-bin/koha/patron_lists/list.pl?patron_list_id=[% l.patron_list_id | uri %]">[% l.name | html %]</a>
110
                        [% ELSE %]
111
                        [% l.name | html %]
112
                        [% END %]
113
                    </td>
114
                    <td>[% l.patron_list_patrons_rs.count || 0 | html %]</td>
115
                    <td>
116
                        [% IF l.shared %]
117
                            [% IF shared_by_other %]
118
                                by <a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% l.owner.id | uri %]">[% INCLUDE 'patron-title.inc' patron=l.owner %]</a>
119
                            [% ELSE %]
120
                                by you
121
                            [% END %]
122
                        [% END %]
123
                    </td>
124
                    [% IF CAN_user_tools_manage_patron_lists %]
125
                    <td>
126
                        <div class="btn-group dropup">
127
                            <a class="btn btn-default btn-xs dropdown-toggle" id="listactions[% l.patron_list_id | html %]" role="button" data-toggle="dropdown" href="#">
128
                                Actions <b class="caret"></b>
129
                            </a>
130
                            <ul class="dropdown-menu pull-right" role="menu" aria-labelledby="listactions[% l.patron_list_id | html %]">
131
                                <li><a onclick="addToList('[% l.patron_list_id | html %]','[% cardnumber | html %]')"><i class="fa fa-plus"></i> Add patron to list</a></li>
132
                                <li class="divider"></li>
133
                                <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>
134
                                [% UNLESS shared_by_other %]
135
                                    <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>
136
                                    <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>
137
                                [% END %]
138
                                [% IF ( l.patron_list_patrons_rs.count ) %]
139
                                    <li class="divider"></li>
140
                                    <li>
141
                                        <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>
142
                                    </li>
143
                                    [% IF CAN_user_tools_edit_patrons %]
144
                                        <li>
145
                                            <a href="/cgi-bin/koha/tools/modborrowers.pl?patron_list_id=[% l.patron_list_id | uri %]&op=show">
146
                                                <i class="fa fa-pencil"></i> Batch edit patrons
147
                                            </a>
148
                                        </li>
149
                                    [% END %]
150
                                    [% IF CAN_user_tools_delete_anonymize_patrons %]
151
                                        <li>
152
                                            <a href="/cgi-bin/koha/tools/cleanborrowers.pl?step=2&patron_list_id=[% l.patron_list_id | uri %]&checkbox=borrower">
153
                                                <i class="fa fa-trash"></i> Batch delete patrons
154
                                            </a>
155
                                        </li>
156
                                    [% END %]
157
                                [% END %]
158
                            </ul>
159
                        </div>
160
                    </td>
161
                    [% END %]
162
                </tr>
163
            [% END %]
164
        </tbody>
165
    </table>
166
[% END %]
167
168
<script>
169
$("#table_listnopatron, #table_inlists").dataTable($.extend(true, {}, dataTablesDefaults, {
170
    "columnDefs": [
171
        { 'sortable': false, 'targets': [ 'NoSort' ] }
172
    ],
173
    paginate: true
174
}));
175
176
[% IF CAN_user_tools_manage_patron_lists %]
177
function addToList( list_id, cardnumber ) {
178
    $('#pat_lists-tab').text(_("Loading..."));
179
    $("body").css("cursor", "progress");
180
    $('#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() {
181
        $("body").css("cursor", "default");
182
    });
183
184
    return false;
185
}
186
187
function removeFromList( list_id, patron_list_patron_id ) {
188
    $('#pat_lists-tab').text(_("Loading..."));
189
    $("body").css("cursor", "progress");
190
    $('#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() {
191
        $("body").css("cursor", "default");
192
    });
193
194
    return false;
195
}
196
[% END %]
197
</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 / +90 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
    if ( $list_id && ( $userflags->{'tools'} == 1 || $userflags->{'tools'}{'manage_patron_lists'} ) ) {
55
        my ($list) = GetPatronLists( { patron_list_id => $list_id } );
56
57
        if (@patrons_to_add) {
58
            AddPatronsToList( { list => $list, cardnumbers => \@patrons_to_add } );
59
        }
60
61
        if (@patrons_to_remove) {
62
            DelPatronsFromList( { list => $list, patron_list_patrons => \@patrons_to_remove } );
63
        }
64
    }
65
66
    if ( $patron ) {
67
        @in_lists = GetListsWithPatron({borrowernumber=>$patronnumber});
68
        foreach my $list ( @in_lists ) {
69
            my @existing = $list->patron_list_patrons;
70
            for my $plp ( @existing ) {
71
                if ( $plp->borrowernumber->borrowernumber == $patronnumber ) {
72
                    $list_id_lookup{$list->patron_list_id} = $plp->patron_list_patron_id;
73
                    last;
74
                }
75
            }
76
        }
77
    }
78
    @available_lists = GetPatronLists();
79
    @available_lists = grep { ! $list_id_lookup{$_->patron_list_id} } @available_lists;
80
}
81
82
$template->param(
83
    in_lists => \@in_lists,
84
    list_id_lookup => \%list_id_lookup,
85
    available_lists => \@available_lists,
86
    borrowernumber => $patronnumber,
87
    cardnumber => $patron->cardnumber,
88
);
89
90
output_html_with_http_headers( $cgi, $cookie, $template->output );

Return to bug 32730