summaryrefslogtreecommitdiff
path: root/FS/FS/contact
diff options
context:
space:
mode:
authorChristopher Burger <burgerc@freeside.biz>2017-09-07 08:49:34 -0400
committerChristopher Burger <burgerc@freeside.biz>2017-09-08 10:54:45 -0400
commitf16d9ebb0e56f43e04242ed859d6055f98c74f15 (patch)
treec30fc3e073f47236f0a2e13268710302a71c32d1 /FS/FS/contact
parent0505597728b8a0b9b0f3b97c2e3c0607b869f92f (diff)
RT# 77167 - Added the ability to import a list of contacts
Diffstat (limited to 'FS/FS/contact')
-rw-r--r--FS/FS/contact/Import.pm161
1 files changed, 161 insertions, 0 deletions
diff --git a/FS/FS/contact/Import.pm b/FS/FS/contact/Import.pm
new file mode 100644
index 0000000..26bdcfa
--- /dev/null
+++ b/FS/FS/contact/Import.pm
@@ -0,0 +1,161 @@
+package FS::contact::Import;
+
+use strict;
+use vars qw( $DEBUG ); #$conf );
+use Data::Dumper;
+use FS::Misc::DateTime qw( parse_datetime );
+use FS::Record qw( qsearchs );
+use FS::contact;
+use FS::cust_main;
+
+$DEBUG = 0;
+
+=head1 NAME
+
+FS::contact::Import - Batch contact importing
+
+=head1 SYNOPSIS
+
+ use FS::contact::Import;
+
+ #import
+ FS::contact::Import::batch_import( {
+ file => $file, #filename
+ type => $type, #csv or xls
+ format => $format, #default
+ agentnum => $agentnum,
+ job => $job, #optional job queue job, for progressbar updates
+ pkgbatch => $pkgbatch, #optional batch unique identifier
+ } );
+ die $error if $error;
+
+ #ajax helper
+ use FS::UI::Web::JSRPC;
+ my $server =
+ new FS::UI::Web::JSRPC 'FS::contact::Import::process_batch_import', $cgi;
+ print $server->process;
+
+=head1 DESCRIPTION
+
+Batch contact importing.
+
+=head1 SUBROUTINES
+
+=item process_batch_import
+
+Load a batch import as a queued JSRPC job
+
+=cut
+
+sub process_batch_import {
+ my $job = shift;
+ my $param = shift;
+ warn Dumper($param) if $DEBUG;
+
+ my $files = $param->{'uploaded_files'}
+ or die "No files provided.\n";
+
+ my (%files) = map { /^(\w+):([\.\w]+)$/ ? ($1,$2):() } split /,/, $files;
+
+ my $dir = '%%%FREESIDE_CACHE%%%/cache.'. $FS::UID::datasrc. '/';
+ #my $dir = '/usr/local/etc/freeside/cache.'. $FS::UID::datasrc. '/';
+ my $file = $dir. $files{'file'};
+
+ my $type;
+ if ( $file =~ /\.(\w+)$/i ) {
+ $type = lc($1);
+ } else {
+ #or error out???
+ warn "can't parse file type from filename $file; defaulting to CSV";
+ $type = 'csv';
+ }
+
+ my $error =
+ FS::contact::Import::batch_import( {
+ job => $job,
+ file => $file,
+ type => $type,
+ agentnum => $param->{'agentnum'},
+ 'format' => $param->{'format'},
+ } );
+
+ unlink $file;
+
+ die "$error\n" if $error;
+
+}
+
+=item batch_import
+
+=cut
+
+my %formatfields = (
+ 'default' => [ qw( custnum last first title comment selfservice_access emailaddress phonetypenum1 phonetypenum3 phonetypenum2 ) ],
+);
+
+sub _formatfields {
+ \%formatfields;
+}
+
+## not tested but maybe allow 2nd format to attach location in the future
+my %import_options = (
+ 'table' => 'contact',
+
+ 'preinsert_callback' => sub {
+ my($record, $param) = @_;
+ my @location_params = grep /^location\./, keys %$param;
+ if (@location_params) {
+ my $cust_location = FS::cust_location->new({
+ 'custnum' => $record->custnum,
+ });
+ foreach my $p (@location_params) {
+ $p =~ /^location.(\w+)$/;
+ $cust_location->set($1, $param->{$p});
+ }
+
+ my $error = $cust_location->find_or_insert; # this avoids duplicates
+ return "error creating location: $error" if $error;
+ $record->set('locationnum', $cust_location->locationnum);
+ }
+ '';
+ },
+
+);
+
+sub _import_options {
+ \%import_options;
+}
+
+sub batch_import {
+ my $opt = shift;
+
+ my $iopt = _import_options;
+ $opt->{$_} = $iopt->{$_} foreach keys %$iopt;
+
+ my $format = delete $opt->{'format'};
+
+ my $formatfields = _formatfields();
+ die "unknown format $format" unless $formatfields->{$format};
+
+ my @fields;
+ foreach my $field ( @{ $formatfields->{$format} } ) {
+ push @fields, $field;
+ }
+
+ $opt->{'fields'} = \@fields;
+
+ FS::Record::batch_import( $opt );
+
+}
+
+=head1 BUGS
+
+Not enough documentation.
+
+=head1 SEE ALSO
+
+L<FS::contact>
+
+=cut
+
+1; \ No newline at end of file