diff options
author | Ivan Kohler <ivan@freeside.biz> | 2018-11-09 12:37:12 -0800 |
---|---|---|
committer | Ivan Kohler <ivan@freeside.biz> | 2018-11-09 12:37:12 -0800 |
commit | 7f1bc260ca39c9a8ab53d24b51dc5610d893a76a (patch) | |
tree | a42f63b755d194b8015b311ec5456f61b08020c9 /FS | |
parent | 86e3918fb39901e2b1797f60348daa6d4f5b7e9e (diff) |
delete fees, RT#81713
Diffstat (limited to 'FS')
-rw-r--r-- | FS/FS/AccessRight.pm | 2 | ||||
-rw-r--r-- | FS/FS/cust_bill_pkg.pm | 14 | ||||
-rw-r--r-- | FS/FS/cust_event_fee.pm | 105 |
3 files changed, 121 insertions, 0 deletions
diff --git a/FS/FS/AccessRight.pm b/FS/FS/AccessRight.pm index b93d56c..40e9a46 100644 --- a/FS/FS/AccessRight.pm +++ b/FS/FS/AccessRight.pm @@ -352,6 +352,7 @@ tie my %rights, 'Tie::IxHash', { rightname=>'Import', global=>1 }, #some of these are ag-virt'ed now? give em their own ACLs { rightname=>'Export', global=>1 }, { rightname=> 'Edit rating data', desc=>'Delete CDRs', global=>1 }, + { rightname=>'Delete fees', }, #], # ### @@ -471,6 +472,7 @@ sub default_superuser_rights { 'Backdate credit', 'View legacy typeset statments', 'Detach customer package', + 'Delete fees', ); no warnings 'uninitialized'; diff --git a/FS/FS/cust_bill_pkg.pm b/FS/FS/cust_bill_pkg.pm index 1262c38..d0d62bd 100644 --- a/FS/FS/cust_bill_pkg.pm +++ b/FS/FS/cust_bill_pkg.pm @@ -491,6 +491,20 @@ sub delete { } } + #fix the invoice amount + + my $cust_bill = $self->cust_bill; + $cust_bill->charged( $cust_bill->charged - $self->setup - $self->recur ); + + #not adding a cc surcharge, but this override lets us modify charged + $cust_bill->{'Hash'}{'cc_surcharge_replace_hack'} = 1; + + my $error = $cust_bill->replace; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + my $error = $self->SUPER::delete(@_); if ( $error ) { $dbh->rollback if $oldAutoCommit; diff --git a/FS/FS/cust_event_fee.pm b/FS/FS/cust_event_fee.pm index 7b448dd..1896b52 100644 --- a/FS/FS/cust_event_fee.pm +++ b/FS/FS/cust_event_fee.pm @@ -3,6 +3,7 @@ use base qw( FS::cust_main_Mixin FS::Record FS::FeeOrigin_Mixin ); use strict; use FS::Record qw( qsearch dbh ); +use FS::cust_event; =head1 NAME @@ -72,6 +73,36 @@ otherwise returns false. Delete this record from the database. +=cut + +sub delete { + my $self = shift; + + my $oldAutoCommit = $FS::UID::AutoCommit; + local $FS::UID::AutoCommit = 0; + my $dbh = dbh; + + my $cust_bill_pkg = $self->cust_bill_pkg; + if ( $cust_bill_pkg ) { + my $error = $cust_bill_pkg->delete; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + } + + my $error = $self->SUPER::delete; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + + $dbh->commit or die $dbh->errstr if $oldAutoCommit; + + ''; + +} + =item replace OLD_RECORD Replaces the OLD_RECORD with this one in the database. If there is an error, @@ -194,10 +225,84 @@ sub cust_pkg { } } +=item search_sql_where + +=cut + +sub search_sql_where { + my($class, $param) = @_; + + my $where = FS::cust_event->search_sql_where( $param ); + + if ( $param->{'billpkgnum'} eq 'NULL' ) { + $where .= ' AND billpkgnum IS NULL'; + } elsif ( $param->{'billpkgnum'} eq 'NOT NULL' ) { + $where .= ' AND billpkgnum IS NOT NULL'; + } + + $where; + +} + +=item join_sql + +=cut + +sub join_sql { + #my $class = shift; + + ' LEFT JOIN cust_event USING (eventnum) + LEFT JOIN cust_bill_pkg USING (billpkgnum) + LEFT JOIN cust_bill AS fee_cust_bill USING (invnum) + LEFT JOIN part_fee ON (cust_event_fee.feepart = part_fee.feepart ) + '. FS::cust_event->join_sql(); + +} + =back +=head1 SUBROUTINES + +=over 4 + +=item process_delete + =cut +sub process_delete { + my( $job, $param ) = @_; + + my $search_sql = FS::cust_event_fee->search_sql_where($param); + my $where = $search_sql ? " WHERE $search_sql" : ''; + + my @cust_event_fee = qsearch({ + 'table' => 'cust_event_fee', + 'addl_from' => FS::cust_event_fee->join_sql(), + 'hashref' => {}, + 'extra_sql' => $where, + }); + + my( $num, $last, $min_sec ) = (0, time, 5); #progresbar foo + foreach my $cust_event_fee ( @cust_event_fee ) { + + my $error = $cust_event_fee->delete; + die $error if $error; + + if ( $job ) { #progressbar foo + $num++; + if ( time - $min_sec > $last ) { + my $error = $job->update_statustext( + int( 100 * $num / scalar(@cust_event_fee) ) + ); + die $error if $error; + $last = time; + } + } + + } + +} + sub _upgrade_schema { my ($class, %opts) = @_; |