---
audiencia: usuario
screen_key: gastos
titulo: Gastos
aliases: [gasto, gastos, viatico, viático, viáticos, anticipo viatico, anticipo personal, tipo de gasto, tipos de gasto, gasto operativo, factura gasto, rendicion, rendición, rendicion viatico, gasto alquiler, gasto combustible, gasto servicio, gastos generales, importar gastos, importacion de gastos, importación de gastos, libro de compras, libro compras set, importar excel gastos, subir excel gastos, gastos desde excel]
---

# Gastos — Guía para el Usuario

Esta guía cubre el módulo **Gastos**: registro de facturas de proveedores que no involucran mercadería (alquiler, servicios, combustible, viáticos, honorarios, etc.), configuración del catálogo de tipos de gasto, integración con contabilidad, y el flujo especial de **anticipos personales** (viáticos y similares).

---

## ¿Dónde encuentro esto en el menú?

- **Compras → Gastos**: listado y alta de gastos.
- **Compras → Gastos → Importar desde Excel**: carga masiva desde el Libro de Compras del SET (`/gastos/importar`). Ver sección **"Importación de Gastos desde Excel"** más abajo.
- **Compras → Tipos de Gasto**: catálogo de tipos disponibles para la empresa.
- **Compras → Orden de Pago**: cuando el gasto se paga vía transferencia o cheque al proveedor, o cuando se adelanta un anticipo personal. *(Antes estaba en Finanzas; se movió a Compras.)*
- **Compras → Cuentas a Pagar**: control de saldos de gastos a crédito pendientes de pago. *(Antes estaba en Finanzas; se movió a Compras.)*
- **Contabilidad → Asientos**: para ver el asiento generado automáticamente por el gasto.

Las solapas **Gastos** y **Tipos de Gasto** son visibles cuando el submódulo **Gastos** (`TES_GASTOS`) está habilitado. Las solapas **Cuentas a Pagar** y **Orden de Pago** dependen de la config `config_compras` y de permisos del usuario — ver detalle en `guia-compras.md` (sección *"¿Dónde encuentro esto en el menú?"* y *"Generar CxP automáticamente / Orden de Pago"*).

---

## Conceptos generales

### ¿Qué es un gasto?

Un gasto es una factura recibida de un proveedor (o un comprobante interno) por servicios, insumos no inventariables o gastos operativos. **No mueve stock**. Genera IVA Crédito (si aplica) y, opcionalmente, cuenta por pagar y asiento contable.

Ejemplos: alquiler local, luz, agua, teléfono, internet, combustible, honorarios profesionales, viáticos de empleados.

### Diferencia con una factura de compra

| Aspecto | Factura de compra | Gasto |
|---------|-------------------|-------|
| Mueve stock | Sí (si el ítem lo permite) | No |
| Tipo de gasto obligatorio | No | Sí (por ítem) |
| Cuenta contable destino | Mercaderías | Cuenta del tipo de gasto |
| Lotes | Sí (si el producto lo usa) | No |
| Aparece en Libro IVA | Sí | Sí (si IVA > 0) |

### Tipos de gasto

El catálogo de tipos define cómo se clasifica cada ítem del gasto. Cada tipo tiene:

- **Descripción**: nombre del gasto (Alquiler, Combustible, Viáticos, etc.).
- **% IVA por defecto**: 0, 5 o 10. Se puede cambiar al cargar el gasto.
- **Deducible**: si está marcado, el IVA Crédito se separa del gasto en el asiento. Si no, el total con IVA va a la cuenta de gasto.
- **Cuenta contable**: cuenta del plan de cuentas donde se imputa el gasto (si el módulo Contabilidad está activo). Si no se configura, usa la cuenta fallback "Gastos Generales" (`6.1.2.99`).

Los tipos pre-cargados por el sistema son:

| Tipo | IVA | Cuenta contable default |
|------|-----|------------------------|
| Alquiler | 10% | 6.1.2.01 |
| Servicios básicos | 10% | 6.1.2.02 |
| Telefonía / Internet | 10% | 6.1.2.04 |
| Útiles y papelería | 10% | 6.1.2.05 |
| Mantenimiento | 10% | 6.1.2.06 |
| Seguros | 10% | 6.1.2.07 |
| Combustible | 10% | 6.1.2.11 |
| Movilidad y viáticos | 10% | 6.1.2.12 |
| Honorarios profesionales | 10% | 6.1.2.13 |
| Gasto gravado 5% | 5% | 6.1.2.99 |
| Gasto exento | 0% | 6.1.2.99 |
| Otros | 10% | 6.1.2.99 |

La empresa puede crear tipos adicionales propios desde la solapa **Tipos de Gasto**.

### Formas de pago y su impacto contable

| Forma de pago | HABER en el asiento | Genera CxP |
|---------------|---------------------|------------|
| **Contado** | Caja General | No |
| **Crédito** | Proveedores (CxP) | Sí |
| **Transferencia** | Banco por defecto | No |
| **Anticipo personal** | Anticipo para Viáticos / Personal (cuenta `1.01.03.03.04`) | No |

> "Anticipo personal" se usa cuando el empleado ya recibió adelanto de fondos y ahora está rindiendo las facturas. Ver flujo completo en la sección **Viáticos y anticipos**.

> **Flag "Incluir contado en orden de pago"** (Configuración → Facturación → Configuración de Compras, `incluir_contado_en_orden_pago`, default OFF). Si está **ON**, un gasto de **Contado** o **Transferencia** con proveedor **no se paga al registrarse**: queda como **cuenta por pagar pendiente** (estado del gasto `registrado`) y se abona desde una **orden de pago**. En ese caso el asiento acredita **Proveedores** (no Caja/Banco); el pago real lo asienta la orden de pago (DEBE Proveedores / HABER Caja o Banco). No afecta a **Anticipo personal** (los anticipos nunca generan CxP) ni a gastos sin proveedor.

### Estados de un gasto

| Estado | Descripción |
|--------|-------------|
| **registrado** | Cargado y activo. Genera asiento y CxP (si aplica). |
| **anulado** | Revertido. El asiento y la CxP quedan anulados. |

---

## Configuración previa (antes de operar)

### 1. Catálogo de tipos de gasto

Ir a **Compras → Tipos de Gasto**. Para cada tipo:

1. Crear / editar el tipo con su descripción y % IVA.
2. Si el módulo Contabilidad está activo, asignar la **cuenta contable** correspondiente del plan de cuentas. Solo aparecen cuentas que aceptan movimientos (`acepta_movimientos = true`).
3. Si no se asigna cuenta, el sistema usa el fallback **Gastos Generales** (`6.1.2.99`).

> Los tipos globales del sistema (`is_sistema = true`) son de solo lectura. La empresa puede agregarle cuenta contable pero no cambiar descripción ni IVA.

### 2. Mapeo de conceptos contables (módulo Contabilidad)

Si Contabilidad está activo, verificar que estén mapeados los conceptos usados por gastos:

| Concepto | Cuenta esperada | Para qué |
|----------|-----------------|----------|
| `GASTOS_GENERALES` | `6.1.2.99` | Fallback cuando el tipo no tiene cuenta |
| `CAJA_GENERAL` | (caja principal) | HABER cuando forma_pago = CONTADO |
| `PROVEEDORES` | (CxP proveedores) | HABER cuando forma_pago = CREDITO |
| `BANCOS_DEFAULT` | (banco principal PYG) | HABER cuando forma_pago = TRANSFERENCIA |
| `ANTICIPO_PERSONAL` | `1.01.03.03.04` | HABER cuando forma_pago = ANTICIPO |
| `IVA_CREDITO_10` | (crédito fiscal IVA 10%) | DEBE por IVA en gastos deducibles |
| `IVA_CREDITO_5` | (crédito fiscal IVA 5%) | DEBE por IVA en gastos deducibles |

Estos mapeos se configuran en **Contabilidad → pestaña Mapeo de Cuentas**.

> Si el concepto `ANTICIPO_PERSONAL` no aparece en el listado de mapeos, ir a Contabilidad → pestaña Mapeo de Cuentas → Agregar concepto → `ANTICIPO_PERSONAL` → seleccionar la cuenta `1.01.03.03.04`.

---

## Alta de un gasto

### Cabecera

| Campo | Obligatorio | Notas |
|-------|-------------|-------|
| Proveedor | Sí (para CxP) | Requerido si forma_pago = CREDITO |
| Fecha de emisión | Sí | Fecha del comprobante |
| Timbrado | Sí | 8 dígitos del proveedor |
| Establecimiento | Sí | 3 dígitos (`001`) |
| Punto de expedición | Sí | 3 dígitos (`001`) |
| Número de factura | Sí | 7 dígitos |
| Forma de pago | Sí | Contado / Crédito / Transferencia / Anticipo personal |
| Descripción | No | Glosa interna |
| Deducible | Sí | Flag global; por defecto heredado del tipo de gasto |

> El sistema auto-completa el RUC del proveedor si está cargado en el catálogo. La combinación timbrado + establec. + punto + número debe ser única por empresa — el sistema rechaza duplicados.

### Ítems

Por cada línea del gasto:

| Campo | Obligatorio | Notas |
|-------|-------------|-------|
| Tipo de gasto | Sí | Del catálogo de tipos |
| Descripción | Sí | Descripción del ítem |
| Cantidad | Sí | Default 1 |
| Precio unitario | Sí | Con IVA incluido (convención PY) |
| % IVA | Sí | 0, 5 o 10 — hereda del tipo pero se puede cambiar |

Los subtotales se calculan automáticamente:
- **Subtotal**: cantidad × precio unitario (con IVA incluido).
- **IVA**: extraído del subtotal: `IVA = subtotal − (subtotal / (1 + tasa/100))`.
- **Total gasto**: suma de todos los ítems.

---

## Asientos contables automáticos

### Gasto deducible (IVA Crédito separado)

```
DEBE   Cuenta tipo de gasto (ej: 6.1.2.12)   …  subtotal_sin_iva
DEBE   IVA Crédito 10% (1.01.03.05.03)        …  iva_10
DEBE   IVA Crédito 5%                          …  iva_5
HABER  [Contraparte según forma_pago]           …  total
```

### Gasto no deducible (IVA incluido en el gasto)

```
DEBE   Cuenta tipo de gasto                    …  subtotal_total_con_iva
HABER  [Contraparte según forma_pago]           …  total
```

### Contraparte según forma de pago

| Forma de pago | Cuenta HABER |
|---------------|--------------|
| Contado | Caja General (concepto `CAJA_GENERAL`) |
| Crédito | Proveedores / CxP (concepto `PROVEEDORES`) |
| Transferencia | Banco por defecto (concepto `BANCOS_DEFAULT`) |
| Anticipo personal | Anticipo para Viáticos / Personal (`ANTICIPO_PERSONAL` → `1.01.03.03.04`) |

> **Con "Incluir contado en orden de pago" activo**: Contado y Transferencia (con proveedor) acreditan **Proveedores** en vez de Caja/Banco, porque el pago se difiere a la orden de pago. El asiento del pago (DEBE Proveedores / HABER Caja o Banco) lo genera la orden de pago al ejecutarse.

> Si la empresa no tiene módulo Contabilidad, no se genera asiento y la operación igual se registra.

> **El sistema no valida que la cuenta mapeada esté activa.** Si el concepto (`CAJA_GENERAL`, `PROVEEDORES`, `BANCOS_DEFAULT`, `ANTICIPO_PERSONAL`) apunta a una cuenta que fue desactivada — típicamente porque la empresa reestructuró su plan de cuentas y las cuentas viejas quedaron archivadas con prefijo `OLD-` — el asiento **se genera igual, sin ningún error**, contra esa cuenta inactiva. No hay mensaje de validación para esto: el síntoma es que el reporte contable "está mal" según el cliente, no un error en pantalla. Ver la sección **"El asiento del gasto usa la cuenta equivocada (mapeo desactualizado)"** más abajo para el diagnóstico y la corrección.

---

## Corregir un gasto contabilizado contra la cuenta equivocada (mapeo desactualizado)

### Síntoma típico

El cliente reclama algo como *"el gasto que pagué por transferencia salió contra el banco que no es"*, *"la cuenta de caja del asiento no es la que uso"*, o en general que el asiento generado por un gasto no coincide con la cuenta real que espera ver en su contabilidad — **no es un reclamo sobre el tipo de gasto ni su cuenta contable**, sino sobre la **contraparte** (columna "Contraparte según forma de pago" más arriba).

### Diagnóstico

1. Identificar qué concepto corresponde a la forma de pago del gasto reclamado: `CAJA_GENERAL` (Contado), `PROVEEDORES` (Crédito), `BANCOS_DEFAULT` (Transferencia) o `ANTICIPO_PERSONAL` (Anticipo personal).
2. Ir a **Contabilidad → Mapeo de Cuentas** y ubicar ese concepto: ¿a qué cuenta apunta?
3. Ir a **Contabilidad → Plan de Cuentas** y revisar esa cuenta: ¿está **activa**? ¿su código empieza con **`OLD-`**? Cualquiera de las dos cosas confirma el problema — es una cuenta de un plan de cuentas reemplazado que quedó mapeada por error.
4. Si hay dudas de cuál es la cuenta "correcta" vigente, comparar contra otro concepto de la misma familia que sí esté bien mapeado (ej. si `BANCO` — usado por Rendición de Viáticos — apunta a una cuenta activa correcta pero `BANCOS_DEFAULT` — usado por Gastos — apunta a la vieja, es señal de que al reconfigurar el mapeo tras la reestructuración se actualizó un concepto y no el otro; hay varios conceptos "banco" parecidos y es fácil olvidar alguno: `BANCO`, `BANCOS_DEFAULT`, `BANCO_PYG`, `BANCO_USD` — cada uno lo usa un módulo distinto, ver `guia-contabilidad.md`).

### Corrección — dos pasos, en este orden

**Paso 1 — Corregir el mapeo (arregla los gastos futuros):**
Contabilidad → Mapeo de Cuentas → editar el concepto → elegir la cuenta activa correcta.

**Paso 2 — Corregir los asientos ya generados con la cuenta vieja (uno por uno):** el arreglo del mapeo **no** corrige retroactivamente nada — hay que rehacer el asiento de cada gasto ya afectado:

1. **Contabilidad → Asientos**: ubicar el asiento del gasto (filtrar por fecha/monto, o abrir el gasto en Compras → Gastos y desde ahí navegar al asiento) y confirmar que la línea HABER usa la cuenta vieja.
2. En ese asiento, click **"Revertir"** — genera un asiento espejo y deja el original en estado `REVERTIDO`. Requiere permiso `CONT_ASI_ASIENTO_REVERTIR` y un período contable abierto para la fecha de hoy.
3. **Compras → Gastos**: ubicar el gasto (columna Acciones). En cuanto el asiento deja de estar `CONFIRMADO`, aparece un ícono naranja **"Reintentar contabilidad"** — hacer click ahí. Genera un asiento nuevo, esta vez contra la cuenta ya corregida en el mapeo.

> **El botón "Reintentar contabilidad" funciona incluso si el gasto está en estado "pagada"** — a diferencia de Editar, que queda bloqueado en ese estado. Es la única forma de volver a disparar la contabilización de un gasto pagado sin tocar la base de datos a mano.

> **La pantalla de Conciliación Contable no detecta este caso.** Conciliación busca documentos que **nunca generaron asiento**; un gasto con asiento CONFIRMADO contra la cuenta equivocada tiene, técnicamente, un asiento — no aparece ahí. El diagnóstico tiene que hacerse manualmente siguiendo los pasos de arriba.

---

## Viáticos y anticipos personales

Este es el flujo para cuando la empresa primero adelanta fondos a un empleado y luego el empleado rinde las facturas.

### ¿Cuándo usar "Anticipo personal"?

Cuando el empleado ya recibió el dinero en efectivo o transferencia antes de viajar / gastar, y ahora presenta las facturas al regresar. La rendición debe "consumir" el anticipo previo, no generar una nueva deuda ni salida de caja.

### Flujo completo paso a paso

#### Paso 1 — Pagar el anticipo (Orden de Pago)

1. Ir a **Compras → Orden de Pago → Nueva Orden**.
2. Seleccionar el proveedor / empleado.
3. En los medios de pago, elegir **Transferencia** o **Efectivo**, con la cuenta de banco correspondiente.
4. En Tesorería, ese pago genera un egreso desde el banco.
5. Para que el asiento contable sea correcto, configurar en **Configuración → Tesorería y Bancos → Categorías de Movimiento** una categoría llamada "Anticipo Viáticos" con la cuenta contable `1.01.03.03.04 — ANTICIPO PARA VIÁTICOS`.

**Asiento generado por la Orden de Pago:**
```
DEBE   Anticipo para Viáticos (1.01.03.03.04)   …  monto anticipado
HABER  Banco / Cuenta corriente                  …  monto anticipado
```

> La cuenta `1.01.03.03.04 — ANTICIPO PARA VIÁTICOS` existe en el plan de cuentas de la empresa. Si no aparece en el plan, verificar que la migración `20260720_anticipo_viaticos_cuenta` haya sido aplicada.

#### Paso 2 — Rendir las facturas (Gasto)

Cuando el empleado presenta las facturas:

1. Ir a **Compras → Gastos → Nuevo Gasto**.
2. Cargar el proveedor y los datos del comprobante.
3. En **Forma de pago** elegir **Anticipo personal**.
4. En cada ítem, seleccionar tipo de gasto "Movilidad y viáticos" (o el que corresponda).
5. Guardar.

**Asiento generado por el Gasto:**
```
DEBE   Gastos por Viáticos (6.1.2.12)              …  subtotal_sin_iva
DEBE   IVA Crédito 10%                              …  iva
HABER  Anticipo para Viáticos (1.01.03.03.04)       …  total
```

Esto descuenta el anticipo. La cuenta `1.01.03.03.04` queda en cero cuando el total gastado iguala al anticipo entregado.

#### Paso 3 — Cuadrar la diferencia (si existe)

- **Empleado gastó menos** que el anticipo: debe devolver la diferencia. Registrar un ingreso manual en Tesorería desde la cuenta anticipo hacia banco/caja.
- **Empleado gastó más** que el anticipo: la empresa le debe la diferencia. Registrar una Orden de Pago complementaria o un gasto adicional con forma_pago Transferencia / Contado.

### Verificación

- En **Contabilidad → Asientos** confirmar que el asiento del gasto acredita `1.01.03.03.04`.
- El saldo de esa cuenta en el **Balance** debe ir a cero cuando todos los anticipos del período están rendidos.

---

## Cuentas por Pagar (forma_pago = Crédito)

Si el gasto tiene forma_pago = **Crédito**, el sistema crea automáticamente un registro en `cuentas_pagar`:

- `origen_tipo = 'gasto'`
- `origen_id` = id del gasto
- Una sola cuota con vencimiento = fecha de emisión + plazo de crédito (si aplica)
- Estado inicial: `pendiente`

El pago de esa CxP se hace desde **Compras → Cuentas a Pagar** o directamente desde una **Orden de Pago** (ambas ahora dentro del módulo Compras).

---

## Anulación de un gasto

### Qué reversa al anular

1. **Asiento contable**: genera el asiento espejo (DEBE y HABER invertidos).
2. **CxP**: las cuotas pasan a anuladas, saldo en 0.
3. El gasto queda visible con flag `anulado = true`.

### Restricciones

- No se puede anular un gasto ya anulado.
- Si el gasto tiene CxP con pagos parciales aplicados, hay que revertir esos pagos primero.
- Si el período contable está cerrado, hay que reabrirlo para que el asiento de reverso entre.

---

## Gastos desde Requisición

Si la empresa tiene habilitadas las requisiciones de compra, se puede generar un gasto directamente desde una requisición aprobada:

1. Ir a **Compras → Requisiciones** y abrir la requisición aprobada.
2. Click en "Generar Gasto".
3. Los ítems pendientes de la requisición se heredan automáticamente con su tipo de gasto y descripción.
4. Completar proveedor, datos del comprobante y forma de pago.

> Solo se pueden generar gastos desde requisiciones en estado **aprobada** o **ejecutada parcial**.

---

## Importación de Gastos desde Excel

Permite cargar muchos gastos de una sola vez subiendo el **Libro de Compras del SET** (el mismo archivo que ya usa el contador para declarar IVA), en vez de cargarlos uno por uno a mano. Pensado para migrar el historial de un cliente nuevo o para cargar el mes completo de una vez.

**Ruta**: `Compras → Gastos → Importar desde Excel` (`/gastos/importar`).
**Permiso requerido**: `TES_GAS_GASTO_IMPORTAR` (submódulo `TES_GASTOS`). Sin este permiso el botón "Importar desde Excel" no aparece.

### Formato del archivo

- Debe ser **.xlsx**, máximo **10 MB**.
- La primera fila debe tener los encabezados. El sistema reconoce las columnas por nombre (tolera variaciones menores de mayúsculas/tildes/espacios), buscando estas 19 columnas del Libro de Compras SET:

| Columna del Excel | Campo interno |
|---|---|
| RUC / Nº de Identificación del Informado | RUC del proveedor |
| Nombre o Razón Social del Informado | Razón social del proveedor |
| Fecha de Emisión | Fecha del comprobante |
| Condición de la Operación | Contado / Crédito |
| Timbrado del Comprobante | Timbrado |
| Número de Comprobante | Se separa en establecimiento-punto de expedición-número (`001-001-0000001`) |
| Monto Gravado 10% / IVA 10% | Monto con IVA 10% incluido |
| Monto Gravado 5% / IVA 5% | Monto con IVA 5% incluido |
| Monto No Gravado / Exento | Monto exento |
| Total Comprobante | Total de la fila |
| TIPO CUENTA CONTABLE- GASTO | Texto libre a mapear al catálogo de Tipos de Gasto |
| TIPO CUENTA CONTABLE- CONTRAPARTIDA PASIVA | Usado para clasificar el proveedor (ver más abajo) |

> Los montos "Gravado 10%/5%" ya vienen **con IVA incluido**, igual que en la carga manual — el sistema extrae el IVA solo, no hace falta cargarlo aparte.

> Si una factura tiene montos a la vez en 10%, 5% y exento (una misma fila con varias columnas de monto en cero/no-cero), el sistema genera **un ítem del gasto por cada tramo de IVA no nulo**, no un único ítem.

### El flujo en 4 pasos

**Paso 1 — Subir archivo**
Se sube el .xlsx. El sistema lo parsea, detecta las columnas, y clasifica cada fila:
- Detecta automáticamente filas que **no son gastos** y las omite, mostrando el motivo:
  - **"Importación en curso"** → pertenecen al módulo Importaciones (comercio exterior), no a Gastos.
  - **"Mercadería"** (ej. "MERCADERIAS GRAVADAS + IVA 10%") → es una compra de mercadería, no un gasto — se registra desde Compras → Facturas.
  - **"Remuneración de personal"** (ej. "REMUNERACION AL PERSONAL SUPERIOR") → es nómina/sueldos, no un gasto de compras — se excluye siempre.
- Marca como **inválida** cualquier fila con datos que no se pueden interpretar (fecha, número de comprobante malformado, falta la razón social o el tipo de gasto).

**Paso 2 — Mapear tipos de gasto**
El Excel trae el tipo de gasto como **texto libre** (la cuenta contable que usa el contador del cliente), que no necesariamente coincide con la descripción exacta del catálogo interno de Tipos de Gasto. En esta pantalla aparece cada texto distinto encontrado (agrupado, con la cantidad de filas que lo usan) para que se le asigne una acción:

- **Mapear**: elegir a qué Tipo de Gasto del catálogo corresponde. Si no existe el tipo, hay que crearlo primero desde **Compras → Tipos de Gasto** y volver a esta pantalla.
- **Omitir**: esas filas no se importan (para textos que no corresponden a un gasto real, más allá de los que ya se excluyeron automáticamente).
- **Recordar**: si se tilda, el sistema guarda el mapeo como un **alias por empresa** — la próxima vez que se importe un archivo de la misma empresa, ese mismo texto se resuelve solo (aparece la etiqueta "Ya mapeado previamente" y viene pre-cargado). Muy útil porque la terminología contable de cada cliente es distinta y se repite mes a mes.

> Los textos con inconsistencias de tipeo (ej. "GASTO GENERAL" vs "GASTOS GENERAL") se normalizan (mayúsculas, sin tildes, sin espacios/símbolos sueltos) antes de agruparlos, pero **no se auto-corrigen entre sí** — cada variante de texto distinta pide su propio mapeo la primera vez.

**Paso 3 — Revisar y confirmar**
Muestra el resumen: cuántas filas quedaron **válidas**, **inválidas** y **omitidas**. Al confirmar, el sistema **no crea los gastos al instante** — encola el procesamiento en segundo plano (ver más abajo) y devuelve el control inmediatamente.

**Paso 4 — Resultado**
La pantalla consulta el estado del proceso cada pocos segundos hasta que termina, mostrando una barra de progreso. Al finalizar muestra cuántos gastos se crearon y, si hubo errores, una tabla con **fila, proveedor y motivo del error**.

### Por qué el procesamiento es asíncrono

Crear un gasto no es una operación liviana: por cada fila el sistema valida datos, resuelve o crea el proveedor, calcula IVA, genera la cuenta por pagar y dispara la contabilización. Para un archivo de 100-300 filas, hacerlo todo dentro de un único pedido HTTP correría el riesgo de que el navegador (o cualquier proxy intermedio) corte la conexión por timeout mientras el servidor sigue trabajando. Por eso, al confirmar, la importación se encola y se procesa en background; la pantalla de resultado hace polling hasta que termina.

Estados posibles del proceso: `preview` (recién subido) → `mapeado` (mapeo guardado) → `procesando` (encolado, corriendo) → `completado` / `completado_con_errores` / `error`.

### Resolución de proveedor

Para cada fila, el sistema busca un proveedor existente por **RUC**; si no lo encuentra, busca por **razón social**; si tampoco existe, **lo crea automáticamente**. La columna "TIPO CUENTA CONTABLE- CONTRAPARTIDA PASIVA" se usa para clasificar el tipo de tercero del proveedor creado (ver `guia-compras.md` sección "Tipos de tercero"):

| Contrapartida pasiva contiene… | Tipo de tercero asignado |
|---|---|
| "ACREEDOR" | Acreedor vario |
| "EXTERIOR" | Proveedor del exterior |
| (cualquier otro valor) | Proveedor local (default) |

### Forma de pago y el caso de "Anticipo de viático"

La forma de pago del gasto se toma de la columna **Condición de la Operación** (Contado / Crédito), igual que en la carga manual.

Si la contrapartida pasiva dice **"Anticipo de viático"**, el gasto **igual se importa como Contado o Crédito normal** (no como forma_pago = Anticipo personal), porque ese flujo especial requiere vincular el gasto a una **rendición de viáticos** ya existente en el sistema (ver sección "Viáticos y anticipos personales" más arriba) — algo que el Libro de Compras no informa. Estas filas quedan con una observación en el gasto creado para trazabilidad: *"Origen: Anticipo de viático (histórico — período anterior a la implementación en el sistema, sin rendición de viáticos vinculada)"*. Si corresponde vincularlas a una rendición real, hay que hacerlo manualmente después de la importación.

### Duplicados

El sistema **no permite** crear dos veces el mismo gasto (misma combinación timbrado + establecimiento + punto de expedición + número de factura, activo). Si se vuelve a subir un archivo ya importado —por ejemplo, para agregarle filas nuevas de un mes—, las filas que ya existen quedan marcadas como **error** ("Ya existe un gasto activo con timbrado X y factura Y…") en el resultado, pero **no interrumpen** el resto: las filas nuevas del mismo archivo sí se crean. Esto permite reintentar un archivo tantas veces como haga falta sin duplicar nada.

### Validaciones específicas del importador

- **"Falta el archivo o está vacío"** / **"No se pudo leer el archivo. Verificá que sea un .xlsx válido"**.
- **"El archivo no tiene filas de datos"**.
- **"El valor '…' requiere un tipo de gasto para mapear"** — se eligió "Mapear" sin seleccionar el Tipo de Gasto del sistema.
- **"El job debe tener el mapeo guardado antes de confirmar"** — se intentó confirmar sin pasar por el paso de mapeo.
- **"Ya existe un gasto activo con timbrado X y factura Y…"** — duplicado (ver arriba).
- Fila sin RUC ni razón social: **"Fila sin RUC ni razón social, no se puede resolver proveedor"**.

### Problemas frecuentes (importador)

- **"Muchas filas quedan como inválidas"**: revisar en el Excel que la columna Número de Comprobante tenga el formato `EST-PUN-NUMERO` (ej. `001-001-0000001`) y que la fecha esté en `dd/mm/aaaa`.
- **"Una fila que sí es un gasto real quedó omitida automáticamente"**: el texto del tipo de gasto contenía alguna de las palabras clave de exclusión (ej. contiene "MERCADERIA" o "IMPORTACION EN CURSO" aunque no lo sea realmente). En el paso de mapeo se puede revisar y, si corresponde, mapearla igual manualmente.
- **"Tengo que volver a mapear todo cada vez"**: asegurate de tildar **Recordar** al mapear — así queda guardado como alias de la empresa y las próximas importaciones lo reconocen solo.
- **"Subí el mismo archivo dos veces y no se creó nada"**: es el comportamiento esperado del control de duplicados — todas las filas ya existían. Revisá el detalle de errores en la pantalla de Resultado para confirmarlo fila por fila.
- **"El proveedor se creó con datos incompletos (sin DV, sin cuenta contable)"**: es esperado — el Libro de Compras no trae el dígito verificador ni la cuenta contable del proveedor. Completar esos datos manualmente después desde el catálogo de Proveedores si hace falta.

### Limitaciones actuales (importador)

- Solo soporta el formato del **Libro de Compras del SET** con las 19 columnas estándar; no hay todavía una plantilla propia descargable para clientes que no exporten desde ahí.
- No hay una pantalla para "actualizar" un gasto ya importado — un duplicado siempre se rechaza, nunca se sobreescribe.
- Las filas de "Anticipo de viático" no se vinculan automáticamente a una rendición de viáticos; ese paso, si aplica, es manual y posterior a la importación.
- No hay soporte para mapear moneda distinta de guaraníes ni para elegir sucursal por fila (una sola sucursal, opcional, para todo el archivo).

---

## Validaciones del backend

- **"Proveedor requerido para registrar cuentas por pagar del gasto"** — si forma_pago = CREDITO, el proveedor es obligatorio.
- **"La configuración exige requisición obligatoria. Debés informar requisicion_id"** — cuando la empresa tiene `requisicion_obligatoria = true` para gastos.
- **"La descripción del tipo de gasto es obligatoria"** — al crear un tipo nuevo.
- **"El porcentaje de IVA debe ser 0, 5 o 10"** — al crear o editar un tipo.
- **"La requisición indicada no corresponde al origen gasto"** — requisición de otro tipo.
- **"La requisición debe estar aprobada para ejecutar gastos"** — solo se puede gastar desde requisiciones aprobadas.
- **"No se puede editar un gasto anulado"**.
- **"No se puede contabilizar un gasto anulado"**.
- **"Asiento desbalanceado"** — si los totales DEBE/HABER no cuadran (suele pasar si faltan cuentas contables en los mapeos). El sistema deja el asiento en estado BORRADOR.
- **"No hay cuenta mapeada para el concepto ANTICIPO_PERSONAL"** — el mapeo de concepto no está configurado en Contabilidad. Ver sección Configuración previa.

---

## Problemas frecuentes

- **"El gasto no aparece en el Libro IVA Compras"**: solo aparecen ítems con % IVA > 0. Los gastos exentos no se listan. Verificar también que la fecha esté dentro del período del reporte.

- **"No hay asiento generado para el gasto"**: puede faltar el mapeo de concepto en Contabilidad (`GASTOS_GENERALES`, `CAJA_GENERAL`, `PROVEEDORES`, según corresponda), o la empresa no tiene módulo Contabilidad activo.

- **"El asiento quedó en estado BORRADOR"**: alguna cuenta falta en los mapeos. Ver el mensaje de error en Contabilidad → Asientos → filtrar por estado BORRADOR.

- **"No puedo seleccionar 'Anticipo personal' en forma de pago"**: actualizar la pantalla — la opción se agregó en la versión con migración `20260720`. Si el sistema no fue actualizado todavía, elegir Contado y ajustar el asiento manualmente.

- **"La cuenta Anticipo para Viáticos no aparece en el plan de cuentas"**: la migración `20260720_anticipo_viaticos_cuenta` no se aplicó aún. Contactar al administrador del sistema para aplicarla.

- **"La OP de anticipo no generó asiento con la cuenta anticipo"**: la categoría de tesorería usada en la OP no tiene mapeada la cuenta `1.01.03.03.04`. Ir a Configuración → Tesorería y Bancos → Categorías de Movimiento → crear/editar "Anticipo Viáticos" y asignar la cuenta.

- **"Cargué el gasto como Anticipo pero el asiento acredita Caja en vez de Anticipo"**: el concepto `ANTICIPO_PERSONAL` no está mapeado en Contabilidad → pestaña Mapeo de Cuentas. Mapearlo a la cuenta `1.01.03.03.04`.

- **"No puedo generar gasto desde la requisición"**: verificar que la requisición esté en estado `aprobada`. Si está en `borrador` o `enviada`, pedir al responsable que la apruebe.

- **"El cliente dice que el asiento del gasto usa la cuenta de banco/caja equivocada"**: no es un error de tipo de gasto — ver sección **"Corregir un gasto contabilizado contra la cuenta equivocada (mapeo desactualizado)"** más arriba. Es casi siempre un mapeo de cuentas que quedó apuntando a una cuenta desactivada tras una reestructuración del plan de cuentas.

- **"No veo el ícono 'Reintentar contabilidad' en un gasto"**: solo aparece cuando el asiento vinculado **no** está en estado `CONFIRMADO`. Si el asiento sigue `CONFIRMADO` (aunque esté contra la cuenta equivocada), primero hay que revertirlo desde **Contabilidad → Asientos → Revertir** — recién ahí aparece el ícono en Gastos. No es un tema de permisos del usuario.

---

## Lo que NO se puede hacer

- Cargar un gasto sin al menos un ítem con tipo de gasto.
- Registrar dos veces la misma factura del mismo proveedor (mismo timbrado + estab. + punto + número).
- Editar un gasto anulado.
- Usar forma_pago = Crédito sin proveedor seleccionado.
- Usar la cuenta `1.01.03.03.04` directamente desde el tipo de gasto como cuenta de gasto — esa es una cuenta de activo (anticipo), no de gasto. La cuenta de gasto siempre va en DEBE; el anticipo va en HABER como contraparte.

---

## Limitaciones actuales

- El flujo de cuadre de anticipo vs rendición es manual: el sistema no cruza automáticamente "qué anticipos tiene pendientes este empleado". El control se hace vía el saldo de la cuenta `1.01.03.03.04` en el balance.
- No hay reporte nativo de "anticipos vs rendiciones por empleado" — puede generarse desde Contabilidad filtrando por la cuenta `1.01.03.03.04`.
- Solo se soporta un nivel de anticipo: no hay flujo de "anticipo parcial → rendición parcial → devolución parcial" automatizado.
- El gasto no genera Orden de Pago automáticamente (a diferencia de las compras con `permitir_orden_pago_automatica`).
- **El mapeo de cuentas no valida que la cuenta esté activa al generar el asiento.** Si el plan de cuentas se reestructura (cuentas viejas archivadas con prefijo `OLD-`) y el mapeo de un concepto no se actualiza, el gasto se contabiliza igual, sin ningún error, contra la cuenta inactiva. Tras cualquier reestructuración del plan de cuentas hay que revisar a mano **Contabilidad → Mapeo de Cuentas** completo (los conceptos `CAJA_GENERAL`, `PROVEEDORES`, `BANCOS_DEFAULT`, `ANTICIPO_PERSONAL`, `GASTOS_GENERALES`, `IVA_CREDITO_10`, `IVA_CREDITO_5`), no solo los que "se usan seguido".
- No existe una pantalla que detecte gastos ya contabilizados contra una cuenta inactiva — Conciliación Contable solo encuentra documentos **sin** asiento, no asientos con cuenta equivocada.

---

## Documentos relacionados

- `guia-compras.md` — facturas de compra con stock, recepciones, órdenes de compra y Marangatu.
- `guia-tesoreria-bancos.md` — Órdenes de Pago y categorías de movimiento para el anticipo.
- `guia-contabilidad.md` — mapeos de cuentas, asientos, períodos.
- `guia-cobros-finanzas.md` — Cuentas a Pagar y pago de gastos a crédito.
