X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fcust_main%2FPackages.pm;h=f819970fde1b249f5780cc7f70759f049c6f9a20;hb=8cc50a2ad12ec3d5bd3f31db741290664064ef06;hp=e904cfd1f41e3645658ea99390ad3e7eeebd58dd;hpb=e0d4d66f670371a0c8a40dc471352634f9fd6017;p=freeside.git diff --git a/FS/FS/cust_main/Packages.pm b/FS/FS/cust_main/Packages.pm index e904cfd1f..f819970fd 100644 --- a/FS/FS/cust_main/Packages.pm +++ b/FS/FS/cust_main/Packages.pm @@ -1,15 +1,15 @@ package FS::cust_main::Packages; use strict; -use vars qw( $DEBUG $me ); use List::Util qw( min ); use FS::UID qw( dbh ); use FS::Record qw( qsearch qsearchs ); use FS::cust_pkg; use FS::cust_svc; +use FS::contact; # for attach_pkgs +use FS::cust_location; # -$DEBUG = 0; -$me = '[FS::cust_main::Packages]'; +our ($DEBUG, $me) = (0, '[FS::cust_main::Packages]'); =head1 NAME @@ -128,13 +128,10 @@ sub order_pkg { } elsif ( $opt->{'cust_location'} ) { - if ( ! $opt->{'cust_location'}->locationnum ) { - # not inserted yet - my $error = $opt->{'cust_location'}->insert; - if ( $error ) { - $dbh->rollback if $oldAutoCommit; - return "inserting cust_location (transaction rolled back): $error"; - } + my $error = $opt->{'cust_location'}->find_or_insert; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return "inserting cust_location (transaction rolled back): $error"; } $cust_pkg->locationnum($opt->{'cust_location'}->locationnum); @@ -184,7 +181,6 @@ sub order_pkg { 'pkglinknum' => $link->pkglinknum, 'custnum' => $self->custnum, 'main_pkgnum' => $cust_pkg->pkgnum, - 'locationnum' => $cust_pkg->locationnum, # try to prevent as many surprises as possible 'pkgbatch' => $cust_pkg->pkgbatch, 'start_date' => $cust_pkg->start_date, @@ -197,7 +193,8 @@ sub order_pkg { 'waive_setup' => $cust_pkg->waive_setup, 'allow_pkgpart' => $opt->{'allow_pkgpart'}, }); - $error = $self->order_pkg('cust_pkg' => $pkg); + $error = $self->order_pkg('cust_pkg' => $pkg, + 'locationnum' => $cust_pkg->locationnum); if ( $error ) { $dbh->rollback if $oldAutoCommit; return "inserting supplemental package: $error"; @@ -229,7 +226,7 @@ Services can be new, in which case they are inserted, or existing unaudited services, in which case they are linked to the newly-created package. Currently available options are: I, I, I, -I, I, and I. +I, I, I, and I. If I is set, all provisioning jobs will have a dependancy on the supplied jobnum (they will not run until the specific job completes). @@ -246,6 +243,8 @@ If I, I, I, or I is provided, the scalars (provided by references) will be incremented by the values of the prepaid card.` +I is passed to L->insert. + =cut sub order_pkgs { @@ -278,7 +277,7 @@ sub order_pkgs { 'cust_pkg' => $cust_pkg, 'svcs' => $cust_pkgs->{$cust_pkg}, map { $_ => $options{$_} } - qw( seconds_ref upbytes_ref downbytes_ref totalbytes_ref depend_jobnum ) + qw( seconds_ref upbytes_ref downbytes_ref totalbytes_ref depend_jobnum allow_pkgpart ) ); if ( $error ) { $dbh->rollback if $oldAutoCommit; @@ -344,11 +343,39 @@ sub attach_pkgs { #end of false laziness + #pull in contact + + my %contact_hash = ( 'first' => $self->first, + 'last' => $self->get('last'), + 'custnum' => $new_custnum, + 'disabled' => '', + ); + + my $contact = qsearchs( 'contact', \%contact_hash) + || new FS::contact \%contact_hash; + unless ( $contact->contactnum ) { + my $error = $contact->insert; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + } + foreach my $cust_pkg ( $self->ncancelled_pkgs ) { + my $cust_location = $cust_pkg->cust_location || $self->ship_location; + my %loc_hash = $cust_location->hash; + $loc_hash{'locationnum'} = ''; + $loc_hash{'custnum'} = $new_custnum; + $loc_hash{'disabled'} = ''; + my $new_cust_location = qsearchs( 'cust_location', \%loc_hash) + || new FS::cust_location \%loc_hash; + my $pkg_or_error = $cust_pkg->change( { - 'keep_dates' => 1, - 'cust_main' => $new_cust_main, + 'keep_dates' => 1, + 'cust_main' => $new_cust_main, + 'contactnum' => $contact->contactnum, + 'cust_location' => $new_cust_location, } ); my $error = ref($pkg_or_error) ? '' : $pkg_or_error;