31 lines
2.3 KiB
TypeScript
31 lines
2.3 KiB
TypeScript
import { http, unwrapApiResponse, type ApiEnvelope } from '@/shared/api/http'
|
|
import type { PageResult } from './overseasMasterData'
|
|
import { fleetMoney, fleetNumber, fleetPage, fleetVersion } from './fleetQuotes'
|
|
|
|
export interface FleetSaleQuoteCriteria {
|
|
customerId: string; originCity: string; destinationCode: string; currency: 'USD' | 'CNY'
|
|
effectiveOn: string; priceBasis: 'ORDER' | 'PALLET'; page?: number; size?: number
|
|
}
|
|
export interface FleetQuoteReference { quoteNo: string; recordVersion: string; priceItem: 'FULL_DELIVERY' | 'LOOSE_DELIVERY' }
|
|
export interface FleetQuoteSourceSnapshot extends FleetQuoteReference {
|
|
customerId: string; customerName: string; originCity: string; destinationCode: string; distanceMiles: number
|
|
currency: 'USD' | 'CNY'; priceBasis: 'ORDER' | 'PALLET'; quotedUnitPrice: number
|
|
validFrom: string; validTo: string; effectiveOn: string
|
|
}
|
|
type Numeric = string | number
|
|
export type WireSnapshot = Omit<FleetQuoteSourceSnapshot, 'recordVersion' | 'distanceMiles' | 'quotedUnitPrice'> & {
|
|
recordVersion: Numeric; distanceMiles: Numeric; quotedUnitPrice: Numeric
|
|
}
|
|
export type WireQuotePage = Omit<PageResult<WireSnapshot>, 'page' | 'size' | 'total' | 'pages'> & { page: Numeric; size: Numeric; total: Numeric; pages: Numeric }
|
|
export const normalizeFleetQuoteSource = (row: WireSnapshot): FleetQuoteSourceSnapshot => ({ ...row, recordVersion: fleetVersion(row.recordVersion), distanceMiles: fleetNumber(row.distanceMiles), quotedUnitPrice: fleetMoney(row.quotedUnitPrice) })
|
|
export const normalizeFleetQuotePage = (value: WireQuotePage): PageResult<FleetQuoteSourceSnapshot> => fleetPage({ ...value, records: value.records.map(normalizeFleetQuoteSource) })
|
|
|
|
/** Only a candidate read: the booking writer must revalidate the reference and freeze its own source snapshot. */
|
|
export async function listFleetSaleQuoteCandidates(criteria: FleetSaleQuoteCriteria): Promise<PageResult<FleetQuoteSourceSnapshot>> {
|
|
const response = unwrapApiResponse(await http.get<ApiEnvelope<WireQuotePage>, ApiEnvelope<WireQuotePage>>('/platform/v1/last-leg/fleet/quotes/sale-candidates', { params: criteria }))
|
|
return normalizeFleetQuotePage(response)
|
|
}
|
|
export function fleetQuoteReference(source: FleetQuoteSourceSnapshot): FleetQuoteReference {
|
|
return { quoteNo: source.quoteNo, recordVersion: source.recordVersion, priceItem: source.priceItem }
|
|
}
|