X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fcust_pkg%2FImport.pm;h=e8c4427d6ebcaa7a0115a9002e2141ba9ebf1909;hp=9c93677a7cd4a8688bd8f78eb5ec3982a858f355;hb=5f9f20112eeb53f578900e9e2d43e1e15a6fd96d;hpb=ec70b9131ae5df9c58b75e8d6db75e5fddb6362a diff --git a/FS/FS/cust_pkg/Import.pm b/FS/FS/cust_pkg/Import.pm index 9c93677a7..e8c4427d6 100644 --- a/FS/FS/cust_pkg/Import.pm +++ b/FS/FS/cust_pkg/Import.pm @@ -2,9 +2,7 @@ package FS::cust_pkg::Import; use strict; use vars qw( $DEBUG ); #$conf ); -use Storable qw(thaw); use Data::Dumper; -use MIME::Base64; use FS::Misc::DateTime qw( parse_datetime ); use FS::Record qw( qsearchs ); use FS::cust_pkg; @@ -60,8 +58,7 @@ Load a batch import as a queued JSRPC job sub process_batch_import { my $job = shift; - - my $param = thaw(decode_base64(shift)); + my $param = shift; warn Dumper($param) if $DEBUG; my $files = $param->{'uploaded_files'} @@ -103,9 +100,11 @@ sub process_batch_import { my %formatfields = ( 'default' => [], + 'all_dates' => [], 'svc_acct' => [qw( username _password domsvc )], 'svc_phone' => [qw( countrycode phonenum sip_password pin )], 'svc_external' => [qw( id title )], + 'location' => [qw( address1 address2 city state zip country )], ); sub _formatfields { @@ -115,11 +114,30 @@ sub _formatfields { my %import_options = ( 'table' => 'cust_pkg', + '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); + } + ''; + }, + 'postinsert_callback' => sub { my( $record, $param ) = @_; my $formatfields = _formatfields; - foreach my $svc_x ( grep { $_ ne 'default' } keys %$formatfields ) { + foreach my $svc_x ( grep /^svc/, keys %$formatfields ) { my $ff = $formatfields->{$svc_x}; @@ -170,8 +188,9 @@ sub batch_import { my $format = delete $opt->{'format'}; my @fields = (); - if ( $format =~ /^(.*)-agent_custid$/ ) { + if ( $format =~ /^(.*)-agent_custid(-agent_pkgid)?$/ ) { $format = $1; + my $agent_pkgid = $2; @fields = ( sub { my( $self, $value ) = @_; # $conf, $param @@ -182,15 +201,35 @@ sub batch_import { $self->custnum($cust_main->custnum) if $cust_main; }, ); + push @fields, 'agent_pkgid' if $agent_pkgid; } else { @fields = ( 'custnum' ); } + if ( $format =~ /^(.*)-locationnum$/ ) { + $format = $1; + push @fields, 'locationnum'; + } + push @fields, ( 'pkgpart', 'discountnum' ); - foreach my $field ( - qw( start_date setup bill last_bill susp adjourn cancel expire ) - ) { + my @date_fields = (); + if ( $format =~ /all_dates/ ) { + @date_fields = qw( + order_date + start_date setup bill last_bill susp adjourn + resume + cancel expire + contract_end dundate + ); + } else { + @date_fields = qw( + start_date setup bill last_bill susp adjourn + cancel expire + ); + } + + foreach my $field (@date_fields) { push @fields, sub { my( $self, $value ) = @_; # $conf, $param #->$field has undesirable effects @@ -217,164 +256,6 @@ sub batch_import { } -=for comment - - my $billtime = time; - my %cust_pkg = ( pkgpart => $pkgpart ); - my %svc_x = (); - foreach my $field ( @fields ) { - - if ( $field =~ /^cust_pkg\.(pkgpart|setup|bill|susp|adjourn|expire|cancel)$/ ) { - - #$cust_pkg{$1} = parse_datetime( shift @$columns ); - if ( $1 eq 'pkgpart' ) { - $cust_pkg{$1} = shift @columns; - } elsif ( $1 eq 'setup' ) { - $billtime = parse_datetime(shift @columns); - } else { - $cust_pkg{$1} = parse_datetime( shift @columns ); - } - - } elsif ( $field =~ /^svc_acct\.(username|_password)$/ ) { - - $svc_x{$1} = shift @columns; - - } elsif ( $field =~ /^svc_external\.(id|title)$/ ) { - - $svc_x{$1} = shift @columns; - - } elsif ( $field =~ /^svc_phone\.(countrycode|phonenum|sip_password|pin)$/ ) { - $svc_x{$1} = shift @columns; - - } else { - - #refnum interception - if ( $field eq 'refnum' && $columns[0] !~ /^\s*(\d+)\s*$/ ) { - - my $referral = $columns[0]; - my %hash = ( 'referral' => $referral, - 'agentnum' => $agentnum, - 'disabled' => '', - ); - - my $part_referral = qsearchs('part_referral', \%hash ) - || new FS::part_referral \%hash; - - unless ( $part_referral->refnum ) { - my $error = $part_referral->insert; - if ( $error ) { - $dbh->rollback if $oldAutoCommit; - return "can't auto-insert advertising source: $referral: $error"; - } - } - - $columns[0] = $part_referral->refnum; - } - - my $value = shift @columns; - $cust_main{$field} = $value if length($value); - } - } - - $cust_main{'payby'} = 'CARD' - if defined $cust_main{'payinfo'} - && length $cust_main{'payinfo'}; - - my $invoicing_list = $cust_main{'invoicing_list'} - ? [ delete $cust_main{'invoicing_list'} ] - : []; - - my $cust_main = new FS::cust_main ( \%cust_main ); - - use Tie::RefHash; - tie my %hash, 'Tie::RefHash'; #this part is important - - if ( $cust_pkg{'pkgpart'} ) { - my $cust_pkg = new FS::cust_pkg ( \%cust_pkg ); - - my @svc_x = (); - my $svcdb = ''; - if ( $svc_x{'username'} ) { - $svcdb = 'svc_acct'; - } elsif ( $svc_x{'id'} || $svc_x{'title'} ) { - $svcdb = 'svc_external'; - } - - my $svc_phone = ''; - if ( $svc_x{'countrycode'} || $svc_x{'phonenum'} ) { - $svc_phone = FS::svc_phone->new( { - map { $_ => delete($svc_x{$_}) } - qw( countrycode phonenum sip_password pin) - } ); - } - - if ( $svcdb || $svc_phone ) { - my $part_pkg = $cust_pkg->part_pkg; - unless ( $part_pkg ) { - $dbh->rollback if $oldAutoCommit; - return "unknown pkgpart: ". $cust_pkg{'pkgpart'}; - } - if ( $svcdb ) { - $svc_x{svcpart} = $part_pkg->svcpart_unique_svcdb( $svcdb ); - my $class = "FS::$svcdb"; - push @svc_x, $class->new( \%svc_x ); - } - if ( $svc_phone ) { - $svc_phone->svcpart( $part_pkg->svcpart_unique_svcdb('svc_phone') ); - push @svc_x, $svc_phone; - } - } - - $hash{$cust_pkg} = \@svc_x; - } - - my $error = $cust_main->insert( \%hash, $invoicing_list ); - - if ( $error ) { - $dbh->rollback if $oldAutoCommit; - return "can't insert customer". ( $line ? " for $line" : '' ). ": $error"; - } - - if ( $format eq 'simple' ) { - - #false laziness w/bill.cgi - $error = $cust_main->bill( 'time' => $billtime ); - if ( $error ) { - $dbh->rollback if $oldAutoCommit; - return "can't bill customer for $line: $error"; - } - - $error = $cust_main->apply_payments_and_credits; - if ( $error ) { - $dbh->rollback if $oldAutoCommit; - return "can't bill customer for $line: $error"; - } - - $error = $cust_main->collect(); - if ( $error ) { - $dbh->rollback if $oldAutoCommit; - return "can't collect customer for $line: $error"; - } - - } - - $row++; - - if ( $job && time - $min_sec > $last ) { #progress bar - $job->update_statustext( int(100 * $row / $count) ); - $last = time; - } - - } - - $dbh->commit or die $dbh->errstr if $oldAutoCommit;; - - return "Empty file!" unless $row; - - ''; #no error - -} - =head1 BUGS Not enough documentation.