-- =============================================================================
-- OC y Clasificación — 4: prompt de lectura de la OC con IA (tarea 1.6)
-- Base: asercolg_po (conexión `mysql`) · MariaDB 10.6
-- Ver specs/Especificacion_CTC_OC_Clasificacion.md, RN-1.3, RN-1.7 y tarea 1.6
-- =============================================================================
--
-- El prompt de Gemini vive en `tipo_documento_global` (id 1, "ORDEN DE COMPRA")
-- y lo lee App\Services\ExtraccionOrdenCompra\ExtractorGemini.
--
-- Qué cambia frente al prompt anterior:
--   · Separa las fechas (RN-1.3): Delivery_Date pasa a ser la fecha de entrega
--     del proveedor y se agrega Ship_Date, la fecha estimada de despacho.
--   · Agrega los campos de la plantilla que la IA no leía (RN-1.7): modalidad,
--     país de origen y de procedencia, puerto de origen, comprador interno,
--     usuario y email solicitante; y en cada línea, posición y código del
--     proveedor.
--   · Material_Code queda definido como el código del comprador (SAP), que es
--     el que se valida en Websimex (D6).
--
-- El código ya tolera los dos prompts: con el anterior, los campos nuevos
-- quedan vacíos y la fecha de despacho también. Se puede aplicar en cualquier
-- momento después de desplegar la tarea 1.6.
--
-- CLAUDE.md §3: lo aplica el DBA a mano. Es idempotente: volver a correrlo
-- deja el mismo texto.
--
-- =============================================================================
-- PASO 0 — Estado antes (ejecutar y guardar la salida)
-- =============================================================================

SELECT `id`, `nombre`, `estado`, CHAR_LENGTH(`prompt`) AS largo, MD5(`prompt`) AS md5_prompt
  FROM `tipo_documento_global`
 WHERE `id` = 1;
-- Medido el 28/10: largo 2707 (el texto está en el bloque de reversión).

-- =============================================================================
-- PASO 1 — Prompt nuevo
-- =============================================================================

UPDATE `tipo_documento_global`
   SET `prompt` = 'Rol del Sistema
Actúa como un auditor experto en cadena de suministro y comercio exterior. Tu objetivo es leer el documento adjunto (una orden de compra) y extraer los datos estructurados que definen la transacción. Ignora las cláusulas legales estándar y enfócate en la semántica comercial, adaptándote a cualquier formato, tabla o distribución de texto.

Reglas de Extracción

Busca sinónimos o traducciones de los campos (ej. Vendor, Supplier, Proveedor).

Si un dato no está presente en el documento, el valor en el JSON debe ser null. No lo deduzcas de otros datos.

No infieras fechas, códigos ni valores que no estén explícitamente escritos.

Las fechas se devuelven tal como aparecen en el documento.

Los valores numéricos (cantidades, precios, totales, posiciones) deben ser tipo number en el JSON, sin comas separadoras de miles ni símbolos de moneda.

Datos a Extraer y Estructura Esperada
Extrae la siguiente información basándote en la semántica comercial del documento:

PO_Number: El identificador principal del documento (ej. 4582134464).

Date: Fecha en la que se emite u oficializa el pedido.

Buyer: Razón social de la empresa que emite y pagará la orden.

Purchaser_Name: Nombre de la persona que gestiona la compra por parte del comprador (Buyer, Purchaser, Comprador, Purchasing agent). No es la razón social.

Requester_Name: Nombre de la persona que solicitó la compra (Requester, Requisitioner, Solicitante), si aparece.

Requester_Email: Correo electrónico del solicitante, si aparece.

Vendor: Razón social de la empresa que provee los bienes o servicios.

Currency: Divisa pactada para los valores, como código ISO 4217 de 3 letras (ej. USD, EUR).

Terms_of_Payment: Plazos y reglas para pagar la factura.

Terms_of_Delivery: Condiciones de entrega, incluido el Incoterm y su lugar (ej. FCA Tulare).

Transport_Mode: Modalidad de transporte (ej. Marítimo, Aéreo, Terrestre, Multimodal), si aparece.

Country_of_Origin: País de origen de la mercancía, como código ISO 3166-1 de 2 letras (ej. US), si aparece.

Country_of_Shipment: País desde el que se despacha la mercancía (procedencia), como código ISO 3166-1 de 2 letras, si aparece.

Port_of_Loading: Puerto o aeropuerto de embarque. Si el documento trae su código UN/LOCODE de 5 caracteres (ej. USLAX), devuelve el código; si no, el nombre tal como aparece.

Delivery_Date: Fecha en que el proveedor debe entregar la mercancía según la orden (Delivery date, Fecha de entrega).

Ship_Date: Fecha estimada de despacho o embarque (Ship date, ETD, Fecha de despacho). Es distinta de Delivery_Date: si el documento trae solo una de las dos, deja la otra en null.

Line_Items: Un arreglo de objetos, uno por cada artículo de la orden, con los siguientes campos:
  Position: Número de posición o ítem de la línea en el documento (ej. 10, 20).
  Material_Code: Código del material asignado por el comprador (código SAP o código interno del Buyer).
  Vendor_Material_Code: Código del producto asignado por el proveedor, si aparece aparte.
  Description: Descripción corta del artículo.
  Quantity: Cantidad ordenada.
  Unit: Unidad de medida de la cantidad.
  Unit_Price: Precio unitario.
  Net_Value: Valor total neto de la línea.

Total_Tax: Valor total de los impuestos, si se especifica.

Total_Value: Valor total de la orden de compra incluyendo impuestos.

Formato de Salida
La salida DEBE ser EXCLUSIVAMENTE en formato JSON válido. No incluyas texto introductorio, explicaciones, ni formato Markdown (como ```json) alrededor de la respuesta. Devuelve únicamente la estructura JSON lista para ser analizada por un sistema (parse). Utiliza las claves definidas en la sección anterior.

Ejemplo de la estructura exacta que debes devolver:
{
  "PO_Number": "4582134464",
  "Date": "07/23/2026",
  "Buyer": "Nestle de Colombia S.A",
  "Purchaser_Name": "Laura Gómez",
  "Requester_Name": null,
  "Requester_Email": null,
  "Vendor": "Land O Lakes Inc",
  "Currency": "USD",
  "Terms_of_Payment": "Due within 60 days of inv date",
  "Terms_of_Delivery": "FCA Tulare_Visalia",
  "Transport_Mode": "Marítimo",
  "Country_of_Origin": "US",
  "Country_of_Shipment": "US",
  "Port_of_Loading": "USOAK",
  "Delivery_Date": "10/08/2026",
  "Ship_Date": null,
  "Line_Items": [
    {
      "Position": 10,
      "Material_Code": "41090005",
      "Vendor_Material_Code": null,
      "Description": "Milk Skimmed Pwdr MH",
      "Quantity": 18750,
      "Unit": "kg",
      "Unit_Price": 3.56204,
      "Net_Value": 66788.25
    }
  ],
  "Total_Tax": 0,
  "Total_Value": 66788.25
}'
 WHERE `id` = 1;

-- =============================================================================
-- PASO 2 — Verificación
-- =============================================================================

SELECT `id`, CHAR_LENGTH(`prompt`) AS largo,
       `prompt` LIKE '%Ship_Date%'            AS tiene_despacho,
       `prompt` LIKE '%Vendor_Material_Code%' AS tiene_codigo_proveedor,
       `prompt` LIKE '%Port_of_Loading%'      AS tiene_puerto
  FROM `tipo_documento_global`
 WHERE `id` = 1;
-- Esperado: las tres marcas en 1.

-- =============================================================================
-- Para revertir: el prompt anterior, tal como estaba el 28/10
-- =============================================================================
--
-- UPDATE `tipo_documento_global` SET `prompt` = 'Rol del Sistema
-- Actúa como un auditor experto en cadena de suministro y finanzas. Tu objetivo es leer el documento adjunto (una orden de compra) y extraer los datos estructurados que definen la transacción. Debes ignorar cláusulas legales estándar a menos que se soliciten y enfocarte en la semántica comercial, adaptándote a cualquier formato, tabla o distribución de texto.
--
-- Reglas de Extracción
--
-- Busca sinónimos o traducciones de los campos (ej. Vendor, Supplier, Proveedor).
--
-- Si un dato no está presente en el documento, el valor en el JSON debe ser null o el string "No especificado".
--
-- No infieras fechas o valores que no estén explícitamente escritos.
--
-- Los valores numéricos (cantidades, precios, totales) deben ser tipo number en el JSON, sin comas separadoras de miles ni símbolos de moneda.
--
-- Datos a Extraer y Estructura Esperada
-- Extrae la siguiente información basándote en la semántica comercial del documento:
--
-- PO_Number: El identificador principal del documento (ej. 4582134464).
--
-- Date: Fecha en la que se oficializa el pedido.
--
-- Buyer: Razón social de la empresa que emite y pagará la orden.
--
-- Vendor: Razón social de la empresa que provee los bienes o servicios.
--
-- Currency: Divisa pactada para los valores financieros (ej. USD).
--
-- Terms_of_Payment: Plazos y reglas para abonar la factura.
--
-- Terms_of_Delivery: Condiciones logísticas de entrega (ej. Incoterms).
--
-- Delivery_Date: Cuándo se espera recibir la mercancía.
--
-- Line_Items: Un arreglo (array) de objetos, donde cada objeto representa un artículo de la orden de compra con los siguientes campos: Material_Code, Description, Quantity, Unit, Unit_Price, Net_Value.
--
-- Total_Tax: Valor total de los impuestos, si se especifica.
--
-- Total_Value: Valor total de la orden de compra incluyendo impuestos.
--
-- Formato de Salida
-- La salida DEBE ser EXCLUSIVAMENTE en formato JSON válido. No incluyas texto introductorio, explicaciones, ni formato Markdown (como ```json) alrededor de la respuesta. Devuelve únicamente la estructura JSON lista para ser analizada por un sistema (parse). Utiliza las claves definidas en la sección anterior.
--
-- Ejemplo de la estructura exacta que debes devolver:
-- {
--   "PO_Number": "4582134464",
--   "Date": "07/23/2026",
--   "Buyer": "Nestle de Colombia S.A",
--   "Vendor": "Land O Lakes Inc",
--   "Currency": "USD",
--   "Terms_of_Payment": "Due within 60 days of inv date",
--   "Terms_of_Delivery": "FCA Tulare_Visalia",
--   "Delivery_Date": "10/08/2026",
--   "Line_Items": [
--     {
--       "Material_Code": "41090005",
--       "Description": "Milk Skimmed Pwdr MH",
--       "Quantity": 18750,
--       "Unit": "kg",
--       "Unit_Price": 3562.04,
--       "Net_Value": 66788.25
--     }
--   ],
--   "Total_Tax": 0,
--   "Total_Value": 66788.25
-- }' WHERE `id` = 1;
--
-- (Quitar el "-- " del inicio de cada línea antes de ejecutarlo.)
