EMPRESA_JOSESAID · compras-proveedores-ms

Uso de IA · Compras y proveedores

Proveedores y órdenes de compra.

Cómo se usa la IA aquí. Los fragmentos son código real del repositorio.

Usuario a ser usado: compras@demo.empresa.mx (contraseña Demo2026!)

Herramientas que expone a la IA (8):

consultar_proveedorconsultar_orden_comprabuscar_proveedoreslistar_ordenes_compracrear_proveedorcrear_orden_compraregistrar_recepcion_ordencancelar_orden_compra

Ruta base en Nexus: /compras-proveedores-ms/v1

01 Herramienta de lectura: consulta el servicio y devuelve datos

Herramienta de lectura: consulta el servicio y devuelve datos.

HerramientasCompras.java
    @Tool(name = "consultar_orden_compra",
          description = "Devuelve una orden de compra por su identificador UUID: proveedor, moneda, líneas, cantidades recibidas, subtotales y estatus.")
    public String consultarOrdenCompra(
            @ToolParam(description = "Identificador UUID de la orden de compra", required = true) String ordenId) {
        RegistroHerramientasUsadas.registrar("consultar_orden_compra");
        String cuerpo = gateway.get()
                .uri(constructor -> constructor.path(RUTA_BASE + "/ordenes-compra/{id}").build(UUID.fromString(ordenId.trim())))
                .retrieve()
                .body(String.class);
        return FiltroDatosSensibles.redactar(cuerpo).texto();
    }
Qué hace: Llama al gateway con la ruta del servicio y devuelve el resultado al modelo.

02 Herramienta de escritura: prepara la acción y NO la ejecuta

Herramienta de escritura: prepara la acción y NO la ejecuta.

HerramientasCompras.java
    @Tool(name = "crear_orden_compra",
          description = "Prepara una orden de compra en borrador para un proveedor, con una sola línea. "
                  + "NO la crea: devuelve un resumen y un accion_id. El usuario debe confirmarlo en la aplicación. "
                  + "Solo COMPRAS puede usarla.")
    public String crearOrdenCompra(
            @ToolParam(description = "Identificador UUID del proveedor", required = true) String proveedorId,
            @ToolParam(description = "Moneda ISO, por ejemplo MXN", required = true) String moneda,
            @ToolParam(description = "SKU del artículo", required = true) String articuloSku,
            @ToolParam(description = "Cantidad mayor a cero, hasta 3 decimales", required = true) String cantidad,
            @ToolParam(description = "Precio unitario, hasta 2 decimales", required = true) String precioUnitario) {
        RegistroHerramientasUsadas.registrar("crear_orden_compra");
        if (acciones == null) {
            return NO_DISPONIBLE;
        }
        UUID id = identificador(proveedorId);
        if (id == null) {
            return "El identificador del proveedor no es válido.";
        }
        String monedaLimpia = normalizar(moneda);
        if (monedaLimpia.isEmpty() || monedaLimpia.length() > 3) {
            return "La moneda debe ser un código ISO de hasta 3 letras, por ejemplo MXN.";
        }
        if (vacio(articuloSku) || articuloSku.trim().length() > 40) {
            return "El SKU es obligatorio y de hasta 40 caracteres.";
        }
        BigDecimal cant = decimal(cantidad, 3, 9);
        if (cant == null || cant.signum() <= 0) {
            return "La cantidad debe ser mayor a cero, con hasta 3 decimales y 9 dígitos enteros.";
        }
        BigDecimal precio = decimal(precioUnitario, 2, 10);
        if (precio == null || precio.signum() < 0) {
            return "El precio unitario no es válido: debe ser cero o positivo, con hasta 2 decimales.";
        }
        if (recurso(RUTA_BASE + "/proveedores/" + id) == null) {
            return "No encontré ese proveedor.";
        }
        Map<String, Object> linea = new LinkedHashMap<>();
        linea.put("articuloSku", articuloSku.trim());
        linea.put("cantidad", cant);
        linea.put("precioUnitario", precio);
        Map<String, Object> cuerpo = new LinkedHashMap<>();
        cuerpo.put("proveedorId", id.toString());
        cuerpo.put("moneda", monedaLimpia);
        cuerpo.put("lineas", java.util.List.of(linea));
        String resumen = "Orden de compra al proveedor " + id + ": " + cant.stripTrailingZeros().toPlainString()
                + " x " + articuloSku.trim() + " a " + precio.toPlainString() + " " + monedaLimpia;
        return guardar(AccionesPendientes.TIPO_ORDEN_COMPRA_CREAR, cuerpo, resumen, "Orden preparada, no creada.");
    }
Qué hace: La acción queda pendiente hasta que la persona confirma con el código.

03 Ruta base del servicio dentro de Nexus

Ruta base del servicio dentro de Nexus.

HerramientasCompras.java
    static final String RUTA_BASE = "/compras-proveedores-ms/v1";
Qué hace: Todas las herramientas de este módulo se construyen sobre esta ruta.
Regla del proyecto: la IA propone o prepara; la persona confirma con el código de 8 dígitos. Ninguna herramienta de escritura cambia datos por sí sola.