# Listas de precios

> Precios distintos por cliente: listas de mayoreo, distribuidor o promociones, con escalones por cantidad y por caja, y grupos de clientes con su lista, descuento, crédito y pedido mínimo.

Una lista de precios dice cuánto paga cierto tipo de cliente. Parte del precio del catálogo (o de otra lista), lo baja o lo sube un porcentaje y lo redondea; encima, cada producto puede tener su propio precio o un descuento, por presentación (una caja de 12) y desde cierta cantidad, que son sus escalones de mayoreo. Un grupo de clientes junta a los que pagan igual: su lista, su descuento en cada concepto, sus días de crédito y su pedido mínimo. Son las mismas de **Facturas › Listas de precios** en la app.

Qué lista tiene cada cliente: la suya (`price_list` del cliente), si no la de su grupo, si no la que tiene `is_default`, y si no hay ninguna, el precio del catálogo. Una lista fuera de sus fechas (`starts_on`, `ends_on`) no cuenta. El descuento del cliente, si no el de su grupo, va como descuento de cada concepto en el CFDI.

## Crear una lista

```bash tab="cURL"
curl https://api.fiscalisto.com/v1/price_lists \
  -H "Authorization: Bearer $FISCALISTO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Mayoreo", "adjust_percent": -10, "round_to": 0.5, "items": [{ "product": "prd_OufpKqnrvx9p1", "min_quantity": 24, "unit_price": 80 }] }'
```

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

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

const { data } = await fiscalisto.priceLists.create({
  name: "Mayoreo",
  adjust_percent: -10,
  round_to: 0.5,
  items: [
    {
      product: "prd_OufpKqnrvx9p1",
      min_quantity: 24,
      unit_price: 80,
    },
  ],
});
```

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

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

data = fiscalisto.price_lists.create({
    "name": "Mayoreo",
    "adjust_percent": -10,
    "round_to": 0.5,
    "items": [
        {
            "product": "prd_OufpKqnrvx9p1",
            "min_quantity": 24,
            "unit_price": 80,
        },
    ],
})["data"]
```

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

use Fiscalisto\Fiscalisto;

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

$data = $fiscalisto->priceLists->create([
    'name' => 'Mayoreo',
    'adjust_percent' => -10,
    'round_to' => 0.5,
    'items' => [
        [
            'product' => 'prd_OufpKqnrvx9p1',
            'min_quantity' => 24,
            'unit_price' => 80,
        ],
    ],
])['data'];
```

```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()

	priceList, err := client.PriceLists.Create(ctx, &fiscalisto.CreatePriceListParams{
		Name:          "Mayoreo",
		AdjustPercent: fiscalisto.Float64(-10),
		RoundTo:       fiscalisto.Float64(0.5),
		Items: []fiscalisto.CreatePriceListParamsItem{
			{
				Product:     "prd_OufpKqnrvx9p1",
				MinQuantity: fiscalisto.Float64(24),
				UnitPrice:   fiscalisto.Float64(80),
			},
		},
	})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(priceList.ID)
}
```

```java tab="Java"
import com.fiscalisto.FiscalistoClient;
import com.fiscalisto.model.CreatePriceListParams;
import com.fiscalisto.model.CreatePriceListParamsItem;
import java.util.List;

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

var priceList = fiscalisto.priceLists().create(new CreatePriceListParams()
        .setName("Mayoreo")
        .setAdjustPercent(-10)
        .setRoundTo(0.5)
        .setItems(List.of(
                new CreatePriceListParamsItem()
                        .setProduct("prd_OufpKqnrvx9p1")
                        .setMinQuantity(24)
                        .setUnitPrice(80)
        )));
System.out.println(priceList.getId());
```

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

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

var priceList = await fiscalisto.PriceLists.CreateAsync(new CreatePriceListParams
{
    Name = "Mayoreo",
    AdjustPercent = -10,
    RoundTo = 0.5m,
    Items = new()
    {
        new()
        {
            Product = "prd_OufpKqnrvx9p1",
            MinQuantity = 24,
            UnitPrice = 80,
        },
    },
});
```

`adjust_percent` mueve el precio del que parte (−10 lo baja 10 %). Cada renglón de `items` lleva `unit_price` (su precio por unidad sin IVA) o `discount_percent` (un descuento sobre el precio de la lista), no los dos. Varios renglones del mismo producto con distinto `min_quantity` son sus escalones: «24 o más a $80», «100 o más a $75». Con `unit` (una presentación del producto, como una caja) el precio es por caja; sin precio propio de la caja, la caja vale lo que sus piezas, y 2 cajas de 12 ya alcanzan el escalón de «24 o más». Al mandar `items` en `POST /v1/price_lists/{id}` reemplaza todos los que tenía.

## Grupos de clientes

```bash tab="cURL"
curl https://api.fiscalisto.com/v1/customer_groups \
  -H "Authorization: Bearer $FISCALISTO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Mayoristas", "price_list": "prl_OufpKqnrvx9p1", "discount_percent": 3, "credit_days": 30, "min_order": 5000 }'
```

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

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

const customerGroup = await fiscalisto.customerGroups.create({
  name: "Mayoristas",
  price_list: "prl_OufpKqnrvx9p1",
  discount_percent: 3,
  credit_days: 30,
  min_order: 5000,
});
```

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

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

customer_group = fiscalisto.customer_groups.create({
    "name": "Mayoristas",
    "price_list": "prl_OufpKqnrvx9p1",
    "discount_percent": 3,
    "credit_days": 30,
    "min_order": 5000,
})
```

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

use Fiscalisto\Fiscalisto;

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

$customerGroup = $fiscalisto->customerGroups->create([
    'name' => 'Mayoristas',
    'price_list' => 'prl_OufpKqnrvx9p1',
    'discount_percent' => 3,
    'credit_days' => 30,
    'min_order' => 5000,
]);
```

```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()

	customerGroup, err := client.CustomerGroups.Create(ctx, &fiscalisto.CreateCustomerGroupParams{
		Name:            "Mayoristas",
		PriceList:       fiscalisto.String("prl_OufpKqnrvx9p1"),
		DiscountPercent: fiscalisto.Float64(3),
		CreditDays:      fiscalisto.Int64(30),
		MinOrder:        fiscalisto.Float64(5000),
	})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(customerGroup.ID)
}
```

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

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

var customerGroup = fiscalisto.customerGroups().create(new CreateCustomerGroupParams()
        .setName("Mayoristas")
        .setPriceList("prl_OufpKqnrvx9p1")
        .setDiscountPercent(3)
        .setCreditDays(30)
        .setMinOrder(5000));
System.out.println(customerGroup.getId());
```

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

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

var customerGroup = await fiscalisto.CustomerGroups.CreateAsync(new CreateCustomerGroupParams
{
    Name = "Mayoristas",
    PriceList = "prl_OufpKqnrvx9p1",
    DiscountPercent = 3,
    CreditDays = 30,
    MinOrder = 5000,
});
```

Un cliente entra a un grupo, o toma su propia lista o descuento, con `POST /v1/customers/{id}`:

```bash tab="cURL"
curl https://api.fiscalisto.com/v1/customers/cus_OufpKqnrvx9p1 \
  -H "Authorization: Bearer $FISCALISTO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "group": "cgr_OufpKqnrvx9p1" }'
```

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

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

const customer = await fiscalisto.customers.update("cus_OufpKqnrvx9p1", { group: "cgr_OufpKqnrvx9p1" });
```

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

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

customer = fiscalisto.customers.update("cus_OufpKqnrvx9p1", {"group": "cgr_OufpKqnrvx9p1"})
```

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

use Fiscalisto\Fiscalisto;

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

$customer = $fiscalisto->customers->update('cus_OufpKqnrvx9p1', ['group' => 'cgr_OufpKqnrvx9p1']);
```

```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()

	customer, err := client.Customers.Update(ctx, "cus_OufpKqnrvx9p1", &fiscalisto.UpdateCustomerParams{
		Group: fiscalisto.String("cgr_OufpKqnrvx9p1"),
	})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(customer.ID)
}
```

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

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

var customer = fiscalisto.customers().update("cus_OufpKqnrvx9p1", new UpdateCustomerParams().setGroup("cgr_OufpKqnrvx9p1"));
System.out.println(customer.getId());
```

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

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

var customer = await fiscalisto.Customers.UpdateAsync("cus_OufpKqnrvx9p1", new UpdateCustomerParams { Group = "cgr_OufpKqnrvx9p1" });
```

`price_list` y `discount_percent` del cliente ganan sobre los de su grupo; en `null` vuelve a los del grupo. `min_order` es el pedido mínimo antes de IVA para pedir desde el Portal del cliente, y `portal_ordering: false` no les deja pedir desde ahí.

## Lo que paga un cliente

```bash tab="cURL"
curl https://api.fiscalisto.com/v1/prices \
  -H "Authorization: Bearer $FISCALISTO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "customer": "cus_OufpKqnrvx9p1", "items": [{ "product": "prd_OufpKqnrvx9p1", "quantity": 10 }] }'
```

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

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

const priceQuote = await fiscalisto.prices.quote({
  customer: "cus_OufpKqnrvx9p1",
  items: [
    {
      product: "prd_OufpKqnrvx9p1",
      quantity: 10,
    },
  ],
});
```

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

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

price_quote = fiscalisto.prices.quote({
    "customer": "cus_OufpKqnrvx9p1",
    "items": [
        {
            "product": "prd_OufpKqnrvx9p1",
            "quantity": 10,
        },
    ],
})
```

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

use Fiscalisto\Fiscalisto;

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

$priceQuote = $fiscalisto->prices->quote([
    'customer' => 'cus_OufpKqnrvx9p1',
    'items' => [
        [
            'product' => 'prd_OufpKqnrvx9p1',
            'quantity' => 10,
        ],
    ],
]);
```

```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()

	priceQuote, err := client.Prices.Quote(ctx, &fiscalisto.QuotePricesParams{
		Customer: "cus_OufpKqnrvx9p1",
		Items: []fiscalisto.QuotePricesParamsItem{
			{
				Product:  "prd_OufpKqnrvx9p1",
				Quantity: fiscalisto.Float64(10),
			},
		},
	})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%+v\n", *priceQuote)
}
```

```java tab="Java"
import com.fiscalisto.FiscalistoClient;
import com.fiscalisto.model.QuotePricesParams;
import com.fiscalisto.model.QuotePricesParamsItem;
import java.util.List;

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

var priceQuote = fiscalisto.prices().quote(new QuotePricesParams()
        .setCustomer("cus_OufpKqnrvx9p1")
        .setItems(List.of(
                new QuotePricesParamsItem()
                        .setProduct("prd_OufpKqnrvx9p1")
                        .setQuantity(10)
        )));
System.out.println(priceQuote);
```

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

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

var priceQuote = await fiscalisto.Prices.QuoteAsync(new QuotePricesParams
{
    Customer = "cus_OufpKqnrvx9p1",
    Items = new()
    {
        new()
        {
            Product = "prd_OufpKqnrvx9p1",
            Quantity = 10,
        },
    },
});
```

Devuelve, por producto, su `unit_price` sin IVA a esa cantidad, el `catalog_price`, el `discount_percent` del cliente y `next_step`: desde cuántas baja y a cuánto. No guarda nada: úselo para mostrar precios en su tienda o para llenar `unit_price` y `discount` de una factura o un pedido.

## Pedidos desde el portal

Un producto con `portal_visible: true` (`POST /v1/products/{id}`) se vende en el Portal del cliente: sus clientes lo piden desde ahí a sus precios, con `min_order_qty` y `order_step` (de 12 en 12), y el pedido llega a [Pedidos](https://fiscalisto.com/docs/api/pedidos) en borrador, para que usted lo confirme.
