From: khoff Date: Sat, 8 Jun 2002 07:48:37 +0000 (+0000) Subject: Default svcpart support for part_pkg. Fixes 'bug' with new customer and online signup. X-Git-Tag: freeside_1_4_0_pre14~38 X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=commitdiff_plain;h=0e8861ca6b3b04b99ea9477e8c1555561b21c929 Default svcpart support for part_pkg. Fixes 'bug' with new customer and online signup. --- diff --git a/FS/FS/part_pkg.pm b/FS/FS/part_pkg.pm index 9c33e9a3b..420ffcb3d 100644 --- a/FS/FS/part_pkg.pm +++ b/FS/FS/part_pkg.pm @@ -2,7 +2,7 @@ package FS::part_pkg; use strict; use vars qw( @ISA ); -use FS::Record qw( qsearch dbh ); +use FS::Record qw( qsearch qsearchs dbh ); use FS::pkg_svc; use FS::agent_type; use FS::type_pkgs; @@ -225,6 +225,12 @@ sub check { } + if ($self->def_svcpart and my @pkg_svc = $self->pkg_svc) { + unless (grep { $_->svcpart == $self->def_svcpart } @pkg_svc) { + return "no svcparts for this package match def_svcpart ".$self->def_svcpart; + } + } + $self->ut_numbern('pkgpart') || $self->ut_text('pkg') || $self->ut_text('comment') @@ -259,11 +265,23 @@ associated with this billing item definition (see L). Returns false if there not exactly one service definition with quantity 1, or if SVCDB is specified and does not match the svcdb of the service definition, +If the part_pkg has a nonzero def_svcpart, it takes precedence, even if it has +quantity > 1 and/or there are other service definitions, UNLESS SVCDB is specified +and doesn't match the svcdb of the def_svcpart. + =cut sub svcpart { my $self = shift; my $svcdb = shift; + + if ($self->def_svcpart) { + if ((not $svcdb) or qsearchs('part_svc', { svcpart => $self->def_svcpart, + svcdb => $svcdb })) { + return $self->def_svcpart; + } + } + my @pkg_svc = $self->pkg_svc; return '' if scalar(@pkg_svc) != 1 || $pkg_svc[0]->quantity != 1 @@ -297,7 +315,7 @@ sub payby { =head1 VERSION -$Id: part_pkg.pm,v 1.14 2002-05-09 12:38:39 ivan Exp $ +$Id: part_pkg.pm,v 1.15 2002-06-08 07:48:36 khoff Exp $ =head1 BUGS diff --git a/FS/FS/pkg_svc.pm b/FS/FS/pkg_svc.pm index 1812dbf29..d64d10db2 100644 --- a/FS/FS/pkg_svc.pm +++ b/FS/FS/pkg_svc.pm @@ -67,8 +67,24 @@ otherwise returns false. =item delete -Deletes this record from the database. If there is an error, returns the -error, otherwise returns false. +Deletes this record from the database. If this svcpart is also the default svcpart, +we set part_pkg.def_svcpart to NULL. If there is an error, returns the error, +otherwise returns false. + +sub delete { + my $self = shift; + my $part_pkg = qsearchs( 'part_pkg', { pkgpart => $self->pkgpart } ); + + # Should this be wrapped in a transaction? + if ( $part_pkg->def_svcpart == $self->svcpart ) { + my $new = new FS::part_pkg $part_pkg->hash; + $new->def_svcpart = 0; + my $error = $new->replace($part_pkg); + return $error if $error; + } + + $self->SUPER::delete; +} =item replace OLD_RECORD @@ -83,6 +99,16 @@ sub replace { return "Can't change pkgpart!" if $old->pkgpart != $new->pkgpart; return "Can't change svcpart!" if $old->svcpart != $new->svcpart; + my $part_pkg = qsearchs( 'part_pkg', { pkgpart => $new->pkgpart } ); + + # Should this be wrapped in a transaction? + if ( ($part_pkg->def_svcpart == $new->svcpart) && ($new->quantity == 0) ) { + my $new_part_pkg = new FS::part_pkg $part_pkg->hash; + $new_part_pkg->def_svcpart = 0; + my $error = $new_part_pkg->replace($part_pkg); + return $error if $error; + } + $new->SUPER::replace($old); } @@ -137,7 +163,7 @@ sub part_svc { =head1 VERSION -$Id: pkg_svc.pm,v 1.1 1999-08-04 09:03:53 ivan Exp $ +$Id: pkg_svc.pm,v 1.2 2002-06-08 07:48:37 khoff Exp $ =head1 BUGS diff --git a/bin/fs-setup b/bin/fs-setup index 558a5fdd9..9b9ce8686 100755 --- a/bin/fs-setup +++ b/bin/fs-setup @@ -1,6 +1,6 @@ #!/usr/bin/perl -Tw # -# $Id: fs-setup,v 1.92 2002-05-31 22:37:06 ivan Exp $ +# $Id: fs-setup,v 1.93 2002-06-08 07:48:37 khoff Exp $ #to delay loading dbdef until we're ready BEGIN { $FS::Record::setup_hack = 1; } @@ -662,6 +662,7 @@ sub tables_hash_hack { 'plandata', 'text', 'NULL', '', 'disabled', 'char', 'NULL', 1, 'taxclass', 'varchar', 'NULL', $char_d, + 'def_svcpart','int', '', '', ], 'primary_key' => 'pkgpart', 'unique' => [ [] ], diff --git a/httemplate/browse/part_pkg.cgi b/httemplate/browse/part_pkg.cgi index c20811491..fd269bef1 100755 --- a/httemplate/browse/part_pkg.cgi +++ b/httemplate/browse/part_pkg.cgi @@ -81,7 +81,8 @@ END my($svcpart)=$pkg_svc->getfield('svcpart'); my($part_svc) = qsearchs('part_svc',{'svcpart'=> $svcpart }); print $n,qq!!, - $part_svc->getfield('svc'),"", + $part_svc->getfield('svc'),"", + (($hashref->{def_svcpart} == $svcpart) ? "*" : ""), $pkg_svc->getfield('quantity'),"\n"; $n=""; } @@ -93,6 +94,7 @@ $colspan = $cgi->param('showdisabled') ? 8 : 9; print <Add a new package definition +  * - Default service END diff --git a/httemplate/docs/schema.html b/httemplate/docs/schema.html index 2b8b3a132..e2a0f475a 100644 --- a/httemplate/docs/schema.html +++ b/httemplate/docs/schema.html @@ -238,6 +238,7 @@
  • plan - price plan
  • plandata - additional price plan data
  • disabled - Disabled flag, empty or `Y' +
  • def_svcpart - Default svcpart to use when ordering this part_pkg
  • part_referral - Referral listing
      diff --git a/httemplate/edit/part_pkg.cgi b/httemplate/edit/part_pkg.cgi index e03017db4..770facb7e 100755 --- a/httemplate/edit/part_pkg.cgi +++ b/httemplate/edit/part_pkg.cgi @@ -112,7 +112,10 @@ print '>'; print ''; my $thead = "\n\n". ntable('#cccccc', 2). <Quan.Service + +Quan. +Service + END #unless ( $cgi->param('clone') ) { @@ -169,6 +172,16 @@ unless ( 0 ) { #print ""; } +print qq!Default service
      \n!; + + foreach my $f ( qw( clone pkgnum ) ) { print qq!'; } @@ -376,7 +389,7 @@ my $widget = new HTML::Widgets::SelectLayers( 'form_action' => 'process/part_pkg.cgi', 'form_text' => [ qw(pkg comment freq clone pkgnum pkgpart), @fixups ], 'form_checkbox' => [ qw(setuptax recurtax disabled) ], - 'form_select' => [ @form_select ], + 'form_select' => [ qw(def_svcpart), @form_select ], 'fixup_callback' => sub { #my $ = @_; my $html = '';