# Cuentas por cobrar

> Sepa qué facturas ya le pagaron, cuáles van en parcialidades y cuánto le debe cada cliente, y entérese de cada pago por webhook.

Cada factura de ingreso dice si ya se cobró. Fiscalisto lo lleva con lo que ya timbra: los [complementos de pago](https://fiscalisto.com/docs/api/pagos-y-notas-de-credito), las notas de crédito y, en la app, los depósitos conciliados del banco. Usted no guarda saldos.

## En cada factura

| Campo | Qué es |
| --- | --- |
| `payment_status` | `paid`, `partial` (pagos o notas por una parte) o `unpaid`. `null` si no es de ingreso o no está vigente. |
| `amount_due` | Lo que falta por cobrar, en la moneda de la factura. |
| `amount_paid` | Lo cobrado: complementos de pago y notas de crédito vigentes. |

Una factura **PPD** empieza `unpaid` y baja con cada complemento de pago; si se cancela un complemento, su saldo vuelve. Una **PUE** está pagada desde que se timbra, salvo que la timbre con `"paid_later": true` (el cliente le paga este mes): queda `unpaid` hasta que la marque pagada.

```bash tab="cURL"
curl -X POST https://api.fiscalisto.com/v1/invoices/inv_OufpKqnrvx9p6hW1yQbT3mZr8sKdLx0VeN/mark_paid \
  -H "Authorization: Bearer $FISCALISTO_API_KEY"
```

```ts tab="TypeScript"
import { Fiscalisto } from "fiscalisto";

// La llave viene de FISCALISTO_API_KEY.
const fiscalisto = new Fiscalisto();

const invoice = await fiscalisto.invoices.markPaid("inv_OufpKqnrvx9p6hW1yQbT3mZr8sKdLx0VeN");
```

```python tab="Python"
from fiscalisto import Fiscalisto

# La llave viene de FISCALISTO_API_KEY.
fiscalisto = Fiscalisto()

invoice = fiscalisto.invoices.mark_paid("inv_OufpKqnrvx9p6hW1yQbT3mZr8sKdLx0VeN")
```

```php tab="PHP"
<?php

use Fiscalisto\Fiscalisto;

// La llave viene de FISCALISTO_API_KEY.
$fiscalisto = new Fiscalisto();

$invoice = $fiscalisto->invoices->markPaid('inv_OufpKqnrvx9p6hW1yQbT3mZr8sKdLx0VeN');
```

```go tab="Go"
package main

import (
	"context"
	"fmt"
	"log"

	fiscalisto "fiscalisto.com/go"
)

func main() {
	// La llave viene de FISCALISTO_API_KEY.
	client, err := fiscalisto.NewClient("")
	if err != nil {
		log.Fatal(err)
	}
	ctx := context.Background()

	invoice, err := client.Invoices.MarkPaid(ctx, "inv_OufpKqnrvx9p6hW1yQbT3mZr8sKdLx0VeN")
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(invoice.ID)
}
```

```java tab="Java"
import com.fiscalisto.FiscalistoClient;

// La llave viene de FISCALISTO_API_KEY.
var fiscalisto = new FiscalistoClient();

var invoice = fiscalisto.invoices().markPaid("inv_OufpKqnrvx9p6hW1yQbT3mZr8sKdLx0VeN");
System.out.println(invoice.getId());
```

```csharp tab="C#"
using Fiscalisto;

// La llave viene de FISCALISTO_API_KEY.
var fiscalisto = new FiscalistoClient();

var invoice = await fiscalisto.Invoices.MarkPaidAsync("inv_OufpKqnrvx9p6hW1yQbT3mZr8sKdLx0VeN");
```

`POST /v1/invoices/{id}/mark_unpaid` hace lo contrario con una PUE ya timbrada. Si el mes termina y una PUE sigue sin pagarse, la ley pide sustituirla por una PPD (regla 2.7.1.39 de la RMF). Una PPD no se marca: se paga con su complemento (`400 invoice_not_markable`).

## Lo que le deben

```bash tab="cURL"
curl https://api.fiscalisto.com/v1/receivables \
  -H "Authorization: Bearer $FISCALISTO_API_KEY"
```

```ts tab="TypeScript"
import { Fiscalisto } from "fiscalisto";

// La llave viene de FISCALISTO_API_KEY.
const fiscalisto = new Fiscalisto();

for await (const item of fiscalisto.receivables.list()) {
  console.log(item.id);
}
```

```python tab="Python"
from fiscalisto import Fiscalisto

# La llave viene de FISCALISTO_API_KEY.
fiscalisto = Fiscalisto()

for item in fiscalisto.receivables.list():
    print(item["id"])
```

```php tab="PHP"
<?php

use Fiscalisto\Fiscalisto;

// La llave viene de FISCALISTO_API_KEY.
$fiscalisto = new Fiscalisto();

foreach ($fiscalisto->receivables->list() as $item) {
    echo $item['id'], "\n";
}
```

```go tab="Go"
package main

import (
	"context"
	"fmt"
	"log"

	fiscalisto "fiscalisto.com/go"
)

func main() {
	// La llave viene de FISCALISTO_API_KEY.
	client, err := fiscalisto.NewClient("")
	if err != nil {
		log.Fatal(err)
	}
	ctx := context.Background()

	for item, err := range client.Receivables.ListAutoPaging(ctx, nil) {
		if err != nil {
			log.Fatal(err)
		}
		fmt.Println(item.ID)
	}
}
```

```java tab="Java"
import com.fiscalisto.FiscalistoClient;

// La llave viene de FISCALISTO_API_KEY.
var fiscalisto = new FiscalistoClient();

for (var item : fiscalisto.receivables().listAutoPaging()) {
    System.out.println(item.getId());
}
```

```csharp tab="C#"
using Fiscalisto;

// La llave viene de FISCALISTO_API_KEY.
var fiscalisto = new FiscalistoClient();

await foreach (var item in fiscalisto.Receivables.ListAutoPagingAsync())
    Console.WriteLine(item.Id);
```

Contesta lo que debe cada cliente, por moneda: `amount_due`, cuántas facturas tiene abiertas (`open_invoices`) y la fecha de la más antigua (`oldest_invoice_date`), ordenado por RFC. Con `?customer=RFC` (o su id `cus_…`), solo ese cliente. Sus facturas: `GET /v1/invoices?customer=RFC&payment_status=open` (`unpaid`, `partial`, `open` o `paid`).

## Cada pago, por webhook

| Evento | Cuándo |
| --- | --- |
| `invoice.partially_paid` | Llegó un pago por una parte de una factura PPD (un complemento de pago o una nota de crédito). |
| `invoice.paid` | Ya no debe nada: el último complemento, una nota de crédito, un depósito conciliado o `mark_paid`. |

En los dos, `data.object` es la factura con su `payment_status` y su `amount_due`. Así su sistema da de alta el pago o libera el pedido sin preguntar.

En pruebas funciona igual, con los complementos y las notas que timbre con su llave `fk_test_`.
