import {z} from 'zod' export type AppSchemasCalculateTotalDiscount = {percentage?: (number | null) | undefined, factor?: (number | null) | undefined, base?: (number | null) | undefined, amount?: (number | null) | undefined, discount_type_id?: (string | null) | undefined, descripcion?: (string | null) | undefined, descuento_con_impuesto?: (boolean | null) | undefined}; export type ISC = {codigo: string, monto: number, porcentaje?: number | undefined, base?: number | undefined, factor?: (number | null) | undefined, total?: (number | null) | undefined}; export type AppSchemasCalculateTotalDocumentItemCreate = {item_id?: (number | null) | undefined, unidad: string | null, codigo?: (number | string | null) | undefined, descripcion?: (string | null) | undefined, nota?: (string | null) | undefined, documento_id?: (number | null) | undefined, cantidad?: number | undefined, precio: number, total?: (number | null) | undefined, tipo_tax: string | null, igv: number | null, porcentaje_igv?: (number | null) | undefined, descuento: number, codigo_descuento?: (string | null) | undefined, descuento_con_impuesto?: (boolean | null) | undefined, precio_con_igv?: (boolean | null) | undefined, discount?: (AppSchemasCalculateTotalDiscount | null) | undefined, isc?: (ISC | null) | undefined, bolsa_tax?: (number | null) | undefined, has_plastic_bag_taxes?: (boolean | null) | undefined, monto_icbper?: (number | null) | undefined, total_icbper?: (number | null) | undefined}; export type AppSchemasCalculateTotalDocumentTotalCreate = {monto_descuento_global?: number | undefined, descuento_con_impuesto?: (boolean | null) | undefined, monto_otros_cargos?: number | undefined, porcentaje_rc?: number | undefined, total_rc?: number | undefined, monto_anticipo?: number | undefined}; export type PaymentConditionCreate = {tipo_de_condicion?: (string | number) | undefined, forma_de_pago: number | string | null, fecha?: (string | null) | undefined, monto: number, id?: (number | null) | undefined, description?: string | undefined, name?: (string | null) | undefined}; export type DocumentRetentionCreate = {codigo?: (string | null) | undefined}; export type AppSchemasCalculateTotalDocumentDetractionCreate = {codigo?: (string | null) | undefined, forma_de_pago?: (string | null) | undefined, porcentaje?: (number | null) | undefined, monto?: (number | null) | undefined, datos_transporte_carga: unknown}; export type DocumentTransportChargeCreate = {ubigeo_origen?: (string | null) | undefined, direccion_origen?: (string | null) | undefined, ubigeo_destino?: (string | null) | undefined, direccion_destino?: (string | null) | undefined, valor_referencial_servicio_de_transporte?: (string | null) | undefined, valor_referencial_carga_efectiva?: (string | null) | undefined, valor_referencial_carga_util?: (string | null) | undefined, detalle_del_viaje?: (string | null) | undefined}; export type AppSchemasCalculateTotalDocumentAnticipationCreate = {tipo_documento?: (string | null) | undefined, codigo_tipo_documento?: (string | null) | undefined, serie?: (string | null) | undefined, numero?: (number | null) | undefined, total?: (number | null) | undefined}; export type AppSchemasCalculateTotalAnticipationCreate = {total: number | null, total_value: number | null, total_taxed: number | null, documents: Array | null}; export type AppSchemasCalculateTotalDocumentCreate = {tipo_documento?: (string | null) | undefined, tasa_de_cambio?: (number | null) | undefined, tipo_operacion: string, moneda?: (string | null) | undefined, moneda_id?: (string | null) | undefined, moneda_local_id?: (string | null) | undefined, total_venta?: (number | null) | undefined, total_exportacion?: (number | null) | undefined, total_exonerado?: (number | null) | undefined, total_inafecto?: (number | null) | undefined, total_gratuito?: (number | null) | undefined, total_gravado?: (number | null) | undefined, total_impuestos?: (number | null) | undefined, total_igv?: (number | null) | undefined, total_valor?: (number | null) | undefined, total_pagado?: (number | null) | undefined, total_descuento?: (number | null) | undefined, total_cargo?: (number | null) | undefined, total_rc?: (number | null) | undefined, descuento?: (AppSchemasCalculateTotalDiscount | null) | undefined, total_retencion?: (number | null) | undefined, total_icbp?: (number | null) | undefined, total_base_isc?: (number | null) | undefined, total_isc?: (number | null) | undefined, retencion_id?: (number | null) | undefined, taxe?: (number | null) | undefined, id?: (number | null) | undefined, items: Array, totales?: (AppSchemasCalculateTotalDocumentTotalCreate | null) | undefined, condicion_de_pago?: (Array | null) | undefined, retencion?: (DocumentRetentionCreate | null) | undefined, codigo_retencion?: (string | null) | undefined, detraccion?: (AppSchemasCalculateTotalDocumentDetractionCreate | null) | undefined, datos_transporte_carga?: (DocumentTransportChargeCreate | null) | undefined, anticipos?: (Array | null) | undefined, anticipo?: (AppSchemasCalculateTotalAnticipationCreate | null) | undefined, tipo_nota?: (string | null) | undefined}; export type CreateApiApiV3CalcularTotalArgs = {body: AppSchemasCalculateTotalDocumentCreate}; export type CreateApiApiV3CalcularTotalOptions = {baseUrl: string, fetch?: typeof fetch | undefined}; export const appSchemasCalculateTotalDiscount = z.object({percentage: z.number().nullable().optional(), factor: z.number().nullable().optional(), base: z.number().nullable().optional(), amount: z.number().nullable().optional(), discount_type_id: z.string().nullable().optional(), descripcion: z.string().nullable().optional(), descuento_con_impuesto: z.boolean().nullable().optional()}); export const taxeOut = z.object({nombre: z.string().max(100), ambito: z.string().optional(), tipo: z.string().optional(), codigo: z.string().nullable().optional(), importe: z.number(), id: z.number().int(), tag: z.string()}); export const iSC = z.object({codigo: z.string(), monto: z.number(), porcentaje: z.number().optional(), base: z.number().optional(), factor: z.number().nullable().optional(), total: z.number().nullable().optional()}); export const item = z.object({cantidad: z.number().optional(), valor_unitario: z.number().optional(), unidad: z.string().nullable(), codigo: z.union([z.number().int(), z.string()]).nullable().optional(), descripcion: z.string().optional(), note: z.string().nullable().optional(), precio: z.number().nullable().optional(), impuesto: taxeOut.nullable().optional(), precio_con_igv: z.boolean().nullable().optional(), total_descuento: z.number().nullable().optional(), codigo_descuento: z.string().nullable().optional(), descuento_con_impuesto: z.boolean().nullable().optional(), descuento: appSchemasCalculateTotalDiscount.nullable().optional(), isc: iSC.nullable().optional(), has_plastic_bag_taxes: z.boolean().nullable().optional(), amount_plastic_bag_taxes: z.number().nullable().optional(), total_plastic_bag_taxes: z.number().nullable().optional(), tipo_precio_id: z.string().optional(), tipo_impuesto: z.number().nullable().optional(), valor: z.number().nullable().optional(), total_valor: z.number().nullable().optional(), total_base_igv: z.number().nullable().optional(), total_igv: z.number().nullable().optional(), total_gravado: z.number().nullable().optional(), total: z.number().nullable().optional(), document_id: z.number().int().nullable().optional(), item_id: z.number().int().nullable().optional(), rc: z.number().nullable().optional()}); export const documentTotalCreateOutput = z.object({monto_descuento_global: z.number().optional(), descuento_con_impuesto: z.boolean().nullable().optional(), monto_otros_cargos: z.number().optional(), porcentaje_rc: z.number().optional(), total_rc: z.number().optional(), monto_anticipo: z.number().optional()}); export const paymentConditionCreate = z.object({tipo_de_condicion: z.union([z.string(), z.number().int()]).optional(), forma_de_pago: z.union([z.number().int(), z.string()]).nullable(), fecha: z.string().nullable().optional(), monto: z.number(), id: z.number().int().nullable().optional(), description: z.string().optional(), name: z.string().nullable().optional()}); export const documentRetentionCreate = z.object({codigo: z.string().nullable().optional()}); export const appSchemasCalculateTotalDocumentDetractionCreate = z.object({codigo: z.string().nullable().optional(), forma_de_pago: z.string().nullable().optional(), porcentaje: z.number().nullable().optional(), monto: z.number().nullable().optional(), datos_transporte_carga: z.unknown()}); export const documentTransportChargeCreate = z.object({ubigeo_origen: z.string().nullable().optional(), direccion_origen: z.string().nullable().optional(), ubigeo_destino: z.string().nullable().optional(), direccion_destino: z.string().nullable().optional(), valor_referencial_servicio_de_transporte: z.string().nullable().optional(), valor_referencial_carga_efectiva: z.string().nullable().optional(), valor_referencial_carga_util: z.string().nullable().optional(), detalle_del_viaje: z.string().nullable().optional()}); export const appSchemasCalculateTotalDocumentAnticipationCreate = z.object({tipo_documento: z.string().nullable().optional(), codigo_tipo_documento: z.string().nullable().optional(), serie: z.string().nullable().optional(), numero: z.number().int().nullable().optional(), total: z.number().nullable().optional()}); export const anticipationCreateOutput = z.object({total: z.number().nullable(), total_value: z.number().nullable(), total_taxed: z.number().nullable(), documents: z.array(appSchemasCalculateTotalDocumentAnticipationCreate).nullable()}); export const documentCreateOut = z.object({tipo_documento: z.string().nullable().optional(), tasa_de_cambio: z.number().nullable().optional(), tipo_operacion: z.string(), moneda: z.string().nullable().optional(), moneda_id: z.string().nullable().optional(), moneda_local_id: z.string().nullable().optional(), total_venta: z.number().nullable().optional(), total_exportacion: z.number().nullable().optional(), total_exonerado: z.number().nullable().optional(), total_inafecto: z.number().nullable().optional(), total_gratuito: z.number().nullable().optional(), total_gravado: z.number().nullable().optional(), total_impuestos: z.number().nullable().optional(), total_igv: z.number().nullable().optional(), total_valor: z.number().nullable().optional(), total_pagado: z.number().nullable().optional(), total_descuento: z.number().nullable().optional(), total_cargo: z.number().nullable().optional(), total_rc: z.number().nullable().optional(), descuento: appSchemasCalculateTotalDiscount.nullable().optional(), total_retencion: z.number().nullable().optional(), total_icbp: z.number().nullable().optional(), total_base_isc: z.number().nullable().optional(), total_isc: z.number().nullable().optional(), retencion_id: z.number().int().nullable().optional(), taxe: z.number().nullable().optional(), id: z.number().int().nullable().optional(), items: z.array(item), totales: documentTotalCreateOutput.nullable().optional(), condicion_de_pago: z.array(paymentConditionCreate).nullable().optional(), retencion: documentRetentionCreate.nullable().optional(), codigo_retencion: z.string().nullable().optional(), detraccion: appSchemasCalculateTotalDocumentDetractionCreate.nullable().optional(), datos_transporte_carga: documentTransportChargeCreate.nullable().optional(), anticipos: z.array(appSchemasCalculateTotalDocumentAnticipationCreate).nullable().optional(), anticipo: anticipationCreateOutput.nullable().optional(), tipo_nota: z.string().nullable().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 }; /** * Store * * POST /api/v3/calcular-total */ export const createApiApiV3CalcularTotal = async (args: CreateApiApiV3CalcularTotalArgs, options: CreateApiApiV3CalcularTotalOptions) => { const {baseUrl, fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") const url = `${baseUrl.replace(/\/+$/, '')}/api/v3/calcular-total${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(documentCreateOut, await res.json()) };