import {z} from 'zod' export type RepayLoan = {amount?: string | undefined, collateralPortfolioId?: string | undefined, effectiveDate?: string | undefined}; export type PatchApiOrganizationsOrganizationIdLoansAcceptRepaymentLoanIdArgs = {'Content-Type'?: string | undefined, organizationId: string, acceptRepaymentLoanId: string, body: RepayLoan}; export type PatchApiOrganizationsOrganizationIdLoansAcceptRepaymentLoanIdOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const debtRatioStatus = z.enum([]); export const collateral = z.object({amount: z.string(), collateralId: z.string(), createdAt: z.string(), currency: z.string(), loanId: z.string(), mainCurrency: z.string(), portfolioId: z.string().optional(), unrealisedAmount: z.string().optional(), updatedAt: z.string().optional()}); export const counterpartyType = z.enum(["standard", "clearloop-exchange", "agency-desk"]); export const counterpartyExtra = z.object({exchangeId: z.string().optional()}); export const counterpartyTag = z.literal("featured"); export const counterparty = z.object({backgroundImageId: z.string().optional(), counterpartyDescription: z.string().optional(), counterpartyId: z.string(), counterpartyName: z.string(), counterpartyType: counterpartyType, extra: counterpartyExtra.optional(), imageId: z.string().optional(), networkTag: z.string(), priority: z.string().optional(), tags: z.array(counterpartyTag).optional()}); export const loanAllocationType = z.enum(["disburse", "top-up", "repay", "rebalance", "secure-collateral", "release-collateral", "disburse-externally", "top-up-externally", "repay-externally"]); export const loanAllocationExtra = z.object({acceptedAt: z.string().optional(), acceptedBy: z.string().optional(), cancelledAt: z.string().optional(), cancelledBy: z.string().optional(), confirmedAt: z.string().optional(), confirmedBy: z.string().optional(), effectiveDate: z.string().optional()}); export const loanAllocationStatus = z.enum(["new", "awaiting-acceptance", "accepted", "cancelled", "order-created", "awaiting-confirmation", "confirmed", "awaiting-funds", "awaiting-signature", "completed", "failed"]); export const loanAllocation = z.object({allocationType: loanAllocationType, amount: z.string(), counterpartyOrderId: z.string().optional(), createdAt: z.string(), createdBy: z.string().optional(), currency: z.string(), externalFailureDescription: z.string().optional(), extra: loanAllocationExtra, fromPortfolioId: z.string().optional(), loanAllocationId: z.string(), loanId: z.string(), mainCurrency: z.string(), orderId: z.string().optional(), requestorCounterpartyId: z.string().optional(), status: loanAllocationStatus, terminatedAt: z.string().optional(), toPortfolioId: z.string().optional(), updatedAt: z.string().optional()}); export const loanInterest = z.object({accruedInterest: z.string(), createdAt: z.string(), interestCurrency: z.string(), lastPaymentAt: z.string().optional(), loanId: z.string(), loanInterestId: z.string(), realisedInterest: z.string().optional(), unrealisedInterest: z.string().optional(), updatedAt: z.string().optional()}); export const loanModificationExtra = z.object({acceptedAt: z.string().optional(), acceptedBy: z.string().optional(), cancelledAt: z.string().optional(), cancelledBy: z.string().optional(), currentInterestRate: z.string().optional(), currentMaturityDate: z.string().optional(), newInterestRate: z.string().optional(), newMaturityDate: z.string().optional()}); export const loanModificationType = z.enum(["rerate", "extend-term"]); export const loanModificationStatus = z.enum(["awaiting-acceptance", "accepted", "cancelled"]); export const loanModification = z.object({createdAt: z.string(), createdBy: z.string().optional(), extra: loanModificationExtra, loanId: z.string(), loanModificationId: z.string(), modificationType: loanModificationType, requestorCounterpartyId: z.string().optional(), status: loanModificationStatus, updatedAt: z.string().optional()}); export const marginCall = z.object({}); export const loanEmbedded = z.object({childLoans: z.array(z.lazy(() => loan)).optional(), collaterals: z.array(collateral).optional(), counterparties: z.array(counterparty).optional(), loanAllocations: z.array(loanAllocation).optional(), loanInterest: loanInterest.optional(), loanModifications: z.array(loanModification).optional(), marginCall: marginCall.optional()}); export const requiredCollateral = z.object({amount: z.string(), amountInUsd: z.string().optional(), currency: z.string(), mainCurrency: z.string()}); export const loanExtra = z.object({acceptedAt: z.string().optional(), acceptedBy: z.string().optional(), approvedAt: z.string().optional(), approvedBy: z.string().optional(), cancelledAt: z.string().optional(), cancelledBy: z.string().optional(), defaultThreshold: z.string().optional(), defaultedAt: z.string().optional(), defaultedBy: z.string().optional(), disbursedAt: z.string().optional(), externalDisbursal: z.boolean().optional(), externalInterestPayment: z.boolean().optional(), initialLtv: z.string().optional(), initiallyRequiredCollateralUsd: z.string().optional(), lenderFeeShare: z.string().optional(), lenderFeeSharePercentage: z.string().optional(), marginCallExpiryPeriod: z.string().optional(), marginCallThreshold: z.string().optional(), rebalanceThreshold: z.string().optional(), rejectedAt: z.string().optional(), rejectedBy: z.string().optional(), repaidAt: z.string().optional(), repaidBy: z.string().optional(), requiredCollaterals: z.array(requiredCollateral).optional()}); export const loanType = z.enum(["agency-lending-parent-loan", "agency-inventory", "agency-lending-collateralised-child-loan", "agency-title-transfer-collateralised-loan", "agency-lending-uncollateralised-child-loan", "agency-uncollateralised-loan", "agency-lending-first-lien-child-loan", "agency-clearloop-loan", "agency-lending-pledge-collateralised-child-loan", "agency-pledge-collateralised-loan", "bilateral-lending-title-transfer-collateralised-loan", "bilateral-title-transfer-collateralised-loan", "bilateral-lending-pledge-collateralised-loan", "bilateral-pledge-collateralised-loan", "bilateral-lending-uncollateralised-loan", "bilateral-uncollateralised-loan"]); export const loanStatus = z.enum(["awaiting-approval", "awaiting-acceptance", "awaiting-collateral", "awaiting-interest-payment", "disbursing", "active", "repaying", "defaulting", "partially-defaulting", "early-termination-in-progress", "early-termination-completed", "defaulted", "default-resolved", "cancelled", "rejected", "errored", "repaid", "repaying-interest", "interest-repaid", "securing-collateral", "collateral-secured", "releasing-collateral", "collateral-released", "closed"]); export const loan: z.ZodType = z.object({amount: z.string(), borrowerCounterpartyId: z.string(), borrowerOrganizationId: z.string(), borrowerPortfolioId: z.string().optional(), createdAt: z.string().optional(), createdBy: z.string(), currency: z.string(), debtRatio: z.string().optional(), debtRatioStatus: debtRatioStatus.optional(), debtRatioUpdatedAt: z.string().optional(), defaultReason: z.string().optional(), embedded: loanEmbedded.optional(), externalId: z.string(), extra: loanExtra.optional(), interestRate: z.string().optional(), lenderCounterpartyId: z.string(), lenderOrganizationId: z.string(), lenderPortfolioId: z.string().optional(), loanId: z.string(), loanType: loanType, mainCurrency: z.string(), maturityDate: z.string().optional(), originalLoanAmount: z.string().optional(), originalLoanValue: z.string().optional(), startDate: z.string().optional(), status: loanStatus, terminatedAt: z.string().optional(), unrealisedAmount: z.string().optional(), updatedAt: z.string().optional()}); 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 }; /** * Accept Loan Repayment * * PATCH /organizations/{organizationId}/loans/{acceptRepaymentLoanId} */ export const patchApiOrganizationsOrganizationIdLoansAcceptRepaymentLoanId = async (args: PatchApiOrganizationsOrganizationIdLoansAcceptRepaymentLoanIdArgs, options?: PatchApiOrganizationsOrganizationIdLoansAcceptRepaymentLoanIdOptions) => { const {baseUrl = "https://api.copper.co/platform", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/vnd.accept-loan-repayment+json") headers.set('accept', "application/vnd.accept-loan-repayment+json") if (args['Content-Type'] != null) headers.set("Content-Type", String(args['Content-Type'])) const url = `${baseUrl.replace(/\/+$/, '')}/organizations/${encodeURIComponent(String(args.organizationId))}/loans/${encodeURIComponent(String(args.acceptRepaymentLoanId))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "PATCH", 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(loan, await res.json()) };