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.
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).
- Don't touch the live (production) URL โ work only in App Builder (dev):
creator.zoho.com/appbuilder/<owner>/zane-sf-corp/edit. - Don't use the form-builder's "reorder" feature on existing forms with data. It can permanently corrupt sections (we lost
Add_Assetin March doing this). - Don't rename a field after creating it once data has been entered against it โ the link name is what every workflow refers to. If you must, delete + recreate.
- Don't reuse the same display name across two fields on the same form. Zoho will silently append
1to the link name and break later workflow references. - Don't migrate
Checklist_Config_Itemsrecords by hand โ write a one-shot Deluge script (Step 4) so the link references resolve correctly.
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)
| Form | Used by | When |
|---|---|---|
Checklist_Item_Master | Admin (and end-users adding their own items) | Defining inspection items in the catalogue. 5 fields only. |
Checklist_Configuration | Admin (per-fleet setup) | Per Frequency ร Vehicle Type. Includes a Section 3 subform picking which items apply + Is Mandatory. |
Add_Checklist_2 | Drivers / yard inspectors | Every shift. 5 sections, one inspection subform. |
Add_Asset (existing) | Admin | Provides Vehicle Type โ MC / LP / MCV / HCV. |
Checklist_Config_Items | โ | Retired. Replaced by the Section 3 subform on Configuration. |
Add_Checklist | โ | 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
- 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. - Started Date-Time auto-fills.
- 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.
- Override Checklist Reason โ when ticked, unlocks the Checklist Type dropdown so the driver can pick Daily / Weekly / Monthly / Ad Hoc.
- 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.
- 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.
- Declaration โ Safe to Operate (Y/N), auto Sign Datetime, Driver Signature.
- 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.
- On successful submit, stamp the Asset with "Checklist Type Completed Last", and trigger emails per the active config's
Send Failed Checks Reportsetting (see table below).
Phase 3 โ Reporting & alerting
| Trigger option | What it triggers | Scope of negatives included |
|---|---|---|
| When Vehicle Is Not Safe To Operate | Immediate 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 Submit | Email at every submit that contains any Negative answer. | Both Mandatory and non-Mandatory negatives. |
| Daily / Weekly / Monthly | Scheduled 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)
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)
| Field | Type | Notes |
|---|---|---|
| Item Display Name | Single Line | Mandatory. The label in the inspection subform. |
| Section | Drop-down | Operational / PPE / Interior / Exterior / Electrical / Drivetrain / Fluids (add Fluids โ the existing dropdown is missing it) |
| Positive Outcome Wording | Single Line | Mandatory. e.g. "no scratches", "working", "tyre present and inflated". |
| Negative Outcome Wording | Single Line | Mandatory. e.g. "scratches", "not working", "missing or flat". Used in failed-checks emails verbatim. |
| Image Required On Negative | Decision Box | If true, driver must upload an image when picking Negative for this item. |
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
| Field | Type | Notes |
|---|---|---|
| Config Name | Single Line | Mandatory, unique. e.g. "Default โ MC Daily". |
| Config Mode | Drop-down | "FREQUENCY + VEHICLE TYPE" / "FREQUENCY ONLY" |
| Frequency | Drop-down | Daily / 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 Type | Drop-down | MC / LP / MCV / HCV / N/A. Required only when Config Mode = Frequency + Vehicle Type. |
| Is Active | Decision Box | Only active configs are matched at runtime. |
| Is Default | Decision Box | Tiebreaker if multiple configs match. |
Section 2 โ Reporting & Notifications
| Field | Type | Notes |
|---|---|---|
| Who Should Receive The Reports | Lookup โ Add_User (multi) | Already exists. |
| Send Failed Checks Report | Multi-select | On Submit / Daily / Weekly / Monthly / When Vehicle Is Not Safe To Operate. Already exists. |
| Report Negative Answers | Yes/No picklist | Already exists. |
| Report Checklist Not Completed | Yes/No picklist | Already exists. |
| Send SMS | Yes/No picklist | Already exists. |
| Frequency Of SMS | Drop-down | Daily / Weekly / Monthly. Already exists. |
Section 3 โ Items (NEW โ replaces the standalone Checklist_Config_Items form)
| Field | Type | Notes |
|---|---|---|
| Items | Subform | Repeating section. Each row = one included item. Add rows by clicking "+ Add row" while editing the config. |
Subform row schema:
| Subform field | Type | Notes |
|---|---|---|
| Item | Lookup โ Checklist_Item_Master | Mandatory. Pick the item. |
| Is Mandatory | Decision Box | Whether this item is required for submission on this config. |
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)
| Field | Type | Notes |
|---|---|---|
| Asset (Scan QR Code) | Single Line | Driver scans or types the registration. |
| Asset Type | Single Line โ auto, locked | Pulled from Asset on QR scan. |
| Asset Associated Checklist Type | Lookup โ Checklist_Configuration | The active config selected by WF_Form_Load. |
| Started Date-Time | Date-Time โ default = now | |
| Checklist Type | Drop-down | Daily / Weekly / Monthly / Ad Hoc. |
| Override Checklist Reason | Decision Box | Unlocks Checklist Type when ticked. |
| Request QR Code | Decision Box | Driver flag if QR sticker is missing/damaged. |
| Active Config ID | Single Line โ hidden | Bookkeeping; populated by WF_Form_Load. |
Section 2 โ Asset Association (7 fields)
| Association 1 | Lookup โ Add_Association_1 โ auto, locked |
| Association 2 | Lookup โ Add_Association_11 (or Add_Association_2 if present) โ auto, locked |
| Association 3 | Lookup โ Add_Association_3 โ auto, locked |
| Association 4 | Lookup โ Add_Association_12 (or Add_Association_4 if present) โ auto, locked |
| Add Driver | Lookup โ Add_Driver โ auto, locked |
| Previous Odo | Number โ auto, locked |
| Current Odo | Number โ 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 field | Type | Notes |
|---|---|---|
| Item | Lookup โ Checklist_Item_Master โ read-only after prefill | Set by WF_Form_Load. |
| Section | Single Line โ read-only, auto-filled from Item.Section at prefill | For visual grouping. |
| Question Prompt | Single Line โ read-only, computed at prefill | Format: '"' + Item.Positive_Outcome_Wording + '" (Positive) / "' + Item.Negative_Outcome_Wording + '" (Negative)' |
| Outcome | Radio โ Positive / Negative | Driver answers here. |
| Image | File Upload (image) | Shown only if Outcome == "Negative" AND Item.Image_Required_On_Negative == true. |
| Notes | Single Line โ optional | Free-text comment. |
| Is Mandatory | Decision Box โ hidden | Copied 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 Operate | Radio โ "Yes, Safe to Operate" / "No, Not Safe to Operate" |
| Sign Datetime | Date-Time โ auto-filled at submit |
| Driver Signature | Signature |
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.
| # | Trigger | What it does |
|---|---|---|
| WF_Form_Load | On 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_Validate | On 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_Notify | On 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. |
- Lookup field values are numbers (record IDs). Compare with
!= 0or!isNull(field), never!= "". - Subform iteration:
for each row in input.Inspection_Itemson form workflows;for each row in record.Itemswhen reading another form's subform via lookup. - To clear a subform:
input.Inspection_Items.clear(). To append a row:row = Inspection_Items(); row.Item = ...; input.Inspection_Items.add(row). - For "show/hide" of regular fields use
show/hide. For "lock/unlock" usedisable/enable. The conditional Image field within the subform is shown via Zoho Creator's per-row dynamic-field rule: configure it on the subform field itself (Field Properties โ Dynamic Field Permissions / On User Input rule) โ not via Deluge.
4. Step-by-step build sprint
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)
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.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.Step 1 โ Reshape Checklist_Item_Master (45 min)
Fluids to the values list so it reads: Operational / PPE / Interior / Exterior / Electrical / Drivetrain / Fluids.Positive_Outcome_Wording (Single Line, mandatory), Negative_Outcome_Wording (Single Line, mandatory), Image_Required_On_Negative (Decision Box, default false).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").Field_ID, Compatible_Vehicle_Types, Compatible_Frequencies (if present), Is_Standard, Negative_Value, Default_Mandatory, Default_Include_Daily, Default_Include_Weekly, Default_Include_Monthly.Step 2 โ Reshape Checklist_Configuration (1 hr)
Radio1 (the "Choice 1/2/3" placeholder) and Include_Checklist from the Configuration form. They're confusing and unused.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.)Config_Name (Single Line, mandatory, unique) and Is_Default (Decision Box). The other Section 1 fields (Config_Mode, Vehicle_Type, Is_Active) already exist.Items subform inside Section 3 UIItems. Subform row schema: Item (Lookup โ Checklist_Item_Master, mandatory), Is_Mandatory (Decision Box).Checklist_Config_Items records into the subform DELUGEfor 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.Checklist_Config_Items form CLEANUPStep 3 โ Build Add_Checklist_2 (2โ3 hrs)
Add_Checklist_2 UIAdd_Checklist_2.Request_Change_to_be_Made_to_Association (Decision Box).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).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.1 is a duplicate-display-name footgun โ fix the display name and recreate.Step 4 โ Build the 3 workflows (2 hrs)
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.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.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)
Checklist_Config_Items is gone CLEANUP5. 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.
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:
- Tiebreaker order: vehicle-specific config wins, Frequency-Only is fallback. Confirm.
- Submitted checklist = read-only. No edit/reopen flow.
- Override-untick re-snaps to today's auto-select rather than re-locking what was selected.
- QR code parsing: real-world stickers โ
%-delimited or numeric Asset ID? - Driver lookup picks "first linked driver" โ fine for single-driver vehicles, ambiguous for rotation. Should the driver self-select?
- 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.
- 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)
- Sections โ fixed list of 7 (Operational / PPE / Interior / Exterior / Electrical / Drivetrain / Fluids). No section master form. Resolved 2026-04-30.
- Subform radio constraint โ radios in a subform share one label set across all rows, so the radio uses fixed "Positive / Negative" values. Per-item wording surfaces as the row's read-only Question Prompt and is used in failed-checks emails. Resolved 2026-04-30.
- Items mechanism โ single subform on the Configuration form (Section 3) replaces the old
Checklist_Config_Itemsstandalone form. Subform row presence = item is included; no "Is Included" flag. Resolved 2026-04-30. - Driver-form items mechanism โ single Inspection Items subform on Add_Checklist_2 (Section 4), prefilled by Deluge from the active config's Items subform at form load. Replaces the v1 approach of 92 hardcoded fields with show/hide. Resolved 2026-04-30.
- Workflow count โ three workflows total (Form_Load, Submit_Validate, Submit_Notify), down from seven. Resolved 2026-04-30.
- Ad Hoc โ directly selectable from the Checklist Type dropdown once Override is ticked. Resolved 2026-04-29.
- No active config โ form raises a blocking error and prevents the driver from continuing. Resolved 2026-04-29.
- Negative-answer alert thresholds โ "When Vehicle Is Not Safe To Operate" = immediate, mandatory negatives + Safe-to-Operate=No only. "On Submit" = include both mandatory and non-mandatory negatives; if both are selected, On Submit wins. Resolved 2026-04-29.