Saltar al contenido principal

Facturas

Las facturas representan cobros enviados a los clientes. Cada factura contiene line items que detallan los productos y valores cobrados.

Estados de la Factura

draft → open → paid
↓ ↓
void uncollectible
StatusDescripción
draftBorrador. Puede ser editada, se pueden agregar/eliminar ítems
openFinalizada. Cobrable, puede recibir pagos y tener créditos aplicados
paidTotalmente pagada
voidAnulada. Los créditos aplicados son restaurados, las cuotas canceladas
uncollectibleMarcada como incobrable (write-off)

Campos de la Factura

Identificación

CampoDescripción
NúmeroNúmero secuencial único (formato: INV-YYYY-NNNNNN)
Cuenta de cobroCliente que recibirá la factura
SuscripciónSuscripción asociada (opcional)
EmpresaEmpresa emisora (para multi-empresa)

Valores (en centavos, ÷100 para reales)

CampoDescripción
SubtotalSuma de los line items antes de descuentos e impuestos
DescuentoTotal de descuento aplicado
ImpuestosTotal de impuestos calculados
Total retenidoImpuestos retenidos (PIS/COFINS/IRPJ)
Valor netoValor neto después de retenciones
TotalValor final (subtotal - descuento + impuestos)
Valor adeudadoMonto total a pagar
Valor pagadoMonto ya recibido
Valor restanteSaldo pendiente

Configuración

CampoDescripción
Método de cobrocharge_automatically, manual_charge o manual_invoice
Razón de cobrosubscription_cycle, subscription_create, subscription_update o manual
Política de NF-edisabled, on_finalization, on_full_payment o per_installment
Fecha de vencimientoCalculada a partir de los días de plazo del cliente

Line Items

Cada factura contiene ítems de línea que detallan los cobros:

CampoDescripción
Tiposubscription o invoiceitem
DescripciónTexto descriptivo
CantidadCantidad cobrada
Valor unitarioPrecio por unidad (en centavos)
Valor totalCantidad × valor unitario
ProrationSi el ítem es un prorrateo proporcional
PeríodoInicio y fin del período cobrado

Operaciones

Crear Factura

Al crear una factura, informe:

  • Cuenta de cobro (obligatorio)
  • Line items con descripción, cantidad y valor
  • Fecha de vencimiento (o usa los días de plazo del cliente)
  • Cuotas (opcional, mínimo 2, la suma debe ser igual al total)
  • Política de NF-e (opcional)

El número de la factura se genera automáticamente usando lock advisory de PostgreSQL para prevenir duplicación.

Finalizar (draftopen)

Al finalizar una factura:

  1. Valida que exista al menos 1 line item
  2. Valida que la suma de las cuotas = total (si tiene cuotas)
  3. Calcula impuestos automáticamente
  4. Aplica créditos automáticamente (FIFO: vencimiento más próximo primero, luego más antiguo)
  5. Si el método es charge_automatically: intenta cobrar inmediatamente

Marcar como Pagada

  • Soporta pagos parciales
  • Al recibir el valor total, el status cambia a paid
  • Crea un registro de transacción

Anular (Void)

Al anular una factura:

  • Los créditos aplicados son restaurados automáticamente
  • Las cuotas pendientes son canceladas
  • El motivo de la anulación es almacenado

Deshacer Pago

Revierte una factura de paid a open:

  • Restablece el valor pagado a cero
  • Crea una transacción de ajuste (valor negativo)
  • Almacena el motivo en el metadata

Marcar como Incobrable

Marca la factura como write-off. Irreversible. Ningún intento automático de pago será realizado.

Generación Automática de Números

Los números de factura se generan secuencialmente por año usando advisory locks de PostgreSQL. Formato: INV-\{año\}-\{secuencial con 6 dígitos\}.

Ejemplo: INV-2026-000147