@dsptch-work/api-client 0.36.0 → 0.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -262,7 +262,7 @@ export const zProblem = z.object({
262
262
  *
263
263
  * **Unparseable Date Value**
264
264
  *
265
- * A date-time value cannot be parsed, or falls outside the storable range. Format values as ISO 8601 (for example `2026-08-05` or `2026-08-05T14:30`).
265
+ * A date-time value cannot be parsed, falls outside the storable range, or has no UTC offset where one is required. Format values as ISO 8601 (for example `2026-08-05` or `2026-08-05T14:30`); a time entry's `start_time` and `end_time`, a timestamp filter bound, and an `as_of[]` coordinate need an offset (for example `2026-08-05T14:30:00-04:00` or `2026-08-05T18:30:00Z`).
266
266
  *
267
267
  * ### invalid_filter_value
268
268
  *
@@ -288,12 +288,6 @@ export const zProblem = z.object({
288
288
  *
289
289
  * An attachment signed id names no upload this endpoint can read. A signed id is issued for one `resource` and verifies only there, so an id for a different resource is indistinguishable from one that is malformed, expired, or tampered with, and all of them answer alike. The message names the resource the upload needed; upload the file again to the direct-uploads endpoint naming it, and pass the signed id that call returns.
290
290
  *
291
- * ### non_numeric_cents
292
- *
293
- * **Non-Numeric Money Value**
294
- *
295
- * A money parameter is not a numeric value in cents. Send money as a numeric cents value.
296
- *
297
291
  * ### nothing_to_cancel
298
292
  *
299
293
  * **Nothing To Cancel**
@@ -418,7 +412,6 @@ export const zProblemTypeCatalog = z.enum([
418
412
  'invalid_iso8601_duration',
419
413
  'invalid_placement_move',
420
414
  'invalid_signed_id',
421
- 'non_numeric_cents',
422
415
  'nothing_to_cancel',
423
416
  'pagination_failed',
424
417
  'subtype_foreign_keys',
@@ -457,6 +450,7 @@ export const zDirectUploadParameters = z.object({
457
450
  'internal.company_todos',
458
451
  'internal.job_todos',
459
452
  'internal.project_todos',
453
+ 'jobs.documents',
460
454
  'pay_periods.imports.aggregate_times',
461
455
  'pay_periods.imports.dsptch_cprs',
462
456
  'pay_periods.imports.time_entries',
@@ -605,7 +599,7 @@ export const zCompetencyCriterionResponseObject = z.object({
605
599
  number: z.string().nullable(),
606
600
  body: z.string().nullable(),
607
601
  evidence_note: z.string().nullable(),
608
- assessment_method: z.enum([
602
+ assessment_methods: z.array(z.enum([
609
603
  'direct_observation',
610
604
  'simulation',
611
605
  'oral_questioning',
@@ -614,7 +608,7 @@ export const zCompetencyCriterionResponseObject = z.object({
614
608
  'recognized_prior_learning',
615
609
  'witness_testimony',
616
610
  'other'
617
- ]).nullable(),
611
+ ])),
618
612
  created_at: z.iso.datetime(),
619
613
  updated_at: z.iso.datetime()
620
614
  });
@@ -625,7 +619,7 @@ export const zCompetencyCriterionParameters = z.object({
625
619
  number: z.string().nullish(),
626
620
  body: z.string().nullish(),
627
621
  evidence_note: z.string().nullish(),
628
- assessment_method: z.enum([
622
+ assessment_methods: z.array(z.enum([
629
623
  'direct_observation',
630
624
  'simulation',
631
625
  'oral_questioning',
@@ -634,7 +628,7 @@ export const zCompetencyCriterionParameters = z.object({
634
628
  'recognized_prior_learning',
635
629
  'witness_testimony',
636
630
  'other'
637
- ]).nullish()
631
+ ])).optional()
638
632
  });
639
633
  /**
640
634
  * Swap a draft catalog row with its neighbor. The row cannot move past either end of the list.
@@ -721,12 +715,12 @@ export const zCompetencyAssessmentResponseObject = z.object({
721
715
  updated_at: z.iso.datetime()
722
716
  });
723
717
  /**
724
- * One task line on an assessment. decision and qa_feedback are omitted, not null, when the caller is the candidate and the package is not yet decided.
718
+ * One criterion line on an assessment. decision and qa_feedback are omitted, not null, when the caller is the candidate and the package is not yet decided.
725
719
  */
726
- export const zCompetencyAssessmentKeyActivityResponseObject = z.object({
720
+ export const zCompetencyAssessmentCriterionResponseObject = z.object({
727
721
  id: z.string(),
728
722
  competencies_assessment_id: z.string(),
729
- competencies_key_activity_id: z.string(),
723
+ competencies_criterion_id: z.string(),
730
724
  assessment_methods: z.array(z.enum([
731
725
  'direct_observation',
732
726
  'simulation',
@@ -757,7 +751,7 @@ export const zCompetencyAssessmentKeyActivityResponseObject = z.object({
757
751
  */
758
752
  export const zCompetencyEvidenceItemResponseObject = z.object({
759
753
  id: z.string(),
760
- competencies_assessment_key_activity_id: z.string(),
754
+ competencies_assessment_criterion_id: z.string(),
761
755
  kind: z.enum([
762
756
  'upload',
763
757
  'form_submission',
@@ -1040,7 +1034,7 @@ export const zApprenticeshipProgramEmployerUpdateParameters = z.object({
1040
1034
  require_timecard_allocation: z.boolean().optional()
1041
1035
  });
1042
1036
  /**
1043
- * Create a period on a wage schedule; the wage schedule is taken from the URL path. wage_cents and fringe_cents are sent as integer cents. Omitting period_number, wage_percent, or wage_cents answers 400. A wrong JSON type, a negative number, or a null for any field but min_minutes, max_minutes, num_competencies, description, fringe_percent, and fringe_cents answers 422 at that field; a null in one of those leaves it unset, but a period with none of min_minutes, max_minutes, or num_competencies answers 422.
1037
+ * Create a period on a wage schedule; the wage schedule is taken from the URL path. wage_percent and fringe_percent are sent as decimal strings (e.g. "62.5"), and wage_cents and fringe_cents as cents in a decimal string (e.g. "2800" or "2800.0"). Omitting period_number, wage_percent, or wage_cents answers 400. A wrong JSON type, a negative number, or a null for any field but min_minutes, max_minutes, num_competencies, description, fringe_percent, and fringe_cents answers 422 at that field; a null in one of those leaves it unset, but a period with none of min_minutes, max_minutes, or num_competencies answers 422.
1044
1038
  */
1045
1039
  export const zApprenticeshipWageSchedulePeriodParameters = z.object({
1046
1040
  period_number: z.int().gte(0),
@@ -1048,13 +1042,13 @@ export const zApprenticeshipWageSchedulePeriodParameters = z.object({
1048
1042
  max_minutes: z.int().gte(0).nullish(),
1049
1043
  num_competencies: z.int().gte(0).nullish(),
1050
1044
  description: z.string().nullish(),
1051
- wage_percent: z.number().gte(0),
1052
- wage_cents: z.int().gte(0),
1053
- fringe_percent: z.number().gte(0).nullish(),
1054
- fringe_cents: z.int().gte(0).nullish()
1045
+ wage_percent: z.string().regex(/^[0-9]+(\.[0-9]+)?$/),
1046
+ wage_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/),
1047
+ fringe_percent: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
1048
+ fringe_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish()
1055
1049
  });
1056
1050
  /**
1057
- * Update a period on a wage schedule. Send only the fields to change; the wage schedule is taken from the URL path, and wage_cents and fringe_cents are sent as integer cents. A wrong JSON type, a negative number, or a null for any field but min_minutes, max_minutes, num_competencies, description, fringe_percent, and fringe_cents answers 422 at that field; a null in one of those clears it, but a period left with none of min_minutes, max_minutes, or num_competencies answers 422.
1051
+ * Update a period on a wage schedule. Send only the fields to change; the wage schedule is taken from the URL path, wage_percent and fringe_percent are sent as decimal strings (e.g. "62.5"), and wage_cents and fringe_cents as cents in a decimal string (e.g. "2800" or "2800.0"). A wrong JSON type, a negative number, or a null for any field but min_minutes, max_minutes, num_competencies, description, fringe_percent, and fringe_cents answers 422 at that field; a null in one of those clears it, but a period left with none of min_minutes, max_minutes, or num_competencies answers 422.
1058
1052
  */
1059
1053
  export const zApprenticeshipWageSchedulePeriodUpdateParameters = z.object({
1060
1054
  period_number: z.int().gte(0).optional(),
@@ -1062,13 +1056,13 @@ export const zApprenticeshipWageSchedulePeriodUpdateParameters = z.object({
1062
1056
  max_minutes: z.int().gte(0).nullish(),
1063
1057
  num_competencies: z.int().gte(0).nullish(),
1064
1058
  description: z.string().nullish(),
1065
- wage_percent: z.number().gte(0).optional(),
1066
- wage_cents: z.int().gte(0).optional(),
1067
- fringe_percent: z.number().gte(0).nullish(),
1068
- fringe_cents: z.int().gte(0).nullish()
1059
+ wage_percent: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).optional(),
1060
+ wage_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).optional(),
1061
+ fringe_percent: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
1062
+ fringe_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish()
1069
1063
  });
1070
1064
  /**
1071
- * Create a wage schedule for an occupation; the occupation is taken from the URL path. Money is sent as integer cents; periods may be created inline via periods_attributes. Omitting name, wage_unit, journeyworker_wage_unit, or period_unit answers 400. A blank name, a unit outside its listed values, a wrong JSON type, or a null for any field but description and journeyworker_fringe_cents answers 422; a null in either of those leaves the field unset.
1065
+ * Create a wage schedule for an occupation; the occupation is taken from the URL path. Money is sent as cents in a decimal string (e.g. "2800" or "2800.0"); periods may be created inline via periods_attributes. Omitting name, wage_unit, journeyworker_wage_unit, or period_unit answers 400. A blank name, a unit outside its listed values, a wrong JSON type, or a null for any field but description and journeyworker_fringe_cents answers 422; a null in either of those leaves the field unset.
1072
1066
  */
1073
1067
  export const zApprenticeshipWageScheduleParameters = z.object({
1074
1068
  name: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/),
@@ -1097,9 +1091,9 @@ export const zApprenticeshipWageScheduleParameters = z.object({
1097
1091
  'semi_annual',
1098
1092
  'year'
1099
1093
  ]),
1100
- journeyworker_wage_cents: z.int().optional(),
1101
- journeyworker_fringe_cents: z.int().nullish(),
1102
- end_wage_cents: z.int().optional(),
1094
+ journeyworker_wage_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).optional(),
1095
+ journeyworker_fringe_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
1096
+ end_wage_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).optional(),
1103
1097
  periods_attributes: z.array(z.object({
1104
1098
  id: z.string().optional(),
1105
1099
  period_number: z.int().gte(0).optional(),
@@ -1107,15 +1101,15 @@ export const zApprenticeshipWageScheduleParameters = z.object({
1107
1101
  max_minutes: z.int().gte(0).nullish(),
1108
1102
  num_competencies: z.int().gte(0).nullish(),
1109
1103
  description: z.string().nullish(),
1110
- wage_percent: z.number().gte(0).optional(),
1111
- wage_cents: z.int().gte(0).optional(),
1112
- fringe_percent: z.number().gte(0).nullish(),
1113
- fringe_cents: z.int().gte(0).nullish(),
1104
+ wage_percent: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).optional(),
1105
+ wage_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).optional(),
1106
+ fringe_percent: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
1107
+ fringe_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
1114
1108
  _destroy: z.boolean().optional()
1115
1109
  })).optional()
1116
1110
  });
1117
1111
  /**
1118
- * Update a wage schedule for an occupation. Send only the fields to change; money is sent as integer cents and periods may be created, updated, or removed inline via periods_attributes. A blank name, a unit outside its listed values, a wrong JSON type, or a null for any field but description and journeyworker_fringe_cents answers 422; a null in either of those clears the field.
1112
+ * Update a wage schedule for an occupation. Send only the fields to change; money is sent as cents in a decimal string (e.g. "2800" or "2800.0") and periods may be created, updated, or removed inline via periods_attributes. A blank name, a unit outside its listed values, a wrong JSON type, or a null for any field but description and journeyworker_fringe_cents answers 422; a null in either of those clears the field.
1119
1113
  */
1120
1114
  export const zApprenticeshipWageScheduleUpdateParameters = z.object({
1121
1115
  name: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).optional(),
@@ -1144,9 +1138,9 @@ export const zApprenticeshipWageScheduleUpdateParameters = z.object({
1144
1138
  'semi_annual',
1145
1139
  'year'
1146
1140
  ]).optional(),
1147
- journeyworker_wage_cents: z.int().optional(),
1148
- journeyworker_fringe_cents: z.int().nullish(),
1149
- end_wage_cents: z.int().optional(),
1141
+ journeyworker_wage_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).optional(),
1142
+ journeyworker_fringe_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
1143
+ end_wage_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).optional(),
1150
1144
  periods_attributes: z.array(z.object({
1151
1145
  id: z.string().optional(),
1152
1146
  period_number: z.int().gte(0).optional(),
@@ -1154,10 +1148,10 @@ export const zApprenticeshipWageScheduleUpdateParameters = z.object({
1154
1148
  max_minutes: z.int().gte(0).nullish(),
1155
1149
  num_competencies: z.int().gte(0).nullish(),
1156
1150
  description: z.string().nullish(),
1157
- wage_percent: z.number().gte(0).optional(),
1158
- wage_cents: z.int().gte(0).optional(),
1159
- fringe_percent: z.number().gte(0).nullish(),
1160
- fringe_cents: z.int().gte(0).nullish(),
1151
+ wage_percent: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).optional(),
1152
+ wage_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).optional(),
1153
+ fringe_percent: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
1154
+ fringe_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
1161
1155
  _destroy: z.boolean().optional()
1162
1156
  })).optional()
1163
1157
  });
@@ -1238,16 +1232,16 @@ export const zPeopleEmploymentCreateParameters = z.object({
1238
1232
  payroll_id: z.string().nullish(),
1239
1233
  enrolled_in_t_and_a: z.boolean().optional(),
1240
1234
  compensation_type: z.enum(['hourly', 'salary']).optional(),
1241
- hourly_rate_cents: z.string().nullish(),
1235
+ hourly_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
1242
1236
  overtime_eligible: z.boolean().nullish(),
1243
1237
  overtime_package_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).nullish(),
1244
1238
  worked_annual_minutes: z.int().nullish(),
1245
1239
  pto_annual_minutes: z.int().nullish(),
1246
1240
  holiday_annual_minutes: z.int().nullish(),
1247
1241
  training_annual_minutes: z.int().nullish(),
1248
- training_annual_amount_cents: z.string().nullish(),
1249
- employer_combined_health_amount_cents: z.string().nullish(),
1250
- employer_combined_savings_cents: z.string().nullish()
1242
+ training_annual_amount_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
1243
+ employer_combined_health_amount_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
1244
+ employer_combined_savings_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish()
1251
1245
  });
1252
1246
  /**
1253
1247
  * Request body for creating one employment boundary. effective_date is required and is interpreted at midnight in the credential company's time zone. Today and past dates must fall inside the family's latest version, before its termination; future dates retain scheduling behavior. Send at least one value to change; omitted values carry forward from the version immediately before the new boundary.
@@ -1255,16 +1249,16 @@ export const zPeopleEmploymentCreateParameters = z.object({
1255
1249
  export const zPeopleEmploymentScheduledChangeCreateParameters = z.object({
1256
1250
  effective_date: z.iso.date(),
1257
1251
  compensation_type: z.enum(['hourly', 'salary']).optional(),
1258
- hourly_rate_cents: z.string().nullish(),
1252
+ hourly_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
1259
1253
  overtime_eligible: z.boolean().nullish(),
1260
1254
  overtime_package_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).nullish(),
1261
1255
  worked_annual_minutes: z.int().nullish(),
1262
1256
  pto_annual_minutes: z.int().nullish(),
1263
1257
  holiday_annual_minutes: z.int().nullish(),
1264
1258
  training_annual_minutes: z.int().nullish(),
1265
- training_annual_amount_cents: z.string().nullish(),
1266
- employer_combined_health_amount_cents: z.string().nullish(),
1267
- employer_combined_savings_cents: z.string().nullish(),
1259
+ training_annual_amount_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
1260
+ employer_combined_health_amount_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
1261
+ employer_combined_savings_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
1268
1262
  companies_department_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).nullish()
1269
1263
  });
1270
1264
  /**
@@ -1272,16 +1266,16 @@ export const zPeopleEmploymentScheduledChangeCreateParameters = z.object({
1272
1266
  */
1273
1267
  export const zPeopleEmploymentScheduledChangeUpdateParameters = z.object({
1274
1268
  compensation_type: z.enum(['hourly', 'salary']).optional(),
1275
- hourly_rate_cents: z.string().nullish(),
1269
+ hourly_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
1276
1270
  overtime_eligible: z.boolean().nullish(),
1277
1271
  overtime_package_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).nullish(),
1278
1272
  worked_annual_minutes: z.int().nullish(),
1279
1273
  pto_annual_minutes: z.int().nullish(),
1280
1274
  holiday_annual_minutes: z.int().nullish(),
1281
1275
  training_annual_minutes: z.int().nullish(),
1282
- training_annual_amount_cents: z.string().nullish(),
1283
- employer_combined_health_amount_cents: z.string().nullish(),
1284
- employer_combined_savings_cents: z.string().nullish(),
1276
+ training_annual_amount_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
1277
+ employer_combined_health_amount_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
1278
+ employer_combined_savings_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
1285
1279
  companies_department_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).nullish()
1286
1280
  });
1287
1281
  /**
@@ -1449,7 +1443,7 @@ export const zTimecodeHistoryVersionObject = z.object({
1449
1443
  * Request body for creating or updating a timecode; only `name` is required. On create, omitted fields take their model/DB defaults (noted per field). On update the request applies a bitemporal correction, so omitted fields keep the current version's values rather than reverting to defaults.
1450
1444
  */
1451
1445
  export const zTimecodeParameters = z.object({
1452
- effective_date: z.string().optional(),
1446
+ effective_date: z.iso.date().optional(),
1453
1447
  name: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/),
1454
1448
  description: z.string().nullish(),
1455
1449
  description_is_required: z.boolean().optional(),
@@ -1475,8 +1469,8 @@ export const zTimecodeParameters = z.object({
1475
1469
  * Request body for correcting a timecode over a valid-time span. Send only the fields to change; omitted fields retain their current values. `effective_from` defaults to the addressed version's start, and `effective_to` is optional.
1476
1470
  */
1477
1471
  export const zTimecodeCorrectionParameters = z.object({
1478
- effective_from: z.string().optional(),
1479
- effective_to: z.string().optional(),
1472
+ effective_from: z.iso.datetime().optional(),
1473
+ effective_to: z.iso.datetime().optional(),
1480
1474
  name: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).optional(),
1481
1475
  description: z.string().nullish(),
1482
1476
  description_is_required: z.boolean().optional(),
@@ -1502,7 +1496,7 @@ export const zTimecodeCorrectionParameters = z.object({
1502
1496
  * Request body for moving the beginning of a timecode's valid-time timeline. Moving it earlier extends coverage; moving it later removes coverage before the new beginning.
1503
1497
  */
1504
1498
  export const zTimecodeGenesisParameters = z.object({
1505
- effective_date: z.string()
1499
+ effective_date: z.iso.date()
1506
1500
  });
1507
1501
  /**
1508
1502
  * Request body for scheduling a timecode's termination: the date from which it stops being valid. The body is required — the endpoint reads effective_date with `params.expect`, so a request omitting it is refused with `400`.
@@ -1514,7 +1508,7 @@ export const zTimecodeScheduledTerminationParameters = z.object({
1514
1508
  * Request body for scheduling a future change to a timecode: an effective_date paired with the attribute values to apply from that date. Only `effective_date` is required; omitted attributes inherit the current version's values.
1515
1509
  */
1516
1510
  export const zTimecodeScheduledChangeParameters = z.object({
1517
- effective_date: z.string(),
1511
+ effective_date: z.iso.date(),
1518
1512
  name: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).optional(),
1519
1513
  description: z.string().nullish(),
1520
1514
  description_is_required: z.boolean().optional(),
@@ -1619,7 +1613,7 @@ export const zPerDiemResponseObject = z.object({
1619
1613
  export const zPerDiemParameters = z.object({
1620
1614
  name: z.string(),
1621
1615
  description: z.string().nullish(),
1622
- rate_cents: z.string(),
1616
+ rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/),
1623
1617
  currency: z.string(),
1624
1618
  taxable: z.boolean().optional(),
1625
1619
  default: z.boolean().optional(),
@@ -1633,7 +1627,7 @@ export const zPerDiemParameters = z.object({
1633
1627
  export const zPerDiemUpdateParameters = z.object({
1634
1628
  name: z.string().optional(),
1635
1629
  description: z.string().nullish(),
1636
- rate_cents: z.string().optional(),
1630
+ rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).optional(),
1637
1631
  currency: z.string().optional(),
1638
1632
  taxable: z.boolean().optional(),
1639
1633
  default: z.boolean().optional(),
@@ -2397,6 +2391,183 @@ export const zPwaJobDetailsResponseObject = z.object({
2397
2391
  il_shines_project_id: z.string().nullish(),
2398
2392
  ny_dol_prc_number: z.string().nullish()
2399
2393
  }).nullable();
2394
+ /**
2395
+ * Parameters for creating a job. Sets the job's schedule, work types, address, custom-field values, and optional Prevailing Wage / Apprenticeship (PWA) compliance. `requested_by_company_id` and `created_by_user_id` are required unless `template_id` names a template, whose copy keeps both. Undeclared body keys return 400, and a null for a field that is not nullable or a wrongly typed value returns 422 at its pointer, before any job or relationship is saved.
2396
+ */
2397
+ export const zJobCreateParameters = z.object({
2398
+ created_by_user_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).optional(),
2399
+ template_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).nullish(),
2400
+ name: z.string().nullish(),
2401
+ description: z.string().optional(),
2402
+ requested_by_company_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).optional(),
2403
+ purchase_order_number: z.string().nullish(),
2404
+ project_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).nullish(),
2405
+ companies_department_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).nullish(),
2406
+ federal_pwa_mode: z.enum([
2407
+ 'all',
2408
+ 'pw_only',
2409
+ 'ap_only',
2410
+ 'none'
2411
+ ]).optional(),
2412
+ regional_pwa_mode: z.enum([
2413
+ 'all',
2414
+ 'pw_only',
2415
+ 'ap_only',
2416
+ 'none'
2417
+ ]).optional(),
2418
+ region: z.string().nullish(),
2419
+ start_time: z.string().nullish(),
2420
+ end_time: z.string().nullish(),
2421
+ tz_name: z.string().optional(),
2422
+ time_card_start_day: z.int().gte(0).lte(6).optional(),
2423
+ clock_in_requirement: z.enum([
2424
+ 'none',
2425
+ 'warning',
2426
+ 'required'
2427
+ ]).optional(),
2428
+ send_geofence_reminders: z.boolean().nullish(),
2429
+ allow_customer_access: z.boolean().optional(),
2430
+ tracks_feature_allocations: z.boolean().optional(),
2431
+ requires_feature_allocation: z.boolean().optional(),
2432
+ max_one_feature_allocation: z.boolean().optional(),
2433
+ production_tracking_kind: z.enum([
2434
+ 'none',
2435
+ 'feature',
2436
+ 'quantity'
2437
+ ]).optional(),
2438
+ manager_user_ids: z.array(z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/)).optional(),
2439
+ timekeeping_timecode_ids: z.array(z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/)).optional(),
2440
+ job_work_types_attributes: z.array(z.object({
2441
+ primary: z.boolean().optional(),
2442
+ work_type_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).optional()
2443
+ })).optional(),
2444
+ job_address_attributes: z.object({
2445
+ id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).nullish(),
2446
+ sub_address_number: z.string().nullish(),
2447
+ address_number: z.string().nullish(),
2448
+ neighborhood: z.string().nullish(),
2449
+ municipality: z.string().nullish(),
2450
+ sub_region: z.string().nullish(),
2451
+ region: z.string().nullish(),
2452
+ postal_code: z.string().nullish(),
2453
+ country: z.string().nullish(),
2454
+ timezone: z.string().nullish(),
2455
+ verified: z.boolean().optional(),
2456
+ label: z.string().nullish()
2457
+ }).optional(),
2458
+ custom_fields: z.array(z.object({
2459
+ custom_field_config_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/),
2460
+ value: z.string().nullable()
2461
+ })).optional(),
2462
+ pwa_details: z.object({
2463
+ contractor_type: z.enum(['prime_contractor', 'sub_contractor']).nullish(),
2464
+ pay_full_cash_fringe_by_default: z.boolean().optional(),
2465
+ dir_awarding_body_id: z.string().nullish(),
2466
+ dir_project_id: z.string().nullish(),
2467
+ dir_project_name: z.string().nullish(),
2468
+ dir_contract_id: z.string().nullish(),
2469
+ dir_project_awarding_body_name: z.string().nullish(),
2470
+ dir_project_number: z.string().nullish(),
2471
+ il_dol_project_id: z.string().nullish(),
2472
+ il_dol_state_capital_funds: z.boolean().nullish(),
2473
+ il_dol_public_body_name: z.string().nullish(),
2474
+ il_dol_public_body_contact_id: z.string().nullish(),
2475
+ il_dol_public_body_address_id: z.string().nullish(),
2476
+ il_dol_contract_number: z.string().nullish(),
2477
+ il_shines_project_id: z.string().nullish(),
2478
+ ny_dol_prc_number: z.string().nullish()
2479
+ }).optional()
2480
+ });
2481
+ /**
2482
+ * Parameters for updating an existing job. Every field is optional; omit a field to preserve its current value. The resulting job must still satisfy schedule and PWA validation rules. Accepts every shared job field plus a directly settable status and custom-field changes. Sending `created_by_user_id` returns 400 unknown_key, including when it matches the existing creator or is null. Undeclared body keys return 400, and a null for a field that is not nullable or a wrongly typed value returns 422 at its pointer, before any job or relationship changes.
2483
+ */
2484
+ export const zJobUpdateParameters = z.object({
2485
+ name: z.string().nullish(),
2486
+ description: z.string().optional(),
2487
+ requested_by_company_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).optional(),
2488
+ purchase_order_number: z.string().nullish(),
2489
+ project_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).nullish(),
2490
+ companies_department_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).nullish(),
2491
+ federal_pwa_mode: z.enum([
2492
+ 'all',
2493
+ 'pw_only',
2494
+ 'ap_only',
2495
+ 'none'
2496
+ ]).optional(),
2497
+ regional_pwa_mode: z.enum([
2498
+ 'all',
2499
+ 'pw_only',
2500
+ 'ap_only',
2501
+ 'none'
2502
+ ]).optional(),
2503
+ region: z.string().nullish(),
2504
+ start_time: z.string().nullish(),
2505
+ end_time: z.string().nullish(),
2506
+ tz_name: z.string().optional(),
2507
+ time_card_start_day: z.int().gte(0).lte(6).optional(),
2508
+ clock_in_requirement: z.enum([
2509
+ 'none',
2510
+ 'warning',
2511
+ 'required'
2512
+ ]).optional(),
2513
+ send_geofence_reminders: z.boolean().nullish(),
2514
+ allow_customer_access: z.boolean().optional(),
2515
+ tracks_feature_allocations: z.boolean().optional(),
2516
+ requires_feature_allocation: z.boolean().optional(),
2517
+ max_one_feature_allocation: z.boolean().optional(),
2518
+ production_tracking_kind: z.enum([
2519
+ 'none',
2520
+ 'feature',
2521
+ 'quantity'
2522
+ ]).optional(),
2523
+ manager_user_ids: z.array(z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/)).optional(),
2524
+ timekeeping_timecode_ids: z.array(z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/)).optional(),
2525
+ job_work_types_attributes: z.array(z.object({
2526
+ primary: z.boolean().optional(),
2527
+ work_type_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).optional()
2528
+ })).optional(),
2529
+ job_address_attributes: z.object({
2530
+ id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).nullish(),
2531
+ sub_address_number: z.string().nullish(),
2532
+ address_number: z.string().nullish(),
2533
+ neighborhood: z.string().nullish(),
2534
+ municipality: z.string().nullish(),
2535
+ sub_region: z.string().nullish(),
2536
+ region: z.string().nullish(),
2537
+ postal_code: z.string().nullish(),
2538
+ country: z.string().nullish(),
2539
+ timezone: z.string().nullish(),
2540
+ verified: z.boolean().optional(),
2541
+ label: z.string().nullish()
2542
+ }).optional(),
2543
+ custom_fields: z.array(z.object({
2544
+ custom_field_config_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/),
2545
+ value: z.string().nullable()
2546
+ })).optional(),
2547
+ pwa_details: z.object({
2548
+ contractor_type: z.enum(['prime_contractor', 'sub_contractor']).nullish(),
2549
+ pay_full_cash_fringe_by_default: z.boolean().optional(),
2550
+ dir_awarding_body_id: z.string().nullish(),
2551
+ dir_project_id: z.string().nullish(),
2552
+ dir_project_name: z.string().nullish(),
2553
+ dir_contract_id: z.string().nullish(),
2554
+ dir_project_awarding_body_name: z.string().nullish(),
2555
+ dir_project_number: z.string().nullish(),
2556
+ il_dol_project_id: z.string().nullish(),
2557
+ il_dol_state_capital_funds: z.boolean().nullish(),
2558
+ il_dol_public_body_name: z.string().nullish(),
2559
+ il_dol_public_body_contact_id: z.string().nullish(),
2560
+ il_dol_public_body_address_id: z.string().nullish(),
2561
+ il_dol_contract_number: z.string().nullish(),
2562
+ il_shines_project_id: z.string().nullish(),
2563
+ ny_dol_prc_number: z.string().nullish()
2564
+ }).optional(),
2565
+ status: z.enum([
2566
+ 'completed',
2567
+ 'cancelled',
2568
+ 'disputed'
2569
+ ]).optional()
2570
+ });
2400
2571
  /**
2401
2572
  * A reusable job template — a saved job pattern for quickly creating new jobs with the same setup. Read-only through the API (listing only).
2402
2573
  */
@@ -2443,6 +2614,140 @@ export const zUserUpdateParameters = z.object({
2443
2614
  dol_apprentice_no: z.string().nullish(),
2444
2615
  avatar_signed_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).nullish()
2445
2616
  });
2617
+ /**
2618
+ * Request body for onboarding a worker into your company. In one call it creates the person (if new), their employment record and its custom-field values, roles, group memberships, an optional invite, and optional compliance details. first_name and last_name are required, and omitting either answers 400. Unless skip_invite is true, the invite needs a work email or a phone number, and a request with neither answers 422 at both fields. An unlisted key answers 400. A value of the wrong JSON type, a null for a field that is not nullable, or a value outside a listed set answers 422 at its pointer, and nothing is written.
2619
+ */
2620
+ export const zUserParameters = z.object({
2621
+ email: z.string().nullish(),
2622
+ personal_email: z.string().nullish(),
2623
+ phone_number: z.string().nullish(),
2624
+ first_name: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/),
2625
+ last_name: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/),
2626
+ preferred_first_name: z.string().nullish(),
2627
+ preferred_last_name: z.string().nullish(),
2628
+ city: z.string().nullish(),
2629
+ state: z.string().nullish(),
2630
+ birth_date: z.iso.date().nullish(),
2631
+ dol_apprentice_no: z.string().nullish(),
2632
+ winda_id: z.string().nullish(),
2633
+ linkedin_url: z.string().nullish(),
2634
+ roles: z.array(z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/)).optional(),
2635
+ avatar_signed_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).nullish(),
2636
+ created_by_user_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).nullish(),
2637
+ last_sent_by_user_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).nullish(),
2638
+ skip_notify: z.boolean().optional(),
2639
+ skip_invite: z.boolean().optional(),
2640
+ hire_date: z.string().optional(),
2641
+ type: z.enum(['EMPLOYEE', 'CONTRACTOR']).optional(),
2642
+ title: z.string().nullish(),
2643
+ manager_user_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).nullish(),
2644
+ payroll_id: z.string().nullish(),
2645
+ enrolled_in_t_and_a: z.boolean().optional(),
2646
+ compensation_type: z.enum(['hourly', 'salary']).optional(),
2647
+ hourly_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
2648
+ training_annual_amount_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
2649
+ employer_combined_health_amount_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
2650
+ employer_combined_savings_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
2651
+ overtime_eligible: z.boolean().optional(),
2652
+ worked_annual_minutes: z.int().nullish(),
2653
+ pto_annual_minutes: z.int().nullish(),
2654
+ holiday_annual_minutes: z.int().nullish(),
2655
+ training_annual_minutes: z.int().nullish(),
2656
+ custom_fields: z.array(z.object({
2657
+ custom_field_config_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/),
2658
+ value: z.string().nullable()
2659
+ })).optional(),
2660
+ group_ids: z.array(z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/)).optional(),
2661
+ company_user_pwa_info: z.object({
2662
+ address1: z.string().nullish(),
2663
+ address2: z.string().nullish(),
2664
+ city: z.string().nullish(),
2665
+ state: z.string().nullish(),
2666
+ zip: z.string().nullish(),
2667
+ race: z.array(z.enum([
2668
+ 'AFRICAN_AMERICAN',
2669
+ 'ASIAN',
2670
+ 'CAUCASIAN',
2671
+ 'NATIVE_AMERICAN',
2672
+ 'NOT_SPECIFIED',
2673
+ 'OTHER'
2674
+ ])).optional(),
2675
+ sex: z.enum([
2676
+ 'female',
2677
+ 'male',
2678
+ 'non_binary',
2679
+ 'not_specified'
2680
+ ]).nullish(),
2681
+ local_business_license: z.string().nullish(),
2682
+ drivers_license_state: z.string().nullish(),
2683
+ drivers_license_number: z.string().nullish(),
2684
+ ssn: z.string().nullish(),
2685
+ veteran_status: z.enum([
2686
+ 'protected_veteran',
2687
+ 'not_protected_veteran',
2688
+ 'reserves',
2689
+ 'guard',
2690
+ 'not_specified'
2691
+ ]).nullish(),
2692
+ hispanic_origin: z.enum([
2693
+ 'yes',
2694
+ 'no',
2695
+ 'not_specified'
2696
+ ]).nullish(),
2697
+ ca_dir_withholding_exemptions: z.int().nullish(),
2698
+ disabled: z.boolean().optional(),
2699
+ il_dol_race: z.enum([
2700
+ 'white',
2701
+ 'black',
2702
+ 'hispanic_or_latino',
2703
+ 'american_indian_or_alaska_native',
2704
+ 'chinese',
2705
+ 'filipino',
2706
+ 'asian_india',
2707
+ 'vietnamese',
2708
+ 'korean',
2709
+ 'japanese',
2710
+ 'native_hawaiian',
2711
+ 'samoan',
2712
+ 'chamorro',
2713
+ 'other_asian',
2714
+ 'other_pacific_islander',
2715
+ 'other'
2716
+ ]).nullish(),
2717
+ il_shines_employment_type: z.enum([
2718
+ 'part_time',
2719
+ 'full_time',
2720
+ 'seasonal_temporary',
2721
+ 'independent_contract'
2722
+ ]).nullish(),
2723
+ il_shines_eep_qualifiers: z.array(z.enum([
2724
+ 'eep_program_completed',
2725
+ 'foster_care',
2726
+ 'formerly_incarcerated',
2727
+ 'equity_investment_eligible_community',
2728
+ 'self_registered_or_unknown'
2729
+ ])).optional(),
2730
+ il_shines_other_programs: z.array(z.enum([
2731
+ 'solar_training_pipeline_program',
2732
+ 'craft_apprenticeship_program',
2733
+ 'multi_cultural_jobs_program',
2734
+ 'clean_jobs_workforce_network_program',
2735
+ 'illinois_climate_works_prep_apprenticeship_program',
2736
+ 'returning_residents_clean_jobs_training_program',
2737
+ 'other'
2738
+ ])).optional(),
2739
+ or_boli_schedule_type: z.enum(['five_eight', 'four_ten']).nullish(),
2740
+ or_boli_race: z.array(z.enum([
2741
+ 'american_indian_or_alaska_native',
2742
+ 'asian',
2743
+ 'hispanic_or_latino',
2744
+ 'black_or_african_american',
2745
+ 'native_hawaiian_or_pacific_islander',
2746
+ 'white',
2747
+ 'portuguese_or_brazilian'
2748
+ ])).optional()
2749
+ }).optional()
2750
+ });
2446
2751
  /**
2447
2752
  * A single time entry: one atomic block of tracked work with its start/end times, optional timecode classification, optional job, pay rate, and manager approval status.
2448
2753
  */
@@ -2512,13 +2817,13 @@ export const zManagerTimeEntryApprovalParameters = z.object({
2512
2817
  */
2513
2818
  export const zTimeEntryCreateParameters = z.object({
2514
2819
  timekeeping_time_card_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/),
2515
- start_time: z.string(),
2516
- end_time: z.string(),
2820
+ start_time: z.iso.datetime(),
2821
+ end_time: z.iso.datetime(),
2517
2822
  job_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).nullish(),
2518
2823
  timekeeping_timecode_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).nullish(),
2519
2824
  state: z.string().nullish(),
2520
2825
  description: z.string().nullish(),
2521
- hourly_rate_cents: z.string().nullish(),
2826
+ hourly_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
2522
2827
  feature_ids: z.array(z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/)).optional(),
2523
2828
  feature_allocation_acknowledged: z.boolean().optional()
2524
2829
  });
@@ -2526,13 +2831,13 @@ export const zTimeEntryCreateParameters = z.object({
2526
2831
  * Request body for updating a time entry. Every field is optional, and an omitted field keeps its value.
2527
2832
  */
2528
2833
  export const zTimeEntryUpdateParameters = z.object({
2529
- start_time: z.string().optional(),
2530
- end_time: z.string().optional(),
2834
+ start_time: z.iso.datetime().optional(),
2835
+ end_time: z.iso.datetime().optional(),
2531
2836
  job_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).nullish(),
2532
2837
  timekeeping_timecode_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).nullish(),
2533
2838
  state: z.string().nullish(),
2534
2839
  description: z.string().nullish(),
2535
- hourly_rate_cents: z.string().nullish(),
2840
+ hourly_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
2536
2841
  feature_ids: z.array(z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/)).optional(),
2537
2842
  confirm_allocation_conflict: z.boolean().optional()
2538
2843
  });
@@ -2554,12 +2859,14 @@ export const zFormDefinitionObject = z.object({
2554
2859
  allow_carry_forward: z.boolean(),
2555
2860
  current_revision: z.int().nullable(),
2556
2861
  json: z.record(z.string(), z.unknown()),
2862
+ submission_shape: z.record(z.string(), z.unknown()),
2557
2863
  created_at: z.iso.datetime()
2558
2864
  });
2559
2865
  /**
2560
2866
  * A single form submission — a user's completed SurveyJS form with the resolved answers (the fuller show representation). Read-only; submissions are created in the app.
2561
2867
  */
2562
2868
  export const zFormSubmissionResponseObject = z.object({
2869
+ id: z.string(),
2563
2870
  user: z.object({
2564
2871
  id: z.string(),
2565
2872
  name: z.string()
@@ -2599,11 +2906,11 @@ export const zUserCompanyCreateParameters = z.object({
2599
2906
  payroll_id: z.string().nullish(),
2600
2907
  enrolled_in_t_and_a: z.boolean().optional(),
2601
2908
  compensation_type: z.enum(['hourly', 'salary']).optional(),
2602
- hourly_rate: z.string().nullish(),
2909
+ hourly_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
2910
+ training_annual_amount_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
2911
+ employer_combined_health_amount_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
2912
+ employer_combined_savings_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
2603
2913
  overtime_eligible: z.boolean().optional(),
2604
- training_annual_amount: z.string().nullish(),
2605
- employer_combined_health_amount: z.string().nullish(),
2606
- employer_combined_savings: z.string().nullish(),
2607
2914
  worked_annual_minutes: z.int().nullish(),
2608
2915
  pto_annual_minutes: z.int().nullish(),
2609
2916
  holiday_annual_minutes: z.int().nullish(),
@@ -2618,12 +2925,12 @@ export const zUserCompanyCreateParameters = z.object({
2618
2925
  */
2619
2926
  export const zUserCompanyScheduledChangesParameters = z.object({
2620
2927
  effective_date: z.iso.date(),
2621
- hourly_rate: z.string().nullish(),
2928
+ hourly_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
2929
+ training_annual_amount_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
2930
+ employer_combined_health_amount_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
2931
+ employer_combined_savings_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
2622
2932
  compensation_type: z.enum(['hourly', 'salary']).optional(),
2623
2933
  overtime_eligible: z.boolean().optional(),
2624
- training_annual_amount: z.string().nullish(),
2625
- employer_combined_health_amount: z.string().nullish(),
2626
- employer_combined_savings: z.string().nullish(),
2627
2934
  worked_annual_minutes: z.int().nullish(),
2628
2935
  pto_annual_minutes: z.int().nullish(),
2629
2936
  holiday_annual_minutes: z.int().nullish(),
@@ -2830,129 +3137,23 @@ export const zTimeCardStartDay = z.union([
2830
3137
  z.literal(0),
2831
3138
  z.literal(1),
2832
3139
  z.literal(2),
2833
- z.literal(3),
2834
- z.literal(4),
2835
- z.literal(5),
2836
- z.literal(6)
2837
- ]);
2838
- /**
2839
- * Fields shared by job creation and updates. Updates may omit any field to preserve its current value. The resulting job must still satisfy its schedule and PWA validation rules.
2840
- */
2841
- export const zJobParameters = z.object({
2842
- name: z.string().nullish(),
2843
- description: z.string().optional(),
2844
- requested_by_company_id: z.string().optional(),
2845
- manager_user_ids: z.array(z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/)).optional(),
2846
- purchase_order_number: z.string().nullish(),
2847
- project_id: z.string().nullish(),
2848
- companies_department_id: z.string().nullish(),
2849
- federal_pwa_mode: z.enum([
2850
- 'all',
2851
- 'pw_only',
2852
- 'ap_only',
2853
- 'none'
2854
- ]).optional(),
2855
- regional_pwa_mode: z.enum([
2856
- 'all',
2857
- 'pw_only',
2858
- 'ap_only',
2859
- 'none'
2860
- ]).optional(),
2861
- region: z.string().optional(),
2862
- start_time: z.string().nullish(),
2863
- end_time: z.string().nullish(),
2864
- tz_name: z.string().optional(),
2865
- time_card_start_day: zTimeCardStartDay.optional(),
2866
- clock_in_requirement: z.enum([
2867
- 'none',
2868
- 'warning',
2869
- 'required'
2870
- ]).optional(),
2871
- send_geofence_reminders: z.boolean().nullish(),
2872
- allow_customer_access: z.boolean().optional(),
2873
- timekeeping_timecode_ids: z.array(z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/)).optional(),
2874
- tracks_feature_allocations: z.boolean().nullish(),
2875
- requires_feature_allocation: z.boolean().nullish(),
2876
- max_one_feature_allocation: z.boolean().nullish(),
2877
- production_tracking_kind: z.enum([
2878
- 'none',
2879
- 'feature',
2880
- 'quantity'
2881
- ]).optional(),
2882
- job_work_types_attributes: z.array(z.object({
2883
- primary: z.boolean().optional(),
2884
- work_type_id: z.string().optional()
2885
- })).nullish(),
2886
- job_address_attributes: z.object({
2887
- id: z.string().nullish(),
2888
- sub_address_number: z.string().nullish(),
2889
- address_number: z.string().nullish(),
2890
- neighborhood: z.string().nullish(),
2891
- municipality: z.string().nullish(),
2892
- sub_region: z.string().nullish(),
2893
- region: z.string().nullish(),
2894
- postal_code: z.string().nullish(),
2895
- country: z.string().nullish(),
2896
- timezone: z.string().nullish(),
2897
- verified: z.boolean().nullish(),
2898
- label: z.string().nullish()
2899
- }).nullish(),
2900
- pwa_details: z.object({
2901
- contractor_type: z.enum(['prime_contractor', 'sub_contractor']).nullish(),
2902
- pay_full_cash_fringe_by_default: z.boolean().optional(),
2903
- dir_awarding_body_id: z.string().nullish(),
2904
- dir_project_id: z.string().nullish(),
2905
- dir_project_name: z.string().nullish(),
2906
- dir_contract_id: z.string().nullish(),
2907
- dir_project_awarding_body_name: z.string().nullish(),
2908
- dir_project_number: z.string().nullish(),
2909
- il_dol_project_id: z.string().nullish(),
2910
- il_dol_state_capital_funds: z.boolean().nullish(),
2911
- il_dol_public_body_name: z.string().nullish(),
2912
- il_dol_public_body_contact_id: z.string().nullish(),
2913
- il_dol_public_body_address_id: z.string().nullish(),
2914
- il_dol_contract_number: z.string().nullish(),
2915
- il_shines_project_id: z.string().nullish(),
2916
- ny_dol_prc_number: z.string().nullish()
2917
- }).optional()
2918
- });
2919
- /**
2920
- * Parameters for creating a job. `requested_by_company_id` and `created_by_user_id` are required. Sets the job's schedule, work types, address, custom-field values, and optional Prevailing Wage / Apprenticeship (PWA) compliance.
2921
- */
2922
- export const zJobCreateParameters = zJobParameters.and(z.object({
2923
- created_by_user_id: z.string(),
2924
- template_id: z.string().nullish(),
2925
- custom_fields: z.array(z.object({
2926
- custom_field_config_id: z.string(),
2927
- value: z.string().nullable()
2928
- })).optional()
2929
- }));
2930
- /**
2931
- * Parameters for updating an existing job. Every field is optional; omit a field to preserve its current value. The resulting job must still satisfy schedule and PWA validation rules. Accepts every shared job field plus a directly settable status and custom-field changes. Sending `created_by_user_id` returns 400 unknown_key, including when it matches the existing creator or is null.
2932
- */
2933
- export const zJobUpdateParameters = zJobParameters.and(z.object({
2934
- status: z.enum([
2935
- 'completed',
2936
- 'cancelled',
2937
- 'disputed'
2938
- ]).optional(),
2939
- custom_fields: z.array(z.object({
2940
- custom_field_config_id: z.string(),
2941
- value: z.string().nullable()
2942
- })).optional()
2943
- }));
3140
+ z.literal(3),
3141
+ z.literal(4),
3142
+ z.literal(5),
3143
+ z.literal(6)
3144
+ ]);
2944
3145
  /**
2945
3146
  * One version of a worker's compensation at your company, effective from its start date until the next version begins.
2946
3147
  */
2947
3148
  export const zUserCompanyScheduledChange = z.object({
2948
3149
  id: z.string(),
2949
3150
  start_date: z.string(),
2950
- hourly_rate: z.string().nullable(),
3151
+ hourly_rate_cents: z.string().nullable(),
2951
3152
  compensation_type: z.enum(['hourly', 'salary']),
2952
3153
  overtime_eligible: z.boolean(),
2953
- training_annual_amount: z.string().nullable(),
2954
- employer_combined_health_amount: z.string().nullable(),
2955
- employer_combined_savings: z.string().nullable(),
3154
+ training_annual_amount_cents: z.string().nullable(),
3155
+ employer_combined_health_amount_cents: z.string().nullable(),
3156
+ employer_combined_savings_cents: z.string().nullable(),
2956
3157
  worked_annual_minutes: z.int().nullable(),
2957
3158
  pto_annual_minutes: z.int().nullable(),
2958
3159
  holiday_annual_minutes: z.int().nullable(),
@@ -3140,7 +3341,7 @@ export const zTimeEntryImportResponseObject = z.object({
3140
3341
  updated_at: z.iso.datetime()
3141
3342
  });
3142
3343
  /**
3143
- * Submit a spreadsheet of time entries for a pay period. All seven of payroll_id, start_time, end_time, timecode, job_id, state and description must be present as column headers, or the file is refused naming the ones missing. Of those, payroll_id, start_time, end_time, timecode and state must also carry a value on every row. features, federal_labor_classification and regional_labor_classification are read when present. Header matching ignores case and treats spaces as underscores, and column order does not matter. Any other column is refused: a name this import does not read would be dropped without trace, so the file is rejected naming it rather than applied in part.
3344
+ * Submit a spreadsheet of time entries for a pay period. All six of payroll_id, start_time, end_time, timecode, job_id and description must be present as column headers, or the file is refused naming the ones missing. The payroll_id, start_time, end_time and timecode columns must carry a value on every row. The state column may be omitted, or its cells left blank, when the row's Job resolves a recognized state through its operating region, address, then oldest qualifying Site address. A valid explicit state overrides this fallback; an invalid supplied state fails. Missing or blank state without a Job, unresolved geography, or an unrecognized address region rejects the whole file with row-specific errors. The original file retains omissions and blank values, so background processing resolves current Job geography again. features, federal_labor_classification and regional_labor_classification are read when present. Header matching ignores case and treats spaces as underscores, and column order does not matter. Any other column is refused: a name this import does not read would be dropped without trace, so the file is rejected naming it rather than applied in part.
3144
3345
  *
3145
3346
  * Because acceptance is synchronous but the write happens in the background, only one import at a time is accepted for a pay period: while an earlier one is still `pending` or `processing`, a second answers 409 naming `import_in_progress`, and nothing is written. Poll the earlier import until it reports, then submit again.
3146
3347
  */
@@ -3681,8 +3882,8 @@ export const zProjectResponseObject = z.object({
3681
3882
  administrator_name: z.string().nullable(),
3682
3883
  administrator_email: z.string().nullable(),
3683
3884
  administrator_phone: z.string().nullable(),
3684
- budget_cents: z.string().nullable(),
3685
- budget_currency: z.string().nullable(),
3885
+ budget_cents: z.string().nullish(),
3886
+ budget_currency: z.string().nullish(),
3686
3887
  start_date: z.iso.date().nullable(),
3687
3888
  end_date: z.iso.date().nullable(),
3688
3889
  prevailing_wage_lock_in_date: z.iso.date().nullable(),
@@ -3721,7 +3922,7 @@ export const zProjectParameters = z.object({
3721
3922
  administrator_name: z.string().nullish(),
3722
3923
  administrator_email: z.string().nullish(),
3723
3924
  administrator_phone: z.string().nullish(),
3724
- budget: z.string().nullish(),
3925
+ budget_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
3725
3926
  prevailing_wage_lock_in_date: z.iso.date().nullish(),
3726
3927
  beginning_of_construction_date: z.iso.date().nullish(),
3727
3928
  placed_in_service_date: z.iso.date().nullish(),
@@ -3757,7 +3958,7 @@ export const zProjectUpdateParameters = z.object({
3757
3958
  administrator_name: z.string().nullish(),
3758
3959
  administrator_email: z.string().nullish(),
3759
3960
  administrator_phone: z.string().nullish(),
3760
- budget: z.string().nullish(),
3961
+ budget_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
3761
3962
  prevailing_wage_lock_in_date: z.iso.date().nullish(),
3762
3963
  beginning_of_construction_date: z.iso.date().nullish(),
3763
3964
  placed_in_service_date: z.iso.date().nullish()
@@ -3783,6 +3984,22 @@ export const zProjectSiteParameters = z.object({
3783
3984
  export const zProjectSiteUpdateParameters = z.object({
3784
3985
  feature_ids: z.array(z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/)).optional()
3785
3986
  });
3987
+ /**
3988
+ * A project–user visibility join: names one person on one project. Path `{id}` is this join's id. Not included on project GET.
3989
+ */
3990
+ export const zProjectUserVisibilityResponseObject = z.object({
3991
+ id: z.string(),
3992
+ project_id: z.string(),
3993
+ user_id: z.string(),
3994
+ created_at: z.iso.datetime(),
3995
+ updated_at: z.iso.datetime()
3996
+ });
3997
+ /**
3998
+ * Request body for naming a person on a project. `user_id` is required. The project is taken from the path and is not part of the body. There is no update body — `user_id` and `project_id` are readonly after create.
3999
+ */
4000
+ export const zProjectUserVisibilityParameters = z.object({
4001
+ user_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/)
4002
+ });
3786
4003
  /**
3787
4004
  * A file attached to a project. Uploaded through the direct-upload flow. `name` is always "document" and is not client-writable.
3788
4005
  */
@@ -3857,6 +4074,7 @@ export const zSiteCheckInResponseObject = z.object({
3857
4074
  longitude: z.number().nullable(),
3858
4075
  start_time: z.iso.datetime(),
3859
4076
  end_time: z.iso.datetime().nullable(),
4077
+ duration_minutes: z.int().nullable(),
3860
4078
  verified_at: z.iso.datetime().nullable(),
3861
4079
  created_at: z.iso.datetime(),
3862
4080
  updated_at: z.iso.datetime()
@@ -4174,7 +4392,7 @@ export const zComplianceCheckDetailResponseObject = z.object({
4174
4392
  */
4175
4393
  export const zComplianceCheckParameters = z.object({
4176
4394
  status: z.enum(['dismissed', 'pending']).optional(),
4177
- time_due: z.string().nullish(),
4395
+ time_due: z.iso.date().nullish(),
4178
4396
  assignee_user_ids: z.array(z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/)).optional(),
4179
4397
  file_signed_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).optional()
4180
4398
  });
@@ -4202,6 +4420,24 @@ export const zTodoInboxTodoResponseObject = z.object({
4202
4420
  created_by_user_id: z.string(),
4203
4421
  updated_by_user_id: z.string(),
4204
4422
  completed: z.boolean(),
4423
+ priority: z.enum([
4424
+ 'critical',
4425
+ 'high',
4426
+ 'medium',
4427
+ 'low'
4428
+ ]).nullable(),
4429
+ category: z.enum([
4430
+ 'apprenticeship',
4431
+ 'certified_payroll',
4432
+ 'company',
4433
+ 'job',
4434
+ 'payroll',
4435
+ 'project',
4436
+ 'regional',
4437
+ 'tax_credit',
4438
+ 'timekeeping',
4439
+ 'worker'
4440
+ ]),
4205
4441
  task_assignee_user_ids: z.array(z.string()),
4206
4442
  description: zRichTextObject,
4207
4443
  time_due: z.iso.datetime().nullable(),
@@ -4395,7 +4631,7 @@ export const zPriorPeriodAdjustmentResponseObject = z.object({
4395
4631
  export const zPriorPeriodAdjustmentParameters = z.object({
4396
4632
  payrolls_paystub_line_item_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/),
4397
4633
  created_by_user_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/),
4398
- amount_cents: z.string(),
4634
+ amount_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/),
4399
4635
  rationale: z.enum([
4400
4636
  'hours_correction',
4401
4637
  'other',
@@ -4410,7 +4646,7 @@ export const zPriorPeriodAdjustmentParameters = z.object({
4410
4646
  * Request body for updating a prior period adjustment. Send only the fields to change. The time card is the path parent; payrolls_paystub_line_item_id, created_by_user_id, time_card_id, and adjustment_type are rejected.
4411
4647
  */
4412
4648
  export const zPriorPeriodAdjustmentUpdateParameters = z.object({
4413
- amount_cents: z.string().optional(),
4649
+ amount_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).optional(),
4414
4650
  rationale: z.enum([
4415
4651
  'hours_correction',
4416
4652
  'other',
@@ -4540,22 +4776,22 @@ export const zPaystubLineItemResponseObject = z.object({
4540
4776
  updated_at: z.iso.datetime()
4541
4777
  });
4542
4778
  /**
4543
- * Request body for creating a paystub line item. All four fields are required. Undeclared body keys are rejected with 400; references outside the authenticated company return 404.
4779
+ * Request body for creating a paystub line item. All four fields are required. Undeclared body keys or an omitted field answer 400; a null or blank value, or any wrong-typed value, answers 422; references outside the authenticated company return 404.
4544
4780
  */
4545
4781
  export const zPaystubLineItemParameters = z.object({
4546
- payrolls_paystub_id: z.string(),
4547
- amount_cents: z.string(),
4782
+ payrolls_paystub_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/),
4783
+ amount_cents: z.string().regex(/^-?[0-9]+(\.[0-9]+)?$/),
4548
4784
  contributor: z.enum(['employee', 'employer']),
4549
- payrolls_external_map_id: z.string()
4785
+ payrolls_external_map_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/)
4550
4786
  });
4551
4787
  /**
4552
- * Request body for updating a paystub line item. Send only the fields to change. Undeclared body keys are rejected with 400; newly supplied references outside the authenticated company return 404.
4788
+ * Request body for updating a paystub line item. Send only the fields to change. Undeclared body keys are rejected with 400; a null or blank value, or any wrong-typed value, answers 422; newly supplied references outside the authenticated company return 404.
4553
4789
  */
4554
4790
  export const zPaystubLineItemUpdateParameters = z.object({
4555
- payrolls_paystub_id: z.string().optional(),
4556
- amount_cents: z.string().optional(),
4791
+ payrolls_paystub_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).optional(),
4792
+ amount_cents: z.string().regex(/^-?[0-9]+(\.[0-9]+)?$/).optional(),
4557
4793
  contributor: z.enum(['employee', 'employer']).optional(),
4558
- payrolls_external_map_id: z.string().optional()
4794
+ payrolls_external_map_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).optional()
4559
4795
  });
4560
4796
  /**
4561
4797
  * A job-site join — the Site attached to a Job, plus the subset of that site's features the job is working on. `{id}` is the join row, not the Site.
@@ -4578,6 +4814,61 @@ export const zJobSiteParameters = z.object({
4578
4814
  export const zJobSiteUpdateParameters = z.object({
4579
4815
  feature_ids: z.array(z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/)).optional()
4580
4816
  });
4817
+ /**
4818
+ * A document attached to a job — either an uploaded file or an external URL, never both. Includes PWA documentation when the caller may see it.
4819
+ */
4820
+ export const zJobDocumentResponseObject = z.object({
4821
+ id: z.string(),
4822
+ job_id: z.string(),
4823
+ name: z.string(),
4824
+ type: z.enum([
4825
+ 'CERTIFICATIONS',
4826
+ 'CHECKLIST',
4827
+ 'MAP',
4828
+ 'MSA',
4829
+ 'ONSITE_POSTER',
4830
+ 'OTHER',
4831
+ 'PARTS_INSTRUCTIONS',
4832
+ 'PHOTO',
4833
+ 'PO',
4834
+ 'PWA_DOCUMENTATION',
4835
+ 'RESUME',
4836
+ 'WO'
4837
+ ]),
4838
+ description: z.string().nullable(),
4839
+ admin_only: z.boolean(),
4840
+ url: z.string().nullable(),
4841
+ file: z.object({
4842
+ filename: z.string(),
4843
+ content_type: z.string().nullable(),
4844
+ byte_size: z.int(),
4845
+ url: z.string()
4846
+ }).nullable(),
4847
+ created_at: z.iso.datetime(),
4848
+ updated_at: z.iso.datetime()
4849
+ });
4850
+ /**
4851
+ * Request body for creating a job document. The job is taken from the path and is not part of the body. Supply exactly one of `url` or `file`.
4852
+ */
4853
+ export const zJobDocumentParameters = z.object({
4854
+ type: z.string().optional(),
4855
+ name: z.string().optional(),
4856
+ description: z.string().nullish(),
4857
+ file: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).optional(),
4858
+ admin_only: z.boolean().optional(),
4859
+ url: z.string().nullish()
4860
+ });
4861
+ /**
4862
+ * Request body for updating a job document. Every field is optional; omit a field to preserve its current value. The resulting document must still be exactly one of `url` or `file`.
4863
+ */
4864
+ export const zJobDocumentUpdateParameters = z.object({
4865
+ type: z.string().optional(),
4866
+ name: z.string().optional(),
4867
+ description: z.string().nullish(),
4868
+ file: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).nullish(),
4869
+ admin_only: z.boolean().optional(),
4870
+ url: z.string().nullish()
4871
+ });
4581
4872
  /**
4582
4873
  * A good-faith-effort exception on a job — a record that the employer requested apprentices from a registered program and did not receive the full request, or that no qualifying program existed. Read-only. Does not include supporting document slots.
4583
4874
  */
@@ -5113,31 +5404,31 @@ export const zPayRatesRulePackageUpdateParameters = z.object({
5113
5404
  description: z.string().nullish()
5114
5405
  });
5115
5406
  /**
5116
- * Request body for creating or updating a position on a job. The job is taken from the URL path.
5407
+ * Request body for creating or updating a position on a job. The job is taken from the URL path. Send only the fields to set; omitted fields keep their stored values. An undeclared key answers 400; a wrong type, null where it is not accepted, or a blank ID answers 422 at the field's pointer.
5117
5408
  */
5118
5409
  export const zPositionParameters = z.object({
5119
- fulfilled_by_user_id: z.string().nullish(),
5120
- start_time: z.iso.date().nullish(),
5121
- end_time: z.iso.date().nullish(),
5122
- position_function_id: z.string().nullish(),
5123
- per_diem_id: z.string().nullish(),
5124
- per_diem_rate_cents: z.number().nullish(),
5410
+ fulfilled_by_user_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).nullish(),
5411
+ start_time: z.iso.date().optional(),
5412
+ end_time: z.iso.date().optional(),
5413
+ position_function_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).nullish(),
5414
+ per_diem_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).nullish(),
5415
+ pay_rates_rule_package_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).nullish(),
5125
5416
  pwa: z.boolean().optional(),
5126
- cash_fringe_rate_cents: z.number().nullish(),
5127
- hourly_rate_cents: z.number().nullish(),
5128
- pwa_wage_pay_rate_cents: z.number().nullish(),
5129
- wage_adder_rate_cents: z.number().nullish(),
5417
+ cash_fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
5418
+ hourly_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
5419
+ pwa_wage_pay_rate_cents: z.string().regex(/^-?[0-9]+(\.[0-9]+)?$/).nullish(),
5420
+ wage_adder_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
5130
5421
  job_wage_determination_ids: z.array(z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/)).optional(),
5131
5422
  pwa_details_attributes: z.object({
5132
- skill_level: z.string().nullish()
5423
+ skill_level: z.enum(['journeyman', 'foreman']).nullable()
5133
5424
  }).optional()
5134
5425
  });
5135
5426
  /**
5136
- * Parameters for creating a per-unit scope price on a job. `scope_kind` and `unit_price` are required; omitting either answers 400, and a null or wrong-typed value answers 422.
5427
+ * Parameters for creating a per-unit scope price on a job. `scope_kind` and `unit_price_cents` are required; omitting either answers 400, and a null or wrong-typed value answers 422.
5137
5428
  */
5138
5429
  export const zProductionJobScopePriceParameters = z.object({
5139
5430
  scope_kind: z.string(),
5140
- unit_price: z.string(),
5431
+ unit_price_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/),
5141
5432
  contracted_count: z.int().nullish(),
5142
5433
  unit_of_measure: z.string().optional()
5143
5434
  });
@@ -5146,7 +5437,7 @@ export const zProductionJobScopePriceParameters = z.object({
5146
5437
  */
5147
5438
  export const zProductionJobScopePriceUpdateParameters = z.object({
5148
5439
  scope_kind: z.string().optional(),
5149
- unit_price: z.string().optional(),
5440
+ unit_price_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).optional(),
5150
5441
  contracted_count: z.int().nullish(),
5151
5442
  unit_of_measure: z.string().optional()
5152
5443
  });
@@ -5158,7 +5449,7 @@ export const zProductionJobScopePriceResponseObject = z.object({
5158
5449
  job_id: z.string(),
5159
5450
  scope_kind: z.string(),
5160
5451
  unit_of_measure: z.string(),
5161
- unit_price: z.string().optional(),
5452
+ unit_price_cents: z.string().optional(),
5162
5453
  contracted_count: z.int().nullish(),
5163
5454
  created_at: z.iso.datetime(),
5164
5455
  updated_at: z.iso.datetime()
@@ -5566,10 +5857,10 @@ export const zUserResponseObject = z.object({
5566
5857
  enrolled_in_t_and_a: z.boolean().nullable(),
5567
5858
  payroll_id: z.string().nullable(),
5568
5859
  compensation_type: z.enum(['hourly', 'salary']).nullable(),
5569
- hourly_rate: z.string().nullish(),
5570
- training_annual_amount: z.string().nullish(),
5571
- employer_combined_health_amount: z.string().nullish(),
5572
- employer_combined_savings: z.string().nullish(),
5860
+ hourly_rate_cents: z.string().nullish(),
5861
+ training_annual_amount_cents: z.string().nullish(),
5862
+ employer_combined_health_amount_cents: z.string().nullish(),
5863
+ employer_combined_savings_cents: z.string().nullish(),
5573
5864
  worked_annual_minutes: z.int().nullable(),
5574
5865
  pto_annual_minutes: z.int().nullable(),
5575
5866
  holiday_annual_minutes: z.int().nullable(),
@@ -5652,147 +5943,6 @@ export const zUserResponseObject = z.object({
5652
5943
  ])).nullable()
5653
5944
  }).nullable()
5654
5945
  });
5655
- export const zUserParameters = z.intersection(z.union([
5656
- z.object({
5657
- email: z.string().min(1)
5658
- }),
5659
- z.object({
5660
- phone_number: z.string().min(1)
5661
- }),
5662
- z.object({
5663
- skip_invite: z.literal(true)
5664
- })
5665
- ]), z.object({
5666
- email: z.string().nullish(),
5667
- personal_email: z.string().nullish(),
5668
- phone_number: z.string().nullish(),
5669
- first_name: z.string(),
5670
- last_name: z.string(),
5671
- preferred_first_name: z.string().nullish(),
5672
- preferred_last_name: z.string().nullish(),
5673
- city: z.string().optional(),
5674
- state: z.string().optional(),
5675
- birth_date: z.string().optional(),
5676
- dol_apprentice_no: z.string().optional(),
5677
- winda_id: z.string().optional(),
5678
- linkedin_url: z.string().optional(),
5679
- roles: z.array(z.string()).nullish(),
5680
- avatar_signed_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).nullish(),
5681
- created_by_user_id: z.string().optional(),
5682
- last_sent_by_user_id: z.string().nullish(),
5683
- skip_notify: z.boolean().optional(),
5684
- skip_invite: z.boolean().optional(),
5685
- type: zUserCompanyType.optional(),
5686
- title: z.string().optional(),
5687
- manager_user_id: z.string().optional(),
5688
- payroll_id: z.string().optional(),
5689
- hourly_rate: z.string().optional(),
5690
- compensation_type: z.enum(['hourly', 'salary']).optional(),
5691
- overtime_eligible: z.string().optional(),
5692
- enrolled_in_t_and_a: z.string().optional(),
5693
- training_annual_amount: z.string().optional(),
5694
- employer_combined_health_amount: z.string().nullish(),
5695
- employer_combined_savings: z.string().nullish(),
5696
- worked_annual_minutes: z.string().optional(),
5697
- pto_annual_minutes: z.string().optional(),
5698
- holiday_annual_minutes: z.string().optional(),
5699
- training_annual_minutes: z.string().optional(),
5700
- hire_date: z.string().optional(),
5701
- group_ids: z.array(z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/)).optional(),
5702
- custom_fields: z.array(z.object({
5703
- custom_field_config_id: z.string(),
5704
- value: z.string().nullable()
5705
- })).optional(),
5706
- company_user_pwa_info: z.object({
5707
- address1: z.string().nullish(),
5708
- address2: z.string().nullish(),
5709
- city: z.string().nullish(),
5710
- state: z.string().nullish(),
5711
- zip: z.string().nullish(),
5712
- race: z.array(z.enum([
5713
- 'AFRICAN_AMERICAN',
5714
- 'ASIAN',
5715
- 'CAUCASIAN',
5716
- 'NATIVE_AMERICAN',
5717
- 'NOT_SPECIFIED',
5718
- 'OTHER'
5719
- ])).optional(),
5720
- sex: z.enum([
5721
- 'female',
5722
- 'male',
5723
- 'non_binary',
5724
- 'not_specified'
5725
- ]).nullish(),
5726
- local_business_license: z.string().nullish(),
5727
- drivers_license_state: z.string().nullish(),
5728
- drivers_license_number: z.string().nullish(),
5729
- ssn: z.string().nullish(),
5730
- veteran_status: z.enum([
5731
- 'protected_veteran',
5732
- 'not_protected_veteran',
5733
- 'reserves',
5734
- 'guard',
5735
- 'not_specified'
5736
- ]).nullish(),
5737
- hispanic_origin: z.enum([
5738
- 'yes',
5739
- 'no',
5740
- 'not_specified'
5741
- ]).nullish(),
5742
- ca_dir_withholding_exemptions: z.int().nullish(),
5743
- disabled: z.boolean().optional(),
5744
- il_dol_race: z.enum([
5745
- 'white',
5746
- 'black',
5747
- 'hispanic_or_latino',
5748
- 'american_indian_or_alaska_native',
5749
- 'chinese',
5750
- 'filipino',
5751
- 'asian_india',
5752
- 'vietnamese',
5753
- 'korean',
5754
- 'japanese',
5755
- 'native_hawaiian',
5756
- 'samoan',
5757
- 'chamorro',
5758
- 'other_asian',
5759
- 'other_pacific_islander',
5760
- 'other'
5761
- ]).nullish(),
5762
- il_shines_employment_type: z.enum([
5763
- 'part_time',
5764
- 'full_time',
5765
- 'seasonal_temporary',
5766
- 'independent_contract'
5767
- ]).nullish(),
5768
- il_shines_eep_qualifiers: z.array(z.enum([
5769
- 'eep_program_completed',
5770
- 'foster_care',
5771
- 'formerly_incarcerated',
5772
- 'equity_investment_eligible_community',
5773
- 'self_registered_or_unknown'
5774
- ])).optional(),
5775
- il_shines_other_programs: z.array(z.enum([
5776
- 'solar_training_pipeline_program',
5777
- 'craft_apprenticeship_program',
5778
- 'multi_cultural_jobs_program',
5779
- 'clean_jobs_workforce_network_program',
5780
- 'illinois_climate_works_prep_apprenticeship_program',
5781
- 'returning_residents_clean_jobs_training_program',
5782
- 'other'
5783
- ])).optional(),
5784
- or_boli_schedule_type: z.enum(['five_eight', 'four_ten']).nullish(),
5785
- or_boli_race: z.array(z.enum([
5786
- 'american_indian_or_alaska_native',
5787
- 'asian',
5788
- 'hispanic_or_latino',
5789
- 'black_or_african_american',
5790
- 'native_hawaiian_or_pacific_islander',
5791
- 'white',
5792
- 'portuguese_or_brazilian'
5793
- ])).optional()
5794
- }).nullish()
5795
- }));
5796
5946
  /**
5797
5947
  * Keyset pagination cursors for the collection.
5798
5948
  */
@@ -5951,6 +6101,14 @@ export const zJobSitesResponseObject = z.object({
5951
6101
  links: zLinks,
5952
6102
  data: z.array(zJobSiteResponseObject)
5953
6103
  });
6104
+ /**
6105
+ * A page of a job's documents, with pagination metadata and navigation links.
6106
+ */
6107
+ export const zJobDocumentsResponseObject = z.object({
6108
+ meta: zMeta,
6109
+ links: zLinks,
6110
+ data: z.array(zJobDocumentResponseObject)
6111
+ });
5954
6112
  /**
5955
6113
  * A page of a job's good-faith-effort exceptions, with pagination metadata and navigation links.
5956
6114
  */
@@ -6336,8 +6494,8 @@ export const zFederalJobWageDeterminationParameters = z.object({
6336
6494
  type: z.enum(['Pwa::JobWageDeterminations::Federal']),
6337
6495
  labor_classification: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/),
6338
6496
  pwa_trade_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/),
6339
- hourly_rate_cents: z.string(),
6340
- fringe_rate_cents: z.string(),
6497
+ hourly_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/),
6498
+ fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/),
6341
6499
  class_code: z.string().nullish(),
6342
6500
  construction_category: z.enum([
6343
6501
  'building',
@@ -6355,8 +6513,8 @@ export const zRegionalJobWageDeterminationParameters = z.object({
6355
6513
  type: z.enum(['Pwa::JobWageDeterminations::Regional']),
6356
6514
  labor_classification: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/),
6357
6515
  pwa_trade_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/),
6358
- hourly_rate_cents: z.string(),
6359
- fringe_rate_cents: z.string().optional(),
6516
+ hourly_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/),
6517
+ fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).optional(),
6360
6518
  class_code: z.string().nullish(),
6361
6519
  construction_category: z.enum([
6362
6520
  'building',
@@ -6366,15 +6524,15 @@ export const zRegionalJobWageDeterminationParameters = z.object({
6366
6524
  ]).nullish(),
6367
6525
  general_wage_determination: z.string().nullish(),
6368
6526
  regional_fields: z.object({
6369
- combined_health_fringe_rate_cents: z.string().nullish(),
6370
- combined_savings_fringe_rate_cents: z.string().nullish(),
6371
- combined_holiday_pto_fringe_rate_cents: z.string().nullish(),
6372
- training_fringe_rate_cents: z.string().nullish(),
6373
- other_fringe_rate_cents: z.string().nullish(),
6374
- one_five_x_adder_rate_cents: z.string().nullish(),
6375
- two_x_adder_rate_cents: z.string().nullish(),
6376
- one_five_x_fringe_adder_rate_cents: z.string().nullish(),
6377
- two_x_fringe_adder_rate_cents: z.string().nullish()
6527
+ combined_health_fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6528
+ combined_savings_fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6529
+ combined_holiday_pto_fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6530
+ training_fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6531
+ other_fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6532
+ one_five_x_adder_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6533
+ two_x_adder_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6534
+ one_five_x_fringe_adder_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6535
+ two_x_fringe_adder_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish()
6378
6536
  }).optional(),
6379
6537
  overtime_package_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).nullish()
6380
6538
  });
@@ -6393,8 +6551,8 @@ export const zJobWageDeterminationUpdateParameters = z.object({
6393
6551
  overtime_package_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).nullish(),
6394
6552
  labor_classification: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).optional(),
6395
6553
  pwa_trade_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).optional(),
6396
- hourly_rate_cents: z.string().optional(),
6397
- fringe_rate_cents: z.string().optional(),
6554
+ hourly_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).optional(),
6555
+ fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).optional(),
6398
6556
  class_code: z.string().nullish(),
6399
6557
  construction_category: z.enum([
6400
6558
  'building',
@@ -6404,15 +6562,15 @@ export const zJobWageDeterminationUpdateParameters = z.object({
6404
6562
  ]).nullish(),
6405
6563
  general_wage_determination: z.string().nullish(),
6406
6564
  regional_fields: z.object({
6407
- combined_health_fringe_rate_cents: z.string().nullish(),
6408
- combined_savings_fringe_rate_cents: z.string().nullish(),
6409
- combined_holiday_pto_fringe_rate_cents: z.string().nullish(),
6410
- training_fringe_rate_cents: z.string().nullish(),
6411
- other_fringe_rate_cents: z.string().nullish(),
6412
- one_five_x_adder_rate_cents: z.string().nullish(),
6413
- two_x_adder_rate_cents: z.string().nullish(),
6414
- one_five_x_fringe_adder_rate_cents: z.string().nullish(),
6415
- two_x_fringe_adder_rate_cents: z.string().nullish()
6565
+ combined_health_fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6566
+ combined_savings_fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6567
+ combined_holiday_pto_fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6568
+ training_fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6569
+ other_fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6570
+ one_five_x_adder_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6571
+ two_x_adder_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6572
+ one_five_x_fringe_adder_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6573
+ two_x_fringe_adder_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish()
6416
6574
  }).optional()
6417
6575
  });
6418
6576
  /**
@@ -6421,8 +6579,8 @@ export const zJobWageDeterminationUpdateParameters = z.object({
6421
6579
  export const zJobWageDeterminationScheduledChangeParameters = z.object({
6422
6580
  effective_date: z.iso.date(),
6423
6581
  labor_classification: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).optional(),
6424
- hourly_rate_cents: z.string().optional(),
6425
- fringe_rate_cents: z.string().optional(),
6582
+ hourly_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).optional(),
6583
+ fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).optional(),
6426
6584
  class_code: z.string().nullish(),
6427
6585
  construction_category: z.enum([
6428
6586
  'building',
@@ -6432,15 +6590,15 @@ export const zJobWageDeterminationScheduledChangeParameters = z.object({
6432
6590
  ]).nullish(),
6433
6591
  general_wage_determination: z.string().nullish(),
6434
6592
  regional_fields: z.object({
6435
- combined_health_fringe_rate_cents: z.string().nullish(),
6436
- combined_savings_fringe_rate_cents: z.string().nullish(),
6437
- combined_holiday_pto_fringe_rate_cents: z.string().nullish(),
6438
- training_fringe_rate_cents: z.string().nullish(),
6439
- other_fringe_rate_cents: z.string().nullish(),
6440
- one_five_x_adder_rate_cents: z.string().nullish(),
6441
- two_x_adder_rate_cents: z.string().nullish(),
6442
- one_five_x_fringe_adder_rate_cents: z.string().nullish(),
6443
- two_x_fringe_adder_rate_cents: z.string().nullish()
6593
+ combined_health_fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6594
+ combined_savings_fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6595
+ combined_holiday_pto_fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6596
+ training_fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6597
+ other_fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6598
+ one_five_x_adder_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6599
+ two_x_adder_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6600
+ one_five_x_fringe_adder_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6601
+ two_x_fringe_adder_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish()
6444
6602
  }).optional()
6445
6603
  });
6446
6604
  /**
@@ -6615,8 +6773,8 @@ export const zFederalProjectWageDeterminationParameters = z.object({
6615
6773
  type: z.enum(['Pwa::ProjectWageDeterminations::Federal']),
6616
6774
  labor_classification: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/),
6617
6775
  pwa_trade_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/),
6618
- hourly_rate_cents: z.string(),
6619
- fringe_rate_cents: z.string(),
6776
+ hourly_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/),
6777
+ fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/),
6620
6778
  class_code: z.string().nullish(),
6621
6779
  construction_category: z.enum([
6622
6780
  'building',
@@ -6634,8 +6792,8 @@ export const zRegionalProjectWageDeterminationParameters = z.object({
6634
6792
  type: z.enum(['Pwa::ProjectWageDeterminations::Regional']),
6635
6793
  labor_classification: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/),
6636
6794
  pwa_trade_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/),
6637
- hourly_rate_cents: z.string(),
6638
- fringe_rate_cents: z.string().optional(),
6795
+ hourly_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/),
6796
+ fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).optional(),
6639
6797
  class_code: z.string().nullish(),
6640
6798
  construction_category: z.enum([
6641
6799
  'building',
@@ -6645,15 +6803,15 @@ export const zRegionalProjectWageDeterminationParameters = z.object({
6645
6803
  ]).nullish(),
6646
6804
  general_wage_determination: z.string().nullish(),
6647
6805
  regional_fields: z.object({
6648
- combined_health_fringe_rate_cents: z.string().nullish(),
6649
- combined_savings_fringe_rate_cents: z.string().nullish(),
6650
- combined_holiday_pto_fringe_rate_cents: z.string().nullish(),
6651
- training_fringe_rate_cents: z.string().nullish(),
6652
- other_fringe_rate_cents: z.string().nullish(),
6653
- one_five_x_adder_rate_cents: z.string().nullish(),
6654
- two_x_adder_rate_cents: z.string().nullish(),
6655
- one_five_x_fringe_adder_rate_cents: z.string().nullish(),
6656
- two_x_fringe_adder_rate_cents: z.string().nullish()
6806
+ combined_health_fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6807
+ combined_savings_fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6808
+ combined_holiday_pto_fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6809
+ training_fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6810
+ other_fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6811
+ one_five_x_adder_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6812
+ two_x_adder_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6813
+ one_five_x_fringe_adder_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6814
+ two_x_fringe_adder_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish()
6657
6815
  }).optional(),
6658
6816
  overtime_package_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).nullish()
6659
6817
  });
@@ -6672,8 +6830,8 @@ export const zProjectWageDeterminationUpdateParameters = z.object({
6672
6830
  overtime_package_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).nullish(),
6673
6831
  labor_classification: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).optional(),
6674
6832
  pwa_trade_id: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).optional(),
6675
- hourly_rate_cents: z.string().optional(),
6676
- fringe_rate_cents: z.string().optional(),
6833
+ hourly_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).optional(),
6834
+ fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).optional(),
6677
6835
  class_code: z.string().nullish(),
6678
6836
  construction_category: z.enum([
6679
6837
  'building',
@@ -6683,15 +6841,15 @@ export const zProjectWageDeterminationUpdateParameters = z.object({
6683
6841
  ]).nullish(),
6684
6842
  general_wage_determination: z.string().nullish(),
6685
6843
  regional_fields: z.object({
6686
- combined_health_fringe_rate_cents: z.string().nullish(),
6687
- combined_savings_fringe_rate_cents: z.string().nullish(),
6688
- combined_holiday_pto_fringe_rate_cents: z.string().nullish(),
6689
- training_fringe_rate_cents: z.string().nullish(),
6690
- other_fringe_rate_cents: z.string().nullish(),
6691
- one_five_x_adder_rate_cents: z.string().nullish(),
6692
- two_x_adder_rate_cents: z.string().nullish(),
6693
- one_five_x_fringe_adder_rate_cents: z.string().nullish(),
6694
- two_x_fringe_adder_rate_cents: z.string().nullish()
6844
+ combined_health_fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6845
+ combined_savings_fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6846
+ combined_holiday_pto_fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6847
+ training_fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6848
+ other_fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6849
+ one_five_x_adder_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6850
+ two_x_adder_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6851
+ one_five_x_fringe_adder_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6852
+ two_x_fringe_adder_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish()
6695
6853
  }).optional()
6696
6854
  });
6697
6855
  /**
@@ -6700,8 +6858,8 @@ export const zProjectWageDeterminationUpdateParameters = z.object({
6700
6858
  export const zProjectWageDeterminationScheduledChangeParameters = z.object({
6701
6859
  effective_date: z.iso.date(),
6702
6860
  labor_classification: z.string().regex(/[^\x09-\x0D\x20…   - ‧-‪   ]|[‧‪]/).optional(),
6703
- hourly_rate_cents: z.string().optional(),
6704
- fringe_rate_cents: z.string().optional(),
6861
+ hourly_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).optional(),
6862
+ fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).optional(),
6705
6863
  class_code: z.string().nullish(),
6706
6864
  construction_category: z.enum([
6707
6865
  'building',
@@ -6711,15 +6869,15 @@ export const zProjectWageDeterminationScheduledChangeParameters = z.object({
6711
6869
  ]).nullish(),
6712
6870
  general_wage_determination: z.string().nullish(),
6713
6871
  regional_fields: z.object({
6714
- combined_health_fringe_rate_cents: z.string().nullish(),
6715
- combined_savings_fringe_rate_cents: z.string().nullish(),
6716
- combined_holiday_pto_fringe_rate_cents: z.string().nullish(),
6717
- training_fringe_rate_cents: z.string().nullish(),
6718
- other_fringe_rate_cents: z.string().nullish(),
6719
- one_five_x_adder_rate_cents: z.string().nullish(),
6720
- two_x_adder_rate_cents: z.string().nullish(),
6721
- one_five_x_fringe_adder_rate_cents: z.string().nullish(),
6722
- two_x_fringe_adder_rate_cents: z.string().nullish()
6872
+ combined_health_fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6873
+ combined_savings_fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6874
+ combined_holiday_pto_fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6875
+ training_fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6876
+ other_fringe_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6877
+ one_five_x_adder_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6878
+ two_x_adder_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6879
+ one_five_x_fringe_adder_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
6880
+ two_x_fringe_adder_rate_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish()
6723
6881
  }).optional()
6724
6882
  });
6725
6883
  /**
@@ -6739,7 +6897,7 @@ export const zProjectWageDeterminationScheduledTerminationParameters = z.object(
6739
6897
  */
6740
6898
  export const zRateRuleEffect = z.object({
6741
6899
  type: z.enum(['wage_increment', 'fringe_increment']),
6742
- amount_cents: z.string()
6900
+ amount_cents: z.string().regex(/^[0-9]+$/)
6743
6901
  });
6744
6902
  /**
6745
6903
  * Restricts the rule to a time-of-day window.
@@ -6901,7 +7059,7 @@ export const zPayRatesRuleParameters = z.object({
6901
7059
  effective_date: z.iso.date().optional(),
6902
7060
  effect: z.object({
6903
7061
  type: z.enum(['wage_increment', 'fringe_increment']),
6904
- amount_cents: z.string()
7062
+ amount_cents: z.string().regex(/^[0-9]+$/)
6905
7063
  }),
6906
7064
  conditions: z.array(z.union([
6907
7065
  zRateRuleTimeRangeCondition,
@@ -6919,7 +7077,7 @@ export const zPayRatesRuleUpdateParameters = z.object({
6919
7077
  effective_from: z.iso.date().optional(),
6920
7078
  effect: z.object({
6921
7079
  type: z.enum(['wage_increment', 'fringe_increment']),
6922
- amount_cents: z.string()
7080
+ amount_cents: z.string().regex(/^[0-9]+$/)
6923
7081
  }).optional(),
6924
7082
  conditions: z.array(z.union([
6925
7083
  zRateRuleTimeRangeCondition,
@@ -6949,7 +7107,7 @@ export const zPayRatesRuleScheduledChangeParameters = z.object({
6949
7107
  effective_date: z.iso.date(),
6950
7108
  effect: z.object({
6951
7109
  type: z.enum(['wage_increment', 'fringe_increment']),
6952
- amount_cents: z.string()
7110
+ amount_cents: z.string().regex(/^[0-9]+$/)
6953
7111
  }).optional(),
6954
7112
  conditions: z.array(z.union([
6955
7113
  zRateRuleTimeRangeCondition,
@@ -7166,7 +7324,7 @@ export const zRateRuleParameters = z.object({
7166
7324
  effective_date: z.iso.date().nullish(),
7167
7325
  effect: z.object({
7168
7326
  type: z.enum(['wage_increment', 'fringe_increment']),
7169
- amount_cents: z.string()
7327
+ amount_cents: z.string().regex(/^[0-9]+$/)
7170
7328
  }),
7171
7329
  conditions: z.array(z.union([
7172
7330
  zRateRuleTimeRangeCondition,
@@ -7186,8 +7344,8 @@ export const zAssetsItemParameters = z.object({
7186
7344
  assets_product_id: z.string(),
7187
7345
  serial_number: z.string().nullish(),
7188
7346
  status: z.enum(['available', 'assigned']).optional(),
7189
- purchase_date: z.string().nullish(),
7190
- purchase_price_cents: z.int().nullish(),
7347
+ purchase_date: z.iso.date().nullish(),
7348
+ purchase_price_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
7191
7349
  external_id: z.string().nullish(),
7192
7350
  external_system_url: z.string().nullish(),
7193
7351
  attribute_values: z.array(z.object({
@@ -7215,8 +7373,8 @@ export const zAssetsItemUpdateParameters = z.object({
7215
7373
  assets_product_id: z.string().optional(),
7216
7374
  serial_number: z.string().nullish(),
7217
7375
  status: z.enum(['available', 'assigned']).optional(),
7218
- purchase_date: z.string().nullish(),
7219
- purchase_price_cents: z.int().nullish(),
7376
+ purchase_date: z.iso.date().nullish(),
7377
+ purchase_price_cents: z.string().regex(/^[0-9]+(\.[0-9]+)?$/).nullish(),
7220
7378
  external_id: z.string().nullish(),
7221
7379
  external_system_url: z.string().nullish(),
7222
7380
  attribute_values: z.array(z.object({
@@ -8898,9 +9056,9 @@ export const zDeleteDocumentPath = z.object({
8898
9056
  id: z.string()
8899
9057
  });
8900
9058
  /**
8901
- * Success
9059
+ * No Content
8902
9060
  */
8903
- export const zDeleteDocumentResponse = zAssetsDocumentResponseObject;
9061
+ export const zDeleteDocumentResponse = z.void();
8904
9062
  export const zGetDocumentPath = z.object({
8905
9063
  item_id: z.string(),
8906
9064
  id: z.string()
@@ -9574,32 +9732,32 @@ export const zGetAssessmentPath = z.object({
9574
9732
  * Success
9575
9733
  */
9576
9734
  export const zGetAssessmentResponse = zCompetencyAssessmentResponseObject;
9577
- export const zListAssessmentKeyActivitiesPath = z.object({
9735
+ export const zListAssessmentCriteriaPath = z.object({
9578
9736
  assessment_id: z.string()
9579
9737
  });
9580
- export const zListAssessmentKeyActivitiesQuery = z.object({
9738
+ export const zListAssessmentCriteriaQuery = z.object({
9581
9739
  filter: z.string().optional(),
9582
9740
  'filter[unexpected]': z.string().optional()
9583
9741
  });
9584
9742
  /**
9585
9743
  * Candidate sees a decided review
9586
9744
  */
9587
- export const zListAssessmentKeyActivitiesResponse = z.object({
9745
+ export const zListAssessmentCriteriaResponse = z.object({
9588
9746
  meta: zMeta,
9589
9747
  links: zLinks,
9590
- data: z.array(zCompetencyAssessmentKeyActivityResponseObject)
9748
+ data: z.array(zCompetencyAssessmentCriterionResponseObject)
9591
9749
  });
9592
- export const zGetAssessmentKeyActivityPath = z.object({
9750
+ export const zGetAssessmentCriterionPath = z.object({
9593
9751
  assessment_id: z.string(),
9594
9752
  id: z.string()
9595
9753
  });
9596
9754
  /**
9597
9755
  * Candidate sees a decided review
9598
9756
  */
9599
- export const zGetAssessmentKeyActivityResponse = zCompetencyAssessmentKeyActivityResponseObject;
9757
+ export const zGetAssessmentCriterionResponse = zCompetencyAssessmentCriterionResponseObject;
9600
9758
  export const zListEvidenceItemsPath = z.object({
9601
9759
  assessment_id: z.string(),
9602
- key_activity_id: z.string()
9760
+ criterion_id: z.string()
9603
9761
  });
9604
9762
  export const zListEvidenceItemsQuery = z.object({
9605
9763
  'filter[kind]': z.enum([
@@ -9620,7 +9778,7 @@ export const zListEvidenceItemsResponse = z.object({
9620
9778
  });
9621
9779
  export const zGetEvidenceItemPath = z.object({
9622
9780
  assessment_id: z.string(),
9623
- key_activity_id: z.string(),
9781
+ criterion_id: z.string(),
9624
9782
  id: z.string()
9625
9783
  });
9626
9784
  /**
@@ -10306,6 +10464,62 @@ export const zUpdateGroupPath = z.object({
10306
10464
  * Success
10307
10465
  */
10308
10466
  export const zUpdateGroupResponse = zGroupResponseObject;
10467
+ export const zListJobDocumentsPath = z.object({
10468
+ job_id: z.string()
10469
+ });
10470
+ export const zListJobDocumentsQuery = z.object({
10471
+ 'filter[type]': z.array(z.enum([
10472
+ 'CERTIFICATIONS',
10473
+ 'CHECKLIST',
10474
+ 'MAP',
10475
+ 'MSA',
10476
+ 'ONSITE_POSTER',
10477
+ 'OTHER',
10478
+ 'PARTS_INSTRUCTIONS',
10479
+ 'PHOTO',
10480
+ 'PO',
10481
+ 'PWA_DOCUMENTATION',
10482
+ 'RESUME',
10483
+ 'WO'
10484
+ ])).optional()
10485
+ });
10486
+ /**
10487
+ * Success
10488
+ */
10489
+ export const zListJobDocumentsResponse = zJobDocumentsResponseObject;
10490
+ export const zCreateJobDocumentBody = zJobDocumentParameters;
10491
+ export const zCreateJobDocumentPath = z.object({
10492
+ job_id: z.string()
10493
+ });
10494
+ /**
10495
+ * Created
10496
+ */
10497
+ export const zCreateJobDocumentResponse = zJobDocumentResponseObject;
10498
+ export const zDeleteJobDocumentPath = z.object({
10499
+ job_id: z.string(),
10500
+ id: z.string()
10501
+ });
10502
+ /**
10503
+ * No Content
10504
+ */
10505
+ export const zDeleteJobDocumentResponse = z.void();
10506
+ export const zGetJobDocumentPath = z.object({
10507
+ job_id: z.string(),
10508
+ id: z.string()
10509
+ });
10510
+ /**
10511
+ * Success
10512
+ */
10513
+ export const zGetJobDocumentResponse = zJobDocumentResponseObject;
10514
+ export const zUpdateJobDocumentBody = zJobDocumentUpdateParameters;
10515
+ export const zUpdateJobDocumentPath = z.object({
10516
+ job_id: z.string(),
10517
+ id: z.string()
10518
+ });
10519
+ /**
10520
+ * Success
10521
+ */
10522
+ export const zUpdateJobDocumentResponse = zJobDocumentResponseObject;
10309
10523
  export const zListJobFormAssignmentTasksPath = z.object({
10310
10524
  job_id: z.string()
10311
10525
  });
@@ -12231,6 +12445,48 @@ export const zUpdateProjectSitePath = z.object({
12231
12445
  * Success
12232
12446
  */
12233
12447
  export const zUpdateProjectSiteResponse = zProjectSiteResponseObject;
12448
+ export const zListUserVisibilitiesPath = z.object({
12449
+ project_id: z.string()
12450
+ });
12451
+ export const zListUserVisibilitiesQuery = z.object({
12452
+ 'page[cursor]': z.string().optional(),
12453
+ 'page[limit]': z.int().gte(1).optional().default(20),
12454
+ page: z.string().optional(),
12455
+ filter: z.string().optional(),
12456
+ 'filter[unexpected]': z.string().optional()
12457
+ });
12458
+ /**
12459
+ * Success
12460
+ */
12461
+ export const zListUserVisibilitiesResponse = z.object({
12462
+ meta: zMeta,
12463
+ links: zLinks,
12464
+ data: z.array(zProjectUserVisibilityResponseObject)
12465
+ });
12466
+ export const zCreateUserVisibilityBody = zProjectUserVisibilityParameters;
12467
+ export const zCreateUserVisibilityPath = z.object({
12468
+ project_id: z.string()
12469
+ });
12470
+ /**
12471
+ * Created
12472
+ */
12473
+ export const zCreateUserVisibilityResponse = zProjectUserVisibilityResponseObject;
12474
+ export const zDeleteUserVisibilityPath = z.object({
12475
+ project_id: z.string(),
12476
+ id: z.string()
12477
+ });
12478
+ /**
12479
+ * No Content
12480
+ */
12481
+ export const zDeleteUserVisibilityResponse = z.void();
12482
+ export const zGetUserVisibilityPath = z.object({
12483
+ project_id: z.string(),
12484
+ id: z.string()
12485
+ });
12486
+ /**
12487
+ * Success
12488
+ */
12489
+ export const zGetUserVisibilityResponse = zProjectUserVisibilityResponseObject;
12234
12490
  export const zShiftProjectWageDeterminationGenesisBody = zProjectWageDeterminationGenesisParameters;
12235
12491
  export const zShiftProjectWageDeterminationGenesisHeaders = z.object({
12236
12492
  'If-Match': z.string()
@@ -13417,6 +13673,9 @@ export const zCreateCompanyPath = z.object({
13417
13673
  * Created
13418
13674
  */
13419
13675
  export const zCreateCompanyResponse = zUserResponseObject;
13676
+ export const zRemoveUserFromCompanyHeaders = z.object({
13677
+ 'If-Match': z.string()
13678
+ });
13420
13679
  export const zRemoveUserFromCompanyPath = z.object({
13421
13680
  user_id: z.string(),
13422
13681
  id: z.string()