Bug 24573: Add missing dependencies to cpanfile
[koha.git] / tools / import_borrowers.pl
blob4da2cd0d034117015fdadecb23761f47d3a87119
1 #!/usr/bin/perl
3 # Copyright 2007 Liblime
4 # Parts copyright 2010 BibLibre
6 # This file is part of Koha.
8 # Koha is free software; you can redistribute it and/or modify it
9 # under the terms of the GNU General Public License as published by
10 # the Free Software Foundation; either version 3 of the License, or
11 # (at your option) any later version.
13 # Koha is distributed in the hope that it will be useful, but
14 # WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
18 # You should have received a copy of the GNU General Public License
19 # along with Koha; if not, see <http://www.gnu.org/licenses>.
21 # Script to take some borrowers data in a known format and load it into Koha
23 # File format
25 # cardnumber,surname,firstname,title,othernames,initials,streetnumber,streettype,
26 # address line , address line 2, city, zipcode, contry, email, phone, mobile, fax, work email, work phone,
27 # alternate streetnumber, alternate streettype, alternate address line 1, alternate city,
28 # alternate zipcode, alternate country, alternate email, alternate phone, date of birth, branchcode,
29 # categorycode, enrollment date, expiry date, noaddress, lost, debarred, contact surname,
30 # contact firstname, contact title, borrower notes, contact relationship
31 # gender, username, opac note, contact note, password, sort one, sort two
33 # any fields except cardnumber can be blank but the number of fields must match
34 # dates should be in the format you have set up Koha to expect
35 # branchcode and categorycode need to be valid
37 use Modern::Perl;
39 use C4::Auth;
40 use C4::Output;
41 use C4::Templates;
42 use Koha::Patrons;
43 use Koha::DateUtils;
44 use Koha::Token;
45 use Koha::Libraries;
46 use Koha::Patron::Categories;
47 use Koha::List::Patron;
49 use Koha::Patrons::Import;
50 my $Import = Koha::Patrons::Import->new();
52 use Text::CSV;
54 # Text::CSV::Unicode, even in binary mode, fails to parse lines with these diacriticals:
55 # ė
56 # č
58 use CGI qw ( -utf8 );
60 my ( @errors, @feedback );
61 my $extended = C4::Context->preference('ExtendedPatronAttributes');
63 my @columnkeys = map { $_ ne 'borrowernumber' ? $_ : () } Koha::Patrons->columns();
64 push( @columnkeys, 'patron_attributes' ) if $extended;
65 push( @columnkeys, qw( relationship guarantor_id guarantor_firstname guarantor_surname ) );
67 my $input = CGI->new();
69 #push @feedback, {feedback=>1, name=>'backend', value=>$csv->backend, backend=>$csv->backend}; #XXX
71 my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
73 template_name => "tools/import_borrowers.tt",
74 query => $input,
75 type => "intranet",
76 authnotrequired => 0,
77 flagsrequired => { tools => 'import_patrons' },
78 debug => 1,
82 # get the patron categories and pass them to the template
83 my @patron_categories = Koha::Patron::Categories->search_limited({}, {order_by => ['description']});
84 $template->param( categories => \@patron_categories );
85 my $columns = C4::Templates::GetColumnDefs( $input )->{borrowers};
86 $columns = [ grep { $_->{field} ne 'borrowernumber' ? $_ : () } @$columns ];
87 $template->param( borrower_fields => $columns );
89 if ( $input->param('sample') ) {
90 our $csv = Text::CSV->new( { binary => 1 } ); # binary needed for non-ASCII Unicode
91 print $input->header(
92 -type => 'application/vnd.sun.xml.calc', # 'application/vnd.ms-excel' ?
93 -attachment => 'patron_import.csv',
95 $csv->combine(@columnkeys);
96 print $csv->string, "\n";
97 exit 0;
100 my $uploadborrowers = $input->param('uploadborrowers');
101 my $matchpoint = $input->param('matchpoint');
102 if ($matchpoint) {
103 $matchpoint =~ s/^patron_attribute_//;
106 #create a patronlist
107 my $createpatronlist = $input->param('createpatronlist') || 0;
108 my $dt = dt_from_string();
109 my $timestamp = $dt->ymd('-').' '.$dt->hms(':');
110 my $patronlistname = $uploadborrowers . ' (' . $timestamp .')';
112 $template->param( SCRIPT_NAME => '/cgi-bin/koha/tools/import_borrowers.pl' );
114 if ( $uploadborrowers && length($uploadborrowers) > 0 ) {
115 output_and_exit( $input, $cookie, $template, 'wrong_csrf_token' )
116 unless Koha::Token->new->check_csrf({
117 session_id => scalar $input->cookie('CGISESSID'),
118 token => scalar $input->param('csrf_token'),
121 my $handle = $input->upload('uploadborrowers');
122 my %defaults = $input->Vars;
124 my $return = $Import->import_patrons(
126 file => $handle,
127 defaults => \%defaults,
128 matchpoint => $matchpoint,
129 overwrite_cardnumber => $input->param('overwrite_cardnumber'),
130 preserve_extended_attributes => $input->param('ext_preserve') || 0,
134 my $feedback = $return->{feedback};
135 my $errors = $return->{errors};
136 my $imported = $return->{imported};
137 my $overwritten = $return->{overwritten};
138 my $alreadyindb = $return->{already_in_db};
139 my $invalid = $return->{invalid};
140 my $imported_borrowers = $return->{imported_borrowers};
142 if ( $imported && $createpatronlist ) {
143 my $patronlist = AddPatronList({ name => $patronlistname });
144 AddPatronsToList({ list => $patronlist, borrowernumbers => $imported_borrowers });
145 $template->param('patronlistname' => $patronlistname);
148 my $uploadinfo = $input->uploadInfo($uploadborrowers);
149 foreach ( keys %$uploadinfo ) {
150 push @$feedback, { feedback => 1, name => $_, value => $uploadinfo->{$_}, $_ => $uploadinfo->{$_} };
153 push @$feedback, { feedback => 1, name => 'filename', value => $uploadborrowers, filename => $uploadborrowers };
155 $template->param(
156 uploadborrowers => 1,
157 errors => $errors,
158 feedback => $feedback,
159 imported => $imported,
160 overwritten => $overwritten,
161 alreadyindb => $alreadyindb,
162 invalid => $invalid,
163 total => $imported + $alreadyindb + $invalid + $overwritten,
167 else {
168 if ($extended) {
169 my @matchpoints = ();
170 my @attr_types = C4::Members::AttributeTypes::GetAttributeTypes( undef, 1 );
171 foreach my $type (@attr_types) {
172 my $attr_type = C4::Members::AttributeTypes->fetch( $type->{code} );
173 if ( $attr_type->unique_id() ) {
174 push @matchpoints,
175 { code => "patron_attribute_" . $attr_type->code(), description => $attr_type->description() };
178 $template->param( matchpoints => \@matchpoints );
181 $template->param(
182 csrf_token => Koha::Token->new->generate_csrf(
183 { session_id => scalar $input->cookie('CGISESSID'), }
189 output_html_with_http_headers $input, $cookie, $template->output;