-- Исправленный SQL для сохранения send_to_form_approve
-- ✅ ИСПРАВЛЕНО: Ищем запись и по ID, и по payload->>'claim_id', чтобы избежать дубликатов
-- Используется в n8n workflow для сохранения данных формы подтверждения

-- Параметры:
-- $json.meta.claim_id - UUID заявки (может быть как ID записи, так и claim_id из payload)
-- $json - полные данные для сохранения в send_to_form_approve.draft

WITH 
-- ✅ ИСПРАВЛЕНО: Ищем запись и по ID, и по payload->>'claim_id'
claim_lookup AS (
  SELECT 
    c.id,
    c.payload
  FROM {{ $('set').first()?.json?.prefix ?? '' }}claims c
  WHERE c.id = '{{ $json.meta.claim_id }}'::uuid
     OR c.payload->>'claim_id' = '{{ $json.meta.claim_id }}'::text
  ORDER BY 
    CASE WHEN c.id = '{{ $json.meta.claim_id }}'::uuid THEN 1 ELSE 2 END,
    c.updated_at DESC
  LIMIT 1
),

base AS (
  SELECT coalesce(c.payload, '{}'::jsonb) AS p
  FROM claim_lookup c
),

entry AS (
  SELECT jsonb_build_object(
           'id',         gen_random_uuid(),
           'draft',      '{{ JSON.stringify($json) }}'::jsonb,
           'status',     'pending',
           'created_at', to_jsonb(now()),
           'created_by', 'miniapp'
         ) AS e
),

upd AS (
  SELECT
    jsonb_set(
      jsonb_set(
        p,
        '{send_to_form_approve_history}',
        coalesce((p->'send_to_form_approve_history')::jsonb, '[]'::jsonb) || e,
        true
      ),
      '{send_to_form_approve}',
      e,
      true
    ) AS new_payload
  FROM base b CROSS JOIN entry
)

UPDATE {{ $('set').first()?.json?.prefix ?? '' }}claims c
SET payload    = u.new_payload,
    updated_at = now()
FROM upd u, claim_lookup cl
WHERE c.id = cl.id
RETURNING
  c.id,
  c.payload->'send_to_form_approve'                             AS send_to_form_approve,
  jsonb_array_length(c.payload->'send_to_form_approve_history') AS history_length;

/*
============================================================================
ИСПРАВЛЕНИЯ (2025-11-24):
============================================================================

ПРОБЛЕМА: Запрос искал запись только по ID:
          WHERE id = '{{ $json.meta.claim_id }}'::uuid
          Если запись была создана с другим ID, но с тем же claim_id в payload,
          она не находилась и send_to_form_approve не сохранялся.

РЕШЕНИЕ:
1. Добавлен CTE claim_lookup - ищет запись и по ID, и по payload->>'claim_id':
   WHERE c.id = claim_id::uuid OR c.payload->>'claim_id' = claim_id::text
2. base теперь использует claim_lookup вместо прямого запроса
3. UPDATE использует claim_lookup.id вместо прямого claim_id::uuid
4. Это гарантирует, что всегда используется правильная запись

ИЗМЕНЕНИЯ:
- Добавлен claim_lookup CTE для поиска записи
- base теперь читает из claim_lookup вместо прямого запроса
- UPDATE использует claim_lookup.id вместо claim_id::uuid

============================================================================
ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ:
============================================================================

1. С claim_id как UUID (ID записи):
   $json.meta.claim_id = '0eb051ec-23a6-4e06-8b98-f02d20d35f68'
   → Найдет запись по ID

2. С claim_id как UUID из payload:
   $json.meta.claim_id = '0eb051ec-23a6-4e06-8b98-f02d20d35f68'
   → Если ID не совпадает, найдет по payload->>'claim_id'

============================================================================
*/


