package FS::rate_detail;
+use base qw(FS::Record);
use strict;
-use vars qw( @ISA $DEBUG $me );
+use vars qw( $DEBUG $me );
+use Tie::IxHash;
use FS::Record qw( qsearch qsearchs dbh );
use FS::rate;
use FS::rate_region;
-use Tie::IxHash;
-
-@ISA = qw(FS::Record);
+use FS::rate_time;
$DEBUG = 0;
$me = '[FS::rate_detail]';
=item classnum - usage class (see L<FS::usage_class>) if any for this rate
+=item ratetimenum - rating time period (see L<FS::rate_time) if any
+
+=item cdrtypenum - CDR type (see L<FS::cdr_type>) if any for this rate
+
+=item region_group - Group in region group for rate plan
+
+=item upstream_mult_charge - the multiplier to apply to the upstream price.
+Defaults to zero, and should stay zero unless this rate is intended to include
+a markup on pre-rated CDRs.
+
+=item upstream_mult_cost - the multiplier to apply to the upstream price to
+calculate the wholesale cost.
+
=back
=head1 METHODS
$self->ut_numbern('ratedetailnum')
|| $self->ut_foreign_key('ratenum', 'rate', 'ratenum')
|| $self->ut_foreign_keyn('orig_regionnum', 'rate_region', 'regionnum' )
- || $self->ut_foreign_key('dest_regionnum', 'rate_region', 'regionnum' )
+ || $self->ut_foreign_keyn('dest_regionnum', 'rate_region', 'regionnum' )
|| $self->ut_number('min_included')
#|| $self->ut_money('min_charge')
#good enough for now...
+ || $self->ut_floatn('conn_charge')
+ || $self->ut_floatn('conn_cost')
|| $self->ut_float('min_charge')
+ || $self->ut_floatn('min_cost')
|| $self->ut_number('sec_granularity')
|| $self->ut_foreign_keyn('classnum', 'usage_class', 'classnum' )
+ || $self->ut_enum('region_group', [ '', 'Y' ])
+
+ || $self->ut_floatn('upstream_mult_charge')
+ || $self->ut_floatn('upstream_mult_cost')
;
return $error if $error;
Returns the parent call plan (see L<FS::rate>) associated with this call plan
rate.
-=cut
-
-sub rate {
- my $self = shift;
- qsearchs('rate', { 'ratenum' => $self->ratenum } );
-}
-
=item orig_region
Returns the origination region (see L<FS::rate_region>) associated with this
sub dest_regionname {
my $self = shift;
- $self->dest_region->regionname;
+ my $dest_region = $self->dest_region;
+ $dest_region ? $dest_region->regionname : 'Global default';
}
-=item dest_regionname
+=item dest_prefixes_short
Returns a short list of the prefixes for the destination region
(see L<FS::rate_region>) associated with this call plan rate.
sub dest_prefixes_short {
my $self = shift;
- $self->dest_region->prefixes_short;
+ my $dest_region = $self->dest_region;
+ $dest_region ? $dest_region->prefixes_short : '';
+}
+
+=item rate_time
+
+Returns the L<FS::rate_time> object associated with this call
+plan rate, if there is one.
+
+=cut
+
+sub rate_time {
+ my $self = shift;
+ $self->ratetimenum ? FS::rate_time->by_key($self->ratetimenum) : ();
+}
+
+=item rate_time_name
+
+Returns the I<ratetimename> field of the L<FS::rate_time> object
+associated with this rate plan.
+
+=cut
+
+sub rate_time_name {
+ my $self = shift;
+ $self->ratetimenum ? $self->rate_time->ratetimename : '(default)';
}
=item classname
$usage_class ? $usage_class->classname : '';
}
+=item cdrtypename
+
+Returns the name of the CDR type (see L<FS::cdr_type) associated with this
+rate, if there is one. If not, returns the cdrtypenum itself. This will
+only return an empty string if cdrtypenum is NULL.
+
+=cut
+
+sub cdrtypename {
+ my $self = shift;
+ my $cdrtypenum = $self->cdrtypenum or return '';
+ my $cdr_type = qsearchs('cdr_type', { cdrtypenum => $cdrtypenum });
+ return $cdr_type ? $cdr_type->cdrtypename : $cdrtypenum;
+}
=back
%granularities;
}
-use Storable qw(thaw);
+=item conn_secs
+
+ Returns an (ordered) hash of conn_sec => name pairs
+
+=cut
+
+tie my %conn_secs, 'Tie::IxHash',
+ '0' => 'connection',
+ '1' => 'first second',
+ '6' => 'first 6 seconds',
+ '30' => 'first 30 seconds', # '1/2 minute',
+ '60' => 'first minute',
+ '120' => 'first 2 minutes',
+ '180' => 'first 3 minutes',
+ '300' => 'first 5 minutes',
+;
+
+sub conn_secs {
+ %conn_secs;
+}
+
+=item process_edit_import
+
+=cut
+
use Data::Dumper;
-use MIME::Base64;
sub process_edit_import {
my $job = shift;
my @pass_params = @{ $opt->{params} };
my %formats = %{ $opt->{formats} };
- my $param = thaw(decode_base64(shift));
+ my $param = shift;
warn Dumper($param) if $DEBUG;
my $files = $param->{'uploaded_files'}
}
+=item edit_import
+
+=cut
+
#false laziness w/ #FS::Record::batch_import, grep "edit_import" for differences
#could be turned into callbacks or something
use Text::CSV_XS;
}
-
-
=back
=head1 BUGS