summaryrefslogtreecommitdiff
path: root/FS/FS/part_event/Condition/once_perinv.pm
diff options
context:
space:
mode:
Diffstat (limited to 'FS/FS/part_event/Condition/once_perinv.pm')
-rw-r--r--FS/FS/part_event/Condition/once_perinv.pm57
1 files changed, 57 insertions, 0 deletions
diff --git a/FS/FS/part_event/Condition/once_perinv.pm b/FS/FS/part_event/Condition/once_perinv.pm
new file mode 100644
index 0000000..f85a056
--- /dev/null
+++ b/FS/FS/part_event/Condition/once_perinv.pm
@@ -0,0 +1,57 @@
+package FS::part_event::Condition::once_perinv;
+
+use strict;
+use FS::Record qw( qsearch );
+use FS::part_event;
+use FS::cust_event;
+
+use base qw( FS::part_event::Condition );
+
+sub description { "Run only once for each time the package has been billed"; }
+
+# Run the event, at most, a number of times equal to the number of
+# distinct invoices that contain line items from this package.
+
+sub eventtable_hashref {
+ { 'cust_main' => 0,
+ 'cust_bill' => 0,
+ 'cust_pkg' => 1,
+ };
+}
+
+sub condition {
+ my($self, $cust_pkg, %opt) = @_;
+
+ my %invnum;
+ $invnum{$_->invnum} = 1
+ foreach ( qsearch('cust_bill_pkg', { 'pkgnum' => $cust_pkg->pkgnum }) );
+ my @events = qsearch( {
+ 'table' => 'cust_event',
+ 'hashref' => { 'eventpart' => $self->eventpart,
+ 'status' => { op=>'!=', value=>'failed' },
+ 'tablenum' => $cust_pkg->pkgnum,
+ },
+ 'extra_sql' => ( $opt{'cust_event'}->eventnum =~ /^(\d+)$/
+ ? " AND eventnum != $1 " : '' ),
+ } );
+ scalar(@events) < scalar(keys %invnum);
+}
+
+sub condition_sql {
+ my( $self, $table ) = @_;
+
+ "(
+ ( SELECT COUNT(distinct(invnum))
+ FROM cust_bill_pkg
+ WHERE cust_bill_pkg.pkgnum = cust_pkg.pkgnum )
+ >
+ ( SELECT COUNT(*)
+ FROM cust_event
+ WHERE cust_event.eventpart = part_event.eventpart
+ AND cust_event.tablenum = cust_pkg.pkgnum
+ AND status != 'failed' )
+ )"
+
+}
+
+1;