- Step1Phone: добавлена обработка вставки телефона с автоматической очисткой от +7 и обрезкой до 10 цифр - Step3Payment: заменён Select на AutoComplete для выбора банка с автоподстановкой - generateConfirmationFormHTML: заменён select на input с datalist для автоподстановки банков в форме подтверждения - Добавлены скрытые поля bank_id для сохранения ID банка отдельно от названия - Добавлены файлы для проверки заявки 226564ce Улучшения UX: - Пользователь может вводить название банка вместо прокрутки длинного списка - Автоматическая фильтрация списка банков при вводе - Предупреждение при обрезке номера телефона при вставке
134 lines
5.0 KiB
Python
134 lines
5.0 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
Проверка заявки 226564ce-d7cf-48ee-a820-690e8f5ec8e5
|
||
"""
|
||
import asyncio
|
||
import asyncpg
|
||
import json
|
||
from datetime import datetime
|
||
|
||
POSTGRES_HOST = "147.45.189.234"
|
||
POSTGRES_PORT = 5432
|
||
POSTGRES_DB = "default_db"
|
||
POSTGRES_USER = "gen_user"
|
||
POSTGRES_PASSWORD = "2~~9_^kVsU?2\\S"
|
||
|
||
CLAIM_ID = "226564ce-d7cf-48ee-a820-690e8f5ec8e5"
|
||
|
||
async def check_claim():
|
||
conn = await asyncpg.connect(
|
||
host=POSTGRES_HOST,
|
||
port=POSTGRES_PORT,
|
||
database=POSTGRES_DB,
|
||
user=POSTGRES_USER,
|
||
password=POSTGRES_PASSWORD
|
||
)
|
||
|
||
try:
|
||
# 1. Проверяем заявку
|
||
claim_row = await conn.fetchrow("""
|
||
SELECT
|
||
id,
|
||
status_code,
|
||
created_at,
|
||
updated_at,
|
||
expires_at,
|
||
payload
|
||
FROM clpr_claims
|
||
WHERE id::text = $1 OR payload->>'claim_id' = $1
|
||
ORDER BY updated_at DESC
|
||
LIMIT 1
|
||
""", CLAIM_ID)
|
||
|
||
if not claim_row:
|
||
print(f"❌ Заявка {CLAIM_ID} не найдена!")
|
||
return
|
||
|
||
print(f"✅ Заявка найдена:")
|
||
print(f" ID: {claim_row['id']}")
|
||
print(f" Status: {claim_row['status_code']}")
|
||
print(f" Created: {claim_row['created_at']}")
|
||
print(f" Updated: {claim_row['updated_at']}")
|
||
print(f" Expires: {claim_row['expires_at']}")
|
||
|
||
payload = claim_row['payload'] if isinstance(claim_row['payload'], dict) else json.loads(claim_row['payload'])
|
||
|
||
# 2. Проверяем documents_meta
|
||
documents_meta = payload.get('documents_meta', [])
|
||
print(f"\n📋 documents_meta: {len(documents_meta)} записей")
|
||
|
||
if documents_meta:
|
||
# Проверяем на дубликаты
|
||
field_names = [doc.get('field_name') for doc in documents_meta]
|
||
duplicates = [name for name in field_names if field_names.count(name) > 1]
|
||
|
||
if duplicates:
|
||
print(f" ⚠️ Найдены дубликаты field_name: {set(duplicates)}")
|
||
|
||
for i, doc in enumerate(documents_meta):
|
||
print(f"\n {i+1}. field_name: {doc.get('field_name', 'N/A')}")
|
||
print(f" field_label: {doc.get('field_label', 'N/A')}")
|
||
print(f" file_id: {doc.get('file_id', 'N/A')}")
|
||
print(f" file_name: {doc.get('file_name', 'N/A')}")
|
||
print(f" uploaded_at: {doc.get('uploaded_at', 'N/A')}")
|
||
else:
|
||
print(" ⚠️ documents_meta пуст!")
|
||
|
||
# 3. Проверяем документы в таблице
|
||
claim_uuid = claim_row['id']
|
||
docs_rows = await conn.fetch("""
|
||
SELECT
|
||
id,
|
||
claim_id,
|
||
field_name,
|
||
file_id,
|
||
file_name,
|
||
original_file_name,
|
||
uploaded_at,
|
||
file_hash
|
||
FROM clpr_claim_documents
|
||
WHERE claim_id = $1
|
||
ORDER BY uploaded_at DESC
|
||
""", str(claim_uuid))
|
||
|
||
print(f"\n📄 Документы в clpr_claim_documents: {len(docs_rows)} записей")
|
||
for i, row in enumerate(docs_rows):
|
||
print(f"\n {i+1}. field_name: {row['field_name']}")
|
||
print(f" file_id: {row['file_id']}")
|
||
print(f" file_name: {row['file_name']}")
|
||
print(f" file_hash: {row['file_hash'] or 'NULL'}")
|
||
print(f" uploaded_at: {row['uploaded_at']}")
|
||
|
||
# 4. Сравниваем documents_meta и clpr_claim_documents
|
||
print(f"\n🔍 Сравнение:")
|
||
meta_field_names = set(doc.get('field_name') for doc in documents_meta)
|
||
table_field_names = set(row['field_name'] for row in docs_rows)
|
||
|
||
only_in_meta = meta_field_names - table_field_names
|
||
only_in_table = table_field_names - meta_field_names
|
||
|
||
if only_in_meta:
|
||
print(f" ⚠️ Только в documents_meta: {only_in_meta}")
|
||
if only_in_table:
|
||
print(f" ⚠️ Только в clpr_claim_documents: {only_in_table}")
|
||
if not only_in_meta and not only_in_table:
|
||
print(f" ✅ Все field_name совпадают")
|
||
|
||
# 5. Проверяем поле upload_description
|
||
upload_description = payload.get('upload_description')
|
||
print(f"\n📝 upload_description: {upload_description}")
|
||
|
||
# 6. Проверяем answers
|
||
answers = payload.get('answers', {})
|
||
print(f"\n💬 answers: {len(answers)} полей")
|
||
if answers:
|
||
for key, value in list(answers.items())[:5]: # Первые 5
|
||
print(f" {key}: {str(value)[:50]}...")
|
||
|
||
finally:
|
||
await conn.close()
|
||
|
||
if __name__ == "__main__":
|
||
asyncio.run(check_claim())
|
||
|