Files
admin-web/src/modules/overseas-master-data/api/fleetQuoteCandidates.ts
T

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 }
}