X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Freason.pm;h=95297d970c659aaff5f10d0795ba0020b85c628e;hb=b9b18c46a93720ba3f635d71d32d13f355861c51;hp=4c2587f0897f5acea861d64738326207f5137459;hpb=3af54162b6f9fae1c836390a3ff072af38d60550;p=freeside.git diff --git a/FS/FS/reason.pm b/FS/FS/reason.pm index 4c2587f08..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; } @@ -161,13 +168,9 @@ Accepts an arrayref of reason objects, to be merged into this reason. Reasons must all have the same reason_type class as this one. Matching reasonnums will be replaced in the following tables: - cust_bill_void - cust_bill_pkg_void cust_credit cust_credit_void - cust_pay_void cust_pkg_reason - cust_refund =cut @@ -195,13 +198,9 @@ sub merge { $error = "Mismatched reason type class" unless $reason->reasontype->class eq $class; foreach my $table ( qw( - cust_bill_void - cust_bill_pkg_void cust_credit cust_credit_void - cust_pay_void cust_pkg_reason - cust_refund )) { last if $error; my @fields = ('reasonnum'); @@ -239,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. @@ -250,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);