import * as isoly from "isoly" import * as authly from "authly" import * as model from "@payfunc/model-card" import * as base from "@payfunc/model-base" import { Creatable } from "../Authorization/Creatable" import { Recurring } from "../Authorization/Recurring" import { Fraudio } from "../Fraudio" import { Merchant as AcquirerMerchant } from "../Merchant" import { Statistics } from "../Statistics" import { clear } from "../utilities" import { Card } from "./Card" import { Contact } from "./Contact" import { Merchant } from "./Merchant" export interface PreAuthorization { merchant: Merchant authorization: { id?: authly.Identifier amount: number currency: isoly.Currency card: Card & { csc?: "present" } contact?: Contact capture?: "auto" descriptor?: string number: string verification?: "verified" | "unavailable" | "rejected" recurring?: Recurring fraudio?: Fraudio browser?: { ip?: string } ip?: { country?: isoly.CountryCode.Alpha2 } category?: "purchase" | "withdrawal" | "payout" } now: isoly.Date } export namespace PreAuthorization { export function is(value: any | PreAuthorization): value is PreAuthorization { return ( typeof value == "object" && Merchant.is(value.merchant) && typeof value.authorization == "object" && (value.authorization.id == undefined || authly.Identifier.is(value.authorization.id, 16)) && typeof value.authorization.amount == "number" && isoly.Currency.is(value.authorization.currency) && Card.is(value.authorization.card) && (value.authorization.card.csc == undefined || value.authorization.card.csc == "present") && (value.authorization.contact == undefined || Contact.is(value.authorization.contact)) && (value.authorization.capture == undefined || value.authorization.capture == "auto") && (value.authorization.descriptor == undefined || typeof value.authorization.descriptor == "string") && (value.authorization.number == undefined || typeof value.authorization.number == "string") && (value.authorization.verification == undefined || ["verified", "unavailable", "rejected"].includes(value.authorization.verification)) && (value.authorization.recurring == undefined || Recurring.is(value.authorization.recurring)) && typeof value.now == "string" && (value.fraudio == undefined || Fraudio.is(value.fraudio)) && (value.browser == undefined || (typeof value.browser == "object" && value.browser && (value.browser.ip == undefined || typeof value.browser.ip == "string"))) && (value.ip == undefined || (typeof value.ip == "object" && value.ip && (value.ip.country == undefined || isoly.CountryCode.Alpha2.is(value.ip.country)))) && (value.authorization.category == undefined || value.authorization.category == "purchase" || value.authorization.category == "withdrawal" || value.authorization.category == "payout") ) } export function from( authorization: Creatable | Creatable.Safe, card: model.Card.Creatable | model.Card.Creatable.Safe, merchant: AcquirerMerchant, statistics: Statistics, verification?: "verified" | "unavailable" | "rejected", rate?: Record ): PreAuthorization { const factor = rate && merchant.currency != authorization.currency ? rate[authorization.currency] ?? 1 : 1 return clear({ merchant: Merchant.from(merchant, statistics), authorization: { id: authorization.id, amount: isoly.Currency.round( (authorization.amount ?? base.Item.amount(authorization.items ?? 0)) * factor, merchant.currency ), currency: authorization.currency, card: Card.from(card), contact: authorization.contact ? Contact.from(authorization.contact) : undefined, capture: authorization.capture, descriptor: authorization.descriptor, number: authorization.number, verification, recurring: authorization.recurring, browser: authorization.browser?.ip ? { ip: authorization.browser?.ip } : undefined, ip: authorization.browser?.ipCountry ? { country: authorization.browser.ipCountry } : undefined, category: authorization.category, }, now: isoly.Date.now(), }) } }