X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fcust_pkg.pm;h=0fc21478a05f13a01389484265256e22ef6b8ed0;hb=e5f29642854dbdb606aa5763213e944ca449fc8a;hp=b241ecac2de9e40f4bf2a11bbc6512426b1ea395;hpb=6991d4986df7fb3a6c7c49b5ae1b3713e87a16c4;p=freeside.git diff --git a/FS/FS/cust_pkg.pm b/FS/FS/cust_pkg.pm index b241ecac2..0fc21478a 100644 --- a/FS/FS/cust_pkg.pm +++ b/FS/FS/cust_pkg.pm @@ -556,23 +556,20 @@ sub order { my(%svcnum); # generate %svcnum # for those packages being removed: - #@{ $svcnum{$svcpart} } goes from a svcpart to a list of FS::Record - # objects (table eq 'cust_svc') + #@{ $svcnum{$svcpart} } goes from a svcpart to a list of FS::cust_svc objects my($pkgnum); foreach $pkgnum ( @{$remove_pkgnums} ) { - my($cust_svc); - foreach $cust_svc (qsearch('cust_svc',{'pkgnum'=>$pkgnum})) { + foreach my $cust_svc (qsearch('cust_svc',{'pkgnum'=>$pkgnum})) { push @{ $svcnum{$cust_svc->getfield('svcpart')} }, $cust_svc; } } - my(@cust_svc); + my @cust_svc; #generate @cust_svc # for those packages the customer is purchasing: # @{$pkgparts} is a list of said packages, by pkgpart # @cust_svc is a corresponding list of lists of FS::Record objects - my($pkgpart); - foreach $pkgpart ( @{$pkgparts} ) { + foreach my $pkgpart ( @{$pkgparts} ) { unless ( $part_pkg{$pkgpart} ) { $dbh->rollback if $oldAutoCommit; return "Customer not permitted to purchase pkgpart $pkgpart!"; @@ -580,10 +577,49 @@ sub order { push @cust_svc, [ map { ( $svcnum{$_} && @{ $svcnum{$_} } ) ? shift @{ $svcnum{$_} } : (); - } map { $_->svcpart } qsearch('pkg_svc', { 'pkgpart' => $pkgpart }) + } map { $_->svcpart } + qsearch('pkg_svc', { pkgpart => $pkgpart, + quantity => { op=>'>', value=>'0', } } ) ]; } + #special-case until this can be handled better + # move services to new svcparts - even if the svcparts don't match (svcdb + # needs to...) + # looks like they're moved in no particular order, ewwwwwwww + # and looks like just one of each svcpart can be moved... o well + + #start with still-leftover services + #foreach my $svcpart ( grep { scalar(@{ $svcnum{$_} }) } keys %svcnum ) { + foreach my $svcpart ( keys %svcnum ) { + next unless @{ $svcnum{$svcpart} }; + + my $svcdb = $svcnum{$svcpart}->[0]->part_svc->svcdb; + + #find an empty place to put one + my $i = 0; + foreach my $pkgpart ( @{$pkgparts} ) { + my @pkg_svc = + qsearch('pkg_svc', { pkgpart => $pkgpart, + quantity => { op=>'>', value=>'0', } } ); + #my @pkg_svc = + # grep { $_->quantity > 0 } qsearch('pkg_svc', { pkgpart=>$pkgpart } ); + if ( ! @{$cust_svc[$i]} #find an empty place to put them with + && grep { $svcdb eq $_->part_svc->svcdb } #with appropriate svcdb + @pkg_svc + ) { + my $new_svcpart = + ( grep { $svcdb eq $_->part_svc->svcdb } @pkg_svc )[0]->svcpart; + my $cust_svc = shift @{$svcnum{$svcpart}}; + $cust_svc->svcpart($new_svcpart); + #warn "changing from $svcpart to $new_svcpart!!!\n"; + $cust_svc[$i] = [ $cust_svc ]; + } + $i++; + } + + } + #check for leftover services foreach (keys %svcnum) { next unless @{ $svcnum{$_} }; @@ -602,8 +638,7 @@ sub order { local $SIG{PIPE} = 'IGNORE'; #first cancel old packages -# my($pkgnum); - foreach $pkgnum ( @{$remove_pkgnums} ) { + foreach my $pkgnum ( @{$remove_pkgnums} ) { my($old) = qsearchs('cust_pkg',{'pkgnum'=>$pkgnum}); unless ( $old ) { $dbh->rollback if $oldAutoCommit; @@ -620,7 +655,7 @@ sub order { } #now add new packages, changing cust_svc records if necessary -# my($pkgpart); + my $pkgpart; while ($pkgpart=shift @{$pkgparts} ) { my $new = new FS::cust_pkg { @@ -638,8 +673,12 @@ sub order { foreach my $cust_svc ( @{ shift @cust_svc } ) { my(%hash) = $cust_svc->hash; $hash{'pkgnum'}=$pkgnum; - my($new) = new FS::cust_svc ( \%hash ); - my($error)=$new->replace($cust_svc); + my $new = new FS::cust_svc ( \%hash ); + + #avoid Record diffing missing changed svcpart field from above. + my $old = qsearchs('cust_svc', { 'svcnum' => $cust_svc->svcnum } ); + + my $error = $new->replace($old); if ( $error ) { $dbh->rollback if $oldAutoCommit; return "Couldn't link old service to new package: $error"; @@ -656,7 +695,7 @@ sub order { =head1 VERSION -$Id: cust_pkg.pm,v 1.16 2002-01-29 16:33:15 ivan Exp $ +$Id: cust_pkg.pm,v 1.18 2002-04-20 02:06:38 ivan Exp $ =head1 BUGS