@dsptch-work/api-client 0.26.0 → 0.27.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.
@@ -2210,7 +2210,7 @@ export class UserCertifications {
2210
2210
  /**
2211
2211
  * Approve user certification
2212
2212
  *
2213
- * Records who approved a certification held by a worker and stamps when. A user key approves in its own user's name; a company key names the approver. The approver must be an admin, manager, or safety manager at a company that employs the holder, and cannot be the holder.
2213
+ * Records who approved a certification held by a worker and stamps when. A user key approves in its own user's name; a company key names the approver. A company key must name a visible admin, manager, or safety manager at its company. A user key needs an approving role at a company that employs the holder. The approver cannot be the holder.
2214
2214
  *
2215
2215
  * **Required scope:**
2216
2216
  *
@@ -2437,8 +2437,9 @@ export class CompaniesDepartments {
2437
2437
  *
2438
2438
  * Deletes a department that has no employment assignments. A department still
2439
2439
  * assigned on any employment is refused with a `422` — reassign those
2440
- * employments first. An unused department returns `204` and is gone from a
2441
- * later GET.
2440
+ * employments first. Deleting a department clears its assignment on jobs
2441
+ * while preserving those jobs. A successful deletion returns `204` and the
2442
+ * department is gone from a later GET.
2442
2443
  *
2443
2444
  *
2444
2445
  * **Required scope:**
@@ -2977,42 +2978,45 @@ export class Groups {
2977
2978
  });
2978
2979
  }
2979
2980
  }
2980
- export class ProductionJobScopePrices {
2981
+ export class Jobs {
2981
2982
  /**
2982
- * List production job scope prices
2983
+ * List form assignment tasks for job
2983
2984
  *
2984
- * Scope prices on a production-tracked job. Company keys,
2985
- * and user keys held by an administrator, manager, safety
2986
- * manager, or field lead of the company that owns the job,
2987
- * receive `unit_price` and `contracted_count`. Other user
2988
- * keys, held by crew on the job, receive the same rows
2989
- * without those two fields.
2985
+ * Returns form-completion tasks nested on the named job.
2986
+ * `{id}` is the `Tasks::JobFormAssignmentTask` id, not the web
2987
+ * show `Task#uid`. A missing or out-of-scope job reads as not
2988
+ * found.
2990
2989
  *
2991
2990
  *
2992
2991
  * **Required scope:**
2993
2992
  *
2994
- * `jobs.production.job_scope_prices:read`
2993
+ * `jobs.form_assignment_tasks:read`
2995
2994
  *
2996
2995
  */
2997
- static listJobScopePrices(options) {
2996
+ static listJobFormAssignmentTasks(options) {
2998
2997
  return (options.client ?? client).get({
2999
2998
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3000
- url: '/api/v1/jobs/{job_id}/production/job_scope_prices',
2999
+ url: '/api/v1/jobs/{job_id}/form_assignment_tasks',
3001
3000
  ...options
3002
3001
  });
3003
3002
  }
3004
3003
  /**
3005
- * Create production job scope price
3004
+ * Create form assignment task for job
3005
+ *
3006
+ * Creates a form-completion task on the named job. `job_id` is
3007
+ * the path only. `form_definition_id` and
3008
+ * `task_attributes.created_by_user_id` are required.
3009
+ *
3006
3010
  *
3007
3011
  * **Required scope:**
3008
3012
  *
3009
- * `jobs.production.job_scope_prices:create`
3013
+ * `jobs.form_assignment_tasks:create`
3010
3014
  *
3011
3015
  */
3012
- static createJobScopePrice(options) {
3016
+ static createJobFormAssignmentTask(options) {
3013
3017
  return (options.client ?? client).post({
3014
3018
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3015
- url: '/api/v1/jobs/{job_id}/production/job_scope_prices',
3019
+ url: '/api/v1/jobs/{job_id}/form_assignment_tasks',
3016
3020
  ...options,
3017
3021
  headers: {
3018
3022
  'Content-Type': 'application/json',
@@ -3021,55 +3025,86 @@ export class ProductionJobScopePrices {
3021
3025
  });
3022
3026
  }
3023
3027
  /**
3024
- * Delete production job scope price
3028
+ * Show form assignment task on job
3029
+ *
3030
+ * Returns one form-completion task on the named job. `{id}` is
3031
+ * the `Tasks::JobFormAssignmentTask` id. A missing, misnested,
3032
+ * or out-of-scope id reads as not found.
3033
+ *
3025
3034
  *
3026
3035
  * **Required scope:**
3027
3036
  *
3028
- * `jobs.production.job_scope_prices:delete`
3037
+ * `jobs.form_assignment_tasks:read`
3029
3038
  *
3030
3039
  */
3031
- static deleteJobScopePrice(options) {
3032
- return (options.client ?? client).delete({
3040
+ static getJobFormAssignmentTask(options) {
3041
+ return (options.client ?? client).get({
3033
3042
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3034
- url: '/api/v1/jobs/{job_id}/production/job_scope_prices/{id}',
3043
+ url: '/api/v1/jobs/{job_id}/form_assignment_tasks/{id}',
3035
3044
  ...options
3036
3045
  });
3037
3046
  }
3038
3047
  /**
3039
- * Show production job scope price
3048
+ * Update form assignment task on job
3040
3049
  *
3041
- * One scope price on a production-tracked job. Company keys,
3042
- * and user keys held by an administrator, manager, safety
3043
- * manager, or field lead of the company that owns the job,
3044
- * receive `unit_price` and `contracted_count`. Other user
3045
- * keys, held by crew on the job, receive the price without
3046
- * those two fields.
3050
+ * Updates the existing task in place. `job_id` is the path only.
3051
+ * Replacing `task_assignee_user_ids` does not insert join rows
3052
+ * before authorize.
3047
3053
  *
3048
3054
  *
3049
3055
  * **Required scope:**
3050
3056
  *
3051
- * `jobs.production.job_scope_prices:read`
3057
+ * `jobs.form_assignment_tasks:update`
3052
3058
  *
3053
3059
  */
3054
- static getJobScopePrice(options) {
3060
+ static updateJobFormAssignmentTask(options) {
3061
+ return (options.client ?? client).patch({
3062
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3063
+ url: '/api/v1/jobs/{job_id}/form_assignment_tasks/{id}',
3064
+ ...options,
3065
+ headers: {
3066
+ 'Content-Type': 'application/json',
3067
+ ...options.headers
3068
+ }
3069
+ });
3070
+ }
3071
+ /**
3072
+ * List sites for job
3073
+ *
3074
+ * Returns the job-site join rows on the named job. `{id}` is the
3075
+ * join row, not the Site. A missing or out-of-scope job reads as
3076
+ * not found.
3077
+ *
3078
+ *
3079
+ * **Required scope:**
3080
+ *
3081
+ * `jobs.sites:read`
3082
+ *
3083
+ */
3084
+ static listJobSites(options) {
3055
3085
  return (options.client ?? client).get({
3056
3086
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3057
- url: '/api/v1/jobs/{job_id}/production/job_scope_prices/{id}',
3087
+ url: '/api/v1/jobs/{job_id}/sites',
3058
3088
  ...options
3059
3089
  });
3060
3090
  }
3061
3091
  /**
3062
- * Update production job scope price
3092
+ * Create site for job
3093
+ *
3094
+ * Attaches a Site to the named job. `job_id` is the path only.
3095
+ * `site_id` is required; `feature_ids` is optional and replaced
3096
+ * as a set. Duplicate (job, site) pairs are rejected.
3097
+ *
3063
3098
  *
3064
3099
  * **Required scope:**
3065
3100
  *
3066
- * `jobs.production.job_scope_prices:update`
3101
+ * `jobs.sites:create`
3067
3102
  *
3068
3103
  */
3069
- static updateJobScopePrice(options) {
3070
- return (options.client ?? client).patch({
3104
+ static createJobSite(options) {
3105
+ return (options.client ?? client).post({
3071
3106
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3072
- url: '/api/v1/jobs/{job_id}/production/job_scope_prices/{id}',
3107
+ url: '/api/v1/jobs/{job_id}/sites',
3073
3108
  ...options,
3074
3109
  headers: {
3075
3110
  'Content-Type': 'application/json',
@@ -3077,39 +3112,61 @@ export class ProductionJobScopePrices {
3077
3112
  }
3078
3113
  });
3079
3114
  }
3080
- }
3081
- export class PwaTrades {
3082
3115
  /**
3083
- * Create Job Trade
3116
+ * Delete site on job
3117
+ *
3118
+ * Removes the job-site join. The Site itself is not deleted.
3119
+ * Job-site features cascade with the join. A job may have zero
3120
+ * sites afterward.
3121
+ *
3084
3122
  *
3085
3123
  * **Required scope:**
3086
3124
  *
3087
- * `jobs.pwa.trades:create`
3125
+ * `jobs.sites:delete`
3088
3126
  *
3089
3127
  */
3090
- static createJobTrade(options) {
3091
- return (options.client ?? client).post({
3128
+ static deleteJobSite(options) {
3129
+ return (options.client ?? client).delete({
3092
3130
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3093
- url: '/api/v1/jobs/{job_id}/pwa/trades',
3094
- ...options,
3095
- headers: {
3096
- 'Content-Type': 'application/json',
3097
- ...options.headers
3098
- }
3131
+ url: '/api/v1/jobs/{job_id}/sites/{id}',
3132
+ ...options
3099
3133
  });
3100
3134
  }
3101
3135
  /**
3102
- * Create Project Trade
3136
+ * Show site on job
3137
+ *
3138
+ * Returns one job-site join on the named job. `{id}` is the join
3139
+ * row. A missing, misnested, or out-of-scope id reads as not found.
3140
+ *
3103
3141
  *
3104
3142
  * **Required scope:**
3105
3143
  *
3106
- * `projects.pwa.trades:create`
3144
+ * `jobs.sites:read`
3107
3145
  *
3108
3146
  */
3109
- static createProjectTrade(options) {
3110
- return (options.client ?? client).post({
3147
+ static getJobSite(options) {
3148
+ return (options.client ?? client).get({
3111
3149
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3112
- url: '/api/v1/projects/{project_id}/pwa/trades',
3150
+ url: '/api/v1/jobs/{job_id}/sites/{id}',
3151
+ ...options
3152
+ });
3153
+ }
3154
+ /**
3155
+ * Update site on job
3156
+ *
3157
+ * Replaces `feature_ids` on an existing job-site join. `site_id`
3158
+ * cannot be changed. An empty array clears every feature.
3159
+ *
3160
+ *
3161
+ * **Required scope:**
3162
+ *
3163
+ * `jobs.sites:update`
3164
+ *
3165
+ */
3166
+ static updateJobSite(options) {
3167
+ return (options.client ?? client).patch({
3168
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3169
+ url: '/api/v1/jobs/{job_id}/sites/{id}',
3113
3170
  ...options,
3114
3171
  headers: {
3115
3172
  'Content-Type': 'application/json',
@@ -3118,32 +3175,32 @@ export class PwaTrades {
3118
3175
  });
3119
3176
  }
3120
3177
  /**
3121
- * Merge Trade
3122
- *
3123
- * Folds the craft named in the path into another in the same pool. Every wage
3124
- * determination grouped under it re-points onto the target, its apprentice-scope
3125
- * decisions carry over where the target holds none of its own, and the emptied
3126
- * craft is deleted — all in one transaction.
3178
+ * List jobs
3127
3179
  *
3128
- * Use this rather than `DELETE` when the craft still groups determinations:
3129
- * deleting one is refused precisely because it would orphan them, and merging
3130
- * moves them first.
3180
+ * **Required scope:**
3131
3181
  *
3132
- * Nothing about the determinations' rates changes; only which craft they pool
3133
- * into. The response is the surviving craft. Regrouping re-prices the charged
3134
- * hours and recomputes federal apprenticeship ratio statuses in the background,
3135
- * so compliance figures may move after this returns.
3182
+ * `jobs:read`
3136
3183
  *
3184
+ */
3185
+ static listJobs(options) {
3186
+ return (options?.client ?? client).get({
3187
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3188
+ url: '/api/v1/jobs',
3189
+ ...options
3190
+ });
3191
+ }
3192
+ /**
3193
+ * Create job
3137
3194
  *
3138
3195
  * **Required scope:**
3139
3196
  *
3140
- * `pwa.trades.merges:create`
3197
+ * `jobs:create`
3141
3198
  *
3142
3199
  */
3143
- static createMerge(options) {
3200
+ static createJob(options) {
3144
3201
  return (options.client ?? client).post({
3145
3202
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3146
- url: '/api/v1/pwa/trades/{trade_id}/merges',
3203
+ url: '/api/v1/jobs',
3147
3204
  ...options,
3148
3205
  headers: {
3149
3206
  'Content-Type': 'application/json',
@@ -3152,76 +3209,70 @@ export class PwaTrades {
3152
3209
  });
3153
3210
  }
3154
3211
  /**
3155
- * List trades
3212
+ * Show job
3156
3213
  *
3157
3214
  * **Required scope:**
3158
3215
  *
3159
- * `pwa.trades:read`
3216
+ * `jobs:read`
3160
3217
  *
3161
3218
  */
3162
- static listTrades(options) {
3163
- return (options?.client ?? client).get({
3219
+ static getJob(options) {
3220
+ return (options.client ?? client).get({
3164
3221
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3165
- url: '/api/v1/pwa/trades',
3222
+ url: '/api/v1/jobs/{id}',
3166
3223
  ...options
3167
3224
  });
3168
3225
  }
3169
3226
  /**
3170
- * Delete Trade
3171
- *
3172
- * Deletes an empty craft. A trade still grouping wage determinations, or still
3173
- * carrying apprentice-scope decisions, is refused with a `422` — deleting it would
3174
- * orphan what points at it. Merge it into another craft instead, which moves the
3175
- * determinations first.
3176
- *
3227
+ * Update job
3177
3228
  *
3178
3229
  * **Required scope:**
3179
3230
  *
3180
- * `pwa.trades:delete`
3231
+ * `jobs:update`
3181
3232
  *
3182
3233
  */
3183
- static deleteTrade(options) {
3184
- return (options.client ?? client).delete({
3234
+ static updateJob(options) {
3235
+ return (options.client ?? client).patch({
3185
3236
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3186
- url: '/api/v1/pwa/trades/{id}',
3187
- ...options
3237
+ url: '/api/v1/jobs/{id}',
3238
+ ...options,
3239
+ headers: {
3240
+ 'Content-Type': 'application/json',
3241
+ ...options.headers
3242
+ }
3188
3243
  });
3189
3244
  }
3190
3245
  /**
3191
- * Show trade
3246
+ * List positions for job
3192
3247
  *
3193
3248
  * **Required scope:**
3194
3249
  *
3195
- * `pwa.trades:read`
3250
+ * `jobs.positions:read`
3196
3251
  *
3197
3252
  */
3198
- static getTrade(options) {
3253
+ static listPositions(options) {
3199
3254
  return (options.client ?? client).get({
3200
3255
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3201
- url: '/api/v1/pwa/trades/{id}',
3256
+ url: '/api/v1/jobs/{job_id}/positions',
3202
3257
  ...options
3203
3258
  });
3204
3259
  }
3205
3260
  /**
3206
- * Rename Trade
3207
- *
3208
- * Renames the craft. The name is a display label the compliance engines ignore —
3209
- * they group by trade — so a rename regroups nothing and re-prices nothing. The
3210
- * craft's match key is fixed at creation and is not renamed with it.
3261
+ * Create position for job
3211
3262
  *
3212
- * To move determinations between crafts, re-point each one's `pwa_trade_id`
3213
- * rather than renaming the craft they share.
3263
+ * cash_fringe_rate_cents, hourly_rate_cents, pwa_wage_pay_rate_cents and
3264
+ * wage_adder_rate_cents are admin only on user-scoped keys.
3214
3265
  *
3215
3266
  *
3216
3267
  * **Required scope:**
3217
3268
  *
3218
- * `pwa.trades:update`
3269
+ * `jobs.positions:create`
3219
3270
  *
3220
3271
  */
3221
- static updateTrade(options) {
3222
- return (options.client ?? client).patch({
3272
+ static createPosition(options) {
3273
+ return (options.client ?? client).post({
3223
3274
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3224
- url: '/api/v1/pwa/trades/{id}',
3275
+ url: '/api/v1/jobs/{job_id}/positions',
3225
3276
  ...options,
3226
3277
  headers: {
3227
3278
  'Content-Type': 'application/json',
@@ -3229,65 +3280,63 @@ export class PwaTrades {
3229
3280
  }
3230
3281
  });
3231
3282
  }
3232
- }
3233
- export class JobWageDeterminationRateRules {
3234
3283
  /**
3235
- * List rate rule version history
3236
- *
3237
- * A rule's whole valid-time sequence, newest window first and cursor-paginated.
3238
- * Each entry is a full rate rule carrying its own `valid_from` / `valid_to`
3239
- * window and a `version_status` of `scheduled`, `current` or `historical`. An
3240
- * entry carries the family key as `pay_rates_rule_id` and no `id` or `uid` of
3241
- * its own — every version shares the family key, so versions are told apart by
3242
- * their window coordinates.
3284
+ * Delete position on job
3243
3285
  *
3244
- * `corrections` is always empty here: a rule keeps no audit layer, so what a
3245
- * version replaced was not recorded. The field is still returned, because the
3246
- * timeline answers one shape across every temporal resource. `as_of[valid]` is
3247
- * rejected, since pinning a point on the valid axis would collapse the sequence
3248
- * this endpoint returns, and a rule records no transaction axis to read
3249
- * `as_of[transaction]` against.
3286
+ * Deletes a position that has no logged work and no restricting
3287
+ * associations. A position still referenced by time entries,
3288
+ * time-card per diems, completion positions, or aggregate logged
3289
+ * work is refused with a `422`. An unused position returns `204`
3290
+ * and is gone from a later GET.
3250
3291
  *
3251
3292
  *
3252
3293
  * **Required scope:**
3253
3294
  *
3254
- * `jobs.pwa.wage_determinations.rate_rules.history:read`
3295
+ * `jobs.positions:delete`
3255
3296
  *
3256
3297
  */
3257
- static listRateRuleHistory(options) {
3258
- return (options.client ?? client).get({
3298
+ static deletePosition(options) {
3299
+ return (options.client ?? client).delete({
3259
3300
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3260
- url: '/api/v1/jobs/{job_id}/wage_determinations/{wage_determination_id}/rate_rules/{rate_rule_id}/history',
3301
+ url: '/api/v1/jobs/{job_id}/positions/{id}',
3261
3302
  ...options
3262
3303
  });
3263
3304
  }
3264
3305
  /**
3265
- * List rate rules
3306
+ * Show position on job
3307
+ *
3308
+ * Returns one position on the named job. A missing, misnested, or
3309
+ * out-of-scope id reads as not found.
3310
+ *
3266
3311
  *
3267
3312
  * **Required scope:**
3268
3313
  *
3269
- * `jobs.pwa.wage_determinations.rate_rules:read`
3314
+ * `jobs.positions:read`
3270
3315
  *
3271
3316
  */
3272
- static listRateRules(options) {
3317
+ static getPosition(options) {
3273
3318
  return (options.client ?? client).get({
3274
3319
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3275
- url: '/api/v1/jobs/{job_id}/wage_determinations/{wage_determination_id}/rate_rules',
3320
+ url: '/api/v1/jobs/{job_id}/positions/{id}',
3276
3321
  ...options
3277
3322
  });
3278
3323
  }
3279
3324
  /**
3280
- * Create rate rule
3325
+ * Update position on job
3326
+ *
3327
+ * cash_fringe_rate_cents, hourly_rate_cents, pwa_wage_pay_rate_cents and
3328
+ * wage_adder_rate_cents are admin only on user-scoped keys.
3329
+ *
3281
3330
  *
3282
3331
  * **Required scope:**
3283
3332
  *
3284
- * `jobs.pwa.wage_determinations.rate_rules:create`
3333
+ * `jobs.positions:update`
3285
3334
  *
3286
3335
  */
3287
- static createRateRule(options) {
3288
- return (options.client ?? client).post({
3336
+ static updatePosition(options) {
3337
+ return (options.client ?? client).patch({
3289
3338
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3290
- url: '/api/v1/jobs/{job_id}/wage_determinations/{wage_determination_id}/rate_rules',
3339
+ url: '/api/v1/jobs/{job_id}/positions/{id}',
3291
3340
  ...options,
3292
3341
  headers: {
3293
3342
  'Content-Type': 'application/json',
@@ -3296,59 +3345,57 @@ export class JobWageDeterminationRateRules {
3296
3345
  });
3297
3346
  }
3298
3347
  /**
3299
- * Show rate rule
3348
+ * List job templates
3300
3349
  *
3301
3350
  * **Required scope:**
3302
3351
  *
3303
- * `jobs.pwa.wage_determinations.rate_rules:read`
3352
+ * `jobs.templates:read`
3304
3353
  *
3305
3354
  */
3306
- static getRateRule(options) {
3307
- return (options.client ?? client).get({
3355
+ static listTemplates(options) {
3356
+ return (options?.client ?? client).get({
3308
3357
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3309
- url: '/api/v1/jobs/{job_id}/wage_determinations/{wage_determination_id}/rate_rules/{id}',
3358
+ url: '/api/v1/jobs/templates',
3310
3359
  ...options
3311
3360
  });
3312
3361
  }
3313
3362
  }
3314
- export class Jobs {
3363
+ export class ProductionJobScopePrices {
3315
3364
  /**
3316
- * List sites for job
3365
+ * List production job scope prices
3317
3366
  *
3318
- * Returns the job-site join rows on the named job. `{id}` is the
3319
- * join row, not the Site. A missing or out-of-scope job reads as
3320
- * not found.
3367
+ * Scope prices on a production-tracked job. Company keys,
3368
+ * and user keys held by an administrator, manager, safety
3369
+ * manager, or field lead of the company that owns the job,
3370
+ * receive `unit_price` and `contracted_count`. Other user
3371
+ * keys, held by crew on the job, receive the same rows
3372
+ * without those two fields.
3321
3373
  *
3322
3374
  *
3323
3375
  * **Required scope:**
3324
3376
  *
3325
- * `jobs.sites:read`
3377
+ * `jobs.production.job_scope_prices:read`
3326
3378
  *
3327
3379
  */
3328
- static listJobSites(options) {
3380
+ static listJobScopePrices(options) {
3329
3381
  return (options.client ?? client).get({
3330
3382
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3331
- url: '/api/v1/jobs/{job_id}/sites',
3383
+ url: '/api/v1/jobs/{job_id}/production/job_scope_prices',
3332
3384
  ...options
3333
3385
  });
3334
3386
  }
3335
3387
  /**
3336
- * Create site for job
3337
- *
3338
- * Attaches a Site to the named job. `job_id` is the path only.
3339
- * `site_id` is required; `feature_ids` is optional and replaced
3340
- * as a set. Duplicate (job, site) pairs are rejected.
3341
- *
3388
+ * Create production job scope price
3342
3389
  *
3343
3390
  * **Required scope:**
3344
3391
  *
3345
- * `jobs.sites:create`
3392
+ * `jobs.production.job_scope_prices:create`
3346
3393
  *
3347
3394
  */
3348
- static createJobSite(options) {
3395
+ static createJobScopePrice(options) {
3349
3396
  return (options.client ?? client).post({
3350
3397
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3351
- url: '/api/v1/jobs/{job_id}/sites',
3398
+ url: '/api/v1/jobs/{job_id}/production/job_scope_prices',
3352
3399
  ...options,
3353
3400
  headers: {
3354
3401
  'Content-Type': 'application/json',
@@ -3357,60 +3404,76 @@ export class Jobs {
3357
3404
  });
3358
3405
  }
3359
3406
  /**
3360
- * Delete site on job
3361
- *
3362
- * Removes the job-site join. The Site itself is not deleted.
3363
- * Job-site features cascade with the join. A job may have zero
3364
- * sites afterward.
3365
- *
3407
+ * Delete production job scope price
3366
3408
  *
3367
3409
  * **Required scope:**
3368
3410
  *
3369
- * `jobs.sites:delete`
3411
+ * `jobs.production.job_scope_prices:delete`
3370
3412
  *
3371
3413
  */
3372
- static deleteJobSite(options) {
3414
+ static deleteJobScopePrice(options) {
3373
3415
  return (options.client ?? client).delete({
3374
3416
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3375
- url: '/api/v1/jobs/{job_id}/sites/{id}',
3417
+ url: '/api/v1/jobs/{job_id}/production/job_scope_prices/{id}',
3376
3418
  ...options
3377
3419
  });
3378
3420
  }
3379
3421
  /**
3380
- * Show site on job
3422
+ * Show production job scope price
3381
3423
  *
3382
- * Returns one job-site join on the named job. `{id}` is the join
3383
- * row. A missing, misnested, or out-of-scope id reads as not found.
3424
+ * One scope price on a production-tracked job. Company keys,
3425
+ * and user keys held by an administrator, manager, safety
3426
+ * manager, or field lead of the company that owns the job,
3427
+ * receive `unit_price` and `contracted_count`. Other user
3428
+ * keys, held by crew on the job, receive the price without
3429
+ * those two fields.
3384
3430
  *
3385
3431
  *
3386
3432
  * **Required scope:**
3387
3433
  *
3388
- * `jobs.sites:read`
3434
+ * `jobs.production.job_scope_prices:read`
3389
3435
  *
3390
3436
  */
3391
- static getJobSite(options) {
3437
+ static getJobScopePrice(options) {
3392
3438
  return (options.client ?? client).get({
3393
3439
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3394
- url: '/api/v1/jobs/{job_id}/sites/{id}',
3440
+ url: '/api/v1/jobs/{job_id}/production/job_scope_prices/{id}',
3395
3441
  ...options
3396
3442
  });
3397
3443
  }
3398
3444
  /**
3399
- * Update site on job
3445
+ * Update production job scope price
3400
3446
  *
3401
- * Replaces `feature_ids` on an existing job-site join. `site_id`
3402
- * cannot be changed. An empty array clears every feature.
3447
+ * **Required scope:**
3403
3448
  *
3449
+ * `jobs.production.job_scope_prices:update`
3450
+ *
3451
+ */
3452
+ static updateJobScopePrice(options) {
3453
+ return (options.client ?? client).patch({
3454
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3455
+ url: '/api/v1/jobs/{job_id}/production/job_scope_prices/{id}',
3456
+ ...options,
3457
+ headers: {
3458
+ 'Content-Type': 'application/json',
3459
+ ...options.headers
3460
+ }
3461
+ });
3462
+ }
3463
+ }
3464
+ export class PwaTrades {
3465
+ /**
3466
+ * Create Job Trade
3404
3467
  *
3405
3468
  * **Required scope:**
3406
3469
  *
3407
- * `jobs.sites:update`
3470
+ * `jobs.pwa.trades:create`
3408
3471
  *
3409
3472
  */
3410
- static updateJobSite(options) {
3411
- return (options.client ?? client).patch({
3473
+ static createJobTrade(options) {
3474
+ return (options.client ?? client).post({
3412
3475
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3413
- url: '/api/v1/jobs/{job_id}/sites/{id}',
3476
+ url: '/api/v1/jobs/{job_id}/pwa/trades',
3414
3477
  ...options,
3415
3478
  headers: {
3416
3479
  'Content-Type': 'application/json',
@@ -3419,32 +3482,51 @@ export class Jobs {
3419
3482
  });
3420
3483
  }
3421
3484
  /**
3422
- * List jobs
3485
+ * Create Project Trade
3423
3486
  *
3424
3487
  * **Required scope:**
3425
3488
  *
3426
- * `jobs:read`
3489
+ * `projects.pwa.trades:create`
3427
3490
  *
3428
3491
  */
3429
- static listJobs(options) {
3430
- return (options?.client ?? client).get({
3492
+ static createProjectTrade(options) {
3493
+ return (options.client ?? client).post({
3431
3494
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3432
- url: '/api/v1/jobs',
3433
- ...options
3495
+ url: '/api/v1/projects/{project_id}/pwa/trades',
3496
+ ...options,
3497
+ headers: {
3498
+ 'Content-Type': 'application/json',
3499
+ ...options.headers
3500
+ }
3434
3501
  });
3435
3502
  }
3436
3503
  /**
3437
- * Create job
3504
+ * Merge Trade
3505
+ *
3506
+ * Folds the craft named in the path into another in the same pool. Every wage
3507
+ * determination grouped under it re-points onto the target, its apprentice-scope
3508
+ * decisions carry over where the target holds none of its own, and the emptied
3509
+ * craft is deleted — all in one transaction.
3510
+ *
3511
+ * Use this rather than `DELETE` when the craft still groups determinations:
3512
+ * deleting one is refused precisely because it would orphan them, and merging
3513
+ * moves them first.
3514
+ *
3515
+ * Nothing about the determinations' rates changes; only which craft they pool
3516
+ * into. The response is the surviving craft. Regrouping re-prices the charged
3517
+ * hours and recomputes federal apprenticeship ratio statuses in the background,
3518
+ * so compliance figures may move after this returns.
3519
+ *
3438
3520
  *
3439
3521
  * **Required scope:**
3440
3522
  *
3441
- * `jobs:create`
3523
+ * `pwa.trades.merges:create`
3442
3524
  *
3443
3525
  */
3444
- static createJob(options) {
3526
+ static createMerge(options) {
3445
3527
  return (options.client ?? client).post({
3446
3528
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3447
- url: '/api/v1/jobs',
3529
+ url: '/api/v1/pwa/trades/{trade_id}/merges',
3448
3530
  ...options,
3449
3531
  headers: {
3450
3532
  'Content-Type': 'application/json',
@@ -3453,70 +3535,76 @@ export class Jobs {
3453
3535
  });
3454
3536
  }
3455
3537
  /**
3456
- * Show job
3538
+ * List trades
3457
3539
  *
3458
3540
  * **Required scope:**
3459
3541
  *
3460
- * `jobs:read`
3542
+ * `pwa.trades:read`
3461
3543
  *
3462
3544
  */
3463
- static getJob(options) {
3464
- return (options.client ?? client).get({
3545
+ static listTrades(options) {
3546
+ return (options?.client ?? client).get({
3465
3547
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3466
- url: '/api/v1/jobs/{id}',
3548
+ url: '/api/v1/pwa/trades',
3467
3549
  ...options
3468
3550
  });
3469
3551
  }
3470
3552
  /**
3471
- * Update job
3553
+ * Delete Trade
3554
+ *
3555
+ * Deletes an empty craft. A trade still grouping wage determinations, or still
3556
+ * carrying apprentice-scope decisions, is refused with a `422` — deleting it would
3557
+ * orphan what points at it. Merge it into another craft instead, which moves the
3558
+ * determinations first.
3559
+ *
3472
3560
  *
3473
3561
  * **Required scope:**
3474
3562
  *
3475
- * `jobs:update`
3563
+ * `pwa.trades:delete`
3476
3564
  *
3477
3565
  */
3478
- static updateJob(options) {
3479
- return (options.client ?? client).patch({
3566
+ static deleteTrade(options) {
3567
+ return (options.client ?? client).delete({
3480
3568
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3481
- url: '/api/v1/jobs/{id}',
3482
- ...options,
3483
- headers: {
3484
- 'Content-Type': 'application/json',
3485
- ...options.headers
3486
- }
3569
+ url: '/api/v1/pwa/trades/{id}',
3570
+ ...options
3487
3571
  });
3488
3572
  }
3489
3573
  /**
3490
- * List positions for job
3574
+ * Show trade
3491
3575
  *
3492
3576
  * **Required scope:**
3493
3577
  *
3494
- * `jobs.positions:read`
3578
+ * `pwa.trades:read`
3495
3579
  *
3496
3580
  */
3497
- static listPositions(options) {
3581
+ static getTrade(options) {
3498
3582
  return (options.client ?? client).get({
3499
3583
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3500
- url: '/api/v1/jobs/{job_id}/positions',
3584
+ url: '/api/v1/pwa/trades/{id}',
3501
3585
  ...options
3502
3586
  });
3503
3587
  }
3504
3588
  /**
3505
- * Create position for job
3589
+ * Rename Trade
3506
3590
  *
3507
- * cash_fringe_rate_cents, hourly_rate_cents, pwa_wage_pay_rate_cents and
3508
- * wage_adder_rate_cents are admin only on user-scoped keys.
3591
+ * Renames the craft. The name is a display label the compliance engines ignore —
3592
+ * they group by trade — so a rename regroups nothing and re-prices nothing. The
3593
+ * craft's match key is fixed at creation and is not renamed with it.
3594
+ *
3595
+ * To move determinations between crafts, re-point each one's `pwa_trade_id`
3596
+ * rather than renaming the craft they share.
3509
3597
  *
3510
3598
  *
3511
3599
  * **Required scope:**
3512
3600
  *
3513
- * `jobs.positions:create`
3601
+ * `pwa.trades:update`
3514
3602
  *
3515
3603
  */
3516
- static createPosition(options) {
3517
- return (options.client ?? client).post({
3604
+ static updateTrade(options) {
3605
+ return (options.client ?? client).patch({
3518
3606
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3519
- url: '/api/v1/jobs/{job_id}/positions',
3607
+ url: '/api/v1/pwa/trades/{id}',
3520
3608
  ...options,
3521
3609
  headers: {
3522
3610
  'Content-Type': 'application/json',
@@ -3524,63 +3612,65 @@ export class Jobs {
3524
3612
  }
3525
3613
  });
3526
3614
  }
3615
+ }
3616
+ export class JobWageDeterminationRateRules {
3527
3617
  /**
3528
- * Delete position on job
3618
+ * List rate rule version history
3529
3619
  *
3530
- * Deletes a position that has no logged work and no restricting
3531
- * associations. A position still referenced by time entries,
3532
- * time-card per diems, completion positions, or aggregate logged
3533
- * work is refused with a `422`. An unused position returns `204`
3534
- * and is gone from a later GET.
3620
+ * A rule's whole valid-time sequence, newest window first and cursor-paginated.
3621
+ * Each entry is a full rate rule carrying its own `valid_from` / `valid_to`
3622
+ * window and a `version_status` of `scheduled`, `current` or `historical`. An
3623
+ * entry carries the family key as `pay_rates_rule_id` and no `id` or `uid` of
3624
+ * its own — every version shares the family key, so versions are told apart by
3625
+ * their window coordinates.
3626
+ *
3627
+ * `corrections` is always empty here: a rule keeps no audit layer, so what a
3628
+ * version replaced was not recorded. The field is still returned, because the
3629
+ * timeline answers one shape across every temporal resource. `as_of[valid]` is
3630
+ * rejected, since pinning a point on the valid axis would collapse the sequence
3631
+ * this endpoint returns, and a rule records no transaction axis to read
3632
+ * `as_of[transaction]` against.
3535
3633
  *
3536
3634
  *
3537
3635
  * **Required scope:**
3538
3636
  *
3539
- * `jobs.positions:delete`
3637
+ * `jobs.pwa.wage_determinations.rate_rules.history:read`
3540
3638
  *
3541
3639
  */
3542
- static deletePosition(options) {
3543
- return (options.client ?? client).delete({
3640
+ static listRateRuleHistory(options) {
3641
+ return (options.client ?? client).get({
3544
3642
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3545
- url: '/api/v1/jobs/{job_id}/positions/{id}',
3643
+ url: '/api/v1/jobs/{job_id}/wage_determinations/{wage_determination_id}/rate_rules/{rate_rule_id}/history',
3546
3644
  ...options
3547
3645
  });
3548
3646
  }
3549
3647
  /**
3550
- * Show position on job
3551
- *
3552
- * Returns one position on the named job. A missing, misnested, or
3553
- * out-of-scope id reads as not found.
3554
- *
3648
+ * List rate rules
3555
3649
  *
3556
3650
  * **Required scope:**
3557
3651
  *
3558
- * `jobs.positions:read`
3652
+ * `jobs.pwa.wage_determinations.rate_rules:read`
3559
3653
  *
3560
3654
  */
3561
- static getPosition(options) {
3655
+ static listRateRules(options) {
3562
3656
  return (options.client ?? client).get({
3563
3657
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3564
- url: '/api/v1/jobs/{job_id}/positions/{id}',
3658
+ url: '/api/v1/jobs/{job_id}/wage_determinations/{wage_determination_id}/rate_rules',
3565
3659
  ...options
3566
3660
  });
3567
3661
  }
3568
3662
  /**
3569
- * Update position on job
3570
- *
3571
- * cash_fringe_rate_cents, hourly_rate_cents, pwa_wage_pay_rate_cents and
3572
- * wage_adder_rate_cents are admin only on user-scoped keys.
3573
- *
3663
+ * Create rate rule
3574
3664
  *
3575
3665
  * **Required scope:**
3576
3666
  *
3577
- * `jobs.positions:update`
3667
+ * `jobs.pwa.wage_determinations.rate_rules:create`
3578
3668
  *
3579
3669
  */
3580
- static updatePosition(options) {
3581
- return (options.client ?? client).patch({
3670
+ static createRateRule(options) {
3671
+ return (options.client ?? client).post({
3582
3672
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3583
- url: '/api/v1/jobs/{job_id}/positions/{id}',
3673
+ url: '/api/v1/jobs/{job_id}/wage_determinations/{wage_determination_id}/rate_rules',
3584
3674
  ...options,
3585
3675
  headers: {
3586
3676
  'Content-Type': 'application/json',
@@ -3589,17 +3679,17 @@ export class Jobs {
3589
3679
  });
3590
3680
  }
3591
3681
  /**
3592
- * List job templates
3682
+ * Show rate rule
3593
3683
  *
3594
3684
  * **Required scope:**
3595
3685
  *
3596
- * `jobs.templates:read`
3686
+ * `jobs.pwa.wage_determinations.rate_rules:read`
3597
3687
  *
3598
3688
  */
3599
- static listTemplates(options) {
3600
- return (options?.client ?? client).get({
3689
+ static getRateRule(options) {
3690
+ return (options.client ?? client).get({
3601
3691
  security: [{ name: 'X-Api-Key', type: 'apiKey' }],
3602
- url: '/api/v1/jobs/templates',
3692
+ url: '/api/v1/jobs/{job_id}/wage_determinations/{wage_determination_id}/rate_rules/{id}',
3603
3693
  ...options
3604
3694
  });
3605
3695
  }
@@ -3932,6 +4022,195 @@ export class OversiteSiteCheckIns {
3932
4022
  });
3933
4023
  }
3934
4024
  }
4025
+ export class OversiteFeatureFormAssignmentTasks {
4026
+ /**
4027
+ * List form assignment tasks for feature
4028
+ *
4029
+ * Returns form-completion tasks nested on the named feature.
4030
+ * `{id}` is the `Tasks::FeatureFormAssignmentTask` id, not the
4031
+ * web show `Task#uid`. Sites and features are shared; only this
4032
+ * company's nested tasks are listed. A missing site, a feature
4033
+ * not on that site, or a site without a company SiteClaim with
4034
+ * site_forms enabled, reads as not found.
4035
+ *
4036
+ *
4037
+ * **Required scope:**
4038
+ *
4039
+ * `oversite.sites.features.form_assignment_tasks:read`
4040
+ *
4041
+ */
4042
+ static listFeatureFormAssignmentTasks(options) {
4043
+ return (options.client ?? client).get({
4044
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
4045
+ url: '/api/v1/oversite/sites/{site_id}/features/{feature_id}/form_assignment_tasks',
4046
+ ...options
4047
+ });
4048
+ }
4049
+ /**
4050
+ * Create form assignment task for feature
4051
+ *
4052
+ * Creates a form-completion task on the named feature. `site_id`
4053
+ * and `feature_id` are the path only. `form_definition_id` and
4054
+ * `task_attributes.created_by_user_id` are required. An empty
4055
+ * `task_assignee_user_ids` list is valid.
4056
+ *
4057
+ *
4058
+ * **Required scope:**
4059
+ *
4060
+ * `oversite.sites.features.form_assignment_tasks:create`
4061
+ *
4062
+ */
4063
+ static createFeatureFormAssignmentTask(options) {
4064
+ return (options.client ?? client).post({
4065
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
4066
+ url: '/api/v1/oversite/sites/{site_id}/features/{feature_id}/form_assignment_tasks',
4067
+ ...options,
4068
+ headers: {
4069
+ 'Content-Type': 'application/json',
4070
+ ...options.headers
4071
+ }
4072
+ });
4073
+ }
4074
+ /**
4075
+ * Show form assignment task on feature
4076
+ *
4077
+ * Returns one form-completion task on the named feature. `{id}`
4078
+ * is the `Tasks::FeatureFormAssignmentTask` id. A missing,
4079
+ * misnested, or other-company id on this shared feature reads as
4080
+ * not found.
4081
+ *
4082
+ *
4083
+ * **Required scope:**
4084
+ *
4085
+ * `oversite.sites.features.form_assignment_tasks:read`
4086
+ *
4087
+ */
4088
+ static getFeatureFormAssignmentTask(options) {
4089
+ return (options.client ?? client).get({
4090
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
4091
+ url: '/api/v1/oversite/sites/{site_id}/features/{feature_id}/form_assignment_tasks/{id}',
4092
+ ...options
4093
+ });
4094
+ }
4095
+ /**
4096
+ * Update form assignment task on feature
4097
+ *
4098
+ * Updates the existing task in place. `site_id` and
4099
+ * `feature_id` are the path only. Replacing
4100
+ * `task_assignee_user_ids` does not insert join rows before
4101
+ * authorize.
4102
+ *
4103
+ *
4104
+ * **Required scope:**
4105
+ *
4106
+ * `oversite.sites.features.form_assignment_tasks:update`
4107
+ *
4108
+ */
4109
+ static updateFeatureFormAssignmentTask(options) {
4110
+ return (options.client ?? client).patch({
4111
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
4112
+ url: '/api/v1/oversite/sites/{site_id}/features/{feature_id}/form_assignment_tasks/{id}',
4113
+ ...options,
4114
+ headers: {
4115
+ 'Content-Type': 'application/json',
4116
+ ...options.headers
4117
+ }
4118
+ });
4119
+ }
4120
+ }
4121
+ export class OversiteSiteFormAssignmentTasks {
4122
+ /**
4123
+ * List form assignment tasks for site
4124
+ *
4125
+ * Returns form-completion tasks nested on the named site.
4126
+ * `{id}` is the `Tasks::SiteFormAssignmentTask` id, not the
4127
+ * web show `Task#uid`. Sites are shared; only this company's
4128
+ * nested tasks are listed. A missing site, or one without a
4129
+ * company SiteClaim with site_forms enabled, reads as not found.
4130
+ *
4131
+ *
4132
+ * **Required scope:**
4133
+ *
4134
+ * `oversite.sites.form_assignment_tasks:read`
4135
+ *
4136
+ */
4137
+ static listSiteFormAssignmentTasks(options) {
4138
+ return (options.client ?? client).get({
4139
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
4140
+ url: '/api/v1/oversite/sites/{site_id}/form_assignment_tasks',
4141
+ ...options
4142
+ });
4143
+ }
4144
+ /**
4145
+ * Create form assignment task for site
4146
+ *
4147
+ * Creates a form-completion task on the named site. `site_id`
4148
+ * is the path only. `form_definition_id` and
4149
+ * `task_attributes.created_by_user_id` are required. An empty
4150
+ * `task_assignee_user_ids` list is valid.
4151
+ *
4152
+ *
4153
+ * **Required scope:**
4154
+ *
4155
+ * `oversite.sites.form_assignment_tasks:create`
4156
+ *
4157
+ */
4158
+ static createSiteFormAssignmentTask(options) {
4159
+ return (options.client ?? client).post({
4160
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
4161
+ url: '/api/v1/oversite/sites/{site_id}/form_assignment_tasks',
4162
+ ...options,
4163
+ headers: {
4164
+ 'Content-Type': 'application/json',
4165
+ ...options.headers
4166
+ }
4167
+ });
4168
+ }
4169
+ /**
4170
+ * Show form assignment task on site
4171
+ *
4172
+ * Returns one form-completion task on the named site. `{id}` is
4173
+ * the `Tasks::SiteFormAssignmentTask` id. A missing, misnested,
4174
+ * or other-company id on this shared site reads as not found.
4175
+ *
4176
+ *
4177
+ * **Required scope:**
4178
+ *
4179
+ * `oversite.sites.form_assignment_tasks:read`
4180
+ *
4181
+ */
4182
+ static getSiteFormAssignmentTask(options) {
4183
+ return (options.client ?? client).get({
4184
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
4185
+ url: '/api/v1/oversite/sites/{site_id}/form_assignment_tasks/{id}',
4186
+ ...options
4187
+ });
4188
+ }
4189
+ /**
4190
+ * Update form assignment task on site
4191
+ *
4192
+ * Updates the existing task in place. `site_id` is the path
4193
+ * only. Replacing `task_assignee_user_ids` does not insert join
4194
+ * rows before authorize.
4195
+ *
4196
+ *
4197
+ * **Required scope:**
4198
+ *
4199
+ * `oversite.sites.form_assignment_tasks:update`
4200
+ *
4201
+ */
4202
+ static updateSiteFormAssignmentTask(options) {
4203
+ return (options.client ?? client).patch({
4204
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
4205
+ url: '/api/v1/oversite/sites/{site_id}/form_assignment_tasks/{id}',
4206
+ ...options,
4207
+ headers: {
4208
+ 'Content-Type': 'application/json',
4209
+ ...options.headers
4210
+ }
4211
+ });
4212
+ }
4213
+ }
3935
4214
  export class OvertimeRules {
3936
4215
  /**
3937
4216
  * Shift overtime rule genesis
@@ -4998,6 +5277,11 @@ export class PayrollRuns {
4998
5277
  /**
4999
5278
  * Create payroll run
5000
5279
  *
5280
+ * Company-scoped keys and user-scoped keys belonging to company
5281
+ * admins can create payroll runs with the same fields. Manager
5282
+ * and technician user keys cannot create runs.
5283
+ *
5284
+ *
5001
5285
  * **Required scope:**
5002
5286
  *
5003
5287
  * `payrolls.payroll_runs:create`
@@ -5047,6 +5331,12 @@ export class PayrollRuns {
5047
5331
  /**
5048
5332
  * Update payroll run
5049
5333
  *
5334
+ * Company-scoped keys and user-scoped keys belonging to company
5335
+ * admins can update the same payroll run fields. Manager and
5336
+ * technician user keys cannot update runs. The owning company is
5337
+ * fixed at creation; company_id is rejected on update.
5338
+ *
5339
+ *
5050
5340
  * **Required scope:**
5051
5341
  *
5052
5342
  * `payrolls.payroll_runs:update`
@@ -7459,6 +7749,27 @@ export class PaySchedules {
7459
7749
  ...options
7460
7750
  });
7461
7751
  }
7752
+ /**
7753
+ * Create pay schedule
7754
+ *
7755
+ * Creates the company’s only pay schedule. The effective date starts its valid-time window at midnight in the supplied timezone. Existing schedules, including future or ended schedules, return 409. Time and payroll modes inherit company defaults; pay periods are generated asynchronously.
7756
+ *
7757
+ * **Required scope:**
7758
+ *
7759
+ * `timekeeping.pay_period_configs:create`
7760
+ *
7761
+ */
7762
+ static createPayPeriodConfig(options) {
7763
+ return (options.client ?? client).post({
7764
+ security: [{ name: 'X-Api-Key', type: 'apiKey' }],
7765
+ url: '/api/v1/timekeeping/pay_period_configs',
7766
+ ...options,
7767
+ headers: {
7768
+ 'Content-Type': 'application/json',
7769
+ ...options.headers
7770
+ }
7771
+ });
7772
+ }
7462
7773
  /**
7463
7774
  * Show pay schedule
7464
7775
  *