@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.
- package/dist/abilities/abilities.contract.d.ts +53 -1
- package/dist/abilities/abilities.contract.d.ts.map +1 -1
- package/dist/abilities/abilities.contract.js +92 -1
- package/dist/abilities/abilities.contract.spec.d.ts +2 -0
- package/dist/abilities/abilities.contract.spec.d.ts.map +1 -0
- package/dist/abilities/abilities.contract.spec.js +145 -0
- package/dist/abilities/admin-dashboard.abilities.test.d.ts +2 -0
- package/dist/abilities/admin-dashboard.abilities.test.d.ts.map +1 -0
- package/dist/abilities/admin-dashboard.abilities.test.js +33 -0
- package/dist/abilities/admin.abilities.json +19 -0
- package/dist/abilities/bot.abilities.json +13 -4
- package/dist/abilities/first-agent.abilities.json +317 -70
- package/dist/abilities/interconnection.abilities.json +75 -0
- package/dist/abilities/kpi.abilities.json +68 -0
- package/dist/abilities/office-manager.abilities.json +111 -0
- package/dist/abilities/second-agent.abilities.json +417 -43
- package/dist/abilities/team-leads.json +71 -6
- package/dist/abilities/worker-curator.abilities.json +233 -0
- package/dist/actives/actives.contract.d.ts +19379 -23651
- package/dist/actives/actives.contract.d.ts.map +1 -1
- package/dist/actives/actives.contract.js +517 -114
- package/dist/agent-client-links/agent-client-links.contract.d.ts +1431 -291
- package/dist/agent-client-links/agent-client-links.contract.d.ts.map +1 -1
- package/dist/auth/auth.contract.d.ts +1050 -81
- package/dist/auth/auth.contract.d.ts.map +1 -1
- package/dist/auth/auth.contract.js +115 -3
- package/dist/bookings/booking-worker-summary.spec.d.ts +2 -0
- package/dist/bookings/booking-worker-summary.spec.d.ts.map +1 -0
- package/dist/bookings/booking-worker-summary.spec.js +25 -0
- package/dist/bookings/bookings.contract.d.ts +20643 -26117
- package/dist/bookings/bookings.contract.d.ts.map +1 -1
- package/dist/bookings/bookings.contract.js +383 -91
- package/dist/bookings/bookings.contract.spec.d.ts +2 -0
- package/dist/bookings/bookings.contract.spec.d.ts.map +1 -0
- package/dist/bookings/bookings.contract.spec.js +11 -0
- package/dist/bookings/job-lock.spec.d.ts +2 -0
- package/dist/bookings/job-lock.spec.d.ts.map +1 -0
- package/dist/bookings/job-lock.spec.js +56 -0
- package/dist/bot-parse-cache/bot-parse-cache.contract.d.ts +232 -0
- package/dist/bot-parse-cache/bot-parse-cache.contract.d.ts.map +1 -0
- package/dist/bot-parse-cache/bot-parse-cache.contract.js +64 -0
- package/dist/call-history/call-history.contract.d.ts +1336 -767
- package/dist/call-history/call-history.contract.d.ts.map +1 -1
- package/dist/call-history/call-history.contract.js +86 -10
- package/dist/calls-feed/calls-feed.contract.d.ts +417 -0
- package/dist/calls-feed/calls-feed.contract.d.ts.map +1 -0
- package/dist/calls-feed/calls-feed.contract.js +32 -0
- package/dist/client-contacts/client-contacts.contract.d.ts +410 -226
- package/dist/client-contacts/client-contacts.contract.d.ts.map +1 -1
- package/dist/client-contacts/client-contacts.contract.js +35 -4
- package/dist/clients/clients.contract.d.ts +227 -73
- package/dist/clients/clients.contract.d.ts.map +1 -1
- package/dist/clients/clients.contract.js +45 -21
- package/dist/collaboration-checkings/collaboration-checkings.contract.d.ts +2908 -1834
- package/dist/collaboration-checkings/collaboration-checkings.contract.d.ts.map +1 -1
- package/dist/collaboration-checkings/collaboration-checkings.contract.js +14 -9
- package/dist/collaborations/collaborations.contract.d.ts +2676 -1409
- package/dist/collaborations/collaborations.contract.d.ts.map +1 -1
- package/dist/collaborations/collaborations.contract.js +33 -9
- package/dist/common/call-rating.schema.d.ts.map +1 -1
- package/dist/common/call-rating.schema.js +4 -2
- package/dist/common/common-schemas.d.ts +59 -11
- package/dist/common/common-schemas.d.ts.map +1 -1
- package/dist/common/common-schemas.js +55 -29
- package/dist/common/error-schemas.d.ts +2 -2
- package/dist/common/pagination-query.schema.d.ts +13 -2
- package/dist/common/pagination-query.schema.d.ts.map +1 -1
- package/dist/common/pagination-query.schema.js +21 -2
- package/dist/common/pagination-query.schema.spec.d.ts +2 -0
- package/dist/common/pagination-query.schema.spec.d.ts.map +1 -0
- package/dist/common/pagination-query.schema.spec.js +53 -0
- package/dist/companies/companies.contract.d.ts +53 -28
- package/dist/companies/companies.contract.d.ts.map +1 -1
- package/dist/companies/companies.contract.js +11 -10
- package/dist/crews/crews.contract.d.ts +1010 -196
- package/dist/crews/crews.contract.d.ts.map +1 -1
- package/dist/crews/crews.contract.js +98 -17
- package/dist/crews/crews.contract.spec.d.ts +2 -0
- package/dist/crews/crews.contract.spec.d.ts.map +1 -0
- package/dist/crews/crews.contract.spec.js +67 -0
- package/dist/cron-executions/cron-executions.contract.d.ts +988 -59
- package/dist/cron-executions/cron-executions.contract.d.ts.map +1 -1
- package/dist/cron-executions/cron-executions.contract.js +127 -7
- package/dist/curated-worker-leads/__tests__/disposition-reason.spec.d.ts +2 -0
- package/dist/curated-worker-leads/__tests__/disposition-reason.spec.d.ts.map +1 -0
- package/dist/curated-worker-leads/__tests__/disposition-reason.spec.js +40 -0
- package/dist/curated-worker-leads/candidate-coordination-snapshot.spec.d.ts +2 -0
- package/dist/curated-worker-leads/candidate-coordination-snapshot.spec.d.ts.map +1 -0
- package/dist/curated-worker-leads/candidate-coordination-snapshot.spec.js +16 -0
- package/dist/curated-worker-leads/candidate-coordination.contract.d.ts +21650 -0
- package/dist/curated-worker-leads/candidate-coordination.contract.d.ts.map +1 -0
- package/dist/curated-worker-leads/candidate-coordination.contract.js +921 -0
- package/dist/curated-worker-leads/candidate-coordination.contract.spec.d.ts +2 -0
- package/dist/curated-worker-leads/candidate-coordination.contract.spec.d.ts.map +1 -0
- package/dist/curated-worker-leads/candidate-coordination.contract.spec.js +51 -0
- package/dist/curated-worker-leads/candidate-edit-session.contract.d.ts +2364 -0
- package/dist/curated-worker-leads/candidate-edit-session.contract.d.ts.map +1 -0
- package/dist/curated-worker-leads/candidate-edit-session.contract.js +173 -0
- package/dist/curated-worker-leads/consent-queue.contract.d.ts +4497 -0
- package/dist/curated-worker-leads/consent-queue.contract.d.ts.map +1 -0
- package/dist/curated-worker-leads/consent-queue.contract.js +201 -0
- package/dist/curated-worker-leads/contact-history.spec.d.ts +2 -0
- package/dist/curated-worker-leads/contact-history.spec.d.ts.map +1 -0
- package/dist/curated-worker-leads/contact-history.spec.js +88 -0
- package/dist/curated-worker-leads/contact-session.contract.spec.d.ts +2 -0
- package/dist/curated-worker-leads/contact-session.contract.spec.d.ts.map +1 -0
- package/dist/curated-worker-leads/contact-session.contract.spec.js +315 -0
- package/dist/curated-worker-leads/curated-worker-lead-config.contract.d.ts +489 -0
- package/dist/curated-worker-leads/curated-worker-lead-config.contract.d.ts.map +1 -0
- package/dist/curated-worker-leads/curated-worker-lead-config.contract.js +88 -0
- package/dist/curated-worker-leads/curated-worker-leads.contract.d.ts +135 -0
- package/dist/curated-worker-leads/curated-worker-leads.contract.d.ts.map +1 -0
- package/dist/curated-worker-leads/curated-worker-leads.contract.js +32 -0
- package/dist/curated-worker-leads/job-candidate-cards.spec.d.ts +2 -0
- package/dist/curated-worker-leads/job-candidate-cards.spec.d.ts.map +1 -0
- package/dist/curated-worker-leads/job-candidate-cards.spec.js +157 -0
- package/dist/curated-worker-leads/job-candidates.spec.d.ts +2 -0
- package/dist/curated-worker-leads/job-candidates.spec.d.ts.map +1 -0
- package/dist/curated-worker-leads/job-candidates.spec.js +140 -0
- package/dist/curated-worker-leads/job-feed-match-counts.contract.spec.d.ts +2 -0
- package/dist/curated-worker-leads/job-feed-match-counts.contract.spec.d.ts.map +1 -0
- package/dist/curated-worker-leads/job-feed-match-counts.contract.spec.js +19 -0
- package/dist/curated-worker-leads/jobs-tab.contract.d.ts +18365 -0
- package/dist/curated-worker-leads/jobs-tab.contract.d.ts.map +1 -0
- package/dist/curated-worker-leads/jobs-tab.contract.js +642 -0
- package/dist/curated-worker-leads/lead-agent-area.contract.d.ts +348 -0
- package/dist/curated-worker-leads/lead-agent-area.contract.d.ts.map +1 -0
- package/dist/curated-worker-leads/lead-agent-area.contract.js +51 -0
- package/dist/curated-worker-leads/owned-jobs-tab.contract.d.ts +1116 -0
- package/dist/curated-worker-leads/owned-jobs-tab.contract.d.ts.map +1 -0
- package/dist/curated-worker-leads/owned-jobs-tab.contract.js +93 -0
- package/dist/curated-workers/curated-filter-additions.spec.d.ts +2 -0
- package/dist/curated-workers/curated-filter-additions.spec.d.ts.map +1 -0
- package/dist/curated-workers/curated-filter-additions.spec.js +17 -0
- package/dist/curated-workers/curated-job-seeking.spec.d.ts +2 -0
- package/dist/curated-workers/curated-job-seeking.spec.d.ts.map +1 -0
- package/dist/curated-workers/curated-job-seeking.spec.js +53 -0
- package/dist/curated-workers/curated-workers-id-documents.spec.d.ts +2 -0
- package/dist/curated-workers/curated-workers-id-documents.spec.d.ts.map +1 -0
- package/dist/curated-workers/curated-workers-id-documents.spec.js +38 -0
- package/dist/curated-workers/curated-workers.contract.d.ts +6160 -1906
- package/dist/curated-workers/curated-workers.contract.d.ts.map +1 -1
- package/dist/curated-workers/curated-workers.contract.js +333 -51
- package/dist/dashboards/agent-daily-metrics.contract.d.ts +10 -10
- package/dist/dashboards/agent-daily-metrics.contract.js +1 -1
- package/dist/dashboards/dashboard-widgets.contract.d.ts +3800 -496
- package/dist/dashboards/dashboard-widgets.contract.d.ts.map +1 -1
- package/dist/dashboards/dashboard-widgets.contract.js +527 -29
- package/dist/dashboards/dashboard.contract.d.ts +8 -8
- package/dist/document-intake/document-intake.contract.d.ts +3132 -0
- package/dist/document-intake/document-intake.contract.d.ts.map +1 -0
- package/dist/document-intake/document-intake.contract.js +418 -0
- package/dist/export-jobs/export-jobs.contract.d.ts +3918 -0
- package/dist/export-jobs/export-jobs.contract.d.ts.map +1 -0
- package/dist/export-jobs/export-jobs.contract.js +240 -0
- package/dist/exports-events/exports-events.schemas.d.ts +90 -0
- package/dist/exports-events/exports-events.schemas.d.ts.map +1 -0
- package/dist/exports-events/exports-events.schemas.js +56 -0
- package/dist/files/files.contract.d.ts +133 -126
- package/dist/files/files.contract.d.ts.map +1 -1
- package/dist/files/files.contract.js +8 -0
- package/dist/health/health.contract.d.ts +4 -4
- package/dist/index.d.ts +82 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +87 -1
- package/dist/interactions/interactions.contract.d.ts +162 -0
- package/dist/interactions/interactions.contract.d.ts.map +1 -0
- package/dist/interactions/interactions.contract.js +42 -0
- package/dist/job-clusters/job-clusters.contract.d.ts +1584 -0
- package/dist/job-clusters/job-clusters.contract.d.ts.map +1 -0
- package/dist/job-clusters/job-clusters.contract.js +133 -0
- package/dist/jobs/jobs.contract.d.ts +16517 -8495
- package/dist/jobs/jobs.contract.d.ts.map +1 -1
- package/dist/jobs/jobs.contract.js +394 -190
- package/dist/jobs/jobs.contract.spec.d.ts +2 -0
- package/dist/jobs/jobs.contract.spec.d.ts.map +1 -0
- package/dist/jobs/jobs.contract.spec.js +70 -0
- package/dist/kpi-impersonation/kpi-impersonation.contract.d.ts +75 -75
- package/dist/lead-assignments/lead-assignments.contract.d.ts +2933 -1122
- package/dist/lead-assignments/lead-assignments.contract.d.ts.map +1 -1
- package/dist/lead-assignments/lead-assignments.contract.js +29 -7
- package/dist/lead-distribution/agent-lead-distribution.contract.d.ts +328 -64
- package/dist/lead-distribution/agent-lead-distribution.contract.d.ts.map +1 -1
- package/dist/lead-distribution/agent-lead-distribution.contract.js +1 -1
- package/dist/lead-distribution/lead-distribution-config.contract.d.ts +31 -31
- package/dist/leads/leads.contract.d.ts +830 -368
- package/dist/leads/leads.contract.d.ts.map +1 -1
- package/dist/leads/leads.contract.js +106 -26
- package/dist/locations/locations.contract.d.ts +36 -36
- package/dist/notifications/notifications.contract.d.ts +1039 -0
- package/dist/notifications/notifications.contract.d.ts.map +1 -0
- package/dist/notifications/notifications.contract.js +110 -0
- package/dist/offices/offices.contract.d.ts +210 -60
- package/dist/offices/offices.contract.d.ts.map +1 -1
- package/dist/offices/offices.contract.js +18 -4
- package/dist/outreach/__tests__/outreach-claim.test.d.ts +2 -0
- package/dist/outreach/__tests__/outreach-claim.test.d.ts.map +1 -0
- package/dist/outreach/__tests__/outreach-claim.test.js +97 -0
- package/dist/outreach/__tests__/outreach-confirm-release.test.d.ts +2 -0
- package/dist/outreach/__tests__/outreach-confirm-release.test.d.ts.map +1 -0
- package/dist/outreach/__tests__/outreach-confirm-release.test.js +98 -0
- package/dist/outreach/__tests__/outreach-routes.test.d.ts +2 -0
- package/dist/outreach/__tests__/outreach-routes.test.d.ts.map +1 -0
- package/dist/outreach/__tests__/outreach-routes.test.js +57 -0
- package/dist/outreach/__tests__/outreach.schemas.test.d.ts +2 -0
- package/dist/outreach/__tests__/outreach.schemas.test.d.ts.map +1 -0
- package/dist/outreach/__tests__/outreach.schemas.test.js +140 -0
- package/dist/outreach/outreach.contract.d.ts +809 -0
- package/dist/outreach/outreach.contract.d.ts.map +1 -0
- package/dist/outreach/outreach.contract.js +195 -0
- package/dist/outreach/outreach.schemas.d.ts +113 -0
- package/dist/outreach/outreach.schemas.d.ts.map +1 -0
- package/dist/outreach/outreach.schemas.js +132 -0
- package/dist/own-research/own-research.contract.d.ts +1356 -552
- package/dist/own-research/own-research.contract.d.ts.map +1 -1
- package/dist/own-research/own-research.contract.js +14 -3
- package/dist/postcodes/postcodes.contract.d.ts +16 -16
- package/dist/proofs/proof-category.enum.d.ts +4 -0
- package/dist/proofs/proof-category.enum.d.ts.map +1 -0
- package/dist/proofs/proof-category.enum.js +5 -0
- package/dist/proofs/proof-entity-type.enum.d.ts +4 -0
- package/dist/proofs/proof-entity-type.enum.d.ts.map +1 -0
- package/dist/proofs/proof-entity-type.enum.js +5 -0
- package/dist/proofs/proof-type.enum.d.ts +28 -0
- package/dist/proofs/proof-type.enum.d.ts.map +1 -0
- package/dist/proofs/proof-type.enum.js +14 -0
- package/dist/proofs/proofs.contract.d.ts +3009 -0
- package/dist/proofs/proofs.contract.d.ts.map +1 -0
- package/dist/proofs/proofs.contract.js +92 -0
- package/dist/proofs/proofs.dtos.d.ts +1319 -0
- package/dist/proofs/proofs.dtos.d.ts.map +1 -0
- package/dist/proofs/proofs.dtos.js +178 -0
- package/dist/qualifications/qualifications.contract.d.ts +94 -94
- package/dist/realtime/data-changed.d.ts +21 -0
- package/dist/realtime/data-changed.d.ts.map +1 -0
- package/dist/realtime/data-changed.js +37 -0
- package/dist/shared/booking-history.schema.d.ts +27 -0
- package/dist/shared/booking-history.schema.d.ts.map +1 -0
- package/dist/shared/booking-history.schema.js +22 -0
- package/dist/shared/booking-history.spec.d.ts +2 -0
- package/dist/shared/booking-history.spec.d.ts.map +1 -0
- package/dist/shared/booking-history.spec.js +44 -0
- package/dist/shared/contact-suppressions.contract.d.ts +22 -0
- package/dist/shared/contact-suppressions.contract.d.ts.map +1 -0
- package/dist/shared/contact-suppressions.contract.js +13 -0
- package/dist/shared/live-booking.schema.d.ts +57 -0
- package/dist/shared/live-booking.schema.d.ts.map +1 -0
- package/dist/shared/live-booking.schema.js +34 -0
- package/dist/shared/summary-schemas.d.ts +218 -0
- package/dist/shared/summary-schemas.d.ts.map +1 -0
- package/dist/shared/summary-schemas.js +56 -0
- package/dist/sheets-sync/__tests__/sheets-sync-events.schemas.test.d.ts +2 -0
- package/dist/sheets-sync/__tests__/sheets-sync-events.schemas.test.d.ts.map +1 -0
- package/dist/sheets-sync/__tests__/sheets-sync-events.schemas.test.js +20 -0
- package/dist/sheets-sync/__tests__/tab-sync-config.schema.test.d.ts +2 -0
- package/dist/sheets-sync/__tests__/tab-sync-config.schema.test.d.ts.map +1 -0
- package/dist/sheets-sync/__tests__/tab-sync-config.schema.test.js +41 -0
- package/dist/sheets-sync/sheets-sync-events.schemas.d.ts +43 -0
- package/dist/sheets-sync/sheets-sync-events.schemas.d.ts.map +1 -0
- package/dist/sheets-sync/sheets-sync-events.schemas.js +29 -0
- package/dist/sheets-sync/sheets-sync.contract.d.ts +7258 -0
- package/dist/sheets-sync/sheets-sync.contract.d.ts.map +1 -0
- package/dist/sheets-sync/sheets-sync.contract.js +323 -0
- package/dist/telegram/telegram.contract.d.ts +727 -0
- package/dist/telegram/telegram.contract.d.ts.map +1 -0
- package/dist/telegram/telegram.contract.js +75 -0
- package/dist/trades/trade-rate-assessment.d.ts +18 -0
- package/dist/trades/trade-rate-assessment.d.ts.map +1 -0
- package/dist/trades/trade-rate-assessment.js +46 -0
- package/dist/trades/trade-rate-assessment.spec.d.ts +2 -0
- package/dist/trades/trade-rate-assessment.spec.d.ts.map +1 -0
- package/dist/trades/trade-rate-assessment.spec.js +223 -0
- package/dist/trades/trades.contract.d.ts +111 -0
- package/dist/trades/trades.contract.d.ts.map +1 -1
- package/dist/trades/trades.contract.js +49 -1
- package/dist/trades/trades.contract.spec.d.ts +2 -0
- package/dist/trades/trades.contract.spec.d.ts.map +1 -0
- package/dist/trades/trades.contract.spec.js +173 -0
- package/dist/user-access-grants/build-user-access-grant-rules.d.ts +10 -0
- package/dist/user-access-grants/build-user-access-grant-rules.d.ts.map +1 -0
- package/dist/user-access-grants/build-user-access-grant-rules.js +69 -0
- package/dist/user-access-grants/build-user-access-grant-rules.spec.d.ts +2 -0
- package/dist/user-access-grants/build-user-access-grant-rules.spec.d.ts.map +1 -0
- package/dist/user-access-grants/build-user-access-grant-rules.spec.js +77 -0
- package/dist/user-access-grants/user-access-grant-templates.json +454 -0
- package/dist/user-access-grants/user-access-grants.contract.d.ts +3886 -0
- package/dist/user-access-grants/user-access-grants.contract.d.ts.map +1 -0
- package/dist/user-access-grants/user-access-grants.contract.js +189 -0
- package/dist/user-access-grants/user-access-grants.contract.spec.d.ts +2 -0
- package/dist/user-access-grants/user-access-grants.contract.spec.d.ts.map +1 -0
- package/dist/user-access-grants/user-access-grants.contract.spec.js +149 -0
- package/dist/users/users.contract.d.ts +1959 -349
- package/dist/users/users.contract.d.ts.map +1 -1
- package/dist/users/users.contract.js +222 -37
- package/dist/users/users.contract.spec.d.ts +2 -0
- package/dist/users/users.contract.spec.d.ts.map +1 -0
- package/dist/users/users.contract.spec.js +103 -0
- package/dist/worker-identity-cases/worker-identity-cases.contract.d.ts +4609 -0
- package/dist/worker-identity-cases/worker-identity-cases.contract.d.ts.map +1 -0
- package/dist/worker-identity-cases/worker-identity-cases.contract.js +409 -0
- package/dist/worker-merge-proposals/worker-merge-proposals.contract.d.ts +1511 -0
- package/dist/worker-merge-proposals/worker-merge-proposals.contract.d.ts.map +1 -0
- package/dist/worker-merge-proposals/worker-merge-proposals.contract.js +150 -0
- package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.contract.d.ts +1106 -0
- package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.contract.d.ts.map +1 -0
- package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.contract.js +85 -0
- package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.contract.spec.d.ts +2 -0
- package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.contract.spec.d.ts.map +1 -0
- package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.contract.spec.js +216 -0
- package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.schemas.d.ts +453 -0
- package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.schemas.d.ts.map +1 -0
- package/dist/worker-source-identity-conflicts/worker-source-identity-conflicts.schemas.js +109 -0
- package/dist/workers/do-not-contact.contract.d.ts +46 -0
- package/dist/workers/do-not-contact.contract.d.ts.map +1 -0
- package/dist/workers/do-not-contact.contract.js +41 -0
- package/dist/workers/do-not-contact.contract.spec.d.ts +2 -0
- package/dist/workers/do-not-contact.contract.spec.d.ts.map +1 -0
- package/dist/workers/do-not-contact.contract.spec.js +47 -0
- package/dist/workers/duplicate-group-worker.spec.d.ts +2 -0
- package/dist/workers/duplicate-group-worker.spec.d.ts.map +1 -0
- package/dist/workers/duplicate-group-worker.spec.js +34 -0
- package/dist/workers/filter-exact-flags.spec.d.ts +2 -0
- package/dist/workers/filter-exact-flags.spec.d.ts.map +1 -0
- package/dist/workers/filter-exact-flags.spec.js +37 -0
- package/dist/workers/worker-source-attribution.contract.spec.d.ts +2 -0
- package/dist/workers/worker-source-attribution.contract.spec.d.ts.map +1 -0
- package/dist/workers/worker-source-attribution.contract.spec.js +442 -0
- package/dist/workers/worker-source.spec.d.ts +2 -0
- package/dist/workers/worker-source.spec.d.ts.map +1 -0
- package/dist/workers/worker-source.spec.js +13 -0
- package/dist/workers/worker-status-facets.spec.d.ts +2 -0
- package/dist/workers/worker-status-facets.spec.d.ts.map +1 -0
- package/dist/workers/worker-status-facets.spec.js +34 -0
- package/dist/workers/workers.contract.d.ts +19534 -5969
- package/dist/workers/workers.contract.d.ts.map +1 -1
- package/dist/workers/workers.contract.js +1096 -113
- package/dist/workers/workers.contract.spec.d.ts +2 -0
- package/dist/workers/workers.contract.spec.d.ts.map +1 -0
- package/dist/workers/workers.contract.spec.js +31 -0
- package/package.json +5 -4
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
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["
|
|
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('
|
|
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('
|
|
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
|
-
.
|
|
175
|
-
|
|
176
|
-
|
|
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
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
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
|
|
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: "
|
|
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
|
-
|
|
385
|
+
collaboration: exports.CalendarCollaborationSchema.nullable()
|
|
291
386
|
.optional()
|
|
292
|
-
.describe('
|
|
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
|
|
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
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
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
|
|
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
|
|
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 &&
|
|
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
|
|
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: "
|
|
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
|
-
|
|
464
|
-
agentId: zod_1.z
|
|
465
|
-
.string()
|
|
466
|
-
.uuid()
|
|
467
|
-
.optional()
|
|
606
|
+
startDate: common_schemas_1.DateRangeSchema.optional()
|
|
468
607
|
.nullable()
|
|
469
|
-
.describe('
|
|
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
|
-
|
|
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(() =>
|
|
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
|
-
|
|
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
|
-
.
|
|
550
|
-
.
|
|
551
|
-
.describe('Start date for calendar view'),
|
|
552
|
-
limit: zod_1.z.coerce
|
|
553
|
-
.number()
|
|
718
|
+
.uuid()
|
|
719
|
+
.nullable()
|
|
554
720
|
.optional()
|
|
555
|
-
.
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
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
|
-
.
|
|
561
|
-
|
|
562
|
-
|
|
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.
|
|
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.
|
|
978
|
+
200: exports.FlatCalendarBookingsResponseSchema,
|
|
687
979
|
},
|
|
688
980
|
query: exports.FilterCalendarBookingsSchema,
|
|
689
981
|
summary: 'Get bookings grouped by day for calendar view',
|