From eb6c0aef92ad5e5391c47c26579093241d51803a Mon Sep 17 00:00:00 2001 From: Jared Camins-Esakov Date: Sun, 2 Jun 2013 07:50:43 -0400 Subject: [PATCH] Bug 10390: Add ability to delete empty invoices There is currently no way to delete unused invoices (for example, invoices created by mistake), and there really should be, since errors and absent-mindedness can result in numerous empty invoices over the course of years. To test: 1) Apply patch. 2) Create three invoices in the Acquisitions module. For one of them, receive at least one item. For the other two, do not receive any items. 3) View one of the invoices that does not have any items on it. 4) Try to delete it. This should succeed. 5) View the invoice that has an item. There should not be any option to delete it. 6) Do an invoice search that brings up the other invoice with no items on it. Try to delete it from the results page. This should succeed. 7) Run the unit test: > prove t/Acquisition/Invoice.t 8) Sign off. --- C4/Acquisition.pm | 34 ++++++++++++++++++++ acqui/invoice.pl | 8 +++++ .../intranet-tmpl/prog/en/modules/acqui/invoice.tt | 3 ++ .../prog/en/modules/acqui/invoices.tt | 3 ++ t/Acquisition/Invoice.t | 23 ++++++++++++- 5 files changed, 70 insertions(+), 1 deletion(-) diff --git a/C4/Acquisition.pm b/C4/Acquisition.pm index b6fab5d..dd7069a 100644 --- a/C4/Acquisition.pm +++ b/C4/Acquisition.pm @@ -71,6 +71,7 @@ BEGIN { &ModInvoice &CloseInvoice &ReopenInvoice + &DelInvoice &GetItemnumbersFromOrder @@ -2607,6 +2608,39 @@ sub ReopenInvoice { $sth->execute($invoiceid); } +=head3 DelInvoice + + DelInvoice($invoiceid); + +Delete an invoice if there are no items attached to it. + +=cut + +sub DelInvoice { + my ($invoiceid) = @_; + + return unless $invoiceid; + + my $dbh = C4::Context->dbh; + my $query = qq{ + SELECT COUNT(*) + FROM aqorders + WHERE invoiceid = ? + }; + my $sth = $dbh->prepare($query); + $sth->execute($invoiceid); + my $res = $sth->fetchrow_arrayref; + if ( $res && $res->[0] == 0 ) { + $query = qq{ + DELETE FROM aqinvoices + WHERE invoiceid = ? + }; + my $sth = $dbh->prepare($query); + return ( $sth->execute($invoiceid) > 0 ); + } + return; +} + 1; __END__ diff --git a/acqui/invoice.pl b/acqui/invoice.pl index 1b6d97c..e38e02d 100755 --- a/acqui/invoice.pl +++ b/acqui/invoice.pl @@ -86,6 +86,14 @@ elsif ( $op && $op eq 'mod' ) { } $template->param( modified => 1 ); } +elsif ( $op && $op eq 'delete' ) { + DelInvoice($invoiceid); + my $referer = $input->param('referer') || 'invoices.pl'; + if ($referer) { + print $input->redirect($referer); + exit 0; + } +} my $details = GetInvoiceDetails($invoiceid); my $bookseller = GetBookSellerFromId( $details->{booksellerid} ); diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/invoice.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/invoice.tt index 96df8d1..1ce4cd8 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/invoice.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/invoice.tt @@ -84,6 +84,9 @@
+ [% UNLESS orders_loop.size %] + Delete + [% END %]

diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/invoices.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/invoices.tt index 52d2ecc..16c1b61 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/invoices.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/invoices.tt @@ -80,6 +80,9 @@ $(document).ready(function() { [% ELSE %] Close [% END %] + [% UNLESS invoice.receivedbiblios || invoice.receiveditems %] + / Delete + [% END %] [% END %] diff --git a/t/Acquisition/Invoice.t b/t/Acquisition/Invoice.t index a887965..0a37f44 100755 --- a/t/Acquisition/Invoice.t +++ b/t/Acquisition/Invoice.t @@ -3,7 +3,7 @@ use Modern::Perl; use C4::Context; -use Test::More tests => 47; +use Test::More tests => 49; use Test::MockModule; use_ok('C4::Acquisition'); @@ -129,3 +129,24 @@ is(scalar(@$history), 1); @bound_params = @{ $history->[0]->{bound_params} }; is(scalar(@bound_params), 1); is($bound_params[0], 42); +my $checkordersrs = [ + [qw(COUNT)], + [2] +]; + +$dbh->{mock_add_resultset} = $checkordersrs; +is(DelInvoice(42), undef, "Invoices with items don't get deleted"); + +$checkordersrs = [ + [qw(COUNT)], + [0] +]; + +my $deleters = [ + [qw(COUNT)], + [1] +]; + +$dbh->{mock_add_resultset} = $checkordersrs; +$dbh->{mock_add_resultset} = $deleters; +ok(DelInvoice(42), "Invoices with items do get deleted"); -- 1.7.9.5