The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl
### before: #!@PERL@

use strict;
use warnings;

package RT::Repeat::Ticket::Run;

BEGIN {
### after:     use lib qw(@RT_LIB_PATH@);
use lib '/opt/rt4/local/lib /opt/rt4/lib';
use RT;
RT::LoadConfig;
RT::Init;
}

use RT::Attributes;
use RT::Date;
use RT::Extension::RepeatTicket;

__PACKAGE__->run(@ARGV) unless caller;

sub run{
    my ($class, @args) = @_;

    my %args = $class->process_args(@args);

    my $attrs = RT::Attributes->new( RT->SystemUser );
    $attrs->Limit( FIELD => 'Name', VALUE => 'RepeatTicketSettings' );

    while ( my $attr = $attrs->Next ) {
        my $date = $args{date}->clone;
        next unless $attr->Content->{'repeat-enabled'};
        next if $args{ticket} && $args{ticket} != $attr->Object->id;
        next
          if $args{type} && $args{type} ne $attr->Content->{'repeat-type'};

        $RT::Logger->info( 'Repeating ticket ' . $attr->Object->id );
        my @ids = RT::Extension::RepeatTicket::Run( $attr, $date );
        if ( @ids ) {
            $RT::Logger->info(
                'Repeated ticket ' . $attr->Object->id . ': ' . join ', ', @ids );
        }
    }
    return;
}

sub process_args {
    require Getopt::Long;
    local @ARGV = @_;

    my %opt;
    Getopt::Long::GetOptions( \%opt, 'help|h', 'date=s', 'type=s', 'ticket=s' );

    if ( delete $opt{help} ) {
        require Pod::Usage;
        Pod::Usage::pod2usage( { verbose => 2 } );
        exit;
    }

    if ( $opt{date} ) {
        my $d = RT::Date->new( RT->SystemUser );
        $d->Set(
                Format => 'unknown',
                Value  => $opt{date},
               );

        # can't use ->Unix because timezone issue
        # where $d->Unix could return a small seconds after 1970-01-01 00:00:00 UTC
        # if date parse fails
        if ( $d->Date ne '1970-01-01' ) {
            $opt{date} = DateTime->from_epoch(
                epoch     => $d->Unix,
                time_zone => RT->Config->Get('Timezone'),
            )->truncate(to => 'day');
        }
    }
    $opt{date} ||= DateTime->today( time_zone => RT->Config->Get('Timezone') );

    return %opt;
}

1;

__END__

=head1 NAME

rt-repeat-ticket - repeat ticket

=head1 SYNOPSIS

    rt-repeat-ticket  # today
    rt-repeat-ticket --type daily # repeat tickets of repeat type 'daily'
    rt-repeat-ticket --date 2012-06-23
    rt-repeat-ticket --ticket 20 # repeat ticket 20

=head1 DESCRIPTION

This script will repeat ticket according to the recurrence rule.