From f16d9ebb0e56f43e04242ed859d6055f98c74f15 Mon Sep 17 00:00:00 2001 From: Christopher Burger Date: Thu, 7 Sep 2017 08:49:34 -0400 Subject: RT# 77167 - Added the ability to import a list of contacts --- FS/FS/contact/Import.pm | 161 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 FS/FS/contact/Import.pm (limited to 'FS/FS/contact') 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 + +=cut + +1; \ No newline at end of file -- cgit v1.1