Skip to main content

Refunds & Notifications · Article 6.1

Cuándo se producen los reembolsos: las ramas de enmienda Δ_REEMBOLSO

Un reembolso en Clozo siempre está vinculado a una rama de enmienda Δ_REEMBOLSO — parcial (total revisado inferior al anticipo pagado) o total (total revisado en cero). La enmienda es el detonante legal; el reembolso es la consecuencia monetaria.

Clozo no tiene un botón de «devolver dinero al cliente» desvinculado del contrato. Cada reembolso es la parte monetaria de una enmienda firmada que redujo el total por debajo de lo que el cliente ya pagó como anticipo. Este diseño es deliberado — los reembolsos sin el correspondiente cambio de contrato son una pesadilla de auditoría fiscal; vincular cada reembolso a una enmienda firmada garantiza que los documentos legales (Stornorechnung, Berichtigung, Gutschrift) y el movimiento de efectivo estén siempre sincronizados.

Quick visual tour

  1. when-refunds-happen step 1: Llega la solicitud de reembolso. No se preocupe — hay un camino claro.

    Step 1: Llega la solicitud de reembolso. No se preocupe — hay un camino claro.

  2. when-refunds-happen step 2: Compruebe la elegibilidad en el árbol de decisión. La mayoría de los casos son válidos.

    Step 2: Compruebe la elegibilidad en el árbol de decisión. La mayoría de los casos son válidos.

  3. when-refunds-happen step 3: Pulse Reembolso. Stripe gestiona el movimiento real del dinero.

    Step 3: Pulse Reembolso. Stripe gestiona el movimiento real del dinero.

  4. when-refunds-happen step 4: Observe cómo las monedas vuelan de vuelta desde su cuenta a la del cliente.

    Step 4: Observe cómo las monedas vuelan de vuelta desde su cuenta a la del cliente.

  5. when-refunds-happen step 5: Emita una nota de crédito. La contabilidad se cierra de forma limpia.

    Step 5: Emita una nota de crédito. La contabilidad se cierra de forma limpia.

Step by step

  1. Decida el importe del reembolso.

    No es un número que usted escriba — es la consecuencia de editar las líneas en una enmienda. Nuevo total inferior al anticipo cobrado → reembolso. Nuevo total en cero → anticipo total reembolsado.

  2. Abra el asistente de enmiendas.

    /proposals/{id}/amend. Reduzca las líneas en el Paso 1 hasta que el banner de contexto del anticipo del asistente muestre «Reembolso: €X».

  3. Establezca el motivo en el Paso 2.

    Mínimo 30 caracteres (el mínimo más largo refleja que está reduciendo — sea explícito). El motivo aparece en el addendum, en el texto narrativo de la nota de crédito, y forma parte del registro de auditoría.

  4. Envíe y espere a que el cliente firme.

    La enmienda pasa por el flujo estándar protegido por PIN (artículo 7.4). Al firmar, se ejecuta el pipeline de reembolso.

  5. Siga la línea de tiempo del reembolso.

    Un banner «Reembolso en progreso» aparece en la página de la propuesta una vez firmado. Etapas: emitido → requested (Stripe aceptado) → liquidado (webhook de Stripe confirmado) — consulte el artículo 8.4.

Después de que el cliente firma la enmienda Δ_REEMBOLSO, el banner de la propuesta cambia a «Reembolso en progreso» con el número de la nota de crédito y una ventana esperada. El menú desplegable de Documentos obtiene los nuevos documentos (Storno, Berichtigung, Gutschrift). El refund_status de la nota de crédito impulsa la interfaz: requested → «Reembolso en progreso, esperado en 3–5 días hábiles»; failed → «Reembolso fallido» con opciones de reintento / manual; succeeded / manual → «Reembolso completado el [fecha]».

Why this works this way

El flujo de reembolso está arraigado en process_amendment_signed (backend/apps/proposals/amendment_postsign.py). En el momento de la firma, la función comprueba amendment.triggers_refund. Si es verdadero, calcula refund_gross = deposit_paid − revised_total (mínimo cero) y:

1. Crea una DepositInvoiceCorrection (Berichtigung der Anzahlungsrechnung) con correction_type=partial_refund o full_cancellation. 2. Crea una CreditNote (Gutschrift) con refund_status=pending, los importes bruto/neto/IVA divididos mediante _split_refund_vat, y referencias a la factura de anticipo original (número + fecha) según el Art. 219 de la Directiva del IVA de la UE. 3. Llama a _trigger_stripe_refund para intentar la parte monetaria a través de la API de Stripe en la cuenta conectada del autónomo.

Dos «disparadores» diferentes producen un reembolso:

DisparadorRamaDocumentos creadosParte monetaria
Enmienda con revised_total < deposit_paid, anticipo original pagado vía StripeΔ_REEMBOLSO parcial O totalStorno + Berichtigung + Gutschrift (+ FinalInvoice cancelada en total)Reembolso de Stripe (artículo 8.2)
Enmienda con revised_total < deposit_paid, anticipo original pagado vía SEPA / fuera de plataformaΔ_REEMBOLSO parcial O totalMismos documentosSEPA manual (artículo 8.3 + 8.9)

No existe una ruta de «reembolso del pago final» porque el pago final no es un anticipo — una vez en Pagada, el contrato está liquidado. Para reembolsar parcialmente un contrato pagado, cree una enmienda que reduzca el alcance (Δ−), fírmela; la propuesta vuelve a Esperando pago final con un saldo menor, y cualquier importe cobrado en exceso se gestiona a través del pipeline post-firma como un Δ_REEMBOLSO. La enmienda es siempre la puerta de entrada.

Nota: a partir del 2026-05-07, la eliminación directa de una propuesta in_work también está prohibida — el backend rechaza DELETE con HTTP 409 in_work_requires_amendment. El aviso rojo de «Reembolso total» del asistente de enmiendas (Paso 1) es el único camino de interfaz para reembolsar un anticipo pagado; al hacer clic, establece la cantidad de todas las líneas en 0, el asistente muestra la rama Δ_REEMBOLSO total, y al firmar el cliente se ejecuta el pipeline de este artículo (según [D-125]).

Troubleshooting

Keep reading