> ## Documentation Index
> Fetch the complete documentation index at: https://a3erpapi.appcloud.es/llms.txt
> Use this file to discover all available pages before exploring further.

# Movimientos de stock: crea y consulta entradas y salidas

> Registra entradas y salidas de stock, consulta el histórico de movimientos y elimínalos por identificador o línea con la API de movimientos de A3ERP.

Los endpoints de movimientos de stock te permiten registrar cualquier variación de inventario —entradas, salidas o transferencias entre almacenes— y consultar el histórico completo de movimientos generados en A3ERP. Con esta API puedes integrar procesos de recepción de mercancía, ajustes de inventario y expediciones directamente desde tus aplicaciones.

<Note>
  Los campos de código como `codalm` y `codart` están siempre cuadrados (rellenados con espacios) a una longitud fija: `codalm` a **8 caracteres** y `codart` a **15 caracteres**. Ten esto en cuenta al comparar o mostrar estos valores en tu integración.
</Note>

***

## GET — Consultar movimientos de stock

```http theme={null}
GET https://servidor:<puerto>/api/movimientosstock/{id}
```

Devuelve los datos del movimiento de stock indicado. El parámetro `{id}` es **opcional**: si lo omites, obtendrás todos los movimientos registrados (en ese caso puedes aplicar filtrado y ordenación).

**Ejemplo con identificador:**

```
https://servidor:5555/api/movimientosstock/25
```

**Cabecera requerida**

| Cabecera        | Valor                |
| --------------- | -------------------- |
| `Authorization` | `Bearer <JWT_token>` |

**Parámetros de ruta**

<ParamField path="id" type="string">
  El identificador del movimiento de stock. Opcional: omítelo para obtener todos los movimientos.
</ParamField>

**Campos de la respuesta**

<ResponseField name="codart" type="string">
  Código del artículo cuadrado a **15 caracteres**.
</ResponseField>

<ResponseField name="descart" type="string">
  Descripción del artículo.
</ResponseField>

<ResponseField name="codalm" type="string">
  Código del almacén de destino cuadrado a **8 caracteres**.
</ResponseField>

<ResponseField name="descalm" type="string">
  Descripción del almacén de destino.
</ResponseField>

<ResponseField name="unicalstock" type="number">
  Unidades de stock en la unidad de cálculo alternativa.
</ResponseField>

<ResponseField name="entranstock" type="integer">
  Unidades de stock que entran en el almacén (positivo indica entrada).
</ResponseField>

<ResponseField name="entran" type="integer">
  Unidades comerciales que entran en el almacén.
</ResponseField>

<ResponseField name="salenstock" type="integer">
  Unidades de stock que salen del almacén.
</ResponseField>

<ResponseField name="salen" type="integer">
  Unidades comerciales que salen del almacén.
</ResponseField>

<ResponseField name="prcmoneda" type="number">
  Precio en la moneda del documento.
</ResponseField>

<ResponseField name="precio" type="number">
  Precio en la moneda base de la empresa.
</ResponseField>

<ResponseField name="desc1" type="number">
  Primer descuento aplicado (porcentaje).
</ResponseField>

<ResponseField name="desc2" type="number">
  Segundo descuento aplicado (porcentaje).
</ResponseField>

<ResponseField name="desc3" type="number">
  Tercer descuento aplicado (porcentaje).
</ResponseField>

<ResponseField name="desc4" type="number">
  Cuarto descuento aplicado (porcentaje).
</ResponseField>

<ResponseField name="prcmedio" type="number">
  Precio medio del artículo en el momento del movimiento.
</ResponseField>

<ResponseField name="numserie" type="string">
  Número de serie asociado al movimiento. Cadena vacía si no aplica.
</ResponseField>

<ResponseField name="lote" type="string">
  Número de lote asociado al movimiento. Cadena vacía si no aplica.
</ResponseField>

<ResponseField name="feccaduc" type="string">
  Fecha de caducidad del lote en formato ISO 8601.
</ResponseField>

<ResponseField name="ubicacion" type="string">
  Ubicación física del artículo en el almacén de destino. Puede ser `null`.
</ResponseField>

<ResponseField name="fecdoc" type="string">
  Fecha del documento que originó el movimiento, en formato ISO 8601.
</ResponseField>

<ResponseField name="numdoc" type="string">
  Número de documento asociado al movimiento.
</ResponseField>

<ResponseField name="referencia" type="string">
  Referencia externa del movimiento.
</ResponseField>

<ResponseField name="codmon" type="string">
  Código de la moneda del documento (p. ej. `EURO`).
</ResponseField>

<ResponseField name="cambio" type="number">
  Tipo de cambio aplicado respecto a la moneda base.
</ResponseField>

<ResponseField name="codigo" type="string">
  Código del tercero (cliente o proveedor) cuadrado a **8 caracteres**.
</ResponseField>

<ResponseField name="nombre" type="string">
  Nombre o razón social del tercero asociado al movimiento.
</ResponseField>

<ResponseField name="tipdoc" type="string">
  Tipo de documento que originó el movimiento (p. ej. `FC` para factura de compra).
</ResponseField>

<ResponseField name="identificador" type="integer">
  Identificador único del movimiento de stock en la base de datos.
</ResponseField>

<ResponseField name="idlin" type="integer">
  Identificador único de la línea del movimiento.
</ResponseField>

<ResponseField name="idtot" type="integer">
  Identificador del totalizador del documento.
</ResponseField>

**Ejemplo de respuesta**

```json theme={null}
{
  "codart": "              1",
  "descart": "Bicicleta carrera",
  "codalm": "       1",
  "descalm": "Productos acabados (central)",
  "unicalstock": 0,
  "entranstock": 500,
  "entran": 500,
  "salenstock": 0,
  "salen": 0,
  "prcmoneda": 612.25,
  "precio": 612.25,
  "desc1": 30,
  "desc2": 0,
  "desc3": 0,
  "desc4": 0,
  "prcmedio": 428.575,
  "numserie": "",
  "lote": "",
  "feccaduc": "1899-12-30T00:00:00.000+01:00",
  "ubicacion": "text",
  "fecdoc": "2017-01-01T00:00:00.000+01:00",
  "numdoc": "1//1",
  "referencia": "",
  "codmon": "EURO",
  "cambio": 1,
  "codigo": "       1",
  "nombre": "PROSPORTS",
  "tipdoc": "FC",
  "identificador": 21439,
  "idlin": 207266,
  "idtot": 89505
}
```

***

## POST — Crear un movimiento de stock

```http theme={null}
POST https://servidor:<puerto>/api/movimientosstock
```

Crea un nuevo movimiento de stock. El cuerpo de la petición debe incluir un objeto `json` con el almacén, la fecha y un array de líneas con los artículos afectados.

**Cabecera requerida**

| Cabecera        | Valor                |
| --------------- | -------------------- |
| `Authorization` | `Bearer <JWT_token>` |
| `Content-Type`  | `application/json`   |

**Cuerpo de la petición**

```json theme={null}
{
  "json": {
    "codalm": " 1",
    "fecdoc": "01/01/2022",
    "lineas": [
      {
        "codart": "1",
        "motivo": "ENTRADA STOCK PRUEBA API",
        "unidadesstock": "5",
        "unidades": "5"
      },
      {
        "codart": "2",
        "motivo": "SALIDA STOCK PRUEBA API",
        "unidadesstock": "-10",
        "unidades": "-10"
      }
    ]
  }
}
```

**Descripción de los campos del cuerpo**

<ParamField body="json.codalm" type="string" required>
  Código del almacén en el que se registra el movimiento.
</ParamField>

<ParamField body="json.fecdoc" type="string" required>
  Fecha del movimiento en formato `DD/MM/YYYY`.
</ParamField>

<ParamField body="json.lineas" type="array" required>
  Array de líneas del movimiento. Cada línea representa un artículo afectado.
</ParamField>

<ParamField body="json.lineas[].codart" type="string" required>
  Código del artículo que entra o sale.
</ParamField>

<ParamField body="json.lineas[].motivo" type="string" required>
  Descripción o motivo del movimiento (aparece en el histórico).
</ParamField>

<ParamField body="json.lineas[].unidadesstock" type="string" required>
  Unidades de stock a mover. Usa un valor **positivo** para entradas y **negativo** para salidas.
</ParamField>

<ParamField body="json.lineas[].unidades" type="string" required>
  Unidades comerciales a mover. Usa el mismo signo que `unidadesstock`.
</ParamField>

**Respuesta**

```json theme={null}
{
  "Codigo": 1
}
```

<ResponseField name="Codigo" type="integer">
  Identificador del movimiento de stock recién creado. Guárdalo si necesitas modificar o eliminar el movimiento posteriormente.
</ResponseField>

***

## DELETE — Eliminar un movimiento de stock

### Eliminar todos los registros de un movimiento

```http theme={null}
DELETE https://servidor:<puerto>/api/movimientosstock/eliminar/{id}
```

Elimina por completo el movimiento de stock indicado, incluyendo todas sus líneas.

**Ejemplo:**

```
https://servidor:5555/api/movimientosstock/eliminar/25
```

**Parámetros de ruta**

<ParamField path="id" type="string" required>
  El identificador del movimiento de stock que quieres eliminar por completo.
</ParamField>

***

### Eliminar una línea concreta de un movimiento

```http theme={null}
DELETE https://servidor:<puerto>/api/movimientosstock/eliminar/{id}/linea/{idlinea}
```

Elimina únicamente la línea indicada dentro del movimiento, manteniendo el resto de líneas intactas.

**Ejemplo:**

```
https://servidor:5555/api/movimientosstock/eliminar/50/linea/4
```

**Parámetros de ruta**

<ParamField path="id" type="string" required>
  El identificador del movimiento de stock que contiene la línea a eliminar.
</ParamField>

<ParamField path="idlinea" type="string" required>
  El identificador de la línea concreta dentro del movimiento que quieres eliminar.
</ParamField>
