Checklist Module โ€” Build Brief v2 for Zane-SF Corp

Subform-driven, user-extensible redesign. Replaces the v1 brief (hardcoded fields per item). Functional spec + step-by-step sprint with progress saved in this browser.
Progress:
0 / 0
๐Ÿ“ข Spec rewritten 2026-04-30 โ€” read this first.

The previous brief had you build a single huge Add_Checklist_2 form with ~92 hardcoded fields (one per inspection item) and seven Deluge workflows toggling visibility per item. That approach is dead. The new design uses a subform on both the Configuration form and the Checklist form. Items are a thin master record (name, section, wording, image rule) โ€” fully user-extensible without code changes.

Discard everything in the old brief about: 11 sections on the checklist form, hardcoded item fields, the standalone Checklist_Config_Items form, WFs 1โ€“7, and the long item-by-item field lists. Use only this v2 brief from here on.

Who this is for: The junior developer building the Checklist module in Zane-SF Corp. You will reshape two existing forms (Item Master, Configuration), retire one (Config Items), and build one new one (the driver-facing checklist form).
NEVER do these:
Contents
  1. Functional spec โ€” what the module does (v2)
  2. Data model โ€” forms & fields (v2)
  3. Workflow logic โ€” three workflows total
  4. Step-by-step build sprint
  5. Acceptance test (incl. user-extensibility test)
  6. Open questions to flag

1. Functional spec โ€” what the module does (v2)

One-paragraph summary

Admins maintain a small Item Master (each item = name, section, positive wording, negative wording, optional "image required if negative"). Admins build Configurations that select which items apply for a given Frequency ร— Vehicle Type, with per-item Mandatory toggle. A driver opens the checklist form โ†’ it reads the active config โ†’ it prefills a single inspection subform, one row per item from the config โ†’ driver answers Positive/Negative on each row, uploads images where required, signs and submits. Validation, failed-checks emails, and SMS all iterate the subform โ€” no per-item code anywhere.

The cast of forms (v2)

FormUsed byWhen
Checklist_Item_MasterAdmin (and end-users adding their own items)Defining inspection items in the catalogue. 5 fields only.
Checklist_ConfigurationAdmin (per-fleet setup)Per Frequency ร— Vehicle Type. Includes a Section 3 subform picking which items apply + Is Mandatory.
Add_Checklist_2Drivers / yard inspectorsEvery shift. 5 sections, one inspection subform.
Add_Asset (existing)AdminProvides Vehicle Type โ€” MC / LP / MCV / HCV.
Checklist_Config_Itemsโ€”Retired. Replaced by the Section 3 subform on Configuration.
Add_Checklist (legacy)โ€”Deprecated after the new Add_Checklist_2 passes UAT.

MC = Motorcycle · LP = Light Passenger/Commercial · MCV = Medium Commercial · HCV = Heavy Commercial.

Phase 1 โ€” Admin sets up the catalogue

a. Item Master. Each inspection item is one record with just five fields: Item Display Name, Section (fixed list of 7), Positive Outcome Wording, Negative Outcome Wording, Image Required On Negative. Wording is the natural language the driver sees and the email recipient reads โ€” e.g. positive = "no scratches", negative = "scratches". End users can add their own items here with no code change anywhere.

b. Configuration. A configuration binds Frequency (Daily / Weekly / Monthly / Ad Hoc) and optionally Vehicle Type to a curated list of items. Two modes: Frequency + Vehicle Type (the common case) and Frequency Only (Ad Hoc and cross-vehicle setups). Section 3 of the Configuration form is a subform โ€” one row per item the config includes. Each row has a Lookup to Item Master and an "Is Mandatory" checkbox. Presence of a row = the item is included; no separate "Is Included" flag.

c. Reporting. Section 2 of the Configuration form covers who receives reports, when (on submit / daily / weekly / monthly / on unsafe), SMS settings, and toggles for negative answers and missed-checklist alerts.

Phase 2 โ€” Driver fills in a checklist

  1. Driver opens Add_Checklist_2, scans the vehicle's QR code (or types the registration). Asset Type, the four Associations, Previous Odo, and the linked Driver auto-populate and lock.
  2. Started Date-Time auto-fills.
  3. Checklist Type auto-selects: 1st of month โ†’ Monthly · Mondays โ†’ Weekly · otherwise โ†’ Daily. Ad Hoc is never auto-selected, but is directly selectable from the dropdown once Override is ticked.
  4. Override Checklist Reason โ€” when ticked, unlocks the Checklist Type dropdown so the driver can pick Daily / Weekly / Monthly / Ad Hoc.
  5. The form prefills the Inspection Items subform: it queries the active Configuration matching this Vehicle Type + Checklist Type (vehicle-specific wins, Frequency-Only is fallback) and creates one row per item from that config's Section 3 subform. Each row shows the item name, the section, and a question prompt built from the item's positive/negative wording. If no active config matches, the form raises a loud blocking alert and Section 4 stays empty โ€” the driver cannot continue.
  6. Driver works through each subform row, picks Positive or Negative, and uploads an image if the row's item has Image Required On Negative = true and the driver picked Negative.
  7. Declaration โ€” Safe to Operate (Y/N), auto Sign Datetime, Driver Signature.
  8. On submit: validate every row that the config marked Mandatory has an Outcome, and every Negative answer with Image-Required has an image uploaded. Block submit if any are missing โ€” show the specific items.
  9. On successful submit, stamp the Asset with "Checklist Type Completed Last", and trigger emails per the active config's Send Failed Checks Report setting (see table below).

Phase 3 โ€” Reporting & alerting

Trigger optionWhat it triggersScope of negatives included
When Vehicle Is Not Safe To OperateImmediate email at submit time, when at least one Mandatory row was answered Negative OR Safe to Operate = No.Mandatory negatives + Safe-to-Operate=No only.
On SubmitEmail at every submit that contains any Negative answer.Both Mandatory and non-Mandatory negatives.
Daily / Weekly / MonthlyScheduled digest. Out of scope for this sprint.Both Mandatory and non-Mandatory negatives.

Email body uses each item's Negative_Outcome_Wording verbatim โ€” so the recipient reads "Body Panels: scratches" rather than "Body Panels: Negative". Recipients = the User records in the active config's Who_Should_Receive_The_Reports.

2. Data model โ€” forms & fields (v2)

What's already on Zane-SF Corp (per IDE export 2026-04-30): the existing Checklist_Item_Master has the v1 shape (Field_ID, Compatible Vehicle Types, Is Standard, Negative Value, Default Mandatory, Default Include Daily/Weekly/Monthly), and its Section picklist is missing "Fluids". The existing Checklist_Configuration has stale fields (Radio1 with "Choice 1/2/3", Include_Checklist, Frequency_to_Complete) and its Frequency picklist is missing "Ad Hoc". Both forms need cleanup before extension. Checklist_Config_Items exists and will be retired after migration. There is no Add_Checklist_2 on Zane-SF Corp yet โ€” you'll build it fresh.

Form A โ€” Checklist_Item_Master (1 section, 5 fields)

FieldTypeNotes
Item Display NameSingle LineMandatory. The label in the inspection subform.
SectionDrop-downOperational / PPE / Interior / Exterior / Electrical / Drivetrain / Fluids (add Fluids โ€” the existing dropdown is missing it)
Positive Outcome WordingSingle LineMandatory. e.g. "no scratches", "working", "tyre present and inflated".
Negative Outcome WordingSingle LineMandatory. e.g. "scratches", "not working", "missing or flat". Used in failed-checks emails verbatim.
Image Required On NegativeDecision BoxIf true, driver must upload an image when picking Negative for this item.
Fields to REMOVE from Checklist_Item_Master (they're moving away or being deleted): Field_ID, Compatible_Vehicle_Types, Compatible_Frequencies, Is_Standard, Negative_Value (replaced by Negative Outcome Wording), Default_Mandatory, Default_Include_Daily, Default_Include_Weekly, Default_Include_Monthly. The compatibility metadata now lives on Configuration; defaults are gone (admin picks per config explicitly).

Form B โ€” Checklist_Configuration (3 sections)

Section 1 โ€” Configuration Setup

FieldTypeNotes
Config NameSingle LineMandatory, unique. e.g. "Default โ€” MC Daily".
Config ModeDrop-down"FREQUENCY + VEHICLE TYPE" / "FREQUENCY ONLY"
FrequencyDrop-downDaily / Weekly / Monthly / Ad Hoc โ€” add "Ad Hoc" to the existing Frequency_to_Complete, or replace it with a new Frequency field having all 4 values.
Vehicle TypeDrop-downMC / LP / MCV / HCV / N/A. Required only when Config Mode = Frequency + Vehicle Type.
Is ActiveDecision BoxOnly active configs are matched at runtime.
Is DefaultDecision BoxTiebreaker if multiple configs match.

Section 2 โ€” Reporting & Notifications

FieldTypeNotes
Who Should Receive The ReportsLookup โ†’ Add_User (multi)Already exists.
Send Failed Checks ReportMulti-selectOn Submit / Daily / Weekly / Monthly / When Vehicle Is Not Safe To Operate. Already exists.
Report Negative AnswersYes/No picklistAlready exists.
Report Checklist Not CompletedYes/No picklistAlready exists.
Send SMSYes/No picklistAlready exists.
Frequency Of SMSDrop-downDaily / Weekly / Monthly. Already exists.

Section 3 โ€” Items (NEW โ€” replaces the standalone Checklist_Config_Items form)

FieldTypeNotes
ItemsSubformRepeating section. Each row = one included item. Add rows by clicking "+ Add row" while editing the config.

Subform row schema:

Subform fieldTypeNotes
ItemLookup โ†’ Checklist_Item_MasterMandatory. Pick the item.
Is MandatoryDecision BoxWhether this item is required for submission on this config.
The presence of a subform row = the item is included for this config. Don't add an "Is Included" flag โ€” it's redundant and creates a footgun (rows that exist but aren't used). To remove an item from a config, delete the row.
Fields to REMOVE from Checklist_Configuration: Radio1 (the "Choice 1/2/3" placeholder) and Include_Checklist. These are stale and confusing โ€” delete them before adding the v2 fields.

Form C โ€” Add_Checklist_2 (5 sections, ~14 fields)

Driver-facing form. Build from scratch โ€” there's no v1 of this form on Zane-SF Corp.

Section 1 โ€” Checklist Details (8 fields)
FieldTypeNotes
Asset (Scan QR Code)Single LineDriver scans or types the registration.
Asset TypeSingle Line โ€” auto, lockedPulled from Asset on QR scan.
Asset Associated Checklist TypeLookup โ†’ Checklist_ConfigurationThe active config selected by WF_Form_Load.
Started Date-TimeDate-Time โ€” default = now
Checklist TypeDrop-downDaily / Weekly / Monthly / Ad Hoc.
Override Checklist ReasonDecision BoxUnlocks Checklist Type when ticked.
Request QR CodeDecision BoxDriver flag if QR sticker is missing/damaged.
Active Config IDSingle Line โ€” hiddenBookkeeping; populated by WF_Form_Load.
Section 2 โ€” Asset Association (7 fields)
Association 1Lookup โ†’ Add_Association_1 โ€” auto, locked
Association 2Lookup โ†’ Add_Association_11 (or Add_Association_2 if present) โ€” auto, locked
Association 3Lookup โ†’ Add_Association_3 โ€” auto, locked
Association 4Lookup โ†’ Add_Association_12 (or Add_Association_4 if present) โ€” auto, locked
Add DriverLookup โ†’ Add_Driver โ€” auto, locked
Previous OdoNumber โ€” auto, locked
Current OdoNumber โ€” driver enters
Section 3 โ€” Notification & Admin (1 field)

Request Change to be Made to Association โ€” Decision Box.

Section 4 โ€” Inspection Items (1 subform โ€” the heart of v2)

Subform name: Inspection_Items. Prefilled at form load (see WF_Form_Load). Subform row schema:

Subform fieldTypeNotes
ItemLookup โ†’ Checklist_Item_Master โ€” read-only after prefillSet by WF_Form_Load.
SectionSingle Line โ€” read-only, auto-filled from Item.Section at prefillFor visual grouping.
Question PromptSingle Line โ€” read-only, computed at prefillFormat: '"' + Item.Positive_Outcome_Wording + '" (Positive) / "' + Item.Negative_Outcome_Wording + '" (Negative)'
OutcomeRadio โ€” Positive / NegativeDriver answers here.
ImageFile Upload (image)Shown only if Outcome == "Negative" AND Item.Image_Required_On_Negative == true.
NotesSingle Line โ€” optionalFree-text comment.
Is MandatoryDecision Box โ€” hiddenCopied from the config row at prefill. Drives validation in WF_Submit_Validate.

Visual grouping: rows are inserted in section order at prefill (Operational, PPE, Interior, Exterior, Electrical, Drivetrain, Fluids), and the Section column makes the grouping visible. Optional polish: insert separator rows between sections.

Section 5 โ€” Declaration (3 fields)
Safe To OperateRadio โ€” "Yes, Safe to Operate" / "No, Not Safe to Operate"
Sign DatetimeDate-Time โ€” auto-filled at submit
Driver SignatureSignature

3. Workflow logic โ€” three workflows total

v1 had seven Deluge workflows. v2 collapses to three because the subform pattern eliminates the per-field show/hide bookkeeping and the hardcoded validator chain.

#TriggerWhat it does
WF_Form_LoadOn Load โ€” Add_Checklist_2 ยท also re-run on user input of Asset (Scan QR Code), Checklist Type, and Override Checklist Reason 1. Set Started_Date_Time = zoho.currenttime.
2. Auto-pick Checklist Type (1st of month โ†’ Monthly ยท Monday โ†’ Weekly ยท else โ†’ Daily). Lock the dropdown unless Override is ticked.
3. Parse Asset (Scan QR Code) โ€” %-delimited (registration is the 7th part) or numeric Asset ID. Lookup the Asset, populate Asset Type, Association 1โ€“4, Previous Odo, Add Driver. Lock those fields.
4. Find the active Checklist_Configuration matching Asset.Vehicle_Type + Checklist_Type. Vehicle-specific wins; Frequency-Only is fallback; Is_Default breaks ties. Write its ID to Active_Config_ID and to Asset_Associated_Checklist_Type.
5. If zero matches: alert "No active checklist configuration for " + Asset_Type + " " + Checklist_Type + " โ€” contact admin"; clear the Inspection_Items subform; the driver cannot continue.
6. Otherwise prefill the Inspection_Items subform: clear it, then iterate the matched config's Items subform (sorted by Item.Section in the canonical order), and for each row append one row to Inspection_Items with Item = row.Item, Section = row.Item.Section, Question_Prompt = the formatted positive/negative wording, Is_Mandatory = row.Is_Mandatory, Outcome = "".
WF_Submit_ValidateOn Validate โ€” submit Iterate the Inspection_Items subform rows.
1. Missing Mandatory: if any row has Is_Mandatory == true AND Outcome == "", collect the item names.
2. Missing Image: if any row has Outcome == "Negative" AND row.Item.Image_Required_On_Negative == true AND no image uploaded, collect.
3. If either list is non-empty, alert "Please complete: " + missingList; cancel submit;
No hardcoded field IDs anywhere. Adding a new item to the catalogue requires zero code change.
WF_Submit_NotifyOn Successful Submit 1. Stamp the linked Asset: Checklist_Type_Completed_Last = Checklist_Type, Checklist_Last_Completed = today. Set Sign_Datetime = zoho.currenttime.
2. Read Active_Config.Send_Failed_Checks_Report (multi-select).
3. If "On Submit" is selected: iterate Inspection_Items rows where Outcome == "Negative" (Mandatory and non-Mandatory). Build email body using each row.Item.Negative_Outcome_Wording. Append "Safe to Operate: No" line if applicable. sendmail to recipients.
4. Else if "When Vehicle Is Not Safe To Operate" is selected: iterate Inspection_Items rows where Outcome == "Negative" AND Is_Mandatory == true. Append the Safe-to-Operate=No line if applicable. If list non-empty, sendmail.
5. If both options are selected, "On Submit" wins (broader superset, no double-send).
6. Daily / Weekly / Monthly options โ†’ handled by separate scheduled workflows. Out of scope this sprint.
Deluge gotchas to avoid:

4. Step-by-step build sprint

Tick each task as you finish it. Browser remembers your progress. Hit Reset (top right) only if you want to start over.

Working environment: always work in the App Builder URL: creator.zoho.com/appbuilder/<owner>/zane-sf-corp/edit. Never on the live creatorapp.zoho.com URL โ€” changes there don't work.

Step 0 โ€” Setup & audit (15 min)

Confirm access to Zane-SF Corp App Builder UI
Open creator.zoho.com/appbuilder/<owner>/zane-sf-corp/edit and confirm you can see Checklist_Item_Master, Checklist_Configuration, Checklist_Config_Items, and the legacy Add_Checklist.
Snapshot existing data TEST
For each of Checklist_Item_Master, Checklist_Configuration, Checklist_Config_Items: open the All-records report โ†’ Export to CSV. Keep these as a recovery checkpoint before reshaping fields.
Read the v2 spec end-to-end UI
Sections 1โ€“3 of this brief. If anything is ambiguous, ask Zane before building โ€” don't guess from the v1 brief.

Step 1 โ€” Reshape Checklist_Item_Master (45 min)

Add "Fluids" to the Section dropdown UI
Open the Section field's properties. Append Fluids to the values list so it reads: Operational / PPE / Interior / Exterior / Electrical / Drivetrain / Fluids.
Add the 3 new fields UI
Positive_Outcome_Wording (Single Line, mandatory), Negative_Outcome_Wording (Single Line, mandatory), Image_Required_On_Negative (Decision Box, default false).
Backfill positive/negative wording for existing item records DELUGE
Write a one-shot Schedule (run-once) Deluge:
for each itm in Checklist_Item_Master[]
{
  itm.Positive_Outcome_Wording = "OK";
  itm.Negative_Outcome_Wording = ifnull(itm.Negative_Value, "Failed");
  itm.Image_Required_On_Negative = false;
}
Then go through the records by hand and edit any where the generic wording isn't appropriate (e.g. body-panel items โ†’ "no scratches" / "scratches").
Remove the 9 obsolete fields CLEANUP
Delete in this order (Zoho will block deletion if a workflow references the field โ€” these aren't referenced by any v2 workflow): Field_ID, Compatible_Vehicle_Types, Compatible_Frequencies (if present), Is_Standard, Negative_Value, Default_Mandatory, Default_Include_Daily, Default_Include_Weekly, Default_Include_Monthly.
2-column layout LAYOUT
Col 1: Item Display Name ยท Positive Outcome Wording ยท Image Required On Negative. Col 2: Section ยท Negative Outcome Wording.
Save & preview โ€” add a brand-new test item TEST
"Spare Tyre Condition" ยท Section: Exterior ยท Positive: "tyre present and inflated" ยท Negative: "missing or flat" ยท Image Required On Negative: true.

Step 2 โ€” Reshape Checklist_Configuration (1 hr)

Delete the 2 stale fields CLEANUP
Remove Radio1 (the "Choice 1/2/3" placeholder) and Include_Checklist from the Configuration form. They're confusing and unused.
Add "Ad Hoc" to Frequency UI
Open Frequency_to_Complete's properties โ†’ values list โ†’ append Ad Hoc. (Or rename the field to Frequency if you want to drop the legacy name; either is fine.)
Add the 2 missing Section 1 fields UI
Config_Name (Single Line, mandatory, unique) and Is_Default (Decision Box). The other Section 1 fields (Config_Mode, Vehicle_Type, Is_Active) already exist.
Add Section 3 โ€” "Items" UI
Add a new Section header below the Reporting & Notifications section. Display name: "Items".
Add the Items subform inside Section 3 UI
Drag a Subform field. Display name "Items", link name Items. Subform row schema: Item (Lookup โ†’ Checklist_Item_Master, mandatory), Is_Mandatory (Decision Box).
Migrate Checklist_Config_Items records into the subform DELUGE
One-shot Deluge schedule:
for each cfg in Checklist_Configuration[]
{
  cfg.Items.clear();
  links = Checklist_Config_Items[Checklist_Configuration == cfg.ID && Is_Included == true];
  for each lk in links
  {
    row = Items();
    row.Item = lk.Checklist_Item_Master;
    row.Is_Mandatory = lk.Is_Mandatory;
    cfg.Items.add(row);
  }
}
Run once. Verify by opening 2โ€“3 configs in the UI: their Items subform should now have rows matching the old child records.
Delete the Checklist_Config_Items form CLEANUP
Only after Step 2-6 has been verified by Zane. Once deleted, its records are gone โ€” that's why the subform has to be working first.
2-column layout LAYOUT
Section 1 โ€” Col1: Config Name ยท Frequency ยท Is Active. Col2: Config Mode ยท Vehicle Type ยท Is Default. Section 2 โ€” Col1: Report Checklist Not Completed ยท Send Failed Checks Report ยท Send SMS. Col2: Who Should Receive The Reports ยท Report Negative Answers ยท Frequency Of SMS. Section 3 โ€” full-width subform.
Save & sanity check โ€” open a config TEST
Edit one of the migrated configs. Confirm Section 1 fields look right, Section 2 reporting fields are intact, Section 3 Items subform shows rows. Try adding a new row โ†’ confirm the lookup pulls Item Master records.

Step 3 โ€” Build Add_Checklist_2 (2โ€“3 hrs)

Build sections in order top-to-bottom. Add Section 1 โ†’ all 8 of its fields โ†’ Section 2 โ†’ its 7 fields โ†’ Section 3 โ†’ its 1 field โ†’ Section 4 โ†’ the subform โ†’ Section 5 โ†’ its 3 fields. Don't skip.
Create new form Add_Checklist_2 UI
Display name "Add Checklist 2" โ†’ confirm link name auto-derives to Add_Checklist_2.
Section 1 โ€” Checklist Details + 8 fields UI
Per the spec table above. Asset (Scan QR Code), Asset Type (locked), Asset Associated Checklist Type (lookup), Started Date-Time, Checklist Type (Daily/Weekly/Monthly/Ad Hoc), Override Checklist Reason, Request QR Code, Active Config ID (hidden).
Section 2 โ€” Asset Association + 7 fields UI
5 lookups (Association 1โ€“4 + Add Driver) + Previous Odo (locked) + Current Odo.
Section 3 โ€” Notification & Admin + 1 field UI
Just Request_Change_to_be_Made_to_Association (Decision Box).
Section 4 โ€” Inspection Items subform UI
Add a Section header "Inspection Items". Drag a Subform field โ€” display name "Inspection Items", link name Inspection_Items. Subform row schema per the spec table: Item (Lookup โ†’ Checklist_Item_Master, set read-only post-prefill), Section (Single Line, read-only), Question_Prompt (Single Line, read-only), Outcome (Radio: Positive / Negative), Image (File Upload), Notes (Single Line, optional), Is_Mandatory (Decision Box, hidden).
Configure conditional Image visibility within the subform row UI
On the subform's Image field โ†’ Field Properties โ†’ Dynamic Field Permissions / On User Input. Show only when Outcome == "Negative" AND Item.Image_Required_On_Negative == true. Test it by adding a row inline and toggling Outcome.
Section 5 โ€” Declaration + 3 fields UI
Safe To Operate (Radio: "Yes, Safe to Operate" / "No, Not Safe to Operate"), Sign Datetime, Driver Signature.
Apply 2-column layout per section LAYOUT
Notification & Admin, the Inspection Items subform, and Declaration are full-width. Sections 1 and 2 use 2 columns.
Audit field link names TEST
Open every field โ†’ confirm the link name reads as expected. Anything ending in 1 is a duplicate-display-name footgun โ€” fix the display name and recreate.

Step 4 โ€” Build the 3 workflows (2 hrs)

For each workflow: open Add_Checklist_2 โ†’ Workflow โ†’ Add new โ†’ pick the trigger โ†’ write the Deluge per the table in section 3 of this brief. Reference Add_Checklist_2 in ai-sf-corp if you get stuck on syntax.
WF_Form_Load DELUGE
Trigger: On Load ยท On Add, plus a re-run trigger on user input of Asset (Scan QR Code), Checklist Type, and Override Checklist Reason. Logic: per the WF_Form_Load row in section 3. The subform-prefill section is the critical part โ€” make sure you sort by canonical section order before iterating, so rows appear Operational โ†’ PPE โ†’ Interior โ†’ Exterior โ†’ Electrical โ†’ Drivetrain โ†’ Fluids.
WF_Submit_Validate DELUGE
Trigger: On Validate. Iterate input.Inspection_Items. Build a missingMandatory list and a missingImage list per the rules in section 3. cancel submit with the alert if either is non-empty.
WF_Submit_Notify DELUGE
Trigger: On Successful Submit. Stamp the Asset's Checklist_Type_Completed_Last and Checklist_Last_Completed; set Sign_Datetime. Then read Active_Config.Send_Failed_Checks_Report. If "On Submit" is selected โ†’ iterate all Negative rows; else if "When Vehicle Is Not Safe To Operate" is selected โ†’ iterate Negative + Mandatory rows. Build email body using each row's Item.Negative_Outcome_Wording. Append "Safe to Operate: No" line if applicable. sendmail to Who_Should_Receive_The_Reports.

Step 5 โ€” Verify the v1โ†’v2 data migration is clean (30 min)

Spot-check 5 random Configurations TEST
For each: open the config, confirm Section 1 fields are sensible (Frequency includes Ad Hoc only on the Ad Hoc config; vehicle/frequency match the Config Name), Section 2 reporting settings unchanged, Section 3 Items subform has the right rows.
Spot-check 10 random Item Master records TEST
Confirm the wording fields are populated and read sensibly to a driver. Edit any where the generic backfill is off.
Confirm Checklist_Config_Items is gone CLEANUP
Form deleted (Step 2-7), no dangling references.

5. Acceptance test

Done means: a fresh test asset can complete a checklist end-to-end with no errors, AND a brand-new user-created item flows through with no code change. Run this top-to-bottom โ€” if anything misbehaves, screenshot and ask before "fixing" it.

Create a test Asset (Vehicle Type = MC) with a registration TEST
Open Add_Checklist_2 in preview mode TEST
Confirm Started Date-Time auto-fills, Checklist Type auto-selects (Daily on a normal day), Checklist Type dropdown is locked.
Type the test asset's registration into Asset (Scan QR Code) TEST
Confirm Asset Type, Associations, Previous Odo, Add Driver auto-populate and lock. Confirm the Inspection Items subform prefills with rows from the matching MC Daily config, sorted by section.
Confirm question prompts read correctly per row TEST
Each row's Question Prompt should display both wording strings, e.g. "working" (Positive) / "not working" (Negative). Pick a couple of rows and check the wording matches the Item Master record.
Image-required visibility test TEST
Pick a row whose item has Image Required On Negative = true. Set Outcome = Negative โ†’ confirm the Image upload field appears in that row. Switch to Positive โ†’ confirm it disappears.
Tick Override โ†’ confirm Checklist Type unlocks TEST
Try to submit with one Mandatory row blank TEST
Submit must be blocked, alert lists the missing item by name.
Try to submit with a Mandatory Negative row but no image TEST
If the item has Image Required On Negative = true โ†’ submit must be blocked with a missing-image alert.
Fill all Mandatory items (incl. images), set Safe to Operate = No, submit TEST
Record saves, Sign Datetime stamps, asset's Checklist_Type_Completed_Last = "Daily", asset's Checklist_Last_Completed = today, and (with "When Vehicle Is Not Safe To Operate" selected) the safety-alert email arrives โ€” body uses the items' Negative Outcome Wording verbatim.
Submit a clean Safe-to-Operate=Yes checklist TEST
No "Not Safe To Operate" email this time. Asset stamps update.
"On Submit" trigger โ€” non-mandatory negative test TEST
On the active config, tick "On Submit" in Send Failed Checks Report. Submit a checklist where Safe to Operate = Yes and all Mandatory rows pass, but at least one non-mandatory row is set to Negative. An "On Submit" digest email must arrive listing that non-mandatory failure with its Negative Outcome Wording.
"No active config" loud-error test TEST
Untick Is Active on every config that would match this Vehicle Type + Checklist Type. Reload Add_Checklist_2, scan the asset, pick the same Checklist Type. The form must show the blocking alert and the Inspection Items subform must be empty. Re-tick Is Active afterwards.
Ad Hoc directly selectable test TEST
Tick Override โ†’ confirm Checklist Type dropdown unlocks and lists "Ad Hoc". Pick Ad Hoc โ†’ confirm the Frequency-Only Ad Hoc config is matched and its items prefill the subform.
โญ User-extensibility test (the headline of v2) TEST
As a non-developer admin: (a) open Item Master and add a new record "Spare Tyre Condition" โ€” Section: Exterior, Positive: "tyre present and inflated", Negative: "missing or flat", Image Required On Negative: true. (b) Open the active "MC Daily" config, add a row to its Items subform pointing to the new item, mark Is Mandatory = true. (c) Open Add_Checklist_2 against the test MC asset โ†’ confirm "Spare Tyre Condition" appears in the Inspection Items subform with the correct question prompt, in the Exterior block. (d) Pick Negative without an image โ†’ submit blocks. (e) Upload image, submit โ†’ record saves, failed-checks email body says "Spare Tyre Condition: missing or flat" verbatim. Zero code changed at any point in this test. If this test fails, v2 has failed its core promise.
Item-removal test TEST
Remove the "Spare Tyre Condition" row from the MC Daily config's Items subform. Reload Add_Checklist_2 โ†’ confirm the row no longer appears. (Don't delete the Item Master record โ€” that's a separate harder operation.)

6. Open questions to flag

Don't try to "fix" these โ€” they're known design questions Zane is still resolving. If your build hits any, ask before deciding:

  1. Tiebreaker order: vehicle-specific config wins, Frequency-Only is fallback. Confirm.
  2. Submitted checklist = read-only. No edit/reopen flow.
  3. Override-untick re-snaps to today's auto-select rather than re-locking what was selected.
  4. QR code parsing: real-world stickers โ€” %-delimited or numeric Asset ID?
  5. Driver lookup picks "first linked driver" โ€” fine for single-driver vehicles, ambiguous for rotation. Should the driver self-select?
  6. Subform row count limits. Zoho Creator subforms support hundreds of rows in practice, but a 200-row inspection subform on a phone is bad UX. If a config exceeds ~80 items, consider splitting.
  7. Image storage on the subform row. Zoho stores subform images on the parent record. Bulk emails attaching all images may exceed the email size limit โ€” confirm send strategy if there are 5+ image-required negatives.

Resolved decisions (do not re-ask)