Referencia de la API

Solicitudes de compra

Lo que las personas piden comprar antes de que exista una orden: aprobación, control de presupuesto y luego una orden.

Más sobre este recurso

Cualquier miembro de un espacio de trabajo comprador puede pedir algo, sea cual sea su rol de compras: una solicitud no compromete dinero, y su aprobación es el control. Una solicitud enviada pasa por el flujo de aprobación de solicitudes de compra del espacio de trabajo (por defecto, el de órdenes de compra), el límite de gasto de quien la pide y, cuando los presupuestos están activos, el presupuesto de su centro de costo. Una vez aprobada, alguien que puede emitir órdenes la convierte en una orden de compra con ConvertPurchaseRequest. La orden conserva la aprobación de la solicitud cuando no supera lo aprobado y usa el mismo centro de costo y la misma cuenta contable. Las solicitudes son solo del comprador y nunca se muestran a los proveedores.

Listar solicitudes de compra

Lista las solicitudes de compra que puedes ver, de la más reciente a la más antigua.

GET/v1/workspaces/{regionId}/purchase-requests

Parámetros

  • status"draft" | "pending_approval" | "approved" | "ordered" | "rejected" | "canceled"

    Solo las solicitudes con este estado.

  • mineboolean

    true: solo las solicitudes propias de quien llama.

  • awaitingMeboolean

    true: solo las solicitudes que esperan la aprobación de quien llama, como en su cola de aprobaciones. status y mine se ignoran entonces.

Devuelve

200 OK con el objeto que se muestra en la respuesta.

Más detalles

Lista las solicitudes propias de quien llama; con acceso 'view' a las órdenes de compra, las de todos salvo los borradores de otras personas; y cualquier solicitud cuya cadena de aprobación nombre a quien llama. De la más reciente a la más antigua.

Campos de la respuesta

  • statusstring

    draft hasta que se envía; pending_approval mientras corre su cadena de aprobación; approved, y luego ordered cuando se convirtió en una orden de compra (poId); o rejected (rejectionReason) o canceled.

  • amountnumber

    El total de las líneas (qty × unitPrice), en currency.

  • approvalobject

    La cadena de aprobación, ausente mientras es un borrador. Se arma con el flujo de aprobación de solicitudes de compra del espacio de trabajo (por defecto, el de órdenes de compra), el límite de gasto de quien la pide y el control de presupuesto.

  • approvalVersionnumber

    Aumenta con cada cambio de la aprobación. Envíalo como expectedVersion al aprobar.

  • budgetCheckobject

    El control de presupuesto del centro de costo cuando los presupuestos están activos: el último, al enviarla o en la aprobación final. Las cifras están en la moneda del presupuesto.

Errores

  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
  • 403 Forbidden - El token Bearer o la clave de API del llamador no da acceso a este espacio de trabajo (regionId), o no tiene el rol requerido.
GET /v1/workspaces/{regionId}/purchase-requests
Solicitud
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/purchase-requests" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Respuesta · 200 OK
[
   {
      "id": "string",
      "title": "string",
      "description": "string",
      "requesterEmployeeKey": "string",
      "requesterName": "string",
      "costCenter": "string",
      "glCode": "string",
      "supplier": { "name": "string", "supplierConnectionId": "string", "supplierRegionId": "string" },
      "lineItems": [
         { "name": "string", "lineType": "goods" | "service", "qty": number, "unit": "string", "unitPrice": number }
      ],
      "amount": number,
      "currency": "string",
      "neededBy": "string",
      "quoteDocument": { "importId": "string", "fileName": "string", "contentType": "string", "addedAt": "string", "quoteNumber": "string", "validUntil": "string" },
      "notes": "string",
      "status": "draft" | "pending_approval" | "approved" | "ordered" | "rejected" | "canceled",
      "approval": {
         "requester": "string",
         "requesterEmployeeKey": "string",
         "groups": [
           {
             "id": "string",
             "mode": "sequential" | "parallel",
             "label": "string",
             "status": "pending" | "approved" | "rejected",
             "stages": [
               { "id": "string", "label": "string", "approverEmployeeKey": "string", "approverName": "string", "status": "pending" | "approved" | "rejected" }
             ]
           }
         ],
         "groupIndex": number,
         "status": "pending" | "approved" | "rejected",
         "history": [
           { "stage": "string", "by": "string", "at": "string", "action": "approved" | "rejected" | "limit_exceeded" | "reassigned" | "skipped" }
         ],
         "autonomy": boolean,
         "selfApproved": boolean
       },
      "approvalVersion": number,
      "budgetCheck": { "outcome": "within" | "over" | "no_budget" | "no_rate" | "off", "mode": "off" | "warn" | "block", "costCenter": "string", "currency": "string", "budget": number, "remaining": number, "amount": number, "overBy": number, "checkedAt": "string" },
      "poId": "string",
      "rejectionReason": "string",
      "createdAt": "string",
      "updatedAt": "string",
      "submittedAt": "string",
      "decidedAt": "string",
      "canceledAt": "string",
      "canceledBy": "string"
   }
]

Crear solicitud de compra

Pide algo: guarda un borrador o lo envía a aprobación.

POST/v1/workspaces/{regionId}/purchase-requests

Cuerpo

  • titlestringObligatorio

    Qué se necesita, en pocas palabras. Hasta 200 caracteres.

  • descriptionstring

    Por qué se necesita: el motivo de negocio. Hasta 4.000 caracteres. Obligatorio para enviarla.

  • costCenterstring

    El código o el nombre de un centro de costo, que se guarda como su código. Obligatorio para enviarla cuando el espacio de trabajo tiene una lista de centros de costo.

  • glCodestring

    La cuenta contable (categoría de gasto), cuando no es la del centro de costo. Hasta 40 caracteres.

  • supplierobject

    Un proveedor que sugiere quien la pide: { name, supplierConnectionId?, supplierRegionId? }. Un nombre solo no enruta nada; un proveedor aprobado de la lista del espacio de trabajo lo usan los pasos de aprobación por proveedor.

  • lineItemsArray<{ name, lineType?, qty, unit?, unitPrice }>Obligatorio

    Lo que se necesita, de 1 a 50 líneas: name (hasta 200 caracteres), qty (mayor que 0), unit (opcional, p. ej. each, hour, month), unitPrice (una estimación, 0 o más, en la moneda de la solicitud) y lineType (opcional: goods o service, se traslada a la línea de la orden; si se omite, una unidad de tiempo la convierte en servicio y cualquier otra en bienes). Una sola línea basta para una estimación.

  • currencystring

    ISO 4217. La moneda del espacio de trabajo si se omite.

  • neededBystring

    Cuándo se necesita, YYYY-MM-DD.

  • quoteImportIdstring

    Una cotización subida con la importación de cotizaciones, para adjuntar.

  • notesstring

    Lo que compras debería saber. Hasta 2.000 caracteres.

  • submitboolean

    true la envía a aprobación en el acto; si no, se guarda como borrador.

Devuelve

201 Created con el objeto que se muestra en la respuesta.

Más detalles

Crea una solicitud de compra como borrador, con quien llama como solicitante. Con submit: true se envía en el acto, como hace SubmitPurchaseRequest, y la respuesta la muestra en pending_approval, o en approved cuando la cubren la autonomía o una regla de automatización.

Cualquier miembro del espacio de trabajo comprador, sea cual sea su rol de compras.

Campos de la respuesta

  • statusstring

    draft hasta que se envía; pending_approval mientras corre su cadena de aprobación; approved, y luego ordered cuando se convirtió en una orden de compra (poId); o rejected (rejectionReason) o canceled.

  • amountnumber

    El total de las líneas (qty × unitPrice), en currency.

  • approvalobject

    La cadena de aprobación, ausente mientras es un borrador. Se arma con el flujo de aprobación de solicitudes de compra del espacio de trabajo (por defecto, el de órdenes de compra), el límite de gasto de quien la pide y el control de presupuesto.

  • approvalVersionnumber

    Aumenta con cada cambio de la aprobación. Envíalo como expectedVersion al aprobar.

  • budgetCheckobject

    El control de presupuesto del centro de costo cuando los presupuestos están activos: el último, al enviarla o en la aprobación final. Las cifras están en la moneda del presupuesto.

Errores

  • 400 Bad Request - Falta un campo o no es válido. Con submit: true, también cuando la solicitud no tiene descripción, ni un importe mayor que 0, ni un centro de costo en un espacio de trabajo que tiene una lista.
  • 409 Conflict - Código over_budget. Los presupuestos se aplican (modo bloqueo) y la solicitud dejaría su centro de costo por encima del presupuesto, o no hay tipo de cambio para controlarla. El budgetCheck del cuerpo tiene las cifras. No se guarda nada.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
  • 403 Forbidden - El token Bearer o la clave de API del llamador no da acceso a este espacio de trabajo (regionId), o no tiene el rol requerido.
POST /v1/workspaces/{regionId}/purchase-requests
Solicitud
POST /v1/workspaces/reg_01k5x8p9j3q7vn2mhb4tzc6rde.buyer/purchase-requests
{
   "title": "Monitors for the design team",
   "description": "Two new designers start on November 3.",
   "costCenter": "CC-1000",
   "lineItems": [ { "name": "27-inch monitor", "lineType": "goods", "qty": 2, "unit": "each", "unitPrice": 320 } ],
   "neededBy": "2026-11-03",
   "submit": true
}
Respuesta · 201 Created
{
   "id": "PR-3F9A1C2E",
   "title": "Monitors for the design team",
   "requesterName": "Priya Shah",
   "costCenter": "CC-1000",
   "amount": 640,
   "currency": "USD",
   "status": "pending_approval",
   "approvalVersion": 1,
   ...
}

Obtener solicitud de compra

Obtiene una solicitud de compra.

GET/v1/workspaces/{regionId}/purchase-requests/{requestId}

Parámetros

  • requestIdstringObligatorio

    La solicitud de compra, p. ej. PR-3F9A1C2E.

Devuelve

200 OK con el objeto que se muestra en la respuesta.

Más detalles

Devuelve una solicitud de compra con su cadena de aprobación, su control de presupuesto y, una vez pedida, la orden de compra en la que se convirtió (poId). La ven las mismas personas que en ListPurchaseRequests.

Campos de la respuesta

  • statusstring

    draft hasta que se envía; pending_approval mientras corre su cadena de aprobación; approved, y luego ordered cuando se convirtió en una orden de compra (poId); o rejected (rejectionReason) o canceled.

  • amountnumber

    El total de las líneas (qty × unitPrice), en currency.

  • approvalobject

    La cadena de aprobación, ausente mientras es un borrador. Se arma con el flujo de aprobación de solicitudes de compra del espacio de trabajo (por defecto, el de órdenes de compra), el límite de gasto de quien la pide y el control de presupuesto.

  • approvalVersionnumber

    Aumenta con cada cambio de la aprobación. Envíalo como expectedVersion al aprobar.

  • budgetCheckobject

    El control de presupuesto del centro de costo cuando los presupuestos están activos: el último, al enviarla o en la aprobación final. Las cifras están en la moneda del presupuesto.

Errores

  • 404 Not Found - No hay ninguna solicitud de compra con este id que quien llama pueda ver. Quien no puede ver una solicitud no se entera de si existe.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
  • 403 Forbidden - El token Bearer o la clave de API del llamador no da acceso a este espacio de trabajo (regionId), o no tiene el rol requerido.
GET /v1/workspaces/{regionId}/purchase-requests/{requestId}
Solicitud
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/purchase-requests/{requestId}" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Respuesta · 200 OK
{
   "id": "string",
   "title": "string",
   "description": "string",
   "requesterEmployeeKey": "string",
   "requesterName": "string",
   "costCenter": "string",
   "glCode": "string",
   "supplier": { "name": "string", "supplierConnectionId": "string", "supplierRegionId": "string" },
   "lineItems": [
      { "name": "string", "lineType": "goods" | "service", "qty": number, "unit": "string", "unitPrice": number }
   ],
   "amount": number,
   "currency": "string",
   "neededBy": "string",
   "quoteDocument": { "importId": "string", "fileName": "string", "contentType": "string", "addedAt": "string", "quoteNumber": "string", "validUntil": "string" },
   "notes": "string",
   "status": "draft" | "pending_approval" | "approved" | "ordered" | "rejected" | "canceled",
   "approval": {
      "requester": "string",
      "requesterEmployeeKey": "string",
      "groups": [
        {
          "id": "string",
          "mode": "sequential" | "parallel",
          "label": "string",
          "status": "pending" | "approved" | "rejected",
          "stages": [
            { "id": "string", "label": "string", "approverEmployeeKey": "string", "approverName": "string", "status": "pending" | "approved" | "rejected" }
          ]
        }
      ],
      "groupIndex": number,
      "status": "pending" | "approved" | "rejected",
      "history": [
        { "stage": "string", "by": "string", "at": "string", "action": "approved" | "rejected" | "limit_exceeded" | "reassigned" | "skipped" }
      ],
      "autonomy": boolean,
      "selfApproved": boolean
    },
   "approvalVersion": number,
   "budgetCheck": { "outcome": "within" | "over" | "no_budget" | "no_rate" | "off", "mode": "off" | "warn" | "block", "costCenter": "string", "currency": "string", "budget": number, "remaining": number, "amount": number, "overBy": number, "checkedAt": "string" },
   "poId": "string",
   "rejectionReason": "string",
   "createdAt": "string",
   "updatedAt": "string",
   "submittedAt": "string",
   "decidedAt": "string",
   "canceledAt": "string",
   "canceledBy": "string"
}

Actualizar solicitud de compra

Cambia un borrador o una solicitud que espera aprobación.

PATCH/v1/workspaces/{regionId}/purchase-requests/{requestId}

Parámetros

  • requestIdstringObligatorio

    La solicitud de compra, p. ej. PR-3F9A1C2E.

Cuerpo

  • titlestring

    Qué se necesita, en pocas palabras. Hasta 200 caracteres.

  • descriptionstring

    Por qué se necesita: el motivo de negocio. Hasta 4.000 caracteres. Obligatorio para enviarla.

  • costCenterstring

    El código o el nombre de un centro de costo, que se guarda como su código. Obligatorio para enviarla cuando el espacio de trabajo tiene una lista de centros de costo.

  • glCodestring

    La cuenta contable (categoría de gasto), cuando no es la del centro de costo. Hasta 40 caracteres.

  • supplierobject

    Un proveedor que sugiere quien la pide: { name, supplierConnectionId?, supplierRegionId? }. Un nombre solo no enruta nada; un proveedor aprobado de la lista del espacio de trabajo lo usan los pasos de aprobación por proveedor.

  • lineItemsArray<{ name, lineType?, qty, unit?, unitPrice }>

    Lo que se necesita, de 1 a 50 líneas: name (hasta 200 caracteres), qty (mayor que 0), unit (opcional, p. ej. each, hour, month), unitPrice (una estimación, 0 o más, en la moneda de la solicitud) y lineType (opcional: goods o service, se traslada a la línea de la orden; si se omite, una unidad de tiempo la convierte en servicio y cualquier otra en bienes). Una sola línea basta para una estimación.

  • currencystring

    ISO 4217. La moneda del espacio de trabajo si se omite.

  • neededBystring

    Cuándo se necesita, YYYY-MM-DD.

  • quoteImportIdstring

    Una cotización subida con la importación de cotizaciones, para adjuntar.

  • notesstring

    Lo que compras debería saber. Hasta 2.000 caracteres.

Devuelve

200 OK con el objeto que se muestra en la respuesta.

Más detalles

Quien la pidió cambia los campos enviados; el resto se mantiene. Enviar lineItems reemplaza todas las líneas. Una solicitud que espera aprobación vuelve a pasar por la aprobación desde el principio, porque sus aprobaciones eran para lo que decía antes.

Solo quien la pidió.

Campos de la respuesta

  • statusstring

    draft hasta que se envía; pending_approval mientras corre su cadena de aprobación; approved, y luego ordered cuando se convirtió en una orden de compra (poId); o rejected (rejectionReason) o canceled.

  • amountnumber

    El total de las líneas (qty × unitPrice), en currency.

  • approvalobject

    La cadena de aprobación, ausente mientras es un borrador. Se arma con el flujo de aprobación de solicitudes de compra del espacio de trabajo (por defecto, el de órdenes de compra), el límite de gasto de quien la pide y el control de presupuesto.

  • approvalVersionnumber

    Aumenta con cada cambio de la aprobación. Envíalo como expectedVersion al aprobar.

  • budgetCheckobject

    El control de presupuesto del centro de costo cuando los presupuestos están activos: el último, al enviarla o en la aprobación final. Las cifras están en la moneda del presupuesto.

Errores

  • 400 Bad Request - Un campo no es válido, o la solicitud está aprobada, pedida, rechazada o cancelada y no se puede cambiar.
  • 403 Forbidden - Quien llama no es quien la pidió.
  • 404 Not Found - No hay ninguna solicitud de compra con este id que quien llama pueda ver. Quien no puede ver una solicitud no se entera de si existe.
  • 409 Conflict - Código over_budget. Los presupuestos se aplican (modo bloqueo) y la solicitud dejaría su centro de costo por encima del presupuesto, o no hay tipo de cambio para controlarla. El budgetCheck del cuerpo tiene las cifras. No se guarda nada.
  • 409 Conflict - La solicitud cambió mientras esta llamada la escribía. Vuelve a leerla y reintenta.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
  • 403 Forbidden - El token Bearer o la clave de API del llamador no da acceso a este espacio de trabajo (regionId), o no tiene el rol requerido.
PATCH /v1/workspaces/{regionId}/purchase-requests/{requestId}
Solicitud
curl -X PATCH "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/purchase-requests/{requestId}" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Respuesta · 200 OK
{
   "id": "string",
   "title": "string",
   "description": "string",
   "requesterEmployeeKey": "string",
   "requesterName": "string",
   "costCenter": "string",
   "glCode": "string",
   "supplier": { "name": "string", "supplierConnectionId": "string", "supplierRegionId": "string" },
   "lineItems": [
      { "name": "string", "lineType": "goods" | "service", "qty": number, "unit": "string", "unitPrice": number }
   ],
   "amount": number,
   "currency": "string",
   "neededBy": "string",
   "quoteDocument": { "importId": "string", "fileName": "string", "contentType": "string", "addedAt": "string", "quoteNumber": "string", "validUntil": "string" },
   "notes": "string",
   "status": "draft" | "pending_approval" | "approved" | "ordered" | "rejected" | "canceled",
   "approval": {
      "requester": "string",
      "requesterEmployeeKey": "string",
      "groups": [
        {
          "id": "string",
          "mode": "sequential" | "parallel",
          "label": "string",
          "status": "pending" | "approved" | "rejected",
          "stages": [
            { "id": "string", "label": "string", "approverEmployeeKey": "string", "approverName": "string", "status": "pending" | "approved" | "rejected" }
          ]
        }
      ],
      "groupIndex": number,
      "status": "pending" | "approved" | "rejected",
      "history": [
        { "stage": "string", "by": "string", "at": "string", "action": "approved" | "rejected" | "limit_exceeded" | "reassigned" | "skipped" }
      ],
      "autonomy": boolean,
      "selfApproved": boolean
    },
   "approvalVersion": number,
   "budgetCheck": { "outcome": "within" | "over" | "no_budget" | "no_rate" | "off", "mode": "off" | "warn" | "block", "costCenter": "string", "currency": "string", "budget": number, "remaining": number, "amount": number, "overBy": number, "checkedAt": "string" },
   "poId": "string",
   "rejectionReason": "string",
   "createdAt": "string",
   "updatedAt": "string",
   "submittedAt": "string",
   "decidedAt": "string",
   "canceledAt": "string",
   "canceledBy": "string"
}

Enviar solicitud de compra

Envía un borrador a aprobación.

POST/v1/workspaces/{regionId}/purchase-requests/{requestId}/submit

Parámetros

  • requestIdstringObligatorio

    La solicitud de compra, p. ej. PR-3F9A1C2E.

Devuelve

200 OK con el objeto que se muestra en la respuesta.

Más detalles

Arma la cadena de aprobación de la solicitud y avisa a su primer aprobador. Los pasos de aprobación se enrutan por importe, proveedor, solicitante, centro de costo y cuenta contable. El estado pasa a pending_approval, o directamente a approved cuando la cubren la autonomía o una regla de automatización. Una solicitud en otra moneda que la del espacio de trabajo se enruta al tipo de cambio del día; sin tipo de cambio, siempre va a una persona. No lleva cuerpo.

Solo quien la pidió.

Campos de la respuesta

  • statusstring

    draft hasta que se envía; pending_approval mientras corre su cadena de aprobación; approved, y luego ordered cuando se convirtió en una orden de compra (poId); o rejected (rejectionReason) o canceled.

  • amountnumber

    El total de las líneas (qty × unitPrice), en currency.

  • approvalobject

    La cadena de aprobación, ausente mientras es un borrador. Se arma con el flujo de aprobación de solicitudes de compra del espacio de trabajo (por defecto, el de órdenes de compra), el límite de gasto de quien la pide y el control de presupuesto.

  • approvalVersionnumber

    Aumenta con cada cambio de la aprobación. Envíalo como expectedVersion al aprobar.

  • budgetCheckobject

    El control de presupuesto del centro de costo cuando los presupuestos están activos: el último, al enviarla o en la aprobación final. Las cifras están en la moneda del presupuesto.

Errores

  • 400 Bad Request - La solicitud ya se envió, o no tiene descripción, ni un importe mayor que 0, ni un centro de costo en un espacio de trabajo que tiene una lista.
  • 403 Forbidden - Quien llama no es quien la pidió.
  • 404 Not Found - No hay ninguna solicitud de compra con este id que quien llama pueda ver. Quien no puede ver una solicitud no se entera de si existe.
  • 409 Conflict - Código over_budget. Los presupuestos se aplican (modo bloqueo) y la solicitud dejaría su centro de costo por encima del presupuesto, o no hay tipo de cambio para controlarla. El budgetCheck del cuerpo tiene las cifras. No se guarda nada.
  • 409 Conflict - La solicitud cambió mientras esta llamada la escribía. Vuelve a leerla y reintenta.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
  • 403 Forbidden - El token Bearer o la clave de API del llamador no da acceso a este espacio de trabajo (regionId), o no tiene el rol requerido.
POST /v1/workspaces/{regionId}/purchase-requests/{requestId}/submit
Solicitud
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/purchase-requests/{requestId}/submit" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Respuesta · 200 OK
{
   "id": "string",
   "title": "string",
   "description": "string",
   "requesterEmployeeKey": "string",
   "requesterName": "string",
   "costCenter": "string",
   "glCode": "string",
   "supplier": { "name": "string", "supplierConnectionId": "string", "supplierRegionId": "string" },
   "lineItems": [
      { "name": "string", "lineType": "goods" | "service", "qty": number, "unit": "string", "unitPrice": number }
   ],
   "amount": number,
   "currency": "string",
   "neededBy": "string",
   "quoteDocument": { "importId": "string", "fileName": "string", "contentType": "string", "addedAt": "string", "quoteNumber": "string", "validUntil": "string" },
   "notes": "string",
   "status": "draft" | "pending_approval" | "approved" | "ordered" | "rejected" | "canceled",
   "approval": {
      "requester": "string",
      "requesterEmployeeKey": "string",
      "groups": [
        {
          "id": "string",
          "mode": "sequential" | "parallel",
          "label": "string",
          "status": "pending" | "approved" | "rejected",
          "stages": [
            { "id": "string", "label": "string", "approverEmployeeKey": "string", "approverName": "string", "status": "pending" | "approved" | "rejected" }
          ]
        }
      ],
      "groupIndex": number,
      "status": "pending" | "approved" | "rejected",
      "history": [
        { "stage": "string", "by": "string", "at": "string", "action": "approved" | "rejected" | "limit_exceeded" | "reassigned" | "skipped" }
      ],
      "autonomy": boolean,
      "selfApproved": boolean
    },
   "approvalVersion": number,
   "budgetCheck": { "outcome": "within" | "over" | "no_budget" | "no_rate" | "off", "mode": "off" | "warn" | "block", "costCenter": "string", "currency": "string", "budget": number, "remaining": number, "amount": number, "overBy": number, "checkedAt": "string" },
   "poId": "string",
   "rejectionReason": "string",
   "createdAt": "string",
   "updatedAt": "string",
   "submittedAt": "string",
   "decidedAt": "string",
   "canceledAt": "string",
   "canceledBy": "string"
}

Aprobar solicitud de compra

Aprueba el paso de aprobación actual de una solicitud de compra.

POST/v1/workspaces/{regionId}/purchase-requests/{requestId}/approve

Parámetros

  • requestIdstringObligatorio

    La solicitud de compra, p. ej. PR-3F9A1C2E.

Cuerpo

  • expectedVersionnumber

    El approvalVersion que vio quien llama. Si la aprobación de la solicitud cambió desde entonces, la llamada se rechaza con 409 APPROVAL_VERSION_CHANGED en lugar de aprobar otra cosa.

Devuelve

200 OK con el objeto que se muestra en la respuesta.

Más detalles

Aprueba el paso que nombra a quien llama. En el paso final se vuelve a controlar el presupuesto antes de que la solicitud quede aprobada; se avisa a quien la pidió y a las personas que pueden emitir órdenes. Se aplican las mismas reglas que al aprobar una orden de compra, incluida si quien la pide puede aprobar su propia solicitud.

Solo con sesión iniciada y acceso 'edit' a las órdenes de compra. Cualquier otro llamador, incluida una clave de API, recibe 403 HUMAN_APPROVAL_REQUIRED antes de que se lea nada.

Campos de la respuesta

  • statusstring

    draft hasta que se envía; pending_approval mientras corre su cadena de aprobación; approved, y luego ordered cuando se convirtió en una orden de compra (poId); o rejected (rejectionReason) o canceled.

  • amountnumber

    El total de las líneas (qty × unitPrice), en currency.

  • approvalobject

    La cadena de aprobación, ausente mientras es un borrador. Se arma con el flujo de aprobación de solicitudes de compra del espacio de trabajo (por defecto, el de órdenes de compra), el límite de gasto de quien la pide y el control de presupuesto.

  • approvalVersionnumber

    Aumenta con cada cambio de la aprobación. Envíalo como expectedVersion al aprobar.

  • budgetCheckobject

    El control de presupuesto del centro de costo cuando los presupuestos están activos: el último, al enviarla o en la aprobación final. Las cifras están en la moneda del presupuesto.

Errores

  • 400 Bad Request - La solicitud no espera aprobación.
  • 403 Forbidden - Código HUMAN_APPROVAL_REQUIRED. El llamador es una clave de API. Los pasos de aprobación nombran a un empleado concreto y una clave nunca puede serlo, así que una clave no puede aprobar ni rechazar un paso. Pide al empleado que indica el paso que actúe sobre él en Pleaxy.
  • 403 Forbidden - Código APPROVER_NOT_ASSIGNED. El paso actual no tiene aprobador asignado, así que nadie puede actuar sobre él. Un administrador debe asignar uno antes con ReassignPurchaseOrderApprovalStage / ReassignInvoiceApprovalStage.
  • 403 Forbidden - El llamador no es el empleado que indica el paso actual. Solo ese empleado puede aprobarlo o rechazarlo: ningún rol ni permiso sustituye a estar nombrado.
  • 404 Not Found - No hay ninguna solicitud de compra con este id que quien llama pueda ver. Quien no puede ver una solicitud no se entera de si existe.
  • 409 Conflict - Código APPROVAL_VERSION_CHANGED: expectedVersion ya no coincide. Vuelve a leer la solicitud.
  • 409 Conflict - Código over_budget. Los presupuestos se aplican (modo bloqueo) y la solicitud dejaría su centro de costo por encima del presupuesto, o no hay tipo de cambio para controlarla. El budgetCheck del cuerpo tiene las cifras. No se guarda nada.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
  • 403 Forbidden - El token Bearer o la clave de API del llamador no da acceso a este espacio de trabajo (regionId), o no tiene el rol requerido.
POST /v1/workspaces/{regionId}/purchase-requests/{requestId}/approve
Solicitud
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/purchase-requests/{requestId}/approve" \
  -H "X-Api-Key: $PLEAXY_API_KEY" \
  -H "Content-Type: application/json" \
  -d @body.json
body.json
{
   "expectedVersion": number
}
Respuesta · 200 OK
{
   "id": "string",
   "title": "string",
   "description": "string",
   "requesterEmployeeKey": "string",
   "requesterName": "string",
   "costCenter": "string",
   "glCode": "string",
   "supplier": { "name": "string", "supplierConnectionId": "string", "supplierRegionId": "string" },
   "lineItems": [
      { "name": "string", "lineType": "goods" | "service", "qty": number, "unit": "string", "unitPrice": number }
   ],
   "amount": number,
   "currency": "string",
   "neededBy": "string",
   "quoteDocument": { "importId": "string", "fileName": "string", "contentType": "string", "addedAt": "string", "quoteNumber": "string", "validUntil": "string" },
   "notes": "string",
   "status": "draft" | "pending_approval" | "approved" | "ordered" | "rejected" | "canceled",
   "approval": {
      "requester": "string",
      "requesterEmployeeKey": "string",
      "groups": [
        {
          "id": "string",
          "mode": "sequential" | "parallel",
          "label": "string",
          "status": "pending" | "approved" | "rejected",
          "stages": [
            { "id": "string", "label": "string", "approverEmployeeKey": "string", "approverName": "string", "status": "pending" | "approved" | "rejected" }
          ]
        }
      ],
      "groupIndex": number,
      "status": "pending" | "approved" | "rejected",
      "history": [
        { "stage": "string", "by": "string", "at": "string", "action": "approved" | "rejected" | "limit_exceeded" | "reassigned" | "skipped" }
      ],
      "autonomy": boolean,
      "selfApproved": boolean
    },
   "approvalVersion": number,
   "budgetCheck": { "outcome": "within" | "over" | "no_budget" | "no_rate" | "off", "mode": "off" | "warn" | "block", "costCenter": "string", "currency": "string", "budget": number, "remaining": number, "amount": number, "overBy": number, "checkedAt": "string" },
   "poId": "string",
   "rejectionReason": "string",
   "createdAt": "string",
   "updatedAt": "string",
   "submittedAt": "string",
   "decidedAt": "string",
   "canceledAt": "string",
   "canceledBy": "string"
}

Rechazar solicitud de compra

Rechaza una solicitud de compra con un motivo.

POST/v1/workspaces/{regionId}/purchase-requests/{requestId}/reject

Parámetros

  • requestIdstringObligatorio

    La solicitud de compra, p. ej. PR-3F9A1C2E.

Cuerpo

  • reasonstringObligatorio

    Por qué se rechaza la solicitud; quien la pidió lo ve. Hasta 1.000 caracteres.

Devuelve

200 OK con el objeto que se muestra en la respuesta.

Más detalles

Rechaza la solicitud en el paso que nombra a quien llama. El estado pasa a rejected y se avisa a quien la pidió con el motivo. Es definitivo: quien la pidió vuelve a pedirlo con una nueva solicitud.

Con acceso 'edit' a las órdenes de compra. Solo el empleado que nombra el paso actual; una clave de API recibe 403 HUMAN_APPROVAL_REQUIRED.

Campos de la respuesta

  • statusstring

    draft hasta que se envía; pending_approval mientras corre su cadena de aprobación; approved, y luego ordered cuando se convirtió en una orden de compra (poId); o rejected (rejectionReason) o canceled.

  • amountnumber

    El total de las líneas (qty × unitPrice), en currency.

  • approvalobject

    La cadena de aprobación, ausente mientras es un borrador. Se arma con el flujo de aprobación de solicitudes de compra del espacio de trabajo (por defecto, el de órdenes de compra), el límite de gasto de quien la pide y el control de presupuesto.

  • approvalVersionnumber

    Aumenta con cada cambio de la aprobación. Envíalo como expectedVersion al aprobar.

  • budgetCheckobject

    El control de presupuesto del centro de costo cuando los presupuestos están activos: el último, al enviarla o en la aprobación final. Las cifras están en la moneda del presupuesto.

Errores

  • 400 Bad Request - Falta el motivo, o la solicitud no espera aprobación.
  • 403 Forbidden - Código HUMAN_APPROVAL_REQUIRED. El llamador es una clave de API. Los pasos de aprobación nombran a un empleado concreto y una clave nunca puede serlo, así que una clave no puede aprobar ni rechazar un paso. Pide al empleado que indica el paso que actúe sobre él en Pleaxy.
  • 403 Forbidden - Código APPROVER_NOT_ASSIGNED. El paso actual no tiene aprobador asignado, así que nadie puede actuar sobre él. Un administrador debe asignar uno antes con ReassignPurchaseOrderApprovalStage / ReassignInvoiceApprovalStage.
  • 403 Forbidden - El llamador no es el empleado que indica el paso actual. Solo ese empleado puede aprobarlo o rechazarlo: ningún rol ni permiso sustituye a estar nombrado.
  • 404 Not Found - No hay ninguna solicitud de compra con este id que quien llama pueda ver. Quien no puede ver una solicitud no se entera de si existe.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
  • 403 Forbidden - El token Bearer o la clave de API del llamador no da acceso a este espacio de trabajo (regionId), o no tiene el rol requerido.
POST /v1/workspaces/{regionId}/purchase-requests/{requestId}/reject
Solicitud
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/purchase-requests/{requestId}/reject" \
  -H "X-Api-Key: $PLEAXY_API_KEY" \
  -H "Content-Type: application/json" \
  -d @body.json
body.json
{
   "reason": "string"
}
Respuesta · 200 OK
{
   "id": "string",
   "title": "string",
   "description": "string",
   "requesterEmployeeKey": "string",
   "requesterName": "string",
   "costCenter": "string",
   "glCode": "string",
   "supplier": { "name": "string", "supplierConnectionId": "string", "supplierRegionId": "string" },
   "lineItems": [
      { "name": "string", "lineType": "goods" | "service", "qty": number, "unit": "string", "unitPrice": number }
   ],
   "amount": number,
   "currency": "string",
   "neededBy": "string",
   "quoteDocument": { "importId": "string", "fileName": "string", "contentType": "string", "addedAt": "string", "quoteNumber": "string", "validUntil": "string" },
   "notes": "string",
   "status": "draft" | "pending_approval" | "approved" | "ordered" | "rejected" | "canceled",
   "approval": {
      "requester": "string",
      "requesterEmployeeKey": "string",
      "groups": [
        {
          "id": "string",
          "mode": "sequential" | "parallel",
          "label": "string",
          "status": "pending" | "approved" | "rejected",
          "stages": [
            { "id": "string", "label": "string", "approverEmployeeKey": "string", "approverName": "string", "status": "pending" | "approved" | "rejected" }
          ]
        }
      ],
      "groupIndex": number,
      "status": "pending" | "approved" | "rejected",
      "history": [
        { "stage": "string", "by": "string", "at": "string", "action": "approved" | "rejected" | "limit_exceeded" | "reassigned" | "skipped" }
      ],
      "autonomy": boolean,
      "selfApproved": boolean
    },
   "approvalVersion": number,
   "budgetCheck": { "outcome": "within" | "over" | "no_budget" | "no_rate" | "off", "mode": "off" | "warn" | "block", "costCenter": "string", "currency": "string", "budget": number, "remaining": number, "amount": number, "overBy": number, "checkedAt": "string" },
   "poId": "string",
   "rejectionReason": "string",
   "createdAt": "string",
   "updatedAt": "string",
   "submittedAt": "string",
   "decidedAt": "string",
   "canceledAt": "string",
   "canceledBy": "string"
}

Cancelar solicitud de compra

Retira una solicitud de compra hasta que se pide.

POST/v1/workspaces/{regionId}/purchase-requests/{requestId}/cancel

Parámetros

  • requestIdstringObligatorio

    La solicitud de compra, p. ej. PR-3F9A1C2E.

Devuelve

200 OK con el objeto que se muestra en la respuesta.

Más detalles

Retira un borrador, una solicitud que espera aprobación o una aprobada que todavía no se pidió. El estado pasa a canceled. No lleva cuerpo.

Quien la pidió, o un administrador del espacio de trabajo.

Campos de la respuesta

  • statusstring

    draft hasta que se envía; pending_approval mientras corre su cadena de aprobación; approved, y luego ordered cuando se convirtió en una orden de compra (poId); o rejected (rejectionReason) o canceled.

  • amountnumber

    El total de las líneas (qty × unitPrice), en currency.

  • approvalobject

    La cadena de aprobación, ausente mientras es un borrador. Se arma con el flujo de aprobación de solicitudes de compra del espacio de trabajo (por defecto, el de órdenes de compra), el límite de gasto de quien la pide y el control de presupuesto.

  • approvalVersionnumber

    Aumenta con cada cambio de la aprobación. Envíalo como expectedVersion al aprobar.

  • budgetCheckobject

    El control de presupuesto del centro de costo cuando los presupuestos están activos: el último, al enviarla o en la aprobación final. Las cifras están en la moneda del presupuesto.

Errores

  • 400 Bad Request - La solicitud ya está pedida, rechazada o cancelada.
  • 403 Forbidden - Quien llama no es quien la pidió ni un administrador.
  • 404 Not Found - No hay ninguna solicitud de compra con este id que quien llama pueda ver. Quien no puede ver una solicitud no se entera de si existe.
  • 409 Conflict - La solicitud cambió mientras esta llamada la escribía. Vuelve a leerla y reintenta.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
  • 403 Forbidden - El token Bearer o la clave de API del llamador no da acceso a este espacio de trabajo (regionId), o no tiene el rol requerido.
POST /v1/workspaces/{regionId}/purchase-requests/{requestId}/cancel
Solicitud
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/purchase-requests/{requestId}/cancel" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Respuesta · 200 OK
{
   "id": "string",
   "title": "string",
   "description": "string",
   "requesterEmployeeKey": "string",
   "requesterName": "string",
   "costCenter": "string",
   "glCode": "string",
   "supplier": { "name": "string", "supplierConnectionId": "string", "supplierRegionId": "string" },
   "lineItems": [
      { "name": "string", "lineType": "goods" | "service", "qty": number, "unit": "string", "unitPrice": number }
   ],
   "amount": number,
   "currency": "string",
   "neededBy": "string",
   "quoteDocument": { "importId": "string", "fileName": "string", "contentType": "string", "addedAt": "string", "quoteNumber": "string", "validUntil": "string" },
   "notes": "string",
   "status": "draft" | "pending_approval" | "approved" | "ordered" | "rejected" | "canceled",
   "approval": {
      "requester": "string",
      "requesterEmployeeKey": "string",
      "groups": [
        {
          "id": "string",
          "mode": "sequential" | "parallel",
          "label": "string",
          "status": "pending" | "approved" | "rejected",
          "stages": [
            { "id": "string", "label": "string", "approverEmployeeKey": "string", "approverName": "string", "status": "pending" | "approved" | "rejected" }
          ]
        }
      ],
      "groupIndex": number,
      "status": "pending" | "approved" | "rejected",
      "history": [
        { "stage": "string", "by": "string", "at": "string", "action": "approved" | "rejected" | "limit_exceeded" | "reassigned" | "skipped" }
      ],
      "autonomy": boolean,
      "selfApproved": boolean
    },
   "approvalVersion": number,
   "budgetCheck": { "outcome": "within" | "over" | "no_budget" | "no_rate" | "off", "mode": "off" | "warn" | "block", "costCenter": "string", "currency": "string", "budget": number, "remaining": number, "amount": number, "overBy": number, "checkedAt": "string" },
   "poId": "string",
   "rejectionReason": "string",
   "createdAt": "string",
   "updatedAt": "string",
   "submittedAt": "string",
   "decidedAt": "string",
   "canceledAt": "string",
   "canceledBy": "string"
}

Convertir solicitud de compra

Pide una solicitud aprobada: crea su orden de compra.

POST/v1/workspaces/{regionId}/purchase-requests/{requestId}/convert

Parámetros

  • requestIdstringObligatorio

    La solicitud de compra, p. ej. PR-3F9A1C2E.

Cuerpo

  • any CreatePurchaseOrder fieldobject

    Todos los campos son opcionales y toman por defecto los de la solicitud. supplier es necesario cuando la solicitud no nombra uno. Enviar lineItems reemplaza las líneas de la solicitud.

Devuelve

201 Created con el objeto que se muestra en la respuesta.

Más detalles

Crea una orden de compra a partir de una solicitud aprobada, como hace CreatePurchaseOrder: las líneas de la solicitud (una línea personalizada por cantidad cada una), el proveedor, el centro de costo, la cuenta contable, la cotización y las notas, y el cuerpo puede cambiar cada uno. La orden nombra la solicitud (requestId) y la solicitud pasa a ordered, en un solo paso, así que una solicitud se convierte en una orden como máximo. Cuando la orden usa el mismo centro de costo y la misma cuenta contable y su importe, en la moneda del espacio de trabajo, no supera lo aprobado, conserva la aprobación de la solicitud; si no, pasa por el flujo de aprobación de órdenes de compra. Se avisa a quien la pidió.

Con acceso 'create' a las órdenes de compra.

Errores

  • 400 Bad Request - La solicitud no está aprobada, o ni la solicitud ni el cuerpo nombran un proveedor. También aplica cualquier rechazo de CreatePurchaseOrder.
  • 409 Conflict - La solicitud ya se pidió.
  • 404 Not Found - No hay ninguna solicitud de compra con este id que quien llama pueda ver. Quien no puede ver una solicitud no se entera de si existe.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
  • 403 Forbidden - El token Bearer o la clave de API del llamador no da acceso a este espacio de trabajo (regionId), o no tiene el rol requerido.
POST /v1/workspaces/{regionId}/purchase-requests/{requestId}/convert
Solicitud
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/purchase-requests/{requestId}/convert" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Respuesta · 201 Created
{
   "request": {
      "id": "string",
      "title": "string",
      "description": "string",
      "requesterEmployeeKey": "string",
      "requesterName": "string",
      "costCenter": "string",
      "glCode": "string",
      "supplier": { "name": "string", "supplierConnectionId": "string", "supplierRegionId": "string" },
      "lineItems": [
         { "name": "string", "lineType": "goods" | "service", "qty": number, "unit": "string", "unitPrice": number }
      ],
      "amount": number,
      "currency": "string",
      "neededBy": "string",
      "quoteDocument": { "importId": "string", "fileName": "string", "contentType": "string", "addedAt": "string", "quoteNumber": "string", "validUntil": "string" },
      "notes": "string",
      "status": "draft" | "pending_approval" | "approved" | "ordered" | "rejected" | "canceled",
      "approval": {
         "requester": "string",
         "requesterEmployeeKey": "string",
         "groups": [
           {
             "id": "string",
             "mode": "sequential" | "parallel",
             "label": "string",
             "status": "pending" | "approved" | "rejected",
             "stages": [
               { "id": "string", "label": "string", "approverEmployeeKey": "string", "approverName": "string", "status": "pending" | "approved" | "rejected" }
             ]
           }
         ],
         "groupIndex": number,
         "status": "pending" | "approved" | "rejected",
         "history": [
           { "stage": "string", "by": "string", "at": "string", "action": "approved" | "rejected" | "limit_exceeded" | "reassigned" | "skipped" }
         ],
         "autonomy": boolean,
         "selfApproved": boolean
       },
      "approvalVersion": number,
      "budgetCheck": { "outcome": "within" | "over" | "no_budget" | "no_rate" | "off", "mode": "off" | "warn" | "block", "costCenter": "string", "currency": "string", "budget": number, "remaining": number, "amount": number, "overBy": number, "checkedAt": "string" },
      "poId": "string",
      "rejectionReason": "string",
      "createdAt": "string",
      "updatedAt": "string",
      "submittedAt": "string",
      "decidedAt": "string",
      "canceledAt": "string",
      "canceledBy": "string"
   },
   "purchaseOrder": {
      "id": "string",
      "buyerOrgId": "string",
      "supplierOrgId": "string",
      "supplier": "string",
      "amount": number,
      "currency": "string",
      "status": "draft" | "pending_approval" | "rejected" | "awaiting_fulfillment" | "invoiced" | "paid" | "canceled" | "closed" | "expired",
      "invoiceId": "string",
      "provider": "aws" | "gcp" | "azure" | "oci",
      "payerAccounts": [
         { "id": "string", "label": "string", "detail": "string" }
      ],
      "billToParty": {
         "source": "company_profile" | "custom",
         "companyName": "string",
         "address": { "line1": "string", "line2": "string", "city": "string", "region": "string", "postalCode": "string", "country": "string" },
         "addressText": "string",
         "taxId": "string"
      },
      "costCenter": "string",
      "costCenterChanges": [ { "from": "string", "to": "string", "reason": "string", "by": "string", "byName": "string", "at": "string" } ],
      "budgetOwner": "string",
      "buyerName": "string",
      "supplierSite": "string",
      "notes": "string",
      "requestId": "string",
      "lineItems": [
         {
         "lineNo": number,
         "scopeType": "sku" | "service" | "account" | "custom",
         "scopeId": "string" | null,
         "name": "string",
         "ruleType": "quantity" | "amount",
         "unit": "string",
         "unitPrice": number,
         "qty": number,
         "nteAmount": number,
         "lineType": "goods" | "service",
         "currency": "string",
         "paymentTerms": "string",
         "validFrom": "string",
         "validUntil": "string",
         "consumed": number,
         "customerLineNo": "string",
         "supplierSku": "string",
         "priceSource": "contract" | "list" | "manual"
       }
      ],
      "approval": {
         "requester": "string",
         "requesterEmployeeKey": "string",
         "groups": [
           {
             "id": "string",
             "mode": "sequential" | "parallel",
             "label": "string",
             "status": "pending" | "approved" | "rejected",
             "stages": [
               { "id": "string", "label": "string", "approverEmployeeKey": "string", "approverName": "string", "status": "pending" | "approved" | "rejected" }
             ]
           }
         ],
         "groupIndex": number,
         "status": "pending" | "approved" | "rejected",
         "history": [
           { "stage": "string", "by": "string", "at": "string", "action": "approved" | "rejected" | "limit_exceeded" | "reassigned" | "skipped" }
         ],
         "autonomy": boolean,
         "selfApproved": boolean
       },
      "supplierEmail": { "to": "string", "at": "string" },
      "priorInvoiced": { "amount": number, "currency": "string", "basis": "invoiced" | "remaining", "sourceSystem": "sap_ariba" | "coupa" | "oracle", "importId": "string", "fileName": "string", "importedAt": "string", "importedBy": "string" },
      "createdAt": "string"
   }
}
Habla con nosotros