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 and Friday dates and
I can't figure out why.  On the second call, it logs out Friday then tries
Sunday (which isn't in the recurrence range) followed by the next Sunday
which then eventually fails.

I've verified that the following packages are updated on the server (Ubuntu
12.04):

DateTime is up to date. (1.21)
DateTime::Event::Recurrence is up to date. (0.18)
DateTime::Format::CLDR is up to date. (1.17)
DateTime::Format::ICal is up to date. (0.09)
DateTime::Set is up to date. (0.3600)

The versions match my local copy.

Server:
Distributor ID: Ubuntu
Description: Ubuntu 12.04.5 LTS
Release: 12.04
Codename: precise

Local:
Distributor ID: Debian
Description: Debian GNU/Linux testing-updates (sid)
Release: testing-updates
Codename: sid

Perl:                 v5.14.2  (which I limited to match server version
since 5.22 is on Debian Testing)


Do you have any troubleshooting steps I can take to figure out why the
iterator would only be stepping over Monday and Friday and skipping the
Tues/Weds/Thur dates?  (I've tried removing the range and using an array of
[1. 2. 3. 4. 5] in the Recurrence to no avail)

I had used the DateTime::Event::Holiday::US file previously to complement
the weekday set I am generating and I went through removing all that to
track down what this problem is.

Nick

Reply via email to