Files
aiform_prod/docs/SQL_SEND_TO_FORM_APPROVE_FIXED.sql
AI Assistant f82df1ebd7 fix: Add propertyName to caseJson for iframe form data
Problem:
- Form was empty because propertyName was not passed to iframe
- JavaScript code checked for injected.propertyName but it was undefined
- Only case (normalized) was passed, not the original propertyName

Solution:
- Added propertyName to caseJson object that gets embedded in HTML
- Now JavaScript code can access both case and propertyName
- This allows the form to properly display data from send_to_form_approve.draft

Files:
- frontend/src/components/form/generateConfirmationFormHTML.ts: Added propertyName to caseJson
2025-11-24 17:44:30 +03:00

103 lines
3.9 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- Исправленный 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'
============================================================================
*/