=item label
+Returns a label to identify a record of this service.
+Label may be displayed on freeside screens, and within customer bills.
+
+For example, $obj->label may return:
+
+ - A provisioned phone number for svc_phone
+ - The mailing list name and e-mail address for svc_mailinglist
+ - The address of a rental property svc_realestate
+
svc_Common provides a fallback label subroutine that just returns the svcnum.
=cut
my $required = {};
my $labels = {};
my $tinfo = $self->can('table_info') ? $self->table_info : {};
- my $fields = $tinfo->{'fields'} || {};
- foreach my $field (keys %$fields) {
- if (ref($fields->{$field}) && $fields->{$field}->{'required'}) {
- $required->{$field} = 1;
- $labels->{$field} = $fields->{$field}->{'label'};
+ if ($tinfo->{'manual_require'}) {
+ my $fields = $tinfo->{'fields'} || {};
+ foreach my $field (keys %$fields) {
+ if (ref($fields->{$field}) && $fields->{$field}->{'required'}) {
+ $required->{$field} = 1;
+ $labels->{$field} = $fields->{$field}->{'label'};
+ }
}
- }
- # add fields marked as required in database
- foreach my $column (
- qsearch('part_svc_column',{
- 'svcpart' => $self->svcpart,
- 'required' => 'Y'
- })
- ) {
- $required->{$column->columnname} = 1;
- $labels->{$column->columnname} = $column->columnlabel;
- }
- # do the actual checking
- foreach my $field (keys %$required) {
- unless ($self->$field) {
- my $name = $labels->{$field} || $field;
- return "Field $name is required\n"
+ # add fields marked as required in database
+ foreach my $column (
+ qsearch('part_svc_column',{
+ 'svcpart' => $self->svcpart,
+ 'required' => 'Y'
+ })
+ ) {
+ $required->{$column->columnname} = 1;
+ $labels->{$column->columnname} = $column->columnlabel;
+ }
+ # do the actual checking
+ foreach my $field (keys %$required) {
+ unless (length($self->get($field)) > 0) {
+ my $name = $labels->{$field} || $field;
+ return "$name is required\n"
+ }
}
}
$self->svcpart($cust_svc->svcpart);
}
- my $error = $self->preinsert_hook_first
+ my $error = $self->preinsert_hook_first(%options)
|| $self->set_auto_inventory
|| $self->check
|| $self->_check_duplicate
sub replace {
my $new = shift;
+ $noexport_hack = $new->no_export if $new->no_export;
my $old = ( blessed($_[0]) && $_[0]->isa('FS::Record') )
? shift
sub part_svc {
my $self = shift;
+ cluck 'svc_X->part_svc called' if $DEBUG;
+
#get part_svc
my $svcpart;
if ( $self->get('svcpart') ) {
sub export {
my( $self, $method ) = ( shift, shift );
+ # $method must start with export_, $action must be the part after that
$method = "export_$method" unless $method =~ /^export_/;
+ my ($action) = $method =~ /^export_(\w+)/;
local $SIG{HUP} = 'IGNORE';
local $SIG{INT} = 'IGNORE';
unless ( $noexport_hack ) {
foreach my $part_export ( $self->cust_svc->part_svc->part_export ) {
next unless $part_export->can($method);
+ next if $part_export->get("no_$action"); # currently only 'no_suspend'
my $error = $part_export->$method($self, @_);
if ( $error ) {
$dbh->rollback if $oldAutoCommit;
#my( $class, $string ) = @_;
'1 = 0'; #false
}
+sub search_sql_addl_from {
+ '';
+}
=item search HASHREF
=item order_by
+=item cancelled - if true, only returns svcs attached to cancelled pkgs;
+if defined and false, only returns svcs not attached to cancelled packages
+
=back
=cut
-# svc_broadband::search should eventually use this instead
+### Don't call the 'cancelled' option 'Service Status'
+### There is no such thing
+### See cautionary note in httemplate/browse/part_svc.cgi
+
sub search {
my ($class, $params) = @_;
}
#svcnum
- if ( $params->{'svcnum'} =~ /^(\d+)$/ ) {
- push @where, "svcnum = $1";
+ if ( $params->{'svcnum'} ) {
+ my @svcnum = ref( $params->{'svcnum'} )
+ ? @{ $params->{'svcnum'} }
+ : $params->{'svcnum'};
+ @svcnum = grep /^\d+$/, @svcnum;
+ push @where, 'svcnum IN ('. join(',', @svcnum) . ')' if @svcnum;
}
# svcpart
push @where, "exportnum = $1";
}
+ if ( defined($params->{'cancelled'}) ) {
+ if ($params->{'cancelled'}) {
+ push @where, "cust_pkg.cancel IS NOT NULL";
+ } else {
+ push @where, "cust_pkg.cancel IS NULL";
+ }
+ }
+
# # sector and tower
# my @where_sector = $class->tower_sector_sql($params);
# if ( @where_sector ) {
=cut
1;
-