import {z} from 'zod' export type CommonUpdatePaymentValidation = {payment_validation_rule_id: string, type: 'internal_account_is_active' | 'direct_debit_mandate_is_active' | 'liquidity_screening' | 'sanctions_screening' | 'risk_screening' | 'limits_screening' | 'mambu_authorization', status: 'successful' | 'failed' | 'pending_investigation', status_details?: string | undefined, resource_id?: string | undefined, resource_url?: string | undefined}; export type CreateApiIncomingPaymentsIdPaymentValidationArgs = {id: string, body: CommonUpdatePaymentValidation}; export type CreateApiIncomingPaymentsIdPaymentValidationOptions = {baseUrl?: string | undefined, sec0?: string | undefined, fetch?: typeof fetch | undefined}; export const paymentType = z.enum(["ae_aani", "ae_uaefts", "ae_uaefts_rtgs", "ar_coelsa", "ar_mep", "ar_transfer_30", "au_becs", "au_npp", "au_rits", "bacs", "becs", "bh_benefit", "bh_fawri", "bh_rtgs", "br_pix", "br_str", "br_ted", "ca_eft", "ca_lynx", "ca_rtr", "cbs_transfer", "ch_sct", "ch_sic", "ch_sip", "chaps", "cl_cca", "cl_lbtr", "cl_tef", "co_ach", "co_bre_b", "co_cud", "fps", "icelandic_exp", "id_bifast", "id_birtgs", "id_sknbi", "internal_transfer", "ke_eft", "ke_pesalink", "ke_rtgs", "mx_spei", "my_duitnow", "my_ibg", "my_rentas", "no_nbo", "no_nics", "no_nics_instant", "osko", "ph_instapay", "ph_pddts", "ph_philpass", "pl_elixir", "pl_express_elixir", "pl_sorbnet", "rits", "ro_regis", "ro_sent", "ro_sent_instant", "sa_sarie", "sa_sarie_instant", "sa_sarie_rtgs", "se_bankgirot", "se_rix", "se_rix_instant", "sepa", "sepa_instant", "sepa_urgent", "sg_giro", "sg_meps", "sg_paynow", "swift", "swift_fi_to_fi", "target2", "target2_fi_to_fi", "th_bahtnet", "th_nitmx", "th_promptpay", "tl_ips", "tl_rtimor_ach", "tl_rtimor_rtgs", "treasury", "us_ach", "us_fednow", "us_rtp", "us_wire", "za_eft", "za_rpp", "za_samos"]); export const incomingPaymentAddress = z.object({line_1: z.string().optional(), line_2: z.string().optional(), building_number: z.string().optional(), street_name: z.string().optional(), postal_code: z.string().optional(), region_state: z.string().optional(), city: z.string().optional(), country: z.string().optional(), department: z.string().nullable().optional(), sub_department: z.string().nullable().optional(), building_name: z.string().nullable().optional(), floor: z.string().nullable().optional(), postal_box: z.string().nullable().optional(), room: z.string().nullable().optional(), city_location_name: z.string().nullable().optional(), district_name: z.string().nullable().optional()}); export const commonAddress = z.object({line_1: z.string().optional(), line_2: z.string().optional(), building_number: z.string().optional(), street_name: z.string().optional(), postal_code: z.string().optional(), region_state: z.string().optional(), city: z.string().optional(), country: z.string().optional(), department: z.string().nullable().optional(), sub_department: z.string().nullable().optional(), building_name: z.string().nullable().optional(), floor: z.string().nullable().optional(), postal_box: z.string().nullable().optional(), room: z.string().nullable().optional(), city_location_name: z.string().nullable().optional(), district_name: z.string().nullable().optional()}); export const organizationIdentificationOthersType = z.enum(["bank_identification", "central_bank_identification", "clearing_house_identification", "company_incorporation_number", "company_identification", "customer_number", "duns_number", "employee_number", "global_location_number", "siren", "siret", "tax_number", "telephone_number", "business_domain_identification", "other_identification", "unknown"]); export const organizationIdentification = z.object({legal_entity_identifier: z.string().optional(), business_identification_code: z.string().optional(), default_other_identifier_type: organizationIdentificationOthersType.optional(), others: z.array(z.object({type: organizationIdentificationOthersType, value: z.string()})).optional()}); export const privateIdentificationOtherIdentificationType = z.enum(["alien_registration_number", "passport_number", "customer_identification_number", "drivers_license_number", "employee_identification_number", "national_identity_number", "social_security_number", "telephone_number", "tax_identification_number", "person_commercial_identification"]); export const privateIdentification = z.object({birth_date: z.string().optional(), birth_city: z.string().max(35).optional(), birth_country: z.string().max(2).optional(), other: z.object({identification: z.string().max(35).optional(), identification_type: privateIdentificationOtherIdentificationType.optional(), custom_identification_type: z.string().max(35).optional(), identification_issuer: z.string().max(35).optional()}).optional()}); export const incomingPaymentOriginatingAccount = z.object({account_number: z.string().optional(), bank_code: z.string(), fi_bank_code: z.string().optional(), holder_name: z.string(), holder_address: incomingPaymentAddress.optional(), bank_name: z.string().optional(), bank_address: commonAddress.optional(), creditor_identifier: z.string(), organization_identification: organizationIdentification.optional(), private_identification: privateIdentification.optional()}); export const incomingPaymentReceivingAccount = z.object({account_number: z.string().optional(), bank_code: z.string(), fi_bank_code: z.string().optional(), holder_name: z.string(), holder_address: incomingPaymentAddress.optional(), bank_name: z.string().optional(), bank_address: commonAddress.optional(), organization_identification: organizationIdentification.optional(), private_identification: privateIdentification.optional()}); export const incomingPaymentUltimateOriginator = z.object({holder_name: z.string().optional(), holder_address: commonAddress.optional(), organization_identification: organizationIdentification.optional(), private_identification: privateIdentification.optional()}); export const incomingPaymentUltimateReceiver = z.object({holder_name: z.string().optional(), holder_address: commonAddress.optional(), organization_identification: organizationIdentification.optional(), private_identification: privateIdentification.optional()}); export const incomingPaymentCreditorReferenceType = z.object({code: z.enum(["dispatch_advice", "foreign_exchange_deal_reference", "purchase_order", "related_payment_instruction", "remittance_advice_message", "structured_communication_reference", "other"]).optional(), issuer: z.string().optional()}); export const incomingPaymentCreditorReferenceInformation = z.object({type: incomingPaymentCreditorReferenceType.optional(), reference: z.string().optional()}); export const incomingPaymentReferredDocumentType = z.object({code: z.enum(["commercial_invoice", "credit_note_related_to_financial_adjustment", "contract", "credit_note", "debit_note", "dispatch_advice", "debit_note_related_to_financial_adjustment", "hire_invoice", "invoice_signed", "metered_service_invoice", "proforma_invoice", "purchase_order", "quotation", "self_billed_invoice", "seller_presentment", "time_sheet", "usage_report", "account_receivable_open_item", "bill_of_lading", "commercial_contract", "statement_of_account", "trade_services_utility_transaction", "voucher", "other"]).optional(), issuer: z.string().optional()}); export const incomingPaymentReferredDocumentInformation = z.object({type: incomingPaymentReferredDocumentType.optional(), number: z.string().optional(), related_date: z.string().optional()}); export const incomingPaymentStructuredReference = z.array(z.object({creditor_reference_information: incomingPaymentCreditorReferenceInformation.optional(), referred_document_information: z.array(incomingPaymentReferredDocumentInformation).optional(), invoicer: z.object({name: z.string().optional()}).optional(), invoicee: z.object({name: z.string().optional()}).optional(), additional_remittance_info: z.array(z.string()).optional()})); export const paymentOrderDirectDebitSequenceType = z.enum(["first", "recurring", "final", "one_off"]).nullable(); export const commonAgentOtherIdentification = z.object({identification: z.string().max(35).optional(), identification_type: organizationIdentificationOthersType.optional(), custom_identification_type: z.string().max(35).optional(), identification_issuer: z.string().max(35).optional()}); export const commonAgentFinancialInstitutionIdentification = z.object({swift_code: z.string().optional(), bank_code: z.string().optional(), bank_code_format: z.enum(["bic", "uk_sorting_code", "us_aba_routing_number", "tokenized", "other"]).optional(), name: z.string().max(140).optional(), legal_entity_identifier: z.string().optional(), postal_address: commonAddress.optional(), other: commonAgentOtherIdentification.optional()}); export const commonIntermediaryAgents = z.array(z.object({financial_institution_identification: commonAgentFinancialInstitutionIdentification, account_number: z.string().optional(), account_number_format: z.string().optional(), organization_identification: z.object({name: z.string().optional(), bank_code: z.string().optional(), legal_entity_identifier: z.string().optional(), other: z.string().optional()}).optional(), postal_address: commonAddress.optional()})); export const commonPreviousInstructingAgents = z.array(z.object({financial_institution_identification: commonAgentFinancialInstitutionIdentification, account_number: z.string().optional(), account_number_format: z.string().optional(), organization_identification: z.object({name: z.string().optional(), bank_code: z.string().optional(), legal_entity_identifier: z.string().optional(), other: z.string().optional()}).optional(), postal_address: commonAddress.optional()})); export const commonPaymentValidationResult = z.object({payment_validation_rule_id: z.string(), status: z.enum(["in_progress", "successful", "failed"]), validations: z.array(z.array(z.object({type: z.enum(["internal_account_is_active", "direct_debit_mandate_is_active", "liquidity_screening", "sanctions_screening", "risk_screening", "limits_screening", "mambu_authorization"]), status: z.enum(["queued", "in_progress", "successful", "failed", "canceled", "pending_investigation", "pending_retry", "technical_error"]), status_details: z.string().optional(), resource_id: z.string().optional(), resource_url: z.string().optional(), mode: z.enum(["pre_built", "custom"]).optional(), last_updated_at: z.string().optional(), retry_details: z.object({attempt_count: z.number().int().gte(1).lte(5).optional(), max_attempts: z.number().int().gte(1).lte(5).optional(), next_attempt_at: z.string().nullable().optional(), final_action: z.enum(["approve_payment", "cancel_payment", "confirm_payment", "reject_payment", "set_payment_to_received", "set_payment_to_pending_confirmation", "suspend_payment"]).optional()}).nullable().optional()})))}); export const commonCbsTransaction = z.object({id: z.string().optional(), type: z.enum(["deposit", "withdrawal", "disbursement", "repayment", "adjustment"]).optional(), context: z.enum(["deposit", "suspense", "disbursement", "repayment"]).optional(), payment_validation_type: z.enum(["internal_account_is_active", "direct_debit_mandate_is_active", "liquidity_screening", "sanctions_screening", "risk_screening", "limits_screening", "mambu_authorization"]).optional(), account_id: z.string().optional(), authorization_id: z.string().optional(), external_id: z.string().optional(), channel: z.string().optional(), booked_at: z.string().optional()}); export const commonCbsData = z.object({transaction_id: z.string().optional(), authorization_id: z.string().optional(), transactions: z.array(commonCbsTransaction).optional()}); export const incomingPaymentDetails = z.object({id: z.string(), status: z.string(), status_details: z.string(), object: z.string(), idempotency_key: z.string(), bank_data: z.object({file_id: z.string(), message_id: z.string(), transaction_id: z.string(), end_to_end_id: z.string()}), reconciliation_status: z.enum(["partially_reconciled", "reconciled", "unreconciled", "excluded"]), initiated_at: z.string(), reconciled_amount: z.number().int().gte(0), created_at: z.string(), type: paymentType, direction: z.literal("credit"), amount: z.number().int().gte(0), currency: z.literal("EUR"), connected_account_id: z.string(), originating_account: incomingPaymentOriginatingAccount, receiving_account: incomingPaymentReceivingAccount, ultimate_originator: incomingPaymentUltimateOriginator.optional(), ultimate_receiver: incomingPaymentUltimateReceiver.optional(), receiving_account_id: z.string(), reference: z.string().max(140), structured_reference: incomingPaymentStructuredReference.optional(), value_date: z.string(), requested_execution_date: z.string(), purpose: z.string().optional(), category_purpose_code: z.string().optional(), uetr: z.string().optional(), direct_debit_mandate: z.object({reference: z.string().max(35), signature_date: z.string(), last_debit_collection_date: z.string().nullable().optional(), expiry_date: z.string().nullable().optional(), type: z.enum(["sepa_core", "sepa_b2b", "bacs_debit"]), sequence: z.enum(["one_off", "recurring"]).optional(), frequency: z.enum(["one_off", "recurring"]).optional()}).nullable(), direct_debit_mandate_id: z.string(), direct_debit_sequence_type: paymentOrderDirectDebitSequenceType, intermediary_agents: commonIntermediaryAgents.optional(), previous_instructing_agents: commonPreviousInstructingAgents.optional(), routing_instruction: z.string().optional(), payment_validation: z.object({status: z.enum(["in_progress", "successful", "failed"]), validation_results: z.array(commonPaymentValidationResult)}).optional(), cbs_data: commonCbsData.optional(), instructing_agent: z.string().optional(), instructed_agent: z.string().optional(), settlement_method: z.string().optional(), instructing_settlement_agent: z.string().optional(), instructed_settlement_agent: z.string().optional(), fee_option: z.string().optional(), fi_to_fi_option: z.enum(["advi", "core", "cover"]).optional(), related_payment_id: z.string().optional(), related_payment_type: z.string().optional(), related_payment: z.object({}).optional(), metadata: z.object({})}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Update incoming payment validation * * POST /incoming_payments/{id}/payment_validation */ export const createApiIncomingPaymentsIdPaymentValidation = async (args: CreateApiIncomingPaymentsIdPaymentValidationArgs, options?: CreateApiIncomingPaymentsIdPaymentValidationOptions) => { const {baseUrl = "https://sandbox.numeral.io/v1", fetch: fetchFn = fetch, sec0} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (sec0 !== undefined) headers.set("x-api-key", sec0) const url = `${baseUrl.replace(/\/+$/, '')}/incoming_payments/${encodeURIComponent(String(args.id))}/payment_validation${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(incomingPaymentDetails, await res.json()) };