# Códigos, precios y datos del catálogo

Define un mapeo estable y conserva los campos que tu proveedor no conoce.

Página: https://zoydelivery.com/docs/catalogo

## El código identifica el producto

code es opcional; cuando existe es texto de 1–80 caracteres. Nunca se genera. Conserva ceros y mayúsculas del proveedor. connectionId delimita los códigos por sistema y target:{productId,variantId} vincula explícitamente una fila a una combinación. Sin código ni destino se crea un producto nuevo; el nombre no confirma identidad.

Cada fila envía changes con los campos que desea modificar. Omitir un campo conserva su valor. Un producto ausente de un lote parcial se conserva; archived: true es una decisión explícita.

| Campo | Cómo mapearlo |
| --- | --- |
| code | SKU estable del proveedor, como 00012. |
| name / category / description | Nombre, grupo y descripción. No deduzcas recetas completas de una descripción. |
| price / cost | Enteros en centavos de la moneda del negocio. Costo desconocido se omite; cero significa conocido. |
| variants / variantPrices / variantCosts | Nombres exactos de presentaciones y tablas de precios/costos por nombre. |
| ingredients / ingredientCodes | Ingredientes conocidos y sus códigos. No conviertas una imagen en evidencia de alérgenos. |
| inventoryMode / stock | stock para conteo físico; made_to_order con stock positivo para disponibilidad por encargo. |
| archived | true oculta el producto; false lo restaura. No equivale a eliminarlo. |

## Moneda y centavos antes de sincronizar

catalog_schema devuelve money.currency, unit y scale. Actualmente el contrato admite USD o EUR con escala 100: 1250 representa 12,50, no 1.250 unidades. Convierte decimales con cuidado en tu adaptador y no cambies la etiqueta de moneda para omitir una conversión.

> **Conserva la moneda del documento**
>
> La extracción congela sourceDocument.currency. Copia el objeto completo al preview. Si el negocio cambió de moneda, el servidor responde 409; vuelve a revisar o convierte la fuente explícitamente.

## Ejemplo sintético: producto con dos presentaciones

### Argumentos de catalog_preview

```json
{
  "source": "Export autorizado del POS",
  "rows": [
    {
      "code": "00012",
      "changes": {
        "name": "Plato de ejemplo",
        "category": "Platos",
        "variants": [
          "Individual",
          "Familiar"
        ],
        "price": 1250,
        "variantPrices": {
          "Individual": 1250,
          "Familiar": 2200
        },
        "inventoryMode": "made_to_order",
        "stock": 1
      }
    }
  ]
}
```

Comprueba errors y el after completo: el servidor aplica valores predeterminados y normaliza el precio base de las variantes. Los costos ausentes siguen desconocidos. Si pasas de varios precios a uno, variants y variantPrices deben reflejar la presentación nueva; variantPrices: null limpia la tabla anterior.

No todos los campos aceptan null. Consulta el JSON schema de product patches incluido en catalog_schema; null se utiliza solo donde el contrato declara que permite limpiar un valor.

## Decide qué se puede vender

Los productos nuevos por API/MCP quedan sin disponibilidad por defecto. Para abrir venta por encargo, envía explícitamente inventoryMode: made_to_order y stock: 1. Ese uno habilita venta; no afirma una existencia física de una unidad.

La web ofrece un default editable para habilitar productos nuevos por encargo. Una importación parcial sobre un producto existente conserva su inventario si no envía esos campos. Revisa siempre el after antes de publicar.

- [Preparar un PDF o una hoja](https://zoydelivery.com/docs/importar-documentos)
- [Aplicar un lote por REST](https://zoydelivery.com/docs/api-rest)
