Saber si un pedido se puede modificar desde la API: GET /Order/editable

Antes de modificar un pedido de venta por la API o desde un frontend propio, este endpoint te dice qué se puede tocar y por qué no: si se pueden añadir líneas, si se pueden cambiar la dirección y el transporte, si se puede anular y, para cada línea, si se puede modificar o borrar y hasta qué cantidad se puede bajar. Cada "no" va con un código estable y un mensaje en castellano para enseñárselo al usuario.

Reúne en una sola llamada las comprobaciones que en el ERP están repartidas entre la ficha del pedido, el gestor de líneas, la anulación y la regeneración de facturas, y añade dos que las pantallas todavía no hacen (líneas en un picking abierto y líneas que un operario está autopreparando).

Importante: el endpoint informa, no bloquea. Los guardados por la API (PUT de /Order y de /OrdersArticle) no lo consultan: es quien llama el que tiene que preguntar antes de guardar.

Cómo se llama

GET /Order/editable/json/{id}
GET /Order/editable/{id}        (sin formato, responde en JSON)
  • {id}: el id del pedido.
  • Autenticación: la misma que el resto de la API (usuario y contraseña, token o ticket SSO). Ver API de Yunbit (hay que iniciar sesión en la wiki).
  • Respuestas: 200 con status: "OK" y el resultado en data; 404 con status: "ERR" si el pedido no existe; 500 con status: "ERR" y el error si falla la consulta.

Ejemplos de respuesta

Pedido en proceso con una factura emitida

Admite líneas y cambios de transporte, pero no se puede anular. La primera línea está libre; la segunda tiene 4 unidades servidas y 2 preparadas (no baja de 4 y no se borra); la tercera está en un picking abierto.

{
  "status": "OK",
  "data": {
    "order": {
      "id": "cw6a1f0c2b3d4e5",
      "orderNumber": "PV-2026-0153",
      "status": "3",
      "editable": true,
      "linesInsertable": true,
      "shippingEditable": true,
      "cancelable": false,
      "alwaysEditableFields": ["showInTemplate", "showInDeliveryNote"],
      "reasons": [
        { "scope": "cancel", "code": "INVOICE_ISSUED",
          "message": "El pedido tiene alguna factura emitida, cobrada o en proceso de cobro." }
      ]
    },
    "lines": [
      { "id": "cw6a1f0c2b3d4f1", "pos": 1, "quantity": 10,
        "servedQuantity": 0, "preparedQuantity": 0, "invoicedQuantity": 0, "minQuantity": 0,
        "editable": true, "deletable": true, "reasons": [] },
      { "id": "cw6a1f0c2b3d4f2", "pos": 2, "quantity": 10,
        "servedQuantity": 4, "preparedQuantity": 2, "invoicedQuantity": 0, "minQuantity": 4,
        "editable": true, "deletable": false,
        "reasons": [
          { "scope": "line", "code": "PREPARED",
            "message": "La línea tiene unidades preparadas o validadas (2): no se puede bajar de ahí y, para borrarla, hay que desvalidarlas antes." },
          { "scope": "line", "code": "SERVED",
            "message": "Ya se han servido 4 unidades de la línea: la cantidad no puede bajar de ahí." }
        ] },
      { "id": "cw6a1f0c2b3d4f3", "pos": 3, "quantity": 5,
        "servedQuantity": 0, "preparedQuantity": 0, "invoicedQuantity": 0, "minQuantity": 0,
        "editable": false, "deletable": false,
        "reasons": [
          { "scope": "line", "code": "IN_OPEN_PICKING",
            "message": "La línea está en un picking abierto: no se puede cambiar hasta que ese picking termine o la saque." }
        ] }
    ]
  }
}

Cada false lleva su motivo. Siempre que editable, shippingEditable o cancelable del pedido, o editable o deletable de una línea, valen false, en su reasons hay al menos un motivo que lo explica. Un pedido o una línea sin ninguna restricción devuelve reasons vacío. Los motivos del pedido se distinguen por scope: filtra por cancel para explicar por qué no se puede anular, por shipping para el transporte, etc.

Pedido enviado: todo cerrado

Pedido Enviado (7), de un tipo que no permite anular y con un paquete ya enviado. No admite cambios en las líneas ni en el transporte, y no se puede anular por tres motivos a la vez. Su única línea, además de estar en un pedido cerrado, está servida entera. Aun así, en sus líneas se pueden seguir cambiando los campos de alwaysEditableFields.

{
  "status": "OK",
  "data": {
    "order": {
      "id": "cw6a1f0c2b3d5a0",
      "orderNumber": "PV-2026-0154",
      "status": "7",
      "editable": false,
      "linesInsertable": false,
      "shippingEditable": false,
      "cancelable": false,
      "alwaysEditableFields": ["showInTemplate", "showInDeliveryNote"],
      "reasons": [
        { "scope": "lines", "code": "ORDER_CLOSED",
          "message": "El pedido está en un estado (7) que no admite cambios en sus líneas." },
        { "scope": "shipping", "code": "SHIPPING_CLOSED",
          "message": "Con el pedido en este estado (7) ya no se pueden cambiar la dirección ni el transporte." },
        { "scope": "cancel", "code": "CANCEL_STATUS",
          "message": "Un pedido en este estado (7) no se puede anular." },
        { "scope": "cancel", "code": "CANCEL_TYPE",
          "message": "El tipo de pedido no permite anularlo." },
        { "scope": "cancel", "code": "PACKAGES_SENT",
          "message": "Ya se ha enviado algún paquete del pedido: para recuperar la mercancía hay que darlo por entregado y hacer una RMA." }
      ]
    },
    "lines": [
      { "id": "cw6a1f0c2b3d5a1", "pos": 1, "quantity": 1,
        "servedQuantity": 1, "preparedQuantity": 0, "invoicedQuantity": 0, "minQuantity": 1,
        "editable": false, "deletable": false,
        "reasons": [
          { "scope": "line", "code": "ORDER_CLOSED",
            "message": "El pedido está en un estado (7) que no admite cambios en sus líneas." },
          { "scope": "line", "code": "SERVED",
            "message": "La línea está servida entera: no se puede borrar ni bajar la cantidad." }
        ] }
    ]
  }
}

Pedido en proceso con líneas facturadas

El pedido admite cambios, pero no se puede anular porque tiene una factura conciliada y otra emitida. La primera línea está facturada entera: no se toca. La segunda tiene 3 de sus 8 unidades facturadas: se puede cambiar, pero no bajar de 3 ni borrar. La tercera solo está en una factura rectificativa, que no cuenta para la línea: está libre.

{
  "status": "OK",
  "data": {
    "order": {
      "id": "cw6a1f0c2b3d6b0",
      "orderNumber": "PV-2026-0155",
      "status": "3",
      "editable": true,
      "linesInsertable": true,
      "shippingEditable": true,
      "cancelable": false,
      "alwaysEditableFields": ["showInTemplate", "showInDeliveryNote"],
      "reasons": [
        { "scope": "cancel", "code": "INVOICE_CONCILIATED",
          "message": "El pedido tiene alguna factura conciliada." },
        { "scope": "cancel", "code": "INVOICE_ISSUED",
          "message": "El pedido tiene alguna factura emitida, cobrada o en proceso de cobro." }
      ]
    },
    "lines": [
      { "id": "cw6a1f0c2b3d6b1", "pos": 1, "quantity": 5,
        "servedQuantity": 0, "preparedQuantity": 0, "invoicedQuantity": 5, "minQuantity": 5,
        "editable": false, "deletable": false,
        "reasons": [
          { "scope": "line", "code": "INVOICED",
            "message": "La línea está facturada entera (5 unidades) en facturas que ya no son borrador." }
        ] },
      { "id": "cw6a1f0c2b3d6b2", "pos": 2, "quantity": 8,
        "servedQuantity": 0, "preparedQuantity": 0, "invoicedQuantity": 3, "minQuantity": 3,
        "editable": true, "deletable": false,
        "reasons": [
          { "scope": "line", "code": "INVOICED",
            "message": "Hay 3 unidades de la línea en facturas que ya no son borrador: no se puede bajar de ahí ni borrarla." }
        ] },
      { "id": "cw6a1f0c2b3d6b3", "pos": 3, "quantity": 5,
        "servedQuantity": 0, "preparedQuantity": 0, "invoicedQuantity": 0, "minQuantity": 0,
        "editable": true, "deletable": true, "reasons": [] }
    ]
  }
}

Pedido entregado parcial

Entregado parcial (C) es un estado en el que las líneas todavía admiten cambios, pero ya no se pueden cambiar la dirección ni el transporte, ni anular. Por eso editable vale true y los otros dos false, cada uno con su motivo.

{
  "status": "OK",
  "data": {
    "order": {
      "id": "cw6a1f0c2b3d7c0",
      "orderNumber": "PV-2026-0156",
      "status": "C",
      "editable": true,
      "linesInsertable": true,
      "shippingEditable": false,
      "cancelable": false,
      "alwaysEditableFields": ["showInTemplate", "showInDeliveryNote"],
      "reasons": [
        { "scope": "shipping", "code": "SHIPPING_CLOSED",
          "message": "Con el pedido en este estado (C) ya no se pueden cambiar la dirección ni el transporte." },
        { "scope": "cancel", "code": "CANCEL_STATUS",
          "message": "Un pedido en este estado (C) no se puede anular." }
      ]
    },
    "lines": [ ... ]
  }
}

Pedido que no existe

Responde con código HTTP 404:

{
  "status": "ERR",
  "error": "El pedido no existe"
}

Qué devuelve del pedido

  • status: el estado del pedido, con su código (ver Estados del pedido).
  • editable y linesInsertable: el pedido admite cambios en sus líneas y se le pueden añadir líneas nuevas. Depende solo del estado (ver más abajo).
  • shippingEditable: se pueden cambiar la dirección de entrega, la de origen y los datos de transporte.
  • cancelable: se puede anular.
  • alwaysEditableFields: campos de las líneas que se pueden cambiar siempre, aunque el pedido esté cerrado: Mostrar en pedido (showInTemplate) y Mostrar en el albarán (showInDeliveryNote). Solo deciden qué se imprime.
  • reasons: los motivos de cada "no", con scope (a qué afectan: lines, shipping o cancel), code y message.

Qué devuelve de cada línea

  • editable: se pueden cambiar sus datos (cantidad, precio, descuentos…), respetando minQuantity.
  • deletable: se puede borrar.
  • servedQuantity, preparedQuantity e invoicedQuantity: unidades ya servidas, preparadas o validadas, y facturadas en facturas que ya no se pueden rehacer.
  • minQuantity: la cantidad mínima a la que se puede bajar la línea: la mayor de las tres anteriores.
  • reasons: los motivos, con scope: "line".

Las reglas, una a una

Estado del pedido

  • Líneas (ORDER_CLOSED): admiten cambios en Pendiente de pago (0), Pagado (1), En proceso (3), Pendiente de mercancía (4), En preparación (5), En proceso con incidencias (B), Entregado parcial (C) y En desarrollo (D). En el resto no se añaden, modifican ni borran. Es exactamente la misma regla que aplica la ficha del pedido: si cambia allí, cambia aquí.
  • Dirección y transporte (SHIPPING_CLOSED): solo en Pendiente de pago, Pagado, En proceso, Pendiente de mercancía y En desarrollo.

Anulación

  • CANCEL_STATUS: solo se anula en Pendiente de pago, Pagado, En proceso, Pendiente de mercancía, En preparación, Preparado, En proceso con incidencias y En desarrollo.
  • CANCEL_TYPE: el tipo de pedido no permite anularlo (opción «¿Se puede anular el pedido?» del tipo de pedido).
  • INVOICE_CONCILIATED: alguna factura del pedido está conciliada con movimientos bancarios.
  • INVOICE_ISSUED: alguna factura o recibo del pedido está en Emitir, Emitida, Reclamar cobro, Cobrada o En proceso de cobro.
  • INVOICE_NOT_PREINVOICE: solo en plataformas que trabajan con prefacturas; alguna factura del pedido ya no es prefactura.
  • PACKAGES_SENT: ya se ha enviado algún paquete del pedido. Para recuperar la mercancía hay que darlo por entregado y hacer una RMA.

Líneas

  • SERVED: la cantidad no baja de lo ya servido. Servida entera, la línea no se borra.
  • PREPARED: la cantidad no baja de lo preparado. Con cualquier unidad preparada o validada, la línea no se borra: hay que desvalidarla antes.
  • INVOICED: las unidades que están en facturas que ya no se pueden rehacer no se quitan, y la línea no se borra. Si está facturada entera, no se modifica. Cuenta una factura que no está en borrador, que tiene algún recibo emitido o cobrado, que está conciliada o, con prefacturas, que ya no es prefactura. Lo que está en un borrador no cuenta, porque el borrador se rehace al cambiar la línea. Las rectificativas tampoco cuentan para la línea.
  • IN_OPEN_PICKING: la línea está en un picking abierto; no se modifica ni se borra hasta que el picking termine o la saque.
  • BEING_AUTOPREPARED: un operario está autopreparando la línea en ese momento.

Diferencias con las pantallas del ERP

  • Las reglas de picking abierto y autopreparación solo están en el endpoint: el gestor de líneas del pedido todavía no las comprueba (en los traspasos de stock sí existen).
  • Las facturas cuentan para cualquier tipo de pedido. En el ERP el control de facturas al cambiar una línea solo actúa en los tipos que generan la factura con el pedido.
  • Una factura emitida sin recibos también impide anular. Al anular desde el ERP solo se mira la factura si tiene algún recibo.
  • Desde la pantalla, el personal de Yunbit puede anular pedidos de un tipo no anulable. El endpoint no hace esa excepción: devuelve CANCEL_TYPE igual.
  • El endpoint no mira los permisos del usuario sobre las pantallas de pedidos: dice qué permite el pedido, no qué puede hacer cada usuario.

Artículos relacionados

Artículo perteneciente a la/s categoría/s: Fecha de publicación: 14 de octubre del 2026, 14:45h
« Volver atrás Sugerencias Imprimir

    Sugerencias

    Envíenos sus sugerencias para esta sección, ya sean mejoras en su funcionalidad, usabilidad o contenido. Valoraremos su opinión y comentarios e intentaremos mejorar en la medida de lo posible. Gracias por utilizar nuestros servicios.

    Nota: Todos los campos son obligatorios.

    Información básica sobre protección de datos

    La entidad responsable del tratamiento es YUNBIT, S.L. La finalidad para la cual se recaban los datos es recabar información para mejorar esta wiki. La legitimación para captar la información es el propio consentimiento del interesado al enviar la sugerencia. Los datos no serán cedidos a terceros, salvo obligación legal. Los usuarios disponen del derecho a acceder, rectificar y suprimir los datos, así como otros derechos, como se explica en la información adicional. Puede consultar la información adicional y detallada sobre Protección de Datos aquí: Política de privacidad

    Out1