import type { BookingTicketHandle, SalesSdkCartBookingView, ScanOrderOrderProduct } from '../types'; /** 未分配预约主体的购物车行(用于提交前弹窗) */ export interface UnassignedHolderLine { cacheItem: Record; booking: Record; orderLine: ScanOrderOrderProduct; } /** 弹窗快照行:打开时冻结,分配后仍展示 */ export interface HolderConfirmSnapshotKey { productUid: string; groupId?: string; } /** 弹窗展示行(快照 + 实时 enriched 视图) */ export interface HolderConfirmDisplayLine extends UnassignedHolderLine { displayBooking: SalesSdkCartBookingView; /** 当前是否已分配 holder(实时) */ isAssigned: boolean; } /** * 按 groupId 去重未分配行,与 booking `confirmHolderModal` 计数规则一致。 * * @example * const lines = dedupeUnassignedHolderLines(rawLines); * calculateUnassignedHolderCount(lines); // => 未分配主体数量 */ export declare function dedupeUnassignedHolderLines(lines: UnassignedHolderLine[]): UnassignedHolderLine[]; /** * 统计未分配预约主体数量(按 quantity 累加)。 * * @example * calculateUnassignedHolderCount(lines); // 1 个商品 quantity=2 => 2 */ export declare function calculateUnassignedHolderCount(lines: UnassignedHolderLine[]): number; /** * 从 BookingTicket 购物车收集「需分配 holder 且尚未分配」的预约行。 * * @example * const lines = collectUnassignedHolderLines(bookingTicket); */ export declare function collectUnassignedHolderLines(bookingTicket: BookingTicketHandle | null | undefined): UnassignedHolderLine[]; /** * 将未分配行映射为购物车 enriched booking 视图,保证弹窗卡片与 SaleDetail 一致。 * * @example * resolveEnrichedBookingForLine(line, cart.bookings); */ export declare function resolveEnrichedBookingForLine(line: UnassignedHolderLine, cartBookings: SalesSdkCartBookingView[]): SalesSdkCartBookingView; /** * 从当前未分配行生成弹窗快照 key(与 dedupe 规则一致)。 * * @example * buildHolderConfirmSnapshotKeys(collectUnassignedHolderLines(bookingTicket)); */ export declare function buildHolderConfirmSnapshotKeys(lines: UnassignedHolderLine[]): HolderConfirmSnapshotKey[]; /** * 按 product_uid 从 OS 购物车反查一行(含已分配 holder)。 */ export declare function resolveLineByProductUid(bookingTicket: BookingTicketHandle, productUid: string): UnassignedHolderLine | null; /** * 按打开时的快照渲染弹窗列表:卡片不随分配消失,数据随 cart 刷新。 * * @example * buildHolderConfirmDisplayLines({ bookingTicket, snapshotLineKeys, cartBookings }); */ export declare function buildHolderConfirmDisplayLines(input: { bookingTicket: BookingTicketHandle; snapshotLineKeys: HolderConfirmSnapshotKey[]; cartBookings: SalesSdkCartBookingView[]; }): HolderConfirmDisplayLine[]; /** * 保存 / 结账前是否应弹出「预约主体未分配」确认弹窗(与 ticketBooking Footer 一致)。 * * @example * shouldPromptHolderBeforeSubmit({ customerId: 12, bookingConfig, bookingTicket }); */ export declare function shouldPromptHolderBeforeSubmit(input: { customerId?: number | string | null; bookingConfig?: Record | null; bookingTicket?: BookingTicketHandle | null; }): boolean;