Skip to main content

Quoter & Assessor Tracker Dashboard

Source: Quoter_and_Assessor_Tracker_Dashboard.get_details (custom function, called once at page render) Page URL: https://creatorapp.zoho.com.au/clientportal/test-claims-management-portal/#Page:Quoter_and_Assessor_Tracker_Dashboard

Page input params: month_value, year_value (string) — fed in by the Quoter_and_Assessor_Tracker_Dashboard_Filter form and passed straight into get_details(input.month_value, input.year_value).

Quoter & Assessor Tracker Dashboard — full view


Page Load Logic

  • If month_value or year_value is blank, date_value defaults to zoho.currentdate; otherwise it's built from ("01-" + month_value + "-" + year_value).toDate().
  • end_value = date_value.eomonth(0) — every count, sum, and report link on the page is filtered to the [date_value, end_value] month window.
  • One function call computes two parallel data sets: a Quoters view (grouped by Quoter1) and an Assessors view (grouped by Assessor). Both share the same claim-type allow-list (below) and the same status logic (below).
  • Assigned/Completed/Pending/Cancelled are independent cohorts, not a status partition — each is filtered on whichever date field matches that event (see the table in How the Dashboard Filters Work), not all on the same "assigned this month" date. This is a deliberate design choice; see Why the four numbers don't sum for what that means when reading the page.

Month/Year Filter Form

Quoter_and_Assessor_Tracker_Dashboard_Filter — the Month/Year dropdown pair shown at the top of the page (see screenshot above), feeding month_value/year_value into get_details().


Role Toggle (Quoters / Assessors)

A single checkbox (.dt_role-switch-input) styled as a two-pill segmented control ("Quoters" / "Assessors"). Both full views — KPI tiles, chart, and ledger table — are rendered server-side in the same page load; the checkbox only toggles which one is visible, via CSS:

.dt_view-assessors { display: none; }
.dt_shell:has(.dt_role-switch-input:checked) .dt_view-quoters { display: none; }
.dt_shell:has(.dt_role-switch-input:checked) .dt_view-assessors { display: flex; }

No re-fetch happens when switching roles — it's a pure client-side CSS swap.


Claim Type Allow-list

Both views are restricted to Claim_Form.Claim_Type1 being one of:

  • Repair & Rental
  • Repair Only (Free Rental)
  • Repair Only (IITR Crash Collab)
  • Repair Only
  • Towing + Repair + Rental
  • Towing + Repair + Free Rental
  • Towing + Repair
  • Towing + Storage + Rental
  • Total Loss – Rental Only
  • Total Loss – Towing/Storage/Rental

This list is serialized once into claim_type_in_link (Claim_Form.Claim_Type1=[...]&Claim_Form.Claim_Type1_op=72, i.e. an "IN" filter) and appended to every report link described below. Rental Only is not in this list — the page's footnote now correctly matches this (it no longer claims Rental Only is included, unlike an earlier revision).


KPI Header Tiles

Four tiles per view, each a clickable card linking out to the Admin_Claims_Management_Report, filtered to that tile's slice of the month window. The workload chart now also prints the total file count above each bar (a .dt_chart-total-count label), in addition to the stacked segments.

TileCount fieldAmount fieldReport link field
Assigned (total)countamountreport_link
Completedcompleted_countcompleted_amountcompleted_report_link
Pendingpending_countpending_amountpending_report_link
Cancelledcancelled_countcancelled_amountcancelled_report_link

Amount sums Quoted_Value for the Quoters view and Assessment_Value for the Assessors view.

Quoter KPI tiles and workload chart


Panel Criteria (detail)

Quoters view


1. Quoters Assigned

  • Form: Claims_Management_Form
  • Display: Count — quoter_all.count(); Amount — quoter_all.sum(Quoted_Value)
  • Criteria:
    • Claim_Form != null && Claim_Form.Claim_Type1 in claim_type
    • Quoter1 != null && Quoter1.Show_in_Quoter_and_Assessor_Dashboard == true
    • Date_Sent_for_Quote >= date_value && Date_Sent_for_Quote <= end_value
    • Quote_Status != null && Status != null — excludes claims that don't yet have a determinate quote/claim status
  • Report: Admin_Claims_Management_Report
  • Report filter: Claim_Form_op=30 + claim-type allow-list + Quoter1_op=30&Quoter1.Show_in_Quoter_and_Assessor_Dashboard=true + Date_Sent_for_Quote=<date_value>;<end_value>&Date_Sent_for_Quote_op=58

2. Quoters Completed

  • Form: Claims_Management_Form
  • Display: Count — completed_quoter_all.count(); Amount — completed_quoter_all.sum(Quoted_Value)
  • Criteria:
    • Claim_Form != null && Claim_Form.Claim_Type1 in claim_type && Quoter1 != null
    • Status not in [Cancel, Rejected]
    • Quote_Status == "Completed"
    • Offer_Details1.Date_Quoted >= date_value && Offer_Details1.Date_Quoted <= end_valuenote: a different date field than Assigned (#1)
    • Date_Sent_for_Quote != null
  • Report: Admin_Claims_Management_Report
  • Report filter: same base params as #1, plus Status=[Cancel,Rejected]&Status_op=19 (not-in) + Quote_Status=Completed + Offer_Details1.Date_Quoted=<date_value>;<end_value>&Offer_Details1.Date_Quoted_op=58 + Date_Sent_for_Quote_op=30 (not empty)

3. Quoters Pending

  • Form: Claims_Management_Form
  • Display: Count — pending_quoter_all.count(); Amount — pending_quoter_all.sum(Quoted_Value)
  • Criteria:
    • Claim_Form != null && Claim_Form.Claim_Type1 in claim_type && Quoter1 != null
    • Status not in [Cancel, Rejected]
    • Quote_Status == "Pending"
    • Date_Sent_for_Quote >= date_value && Date_Sent_for_Quote <= end_value — same date field as Assigned (#1)
  • Report: Admin_Claims_Management_Report
  • Report filter: same base params as #1, plus Status=[Cancel,Rejected]&Status_op=19 (not-in) + Quote_Status=Pending

4. Quoters Cancelled

  • Form: Claims_Management_Form
  • Display: Count — cancelled_quoter_all.count(); Amount — cancelled_quoter_all.sum(Quoted_Value)
  • Criteria:
    • Claim_Form != null && Claim_Form.Claim_Type1 in claim_type && Quoter1 != null
    • Status in [Cancel, Rejected]
    • Cancel_Date >= date_value && Cancel_Date <= end_valuenote: a different date field than Assigned (#1)
    • Date_Sent_for_Quote != null
  • Report: Admin_Claims_Management_Report
  • Report filter: same base params as #1, plus Status=[Cancel,Rejected]&Status_op=18 (in) + Cancel_Date=<date_value>;<end_value>&Cancel_Date_op=58 + Date_Sent_for_Quote_op=30 (not empty)

Assessors view

Same shape as the Quoters view, substituting Assessor for Quoter1, Assessment_Status for Quote_Status, and Assessment_Value for Quoted_Value. Differences from the Quoters view: Pending groups two statuses together, Assigned has no Assessment_Status != null && Status != null guard (unlike Quoters Assigned), and Pending has a real logic bug — see Mockup Notes.


5. Assessors Assigned

  • Form: Claims_Management_Form
  • Display: Count — assessor_all.count(); Amount — assessor_all.sum(Assessment_Value)
  • Criteria:
    • Claim_Form != null && Claim_Form.Claim_Type1 in claim_type
    • Assessor != null && Assessor.Show_in_Quoter_and_Assessor_Dashboard == true
    • Date_Sent_for_Assessing >= date_value && Date_Sent_for_Assessing <= end_value
  • Report: Admin_Claims_Management_Report
  • Report filter: Claim_Form_op=30 + claim-type allow-list + Assessor_op=30&Assessor.Show_in_Quoter_and_Assessor_Dashboard=true + Date_Sent_for_Assessing=<date_value>;<end_value>&Date_Sent_for_Assessing_op=58

6. Assessors Completed

  • Form: Claims_Management_Form
  • Display: Count — completed_assessor_all.count(); Amount — completed_assessor_all.sum(Assessment_Value)
  • Criteria:
    • Claim_Form != null && Claim_Form.Claim_Type1 in claim_type && Assessor != null
    • Status not in [Cancel, Rejected]
    • Assessment_Status == "Completed"
    • Assessment_Date >= date_value && Assessment_Date <= end_valuenote: a different date field than Assigned (#5)
    • Date_Sent_for_Assessing != null
  • Report: Admin_Claims_Management_Report
  • Report filter: same base params as #5, plus Status=[Cancel,Rejected]&Status_op=19 (not-in) + Assessment_Status=Completed + Assessment_Date=<date_value>;<end_value>&Assessment_Date_op=58 + Date_Sent_for_Assessing_op=30 (not empty)

7. Assessors Pending

  • Form: Claims_Management_Form
  • Display: Count — pending_assessor_all.count(); Amount — pending_assessor_all.sum(Assessment_Value)
  • Criteria (as written):
    • Status not in [Cancel, Rejected] && Assessment_Status == "Pending" || Assessment_Status == "Sent for Review" && Date_Sent_for_Assessing >= date_value && Date_Sent_for_Assessing <= end_value
  • This has an operator-precedence bug — see Mockup Notes for what it actually evaluates to.
  • Report: Admin_Claims_Management_Report
  • Report filter: same base params as #5, plus Status=[Cancel,Rejected]&Status_op=19 (not-in) + Assessment_Status=[Pending,Sent for Review] + Date_Sent_for_Assessing=<date_value>;<end_value>&Date_Sent_for_Assessing_op=58

8. Assessors Cancelled

  • Form: Claims_Management_Form
  • Display: Count — cancelled_assessor_all.count(); Amount — cancelled_assessor_all.sum(Assessment_Value)
  • Criteria:
    • Claim_Form != null && Claim_Form.Claim_Type1 in claim_type && Assessor != null
    • Status in [Cancel, Rejected]
    • Cancel_Date >= date_value && Cancel_Date <= end_valuenote: a different date field than Assigned (#5)
    • Date_Sent_for_Assessing != null
  • Report: Admin_Claims_Management_Report
  • Report filter: same base params as #5, plus Status=[Cancel,Rejected]&Status_op=18 (in) + Cancel_Date=<date_value>;<end_value>&Cancel_Date_op=58 + Date_Sent_for_Assessing_op=30 (not empty)

Workload Chart

A stacked column chart, one column per quoter/assessor, built from quoter_table/assessor_table:

  • Iterates Add_Quoter / Add_Assessor records where Show_in_Quoter_and_Assessor_Dashboard == true; a person with zero claims in the month window is skipped entirely (not shown as an empty column).
  • For each remaining person, computes the same four figures as the header tiles (total, completed, pending, cancelled, each with its amount), scoped to that one person via Quoter1 == row_quoter.ID / Assessor == row_assessor.ID.
  • Sort order: descending by total file count. Implemented by building a sort key (total + 100000000).toString() + "::" + name, sorting the key list descending, then remapping back to rows — a workaround for the platform's list-sort not supporting a numeric comparator directly.
  • Bar height: bar_height = (row_total * 260px) / scale_max, clamped to a 3px minimum so non-zero bars stay visible. scale_max is picked from a fixed step table (10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000, 50000, 100000, 200000, 500000, 1000000, 2000000) — the smallest step that's still ≥ max_total * 1.05 across all people in that view, so the tallest bar never quite touches the top gridline.
  • Total count label: the total file count is printed above each bar (.dt_chart-total-count), independent of the stacked segments below it.
  • Segments: each bar is a flex row of up to three stacked <a> segments (completed / pending / cancelled), each sized by flex-grow:<count> — i.e. segment height is proportional to that status's share of the person's total, not an absolute pixel value. Each segment now has a correctly-formed tooltip (title="Completed: <n>" etc.) — see Mockup Notes for the earlier broken version.
  • Y-axis gridlines/ticks are drawn at 0%, 25%, 50%, 75%, 100% of scale_max.

Ledger Table

One row per quoter/assessor (same quoter_table/assessor_table list backing the chart, same sort order), with five stat cells: Assigned, Completed, Pending, Cancelled (count + amount each), all deep-linking to Admin_Claims_Management_Report scoped to that one person (Quoter1.ID=<id> / Assessor.ID=<id>) plus the matching status filter from the panel list above.

Assessor ledger and &quot;How the dashboard filters work&quot; footnote


How the Dashboard Filters Work

The page's own footnote (rendered from a static <ul> in html_code.txt, titled "How the dashboard filters work") restates the logic above for end users:

  • Selected period is based on the selected month/year (current date if blank), running from the selected date through the end of that month.
  • Assigned is based on Date_Sent_for_Quote (Quoters) / Date_Sent_for_Assessing (Assessors).
  • Quoter CompletedQuote_Status is Completed, not Cancel/Rejected, and Offer_Details1.Date_Quoted falls in the selected period; Date_Sent_for_Quote must also be populated.
  • Quoter PendingQuote_Status is Pending, not Cancel/Rejected, and Date_Sent_for_Quote falls in the selected period.
  • Quoter Cancelled — status is Cancel/Rejected, Cancel_Date falls in the selected period, and Date_Sent_for_Quote is populated.
  • Assessor CompletedAssessment_Status is Completed, not Cancel/Rejected, and Assessment_Date falls in the selected period; Date_Sent_for_Assessing must also be populated.
  • Assessor PendingAssessment_Status is Pending or Sent for Review, with the assessment assignment date falling in the selected period.
  • Assessor Cancelled — status is Cancel/Rejected, Cancel_Date falls in the selected period, and Date_Sent_for_Assessing is populated.
  • Claim types are limited to the allow-list above (spelled out in full in the footnote itself).
  • Amount uses Quoted_Value (Quoters) / Assessment_Value (Assessors).
  • Dashboard users are limited to Quoters/Assessors with Show_in_Quoter_and_Assessor_Dashboard enabled.

Why the Four Numbers Don't Sum to Assigned

Assigned, Completed, Pending, and Cancelled are each filtered on a different date field representing when that specific event happened — not a status breakdown of one fixed "assigned this month" population:

BucketDate field
AssignedDate_Sent_for_Quote / Date_Sent_for_Assessing
CompletedOffer_Details1.Date_Quoted (quoters) / Assessment_Date (assessors)
PendingDate_Sent_for_Quote / Date_Sent_for_Assessing (same as Assigned)
CancelledCancel_Date

Only Pending shares its date field with Assigned. So a claim sent for quote/assessing in a previous month but completed or cancelled this month shows up in this month's Completed/Cancelled count without ever being counted in this month's Assigned total — and the reverse can happen too (assigned this month, resolved later). This is expected: read Assigned as "new quotes/assessments requested this month," and Completed/Pending/Cancelled as "quotes/assessments that reached that status this month," not as a partition that must sum to Assigned.

(An intermediate revision of this function briefly filtered Completed/Cancelled on the same date field as Assigned specifically to make these reconcile — that approach was not kept; the current version is back to the cohort model above.)