export type ExternalIntegrationCategory='pms'|'external_pos'|'supplier';
export interface ExternalProviderCapabilities {
category:ExternalIntegrationCategory;
supportsWebhooks:boolean;
supportsPolling:boolean;
supportsInbound:boolean;
supportsOutbound:boolean;
supportsReservations:boolean;
supportsGuests:boolean;
supportsFolioCharges:boolean;
supportsProducts:boolean;
supportsSalesBatches:boolean;
supportsSupplierCatalog:boolean;
supportsPurchaseOrders:boolean;
supportsGoodsReceipts:boolean;
supportsIdempotency:boolean;
}
export interface ExternalProviderContext {
connectionId:string;
organizationId:string;
locationId?:string;
credentialReference?:string;
config:Record<string,unknown>;
}
export interface ExternalProvider {
readonly key:string;
readonly capabilities:ExternalProviderCapabilities;
healthCheck(ctx:ExternalProviderContext):Promise<{ok:boolean;status?:number;code?:string}>;
poll?(ctx:ExternalProviderContext,input:{
streamKey:string;
cursor?:string;
}):Promise<{
cursor?:string;
events:Array<{
externalEventId:string;
eventType:string;
externalEntityType?:string;
externalEntityId?:string;
providerVersion?:string;
providerUpdatedAt?:string;
payload:Record<string,unknown>;
}>;
}>;
postFolioCharge?(ctx:ExternalProviderContext,input:{
externalFolioId:string;
externalReservationId?:string;
chargeCode:string;
amountMinor:number;
currencyCode:string;
description:string;
idempotencyKey:string;
}):Promise<{externalChargeId:string;status:'completed'|'pending'|'uncertain'}>;
pushPurchaseOrder?(ctx:ExternalProviderContext,input:{
externalSupplierId:string;
purchaseOrder:Record<string,unknown>;
idempotencyKey:string;
}):Promise<{externalId:string;status:'completed'|'pending'|'uncertain'}>;
}
