When to use this endpoint

Return the target-band segments and actual value for one tenant-wide job target gauge. Select the matching saved Reports dashboard chart or table, choose a bounded range, and use the returned series to render that report.

res always has five one-cell rows: three half-target bands, overflow band, actual. xLabels/xLabels1 still come from the shared label helper and may describe more than one period.

Authentication and permissions

Authenticate with signed API-key fields or a logged-in CRM session. The handler requires login and account reporting feature bit 8192. No separate Reports, Jobs, Tasks or finance page-permission check is added by the handler.

The dispatcher rejects this legacy Report route for configured TeamAccess record scope, including assigned-only/parent-manager access and applicable department hierarchy scope. It returns an explicit scope error rather than a silently filtered chart.

Allowed requests read the authenticated tenant. Entity selections are report filters or label controls, not authorization; the handler does not add customer account-manager ownership filtering.

Parameters

ParameterTypeRequiredDescription
daysFromInteger stringYesInclusive first date: relative day offset from current PHP time by default, or Unix seconds with durationType=1. Must be an integer; malformed/blank values are rejected. ISO strings are not parsed as dates.
daysToInteger stringYesInclusive last date, in the same mode as daysFrom. Expanded to 23:59:59 in the account timezone; no reversed-range validation.
durationTypeInteger stringNoDefault 0. Exactly 1 uses Unix seconds; other values convert integer day offsets through strtotime. Use 0/1; numeric values are validated before report SQL.
frequencyInteger stringNoDefault 0 monthly, 1 weekly, 2 quarterly, 3 yearly. Only changes helper labels; the gauge still aggregates its entire date range.
userTypeInteger stringNoLegacy label-axis control, default 0. It does not filter the tenant-wide target or actual value; it changes helper labels only.
userNative array of ID strings or ["All"]NoDefaults to ["All"]; a supplied empty list is rejected. This only changes labels, not the aggregated records. Pass a native array, not an encoded JSON string.

Example request

$report = FM_api('Report_getJobsTargetGauge', [
	'daysFrom'=>'1768003200',
	'daysTo'=>'1768003200',
	'durationType'=>'1',
	'userType'=>'0',
	'frequency'=>'0',
	'user'=>['All'],
]);

Example response

{
  "res": [
    [
      50
    ],
    [
      50
    ],
    [
      50
    ],
    [
      100
    ],
    [
      250
    ]
  ],
  "xLabels": [
    "Jan 2026"
  ],
  "xLabels1": []
}

Populated fixture: target 100 and actual 250 produce three 50-unit bands, a 100-unit overflow band and actual 250.

res always has five one-cell rows: three half-target bands, overflow band, actual. xLabels/xLabels1 still come from the shared label helper and may describe more than one period.

Errors and unusual responses

ResponseCondition
{"error":"not logged in"}No authenticated tenant context is available. Invalid signed credentials can be rejected by the dispatcher before the handler runs.
{"error":"This legacy report does not support your configured record scope. Use the scoped Contracts reports or table exports."}The dispatcher detects configured TeamAccess record scope before the handler.
{"error":"no permission to access api"}Account reporting feature bit 8192 is absent.
{"error":"missing parameter: daysFrom"}The named parameter is omitted or null. Present blank/malformed controls return an invalid-parameter error instead; list controls must be native arrays.
{"error":"missing parameter: daysTo"}The named parameter is omitted or null. Present blank/malformed controls return an invalid-parameter error instead; list controls must be native arrays.
{"error":"invalid parameter: daysFrom"}A supplied numeric/list control is malformed, a list contains unsupported tokens, or frequency/userType/date selectors are outside 0–3. The message names the invalid control; validation precedes chart queries.

Legacy application errors may be returned with HTTP 200. Check the decoded response for error, not only the HTTP status.

Behaviour and edge cases

  • Target is the integer sum of non-deleted reports_target rows with type=0 over every calendar month intersecting the request. Monthly values are not prorated for partial months.
  • There is one gauge for the whole tenant/range. user, userType and frequency affect only helper labels; they do not filter the target or actual queries. More labels do not mean more gauges or per-user values.
  • The first three segments each equal 0.5×target. The fourth equals 0.5×target when actual <= 2×target; otherwise it is actual−1.5×target. The fifth cell is actual. These are display segments and a value, not five percentages.
  • Target and actual are integer-converted before segment arithmetic. A zero target with a positive actual leaves the first three segments zero and sets both fourth and actual cells to the value.
  • Actual sums one linked value per active Job by scheduled meeting_time_e, regardless of completion state. The target category is type 2 (Job), matching Report_getJobTargetAttainment; Quote Won targets of type 0 do not contribute.
  • Linked Job value is computed once per Job: sum the net values of distinct type-3 linked Invoice IDs; if that sum is null, sum distinct type-2 linked Quote IDs; if null, use guarded meta.job_value, otherwise zero. Equal-valued documents remain separate contributions; duplicate links do not multiply values. An explicit zero sum stops fallback. No new deleted-finance filter or direct-link relationship is introduced, and current Job price_net is not used.
  • There is no pagination, checkpoint or result-size limit. Keep the date range and entity selection bounded. Aggregated values are numeric chart cells, not database scalar strings or object rows.
  • The helper orders periods first, then entities by name; one entity collapses xLabels to period text with empty xLabels1. Temporary users with non-null meta.is_tmp are excluded from user-axis lookups, but inactive/deleted label entities are not generally excluded. Unmatched entity/date keys are silently dropped.
  • PHP date conversion uses the account timezone (missing/null defaults to Europe/Dublin, blank means UTC). SQL date/Unix conversion uses its database session timezone; these handlers do not force cross-layer alignment.
  • Weekly axes enumerate real Mondays and use ISO week-year keys consistently with SQL. Week 53 and ranges crossing a calendar-year boundary are included; display labels are Week NN YYYY using the ISO year.
  • For scheduled Unix boundaries, Core_timeLocalToEpoch uses UTC when the timezone setting is blank/missing, while the chart timezone helper uses Europe/Dublin when missing. Configure a valid account timezone to avoid that fallback mismatch.
  • Numeric controls and native selector lists are validated through Report_validateChartRequest before SQL. JSON-encoded list strings, nested/object-keyed arrays, unsafe ID values and undocumented tokens are rejected. The existing login, reporting-feature and TeamAccess entry policies remain unchanged.
  • No direct caller for this endpoint was found in the mobile app or its m-service intermediary.

Side effects

  • Reads tenant data only; no business-record, audit, notification or schema writes occur. The chart restores its temporary PHP timezone on normal return paths.

See it in Fieldmotion

CRM1

Open Reports dashboard, add or preview Jobs Target Gauge, choose filters and inspect Network for Report_getJobsTargetGauge. pageReportDashboard.js constructs the endpoint dynamically from the saved api value. Generic legends can control presentation without changing the backend cohort; compare the actual request with this page’s parameter contract.

CRM2

Open Reports dashboard, add or preview Jobs Target Gauge, choose filters and inspect Network for Report_getJobsTargetGauge. lib/displayReport.js / pageReportDashboardDetails.js constructs the endpoint dynamically from the saved api value. Generic legends can control presentation without changing the backend cohort; compare the actual request with this page’s parameter contract.

Related endpoints