package FS::svc_Common;
+use base qw( FS::cust_main_Mixin FS::Record );
use strict;
-use vars qw( @ISA $noexport_hack $DEBUG $me
+use vars qw( $noexport_hack $DEBUG $me
$overlimit_missing_cust_svc_nonfatal_kludge );
use Carp qw( cluck carp croak confess ); #specify cluck have to specify them all
use Scalar::Util qw( blessed );
use Lingua::EN::Inflect qw( PL_N );
use FS::Conf;
use FS::Record qw( qsearch qsearchs fields dbh );
-use FS::cust_main_Mixin;
use FS::cust_svc;
use FS::part_svc;
use FS::queue;
use FS::inventory_class;
use FS::NetworkMonitoringSystem;
-@ISA = qw( FS::cust_main_Mixin FS::Record );
-
$me = '[FS::svc_Common]';
$DEBUG = 0;
=head1 SYNOPSIS
-use FS::svc_Common;
-
-@ISA = qw( FS::svc_Common );
+package svc_myservice;
+use base qw( FS::svc_Common );
=head1 DESCRIPTION
Checks the validity of fields in this record.
-At present, this does nothing but call FS::Record::check (which, in turn,
-does nothing but run virtual field checks).
+Only checks fields marked as required in table_info or
+part_svc_column definition. Should be invoked by service-specific
+check using SUPER. Invokes FS::Record::check using SUPER.
=cut
sub check {
my $self = shift;
+
+ ## Checking required fields
+
+ # get fields marked as required in table_info
+ my $required = {};
+ my $labels = {};
+ my $tinfo = $self->can('table_info') ? $self->table_info : {};
+ 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 (length($self->get($field)) > 0) {
+ my $name = $labels->{$field} || $field;
+ return "$name is required\n"
+ }
+ }
+ }
+
$self->SUPER::check;
}
$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 preinsert_hook { ''; }
sub table_dupcheck_fields { (); }
sub prereplace_hook { ''; }
+sub prereplace_hook_first { ''; }
sub predelete_hook { ''; }
sub predelete_hook_first { ''; }
local $FS::UID::AutoCommit = 0;
my $dbh = dbh;
- my $error = $self->predelete_hook_first
+ my $error = $self->cust_svc->check_part_svc_link_unprovision
+ || $self->predelete_hook_first
|| $self->SUPER::delete
|| $self->export('delete', @$export_args)
|| $self->return_inventory
=cut
sub set_auto_inventory {
+ # don't try to do this during an upgrade
+ return '' if $FS::CurrentUser::upgrade_hack;
+
my $self = shift;
my $old = @_ ? shift : '';
Returns the cust_svc record associated with this svc_ record, as a FS::cust_svc
object (see L<FS::cust_svc>).
-=cut
-
-sub cust_svc {
- my $self = shift;
- qsearchs('cust_svc', { 'svcnum' => $self->svcnum } );
-}
-
=item suspend
Runs export_suspend callbacks.
#custnum
if ( $params->{'custnum'} =~ /^(\d+)$/ && $1 ) {
- push @where, "custnum = $1";
+ push @where, "cust_pkg.custnum = $1";
}
#customer status