[freeside-commits] branch master updated. 45661177045af5c0ed3664272fc30dac37a674e4

Mitch Jackson mitch at freeside.biz
Fri Jun 29 20:01:25 PDT 2018


The branch, master has been updated
       via  45661177045af5c0ed3664272fc30dac37a674e4 (commit)
      from  baba7f31551483f9629e1afb42efd4d6b7f6e7a5 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 45661177045af5c0ed3664272fc30dac37a674e4
Author: Mitch Jackson <mitch at freeside.biz>
Date:   Fri Jun 29 22:00:00 2018 -0500

    RT# 32238 Billing Event cust_birthdate

diff --git a/FS/FS/part_event/Condition/cust_birthdate.pm b/FS/FS/part_event/Condition/cust_birthdate.pm
new file mode 100644
index 000000000..874e3acd0
--- /dev/null
+++ b/FS/FS/part_event/Condition/cust_birthdate.pm
@@ -0,0 +1,64 @@
+package FS::part_event::Condition::cust_birthdate;
+use base qw( FS::part_event::Condition );
+use strict;
+use warnings;
+use DateTime;
+
+=head2 NAME
+
+FS::part_event::Condition::cust_birthdate
+
+=head1 DESCRIPTION
+
+Billing event triggered by the time until the customer's next
+birthday (cust_main.birthdate)
+
+=cut
+
+sub description {
+  'Customer birthdate occurs within the given timeframe';
+}
+
+sub option_fields {
+  (
+    timeframe => {
+      label => 'Timeframe',
+      type   => 'freq',
+      value  => '1m',
+    }
+  );
+}
+
+sub condition {
+  my( $self, $object, %opt ) = @_;
+  my $cust_main = $self->cust_main($object);
+
+  my $birthdate = $cust_main->birthdate || return 0;
+
+  my %timeframe;
+  if ( $self->option('timeframe') =~ /(\d+)([mwdh])/ ) {
+    my $k = {qw|m months w weeks d days h hours|}->{$2};
+    $timeframe{ $k } = $1;
+  } else {
+    die "Unparsable timeframe given: ".$self->option('timeframe');
+  }
+
+  my $ck_dt = DateTime->from_epoch( epoch => $opt{time} );
+  my $bd_dt = DateTime->from_epoch( epoch => $birthdate );
+
+  # Find the birthday for this calendar year.  If customer birthday
+  # has already passed this year, find the birthday for next year.
+  my $next_bd_dt = DateTime->new(
+    month => $bd_dt->month,
+    day   => $bd_dt->day,
+    year  => $ck_dt->year,
+  );
+  $next_bd_dt->add( years => 1 )
+    if DateTime->compare( $next_bd_dt, $ck_dt ) == -1;
+
+  # Does next birthday occur between now and specified duration?
+  $ck_dt->add( %timeframe );
+  DateTime->compare( $next_bd_dt, $ck_dt ) != 1 ? 1 : 0;
+}
+
+1;

-----------------------------------------------------------------------

Summary of changes:
 FS/FS/part_event/Condition/cust_birthdate.pm | 64 ++++++++++++++++++++++++++++
 1 file changed, 64 insertions(+)
 create mode 100644 FS/FS/part_event/Condition/cust_birthdate.pm




More information about the freeside-commits mailing list