EMPRESA_JOSESAID · pedidos-ventas-ms

Uso de IA · Pedidos y ventas

Cotizaciones, pedidos, prospectos y resumen de ventas.

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

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

Herramientas que expone a la IA (20):

consultar_pedidosresumen_ventasobtener_cotizacionobtener_pedidoconsultar_tasas_ivaconsultar_monedaspreparar_pedido_borradorcrear_prospecto_borradorconfirmar_pedidocancelar_pedidoregistrar_entrega_pedidoenviar_cotizacionaceptar_cotizacionconvertir_cotizacion_en_pedidocrear_cotizacion_borradorreemplazar_lineas_pedidoregistrar_devolucion_pedidocambiar_estatus_prospectoconvertir_prospecto_en_clienteregistrar_interaccion_cliente

Ruta base en Nexus: /pedidos-ventas-ms/v1

01 Herramienta de lectura: consulta el servicio y devuelve datos

Herramienta de lectura: consulta el servicio y devuelve datos.

HerramientasVentas.java
    @Tool(name = "obtener_pedido",
          description = "Devuelve un pedido por su identificador UUID: cliente, canal, líneas, totales y estatus.")
    public String obtenerPedido(
            @ToolParam(description = "Identificador UUID del pedido", required = true) String pedidoId) {
        RegistroHerramientasUsadas.registrar("obtener_pedido");
        UUID id = identificador(pedidoId);
        if (id == null) {
            return "El identificador del pedido no es válido.";
        }
        return lectura(RUTA_BASE + "/pedidos/" + id, "No encontré ese pedido.");
    }
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.

HerramientasVentas.java
    @Tool(name = "preparar_pedido_borrador",
          description = "Prepara un pedido de venta en borrador. NO lo guarda: devuelve un resumen y un accion_id. "
                  + "El usuario debe confirmarlo en la aplicación antes de que se guarde. Úsala solo cuando el usuario pida crear un pedido.")
    public String prepararPedidoBorrador(
            @ToolParam(description = "Identificador UUID del cliente", required = true) String clienteId,
            @ToolParam(description = "Canal de venta: WEB, TIENDA o TELEFONO", required = true) String canal,
            @ToolParam(description = "Moneda ISO, por ejemplo MXN", required = true) String moneda,
            @ToolParam(description = "Tasa de IVA: IVA_GENERAL, IVA_FRONTERIZO o IVA_EXENTO", required = true) String tasaIva,
            @ToolParam(description = "Identificador UUID del producto", required = true) String productoId,
            @ToolParam(description = "Descripción de la línea. Puede ir vacía.", required = false) String descripcion,
            @ToolParam(description = "Cantidad entera mayor a cero", required = true) int cantidad,
            @ToolParam(description = "Precio unitario en la moneda del pedido", required = true) String precioUnitario) {
        RegistroHerramientasUsadas.registrar("preparar_pedido_borrador");
        if (acciones == null) {
            return "La preparación de pedidos no está disponible en este momento.";
        }
        if (cantidad <= 0) {
            return "La cantidad debe ser mayor a cero.";
        }
        Map<String, Object> linea = new LinkedHashMap<>();
        linea.put("productoId", productoId.trim());
        linea.put("descripcion", descripcion == null || descripcion.isBlank() ? "Artículo" : descripcion.trim());
        linea.put("cantidad", cantidad);
        linea.put("precioUnitario", precioUnitario.trim());
        Map<String, Object> cuerpo = new LinkedHashMap<>();
        cuerpo.put("clienteId", clienteId.trim());
        cuerpo.put("canal", canal.trim().toUpperCase());
        cuerpo.put("moneda", moneda.trim().toUpperCase());
        cuerpo.put("tasaIva", tasaIva.trim().toUpperCase());
        cuerpo.put("lineas", List.of(linea));
        String payload = aJson(cuerpo);
        String resumen = "Pedido en borrador para el cliente " + clienteId.trim() + ": " + cantidad + " × "
                + productoId.trim() + " a " + precioUnitario.trim() + " " + moneda.trim().toUpperCase()
                + " (" + canal.trim().toUpperCase() + ", " + tasaIva.trim().toUpperCase() + ")";
        AccionPendiente accion = acciones.preparar(usuarioActual(), AccionesPendientes.TIPO_PEDIDO_BORRADOR,
                payload, resumen);
        return FiltroDatosSensibles.redactar("Pedido preparado, no guardado. " + resumen
                + ". accion_id: " + accion.id() + ". Vence en 10 minutos; el usuario debe confirmarlo en la aplicación.")
                .texto();
    }
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.

HerramientasVentas.java
    static final String RUTA_BASE = "/pedidos-ventas-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.