Re: Having a strange issue with DateTime::Event::Recurrence under Apache...

2016-02-11 Thread Flavio S. Glock
debugging here - I've written this:

---
use DateTime;
use DateTime::Event::Recurrence;

my $startDate = DateTime->new(
year   => 2016,
month  => 2,
day=> 10,
hour   => 17,
minute => 51,
second => 31,
nanosecond => 123456,
time_zone  => 'America/Chicago',
);
my $count= 15;
my $startDay = DateTime->from_object( object => $startDate
)->truncate( to => 'day' );
my $iterator = DateTime::Event::Recurrence->weekly( days => [ 1 .. 5 ]
)->iterator(
after => DateTime->from_object(
object => $startDay
),
);
my @result = ();
while ( $count-- ) {
my $date = $iterator->next;
print "$date ", $date->day_of_week(), "\n";
}
---

troubleshooting steps:

I would try again without calling isHoliday($date) inside the loop.
This is to rule out that $date is being modified.

Alternately, specify a bounded recurrence (one with start and end
dates). This is to force precalculation of the set, before the
iterator starts. For example, using DateTime::Event::ICal:

---
use DateTime;
use DateTime::Event::ICal;

my $startDate = DateTime->new(
year   => 2016,
month  => 2,
day=> 10,
hour   => 17,
minute => 51,
second => 31,
nanosecond => 123456,
time_zone  => 'America/Chicago',
);
my $startDay = DateTime->from_object( object => $startDate
)->truncate( to => 'day' )->add( days => 1 );
my $iterator = DateTime::Event::ICal->recur(
dtstart => $startDay,
freq=> 'weekly',
byday   => [ "mo", "tu", "we", "th", "fr" ],
count   => 15,
)->iterator();
my @result = ();
while ( my $date = $iterator->next ) {
print "$date ", $date->day_of_week(), "\n";
}
---

please let me know what you get.

Flávio


2016-02-10 19:19 GMT+01:00 Nicholas Schubach :
> To whom it may concern,
>
> I have what I think is a simple couple methods for estimating delivery dates
> (We are a custom printing shop and build in padding to allow for acquire and
> printing then give the customer an estimate on how many days we can complete
> and ship):
>
> sub calculateOrderDeliveryDate
> {
> my ($self, $orderDate, $serviceDays) = @_;
>
> warn Dumper("$orderDate --- $serviceDays");
>
> my @workingDays = $self->_getWorkingDays($orderDate, max (25,
> $serviceDays)); # Optimize search to 25 days out...
>
> return $workingDays[$serviceDays];
> }
>
> sub _getWorkingDays
> {
> my ($self, $startDate, $count) = @_;
> my $startDay = DateTime->from_object( object => $startDate )->truncate(
> to => 'day' );
> my $iterator = DateTime::Event::Recurrence->weekly( days => [1..5]
> )->iterator(
> after => DateTime->from_object( object => $startDay ),
> );
>
> my @result = ();
>
> while ($count > scalar @result)
> {
> my $date = $iterator->next;
> warn Dumper("$date -> ");
> if ($date && !isHoliday($date)) {
> push @result, $date;
> }
> }
>
> return \@result;
> }
>
> Which when called using (Local and server):
>
> perl -e "use DateTime; use Util::Dates;
> Util::Dates->calculateOrderDeliveryDate(DateTime->now(), 7);"
>
> Logs out:
>
> $VAR1 = '2016-02-10T17:51:31 --- 7';
> $VAR1 = '2016-02-12T00:00:00 -> ';
> $VAR1 = '2016-02-15T00:00:00 -> ';
> $VAR1 = '2016-02-16T00:00:00 -> ';
> $VAR1 = '2016-02-17T00:00:00 -> ';
> $VAR1 = '2016-02-18T00:00:00 -> ';
> $VAR1 = '2016-02-19T00:00:00 -> ';
> $VAR1 = '2016-02-22T00:00:00 -> ';
> $VAR1 = '2016-02-23T00:00:00 -> ';
> $VAR1 = '2016-02-24T00:00:00 -> ';
> $VAR1 = '2016-02-25T00:00:00 -> ';
> $VAR1 = '2016-02-26T00:00:00 -> ';
> $VAR1 = '2016-02-29T00:00:00 -> ';
> $VAR1 = '2016-03-01T00:00:00 -> ';
> $VAR1 = '2016-03-02T00:00:00 -> ';
> $VAR1 = '2016-03-03T00:00:00 -> ';
> $VAR1 = '2016-03-04T00:00:00 -> ';
> $VAR1 = '2016-03-07T00:00:00 -> ';
> $VAR1 = '2016-03-08T00:00:00 -> ';
> $VAR1 = '2016-03-09T00:00:00 -> ';
> $VAR1 = '2016-03-10T00:00:00 -> ';
> $VAR1 = '2016-03-11T00:00:00 -> ';
> $VAR1 = '2016-03-14T00:00:00 -> ';
> $VAR1 = '2016-03-15T00:00:00 -> ';
> $VAR1 = '2016-03-16T00:00:00 -> ';
> $VAR1 = '2016-03-17T00:00:00 -> ';
>
> Which is what I want.
>
> When running the same code under an Apache web request on the server, the
> Apache error log file contains:
>
> [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-02-10T12:49:32 --- 7';
> [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-02-11T00:00:00 -> ';
> [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-02-15T00:00:00 -> ';
> [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-02-19T00:00:00 -> ';
> [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-02-22T00:00:00 -> ';
> [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-02-26T00:00:00 -> ';
> [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-02-29T00:00:00 -> ';
> [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-03-04T00:00:00 -> ';
> [Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-03-07T00:00:00 -> ';
> [Wed Feb 10 12:49:32 2016] main.cgi: 

Having a strange issue with DateTime::Event::Recurrence under Apache...

2016-02-10 Thread Nicholas Schubach
To whom it may concern,

I have what I think is a simple couple methods for estimating delivery
dates (We are a custom printing shop and build in padding to allow for
acquire and printing then give the customer an estimate on how many days we
can complete and ship):

sub calculateOrderDeliveryDate
{
my ($self, $orderDate, $serviceDays) = @_;

warn Dumper("$orderDate --- $serviceDays");

my @workingDays = $self->_getWorkingDays($orderDate, max (25,
$serviceDays)); # Optimize search to 25 days out...

return $workingDays[$serviceDays];
}

sub _getWorkingDays
{
my ($self, $startDate, $count) = @_;
my $startDay = DateTime->from_object( object => $startDate )->truncate(
to => 'day' );
my $iterator = DateTime::Event::Recurrence->weekly( days => [1..5]
)->iterator(
after => DateTime->from_object( object => $startDay ),
);

my @result = ();

while ($count > scalar @result)
{
my $date = $iterator->next;
warn Dumper("$date -> ");
if ($date && !isHoliday($date)) {
push @result, $date;
}
}

return \@result;
}

Which when called using (Local and server):

perl -e "use DateTime; use Util::Dates;
Util::Dates->calculateOrderDeliveryDate(DateTime->now(), 7);"

Logs out:

$VAR1 = '2016-02-10T17:51:31 --- 7';
$VAR1 = '2016-02-12T00:00:00 -> ';
$VAR1 = '2016-02-15T00:00:00 -> ';
$VAR1 = '2016-02-16T00:00:00 -> ';
$VAR1 = '2016-02-17T00:00:00 -> ';
$VAR1 = '2016-02-18T00:00:00 -> ';
$VAR1 = '2016-02-19T00:00:00 -> ';
$VAR1 = '2016-02-22T00:00:00 -> ';
$VAR1 = '2016-02-23T00:00:00 -> ';
$VAR1 = '2016-02-24T00:00:00 -> ';
$VAR1 = '2016-02-25T00:00:00 -> ';
$VAR1 = '2016-02-26T00:00:00 -> ';
$VAR1 = '2016-02-29T00:00:00 -> ';
$VAR1 = '2016-03-01T00:00:00 -> ';
$VAR1 = '2016-03-02T00:00:00 -> ';
$VAR1 = '2016-03-03T00:00:00 -> ';
$VAR1 = '2016-03-04T00:00:00 -> ';
$VAR1 = '2016-03-07T00:00:00 -> ';
$VAR1 = '2016-03-08T00:00:00 -> ';
$VAR1 = '2016-03-09T00:00:00 -> ';
$VAR1 = '2016-03-10T00:00:00 -> ';
$VAR1 = '2016-03-11T00:00:00 -> ';
$VAR1 = '2016-03-14T00:00:00 -> ';
$VAR1 = '2016-03-15T00:00:00 -> ';
$VAR1 = '2016-03-16T00:00:00 -> ';
$VAR1 = '2016-03-17T00:00:00 -> ';

Which is what I want.

When running the same code under an Apache web request on the server, the
Apache error log file contains:

[Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-02-10T12:49:32 --- 7';
[Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-02-11T00:00:00 -> ';
[Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-02-15T00:00:00 -> ';
[Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-02-19T00:00:00 -> ';
[Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-02-22T00:00:00 -> ';
[Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-02-26T00:00:00 -> ';
[Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-02-29T00:00:00 -> ';
[Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-03-04T00:00:00 -> ';
[Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-03-07T00:00:00 -> ';
[Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-03-11T00:00:00 -> ';
[Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-03-14T00:00:00 -> ';
[Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-03-18T00:00:00 -> ';
[Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-03-21T00:00:00 -> ';
[Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-03-25T00:00:00 -> ';
[Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-03-28T00:00:00 -> ';
[Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-04-01T00:00:00 -> ';
[Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-04-04T00:00:00 -> ';
[Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-04-08T00:00:00 -> ';
[Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-04-11T00:00:00 -> ';
[Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-04-15T00:00:00 -> ';
[Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-04-18T00:00:00 -> ';
[Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-04-22T00:00:00 -> ';
[Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-04-25T00:00:00 -> ';
[Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-04-29T00:00:00 -> ';
[Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-05-02T00:00:00 -> ';
[Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-05-06T00:00:00 -> ';
[Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-02-10T12:49:32 --- 21';
[Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-02-11T00:00:00 -> ';
[Wed Feb 10 12:49:32 2016] main.cgi: $VAR1 = '2016-02-13T00:00:00 -> ';
[Wed Feb 10 12:49:33 2016] main.cgi: $VAR1 = '2016-02-20T00:00:00 -> ';
[Wed Feb 10 12:49:33 2016] main.cgi: Can't call method "is_infinite" on an
undefined value at
/usr/local/share/perl/5.14.2/DateTime/Event/Recurrence.pm line 870.

The initial call is for 7 day delivery estimate followed by a 21 day
delivery estimate.  Since both of these are under 21 days, they run the 25
day estimate (which I was Memoizing to save from calling it repeatedly...)
The Error I think is inconsequential to the issue I'm concerned with.  If
you look at the dates logged out, it prints the Monday