summaryrefslogtreecommitdiff
path: root/FS
diff options
context:
space:
mode:
authorivan <ivan>2009-10-04 02:09:14 +0000
committerivan <ivan>2009-10-04 02:09:14 +0000
commit3a02e398ce013116c6ee97fc18472a6f40e0798d (patch)
treea932528236c69b7af25cfcddcabd13e0729aa239 /FS
parent2c35c432f6cd3be7e40edd360b1d91eb788ed55e (diff)
delete invoices, RT#4048
Diffstat (limited to 'FS')
-rw-r--r--FS/FS/AccessRight.pm31
-rw-r--r--FS/FS/Conf.pm9
-rw-r--r--FS/FS/Setup.pm2
-rw-r--r--FS/FS/cust_bill.pm61
-rw-r--r--FS/FS/cust_bill_pkg.pm120
-rwxr-xr-xFS/bin/freeside-addgroup2
6 files changed, 200 insertions, 25 deletions
diff --git a/FS/FS/AccessRight.pm b/FS/FS/AccessRight.pm
index fc309fa48..a54d27082 100644
--- a/FS/FS/AccessRight.pm
+++ b/FS/FS/AccessRight.pm
@@ -150,6 +150,7 @@ tie my %rights, 'Tie::IxHash',
'Customer invoice / financial info rights' => [
'View invoices',
'Resend invoices', #NEWNEW
+ 'Delete invoices', #new, but no need to phase in
'View customer tax exemptions', #yow
'Add customer tax adjustment', #new, but no need to phase in
'View customer batched payments', #NEW
@@ -285,14 +286,38 @@ tie my %rights, 'Tie::IxHash',
=item rights
-Returns a list of right names.
+Returns the full list of right names.
=cut
- sub rights {
+sub rights {
#my $class = shift;
map { ref($_) ? $_->{'rightname'} : $_ } map @{ $rights{$_} }, keys %rights;
- }
+}
+
+=item default_superuser_rights
+
+Most (but not all) right names.
+
+=cut
+
+sub default_superuser_rights {
+ my $class = shift;
+ my %omit = map { $_=>1 } (
+ 'Delete customer',
+ 'Delete invoices',
+ 'Delete payment',
+ 'Delete credit', #?
+ 'Delete refund', #?
+ 'Time queue',
+ 'Redownload resolved batches',
+ 'Raw SQL',
+ 'Configuration download',
+ );
+
+ no warnings 'uninitialized';
+ grep { ! $omit{$_} } $class->rights;
+}
=item rights_info
diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm
index 7112417d5..3b37feacc 100644
--- a/FS/FS/Conf.pm
+++ b/FS/FS/Conf.pm
@@ -728,7 +728,14 @@ worry that config_items is freeside-specific and icky.
{
'key' => 'deletecustomers',
'section' => 'UI',
- 'description' => 'Enable customer deletions. Be very careful! Deleting a customer will remove all traces that this customer ever existed! It should probably only be used when auditing a legacy database. Normally, you cancel all of a customers\' packages if they cancel service.',
+ 'description' => 'Enable customer deletions. Be very careful! Deleting a customer will remove all traces that the customer ever existed! It should probably only be used when auditing a legacy database. Normally, you cancel all of a customers\' packages if they cancel service.',
+ 'type' => 'checkbox',
+ },
+
+ {
+ 'key' => 'deleteinvoices',
+ 'section' => 'UI',
+ 'description' => 'Enable invoices deletions. Be very careful! Deleting an invoice will remove all traces that the invoice ever existed! Normally, you would apply a credit against the invoice instead.', #invoice voiding?
'type' => 'checkbox',
},
diff --git a/FS/FS/Setup.pm b/FS/FS/Setup.pm
index cba3c7e3c..edfe912ea 100644
--- a/FS/FS/Setup.pm
+++ b/FS/FS/Setup.pm
@@ -364,7 +364,7 @@ sub populate_access {
use FS::AccessRight;
use FS::access_right;
- foreach my $rightname ( FS::AccessRight->rights ) {
+ foreach my $rightname ( FS::AccessRight->default_superuser_rights ) {
my $access_right = new FS::access_right {
'righttype' => 'FS::access_group',
'rightobjnum' => 1, #$supergroup->groupnum,
diff --git a/FS/FS/cust_bill.pm b/FS/FS/cust_bill.pm
index 79f85c807..55faa36bc 100644
--- a/FS/FS/cust_bill.pm
+++ b/FS/FS/cust_bill.pm
@@ -160,7 +160,50 @@ Really, don't use it.
sub delete {
my $self = shift;
return "Can't delete closed invoice" if $self->closed =~ /^Y/i;
- $self->SUPER::delete(@_);
+
+ local $SIG{HUP} = 'IGNORE';
+ local $SIG{INT} = 'IGNORE';
+ local $SIG{QUIT} = 'IGNORE';
+ local $SIG{TERM} = 'IGNORE';
+ local $SIG{TSTP} = 'IGNORE';
+ local $SIG{PIPE} = 'IGNORE';
+
+ my $oldAutoCommit = $FS::UID::AutoCommit;
+ local $FS::UID::AutoCommit = 0;
+ my $dbh = dbh;
+
+ foreach my $table (qw(
+ cust_bill_event
+ cust_event
+ cust_credit_bill
+ cust_bill_pay
+ cust_bill_pay
+ cust_credit_bill
+ cust_pay_batch
+ cust_bill_pay_batch
+ cust_bill_pkg
+ )) {
+
+ foreach my $linked ( $self->$table() ) {
+ my $error = $linked->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
@@ -460,6 +503,16 @@ sub cust_pay {
#;
}
+sub cust_pay_batch {
+ my $self = shift;
+ qsearch('cust_pay_batch', { 'invnum' => $self->invnum } );
+}
+
+sub cust_bill_pay_batch {
+ my $self = shift;
+ qsearch('cust_bill_pay_batch', { 'invnum' => $self->invnum } );
+}
+
=item cust_bill_pay
Returns all payment applications (see L<FS::cust_bill_pay>) for this invoice.
@@ -474,6 +527,8 @@ sub cust_bill_pay {
=item cust_credited
+=item cust_credit_bill
+
Returns all applied credits (see L<FS::cust_credit_bill>) for this invoice.
=cut
@@ -485,6 +540,10 @@ sub cust_credited {
;
}
+sub cust_credit_bill {
+ shift->cust_credited(@_);
+}
+
=item cust_bill_pay_pkgnum PKGNUM
Returns all payment applications (see L<FS::cust_bill_pay>) for this invoice
diff --git a/FS/FS/cust_bill_pkg.pm b/FS/FS/cust_bill_pkg.pm
index 96f09c915..9d7aae23c 100644
--- a/FS/FS/cust_bill_pkg.pm
+++ b/FS/FS/cust_bill_pkg.pm
@@ -1,7 +1,7 @@
package FS::cust_bill_pkg;
use strict;
-use vars qw( @ISA $DEBUG );
+use vars qw( @ISA $DEBUG $me );
use FS::Record qw( qsearch qsearchs dbdef dbh );
use FS::cust_main_Mixin;
use FS::cust_pkg;
@@ -12,10 +12,14 @@ use FS::cust_bill_pkg_display;
use FS::cust_bill_pay_pkg;
use FS::cust_credit_bill_pkg;
use FS::cust_tax_exempt_pkg;
+use FS::cust_bill_pkg_tax_location;
+use FS::cust_bill_pkg_tax_rate_location;
+use FS::cust_tax_adjustment;
@ISA = qw( FS::cust_main_Mixin FS::Record );
-$DEBUG = 0;
+$DEBUG = 2;
+$me = '[FS::cust_bill_pkg]';
=head1 NAME
@@ -40,30 +44,57 @@ supported:
=over 4
-=item billpkgnum - primary key
+=item billpkgnum
-=item invnum - invoice (see L<FS::cust_bill>)
+primary key
-=item pkgnum - package (see L<FS::cust_pkg>) or 0 for the special virtual sales tax package, or -1 for the virtual line item (itemdesc is used for the line)
+=item invnum
-=item pkgpart_override - optional package definition (see L<FS::part_pkg>) override
-=item setup - setup fee
+invoice (see L<FS::cust_bill>)
-=item recur - recurring fee
+=item pkgnum
-=item sdate - starting date of recurring fee
+package (see L<FS::cust_pkg>) or 0 for the special virtual sales tax package, or -1 for the virtual line item (itemdesc is used for the line)
-=item edate - ending date of recurring fee
+=item pkgpart_override
-=item itemdesc - Line item description (overrides normal package description)
+optional package definition (see L<FS::part_pkg>) override
-=item quantity - If not set, defaults to 1
+=item setup
-=item unitsetup - If not set, defaults to setup
+setup fee
-=item unitrecur - If not set, defaults to recur
+=item recur
-=item hidden - If set to Y, indicates data should not appear as separate line item on invoice
+recurring fee
+
+=item sdate
+
+starting date of recurring fee
+
+=item edate
+
+ending date of recurring fee
+
+=item itemdesc
+
+Line item description (overrides normal package description)
+
+=item quantity
+
+If not set, defaults to 1
+
+=item unitsetup
+
+If not set, defaults to setup
+
+=item unitrecur
+
+If not set, defaults to recur
+
+=item hidden
+
+If set to Y, indicates data should not appear as separate line item on invoice
=back
@@ -196,13 +227,65 @@ sub insert {
=item delete
-Currently unimplemented. I don't remove line items because there would then be
-no record the items ever existed (which is bad, no?)
+Not recommended.
=cut
sub delete {
- return "Can't delete cust_bill_pkg records!";
+ my $self = shift;
+
+ local $SIG{HUP} = 'IGNORE';
+ local $SIG{INT} = 'IGNORE';
+ local $SIG{QUIT} = 'IGNORE';
+ local $SIG{TERM} = 'IGNORE';
+ local $SIG{TSTP} = 'IGNORE';
+ local $SIG{PIPE} = 'IGNORE';
+
+ my $oldAutoCommit = $FS::UID::AutoCommit;
+ local $FS::UID::AutoCommit = 0;
+ my $dbh = dbh;
+
+ foreach my $table (qw(
+ cust_bill_pkg_detail
+ cust_bill_pkg_display
+ cust_bill_pkg_tax_location
+ cust_bill_pkg_tax_rate_location
+ cust_tax_exempt_pkg
+ cust_bill_pay_pkg
+ cust_credit_bill_pkg
+ )) {
+
+ foreach my $linked ( qsearch($table, { billpkgnum=>$self->billpkgnum }) ) {
+ my $error = $linked->delete;
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return $error;
+ }
+ }
+
+ }
+
+ foreach my $cust_tax_adjustment (
+ qsearch('cust_tax_adjustment', { billpkgnum=>$self->billpkgnum })
+ ) {
+ $cust_tax_adjustment->billpkgnum(''); #NULL
+ my $error = $cust_tax_adjustment->replace;
+ 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;
+
+ '';
+
}
#alas, bin/follow-tax-rename
@@ -263,6 +346,7 @@ Returns the package (see L<FS::cust_pkg>) for this invoice line item.
sub cust_pkg {
my $self = shift;
+ warn "$me $self -> cust_pkg";
qsearchs( 'cust_pkg', { 'pkgnum' => $self->pkgnum } );
}
diff --git a/FS/bin/freeside-addgroup b/FS/bin/freeside-addgroup
index 7b30f7d95..25c23455a 100755
--- a/FS/bin/freeside-addgroup
+++ b/FS/bin/freeside-addgroup
@@ -24,7 +24,7 @@ my $error = $access_group->insert;
die $error if $error;
if ( $opt_s ) {
- foreach my $rightname ( FS::AccessRight->rights ) {
+ foreach my $rightname ( FS::AccessRight->default_superuser_rights ) {
my $access_right = new FS::access_right {
'righttype' => 'FS::access_group',
'rightobjnum' => $access_group->groupnum,