UNPKG

sdk-node-apis-efi

Version:

Module for integration with Efi Bank API

709 lines (708 loc) 23 kB
import * as z from "zod"; const DateSchema = z.iso.date(); const MoneySchema = z.string().regex(/^\d{1,16}\.\d{2}$/).min(4).max(19); const CpfSchema = z.string().regex(/^\d{11}$/); const CnpjSchema = z.string().regex(/^[0-9A-Z]{12}[0-9]{2}$/); const ParticipantIdSchema = z.string().min(32).max(36); const UrnSchema = z.string().max(256); const EndToEndIdSchema = z.string().min(25).max(32); const PaymentIdentifierParamsSchema = z.object({ identificadorPagamento: z.string() }).strict(); const OpenFinanceWebhookSecuritySchema = z.union([ z.object({ type: z.literal('mtls'), hash: z.never().optional() }).strict(), z.object({ type: z.literal('hmac'), hash: z.string() }).strict(), ]); export const OpenFinanceConfigBodySchema = z .object({ redirectURL: z.url(), webhookURL: z.url(), webhookSecurity: OpenFinanceWebhookSecuritySchema.optional(), processPayment: z.enum(['async', 'sync']).optional(), generateTxIdForInic: z.boolean().optional(), }) .strict(); export const OfListParticipantsParamsSchema = z .object({ nome: z.string().optional(), organizacao: z.string().optional(), modalidade: z.enum(['pagamentos', 'biometria', 'automatico']).optional(), tipoPessoa: z.enum(['PF', 'PJ']).optional(), }) .strict(); export const OpenFinancePagadorSchema = z .object({ idParticipante: ParticipantIdSchema, cpf: CpfSchema, cnpj: CnpjSchema.optional(), }) .strict(); export const OpenFinanceContaBancoSchema = z .object({ nome: z.string().min(5), documento: z.string().regex(/^([0-9]{11}|[0-9A-Z]{12}[0-9]{2})$/), codigoBanco: z.string().regex(/^([0-9]{3}|[0-9A-Z]{8})$/), agencia: z.string().regex(/^\d{4}$/), conta: z.string().regex(/^\d{3,20}$/), tipoConta: z.enum(['CACC', 'SVGS', 'TRAN']), }) .strict(); export const OpenFinanceFavorecidoSchema = z.union([ z.object({ contaBanco: OpenFinanceContaBancoSchema, chave: z.never().optional() }).strict(), z.object({ chave: z.string(), contaBanco: z.never().optional() }).strict(), ]); const OpenFinancePaymentBaseShape = { valor: MoneySchema, codigoCidadeIBGE: z.string().regex(/^\d{7}$/).optional(), infoPagador: z.string().optional(), idProprio: z.string().max(255).optional(), qrCode: z.string().max(512).optional(), identificadorTransacao: z.string().max(25).optional(), }; export const OpenFinancePagamentoSchema = z.object(OpenFinancePaymentBaseShape).strict(); export const OfStartPixPaymentBodySchema = z .object({ pagador: OpenFinancePagadorSchema, favorecido: OpenFinanceFavorecidoSchema, pagamento: OpenFinancePagamentoSchema, }) .strict(); const ImmediateListCommonShape = { quantidade: z.number().int().min(1).max(100).optional(), pagina: z.number().int().positive().optional(), status: z.enum(['pendente', 'rejeitado', 'aceito', 'expirado']).optional(), }; export const OfListPixPaymentParamsSchema = z.union([ z .object({ identificador: z.string(), inicio: DateSchema.optional(), fim: DateSchema.optional(), ...ImmediateListCommonShape, }) .strict(), z .object({ inicio: DateSchema, fim: DateSchema, identificador: z.string().optional(), ...ImmediateListCommonShape, }) .strict(), ]); export const OpenFinanceDevolutionItemSchema = z .object({ endToEndId: z.string(), valor: MoneySchema, }) .strict(); export const OfDevolutionPixParamsSchema = PaymentIdentifierParamsSchema; export const OfDevolutionPixBodySchema = z.array(OpenFinanceDevolutionItemSchema).min(1); export const OpenFinanceSchedulePaymentSchema = z .object({ ...OpenFinancePaymentBaseShape, dataAgendamento: DateSchema, }) .strict(); export const OfStartSchedulePixPaymentBodySchema = z .object({ pagador: OpenFinancePagadorSchema, favorecido: OpenFinanceFavorecidoSchema, pagamento: OpenFinanceSchedulePaymentSchema, }) .strict(); const ScheduleListCommonShape = { quantidade: z.string().regex(/^\d+$/).optional(), pagina: z.string().regex(/^\d+$/).optional(), status: z.enum(['pendente', 'agendado', 'rejeitado', 'aceito', 'expirado', 'cancelado']).optional(), }; export const OfListSchedulePixPaymentParamsSchema = z.union([ z .object({ identificador: z.string(), inicio: DateSchema.optional(), fim: DateSchema.optional(), ...ScheduleListCommonShape, }) .strict(), z .object({ inicio: DateSchema, fim: DateSchema, identificador: z.string().optional(), ...ScheduleListCommonShape, }) .strict(), ]); export const OfCancelSchedulePixParamsSchema = PaymentIdentifierParamsSchema; export const OfDevolutionSchedulePixParamsSchema = PaymentIdentifierParamsSchema; export const OfDevolutionSchedulePixBodySchema = OfDevolutionPixBodySchema; const RecurrenceCommonShape = { dataInicio: DateSchema, quantidade: z.number().int().min(2).max(60), }; export const OpenFinanceRecurrenceSchema = z.union([ z .object({ tipo: z.literal('diaria'), ...RecurrenceCommonShape, diaDaSemana: z.never().optional(), diaDoMes: z.never().optional(), datas: z.never().optional(), descricao: z.never().optional(), }) .strict(), z .object({ tipo: z.literal('semanal'), ...RecurrenceCommonShape, diaDaSemana: z.enum([ 'DOMINGO', 'SEGUNDA_FEIRA', 'TERCA_FEIRA', 'QUARTA_FEIRA', 'QUINTA_FEIRA', 'SEXTA_FEIRA', 'SABADO', ]), diaDoMes: z.never().optional(), datas: z.never().optional(), descricao: z.never().optional(), }) .strict(), z .object({ tipo: z.literal('mensal'), ...RecurrenceCommonShape, diaDoMes: z.number().int().min(1).max(31), diaDaSemana: z.never().optional(), datas: z.never().optional(), descricao: z.never().optional(), }) .strict(), z .object({ tipo: z.literal('personalizada'), datas: z.array(DateSchema).min(2).max(60), descricao: z.string().optional(), dataInicio: z.never().optional(), quantidade: z.never().optional(), diaDaSemana: z.never().optional(), diaDoMes: z.never().optional(), }) .strict(), ]); export const OpenFinanceRecurrencyPaymentSchema = z .object({ ...OpenFinancePaymentBaseShape, recorrencia: OpenFinanceRecurrenceSchema, }) .strict(); export const OfStartRecurrencyPixPaymentBodySchema = z .object({ pagador: OpenFinancePagadorSchema, favorecido: OpenFinanceFavorecidoSchema, pagamento: OpenFinanceRecurrencyPaymentSchema, }) .strict(); const RecurrencyListCommonShape = { quantidade: z.string().regex(/^\d+$/).optional(), pagina: z.string().regex(/^\d+$/).optional(), status: z.enum(['ativa', 'concluida', 'pendente', 'expirada', 'cancelada']).optional(), }; export const OfListRecurrencyPixPaymentParamsSchema = z.union([ z .object({ identificador: z.string(), inicio: DateSchema.optional(), fim: DateSchema.optional(), ...RecurrencyListCommonShape, }) .strict(), z .object({ inicio: DateSchema, fim: DateSchema, identificador: z.string().optional(), ...RecurrencyListCommonShape, }) .strict(), ]); export const OfCancelRecurrencyPixParamsSchema = PaymentIdentifierParamsSchema; export const OfDevolutionRecurrencyPixParamsSchema = PaymentIdentifierParamsSchema; export const OfDevolutionRecurrencyPixBodySchema = OfDevolutionPixBodySchema; export const OfReplaceRecurrencyPixParcelParamsSchema = z .object({ identificadorPagamento: z.string(), endToEndId: z.string() }) .strict(); export const OfReplaceRecurrencyPixParcelBodySchema = z.object({ valor: MoneySchema.optional() }).strict(); export const OfCreateBiometricEnrollmentBodySchema = z .object({ pagador: OpenFinancePagadorSchema }) .strict(); export const OfListBiometricEnrollmentParamsSchema = z .object({ cpf: CpfSchema, cnpj: CnpjSchema.optional(), }) .strict(); export const OfCreateBiometricPixPaymentBodySchema = z .object({ identificadorVinculo: UrnSchema, favorecido: OpenFinanceFavorecidoSchema, pagamento: OpenFinancePagamentoSchema, }) .strict(); export const OfListBiometricPixPaymentParamsSchema = z .object({ inicio: DateSchema, fim: DateSchema, status: z.enum(['pendente', 'rejeitado', 'aceito', 'expirado', 'cancelado']).optional(), identificador: z.string().optional(), }) .strict(); export const OfRevokeBiometricEnrollmentBodySchema = z .object({ identificadorVinculo: UrnSchema, motivo: z.string(), }) .strict(); const OpenFinanceAutomaticPagadorSchema = z .object({ cpf: CpfSchema, cnpj: CnpjSchema.optional(), nome: z.string().max(120).optional(), idParticipante: ParticipantIdSchema, }) .strict(); const OpenFinanceAutomaticConfigurationBaseShape = { intervalo: z.enum(['SEMANAL', 'MENSAL', 'ANUAL', 'SEMESTRAL', 'TRIMESTRAL']), dataInicio: DateSchema, permiteRetentativa: z.boolean().optional(), primeiroPagamento: z .object({ data: DateSchema, valor: MoneySchema, infoPagador: z.string().optional(), }) .strict() .optional(), }; const OpenFinanceAutomaticConfigurationSchema = z.union([ z .object({ ...OpenFinanceAutomaticConfigurationBaseShape, valorFixo: MoneySchema, valorMinimo: z.never().optional(), valorMaximo: z.never().optional(), }) .strict(), z .object({ ...OpenFinanceAutomaticConfigurationBaseShape, valorFixo: z.never().optional(), valorMinimo: MoneySchema.optional(), valorMaximo: MoneySchema, }) .strict(), ]); export const OfCreateAutomaticEnrollmentBodySchema = z .object({ pagador: OpenFinanceAutomaticPagadorSchema, favorecido: z.object({ contaBanco: OpenFinanceContaBancoSchema }).strict(), assinatura: z .object({ expiracao: DateSchema, descricao: z.string().optional(), idProprio: z.string().max(255).optional(), configuracao: z .object({ automatico: OpenFinanceAutomaticConfigurationSchema, }) .strict(), }) .strict(), }) .strict(); export const OfListAutomaticEnrollmentParamsSchema = z.union([ z.object({ identificadorAdesao: UrnSchema }).strict(), z.object({ idProprio: z.string() }).strict(), z .object({ inicio: DateSchema, fim: DateSchema, status: z.enum(['autorizado', 'pendente', 'revogado', 'finalizado', 'rejeitado']), documento: z.string().optional(), }) .strict(), z .object({ inicio: DateSchema, fim: DateSchema, documento: z.string(), status: z.enum(['autorizado', 'pendente', 'revogado', 'finalizado', 'rejeitado']).optional(), }) .strict(), ]); export const OfUpdateAutomaticEnrollmentBodySchema = z .object({ identificador: UrnSchema, nomeFavorecido: z.string().optional(), status: z.literal('revogado').optional(), dataExpiracao: DateSchema.optional(), valorMaximo: MoneySchema.optional(), }) .strict(); export const OfCreateAutomaticPixPaymentBodySchema = z .object({ identificadorAdesao: UrnSchema, pagamento: z .object({ valor: MoneySchema, data: DateSchema, codigoCidadeIBGE: z.string().regex(/^\d{7}$/).optional(), infoPagador: z.string().optional(), }) .strict(), }) .strict(); export const OfListAutomaticPixPaymentParamsSchema = z .object({ identificadorAdesao: UrnSchema, endToEndId: EndToEndIdSchema.optional(), }) .strict(); export const OfCancelAutomaticPixPaymentBodySchema = z .object({ identificadorAdesao: UrnSchema, endToEndId: EndToEndIdSchema, }) .strict(); const OpenFinanceWebhookSecurityResponseSchema = z.union([ z.object({ type: z.literal('mtls'), hash: z.never().optional() }).loose(), z.object({ type: z.literal('hmac'), hash: z.string() }).loose(), ]); export const OpenFinanceConfigResponseSchema = z .object({ redirectURL: z.string(), webhookURL: z.string(), webhookSecurity: OpenFinanceWebhookSecurityResponseSchema, processPayment: z.enum(['async', 'sync']), generateTxIdForInic: z.boolean(), }) .loose(); const OpenFinanceOrganizationResponseSchema = z .object({ nome: z.string(), cnpj: z.string(), status: z.enum(['Ativo', 'Inativo']), }) .loose(); const OpenFinanceParticipantResponseSchema = z .object({ identificador: z.string(), nome: z.string(), descricao: z.string(), portal: z.string(), logo: z.string(), organizacoes: z.array(OpenFinanceOrganizationResponseSchema), }) .loose(); export const OfListParticipantsResponseSchema = z .object({ participantes: z.array(OpenFinanceParticipantResponseSchema) }) .loose(); export const OpenFinanceStartPaymentResponseSchema = z .object({ identificadorPagamento: z.string(), redirectURI: z.string(), }) .loose(); const OpenFinanceRefundResponseSchema = z .object({ identificadorPagamento: z.string(), endToEndId: z.string(), valor: z.string(), dataCriacao: z.string(), status: z.enum(['pendente', 'aceito', 'rejeitado']), }) .loose(); export const OfDevolutionPixResponseSchema = OpenFinanceRefundResponseSchema; export const OfDevolutionSchedulePixResponseSchema = OpenFinanceRefundResponseSchema; export const OfDevolutionRecurrencyPixResponseSchema = OpenFinanceRefundResponseSchema; const OpenFinanceDevolutionResponseSchema = z .object({ identificadorDevolucao: z.string(), valor: z.string(), status: z.enum(['pendente', 'rejeitado', 'aceito']), dataCriacao: z.string(), }) .loose(); const OpenFinanceImmediateListItemBaseShape = { identificadorPagamento: z.string(), dataCriacao: z.string(), idProprio: z.string().optional(), devolucoes: z.array(OpenFinanceDevolutionResponseSchema).optional(), }; const OpenFinanceImmediateListItemSchema = z.discriminatedUnion('status', [ z .object({ ...OpenFinanceImmediateListItemBaseShape, status: z.literal('aceito'), endToEndId: z.string(), valor: z.string(), }) .loose(), z .object({ ...OpenFinanceImmediateListItemBaseShape, status: z.enum(['pendente', 'rejeitado', 'expirado']), endToEndId: z.string().optional(), valor: z.string().optional(), }) .loose(), ]); const OpenFinanceScheduleListItemBaseShape = { ...OpenFinanceImmediateListItemBaseShape, dataOperacao: z.string(), }; const OpenFinanceScheduleListItemSchema = z.discriminatedUnion('status', [ z .object({ ...OpenFinanceScheduleListItemBaseShape, status: z.literal('aceito'), endToEndId: z.string(), valor: z.string(), }) .loose(), z .object({ ...OpenFinanceScheduleListItemBaseShape, status: z.enum(['pendente', 'agendado', 'rejeitado', 'expirado', 'cancelado']), endToEndId: z.string().optional(), valor: z.string().optional(), }) .loose(), ]); const OpenFinanceRecurrencyListItemSchema = z .object({ identificadorPagamento: z.string(), valor: z.string(), status: z.enum(['ativa', 'concluida', 'pendente', 'expirada', 'cancelada']), dataCriacao: z.string(), idProprio: z.string().optional(), recorrencias: z.array(z .object({ endToEndId: z.string(), dataOperacao: z.string(), status: z.enum(['pendente', 'agendado', 'rejeitado', 'cancelado', 'enviado']), devolucoes: z.array(OpenFinanceDevolutionResponseSchema).optional(), }) .loose()), }) .loose(); function paginatedResponse(item) { return z .object({ pagamentos: z.array(item), total: z.number(), porPagina: z.number(), ultimo: z.string().nullable(), proximo: z.string().nullable(), anterior: z.string().nullable(), atual: z.string(), }) .loose(); } export const OfListPixPaymentResponseSchema = paginatedResponse(OpenFinanceImmediateListItemSchema); export const OfListSchedulePixPaymentResponseSchema = paginatedResponse(OpenFinanceScheduleListItemSchema); export const OfListRecurrencyPixPaymentResponseSchema = paginatedResponse(OpenFinanceRecurrencyListItemSchema); export const OpenFinanceCancelPaymentResponseSchema = z .object({ identificadorPagamento: z.string(), status: z.string(), dataCancelamento: z.string(), }) .loose(); export const OfCreateBiometricEnrollmentResponseSchema = z .object({ identificadorVinculo: z.string(), redirectURI: z.string() }) .loose(); const OpenFinanceBiometricEnrollmentResponseSchema = z .object({ identificador: z.string(), dataAutorizacao: z.string(), dataExpiracao: z.string(), limiteDiario: z.string(), limiteTransacao: z.string(), conta: z .object({ numero: z.string(), agencia: z.string(), ispb: z.string(), tipo: z.string(), }) .loose(), participante: z .object({ identificador: z.string(), nome: z.string(), descricao: z.string(), logo: z.string(), }) .loose(), }) .loose(); export const OfListBiometricEnrollmentResponseSchema = z .object({ vinculos: z.array(OpenFinanceBiometricEnrollmentResponseSchema) }) .loose(); const OpenFinanceBiometricPaymentResponseSchema = z.discriminatedUnion('status', [ z .object({ ...OpenFinanceImmediateListItemBaseShape, status: z.literal('aceito'), endToEndId: z.string(), valor: z.string(), }) .loose(), z .object({ ...OpenFinanceImmediateListItemBaseShape, status: z.enum(['pendente', 'rejeitado', 'expirado', 'cancelado']), endToEndId: z.string().optional(), valor: z.string().optional(), }) .loose(), ]); export const OfListBiometricPixPaymentResponseSchema = z .object({ vinculos: z.array(OpenFinanceBiometricPaymentResponseSchema) }) .loose(); export const OfRevokeBiometricEnrollmentResponseSchema = z .object({ identificadorVinculo: z.string(), status: z.literal('revogado'), motivo: z.string(), data: z.string(), }) .loose(); export const OfCreateAutomaticEnrollmentResponseSchema = z .object({ identificadorAdesao: z.string(), redirectURI: z.string() }) .loose(); const OpenFinanceAutomaticAccountResponseSchema = z .object({ nome: z.string(), documento: z.string(), codigoBanco: z.string(), agencia: z.string(), conta: z.string(), tipoConta: z.enum(['CACC', 'SVGS', 'TRAN']), }) .loose(); const OpenFinanceAutomaticFirstPaymentResponseSchema = z .object({ data: z.string(), valor: z.string(), infoPagador: z.string().optional(), }) .loose(); const OpenFinanceAutomaticConfigurationResponseBaseShape = { intervalo: z.enum(['SEMANAL', 'MENSAL', 'ANUAL', 'SEMESTRAL', 'TRIMESTRAL']), dataInicio: z.string(), permiteRetentativa: z.boolean().optional(), primeiroPagamento: OpenFinanceAutomaticFirstPaymentResponseSchema.optional(), }; const OpenFinanceAutomaticConfigurationResponseSchema = z.union([ z .object({ ...OpenFinanceAutomaticConfigurationResponseBaseShape, valorFixo: z.string(), valorMinimo: z.never().optional(), valorMaximo: z.never().optional(), }) .loose(), z .object({ ...OpenFinanceAutomaticConfigurationResponseBaseShape, valorFixo: z.never().optional(), valorMinimo: z.string(), valorMaximo: z.string(), }) .loose(), ]); const OpenFinanceAutomaticBeneficiaryResponseSchema = z .object({ contaBanco: OpenFinanceAutomaticAccountResponseSchema, }) .loose(); const OpenFinanceAutomaticSubscriptionResponseSchema = z .object({ expiracao: z.string(), descricao: z.string().optional(), idProprio: z.string().optional(), configuracao: z .object({ automatico: OpenFinanceAutomaticConfigurationResponseSchema, }) .loose(), }) .loose(); const OpenFinanceAutomaticEnrollmentResponseSchema = z .object({ identificadorAdesao: z.string(), status: z.enum(['autorizado', 'pendente', 'revogado', 'finalizado', 'rejeitado']), dataCriacao: z.string(), favorecido: OpenFinanceAutomaticBeneficiaryResponseSchema, assinatura: OpenFinanceAutomaticSubscriptionResponseSchema, }) .loose(); export const OfListAutomaticEnrollmentResponseSchema = z .object({ adesoes: z.array(OpenFinanceAutomaticEnrollmentResponseSchema), total: z.number(), porPagina: z.number(), ultimo: z.string().nullable(), proximo: z.string().nullable(), anterior: z.string().nullable(), atual: z.string(), }) .loose(); export const OfUpdateAutomaticEnrollmentResponseSchema = z .object({ identificadorAdesao: z.string(), status: z.enum(['revogado', 'autorizado', 'pendente', 'finalizado', 'rejeitado']), motivo: z.string().optional(), favorecido: OpenFinanceAutomaticBeneficiaryResponseSchema, assinatura: OpenFinanceAutomaticSubscriptionResponseSchema, }) .loose(); export const OfCreateAutomaticPixPaymentResponseSchema = z .object({ identificadorAdesao: z.string(), endToEndId: z.string(), status: z.enum(['pendente', 'rejeitado', 'aceito', 'expirado', 'cancelado']), data: z.string(), }) .loose(); export const OfListAutomaticPixPaymentResponseSchema = z .object({ identificadorAdesao: z.string(), idProprio: z.string().optional(), status: z.enum(['autorizado', 'pendente', 'rejeitado', 'revogado', 'finalizado']), descricao: z.string().optional(), pagamentos: z.array(z .object({ endToEndId: z.string(), valor: z.string(), status: z.enum(['pendente', 'rejeitado', 'aceito', 'expirado', 'cancelado']), dataCriacao: z.string(), infoPagador: z.string().optional(), devolucoes: z.array(OpenFinanceDevolutionResponseSchema).optional(), }) .loose()), }) .loose(); export const OfCancelAutomaticPixPaymentResponseSchema = z .object({ identificadorAdesao: z.string(), idProprio: z.string().optional(), endToEndId: z.string(), valor: z.string(), status: z.literal('cancelado'), motivo: z.string(), dataCriacao: z.string(), }) .loose();