Bug 17578: GetMemberDetails - Remove GetMemberDetails
[koha.git] / misc / export_borrowers.pl
1 #!/usr/bin/perl
2
3 # Copyright 2011 BibLibre
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 # Script to export borrowers
21
22 use Modern::Perl;
23 use Text::CSV;
24 use Getopt::Long qw(:config no_ignore_case);
25
26 use C4::Context;
27 use C4::Members;
28
29 binmode STDOUT, ":encoding(UTF-8)";
30
31 sub print_usage {
32     ( my $basename = $0 ) =~ s|.*/||;
33     print <<USAGE;
34
35 $basename
36     Export patron informations in CSV format.
37     It prints to standard output. Use redirection to save CSV in a file.
38
39 Usage:
40 $0 [--field=FIELD [--field=FIELD [...]]] [--separator=CHAR] [--show-header] [--where=CONDITION]
41 $0 -h
42
43     -f, --field=FIELD       Field to export. It is repeatable and has to match
44                             keys returned by the GetMember function.
45                             If no field is specified, then all fields will be
46                             exported.
47     -s, --separator=CHAR    This character will be used to separate fields.
48                             Some characters like | or ; will need to be escaped
49                             in the parameter setting, like -s=\\| or -s=\\;
50                             If no separator is specified, the delimiter pref
51                             will be used (or a comma, if the pref is empty)
52     -H, --show-header       Print field names on first row
53     -w, --where=CONDITION   Condition to filter borrowers to export
54                             (SQL where clause).
55                             CONDITION must be enclosed by double quotes
56                             You can use single quotes around a field value
57                             within the condition like:
58                                 --where "surname='De Lattre'"
59     -h, --help              Show this help
60
61 USAGE
62 }
63
64 # Getting parameters
65 my @fields;
66 my $separator;
67 my $show_header;
68 my $where;
69 my $help;
70
71 GetOptions(
72     'field|f=s'     => \@fields,
73     'separator|s=s' => \$separator,
74     'show-header|H' => \$show_header,
75     'where|w=s'       => \$where,
76     'help|h'        => \$help
77 ) or print_usage, exit 1;
78
79 if ($help) {
80     print_usage;
81     exit;
82 }
83
84 # Getting borrowers
85 my $dbh   = C4::Context->dbh;
86 my $query = "SELECT borrowernumber FROM borrowers";
87 $query .= " WHERE $where" if ($where);
88 $query .= " ORDER BY borrowernumber";
89 my $sth   = $dbh->prepare($query);
90 $sth->execute;
91
92 unless ( $separator ) {
93     $separator = C4::Context->preference('delimiter') || ',';
94     $separator = "\t" if ($separator eq 'tabulation');
95 }
96
97 my $csv = Text::CSV->new( { sep_char => $separator, binary => 1 } );
98
99 # If the user did not specify any field to export, we assume he wants them all
100 # We retrieve the first borrower informations to get field names
101 my ($borrowernumber) = $sth->fetchrow_array or die "No borrower to export";
102 my $member = GetMember($borrowernumber); # FIXME Now is_expired is no longer available
103                                          # We will have to use Koha::Patron and allow method calls
104 @fields = keys %$member unless (@fields);
105
106 if ($show_header) {
107     $csv->combine(@fields);
108     print $csv->string . "\n";
109 }
110
111 $csv->combine(
112     map {
113         ( defined $member->{$_} and !ref $member->{$_} )
114           ? $member->{$_}
115           : ''
116       } @fields
117 );
118 die "Invalid character at borrower $borrowernumber: ["
119   . $csv->error_input . "]\n"
120   if ( !defined( $csv->string ) );
121 print $csv->string . "\n";
122
123 while ( my $borrowernumber = $sth->fetchrow_array ) {
124     $member = GetMember( borrowernumber => $borrowernumber );
125     $csv->combine(
126         map {
127             ( defined $member->{$_} and !ref $member->{$_} )
128               ? $member->{$_}
129               : ''
130           } @fields
131     );
132     die "Invalid character at borrower $borrowernumber: ["
133       . $csv->error_input . "]\n"
134       if ( !defined( $csv->string ) );
135     print $csv->string . "\n";
136 }