+=item credit_remaining MODE TIME
+
+Generate a credit for this package for the time remaining in the current
+billing period. MODE is either "suspend" or "cancel" (determines the
+credit type). TIME is the time of suspension/cancellation. Both options
+are mandatory.
+
+=cut
+
+sub credit_remaining {
+ # Add a credit for remaining service
+ my ($self, $mode, $time) = @_;
+ die 'credit_remaining requires suspend or cancel'
+ unless $mode eq 'suspend' or $mode eq 'cancel';
+ die 'no suspend/cancel time' unless $time > 0;
+
+ my $conf = FS::Conf->new;
+ my $reason_type = $conf->config($mode.'_credit_type');
+
+ my $last_bill = $self->getfield('last_bill') || 0;
+ my $next_bill = $self->getfield('bill') || 0;
+ if ( $last_bill > 0 # the package has been billed
+ and $next_bill > 0 # the package has a next bill date
+ and $next_bill >= $time # which is in the future
+ ) {
+ my $remaining_value = $self->calc_remain('time' => $time);
+ if ( $remaining_value > 0 ) {
+ warn "Crediting for $remaining_value on package ".$self->pkgnum."\n"
+ if $DEBUG;
+ my $error = $self->cust_main->credit(
+ $remaining_value,
+ 'Credit for unused time on '. $self->part_pkg->pkg,
+ 'reason_type' => $reason_type,
+ );
+ return "Error crediting customer \$$remaining_value for unused time".
+ " on ". $self->part_pkg->pkg. ": $error"
+ if $error;
+ } #if $remaining_value
+ } #if $last_bill, etc.
+ '';
+}
+