use base qw( FS::TemplateItem_Mixin FS::Record );
use strict;
-use FS::Record qw( qsearchs dbh ); #qsearch
+use FS::Record qw( qsearchs qsearch dbh );
use FS::part_pkg;
use FS::quotation_pkg_discount; #so its loaded when TemplateItem_Mixin needs it
use List::Util qw(sum);
The amount per package that will be charged per billing cycle.
+=item freq
+
+The length of the billing cycle. If zero it's a one-time charge; if any
+other number it's that many months; other values are in L<FS::Misc::pkg_freqs>.
+
=back
=head1 METHODS
sub check {
my $self = shift;
+ my @freqs = ('', keys (%{ FS::Misc->pkg_freqs }));
+
my $error =
$self->ut_numbern('quotationpkgnum')
|| $self->ut_foreign_key( 'quotationnum', 'quotation', 'quotationnum' )
|| $self->ut_numbern('quantity')
|| $self->ut_moneyn('unitsetup')
|| $self->ut_moneyn('unitrecur')
+ || $self->ut_enum('freq', \@freqs)
|| $self->ut_enum('waive_setup', [ '', 'Y'] )
;
if ($quotation->custnum) {
$self->set('locationnum', $quotation->cust_main->ship_locationnum);
} elsif ($quotation->prospectnum) {
- $self->set('locationnum', $quotation->prospect_main->locationnum);
+ # use the first non-disabled location for that prospect
+ my $cust_location = qsearchs('cust_location',
+ { prospectnum => $quotation->prospectnum,
+ disabled => '' });
+ $self->set('locationnum', $cust_location->locationnum) if $cust_location;
} # else the quotation is invalid
}
$recur->{'type'} = 'R';
if ( $type eq 'S' ) {
-sub tax_locationnum {
- my $self = shift;
- $self->locationnum;
-}
-
return ($setup);
} elsif ( $type eq 'R' ) {
return ($recur);
$quotation->prospect_main;
}
+sub tax_locationnum {
+ my $self = shift;
+ $self->locationnum;
+}
+
sub _upgrade_data {
my $class = shift;