X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Freason.pm;h=95297d970c659aaff5f10d0795ba0020b85c628e;hb=b9b18c46a93720ba3f635d71d32d13f355861c51;hp=1739f960996521a82c5c4254e7551b4e45d8138e;hpb=43e9232c02591fceea1445e59584ab584ce7b433;p=freeside.git diff --git a/FS/FS/reason.pm b/FS/FS/reason.pm index 1739f9609..95297d970 100644 --- a/FS/FS/reason.pm +++ b/FS/FS/reason.pm @@ -56,7 +56,7 @@ suspensions but not others. DEPRECATED. whether to bill the unsuspend package immediately ('') or to wait until the customer's next invoice ('Y'). -=item unused_credit - 'Y' or ''. For suspension reasons only (for now). +=item unused_credit - 'Y' or ''. For suspension or cancellation reasons. If enabled, the customer will be credited for their remaining time on suspension. @@ -125,23 +125,30 @@ sub check { ; return $error if $error; - if ( $self->reasontype->class eq 'S' ) { + my $class = $self->reasontype->class; + + if ( $class eq 'S' ) { $error = $self->ut_numbern('unsuspend_pkgpart') || $self->ut_foreign_keyn('unsuspend_pkgpart', 'part_pkg', 'pkgpart') || $self->ut_flag('unsuspend_hold') - || $self->ut_flag('unused_credit') || $self->ut_foreign_keyn('feepart', 'part_fee', 'feepart') || $self->ut_flag('fee_on_unsuspend') || $self->ut_flag('fee_hold') ; return $error if $error; } else { - foreach (qw(unsuspend_pkgpart unsuspend_hold unused_credit feepart + foreach (qw(unsuspend_pkgpart unsuspend_hold feepart fee_on_unsuspend fee_hold)) { $self->set($_ => ''); } } + if ( $class eq 'S' or $class eq 'C' ) { + $error = $self->ut_flag('unused_credit'); + } else { + $self->set('unused_credit', ''); + } + $self->SUPER::check; } @@ -231,7 +238,8 @@ sub merge { Fetches the reason matching these parameters if there is one. If not, inserts one. Will also insert the reason type if necessary. CLASS must -be one of 'C' (cancel reasons), 'R' (credit reasons), or 'S' (suspend reasons). +be one of 'C' (cancel reasons), 'R' (credit reasons), 'S' (suspend reasons), +or 'F' (refund reasons). This will die if anything fails. @@ -242,14 +250,25 @@ sub new_or_existing { my %opt = @_; my $error = ''; - my %hash = ('class' => $opt{'class'}, 'type' => $opt{'type'}); - my $reason_type = qsearchs('reason_type', \%hash) - || FS::reason_type->new(\%hash); + my $reason_type; + if ( ref $opt{type} eq 'FS::reason_type' ) { + $reason_type = $opt{type}; + } elsif ( $opt{type} =~ /^\d+$/ ) { + $reason_type = FS::reason_type->by_key($opt{type}); + if (!$reason_type) { + die "reason_type #$opt{type} not found\n"; + } + } else { + my %hash = ('class' => $opt{'class'}, 'type' => $opt{'type'}); + $reason_type = qsearchs('reason_type', \%hash) + || FS::reason_type->new(\%hash); - $error = $reason_type->insert unless $reason_type->typenum; - die "error inserting reason type: $error\n" if $error; + $error = $reason_type->insert unless $reason_type->typenum; + die "error inserting reason type: $error\n" if $error; + } - %hash = ('reason_type' => $reason_type->typenum, 'reason' => $opt{'reason'}); + my %hash = ('reason_type' => $reason_type->typenum, + 'reason' => $opt{'reason'}); my $reason = qsearchs('reason', \%hash) || FS::reason->new(\%hash);