NAME
    RT::Extension::RepeatTicket - Repeat tickets based on schedule

DESCRIPTION
    The RepeatTicket extension allows you to set up recurring tickets so new
    tickets are automatically created based on a schedule. The new tickets
    are populated with the subject and initial content of the original
    ticket in the recurrence.

    After you activate the plugin by adding it to your RT_SiteConfig.pm
    file, all tickets will have a Recurrence tab on the create and edit
    pages. To set up a repeating ticket, click the checkbox to "Enable
    Recurrence" and fill out the schedule for the new tickets.

    New tickets are created when you initially save the recurrence, if new
    tickets are needed, and when your daily cron job runs the
    rt-repeat-ticket script.

RT VERSION
    Works with RT 6.0. For RT 5.0 install the most recent 2.* version.

INSTALLATION
    perl Makefile.PL
    make
    make install
        May need root permissions

    make initdb
        Only run this the first time you install this module.

        If you run this twice, you may end up with duplicate data in your
        database.

        If you are upgrading this module, check for upgrading instructions
        in case changes need to be made to your database.

    Edit your /opt/rt6/etc/RT_SiteConfig.pm
        Add this line:

            Plugin('RT::Extension::RepeatTicket');

    Clear your mason cache
            rm -rf /opt/rt6/var/mason_data/obj

    Add bin/rt-repeat-ticket to the daily cron job.
    Restart your webserver
    Add Repeat Ticket to your Page Layouts
        This extension provides a widget that can be added to the Page
        Layouts for the Ticket Create and Display pages for queues where you
        want to use Repeat Ticket. You can add the widget by going to Admin
        -> Page Layouts -> Ticket and choosing the Create or Display Layout.

        If you do not add the widget to the Page Layouts you can use the
        Recurrence tab to modify recurrence for a ticket.

MODES
  Simple Mode VS Concurrent Tickets Mode
    This extension supports two different modes for the repeat ticket
    configurations. The extension originally only supported Concurrent
    Tickets Mode but many users found the logic counter intuitive.

    Any existing repeat ticket configurations from previous versions will be
    in Concurrent Tickets Mode unless the definition is changed.

    The default for new repeat ticket configurations is Simple Mode.

   Simple Mode
    In this mode tickets are created and start on the recurring date. If the
    lead time field is filled out the ticket will be due that many days
    after the recurring date. There is no check for existing active tickets
    and if the rt-repeat-ticket script is run multiple times for the same
    day it will create a new ticket for each run.

   Concurrent Tickets Mode
    In this mode the tickets are created with the due date as the recurring
    date. The tickets start on the due date minus the lead time. You can
    specify the max number of concurrent active tickets. If the
    rt-repeat-ticket script is run multiple times for the same day it will
    only create new tickets if there are fewer active tickets than the max
    number of concurrent active tickets.

CONFIGURATION
  $RepeatTicketCoexistentNumber
    Only used in Concurrent Tickets Mode.

    The $RepeatTicketCoexistentNumber determines how many tickets can be in
    an active status for a recurrence at any time. A value of 1 means one
    ticket at a time can be active. New tickets will not be created until
    the current active ticket is resolved or set to some other inactive
    status. You can also set this value per recurrence, overriding this
    config value. The extension default is 1 ticket.

  $RepeatTicketLeadTime
    When in Simple Mode the $RepeatTicketLeadTime is the number of days to
    add to the recurring date for the Due date of the ticket.

    When in Concurrent Tickets Mode the $RepeatTicketLeadTime becomes the
    ticket Starts value and sets how far in advance of a ticket's Due date
    you want the ticket to be created. This essentially is how long you want
    to give people to work on the ticket.

    For example, if you create a weekly recurrence scheduled on Mondays and
    set the lead time to 7 days, each Monday a ticket will be created with
    the Starts date set to that Monday and a Due date of the following
    Monday.

    When in Concurrent Tickets Mode, with a number of concurrent active
    tickets greater than 1, if you set the lead time to be larger than the
    interval between recurring tickets it can result in strange behavior. It
    is recommended that the ticket lead time be smaller or equal to the
    interval between tickets.

    The value you set in RT_SiteConfig.pm becomes the system default, but
    you can set this value on each ticket as well. The extension default is
    14 days.

  $RepeatTicketSubjectFormat
    By default, repeated tickets will have the same subject as the original
    ticket. You can modify this subject by setting a format with the
    $RepeatTicketSubjectFormat option. This option accepts formats in the
    same form as formats for RT searches. The placeholders take values from
    the repeated ticket, not the original ticket, so you can use the format
    to help differentiate the subjects in repeated tickets.

    For example, if you wanted to put the due date in the subject, you could
    set the format to:

        Set($RepeatTicketSubjectFormat, '__Due__ __Subject__');

    You'll want to use values that you don't expect to change since the
    subject won't change if the ticket value (e.g., Due) is changed.

    Since this uses RT formats, you can create a custom format by creating a
    new RT ColumnMap. You can see the available formats by looking at the
    columns available in the Display Columns portlet on the RT ticket search
    page.

  $RepeatTicketPreviewNumber
    By default, the Recurrence Preview will show the next 5 tickets that
    will be created. You can modify the number of tickets to show by setting
    the $RepeatTicketPreviewNumber option:

        Set($RepeatTicketPreviewNumber, 10);

    Set the $RepeatTicketPreviewNumber option to 0 to hide the Recurrence
    Preview.

  @RepeatTicketSkipCustomFields
    By default, all custom field values are carried over to the new ticket.
    Use this config option to skip some custom fields from being copied to
    the new ticket:

        Set(@RepeatTicketSkipCustomFields, ('My Custom Field', 'Another Custom Field'));

  rt-repeat-ticket
    The rt-repeat-ticket utility evaluates all of your repeating tickets and
    creates any new tickets that are needed. With no parameters, it runs for
    "today" each day. You can also pass a --date value in the form
    YYYY-MM-DD to run the script for a specific day.

        bin/rt-repeat-ticket --date 2012-07-25

    This can be handy if your cron job doesn't run for some reason and you
    want to make sure no repeating tickets have been missed. Just go back
    and run the script for the days you missed. You can also pass dates in
    the future which might be handy if you want to experiment with
    recurrences in a test environment.

   WARNING
    If you run the script multiple times for the same day then it is
    possible multiple tickets will be created for the same repeat ticket
    configuration.

USAGE
  Initial Tickets
    The initial ticket you create for a recurrence stores the schedule and
    other details for the recurrence. If you need to change the recurrence
    in the future, to make it more frequent or less frequent or anything
    else, make the changes on the original ticket. To help you find this
    initial ticket, which may have been resolved long ago, a custom field is
    created on each ticket in the recurrence with link called "Original
    Ticket."

    When setting up the recurrence, you can use the original ticket as an
    actual work ticket. When doing this, you'll need to set the Starts and
    Due dates when you create the ticket. Scheduled tickets created
    subsequently will set these values based on the recurrence. Resolving
    the original ticket does not cancel the recurrence.

  Start Value
    You can set a Start date for a new recurrence. If you don't, it defaults
    to the day you create the recurrence.

  Cancelling Recurrences
    You can cancel or end a recurrence in two ways:

    *   Go to the original ticket in the recurrence and uncheck the Enable
        Recurrence checkbox.

    *   Set ending conditions on the recurrence with either a set number of
        recurrences or an end date.

  Recursive Recurrences
    Creating recurrences on recurrences isn't supported and may do strange
    things.

FAQ
    I'm not seeing new recurrences. Why not?
        A few things to check:

        *   Do you have rt-repeat-tickets scheduled in cron? Is it running?

        *   If the repeat configuration is in Concurrent Tickets Mode do you
            have previous tickets still in an active state? Resolve those
            tickets or increase the concurrent active tickets value.

        *   Is it the right day? If the repeat configuration is in
            Concurrent Tickets Mode remember to subtract the lead time value
            to determine the day new tickets should be created.

        *   If you set a start date and another criteria like day of the
            week, the new ticket will be created on the first time that day
            of the week occurs after the start date you set (if the start
            date isn't on that day of the week).

    I want to enable the repeat function only on some queues
        To do this, insetad of applying the "Original Ticket" custom field
        globally, you can apply it to the chosen queues and that's it.

    some users can't see or use this feature successfully.
        Make sure those users have "SeeCustomField" and "ModifyCusotmField"
        rights granted for "Original Ticket" custom field.

SEARCHING
    To search for tickets that have recurrence enabled use the following in
    a Ticket Search:

        HasAttribute = 'RepeatTicketSettings'

    This will need to be added on the Advanced tab so build the rest of your
    search as desired and then add the clause on the Advanced tab.

METHODS
  Run( RT::Attribute $attr, DateTime $checkday )
    Repeat the ticket if $checkday meets the repeat settings. It also tries
    to repeat more to meet config RepeatTicketCoexistentNumber.

    Return ids of new created tickets.

  Repeat ( RT::Attribute $attr, DateTime $checkday_1, DateTime $checkday_2, ... )
    Repeat the ticket for the check days that meet repeat settings.

    Return ids of new created tickets.

  MaybeRepeatMore ( RT::Attribute $attr )
    Try to repeat more tickets to meet the coexistent ticket number.

    Return ids of new created tickets.

  SetRepeatAttribute ( RT::Ticket $ticket, %args )
    Save %args to the ticket's "RepeatTicketSettings" attribute.

    Return ( RT::Attribute, UPDATE MESSAGE )

AUTHOR
    Best Practical Solutions, LLC <modules@bestpractical.com>

BUGS
    All bugs should be reported via email to

        L<bug-RT-Extension-RepeatTicket@rt.cpan.org|mailto:bug-RT-Extension-RepeatTicket@rt.cpan.org>

    or via the web at

        L<rt.cpan.org|http://rt.cpan.org/Public/Dist/Display.html?Name=RT-Extension-RepeatTicket>.

LICENSE AND COPYRIGHT
    This software is Copyright (c) 2014-2025 by Best Practical Solutions

    This is free software, licensed under:

      The GNU General Public License, Version 2, June 1991

