OpenTTM

Documentation › Reference

The judging schedule

Total Trial Management works out the judging schedule from the entries: how long each class will take at its own rate of dogs per hour, what time it therefore starts, and which arm bands are in it. It writes the result as an HTML file you open in Word.

This replaces the two Perl scripts that used to produce the same schedules.

What it needs

Arm bands must be assigned, because the schedule prints them. Classes must be in ring order — the ring number and ring order on Trial Setup — because that is the order a judge works through them.

Rates come from tlkpDogsPerHour, one row per Class / Level. Obedience runs from 6 to 10 dogs an hour depending on the class; regular rally is 18, the current AKC rate. The table lives in your data file, so your rates follow you between clubs and survive an upgrade.

A class with no row still appears on the schedule — it is given one dog per hour, which makes it conspicuously long rather than missing — and is named afterwards so you can add the row. The old scripts stopped dead on the first such class and produced nothing.

The trial’s own boilerplate

Put a file called judging-schedule.txt in the trial’s folder — the same folder the judge’s packet and the results publisher use. Everything in it is optional.

layout          = paragraph
club            = Forest City Dog Training Club
subtitle        = Obedience and Rally Trials
dates           = March 27 - 29, 2026
lunch           = lunch breaks are 45 minutes at the judges' discretion
start           = 08:00
afternoon       = 12
tofollow        = yes
briefing        = Walkthrough
briefingminutes = 0
briefinglevels  = Beginner Novice
firstclassextra = 10
combineabmax    = 20

[intro]
Thank you for entering Forest City's rally and obedience trials.
Running order will be tall to small for both Rally and Obedience each day.
[end]

[vet]
Veterinarian On Call
Animal Emergency Clinic of Rockford
[end]

layout picks the shape: paragraph is the one with 5 Entries - Graduate Novice on its own line, legacy is the plain table the old scripts produced.

afternoon = 12 prints After noon instead of a clock time once the day has run past noon. This is the AKC rule, not a shortcoming — no time is listed for any class starting after noon, so an afternoon schedule with no clock times is correct. It applies to both disciplines and both ship at 12; afternoon = 0 turns it off for a club not running under those rules.

The A and B classes of a level

The AKC rule:

When there are not more than 20 dogs entered in the A and B classes at the same title level, one start time for both classes will be listed and the judge may combine the judging of these classes. When there are more than 20 dogs entered a separate start time will be listed for each class and classes may not be combined.

combineabmax = 20 is that 20. At or below it the A and B classes of a level print the same start time; above it each prints its own. Rally ships at 20; obedience ships at 0, which means every class keeps a separate time as it always has.

Every class gets a listed time — To follow is not printed at all, because the rule is about sharing a start time, not about omitting one. (tofollow = yes still exists for a club that wants the old label.)

Walkthroughs

No walkthrough line is printed, and that is deliberate. The schedule gives each class a start time and says nothing about when its walkthrough happens, which leaves the judge free to start one early when they are running ahead. The only fixed point is that the class itself must not run before its printed time.

firstclassextra = 10 is the ten minutes the first class of each ring carries, for the walkthrough that happens before any judging has begun and so is not inside the rate. Every later walkthrough already is inside it — regular rally’s 18 dogs an hour is the AKC rate with walkthroughs included — so nothing else is added. Two rings means two first classes and two lots of ten minutes, one per judge.

briefingminutes brings the old behaviour back if a club wants it: set it above zero and each walkthrough group prints a header, costs that many minutes, and a class of 40 or more gets a second walkthrough. It ships at 0.

briefinglevels names the levels that get a walkthrough, and only those classes are grouped — Open A and Utility B keep their own start times even though Open B and Utility A ran earlier. Leaving it empty means every level is grouped, which is what rally wants. An entry matches as a prefix, so Beginner Novice covers both its halves.

An entry may also name alternatives with |, which share one group:

briefinglevels = Beginner Novice, Novice A|Preferred Novice

That is the obedience default, and it exists because Novice A and Preferred Novice are different level names that the rules put under one walkthrough — no prefix covers both.

Obedience walkthroughs

Only Beginner Novice, Novice A and Preferred Novice allow one. For those, the listed start time is the walkthrough’s and judging follows it, so no separate walkthrough line is printed — the minutes are simply part of the class.

How long is scaled by how many dogs share it: 10 minutes at ten dogs or more, 5 minutes below ten, counted across the whole group. That is briefingminutes = 10, briefingminutessmall = 5 and briefingsmallbelow = 10.

Novice A pairs with Preferred Novice, and Beginner Novice A with B. When the same judge has both and fewer than 20 dogs are entered between them (combineabmax = 19), the two classes list the same start time. They must be next to each other in ring order — if another class runs between them they cannot share a time, and that part of the rule does not apply.

Lines starting with # are ignored, and the file may use either Windows or Unix line endings.

Joining it to your Word document

Alongside the schedule the app writes judging-schedule-fields.txt, holding the values that change from trial to trial:

TrialClub=Forest City Dog Training Club
TrialDates=March 27 - 29, 2026
TrialSecretary=Robert Olson
TrialSecretaryEmail=secretary@livetrial.net
TrialSecretaryPhone=(815) 242-5483
TrialEntries=197
TrialDogs=86
TrialJudges=Mrs. Suzanne M. Mayborne, Jeanne L. Thomas
Event1Number=2026024507
Event1Day=Saturday, March 28, 2026
Event1Dogs=79
Event1Entries=104

The full list is TrialName, TrialClub, TrialOrganization, TrialDiscipline, TrialDates, TrialSecretary, TrialSecretaryEmail, TrialSecretaryPhone, TrialEntries, TrialDogs, TrialJudges, TrialRates, TrialEventCount, TrialEventNumbers, and per event EventNNumber, EventNDay, EventNDogs, EventNEntries, EventNJudges.

Not included, because the app does not store them: the trial site’s address, directions, the veterinarian, and the trial chair. Keep those in the [intro], [directions] and [vet] blocks of judging-schedule.txt, or in the Word document.

In your program document, put a field wherever one of these belongs — Insert → Quick Parts → Field → DocProperty, or press Ctrl+F9 and type it:

{ DOCPROPERTY "TrialClub" }

Then add this macro to the document and run it once after each regeneration. It reads the file, sets the properties and refreshes every field:

Sub LoadTrialFields()
    Dim sPath As String, sLine As String, iEq As Long
    Dim iFile As Integer, sName As String, sValue As String

    sPath = InputBox("Path to judging-schedule-fields.txt", "Load trial fields", _
                     ActiveDocument.Path & "\judging-schedule-fields.txt")
    If sPath = "" Then Exit Sub

    iFile = FreeFile
    Open sPath For Input As #iFile
    Do Until EOF(iFile)
        Line Input #iFile, sLine
        sLine = Trim$(sLine)
        If Len(sLine) > 0 And Left$(sLine, 1) <> "#" Then
            iEq = InStr(sLine, "=")
            If iEq > 1 Then
                sName = Trim$(Left$(sLine, iEq - 1))
                sValue = Mid$(sLine, iEq + 1)
                On Error Resume Next
                ActiveDocument.CustomDocumentProperties(sName).Value = sValue
                If Err.Number <> 0 Then
                    Err.Clear
                    ActiveDocument.CustomDocumentProperties.Add _
                        Name:=sName, LinkToContent:=False, _
                        Type:=msoPropertyTypeString, Value:=sValue
                End If
                On Error GoTo 0
            End If
        End If
    Loop
    Close #iFile

    ActiveDocument.Fields.Update
    MsgBox "Trial fields loaded.", vbInformation
End Sub

The macro adds a property that does not exist yet and overwrites one that does, so the same document works for the next trial. Because these are ordinary custom document properties you can also see and edit them under File → Info → Properties → Advanced, which means the document still reads correctly if you never run the macro — a DOCPROPERTY field falls back to whatever the property already holds.

Save the document as .docm if you keep the macro in it, or put the macro in your Normal template and leave the document a plain .docx.

Things worth knowing

The schedule is an estimate and you may edit it. It is written to be adjusted: judges know their own pace, and a class that ran long yesterday will run long again.

Times are worked out per ring, from the top. Each ring starts at the day’s start time and every class follows the one before it, so a change early in a ring moves everything after it.

A class that starts after noon prints After noon rather than a time, if the trial’s file asks for that. Past the middle of the day the arithmetic has accumulated too much error to promise a clock time.