@dakkitor/api-contracts 1.1.153 → 1.4.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.
Files changed (340) hide show
  1. package/dist/abilities/abilities.contract.d.ts +53 -1
  2. package/dist/abilities/abilities.contract.d.ts.map +1 -1
  3. package/dist/abilities/abilities.contract.js +92 -1
  4. package/dist/abilities/abilities.contract.spec.d.ts +2 -0
  5. package/dist/abilities/abilities.contract.spec.d.ts.map +1 -0
  6. package/dist/abilities/abilities.contract.spec.js +145 -0
  7. package/dist/abilities/admin-dashboard.abilities.test.d.ts +2 -0
  8. package/dist/abilities/admin-dashboard.abilities.test.d.ts.map +1 -0
  9. package/dist/abilities/admin-dashboard.abilities.test.js +33 -0
  10. package/dist/abilities/admin.abilities.json +19 -0
  11. package/dist/abilities/bot.abilities.json +13 -4
  12. package/dist/abilities/first-agent.abilities.json +317 -70
  13. package/dist/abilities/interconnection.abilities.json +75 -0
  14. package/dist/abilities/kpi.abilities.json +68 -0
  15. package/dist/abilities/office-manager.abilities.json +111 -0
  16. package/dist/abilities/second-agent.abilities.json +417 -43
  17. package/dist/abilities/team-leads.json +71 -6
  18. package/dist/abilities/worker-curator.abilities.json +233 -0
  19. package/dist/actives/actives.contract.d.ts +19379 -23651
  20. package/dist/actives/actives.contract.d.ts.map +1 -1
  21. package/dist/actives/actives.contract.js +517 -114
  22. package/dist/agent-client-links/agent-client-links.contract.d.ts +1431 -291
  23. package/dist/agent-client-links/agent-client-links.contract.d.ts.map +1 -1
  24. package/dist/auth/auth.contract.d.ts +1050 -81
  25. package/dist/auth/auth.contract.d.ts.map +1 -1
  26. package/dist/auth/auth.contract.js +115 -3
  27. package/dist/bookings/booking-worker-summary.spec.d.ts +2 -0
  28. package/dist/bookings/booking-worker-summary.spec.d.ts.map +1 -0
  29. package/dist/bookings/booking-worker-summary.spec.js +25 -0
  30. package/dist/bookings/bookings.contract.d.ts +20643 -26117
  31. package/dist/bookings/bookings.contract.d.ts.map +1 -1
  32. package/dist/bookings/bookings.contract.js +383 -91
  33. package/dist/bookings/bookings.contract.spec.d.ts +2 -0
  34. package/dist/bookings/bookings.contract.spec.d.ts.map +1 -0
  35. package/dist/bookings/bookings.contract.spec.js +11 -0
  36. package/dist/bookings/job-lock.spec.d.ts +2 -0
  37. package/dist/bookings/job-lock.spec.d.ts.map +1 -0
  38. package/dist/bookings/job-lock.spec.js +56 -0
  39. package/dist/bot-parse-cache/bot-parse-cache.contract.d.ts +232 -0
  40. package/dist/bot-parse-cache/bot-parse-cache.contract.d.ts.map +1 -0
  41. package/dist/bot-parse-cache/bot-parse-cache.contract.js +64 -0
  42. package/dist/call-history/call-history.contract.d.ts +1336 -767
  43. package/dist/call-history/call-history.contract.d.ts.map +1 -1
  44. package/dist/call-history/call-history.contract.js +86 -10
  45. package/dist/calls-feed/calls-feed.contract.d.ts +417 -0
  46. package/dist/calls-feed/calls-feed.contract.d.ts.map +1 -0
  47. package/dist/calls-feed/calls-feed.contract.js +32 -0
  48. package/dist/client-contacts/client-contacts.contract.d.ts +410 -226
  49. package/dist/client-contacts/client-contacts.contract.d.ts.map +1 -1
  50. package/dist/client-contacts/client-contacts.contract.js +35 -4
  51. package/dist/clients/clients.contract.d.ts +227 -73
  52. package/dist/clients/clients.contract.d.ts.map +1 -1
  53. package/dist/clients/clients.contract.js +45 -21
  54. package/dist/collaboration-checkings/collaboration-checkings.contract.d.ts +2908 -1834
  55. package/dist/collaboration-checkings/collaboration-checkings.contract.d.ts.map +1 -1
  56. package/dist/collaboration-checkings/collaboration-checkings.contract.js +14 -9
  57. package/dist/collaborations/collaborations.contract.d.ts +2676 -1409
  58. package/dist/collaborations/collaborations.contract.d.ts.map +1 -1
  59. package/dist/collaborations/collaborations.contract.js +33 -9
  60. package/dist/common/call-rating.schema.d.ts.map +1 -1
  61. package/dist/common/call-rating.schema.js +4 -2
  62. package/dist/common/common-schemas.d.ts +59 -11
  63. package/dist/common/common-schemas.d.ts.map +1 -1
  64. package/dist/common/common-schemas.js +55 -29
  65. package/dist/common/error-schemas.d.ts +2 -2
  66. package/dist/common/pagination-query.schema.d.ts +13 -2
  67. package/dist/common/pagination-query.schema.d.ts.map +1 -1
  68. package/dist/common/pagination-query.schema.js +21 -2
  69. package/dist/common/pagination-query.schema.spec.d.ts +2 -0
  70. package/dist/common/pagination-query.schema.spec.d.ts.map +1 -0
  71. package/dist/common/pagination-query.schema.spec.js +53 -0
  72. package/dist/companies/companies.contract.d.ts +53 -28
  73. package/dist/companies/companies.contract.d.ts.map +1 -1
  74. package/dist/companies/companies.contract.js +11 -10
  75. package/dist/crews/crews.contract.d.ts +1010 -196
  76. package/dist/crews/crews.contract.d.ts.map +1 -1
  77. package/dist/crews/crews.contract.js +98 -17
  78. package/dist/crews/crews.contract.spec.d.ts +2 -0
  79. package/dist/crews/crews.contract.spec.d.ts.map +1 -0
  80. package/dist/crews/crews.contract.spec.js +67 -0
  81. package/dist/cron-executions/cron-executions.contract.d.ts +988 -59
  82. package/dist/cron-executions/cron-executions.contract.d.ts.map +1 -1
  83. package/dist/cron-executions/cron-executions.contract.js +127 -7
  84. package/dist/curated-worker-leads/__tests__/disposition-reason.spec.d.ts +2 -0
  85. package/dist/curated-worker-leads/__tests__/disposition-reason.spec.d.ts.map +1 -0
  86. package/dist/curated-worker-leads/__tests__/disposition-reason.spec.js +40 -0
  87. package/dist/curated-worker-leads/candidate-coordination-snapshot.spec.d.ts +2 -0
  88. package/dist/curated-worker-leads/candidate-coordination-snapshot.spec.d.ts.map +1 -0
  89. package/dist/curated-worker-leads/candidate-coordination-snapshot.spec.js +16 -0
  90. package/dist/curated-worker-leads/candidate-coordination.contract.d.ts +21650 -0
  91. package/dist/curated-worker-leads/candidate-coordination.contract.d.ts.map +1 -0
  92. package/dist/curated-worker-leads/candidate-coordination.contract.js +921 -0
  93. package/dist/curated-worker-leads/candidate-coordination.contract.spec.d.ts +2 -0
  94. package/dist/curated-worker-leads/candidate-coordination.contract.spec.d.ts.map +1 -0
  95. package/dist/curated-worker-leads/candidate-coordination.contract.spec.js +51 -0
  96. package/dist/curated-worker-leads/candidate-edit-session.contract.d.ts +2364 -0
  97. package/dist/curated-worker-leads/candidate-edit-session.contract.d.ts.map +1 -0
  98. package/dist/curated-worker-leads/candidate-edit-session.contract.js +173 -0
  99. package/dist/curated-worker-leads/consent-queue.contract.d.ts +4497 -0
  100. package/dist/curated-worker-leads/consent-queue.contract.d.ts.map +1 -0
  101. package/dist/curated-worker-leads/consent-queue.contract.js +201 -0
  102. package/dist/curated-worker-leads/contact-history.spec.d.ts +2 -0
  103. package/dist/curated-worker-leads/contact-history.spec.d.ts.map +1 -0
  104. package/dist/curated-worker-leads/contact-history.spec.js +88 -0
  105. package/dist/curated-worker-leads/contact-session.contract.spec.d.ts +2 -0
  106. package/dist/curated-worker-leads/contact-session.contract.spec.d.ts.map +1 -0
  107. package/dist/curated-worker-leads/contact-session.contract.spec.js +315 -0
  108. package/dist/curated-worker-leads/curated-worker-lead-config.contract.d.ts +489 -0
  109. package/dist/curated-worker-leads/curated-worker-lead-config.contract.d.ts.map +1 -0
  110. package/dist/curated-worker-leads/curated-worker-lead-config.contract.js +88 -0
  111. package/dist/curated-worker-leads/curated-worker-leads.contract.d.ts +135 -0
  112. package/dist/curated-worker-leads/curated-worker-leads.contract.d.ts.map +1 -0
  113. package/dist/curated-worker-leads/curated-worker-leads.contract.js +32 -0
  114. package/dist/curated-worker-leads/job-candidate-cards.spec.d.ts +2 -0
  115. package/dist/curated-worker-leads/job-candidate-cards.spec.d.ts.map +1 -0
  116. package/dist/curated-worker-leads/job-candidate-cards.spec.js +157 -0
  117. package/dist/curated-worker-leads/job-candidates.spec.d.ts +2 -0
  118. package/dist/curated-worker-leads/job-candidates.spec.d.ts.map +1 -0
  119. package/dist/curated-worker-leads/job-candidates.spec.js +140 -0
  120. package/dist/curated-worker-leads/job-feed-match-counts.contract.spec.d.ts +2 -0
  121. package/dist/curated-worker-leads/job-feed-match-counts.contract.spec.d.ts.map +1 -0
  122. package/dist/curated-worker-leads/job-feed-match-counts.contract.spec.js +19 -0
  123. package/dist/curated-worker-leads/jobs-tab.contract.d.ts +18365 -0
  124. package/dist/curated-worker-leads/jobs-tab.contract.d.ts.map +1 -0
  125. package/dist/curated-worker-leads/jobs-tab.contract.js +642 -0
  126. package/dist/curated-worker-leads/lead-agent-area.contract.d.ts +348 -0
  127. package/dist/curated-worker-leads/lead-agent-area.contract.d.ts.map +1 -0
  128. package/dist/curated-worker-leads/lead-agent-area.contract.js +51 -0
  129. package/dist/curated-worker-leads/owned-jobs-tab.contract.d.ts +1116 -0
  130. package/dist/curated-worker-leads/owned-jobs-tab.contract.d.ts.map +1 -0
  131. package/dist/curated-worker-leads/owned-jobs-tab.contract.js +93 -0
  132. package/dist/curated-workers/curated-filter-additions.spec.d.ts +2 -0
  133. package/dist/curated-workers/curated-filter-additions.spec.d.ts.map +1 -0
  134. package/dist/curated-workers/curated-filter-additions.spec.js +17 -0
  135. package/dist/curated-workers/curated-job-seeking.spec.d.ts +2 -0
  136. package/dist/curated-workers/curated-job-seeking.spec.d.ts.map +1 -0
  137. package/dist/curated-workers/curated-job-seeking.spec.js +53 -0
  138. package/dist/curated-workers/curated-workers-id-documents.spec.d.ts +2 -0
  139. package/dist/curated-workers/curated-workers-id-documents.spec.d.ts.map +1 -0
  140. package/dist/curated-workers/curated-workers-id-documents.spec.js +38 -0
  141. package/dist/curated-workers/curated-workers.contract.d.ts +6160 -1906
  142. package/dist/curated-workers/curated-workers.contract.d.ts.map +1 -1
  143. package/dist/curated-workers/curated-workers.contract.js +333 -51
  144. package/dist/dashboards/agent-daily-metrics.contract.d.ts +10 -10
  145. package/dist/dashboards/agent-daily-metrics.contract.js +1 -1
  146. package/dist/dashboards/dashboard-widgets.contract.d.ts +3800 -496
  147. package/dist/dashboards/dashboard-widgets.contract.d.ts.map +1 -1
  148. package/dist/dashboards/dashboard-widgets.contract.js +527 -29
  149. package/dist/dashboards/dashboard.contract.d.ts +8 -8
  150. package/dist/document-intake/document-intake.contract.d.ts +3132 -0
  151. package/dist/document-intake/document-intake.contract.d.ts.map +1 -0
  152. package/dist/document-intake/document-intake.contract.js +418 -0
  153. package/dist/export-jobs/export-jobs.contract.d.ts +3918 -0
  154. package/dist/export-jobs/export-jobs.contract.d.ts.map +1 -0
  155. package/dist/export-jobs/export-jobs.contract.js +240 -0
  156. package/dist/exports-events/exports-events.schemas.d.ts +90 -0
  157. package/dist/exports-events/exports-events.schemas.d.ts.map +1 -0
  158. package/dist/exports-events/exports-events.schemas.js +56 -0
  159. package/dist/files/files.contract.d.ts +133 -126
  160. package/dist/files/files.contract.d.ts.map +1 -1
  161. package/dist/files/files.contract.js +8 -0
  162. package/dist/health/health.contract.d.ts +4 -4
  163. package/dist/index.d.ts +82 -0
  164. package/dist/index.d.ts.map +1 -1
  165. package/dist/index.js +87 -1
  166. package/dist/interactions/interactions.contract.d.ts +162 -0
  167. package/dist/interactions/interactions.contract.d.ts.map +1 -0
  168. package/dist/interactions/interactions.contract.js +42 -0
  169. package/dist/job-clusters/job-clusters.contract.d.ts +1584 -0
  170. package/dist/job-clusters/job-clusters.contract.d.ts.map +1 -0
  171. package/dist/job-clusters/job-clusters.contract.js +133 -0
  172. package/dist/jobs/jobs.contract.d.ts +16517 -8495
  173. package/dist/jobs/jobs.contract.d.ts.map +1 -1
  174. package/dist/jobs/jobs.contract.js +394 -190
  175. package/dist/jobs/jobs.contract.spec.d.ts +2 -0
  176. package/dist/jobs/jobs.contract.spec.d.ts.map +1 -0
  177. package/dist/jobs/jobs.contract.spec.js +70 -0
  178. package/dist/kpi-impersonation/kpi-impersonation.contract.d.ts +75 -75
  179. package/dist/lead-assignments/lead-assignments.contract.d.ts +2933 -1122
  180. package/dist/lead-assignments/lead-assignments.contract.d.ts.map +1 -1
  181. package/dist/lead-assignments/lead-assignments.contract.js +29 -7
  182. package/dist/lead-distribution/agent-lead-distribution.contract.d.ts +328 -64
  183. package/dist/lead-distribution/agent-lead-distribution.contract.d.ts.map +1 -1
  184. package/dist/lead-distribution/agent-lead-distribution.contract.js +1 -1
  185. package/dist/lead-distribution/lead-distribution-config.contract.d.ts +31 -31
  186. package/dist/leads/leads.contract.d.ts +830 -368
  187. package/dist/leads/leads.contract.d.ts.map +1 -1
  188. package/dist/leads/leads.contract.js +106 -26
  189. package/dist/locations/locations.contract.d.ts +36 -36
  190. package/dist/notifications/notifications.contract.d.ts +1039 -0
  191. package/dist/notifications/notifications.contract.d.ts.map +1 -0
  192. package/dist/notifications/notifications.contract.js +110 -0
  193. package/dist/offices/offices.contract.d.ts +210 -60
  194. package/dist/offices/offices.contract.d.ts.map +1 -1
  195. package/dist/offices/offices.contract.js +18 -4
  196. package/dist/outreach/__tests__/outreach-claim.test.d.ts +2 -0
  197. package/dist/outreach/__tests__/outreach-claim.test.d.ts.map +1 -0
  198. package/dist/outreach/__tests__/outreach-claim.test.js +97 -0
  199. package/dist/outreach/__tests__/outreach-confirm-release.test.d.ts +2 -0
  200. package/dist/outreach/__tests__/outreach-confirm-release.test.d.ts.map +1 -0
  201. package/dist/outreach/__tests__/outreach-confirm-release.test.js +98 -0
  202. package/dist/outreach/__tests__/outreach-routes.test.d.ts +2 -0
  203. package/dist/outreach/__tests__/outreach-routes.test.d.ts.map +1 -0
  204. package/dist/outreach/__tests__/outreach-routes.test.js +57 -0
  205. package/dist/outreach/__tests__/outreach.schemas.test.d.ts +2 -0
  206. package/dist/outreach/__tests__/outreach.schemas.test.d.ts.map +1 -0
  207. package/dist/outreach/__tests__/outreach.schemas.test.js +140 -0
  208. package/dist/outreach/outreach.contract.d.ts +809 -0
  209. package/dist/outreach/outreach.contract.d.ts.map +1 -0
  210. package/dist/outreach/outreach.contract.js +195 -0
  211. package/dist/outreach/outreach.schemas.d.ts +113 -0
  212. package/dist/outreach/outreach.schemas.d.ts.map +1 -0
  213. package/dist/outreach/outreach.schemas.js +132 -0
  214. package/dist/own-research/own-research.contract.d.ts +1356 -552
  215. package/dist/own-research/own-research.contract.d.ts.map +1 -1
  216. package/dist/own-research/own-research.contract.js +14 -3
  217. package/dist/postcodes/postcodes.contract.d.ts +16 -16
  218. package/dist/proofs/proof-category.enum.d.ts +4 -0
  219. package/dist/proofs/proof-category.enum.d.ts.map +1 -0
  220. package/dist/proofs/proof-category.enum.js +5 -0
  221. package/dist/proofs/proof-entity-type.enum.d.ts +4 -0
  222. package/dist/proofs/proof-entity-type.enum.d.ts.map +1 -0
  223. package/dist/proofs/proof-entity-type.enum.js +5 -0
  224. package/dist/proofs/proof-type.enum.d.ts +28 -0
  225. package/dist/proofs/proof-type.enum.d.ts.map +1 -0
  226. package/dist/proofs/proof-type.enum.js +14 -0
  227. package/dist/proofs/proofs.contract.d.ts +3009 -0
  228. package/dist/proofs/proofs.contract.d.ts.map +1 -0
  229. package/dist/proofs/proofs.contract.js +92 -0
  230. package/dist/proofs/proofs.dtos.d.ts +1319 -0
  231. package/dist/proofs/proofs.dtos.d.ts.map +1 -0
  232. package/dist/proofs/proofs.dtos.js +178 -0
  233. package/dist/qualifications/qualifications.contract.d.ts +94 -94
  234. package/dist/realtime/data-changed.d.ts +21 -0
  235. package/dist/realtime/data-changed.d.ts.map +1 -0
  236. package/dist/realtime/data-changed.js +37 -0
  237. package/dist/shared/booking-history.schema.d.ts +27 -0
  238. package/dist/shared/booking-history.schema.d.ts.map +1 -0
  239. package/dist/shared/booking-history.schema.js +22 -0
  240. package/dist/shared/booking-history.spec.d.ts +2 -0
  241. package/dist/shared/booking-history.spec.d.ts.map +1 -0
  242. package/dist/shared/booking-history.spec.js +44 -0
  243. package/dist/shared/contact-suppressions.contract.d.ts +22 -0
  244. package/dist/shared/contact-suppressions.contract.d.ts.map +1 -0
  245. package/dist/shared/contact-suppressions.contract.js +13 -0
  246. package/dist/shared/live-booking.schema.d.ts +57 -0
  247. package/dist/shared/live-booking.schema.d.ts.map +1 -0
  248. package/dist/shared/live-booking.schema.js +34 -0
  249. package/dist/shared/summary-schemas.d.ts +218 -0
  250. package/dist/shared/summary-schemas.d.ts.map +1 -0
  251. package/dist/shared/summary-schemas.js +56 -0
  252. package/dist/sheets-sync/__tests__/sheets-sync-events.schemas.test.d.ts +2 -0
  253. package/dist/sheets-sync/__tests__/sheets-sync-events.schemas.test.d.ts.map +1 -0
  254. package/dist/sheets-sync/__tests__/sheets-sync-events.schemas.test.js +20 -0
  255. package/dist/sheets-sync/__tests__/tab-sync-config.schema.test.d.ts +2 -0
  256. package/dist/sheets-sync/__tests__/tab-sync-config.schema.test.d.ts.map +1 -0
  257. package/dist/sheets-sync/__tests__/tab-sync-config.schema.test.js +41 -0
  258. package/dist/sheets-sync/sheets-sync-events.schemas.d.ts +43 -0
  259. package/dist/sheets-sync/sheets-sync-events.schemas.d.ts.map +1 -0
  260. package/dist/sheets-sync/sheets-sync-events.schemas.js +29 -0
  261. package/dist/sheets-sync/sheets-sync.contract.d.ts +7258 -0
  262. package/dist/sheets-sync/sheets-sync.contract.d.ts.map +1 -0
  263. package/dist/sheets-sync/sheets-sync.contract.js +323 -0
  264. package/dist/telegram/telegram.contract.d.ts +727 -0
  265. package/dist/telegram/telegram.contract.d.ts.map +1 -0
  266. package/dist/telegram/telegram.contract.js +75 -0
  267. package/dist/trades/trade-rate-assessment.d.ts +18 -0
  268. package/dist/trades/trade-rate-assessment.d.ts.map +1 -0
  269. package/dist/trades/trade-rate-assessment.js +46 -0
  270. package/dist/trades/trade-rate-assessment.spec.d.ts +2 -0
  271. package/dist/trades/trade-rate-assessment.spec.d.ts.map +1 -0
  272. package/dist/trades/trade-rate-assessment.spec.js +223 -0
  273. package/dist/trades/trades.contract.d.ts +111 -0
  274. package/dist/trades/trades.contract.d.ts.map +1 -1
  275. package/dist/trades/trades.contract.js +49 -1
  276. package/dist/trades/trades.contract.spec.d.ts +2 -0
  277. package/dist/trades/trades.contract.spec.d.ts.map +1 -0
  278. package/dist/trades/trades.contract.spec.js +173 -0
  279. package/dist/user-access-grants/build-user-access-grant-rules.d.ts +10 -0
  280. package/dist/user-access-grants/build-user-access-grant-rules.d.ts.map +1 -0
  281. package/dist/user-access-grants/build-user-access-grant-rules.js +69 -0
  282. package/dist/user-access-grants/build-user-access-grant-rules.spec.d.ts +2 -0
  283. package/dist/user-access-grants/build-user-access-grant-rules.spec.d.ts.map +1 -0
  284. package/dist/user-access-grants/build-user-access-grant-rules.spec.js +77 -0
  285. package/dist/user-access-grants/user-access-grant-templates.json +454 -0
  286. package/dist/user-access-grants/user-access-grants.contract.d.ts +3886 -0
  287. package/dist/user-access-grants/user-access-grants.contract.d.ts.map +1 -0
  288. package/dist/user-access-grants/user-access-grants.contract.js +189 -0
  289. package/dist/user-access-grants/user-access-grants.contract.spec.d.ts +2 -0
  290. package/dist/user-access-grants/user-access-grants.contract.spec.d.ts.map +1 -0
  291. package/dist/user-access-grants/user-access-grants.contract.spec.js +149 -0
  292. package/dist/users/users.contract.d.ts +1959 -349
  293. package/dist/users/users.contract.d.ts.map +1 -1
  294. package/dist/users/users.contract.js +222 -37
  295. package/dist/users/users.contract.spec.d.ts +2 -0
  296. package/dist/users/users.contract.spec.d.ts.map +1 -0
  297. package/dist/users/users.contract.spec.js +103 -0
  298. package/dist/worker-identity-cases/worker-identity-cases.contract.d.ts +4609 -0
  299. package/dist/worker-identity-cases/worker-identity-cases.contract.d.ts.map +1 -0
  300. package/dist/worker-identity-cases/worker-identity-cases.contract.js +409 -0
  301. package/dist/worker-merge-proposals/worker-merge-proposals.contract.d.ts +1511 -0
  302. package/dist/worker-merge-proposals/worker-merge-proposals.contract.d.ts.map +1 -0
  303. package/dist/worker-merge-proposals/worker-merge-proposals.contract.js +150 -0
  304. package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.contract.d.ts +1106 -0
  305. package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.contract.d.ts.map +1 -0
  306. package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.contract.js +85 -0
  307. package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.contract.spec.d.ts +2 -0
  308. package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.contract.spec.d.ts.map +1 -0
  309. package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.contract.spec.js +216 -0
  310. package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.schemas.d.ts +453 -0
  311. package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.schemas.d.ts.map +1 -0
  312. package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.schemas.js +109 -0
  313. package/dist/workers/do-not-contact.contract.d.ts +46 -0
  314. package/dist/workers/do-not-contact.contract.d.ts.map +1 -0
  315. package/dist/workers/do-not-contact.contract.js +41 -0
  316. package/dist/workers/do-not-contact.contract.spec.d.ts +2 -0
  317. package/dist/workers/do-not-contact.contract.spec.d.ts.map +1 -0
  318. package/dist/workers/do-not-contact.contract.spec.js +47 -0
  319. package/dist/workers/duplicate-group-worker.spec.d.ts +2 -0
  320. package/dist/workers/duplicate-group-worker.spec.d.ts.map +1 -0
  321. package/dist/workers/duplicate-group-worker.spec.js +34 -0
  322. package/dist/workers/filter-exact-flags.spec.d.ts +2 -0
  323. package/dist/workers/filter-exact-flags.spec.d.ts.map +1 -0
  324. package/dist/workers/filter-exact-flags.spec.js +37 -0
  325. package/dist/workers/worker-source-attribution.contract.spec.d.ts +2 -0
  326. package/dist/workers/worker-source-attribution.contract.spec.d.ts.map +1 -0
  327. package/dist/workers/worker-source-attribution.contract.spec.js +442 -0
  328. package/dist/workers/worker-source.spec.d.ts +2 -0
  329. package/dist/workers/worker-source.spec.d.ts.map +1 -0
  330. package/dist/workers/worker-source.spec.js +13 -0
  331. package/dist/workers/worker-status-facets.spec.d.ts +2 -0
  332. package/dist/workers/worker-status-facets.spec.d.ts.map +1 -0
  333. package/dist/workers/worker-status-facets.spec.js +34 -0
  334. package/dist/workers/workers.contract.d.ts +19534 -5969
  335. package/dist/workers/workers.contract.d.ts.map +1 -1
  336. package/dist/workers/workers.contract.js +1096 -113
  337. package/dist/workers/workers.contract.spec.d.ts +2 -0
  338. package/dist/workers/workers.contract.spec.d.ts.map +1 -0
  339. package/dist/workers/workers.contract.spec.js +31 -0
  340. package/package.json +5 -4
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.bookingsContractRouter = exports.BookingArraySchema = exports.PaginatedBookingResponseSchema = exports.FilterCalendarBookingsSchema = exports.CalendarBookingsResponseSchema = exports.DayBookingsSchema = exports.OngoingBookingCategorySchema = exports.OngoingBookingSchema = exports.BookingCategoryGroupSchema = exports.FilterBookingSchema = exports.BatchDeleteBookingResponseSchema = exports.BatchDeleteBookingSchema = exports.BatchUpdateBookingResponseSchema = exports.BatchUpdateBookingSchema = exports.UpdateBookingSchema = exports.UpdateBookingBaseSchema = exports.CreateBookingSchema = exports.CalendarCollaborationGroupSchema = exports.CollaborationGroupHeaderSchema = exports.CalendarJobGroupSchema = exports.CalendarBookingSchema = exports.BookingSchema = exports.CalendarJobSchema = exports.CalendarCollaborationSchema = exports.CalendarCompanySchema = exports.CalendarClientSchema = exports.CalendarLocationSchema = exports.CalendarUserSchema = exports.CalendarWorkerSchema = exports.BookingWorkerSchema = exports.FilterJobInBookingSchema = exports.BookingItemSchema = exports.BookingPaySchema = exports.BookingSortableFieldsSchema = exports.FilterBookingStatusSchema = exports.BookingStatusSchema = exports.BookingTypeSchema = exports.BookingCategoryEnumSchema = exports.BookingType = exports.BookingCategory = void 0;
3
+ exports.BookingArraySchema = exports.PaginatedBookingListResponseSchema = exports.BookingListItemSchema = exports.BookingJobSummarySchema = exports.BookingWorkerSummarySchema = exports.PaginatedBookingResponseSchema = exports.FilterCalendarBookingsSchema = exports.FlatCalendarBookingsResponseSchema = exports.FlatCalendarBookingSchema = exports.CalendarBookingsResponseSchema = exports.DayBookingsSchema = exports.OngoingBookingCategorySchema = exports.OngoingBookingSchema = exports.BookingCategoryGroupSchema = exports.FilterBookingSchema = exports.BatchDeleteBookingResponseSchema = exports.BatchDeleteBookingSchema = exports.BatchUpdateBookingResponseSchema = exports.BatchUpdateBookingSchema = exports.UpdateBookingSchema = exports.UpdateBookingBaseSchema = exports.CreateBookingSchema = exports.CalendarCollaborationGroupSchema = exports.CollaborationGroupHeaderSchema = exports.CalendarJobGroupSchema = exports.CalendarBookingSchema = exports.BookingSchema = exports.BookingJobSchema = exports.CalendarJobSchema = exports.CalendarCollaborationSchema = exports.CalendarCompanySchema = exports.CalendarClientSchema = exports.CalendarLocationSchema = exports.CalendarUserSchema = exports.CalendarWorkerSchema = exports.BookingWorkerSchema = exports.FilterJobInBookingSchema = exports.BookingItemSchema = exports.bookingItemCrossFieldRules = exports.BookingPaySchema = exports.BookingSortFieldMapping = exports.BookingSortableFieldsSchema = exports.FilterBookingStatusSchema = exports.BookingStatusSchema = exports.BookingTypeSchema = exports.BookingCategoryEnumSchema = exports.WorkingDaysSchema = exports.MAX_ACTIVES_FOR_JOB_CHANGE = exports.BookingType = exports.BookingCategory = void 0;
4
+ exports.bookingsContractRouter = exports.BookingConflictsResponseSchema = void 0;
5
+ exports.isBookingJobLocked = isBookingJobLocked;
4
6
  const zod_openapi_1 = require("@anatine/zod-openapi");
5
7
  const core_1 = require("@ts-rest/core");
6
8
  const zod_1 = require("zod");
@@ -11,6 +13,10 @@ const pagination_schema_1 = require("../common/pagination.schema");
11
13
  const jobs_contract_1 = require("../jobs/jobs.contract");
12
14
  const users_contract_1 = require("../users/users.contract");
13
15
  const workers_contract_1 = require("../workers/workers.contract");
16
+ const summary_schemas_1 = require("../shared/summary-schemas");
17
+ const live_booking_schema_1 = require("../shared/live-booking.schema");
18
+ const booking_history_schema_1 = require("../shared/booking-history.schema");
19
+ const contact_suppressions_contract_1 = require("../shared/contact-suppressions.contract");
14
20
  (0, zod_openapi_1.extendZodWithOpenApi)(zod_1.z);
15
21
  // Enums
16
22
  var BookingCategory;
@@ -18,7 +24,7 @@ var BookingCategory;
18
24
  BookingCategory["ATTEMPT"] = "ATTEMPT";
19
25
  BookingCategory["FAILED_START"] = "FAILED_START";
20
26
  BookingCategory["IN_PROGRESS"] = "IN_PROGRESS";
21
- BookingCategory["COMPLETED"] = "COMPLETED";
27
+ BookingCategory["FINISHED_THE_JOB"] = "FINISHED_THE_JOB";
22
28
  BookingCategory["CANCELLED"] = "CANCELLED";
23
29
  })(BookingCategory || (exports.BookingCategory = BookingCategory = {}));
24
30
  var BookingType;
@@ -47,6 +53,50 @@ var BookingType;
47
53
  BookingType["STARTED_THE_JOB"] = "STARTED_THE_JOB";
48
54
  BookingType["COMPLETED"] = "COMPLETED";
49
55
  })(BookingType || (exports.BookingType = BookingType = {}));
56
+ /**
57
+ * Max number of active days a booking may have accrued and still allow its job
58
+ * to be reassigned. Expressed in active-day terms so the date-based estimate
59
+ * below can later be swapped for an exact COUNT(actives) with no rule change.
60
+ */
61
+ exports.MAX_ACTIVES_FOR_JOB_CHANGE = 3;
62
+ const MS_PER_DAY = 86400000;
63
+ /** UTC midnight (ms) for a 'YYYY-MM-DD' string or a Date — matches this codebase's UTC date convention. */
64
+ function utcDayStart(value) {
65
+ const d = typeof value === 'string' ? new Date(value) : value;
66
+ return Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate());
67
+ }
68
+ /**
69
+ * Whether a booking's job is locked from reassignment because it has real
70
+ * history. Only IN_PROGRESS / FINISHED_THE_JOB can lock (the categories where
71
+ * Active records exist). The active-day count is *estimated* from dates:
72
+ * one active per calendar day from startDate to min(today, endDate), inclusive.
73
+ *
74
+ * `category` is typed as string so callers can pass the discriminated-union
75
+ * literal (web `booking.status.category`) or the entity VO value without enum
76
+ * coercion.
77
+ */
78
+ function isBookingJobLocked(args) {
79
+ const { category, startDate, endDate, now } = args;
80
+ if (category !== BookingCategory.IN_PROGRESS &&
81
+ category !== BookingCategory.FINISHED_THE_JOB) {
82
+ return false;
83
+ }
84
+ const start = utcDayStart(startDate);
85
+ const today = utcDayStart(now);
86
+ const endRef = endDate != null && utcDayStart(endDate) < today
87
+ ? utcDayStart(endDate)
88
+ : today;
89
+ const estimatedActiveDays = Math.floor((endRef - start) / MS_PER_DAY) + 1;
90
+ return estimatedActiveDays > exports.MAX_ACTIVES_FOR_JOB_CHANGE;
91
+ }
92
+ // ─── Schema Definitions ────────────────────────────────────────────────────
93
+ exports.WorkingDaysSchema = zod_1.z
94
+ .array(zod_1.z.number().int().min(1).max(7))
95
+ .min(1, 'At least one working day is required')
96
+ .refine((days) => new Set(days).size === days.length, {
97
+ message: 'Working days must be unique',
98
+ })
99
+ .describe('Working days as ISO weekday numbers (1=Mon … 7=Sun)');
50
100
  // Enum Schemas
51
101
  exports.BookingCategoryEnumSchema = zod_1.z
52
102
  .nativeEnum(BookingCategory)
@@ -54,8 +104,7 @@ exports.BookingCategoryEnumSchema = zod_1.z
54
104
  exports.BookingTypeSchema = zod_1.z
55
105
  .nativeEnum(BookingType)
56
106
  .openapi({ title: 'BookingType' });
57
- exports.BookingStatusSchema = zod_1.z
58
- .discriminatedUnion('category', [
107
+ exports.BookingStatusSchema = zod_1.z.discriminatedUnion('category', [
59
108
  zod_1.z.object({
60
109
  category: zod_1.z.literal('ATTEMPT'),
61
110
  type: zod_1.z.enum([
@@ -67,7 +116,7 @@ exports.BookingStatusSchema = zod_1.z
67
116
  'REFUSED_BY_FIRST_BECAUSE_OF_DISTANCE',
68
117
  'WAITING_FOR_CONFIRMATION',
69
118
  'CONFIRMED',
70
- ]),
119
+ ], { message: 'Required' }),
71
120
  }),
72
121
  zod_1.z.object({
73
122
  category: zod_1.z.literal('FAILED_START'),
@@ -80,7 +129,7 @@ exports.BookingStatusSchema = zod_1.z
80
129
  'DIDNT_START_OVERBOOK_BY_CLIENT',
81
130
  'DIDNT_START_OVERBOOK_BY_US',
82
131
  'ANOTHER_SITUATION',
83
- ]),
132
+ ], { message: 'Required' }),
84
133
  }),
85
134
  zod_1.z.object({
86
135
  category: zod_1.z.literal('IN_PROGRESS'),
@@ -89,18 +138,17 @@ exports.BookingStatusSchema = zod_1.z
89
138
  'ON_THE_WAY_TO_THE_SITE',
90
139
  'AT_THE_INDUCTION',
91
140
  'STARTED_THE_JOB',
92
- ]),
141
+ ], { message: 'Required' }),
93
142
  }),
94
143
  zod_1.z.object({
95
- category: zod_1.z.literal('COMPLETED'),
96
- type: zod_1.z.literal('COMPLETED'),
144
+ category: zod_1.z.literal('FINISHED_THE_JOB'),
145
+ type: zod_1.z.literal('COMPLETED', { message: 'Required' }),
97
146
  }),
98
147
  zod_1.z.object({
99
148
  category: zod_1.z.literal('CANCELLED'),
100
- type: zod_1.z.enum(['CANCELLED', 'JOB_CANCELLED']),
149
+ type: zod_1.z.enum(['CANCELLED', 'JOB_CANCELLED'], { message: 'Required' }),
101
150
  }),
102
- ])
103
- .openapi({ title: 'BookingStatus' });
151
+ ]);
104
152
  exports.FilterBookingStatusSchema = zod_1.z
105
153
  .discriminatedUnion('category', [
106
154
  zod_1.z.object({
@@ -145,7 +193,7 @@ exports.FilterBookingStatusSchema = zod_1.z
145
193
  .optional(),
146
194
  }),
147
195
  zod_1.z.object({
148
- category: zod_1.z.literal('COMPLETED'),
196
+ category: zod_1.z.literal('FINISHED_THE_JOB'),
149
197
  type: zod_1.z.literal('COMPLETED').optional(),
150
198
  }),
151
199
  zod_1.z.object({
@@ -169,27 +217,36 @@ exports.BookingSortableFieldsSchema = zod_1.z
169
217
  'updatedAt',
170
218
  ])
171
219
  .openapi({ title: 'BookingSortableFields' });
220
+ /** Maps sort field values to ability field paths on SortBookingSchema. */
221
+ exports.BookingSortFieldMapping = {
222
+ status: 'status',
223
+ startDate: 'startDate',
224
+ endDate: 'endDate',
225
+ workerName: 'workerName',
226
+ payRate: 'payRate',
227
+ secondAgent: 'agentId',
228
+ collaborationCompany: 'job.companyId',
229
+ collaborationClient: 'job.clientId',
230
+ collaborationAgent: 'job.userId',
231
+ createdAt: 'createdAt',
232
+ updatedAt: 'updatedAt',
233
+ };
172
234
  // Nested Schemas
173
- exports.BookingPaySchema = zod_1.z
174
- .object({
175
- rate: zod_1.z.coerce.number().describe('Pay Rate'),
176
- unit: common_schemas_1.RateUnitSchema.default('HOURLY').describe('Pay Unit'),
177
- })
178
- .openapi({ title: 'BookingPay' });
235
+ exports.BookingPaySchema = zod_1.z.object({
236
+ rate: zod_1.z.coerce.number().describe('Pay rate'),
237
+ unit: common_schemas_1.RateUnitSchema.default('HOURLY').describe('Pay unit'),
238
+ });
179
239
  // ResourceIdSchema is imported from common-schemas
180
- exports.BookingItemSchema = zod_1.z
181
- .object({
182
- worker: common_schemas_1.ResourceIdSchema.describe('Worker to Book'),
183
- startDate: zod_1.z.string().date().describe('Start Date'),
184
- endDate: zod_1.z.string().date().nullable().optional().describe('End Date'),
185
- pay: exports.BookingPaySchema.optional().describe('Pay Information'),
186
- status: exports.BookingStatusSchema.optional().describe('Booking Status'),
187
- })
188
- .superRefine((data, ctx) => {
240
+ /**
241
+ * Cross-field validation rules shared by every schema that captures booking
242
+ * details (BookingItemSchema and CandidateBookingFieldsSchema), so the rules
243
+ * cannot drift between the regular and candidate booking flows.
244
+ */
245
+ const bookingItemCrossFieldRules = (data, ctx) => {
189
246
  if (data.status?.type === 'COMPLETED' && !data.endDate) {
190
247
  ctx.addIssue({
191
248
  code: zod_1.z.ZodIssueCode.custom,
192
- message: 'End date is required when a booking is marked as completed',
249
+ message: 'End date is required when a booking is marked as Finished the job.',
193
250
  path: ['endDate'],
194
251
  });
195
252
  }
@@ -198,12 +255,49 @@ exports.BookingItemSchema = zod_1.z
198
255
  if (data.startDate > today) {
199
256
  ctx.addIssue({
200
257
  code: zod_1.z.ZodIssueCode.custom,
201
- message: "IN_PROGRESS booking startDate must be before or equal to today's date",
258
+ message: "In Progress booking start date must be before or equal to today's date.",
202
259
  path: ['startDate'],
203
260
  });
204
261
  }
205
262
  }
263
+ if (data.status?.category === 'FINISHED_THE_JOB' && data.endDate) {
264
+ const today = new Date().toISOString().split('T')[0];
265
+ if (data.endDate > today) {
266
+ ctx.addIssue({
267
+ code: zod_1.z.ZodIssueCode.custom,
268
+ message: 'Cannot set status to Finished the Job when end date is in the future.',
269
+ path: ['status', 'category'],
270
+ });
271
+ }
272
+ }
273
+ if ((data.status?.category === 'FAILED_START' ||
274
+ data.status?.category === 'CANCELLED') &&
275
+ (data.comment ?? '').trim().length <= 8) {
276
+ ctx.addIssue({
277
+ code: zod_1.z.ZodIssueCode.custom,
278
+ message: 'too short',
279
+ path: ['comment'],
280
+ });
281
+ }
282
+ };
283
+ exports.bookingItemCrossFieldRules = bookingItemCrossFieldRules;
284
+ exports.BookingItemSchema = zod_1.z
285
+ .object({
286
+ worker: common_schemas_1.ResourceIdSchema.describe('Worker to Book'),
287
+ startDate: zod_1.z.string().date().describe('Start Date'),
288
+ endDate: zod_1.z.string().date().nullable().optional().describe('End Date'),
289
+ expectedEndDate: zod_1.z
290
+ .string()
291
+ .date()
292
+ .nullable()
293
+ .optional()
294
+ .describe('Expected End Date'),
295
+ pay: exports.BookingPaySchema.optional().describe('Pay Information'),
296
+ status: exports.BookingStatusSchema.optional().describe('Booking Status'),
297
+ comment: zod_1.z.string().optional().describe('Optional comment'),
298
+ workingDays: exports.WorkingDaysSchema.optional().describe('Working days (defaults to Mon–Fri when omitted)'),
206
299
  })
300
+ .superRefine(exports.bookingItemCrossFieldRules)
207
301
  .openapi({ title: 'BookingItem' });
208
302
  exports.FilterJobInBookingSchema = zod_1.z
209
303
  .object({
@@ -221,6 +315,9 @@ exports.FilterJobInBookingSchema = zod_1.z
221
315
  .nullable()
222
316
  .describe('Search Company'),
223
317
  tradeId: zod_1.z.string().uuid().optional().nullable().describe('Trade'),
318
+ location: common_schemas_1.LocationFilterSchema.optional()
319
+ .nullable()
320
+ .describe('Filter by location'),
224
321
  })
225
322
  .openapi({ title: 'FilterJobInBooking' });
226
323
  exports.BookingWorkerSchema = zod_1.z.object({
@@ -240,13 +337,11 @@ exports.CalendarWorkerSchema = zod_1.z
240
337
  lastName: zod_1.z.string().optional().nullable().describe('Last Name'),
241
338
  })
242
339
  .openapi({ title: 'CalendarWorker' });
243
- exports.CalendarUserSchema = zod_1.z
244
- .object({
340
+ exports.CalendarUserSchema = zod_1.z.object({
245
341
  id: zod_1.z.string().uuid().describe('User ID'),
246
342
  firstName: zod_1.z.string().describe('First Name'),
247
343
  lastName: zod_1.z.string().describe('Last Name'),
248
- })
249
- .openapi({ title: 'CalendarUser' });
344
+ });
250
345
  exports.CalendarLocationSchema = zod_1.z
251
346
  .object({
252
347
  postcode: zod_1.z.string().optional().nullable().describe('Postcode'),
@@ -264,7 +359,7 @@ exports.CalendarCompanySchema = zod_1.z
264
359
  .openapi({ title: 'CalendarCompany' });
265
360
  exports.CalendarCollaborationSchema = zod_1.z
266
361
  .object({
267
- id: zod_1.z.string().uuid().describe('Collaboration ID'),
362
+ id: zod_1.z.string().uuid().nullable().describe('Collaboration ID'),
268
363
  userId: zod_1.z
269
364
  .string()
270
365
  .uuid()
@@ -279,7 +374,7 @@ exports.CalendarCollaborationSchema = zod_1.z
279
374
  exports.CalendarJobSchema = zod_1.z
280
375
  .object({
281
376
  id: zod_1.z.string().uuid().describe('Job ID'),
282
- tradeId: zod_1.z.string().uuid().describe('Trade ID'),
377
+ tradeId: zod_1.z.string().uuid().nullable().describe('Trade ID'),
283
378
  createdById: zod_1.z
284
379
  .string()
285
380
  .uuid()
@@ -287,43 +382,58 @@ exports.CalendarJobSchema = zod_1.z
287
382
  .optional()
288
383
  .describe('Creator User ID (used for CASL condition evaluation)'),
289
384
  location: exports.CalendarLocationSchema.optional().nullable().describe('Location'),
290
- currentCollaboration: exports.CalendarCollaborationSchema.nullable()
385
+ collaboration: exports.CalendarCollaborationSchema.nullable()
291
386
  .optional()
292
- .describe('Current Collaboration'),
387
+ .describe('Collaboration'),
293
388
  createdAt: zod_1.z
294
389
  .union([zod_1.z.string().datetime(), zod_1.z.date()])
295
390
  .transform((val) => (val instanceof Date ? val.toISOString() : val))
296
391
  .describe('Creation Date'),
297
392
  })
298
393
  .openapi({ title: 'CalendarJob' });
394
+ // BookingJobSchema overrides JobSchema.collaboration to use the summary shape.
395
+ // findOne (and create/update) synthesize collaboration from the booking's own
396
+ // denormalized snapshot (booking.client / company / faUser), so id/status are
397
+ // always null. CollaborationSummarySchema accepts null id/status (Task 7).
398
+ exports.BookingJobSchema = jobs_contract_1.JobSchema.extend({
399
+ collaboration: summary_schemas_1.CollaborationSummarySchema.nullable().optional(),
400
+ tradeId: zod_1.z.string().uuid().nullable(),
401
+ }).openapi({ title: 'BookingJob' });
299
402
  // Main Schemas
300
403
  exports.BookingSchema = zod_1.z
301
404
  .object({
302
405
  id: zod_1.z.string().uuid().describe('Booking ID'),
303
- status: exports.BookingStatusSchema.describe('Booking Status'),
406
+ status: exports.BookingStatusSchema,
304
407
  startDate: zod_1.z
305
408
  .union([zod_1.z.string(), zod_1.z.date()])
306
- .transform((val) => (val instanceof Date ? val.toISOString() : val))
307
- .describe('Start Date'),
409
+ .transform((val) => (val instanceof Date ? val.toISOString() : val)),
308
410
  endDate: zod_1.z
309
411
  .union([zod_1.z.string(), zod_1.z.date(), zod_1.z.null()])
310
412
  .transform((val) => (val instanceof Date ? val.toISOString() : val))
311
413
  .nullable()
312
- .optional()
313
- .describe('End Date'),
314
- worker: workers_contract_1.WorkerSchema.describe('Worker'),
315
- user: users_contract_1.UserSchema.describe('User'),
316
- pay: exports.BookingPaySchema.describe('Pay Information'),
317
- job: jobs_contract_1.JobSchema.describe('Job'),
318
- userId: zod_1.z.string().uuid().describe('User ID'),
414
+ .optional(),
415
+ expectedEndDate: zod_1.z
416
+ .union([zod_1.z.string(), zod_1.z.date(), zod_1.z.null()])
417
+ .transform((val) => (val instanceof Date ? val.toISOString() : val))
418
+ .nullable()
419
+ .optional(),
420
+ worker: workers_contract_1.WorkerSchema,
421
+ user: users_contract_1.UserSchema,
422
+ pay: exports.BookingPaySchema,
423
+ job: exports.BookingJobSchema,
424
+ userId: zod_1.z.string().uuid(),
425
+ // Denormalized first agent — see BookingListItemSchema.faUserId. Required
426
+ // so the FieldFilterInterceptor can enforce the FA read-rule condition that
427
+ // gates job.collaboration client/company.
428
+ faUserId: zod_1.z.string().uuid().nullable().optional(),
429
+ comment: zod_1.z.string().nullable(),
430
+ workingDays: exports.WorkingDaysSchema,
319
431
  createdAt: zod_1.z
320
432
  .union([zod_1.z.string().datetime(), zod_1.z.date()])
321
- .transform((val) => (val instanceof Date ? val.toISOString() : val))
322
- .describe('Creation Date'),
433
+ .transform((val) => (val instanceof Date ? val.toISOString() : val)),
323
434
  updatedAt: zod_1.z
324
435
  .union([zod_1.z.string().datetime(), zod_1.z.date()])
325
- .transform((val) => (val instanceof Date ? val.toISOString() : val))
326
- .describe('Last Update Date'),
436
+ .transform((val) => (val instanceof Date ? val.toISOString() : val)),
327
437
  })
328
438
  .openapi({ title: 'Booking' });
329
439
  exports.CalendarBookingSchema = zod_1.z
@@ -340,9 +450,16 @@ exports.CalendarBookingSchema = zod_1.z
340
450
  .nullable()
341
451
  .optional()
342
452
  .describe('End Date'),
453
+ expectedEndDate: zod_1.z
454
+ .union([zod_1.z.string(), zod_1.z.date(), zod_1.z.null()])
455
+ .transform((val) => (val instanceof Date ? val.toISOString() : val))
456
+ .nullable()
457
+ .optional()
458
+ .describe('Expected End Date'),
343
459
  worker: exports.CalendarWorkerSchema.describe('Worker'),
344
460
  user: exports.CalendarUserSchema.describe('User'),
345
461
  userId: zod_1.z.string().uuid().describe('User ID'),
462
+ comment: zod_1.z.string().nullable().optional().describe('Optional comment'),
346
463
  createdAt: zod_1.z
347
464
  .union([zod_1.z.string().datetime(), zod_1.z.date()])
348
465
  .transform((val) => (val instanceof Date ? val.toISOString() : val))
@@ -363,7 +480,9 @@ exports.CalendarJobGroupSchema = zod_1.z
363
480
  .openapi({ title: 'CalendarJobGroup' });
364
481
  exports.CollaborationGroupHeaderSchema = zod_1.z
365
482
  .object({
366
- id: zod_1.z.string().uuid().describe('Collaboration ID'),
483
+ id: zod_1.z
484
+ .string()
485
+ .describe('Group key. A real collaboration UUID in the calendar view, or a synthetic composite key (collab:client|company|fa / creator:<id>) in the actives view.'),
367
486
  userId: zod_1.z
368
487
  .string()
369
488
  .uuid()
@@ -386,6 +505,10 @@ exports.CalendarCollaborationGroupSchema = zod_1.z
386
505
  .openapi({ title: 'CalendarCollaborationGroup' });
387
506
  exports.CreateBookingSchema = zod_1.z
388
507
  .object({
508
+ submissionId: zod_1.z
509
+ .string()
510
+ .uuid()
511
+ .describe('Stable idempotency key for this logical booking submission'),
389
512
  job: common_schemas_1.ResourceIdSchema.describe('Job'),
390
513
  bookings: zod_1.z.array(exports.BookingItemSchema).describe('List of Workers to Book'),
391
514
  })
@@ -398,24 +521,34 @@ exports.CreateBookingSchema = zod_1.z
398
521
  exports.UpdateBookingBaseSchema = zod_1.z.object({
399
522
  startDate: zod_1.z.string().date().optional().describe('Start Date'),
400
523
  endDate: zod_1.z.string().date().optional().nullable().describe('End Date'),
524
+ expectedEndDate: zod_1.z
525
+ .string()
526
+ .date()
527
+ .optional()
528
+ .nullable()
529
+ .describe('Expected End Date'),
401
530
  pay: exports.BookingPaySchema.optional().describe('Pay Information'),
402
531
  status: exports.BookingStatusSchema.optional().describe('Booking Status'),
532
+ comment: zod_1.z.string().nullable().optional().describe('Optional comment'),
533
+ workingDays: exports.WorkingDaysSchema.optional().describe('Working days (1=Mon … 7=Sun)'),
534
+ job: common_schemas_1.ResourceIdSchema.optional().describe('Reassign the booking to a different job (corrective). Cascades to denormalized fields and active records.'),
403
535
  });
404
536
  exports.UpdateBookingSchema = exports.UpdateBookingBaseSchema.superRefine((data, ctx) => {
405
537
  if (data.status?.type === 'COMPLETED' && !data.endDate) {
406
538
  ctx.addIssue({
407
539
  code: zod_1.z.ZodIssueCode.custom,
408
- message: 'End date is required when a booking is marked as completed',
540
+ message: 'End date is required when a booking is marked as Finished the job.',
409
541
  path: ['endDate'],
410
542
  });
411
543
  }
412
544
  if (data.endDate) {
413
545
  const today = new Date().toISOString().split('T')[0];
414
- if (data.endDate === today && data.status?.category !== 'COMPLETED') {
546
+ if (data.endDate === today &&
547
+ data.status?.category !== 'FINISHED_THE_JOB') {
415
548
  ctx.addIssue({
416
549
  code: zod_1.z.ZodIssueCode.custom,
417
- message: 'When setting endDate to today, booking status must be COMPLETED',
418
- path: ['status'],
550
+ message: 'When setting endDate to today, booking status must be FINISHED_THE_JOB',
551
+ path: ['status', 'category'],
419
552
  });
420
553
  }
421
554
  }
@@ -424,11 +557,21 @@ exports.UpdateBookingSchema = exports.UpdateBookingBaseSchema.superRefine((data,
424
557
  if (data.startDate > today) {
425
558
  ctx.addIssue({
426
559
  code: zod_1.z.ZodIssueCode.custom,
427
- message: "IN_PROGRESS booking startDate must be before or equal to today's date",
560
+ message: "In Progress booking start date must be before or equal to today's date.",
428
561
  path: ['startDate'],
429
562
  });
430
563
  }
431
564
  }
565
+ if (data.status?.category === 'FINISHED_THE_JOB' && data.endDate) {
566
+ const today = new Date().toISOString().split('T')[0];
567
+ if (data.endDate > today) {
568
+ ctx.addIssue({
569
+ code: zod_1.z.ZodIssueCode.custom,
570
+ message: 'Cannot set status to Finished the Job when end date is in the future.',
571
+ path: ['status', 'category'],
572
+ });
573
+ }
574
+ }
432
575
  }).openapi({ title: 'UpdateBooking' });
433
576
  exports.BatchUpdateBookingSchema = zod_1.z
434
577
  .object({
@@ -460,37 +603,35 @@ exports.BatchDeleteBookingResponseSchema = zod_1.z
460
603
  })
461
604
  .openapi({ title: 'BatchDeleteBookingResponse' });
462
605
  exports.FilterBookingSchema = pagination_query_schema_1.PaginationQuerySchema.extend({
463
- workerName: zod_1.z.string().optional().nullable().describe('Search Worker'),
464
- agentId: zod_1.z
465
- .string()
466
- .uuid()
467
- .optional()
606
+ startDate: common_schemas_1.DateRangeSchema.optional()
468
607
  .nullable()
469
- .describe('Search Second Agent'),
608
+ .describe('Filter by start date range'),
609
+ workerName: common_schemas_1.NameFilterSchema.optional()
610
+ .nullable()
611
+ .describe('Search Worker (value) with optional exact match'),
470
612
  status: exports.FilterBookingStatusSchema.optional()
471
613
  .nullable()
472
614
  .describe('Filter by status'),
473
615
  job: exports.FilterJobInBookingSchema.optional()
474
616
  .nullable()
475
617
  .describe('Filter by job details'),
618
+ agentId: zod_1.z
619
+ .string()
620
+ .uuid()
621
+ .optional()
622
+ .nullable()
623
+ .describe('Search Second Agent'),
624
+ endDate: common_schemas_1.DateRangeSchema.optional()
625
+ .nullable()
626
+ .describe('Filter by end date range'),
476
627
  createdAt: common_schemas_1.DateRangeSchema.optional()
477
628
  .nullable()
478
629
  .describe('Filter by created date range'),
479
630
  updatedAt: common_schemas_1.DateRangeSchema.optional()
480
631
  .nullable()
481
632
  .describe('Filter by updated date range'),
482
- startDate: common_schemas_1.DateRangeSchema.optional()
483
- .nullable()
484
- .describe('Filter by start date range'),
485
- endDate: common_schemas_1.DateRangeSchema.optional()
486
- .nullable()
487
- .describe('Filter by end date range'),
488
- sortBy: exports.BookingSortableFieldsSchema.optional()
489
- .nullable()
490
- .describe('Field to sort by'),
491
- sortOrder: common_schemas_1.SortOrderSchema.optional().nullable().describe('Sort order'),
633
+ sort: (0, common_schemas_1.createSortArraySchema)(exports.BookingSortableFieldsSchema),
492
634
  });
493
- const actives_contract_1 = require("../actives/actives.contract");
494
635
  exports.BookingCategoryGroupSchema = zod_1.z
495
636
  .object({
496
637
  bookings: zod_1.z
@@ -500,9 +641,13 @@ exports.BookingCategoryGroupSchema = zod_1.z
500
641
  })
501
642
  .openapi({ title: 'BookingCategoryGroup' });
502
643
  // Ongoing bookings can have an associated Active record for the specific day
644
+ // ActiveSchema is referenced via lazy require() to break the bookings↔actives
645
+ // circular import (both contracts reference each other's schemas).
646
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
647
+ const getActiveSchema = () => require('../actives/actives.contract').ActiveSchema;
503
648
  exports.OngoingBookingSchema = exports.BookingSchema.extend({
504
649
  active: zod_1.z
505
- .lazy(() => actives_contract_1.ActiveSchema.omit({ booking: true }))
650
+ .lazy(() => getActiveSchema().omit({ booking: true }))
506
651
  .optional()
507
652
  .nullable()
508
653
  .describe('Active record for the specific calendar date'),
@@ -543,31 +688,167 @@ exports.CalendarBookingsResponseSchema = zod_1.z
543
688
  .describe('Pagination metadata (search mode only)'),
544
689
  })
545
690
  .openapi({ title: 'CalendarBookingsResponse' });
546
- exports.FilterCalendarBookingsSchema = exports.FilterBookingSchema.extend({
691
+ /** Flat calendar booking with embedded job context — frontend groups by date/collaboration/job */
692
+ exports.FlatCalendarBookingSchema = zod_1.z
693
+ .object({
694
+ id: zod_1.z.string().uuid(),
695
+ status: exports.BookingStatusSchema,
547
696
  startDate: zod_1.z
697
+ .union([zod_1.z.string(), zod_1.z.date()])
698
+ .transform((val) => (val instanceof Date ? val.toISOString() : val)),
699
+ endDate: zod_1.z
700
+ .union([zod_1.z.string(), zod_1.z.date(), zod_1.z.null()])
701
+ .transform((val) => (val instanceof Date ? val.toISOString() : val))
702
+ .nullable()
703
+ .optional(),
704
+ expectedEndDate: zod_1.z
705
+ .union([zod_1.z.string(), zod_1.z.date(), zod_1.z.null()])
706
+ .transform((val) => (val instanceof Date ? val.toISOString() : val))
707
+ .nullable()
708
+ .optional(),
709
+ createdAt: zod_1.z
710
+ .union([zod_1.z.string().datetime(), zod_1.z.date()])
711
+ .transform((val) => (val instanceof Date ? val.toISOString() : val)),
712
+ userId: zod_1.z.string().uuid().describe('Booking owner User ID'),
713
+ // Denormalized first agent — see BookingListItemSchema.faUserId. Required so
714
+ // the FieldFilterInterceptor can enforce the FA read-rule condition that
715
+ // gates job.collaboration client/company on the calendar view too.
716
+ faUserId: zod_1.z
548
717
  .string()
549
- .date()
550
- .optional()
551
- .describe('Start date for calendar view'),
552
- limit: zod_1.z.coerce
553
- .number()
718
+ .uuid()
719
+ .nullable()
554
720
  .optional()
555
- .default(7)
556
- .describe('Days per page (default 7)'),
557
- includeEmptyDays: zod_1.z
558
- .preprocess((val) => val === 'true' || val === true, zod_1.z.boolean())
721
+ .describe('First Agent User ID'),
722
+ comment: zod_1.z.string().nullable().optional().describe('Optional comment'),
723
+ worker: exports.CalendarWorkerSchema,
724
+ user: exports.CalendarUserSchema,
725
+ job: zod_1.z.object({
726
+ id: zod_1.z.string().uuid(),
727
+ tradeId: zod_1.z.string().uuid().nullable(),
728
+ createdById: zod_1.z.string().uuid().nullable().optional(),
729
+ createdAt: zod_1.z
730
+ .union([zod_1.z.string().datetime(), zod_1.z.date()])
731
+ .transform((val) => (val instanceof Date ? val.toISOString() : val)),
732
+ location: exports.CalendarLocationSchema.optional().nullable(),
733
+ collaboration: zod_1.z
734
+ .object({
735
+ id: zod_1.z.string().uuid().nullable(),
736
+ userId: zod_1.z.string().uuid().nullable().optional(),
737
+ client: exports.CalendarClientSchema.nullable().optional(),
738
+ company: exports.CalendarCompanySchema.nullable().optional(),
739
+ user: exports.CalendarUserSchema.nullable().optional().describe('FA Agent'),
740
+ })
741
+ .nullable()
742
+ .optional(),
743
+ }),
744
+ })
745
+ .openapi({ title: 'FlatCalendarBooking' });
746
+ /** Response for calendar endpoint — uses `data` key for interceptor compatibility */
747
+ exports.FlatCalendarBookingsResponseSchema = zod_1.z
748
+ .object({
749
+ mode: zod_1.z.enum(['calendar', 'search']),
750
+ startDate: zod_1.z.string().date().nullable(),
751
+ endDate: zod_1.z.string().date().nullable(),
752
+ data: zod_1.z.array(exports.FlatCalendarBookingSchema),
753
+ pagination: zod_1.z
754
+ .object({
755
+ totalBookings: zod_1.z.number(),
756
+ })
757
+ .optional(),
758
+ })
759
+ .openapi({ title: 'FlatCalendarBookingsResponse' });
760
+ exports.FilterCalendarBookingsSchema = exports.FilterBookingSchema.omit({
761
+ page: true,
762
+ limit: true,
763
+ startDate: true,
764
+ endDate: true,
765
+ createdAt: true,
766
+ updatedAt: true,
767
+ })
768
+ .extend({
769
+ weekEnding: zod_1.z
770
+ .string()
771
+ .date()
559
772
  .optional()
560
- .default(true)
561
- .describe('Include days with no bookings (default true)'),
562
- }).openapi({ title: 'FilterCalendarBookings' });
773
+ .describe('Week-ending Sunday date for calendar view'),
774
+ })
775
+ .openapi({ title: 'FilterCalendarBookings' });
563
776
  exports.PaginatedBookingResponseSchema = (0, pagination_schema_1.createPaginatedResponseSchema)(exports.BookingSchema)
564
777
  .describe('Bookings retrieved successfully')
565
778
  .openapi({ title: 'BookingsPaginatedResponse' });
779
+ // ─── Booking List Item Schemas ────────────────────────────────────────────────
780
+ // Slim schemas used by the bookings list/table view.
781
+ // Includes phone numbers for WhatsApp button, but avoids full worker/user payloads.
782
+ // Worker summary with phone numbers (needed for WhatsApp button in table)
783
+ exports.BookingWorkerSummarySchema = summary_schemas_1.WorkerSummarySchema.extend({
784
+ phoneNumbers: zod_1.z.array(workers_contract_1.WorkerPhoneNumberSchema).default([]),
785
+ bookingHistory: booking_history_schema_1.BookingHistorySchema.optional(),
786
+ }).openapi({ title: 'BookingWorkerSummary' });
787
+ // Job summary for booking context (only tradeId + location + collaboration)
788
+ exports.BookingJobSummarySchema = zod_1.z
789
+ .object({
790
+ id: zod_1.z.string().uuid(),
791
+ tradeId: zod_1.z.string().uuid().nullable(),
792
+ createdById: zod_1.z.string().uuid().nullable().optional(),
793
+ createdBy: summary_schemas_1.UserSummarySchema.nullable().optional(),
794
+ location: summary_schemas_1.LocationSummarySchema.nullable().optional(),
795
+ collaboration: summary_schemas_1.CollaborationSummarySchema.nullable().optional(),
796
+ })
797
+ .openapi({ title: 'BookingJobSummary' });
798
+ exports.BookingListItemSchema = zod_1.z
799
+ .object({
800
+ id: zod_1.z.string().uuid(),
801
+ startDate: zod_1.z
802
+ .union([zod_1.z.string(), zod_1.z.date()])
803
+ .transform((val) => (val instanceof Date ? val.toISOString() : val)),
804
+ endDate: zod_1.z
805
+ .union([zod_1.z.string(), zod_1.z.date(), zod_1.z.null()])
806
+ .transform((val) => (val instanceof Date ? val.toISOString() : val))
807
+ .nullable()
808
+ .optional(),
809
+ expectedEndDate: zod_1.z
810
+ .union([zod_1.z.string(), zod_1.z.date(), zod_1.z.null()])
811
+ .transform((val) => (val instanceof Date ? val.toISOString() : val))
812
+ .nullable()
813
+ .optional(),
814
+ userId: zod_1.z.string().uuid(),
815
+ // Denormalized collaboration owner (first agent). Exposed so the
816
+ // FieldFilterInterceptor can evaluate the FA read-rule condition
817
+ // (`faUserId == me`) that gates the collaboration client/company fields.
818
+ // Without it the condition is unverifiable and passes vacuously, leaking
819
+ // those fields to second agents on collaborations they don't own.
820
+ faUserId: zod_1.z.string().uuid().nullable().optional(),
821
+ status: exports.BookingStatusSchema,
822
+ comment: zod_1.z.string().nullable(),
823
+ pay: exports.BookingPaySchema,
824
+ worker: exports.BookingWorkerSummarySchema,
825
+ user: summary_schemas_1.UserSummarySchema,
826
+ job: exports.BookingJobSummarySchema,
827
+ createdAt: zod_1.z
828
+ .union([zod_1.z.string().datetime(), zod_1.z.date()])
829
+ .transform((val) => (val instanceof Date ? val.toISOString() : val)),
830
+ updatedAt: zod_1.z
831
+ .union([zod_1.z.string().datetime(), zod_1.z.date()])
832
+ .transform((val) => (val instanceof Date ? val.toISOString() : val)),
833
+ })
834
+ .openapi({ title: 'BookingListItem' });
835
+ exports.PaginatedBookingListResponseSchema = (0, pagination_schema_1.createPaginatedResponseSchema)(exports.BookingListItemSchema)
836
+ .describe('Bookings list retrieved successfully')
837
+ .openapi({ title: 'BookingListPaginatedResponse' });
566
838
  exports.BookingArraySchema = zod_1.z
567
839
  .array(exports.BookingSchema)
568
840
  .openapi({ title: 'BookingArray' });
569
841
  // Contract Definition
570
842
  const c = (0, core_1.initContract)();
843
+ exports.BookingConflictsResponseSchema = zod_1.z
844
+ .array(zod_1.z.object({
845
+ workerId: zod_1.z.string().uuid(),
846
+ /** Live (current or upcoming) bookings on this worker's identity, ending-last first. */
847
+ conflicts: zod_1.z.array(live_booking_schema_1.LiveBookingSummarySchema),
848
+ /** Active contact suppression on this worker's identity, when present. */
849
+ suppression: contact_suppressions_contract_1.SuppressionStateSchema.optional(),
850
+ }))
851
+ .openapi({ title: 'BookingConflictsResponse' });
571
852
  exports.bookingsContractRouter = c.router({
572
853
  create: {
573
854
  method: 'POST',
@@ -583,11 +864,22 @@ exports.bookingsContractRouter = c.router({
583
864
  openApi: { operationId: 'createBookings' },
584
865
  },
585
866
  },
867
+ checkConflicts: {
868
+ method: 'GET',
869
+ path: '/v2/bookings/conflicts',
870
+ query: zod_1.z.object({
871
+ /** CSV of worker ids (max 50) to check. */
872
+ workerIds: zod_1.z.string().min(1),
873
+ }),
874
+ responses: { 200: exports.BookingConflictsResponseSchema },
875
+ summary: 'Advisory pre-booking conflict check: live or upcoming bookings on each worker identity (self, curated siblings, curated denorm). Does not block creation.',
876
+ metadata: { tags: ['Bookings'] },
877
+ },
586
878
  findAll: {
587
879
  method: 'GET',
588
880
  path: '/v2/bookings',
589
881
  responses: {
590
- 200: exports.PaginatedBookingResponseSchema,
882
+ 200: exports.PaginatedBookingListResponseSchema,
591
883
  },
592
884
  query: exports.FilterBookingSchema,
593
885
  summary: 'Get all bookings',
@@ -683,7 +975,7 @@ exports.bookingsContractRouter = c.router({
683
975
  method: 'GET',
684
976
  path: '/v2/bookings/calendar',
685
977
  responses: {
686
- 200: exports.CalendarBookingsResponseSchema,
978
+ 200: exports.FlatCalendarBookingsResponseSchema,
687
979
  },
688
980
  query: exports.FilterCalendarBookingsSchema,
689
981
  summary: 'Get bookings grouped by day for calendar view',