---
title: Reembolsos y notas de abono
section: payment
slug: refunds
description: "Gestionar reembolsos en PrestaShop: reembolso parcial, total, notas de abono, vales de descuento y integracion con pasarelas."
keywords: prestashop reembolso nota abono vale descuento refund devolucion parcial total
last_updated: 2024-12-01
source_url: "https://ayudaprestashop.es/payment/refunds"
---

# Reembolsos y notas de abono

> Gestionar reembolsos en PrestaShop: reembolso parcial, total, notas de abono, vales de descuento y integracion con pasarelas.

Los reembolsos son una parte inevitable del e-commerce. PrestaShop ofrece un sistema flexible que permite reembolsos parciales, totales, con restock automatico y generacion de notas de abono para contabilidad.

## Tipos de reembolso

| Tipo | Descripcion | Cuando usar |
| --- | --- | --- |
| Reembolso total | Devolver todo el importe del pedido | Cancelacion completa |
| Reembolso parcial | Devolver solo algunos productos o importes | Producto defectuoso, error en 1 articulo |
| Vale de descuento | Credito en tienda en lugar de dinero | Cliente prefiere credito, cambio de producto |
| Nota de abono | Documento contable de la devolucion | Siempre que haya reembolso (obligatorio fiscalmente) |

## Reembolso parcial

*Crear reembolso parcial programaticamente*

```php
<?php

// ── Desde el BO: Pedido → Detalle → "Devolucion parcial" ──
// Pero tambien se puede hacer desde un modulo:

$order = new Order($idOrder);

// ── 1. Crear nota de abono (OrderSlip) ──
$products = [];
foreach ($order->getProducts() as $product) {
    // Devolver 1 unidad del primer producto
    $products[$product['id_order_detail']] = [
        'id_order_detail' => $product['id_order_detail'],
        'quantity'        => 1,
        'unit_price'      => $product['unit_price_tax_incl'],
        'amount'          => $product['unit_price_tax_incl'] * 1,
    ];
    break; // Solo el primero como ejemplo
}

$shipping = false; // true para devolver tambien el envio
OrderSlip::create(
    $order,
    $products,
    $shipping,
    0,    // Importe de envio a devolver
    false, // Generar vale de descuento
    true   // Generar nota de abono PDF
);

// ── 2. Restock automatico ──
foreach ($products as $p) {
    StockAvailable::updateQuantity(
        $p['id_order_detail'], // En realidad necesitas id_product
        0, // id_product_attribute
        $p['quantity'], // Cantidad a reponer
        $order->id_shop
    );
}

// ── 3. Cambiar estado del pedido ──
$history = new OrderHistory();
$history->id_order = $order->id;
$history->changeIdOrderState(
    Configuration::get('PS_OS_REFUND'), // Estado: Reembolsado
    $order->id
);
```

## Notas de abono

*Notas de abono en PrestaShop*

```text
QUE ES UNA NOTA DE ABONO
- Documento fiscal que registra la devolucion
- Numero correlativo (como las facturas)
- Incluye: productos devueltos, importe, impuestos
- El cliente puede descargarla desde "Mi cuenta"

GENERAR DESDE EL BO
1. Pedido → Detalle del pedido
2. Seccion "Devolucion de productos"
3. Seleccionar productos y cantidades
4. Marcar:
   ☑ Generar nota de abono
   ☑ Generar vale de descuento (opcional)
   ☑ Reponer productos (restock)
5. Si se devuelve envio: indicar importe
6. Clic en "Devolver productos"

NUMERACION
- Pedidos → Notas de abono → Opciones
- Prefijo: #AB o #CN
- Numero siguiente: correlativo
- La numeracion es independiente de las facturas

DESCARGA
- BO: Pedidos → Notas de abono → descargar PDF
- Cliente: Mi cuenta → Notas de abono → PDF
```

## Implementar reembolso en modulo de pago

*Reembolso automatico via pasarela*

```php
<?php

// ── Hook para reembolsar automaticamente cuando se cambia a estado Reembolsado ──
public function hookActionOrderStatusPostUpdate(array $params): void
{
    $newStatus = $params['newOrderStatus'];
    $idOrder   = (int) $params['id_order'];

    if ((int) $newStatus->id !== (int) Configuration::get('PS_OS_REFUND')) {
        return;
    }

    $order = new Order($idOrder);

    // Solo si es nuestro modulo de pago
    if ($order->module !== $this->name) {
        return;
    }

    // Obtener transaction_id del pago original
    $payments = $order->getOrderPayments();
    $transactionId = $payments[0]->transaction_id ?? null;

    if (!$transactionId) {
        PrestaShopLogger::addLog('Refund failed: no transaction_id', 3);
        return;
    }

    try {
        // Llamar a la API de la pasarela para reembolsar
        $result = $this->gateway->refund([
            'transaction_id' => $transactionId,
            'amount'         => $order->total_paid_tax_incl,
            'currency'       => Currency::getIsoCodeById($order->id_currency),
        ]);

        if ($result->success) {
            // Registrar el pago negativo
            $order->addOrderPayment(
                -$order->total_paid_tax_incl,
                $this->displayName . ' Refund',
                $result->refund_id
            );
        }
    } catch (\Exception $e) {
        PrestaShopLogger::addLog('Refund error: ' . $e->getMessage(), 3);
    }
}
```


---

*Fuente: [https://ayudaprestashop.es/payment/refunds](https://ayudaprestashop.es/payment/refunds). Version Markdown generada automaticamente para consumo por LLMs.*
