import type { UniqueID } from "@repo/rdx-ddd"; import type { Result } from "@repo/rdx-utils"; import type { Ticket } from "../domain/ticket.aggregate"; import type { TicketError, TicketTargetInput } from "../domain/ticket-values"; export type TicketOption = Readonly<{ id: UniqueID; name: string; active: boolean }>; export type TicketContext = Readonly<{ tickets: readonly Ticket[]; companies: readonly TicketOption[]; technicians: readonly TicketOption[]; people: readonly (TicketOption & { companyId: UniqueID })[]; actorNames: ReadonlyMap; }>; export type TicketLookups = Readonly<{ people: readonly TicketOption[]; assets: readonly TicketOption[]; resources: readonly TicketOption[]; workstations: readonly TicketOption[]; }>; export type TicketSaveContext = TicketContext & { lookups: TicketLookups; nextNumber: number; requestTicket: Ticket | undefined; }; export interface ITicketInventoryService { list(company: UniqueID): Promise; workstations( company: UniqueID ): Promise; } export interface ITicketRepository { list(company?: UniqueID): Promise>; lookups(company: UniqueID): Promise>; save( company: UniqueID, requestKey: UniqueID, action: (context: TicketSaveContext) => Result ): Promise>; } export function targetOptions(lookups: TicketLookups, kind: TicketTargetInput["kind"]) { switch (kind) { case "person": return lookups.people; case "asset": return lookups.assets; case "resource": return lookups.resources; case "workstation": return lookups.workstations; } }