diff options
-rw-r--r-- | FS/FS/part_pkg.pm | 22 | ||||
-rw-r--r-- | FS/FS/pkg_svc.pm | 32 | ||||
-rwxr-xr-x | bin/fs-setup | 3 | ||||
-rwxr-xr-x | httemplate/browse/part_pkg.cgi | 4 | ||||
-rw-r--r-- | httemplate/docs/schema.html | 1 | ||||
-rwxr-xr-x | httemplate/edit/part_pkg.cgi | 17 |
6 files changed, 70 insertions, 9 deletions
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<FS::pkg_svc>). 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!<TD><A HREF="${p}edit/part_svc.cgi?$svcpart">!, - $part_svc->getfield('svc'),"</A></TD><TD>", + $part_svc->getfield('svc'),"</A>", + (($hashref->{def_svcpart} == $svcpart) ? "*</TD><TD>" : "</TD><TD>"), $pkg_svc->getfield('quantity'),"</TD></TR>\n"; $n="<TR>"; } @@ -93,6 +94,7 @@ $colspan = $cgi->param('showdisabled') ? 8 : 9; print <<END; <TR><TD COLSPAN=$colspan><I><A HREF="${p}edit/part_pkg.cgi">Add a new package definition</A></I></TD></TR> </TABLE> +  * - Default service </BODY> </HTML> 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 @@ <li>plan - price plan <li>plandata - additional price plan data <li>disabled - Disabled flag, empty or `Y' + <li>def_svcpart - Default svcpart to use when ordering this part_pkg </ul> <li><a name="part_referral" href="man/FS/part_referral.html">part_referral</a> - Referral listing <ul> 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 '</TD></TR></TABLE>'; my $thead = "\n\n". ntable('#cccccc', 2). <<END; -<TR><TH BGCOLOR="#dcdcdc"><FONT SIZE=-1>Quan.</FONT></TH><TH BGCOLOR="#dcdcdc">Service</TH></TR> +<TR> +<TH BGCOLOR="#dcdcdc"><FONT SIZE=-1>Quan.</FONT></TH> +<TH BGCOLOR="#dcdcdc"><FONT SIZE=-1>Service</FONT></TH> +</TR> END #unless ( $cgi->param('clone') ) { @@ -169,6 +172,16 @@ unless ( 0 ) { #print "</TR></TABLE>"; } +print qq!Default service <SELECT NAME="def_svcpart" onChange="fchanged(this)">!, + qq!<OPTION VALUE="0">None!; +foreach my $part_svc ( @part_svc ) { + print qq!<OPTION VALUE="!, $part_svc->svcpart, '"', + (($hashref->{def_svcpart} == $part_svc->svcpart) ? " SELECTED>" : ">"), + $part_svc->svc, qq!</OPTION>!; +} +print qq!</SELECT><BR>\n!; + + foreach my $f ( qw( clone pkgnum ) ) { print qq!<INPUT TYPE="hidden" NAME="$f" VALUE="!. $cgi->param($f). '">'; } @@ -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 = ''; |