issueCreditNote() escriben un documento fiscal real que queda en los
registros de ARCA.
Una nota de crédito nombra el comprobante que corrige, o el período que
ajusta. issueDebitNote() emite notas de débito con el mismo contrato.
Nota parcial
Lo habitual es la nota parcial: una devolución o una corrección de precio que acredita las líneas que elegís en vez de la factura entera. Este bloque es examples/nota-de-credito-parcial.ts:Nota total
all: true acredita el original completo: espeja sus importes y sus alícuotas
de IVA línea por línea.
Este bloque es examples/nota-de-credito-total.ts:
items ni all: true, o con
los dos, se rechaza antes de cualquier I/O. Así, un campo olvidado nunca puede
acreditar la factura entera.
Qué sale del original y qué aportás vos
Del original el SDK toma la clase y por lo tanto el tipo de nota (1 → 3, 6 → 8, 11 → 13), el tipo, el número y la condición de IVA del receptor, la moneda y el tipo de cambio, el concepto y, para los conceptos 2 y 3, las fechas de servicio, con el vencimiento elevado a la fecha de la nota. La aplicación aportafor, el modo (items o amounts, con un total opcional,
o all: true) y, como mucho, el salesPoint de la nota, que por defecto es el
del original, y date, que por defecto es hoy en Buenos Aires. Una nota
vinculada no tiene campos issuer, to ni currency. Solo las notas por
período los llevan, porque no hay original de donde tomarlos.
La forma de los ítems sigue la clase del original. Una nota de clase C acepta
ítems { amount }. Las notas de clase A y B aceptan ítems { gross | net, vat }
con las mismas alícuotas y la misma conciliación que issue(). La clase es
evidencia del original, así que una forma que la contradice se rechaza después
de la única consulta del original y antes de cualquier escritura.
En lugar de items podés pasar amounts, el mismo desglose fiscal revisado
que acepta issue(): { net, vat, exempt?, untaxed?, vatRates? } en centavos,
con un total opcional. Es el modo para una nota parcial cuya composición ya
calculó tu aplicación. El SDK no recalcula el IVA. items y amounts son
excluyentes, y ninguno de los dos se combina con all: true.
Tributos en las notas
Una nota total espeja los tributos del original tal como los devuelve la consulta. Una nota parcial no prorratea nada: si la nota lleva tributos, los pasás vos entaxes, con las mismas filas
{ id, description?, base, rate, amount } en centavos que usa issue(). El
SDK nunca adivina qué percepción corresponde ni en qué proporción.
Límites
La nota no puede superar el total del original. El SDK no lleva la cuenta de notas anteriores contra un original. Evitar que varias notas sumen más que la factura es tarea de la aplicación. El original puede ser una factura o una nota de débito autorizada de las familias ordinaria (1, 2, 6, 7, 11, 12), A con leyenda (51, 52) o FCE (201, 202, 206, 207, 211, 212), incluidos los originales con tributos.for
identifica el original con { salesPoint, voucherType, number } y nada más:
alcanza con esas tres coordenadas del comprobante anterior.
Los saldos acumulados, el stock, la contabilidad, la condición de agente de
retención o percepción y qué percepción corresponde en cada caso siguen siendo
de la aplicación. Los campos opcionales propios de la nota los aportás vos: no
se copian del original.
Una nota a otro receptor o en otra moneda es un documento distinto. Para armarla
con campos que issueCreditNote() no deriva, usá los
métodos directos de ARCA. Para emitir una nota con
detalle de ítems, mirá WSMTXCA.
Notas de débito
issueDebitNote({ for, items | amounts }) emite una nota de débito contra los
mismos originales. No admite all: true: una nota de débito agrega al saldo,
así que sus líneas son siempre explícitas.
Notas por período
ConassociatedPeriod: { from, to } la nota ajusta un período en vez de un
comprobante. En ese modo no hay for y no hay original que consultar, así que
la nota lleva los mismos datos de negocio que una factura: issuer, to,
items o amounts, moneda y demás.
Notas FCE
Una nota FCE necesita un original FCE.fce: { annulment, reference? } informa
la anulación de forma explícita: all: true no la elige por vos. El CUIT del
emisor y la fecha del original viajan en la asociación, no en campos sueltos.
Vista previa de notas
previewCreditNote() y previewDebitNote() derivan lo que enviaría la
emisión. A diferencia de preview(), que no hace ninguna I/O, estas consultan
el original: una lectura, sin escritura y sin reservar número. La respuesta de
una nota vinculada incluye ese comprobante como original, un
VoucherSummary normalizado y sin la respuesta cruda. Una nota por período no tiene
original, así que tampoco necesita esa consulta ni devuelve esa propiedad.
Evitar duplicados y probar en producción
idempotencyKey e include funcionan igual que en issue(). Dale a la nota su
propia clave estable, por ejemplo nc:${devolucion.id}. Una repetición con
clave consulta solo la nota reservada e informa amounts a partir del request
guardado, así que en ese camino computedTotal es igual a sentTotal y
vatAdjustment es 0.
Una prueba de humo en producción es una factura de ARS 1 seguida de una nota
total. Los dos documentos son reales y quedan en los registros de ARCA. La
nota es una operación aparte. Si falla, la factura queda pendiente. Hacé
coincidir issuer con tu condición fiscal real.