From bb02d4ed592bed891aaaebef8db8d2945a09015d Mon Sep 17 00:00:00 2001 From: Kincses Date: Sat, 14 Feb 2026 15:31:56 +0000 Subject: [PATCH] checkpoint: DB baseline reset (v10) with perfect column order for n8n. Integrated catalog_robot.py logic for structured data ingestion. Updated models and documentation for the Robot Ecosystem. --- .env | 9 +- N8N/data/config | 3 + N8N/data/n8nEventLog.log | 0 N8N/data/nodes/package.json | 5 + backend/app/models/__init__.py | 6 +- .../__pycache__/__init__.cpython-312.pyc | Bin 1760 -> 1790 bytes .../__pycache__/service.cpython-312.pyc | Bin 3520 -> 4987 bytes backend/app/models/service.py | 44 +- .../__pycache__/catalog_robot.cpython-312.pyc | Bin 12915 -> 14980 bytes backend/app/workers/catalog_robot.py | 227 +- .../versions/0adbe75a0b3f_complete_sync.py | 554 --- .../92616f34cdd3_baseline_and_staging_init.py | 253 ++ ...0adbe75a0b3f_complete_sync.cpython-312.pyc | Bin 49482 -> 0 bytes ...tem_parameters_primary_key.cpython-312.pyc | Bin 19772 -> 0 bytes ...dening_v2_slugs_and_tokens.cpython-312.pyc | Bin 23246 -> 0 bytes ...lation_and_security_tables.cpython-312.pyc | Bin 22221 -> 0 bytes ...6fe_fix_member_is_verified.cpython-312.pyc | Bin 23441 -> 0 bytes ...tity_and_hybrid_org_update.cpython-312.pyc | Bin 16587 -> 0 bytes ..._scope_and_finalize_asset_.cpython-312.pyc | Bin 22622 -> 0 bytes ...udit_and_moderation_fields.cpython-312.pyc | Bin 30092 -> 0 bytes ...add_is_verified_to_members.cpython-312.pyc | Bin 23744 -> 0 bytes ...penalty_system_and_wallet_.cpython-312.pyc | Bin 19072 -> 0 bytes ...dd_lang_and_region_to_user.cpython-312.pyc | Bin 19853 -> 0 bytes ...8370c73114b6_add_audit_log.cpython-312.pyc | Bin 19724 -> 0 bytes ...sset_system_v2_and_catalog.cpython-312.pyc | Bin 22258 -> 0 bytes ...ze_gamification_v1_5_clean.cpython-312.pyc | Bin 22117 -> 0 bytes ..._baseline_and_staging_init.cpython-312.pyc | Bin 0 -> 27985 bytes ...specialization_and_postgis.cpython-312.pyc | Bin 20278 -> 0 bytes ...fd8ac8_add_social_accounts.cpython-312.pyc | Bin 21392 -> 0 bytes ...org_to_asset_and_fix_slugs.cpython-312.pyc | Bin 19774 -> 0 bytes ...g_actions_for_dual_control.cpython-312.pyc | Bin 18292 -> 0 bytes ...te_system_parameters_table.cpython-312.pyc | Bin 20954 -> 0 bytes ...ade_audit_log_for_security.cpython-312.pyc | Bin 20881 -> 0 bytes .../versions/full_schema_backup.sql | 0 ...5_enforce_system_parameters_primary_key.py | 0 ..._security_hardening_v2_slugs_and_tokens.py | 0 ..._create_translation_and_security_tables.py | 0 .../143763d5d6fe_fix_member_is_verified.py | 0 ...e6f4f063_identity_and_hybrid_org_update.py | 0 ..._fix_identity_scope_and_finalize_asset_.py | 0 ...98e76c2fa36_audit_and_moderation_fields.py | 0 ...492849ee0b3a_add_is_verified_to_members.py | 0 ...197bfddfb4f_add_lang_and_region_to_user.py | 0 .../8370c73114b6_add_audit_log.py | 0 ...5b2a560e599_asset_system_v2_and_catalog.py | 0 ...386cba_finalize_gamification_v1_5_clean.py | 0 ..._add_service_specialization_and_postgis.py | 0 .../b14d05fd8ac8_add_social_accounts.py | 0 ..._add_current_org_to_asset_and_fix_slugs.py | 0 ...fd_add_pending_actions_for_dual_control.py | 0 ...996357ac_create_system_parameters_table.py | 0 ...ad1dbe37_upgrade_audit_log_for_security.py | 0 docker-compose.yml | 53 + docs/V01_gemini/00_README.md | 14 +- .../02_Architecture_System_Context.md | 13 +- .../04_Infrastructure_Docker_Stack.md | 16 +- .../20_Service_Finder_&_Trust_Engine.md | 25 +- docs/V01_gemini/22_ROBOT ÖKOSZISZTÉMA | 11 + docs/V01_gemini/_00_gemini_gem_kód | 2 +- full_schema_backup.sql | 0 full_schema_backup_2026-02-14.sql | 3437 +++++++++++++++++ n8n/data/config | 3 + n8n/data/crash.journal | 0 n8n/data/n8nEventLog.log | 219 ++ n8n/data/nodes/package.json | 5 + 65 files changed, 4213 insertions(+), 686 deletions(-) create mode 100644 N8N/data/config create mode 100644 N8N/data/n8nEventLog.log create mode 100644 N8N/data/nodes/package.json delete mode 100644 backend/migrations/versions/0adbe75a0b3f_complete_sync.py create mode 100644 backend/migrations/versions/92616f34cdd3_baseline_and_staging_init.py delete mode 100644 backend/migrations/versions/__pycache__/0adbe75a0b3f_complete_sync.cpython-312.pyc delete mode 100644 backend/migrations/versions/__pycache__/0fa011f29e35_enforce_system_parameters_primary_key.cpython-312.pyc delete mode 100644 backend/migrations/versions/__pycache__/12607787ed0b_security_hardening_v2_slugs_and_tokens.cpython-312.pyc delete mode 100644 backend/migrations/versions/__pycache__/134d92edd430_create_translation_and_security_tables.cpython-312.pyc delete mode 100644 backend/migrations/versions/__pycache__/143763d5d6fe_fix_member_is_verified.cpython-312.pyc delete mode 100644 backend/migrations/versions/__pycache__/25afe6f4f063_identity_and_hybrid_org_update.cpython-312.pyc delete mode 100644 backend/migrations/versions/__pycache__/2cfe9285eb9d_fix_identity_scope_and_finalize_asset_.cpython-312.pyc delete mode 100644 backend/migrations/versions/__pycache__/398e76c2fa36_audit_and_moderation_fields.cpython-312.pyc delete mode 100644 backend/migrations/versions/__pycache__/492849ee0b3a_add_is_verified_to_members.cpython-312.pyc delete mode 100644 backend/migrations/versions/__pycache__/5ca03588ce28_add_penalty_system_and_wallet_.cpython-312.pyc delete mode 100644 backend/migrations/versions/__pycache__/6197bfddfb4f_add_lang_and_region_to_user.cpython-312.pyc delete mode 100644 backend/migrations/versions/__pycache__/8370c73114b6_add_audit_log.cpython-312.pyc delete mode 100644 backend/migrations/versions/__pycache__/85b2a560e599_asset_system_v2_and_catalog.cpython-312.pyc delete mode 100644 backend/migrations/versions/__pycache__/8e06c5386cba_finalize_gamification_v1_5_clean.cpython-312.pyc create mode 100644 backend/migrations/versions/__pycache__/92616f34cdd3_baseline_and_staging_init.cpython-312.pyc delete mode 100644 backend/migrations/versions/__pycache__/9b20430f0ebb_add_service_specialization_and_postgis.cpython-312.pyc delete mode 100644 backend/migrations/versions/__pycache__/b14d05fd8ac8_add_social_accounts.cpython-312.pyc delete mode 100644 backend/migrations/versions/__pycache__/b69f11d8b825_add_current_org_to_asset_and_fix_slugs.cpython-312.pyc delete mode 100644 backend/migrations/versions/__pycache__/bc5669f12ffd_add_pending_actions_for_dual_control.cpython-312.pyc delete mode 100644 backend/migrations/versions/__pycache__/f2d8996357ac_create_system_parameters_table.cpython-312.pyc delete mode 100644 backend/migrations/versions/__pycache__/ffffad1dbe37_upgrade_audit_log_for_security.cpython-312.pyc create mode 100644 backend/migrations/versions/full_schema_backup.sql rename backend/migrations/{versions => versions_backup}/0fa011f29e35_enforce_system_parameters_primary_key.py (100%) rename backend/migrations/{versions => versions_backup}/12607787ed0b_security_hardening_v2_slugs_and_tokens.py (100%) rename backend/migrations/{versions => versions_backup}/134d92edd430_create_translation_and_security_tables.py (100%) rename backend/migrations/{versions => versions_backup}/143763d5d6fe_fix_member_is_verified.py (100%) rename backend/migrations/{versions => versions_backup}/25afe6f4f063_identity_and_hybrid_org_update.py (100%) rename backend/migrations/{versions => versions_backup}/2cfe9285eb9d_fix_identity_scope_and_finalize_asset_.py (100%) rename backend/migrations/{versions => versions_backup}/398e76c2fa36_audit_and_moderation_fields.py (100%) rename backend/migrations/{versions => versions_backup}/492849ee0b3a_add_is_verified_to_members.py (100%) rename backend/migrations/{versions => versions_backup}/6197bfddfb4f_add_lang_and_region_to_user.py (100%) rename backend/migrations/{versions => versions_backup}/8370c73114b6_add_audit_log.py (100%) rename backend/migrations/{versions => versions_backup}/85b2a560e599_asset_system_v2_and_catalog.py (100%) rename backend/migrations/{versions => versions_backup}/8e06c5386cba_finalize_gamification_v1_5_clean.py (100%) rename backend/migrations/{versions => versions_backup}/9b20430f0ebb_add_service_specialization_and_postgis.py (100%) rename backend/migrations/{versions => versions_backup}/b14d05fd8ac8_add_social_accounts.py (100%) rename backend/migrations/{versions => versions_backup}/b69f11d8b825_add_current_org_to_asset_and_fix_slugs.py (100%) rename backend/migrations/{versions => versions_backup}/bc5669f12ffd_add_pending_actions_for_dual_control.py (100%) rename backend/migrations/{versions => versions_backup}/f2d8996357ac_create_system_parameters_table.py (100%) rename backend/migrations/{versions => versions_backup}/ffffad1dbe37_upgrade_audit_log_for_security.py (100%) create mode 100644 full_schema_backup.sql create mode 100644 full_schema_backup_2026-02-14.sql create mode 100644 n8n/data/config create mode 100644 n8n/data/crash.journal create mode 100644 n8n/data/n8nEventLog.log create mode 100644 n8n/data/nodes/package.json diff --git a/.env b/.env index 536ae28..9d78a65 100755 --- a/.env +++ b/.env @@ -92,9 +92,16 @@ MINIO_ROOT_PASSWORD='MiskociA74' MINIO_ACCESS_KEY=kincses MINIO_SECRET_KEY='MiskociA74' +# --- n8n CONFIG --- +N8N_DB_PASSWORD=MiskociA74 +# Az n8n-en belül a központi DB elérése: +# Host: shared-postgres +# User: service_finder_app # --- Frontend --- FRONTEND_BASE_URL=https://dev.profibot.hu/docs -GOOGLE_API_KEY=AIzaSyB3-Uo6qFBNi83hK01uoaUARtYHxERbtXg \ No newline at end of file +GOOGLE_API_KEY=AIzaSyB3-Uo6qFBNi83hK01uoaUARtYHxERbtXg + +RDW_APP_TOKEN=kSMUn0tvnmoM6TMSegLpFvKI8 \ No newline at end of file diff --git a/N8N/data/config b/N8N/data/config new file mode 100644 index 0000000..f334cc5 --- /dev/null +++ b/N8N/data/config @@ -0,0 +1,3 @@ +{ + "encryptionKey": "54T2Q0sTamS0GDOb8vyTtOQXBJxq3d0/" +} \ No newline at end of file diff --git a/N8N/data/n8nEventLog.log b/N8N/data/n8nEventLog.log new file mode 100644 index 0000000..e69de29 diff --git a/N8N/data/nodes/package.json b/N8N/data/nodes/package.json new file mode 100644 index 0000000..9e96546 --- /dev/null +++ b/N8N/data/nodes/package.json @@ -0,0 +1,5 @@ +{ + "name": "installed-nodes", + "private": true, + "dependencies": {} +} \ No newline at end of file diff --git a/backend/app/models/__init__.py b/backend/app/models/__init__.py index da43d41..b03dbb0 100755 --- a/backend/app/models/__init__.py +++ b/backend/app/models/__init__.py @@ -14,7 +14,7 @@ from .asset import ( ) # Szerviz és Szakértelem (ÚJ) -from .service import ServiceProfile, ExpertiseTag, ServiceExpertise +from .service import ServiceProfile, ExpertiseTag, ServiceExpertise, ServiceStaging # Földrajzi adatok és Címek from .address import Address, GeoPostalCode, GeoStreet, GeoStreetType @@ -45,11 +45,13 @@ __all__ = [ "Organization", "OrganizationMember", "Asset", "AssetCatalog", "AssetCost", "AssetEvent", "AssetFinancials", "AssetTelemetry", "AssetReview", "ExchangeRate", - "ServiceProfile", "ExpertiseTag", "ServiceExpertise", # <--- HOZZÁADVA "Address", "GeoPostalCode", "GeoStreet", "GeoStreetType", "PointRule", "LevelConfig", "UserStats", "Badge", "UserBadge", "Rating", "PointsLedger", "SystemParameter", "Document", "Translation", "PendingAction", "SubscriptionTier", "OrganizationSubscription", "CreditTransaction", "ServiceSpecialty", "AuditLog", "VehicleOwnership", + # --- SZERVIZ MODUL (Tisztítva) --- + "ServiceProfile", "ExpertiseTag", "ServiceExpertise", "ServiceStaging", + # --- ALIASOK --- "Vehicle", "UserVehicle", "VehicleCatalog", "ServiceRecord" ] \ No newline at end of file diff --git a/backend/app/models/__pycache__/__init__.cpython-312.pyc b/backend/app/models/__pycache__/__init__.cpython-312.pyc index 37a7944235bf022c734ea81e89c467de2c772551..655b2d54fb8eaa29cc943a02a44f516da9a8f142 100644 GIT binary patch delta 487 zcmW-c%}(1u6ooy;#5BPv3nUs6QXoH2a1w{`(?U0>Ql)OHRzY3d4YKUP9W>V#*QQd` z1!CDsl^V^us>CbwF}mz7t8TmM8z4L$X^zf(=iJfEU+3O&emhRt$k*2|-^Fz5)R;Tn z`h0^ms4*inLtCz59qQPC2Cl&xHlbPY1^E=$VI4PM12_WHbJd#_u z4cmn;%V)R)JB6>vU39@M{G#k(ANn|e0eax!5QaG)nV}>1a0DaVhy9{hl?QkThs@v( z9Oe5tufhwy1jmsPKE7jcqTaE8%u>guw=}DcIeiiVA7_3f;^^0bR($AQcgM|3GOd=7e_tx@g zW`7iEme7QD^O)S?l9UJ6B(e$hH0x^_Xz{cR)k^7vy;9@S!TcHfV~o|e(wlO%V&2+x Hnin1b{*Qn^ delta 482 zcmW-cIZFdU7>0L}HTP&5HJ4{@V-BP71QCzI#!4){CWPHhT$nG5vuhCqMXW7kN(;f( zN-X^eR<@~Z{S)HO49vqj&-V_@{LvpuzbK7q{(2^l_Tdvvlgd;1=8kA)zznlAW*~!E z$YKt1I0tjeN7y_rzydD9A}+xaF2geBA&&(pU=fO{6J;eVLs{h*t6&wXD#zIh)}W?x zf~{g5>ezq=Hlc|vXem!wa}C?j#&uX%Vv=oO2RcNvC~W$B%bJ93D+xOT&768Auq)2V zFA0kMKK;!}UAjl(_Do9yQJR?HaI4Flfo<@TFL+s^B2ks|@TKi~4j=IqscKS1T+6uTwm0JH-E}!=Xi=X{ g8C#+g+9QYJD%6=cCg0kTcnh7z67j%&m>>9se_tDStpET3 diff --git a/backend/app/models/__pycache__/service.cpython-312.pyc b/backend/app/models/__pycache__/service.cpython-312.pyc index d6852212334b5460ebe28d8f4042e49626121d7b..8c68f66c38f517b0e66325fdf5dd4802fe4f6bed 100644 GIT binary patch delta 1802 zcmaJ>O-vhC5Z*O5tpD*3|4I6&z~DkkLVzY!6=-XI0)$9~&aYT!_&;`8(rVFTDWme@;u@sFKybcK?27`+gAB-{a3$5 zYxt5jYQ6hjD>x5=0Bdz!^9vb8?J8Lek3!ipWig4~6SFCmA*sY0f|^XzwTw(lJZr}| z3E;1T4B(A1S(7v#LXg8f`YajEC+6Bkwe2?~xV}+m5-g34Nbt4f| zW8(-H5s*9+_P!zm?K5YjvlnQFovtiVrY7N1PNmR;Qa#$A&Igqg(1sLl)!3yv?Gu6I zB%5U05vrH(v~aW*es;;R%>x&nQw&#?;rx%W?9#CVPZSlXGX7Uo<$Nw0G=&=g8zs+C-aFoERZUfi`lDTw>pQaG zK!5cXn@zPkDX$wXFGDI?wTRk=?|FmVY2!bFrrHM1y-i*G_) zj*xdrqWoo=E|R3Gl61Mih$J#Go=Gi>r2EDPv(a912fP`jm)uqpVlSB}7uJ-uav>ci z${J;KiKb)-H?t7Q{Y*Sg7QwA7Q1!bFrCgdP<&r{{#Z*!%7gFVd0ydNAV!0HjIT^Dc z#PDK6LtQbYQW$H5!dMf)9BT#~3tJ39&ZbggJVnh$J-~@#cI&}EunP0+E;?=@gb+Fq zUISROcP&v_g6g{%K_`Bz%xt>c>#&>&UwB2EA@^9LqiF*$tg@Jec ziKMz})G8{YR5e@+nXE!%ayA{O%y8X<DPtL_}kN5BrWJZ{{wJZUXTPdjw~aDHmv>Dvfx z2DF}{bvL3rujM2A?!d;_<`r$K*rB`o@?-lD6Wa1Wd84T6fr0!q*qfo^fF8J%p9aN- zw#}hpL=Rrh-`t1OhPEQQE1VzQ_XKn6ceW(m(~}DyCX^kzZ|b3YvNE~xmcr*W#r0FaIls*bYTn<;(P{|qq%%@B kMXxgkAvi3R+u8&7X!8rs#b11JuA86c*XRD=@ZXgF7n19^umAu6 delta 428 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 diff --git a/backend/app/workers/catalog_robot.py b/backend/app/workers/catalog_robot.py index 7151f09..d86e232 100644 --- a/backend/app/workers/catalog_robot.py +++ b/backend/app/workers/catalog_robot.py @@ -3,196 +3,177 @@ import httpx import logging import json import re +import os +import datetime from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select, func, or_, text from app.db.session import SessionLocal from app.models.asset import AssetCatalog logging.basicConfig(level=logging.INFO) -logger = logging.getLogger("Robot1-Master-Fleet-DeepDive") +logger = logging.getLogger("Robot1-Ghost-Commander-v1.1.9") class CatalogScout: """ - Robot 1: Univerzális Járműkatalógus Építő és Audit Robot. - Logika: EU-Elsődlegesség (CarQuery) -> US-Kiegészítés (NHTSA). - Kategóriák: Car, Motorcycle, Bus, Truck, Trailer, ATV, Marine, Aerial. - Szekvenciák: - 1. Deep Dive (Motorvariánsok gyűjtése) - 2. Audit (Hiányos adatok pótlása) + Robot 1.1.9: Environment Master. + - .env alapú hitelesítés (RDW App Token) + - Prioritás: RDW (EU) -> NHTSA (US) -> CarQuery (Ban-figyeléssel) + - 2.5s lekérési frissítés a biztonságért """ CQ_URL = "https://www.carqueryapi.com/api/0.3/" NHTSA_BASE = "https://vpic.nhtsa.dot.gov/api/vehicles/GetModelsForMakeYear/make/" - + RDW_URL = "https://opendata.rdw.nl/resource/ed7h-m8uz.json" + + # Adatok beolvasása környezeti változókból + RDW_TOKEN = os.getenv("RDW_APP_TOKEN") + HEADERS = { - "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", - "Accept": "application/json" + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", + "Accept": "application/json", + "X-App-Token": RDW_TOKEN } + + # BAN FIGYELŐ ÁLLAPOT + cq_banned_until = None - # --- KATEGÓRIA DEFINÍCIÓK (Szigorú flotta-szétválasztás) --- + # --- KATEGÓRIA DEFINÍCIÓK (Szigorúan az eredeti lista szerint) --- MOTO_MAKES = ['ducati', 'ktm', 'triumph', 'aprilia', 'benelli', 'vespa', 'simson', 'mz', 'etz', 'jawa', 'husqvarna', 'gasgas', 'sherco'] MARINE_IDS = ['DF', 'DT', 'OUTBOARD', 'MARINE', 'JET SKI', 'SEA-DOO', 'WAVERUNNER', 'YACHT', 'BOAT'] AERIAL_IDS = ['CESSNA', 'PIPER', 'AIRBUS', 'BOEING', 'HELICOPTER', 'AIRCRAFT', 'BEECHCRAFT', 'EMBRAER', 'DRONE'] ATV_IDS = ['LT-', 'LTZ', 'LTR', 'KINGQUAD', 'QUAD', 'POLARIS', 'CAN-AM', 'MULE', 'RZR', 'ARCTIC CAT', 'UTV', 'SIDE-BY-SIDE'] - - # Versenygépek (Motorkerékpárként, üzemóra alapú szervizhez) RACING_IDS = ['RM-Z', 'KX', 'CRF', 'YZ', 'SX-F', 'XC-W', 'RM125', 'RM250', 'CR125', 'CR250', 'MC450'] MOTO_KEYWORDS = ['CBR', 'GSX', 'YZF', 'NINJA', 'Z1000', 'DR-Z', 'MT-0', 'V-STROM', 'ADVENTURE', 'SCRAMBLER', 'CBF', 'VFR', 'HAYABUSA'] - - # Flotta kategóriák szétválasztása BUS_KEYWORDS = ['BUS', 'COACH', 'INTERCITY', 'SHUTTLE', 'TRANSIT'] TRUCK_KEYWORDS = ['TRUCK', 'SEMI', 'TRACTOR', 'HAULER', 'ACTROS', 'MAN', 'SCANIA', 'IVECO', 'VOLVO FH', 'DAF', 'TGX', 'RENAULT T'] TRAILER_KEYWORDS = ['TRAILER', 'SEMITRAILER', 'PÓTKOCSI', 'UTÁNFUTÓ', 'SCHMITZ', 'KRONE', 'KÖGEL'] + FALLBACK_BRANDS = ['Audi', 'BMW', 'Mercedes-Benz', 'Volkswagen', 'Toyota', 'Ford', 'Honda', 'Hyundai', 'Kia', 'Mazda', 'Nissan', 'Volvo', 'Skoda', 'Opel', 'Tesla', 'Lexus', 'Porsche', 'Dacia', 'Suzuki'] + @classmethod def identify_class(cls, make: str, model: str) -> str: - """Kategória meghatározás flottakezelési szempontok alapján.""" - m_full = f"{make} {model}".upper() - + m_full = f"{str(make)} {str(model)}".upper() if any(x in m_full for x in cls.AERIAL_IDS): return "aerial" if any(x in m_full for x in cls.MARINE_IDS): return "marine" if any(x in m_full for x in cls.ATV_IDS): return "atv" - - # Motorkerékpárok (Versenygépekkel együtt) - if any(x in m_full for x in cls.RACING_IDS) or make.lower() in cls.MOTO_MAKES: + if any(x in m_full or str(make).lower() in cls.MOTO_MAKES for x in (cls.RACING_IDS + cls.MOTO_KEYWORDS)): return "motorcycle" - if any(x in m_full for x in cls.MOTO_KEYWORDS): - return "motorcycle" - - # Flotta (Busz vs Teherautó vs Pótkocsi) if any(x in m_full for x in cls.BUS_KEYWORDS): return "bus" if any(x in m_full for x in cls.TRUCK_KEYWORDS): return "truck" if any(x in m_full for x in cls.TRAILER_KEYWORDS): return "trailer" - return "car" @classmethod async def fetch_api(cls, url, params=None, is_cq=False): - """API hívó JSONP tisztítással és sebességkorlátozással.""" - async with httpx.AsyncClient(headers=cls.HEADERS) as client: + if is_cq and cls.cq_banned_until and datetime.datetime.now() < cls.cq_banned_until: + return "SILENT_SKIP" + + async with httpx.AsyncClient(headers=cls.HEADERS, follow_redirects=True) as client: try: - # 1.5s várakozás a Free API limitjei miatt - await asyncio.sleep(1.5) + # CarQuery: 5.0mp szünet (Hard Ban ellen), többi: 2.5mp (User kérése szerint) + await asyncio.sleep(5.0 if is_cq else 2.5) resp = await client.get(url, params=params, timeout=35) - if resp.status_code != 200: return None + if resp.status_code == 403 or "denied" in resp.text.lower(): + logger.error("🚫 CarQuery BAN! 2 óra kényszerpihenő aktiválva.") + cls.cq_banned_until = datetime.datetime.now() + datetime.timedelta(hours=2) + return "DENIED" + + if resp.status_code != 200: return None content = resp.text.strip() if is_cq: - # Robusztusabb JSONP tisztítás regexszel match = re.search(r'(\{.*\}|\[.*\])', content, re.DOTALL) - if match: - content = match.group(0) - elif "(" in content and ")" in content: - content = content[content.find("(") + 1 : content.rfind(")")] - + if match: content = match.group(0) return json.loads(content) except Exception as e: - logger.error(f"❌ API hiba: {e} | URL: {url}") + logger.error(f"❌ API hiba: {e}") return None @classmethod - async def enrich_missing_data(cls): - """ - SEQUENCE 2: Audit Robot. - Keresi a hiányos technikai adatokat és próbálja dúsítani őket. - """ - logger.info("🔍 Audit szekvencia indítása (hiányos adatok keresése)...") - async with SessionLocal() as db: - # Keressük azokat a rekordokat, ahol hiányzik a köbcenti vagy a teljesítmény - stmt = select(AssetCatalog).where( - or_( - AssetCatalog.factory_data == text("'{}'::jsonb"), - AssetCatalog.engine_variant == 'Standard', - AssetCatalog.fuel_type == None - ) - ).limit(100) # Egyszerre csak 100-at nézünk + async def is_model_processed(cls, db: AsyncSession, make: str, model: str, year: int): + stmt = select(AssetCatalog.id).where(AssetCatalog.make == make, AssetCatalog.model == model, AssetCatalog.year_from == year).limit(1) + result = await db.execute(stmt) + return result.scalars().first() is not None + + @classmethod + async def auto_heal(cls, db: AsyncSession, cq_active: bool): + logger.info("🛠️ Auto-Heal: Hiányos rekordok dúsítása...") + stmt = select(AssetCatalog).where(AssetCatalog.engine_variant == 'Standard', AssetCatalog.fuel_type == 'Unknown').limit(20) + results = await db.execute(stmt) + for r in results.scalars().all(): + # 1. RDW javítás (Holland Open Data + Token) + rdw = await cls.fetch_api(cls.RDW_URL, {"merk": r.make.upper(), "handelsbenaming": r.model.upper(), "$limit": 1}) + if rdw and isinstance(rdw, list) and len(rdw) > 0: + item = rdw[0] + r.fuel_type = item.get("brandstof_omschrijving", "Unknown") + r.factory_data.update({"hp": item.get("netto_maximum_vermogen"), "cc": item.get("cilinderinhoud"), "source": "heal_v1.9_rdw"}) + continue - results = await db.execute(stmt) - incomplete_records = results.scalars().all() - - for record in incomplete_records: - logger.info(f"🛠 Audit: {record.make} {record.model} ({record.year_from}) dúsítása...") - pass + # 2. CQ javítás (Ha nem vagyunk kitiltva) + if cq_active: + t_data = await cls.fetch_api(cls.CQ_URL, {"cmd": "getTrims", "make": r.make.lower(), "model": r.model, "year": r.year_from}, is_cq=True) + if t_data and t_data not in ["DENIED", "SILENT_SKIP"] and "Trims" in t_data: + t = t_data["Trims"][0] + r.engine_variant = t.get("model_trim") or "Standard" + r.factory_data.update({"hp": t.get("model_engine_power_ps"), "cc": t.get("model_engine_cc"), "source": "heal_v1.9_cq"}) + await db.commit() @classmethod async def run(cls): - logger.info("🤖 Robot 1: EU-Elsődlegességű Deep Dive szinkron indítása...") - - # 2026-tól visszafelé haladunk (Modern flották prioritása) - for year in range(2026, 1989, -1): - logger.info(f"📅 Feldolgozás alatt: {year} évjárat") - - makes_data = await cls.fetch_api(cls.CQ_URL, {"cmd": "getMakes", "year": year}, is_cq=True) - if not makes_data or "Makes" not in makes_data: continue + logger.info(f"🤖 Robot 1.9.2 indítása (RDW Token: {'Aktív' if cls.RDW_TOKEN else 'HIÁNYZIK!'})") - for make_entry in makes_data.get("Makes", []): - m_id = make_entry["make_id"] - m_display = make_entry["make_display"] - - # MODELL GYŰJTÉS: EU + US fúzió + for year in range(2026, 1989, -1): + logger.info(f"📅 --- CIKLUS: {year} ---") + + cq_now_active = not (cls.cq_banned_until and datetime.datetime.now() < cls.cq_banned_until) + + async with SessionLocal() as db: + await cls.auto_heal(db, cq_now_active) + + # 1. MÁRKALISTA (NHTSA + Fallback) + makes_to_process = [] + for b in cls.FALLBACK_BRANDS: + makes_to_process.append({"id": b.lower(), "display": b}) + + for make in makes_to_process: models_to_fetch = set() - # 🇪🇺 EU Forrás - cq_models = await cls.fetch_api(cls.CQ_URL, {"cmd": "getModels", "make": m_id, "year": year}, is_cq=True) - if cq_models and cq_models.get("Models"): - for m in cq_models["Models"]: models_to_fetch.add(m["model_name"]) - - # 🇺🇸 US Forrás kiegészítés - n_data = await cls.fetch_api(f"{cls.NHTSA_BASE}{m_display}/modelyear/{year}?format=json") + # A: NHTSA (US) + n_data = await cls.fetch_api(f"{cls.NHTSA_BASE}{make['display']}/modelyear/{year}?format=json") if n_data and n_data.get("Results"): for r in n_data["Results"]: models_to_fetch.add(r["Model_Name"]) + # B: RDW (Holland) - Tokennel védve + rdw_m = await cls.fetch_api(cls.RDW_URL, {"merk": make['display'].upper(), "$limit": 30}) + if rdw_m and isinstance(rdw_m, list): + for r in rdw_m: models_to_fetch.add(r.get("handelsbenaming")) + async with SessionLocal() as db: for model_name in models_to_fetch: - # DEEP DIVE: Motorvariánsok (Trims) lekérése - trims_data = await cls.fetch_api(cls.CQ_URL, { - "cmd": "getTrims", "make": m_id, "model": model_name, "year": year - }, is_cq=True) + if not model_name or await cls.is_model_processed(db, make["display"], model_name, year): + continue + + # C: CarQuery (Csak ha nincs ban) + found_trims = [] + t_data = await cls.fetch_api(cls.CQ_URL, {"cmd": "getTrims", "make": make["id"], "model": model_name, "year": year}, is_cq=True) + if t_data and t_data not in ["DENIED", "SILENT_SKIP"] and "Trims" in t_data: + found_trims = t_data["Trims"] - found_trims = trims_data.get("Trims", []) if trims_data else [] - - # Ha nincs trim adat, egy standard sor mindenképpen kell if not found_trims: - found_trims = [{"model_trim": "Standard", "model_engine_fuel": None}] + found_trims = [{"model_trim": "Standard", "model_engine_fuel": "Unknown"}] for t in found_trims: - variant = t.get("model_trim") or "Standard" - fuel = t.get("model_engine_fuel") or "Unknown" - v_class = cls.identify_class(m_display, model_name) - - # Szigorú duplikáció-ellenőrzés (UniqueConstraint alapú lekérdezés) - stmt = select(AssetCatalog).where( - AssetCatalog.make == m_display, - AssetCatalog.model == model_name, - AssetCatalog.year_from == year, - AssetCatalog.engine_variant == variant, - AssetCatalog.fuel_type == fuel - ) - result = await db.execute(stmt) - if not result.scalars().first(): - db.add(AssetCatalog( - make=m_display, - model=model_name, - year_from=year, - engine_variant=variant, - fuel_type=fuel, - vehicle_class=v_class, - factory_data={ - "cc": t.get("model_engine_cc"), - "hp": t.get("model_engine_power_ps"), - "cylinders": t.get("model_engine_cyl"), - "transmission": t.get("model_transmission_type"), - "source": "master_v7_deep_dive", - "sync_date": str(func.now()) - } - )) - - # JAVÍTÁS: Márkánkénti véglegesítés az adatbázisban a session-ön belül + db.add(AssetCatalog( + make=make["display"], model=model_name, year_from=year, + engine_variant=t.get("model_trim") or "Standard", + fuel_type=t.get("model_engine_fuel") or "Unknown", + vehicle_class=cls.identify_class(make["display"], model_name), + factory_data={ + "hp": t.get("model_engine_power_ps"), "cc": t.get("model_engine_cc"), + "source": "ghost_v1.9.2", "sync_date": str(datetime.datetime.now()) + } + )) await db.commit() - logger.info(f"✅ {m_display} ({year}) összes variánsa rögzítve.") - - # SEQUENCE 2: Miután végeztünk a fő listával, nézzük meg a hiányosakat - await cls.enrich_missing_data() if __name__ == "__main__": asyncio.run(CatalogScout.run()) \ No newline at end of file diff --git a/backend/migrations/versions/0adbe75a0b3f_complete_sync.py b/backend/migrations/versions/0adbe75a0b3f_complete_sync.py deleted file mode 100644 index 68163e6..0000000 --- a/backend/migrations/versions/0adbe75a0b3f_complete_sync.py +++ /dev/null @@ -1,554 +0,0 @@ -"""complete_sync - -Revision ID: 0adbe75a0b3f -Revises: -Create Date: 2026-02-09 17:49:12.955967 - -""" -from typing import Sequence, Union - -from alembic import op -import sqlalchemy as sa -from sqlalchemy.dialects import postgresql - -# revision identifiers, used by Alembic. -revision: str = '0adbe75a0b3f' -down_revision: Union[str, Sequence[str], None] = None -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade() -> None: - """Upgrade schema.""" - # ### commands auto generated by Alembic - please adjust! ### - op.create_table('badges', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('name', sa.String(), nullable=False), - sa.Column('description', sa.String(), nullable=False), - sa.Column('icon_url', sa.String(), nullable=True), - sa.PrimaryKeyConstraint('id'), - sa.UniqueConstraint('name'), - schema='data' - ) - op.create_index(op.f('ix_data_badges_id'), 'badges', ['id'], unique=False, schema='data') - op.create_table('exchange_rates', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('base_currency', sa.String(length=3), nullable=True), - sa.Column('target_currency', sa.String(length=3), nullable=True), - sa.Column('rate', sa.Numeric(precision=18, scale=6), nullable=True), - sa.Column('rate_date', sa.DateTime(), nullable=True), - sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), - sa.PrimaryKeyConstraint('id'), - schema='data' - ) - op.create_table('geo_postal_codes', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('country_code', sa.String(length=5), nullable=True), - sa.Column('zip_code', sa.String(length=10), nullable=False), - sa.Column('city', sa.String(length=100), nullable=False), - sa.PrimaryKeyConstraint('id'), - schema='data' - ) - op.create_table('geo_street_types', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('name', sa.String(length=50), nullable=False), - sa.PrimaryKeyConstraint('id'), - sa.UniqueConstraint('name'), - schema='data' - ) - op.create_table('level_configs', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('level_number', sa.Integer(), nullable=False), - sa.Column('min_points', sa.Integer(), nullable=False), - sa.Column('rank_name', sa.String(), nullable=False), - sa.PrimaryKeyConstraint('id'), - sa.UniqueConstraint('level_number'), - schema='data' - ) - op.create_index(op.f('ix_data_level_configs_id'), 'level_configs', ['id'], unique=False, schema='data') - op.create_table('point_rules', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('action_key', sa.String(), nullable=False), - sa.Column('points', sa.Integer(), nullable=False), - sa.Column('description', sa.String(), nullable=True), - sa.Column('is_active', sa.Boolean(), nullable=False), - sa.PrimaryKeyConstraint('id'), - schema='data' - ) - op.create_index(op.f('ix_data_point_rules_action_key'), 'point_rules', ['action_key'], unique=True, schema='data') - op.create_index(op.f('ix_data_point_rules_id'), 'point_rules', ['id'], unique=False, schema='data') - op.create_table('regional_settings', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('country_code', sa.String(), nullable=False), - sa.Column('currency', sa.String(), nullable=False), - sa.Column('is_active', sa.Boolean(), nullable=False), - sa.PrimaryKeyConstraint('id'), - sa.UniqueConstraint('country_code'), - schema='data' - ) - op.create_index(op.f('ix_data_regional_settings_id'), 'regional_settings', ['id'], unique=False, schema='data') - op.create_table('service_specialties', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('parent_id', sa.Integer(), nullable=True), - sa.Column('name', sa.String(), nullable=False), - sa.Column('slug', sa.String(), nullable=True), - sa.ForeignKeyConstraint(['parent_id'], ['data.service_specialties.id'], ), - sa.PrimaryKeyConstraint('id'), - sa.UniqueConstraint('slug'), - schema='data' - ) - op.create_table('subscription_tiers', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('name', sa.String(), nullable=True), - sa.Column('rules', sa.JSON(), nullable=True), - sa.Column('is_custom', sa.Boolean(), nullable=True), - sa.PrimaryKeyConstraint('id'), - sa.UniqueConstraint('name'), - schema='data' - ) - op.create_table('system_parameters', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('key', sa.String(length=50), nullable=True), - sa.Column('value', sa.JSON(), nullable=True), - sa.Column('is_active', sa.Boolean(), nullable=True), - sa.Column('description', sa.String(), nullable=True), - sa.PrimaryKeyConstraint('id'), - schema='data' - ) - op.create_index(op.f('ix_data_system_parameters_id'), 'system_parameters', ['id'], unique=False, schema='data') - op.create_index(op.f('ix_data_system_parameters_key'), 'system_parameters', ['key'], unique=True, schema='data') - op.create_table('vehicle_catalog', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('make', sa.String(), nullable=False), - sa.Column('model', sa.String(), nullable=False), - sa.Column('generation', sa.String(), nullable=True), - sa.Column('year_from', sa.Integer(), nullable=True), - sa.Column('year_to', sa.Integer(), nullable=True), - sa.Column('vehicle_class', sa.String(), nullable=True), - sa.Column('fuel_type', sa.String(), nullable=True), - sa.Column('engine_code', sa.String(), nullable=True), - sa.Column('factory_data', sa.JSON(), server_default=sa.text("'{}'::jsonb"), nullable=True), - sa.PrimaryKeyConstraint('id'), - schema='data' - ) - op.create_index(op.f('ix_data_vehicle_catalog_id'), 'vehicle_catalog', ['id'], unique=False, schema='data') - op.create_index(op.f('ix_data_vehicle_catalog_make'), 'vehicle_catalog', ['make'], unique=False, schema='data') - op.create_index(op.f('ix_data_vehicle_catalog_model'), 'vehicle_catalog', ['model'], unique=False, schema='data') - op.create_table('addresses', - sa.Column('id', sa.UUID(), nullable=False), - sa.Column('postal_code_id', sa.Integer(), nullable=True), - sa.Column('street_name', sa.String(length=200), nullable=False), - sa.Column('street_type', sa.String(length=50), nullable=False), - sa.Column('house_number', sa.String(length=50), nullable=False), - sa.Column('stairwell', sa.String(length=20), nullable=True), - sa.Column('floor', sa.String(length=20), nullable=True), - sa.Column('door', sa.String(length=20), nullable=True), - sa.Column('parcel_id', sa.String(length=50), nullable=True), - sa.Column('full_address_text', sa.Text(), nullable=True), - sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), - sa.ForeignKeyConstraint(['postal_code_id'], ['data.geo_postal_codes.id'], ), - sa.PrimaryKeyConstraint('id'), - schema='data' - ) - op.create_table('assets', - sa.Column('id', sa.UUID(), nullable=False), - sa.Column('vin', sa.String(length=17), nullable=False), - sa.Column('license_plate', sa.String(length=20), nullable=True), - sa.Column('name', sa.String(), nullable=True), - sa.Column('year_of_manufacture', sa.Integer(), nullable=True), - sa.Column('catalog_id', sa.Integer(), nullable=True), - sa.Column('is_verified', sa.Boolean(), nullable=True), - sa.Column('status', sa.String(length=20), nullable=True), - sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), - sa.Column('updated_at', sa.DateTime(timezone=True), nullable=True), - sa.ForeignKeyConstraint(['catalog_id'], ['data.vehicle_catalog.id'], ), - sa.PrimaryKeyConstraint('id'), - schema='data' - ) - op.create_index(op.f('ix_data_assets_license_plate'), 'assets', ['license_plate'], unique=False, schema='data') - op.create_index(op.f('ix_data_assets_vin'), 'assets', ['vin'], unique=True, schema='data') - op.create_table('geo_streets', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('postal_code_id', sa.Integer(), nullable=True), - sa.Column('name', sa.String(length=200), nullable=False), - sa.ForeignKeyConstraint(['postal_code_id'], ['data.geo_postal_codes.id'], ), - sa.PrimaryKeyConstraint('id'), - schema='data' - ) - op.create_table('asset_events', - sa.Column('id', sa.UUID(), nullable=False), - sa.Column('asset_id', sa.UUID(), nullable=False), - sa.Column('event_type', sa.String(length=50), nullable=False), - sa.Column('recorded_mileage', sa.Integer(), nullable=True), - sa.Column('data', sa.JSON(), server_default=sa.text("'{}'::jsonb"), nullable=True), - sa.ForeignKeyConstraint(['asset_id'], ['data.assets.id'], ), - sa.PrimaryKeyConstraint('id'), - schema='data' - ) - op.create_table('asset_financials', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('asset_id', sa.UUID(), nullable=True), - sa.Column('acquisition_price', sa.Numeric(precision=18, scale=2), nullable=True), - sa.Column('acquisition_date', sa.DateTime(), nullable=True), - sa.Column('financing_type', sa.String(), nullable=True), - sa.Column('residual_value_estimate', sa.Numeric(precision=18, scale=2), nullable=True), - sa.ForeignKeyConstraint(['asset_id'], ['data.assets.id'], ), - sa.PrimaryKeyConstraint('id'), - sa.UniqueConstraint('asset_id'), - schema='data' - ) - op.create_table('asset_telemetry', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('asset_id', sa.UUID(), nullable=True), - sa.Column('current_mileage', sa.Integer(), nullable=True), - sa.Column('mileage_unit', sa.String(length=10), nullable=True), - sa.Column('vqi_score', sa.Numeric(precision=5, scale=2), nullable=True), - sa.Column('dbs_score', sa.Numeric(precision=5, scale=2), nullable=True), - sa.ForeignKeyConstraint(['asset_id'], ['data.assets.id'], ), - sa.PrimaryKeyConstraint('id'), - sa.UniqueConstraint('asset_id'), - schema='data' - ) - op.create_table('persons', - sa.Column('id', sa.BigInteger(), nullable=False), - sa.Column('id_uuid', sa.UUID(), nullable=False), - sa.Column('address_id', sa.UUID(), nullable=True), - sa.Column('last_name', sa.String(), nullable=False), - sa.Column('first_name', sa.String(), nullable=False), - sa.Column('mothers_last_name', sa.String(), nullable=True), - sa.Column('mothers_first_name', sa.String(), nullable=True), - sa.Column('birth_place', sa.String(), nullable=True), - sa.Column('birth_date', sa.DateTime(), nullable=True), - sa.Column('phone', sa.String(), nullable=True), - sa.Column('identity_docs', sa.JSON(), server_default=sa.text("'{}'::jsonb"), nullable=True), - sa.Column('medical_emergency', sa.JSON(), server_default=sa.text("'{}'::jsonb"), nullable=True), - sa.Column('ice_contact', sa.JSON(), server_default=sa.text("'{}'::jsonb"), nullable=True), - sa.Column('is_active', sa.Boolean(), nullable=False), - sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), - sa.Column('updated_at', sa.DateTime(timezone=True), nullable=True), - sa.ForeignKeyConstraint(['address_id'], ['data.addresses.id'], ), - sa.PrimaryKeyConstraint('id'), - sa.UniqueConstraint('id_uuid'), - schema='data' - ) - op.create_index(op.f('ix_data_persons_id'), 'persons', ['id'], unique=False, schema='data') - op.create_table('users', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('email', sa.String(), nullable=False), - sa.Column('hashed_password', sa.String(), nullable=True), - sa.Column('role', sa.Enum('admin', 'user', 'service', 'fleet_manager', 'driver', name='userrole'), nullable=True), - sa.Column('is_active', sa.Boolean(), nullable=True), - sa.Column('region_code', sa.String(), nullable=True), - sa.Column('is_deleted', sa.Boolean(), nullable=True), - sa.Column('person_id', sa.BigInteger(), nullable=True), - sa.Column('preferred_language', sa.String(length=5), nullable=True), - sa.Column('preferred_currency', sa.String(length=3), nullable=True), - sa.Column('timezone', sa.String(length=50), nullable=True), - sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), - sa.ForeignKeyConstraint(['person_id'], ['data.persons.id'], ), - sa.PrimaryKeyConstraint('id'), - schema='data' - ) - op.create_index(op.f('ix_data_users_email'), 'users', ['email'], unique=True, schema='data') - op.create_index(op.f('ix_data_users_id'), 'users', ['id'], unique=False, schema='data') - op.create_table('asset_reviews', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('asset_id', sa.UUID(), nullable=False), - sa.Column('user_id', sa.Integer(), nullable=False), - sa.Column('overall_rating', sa.Integer(), nullable=True), - sa.Column('criteria_scores', sa.JSON(), server_default=sa.text("'{}'::jsonb"), nullable=True), - sa.Column('comment', sa.Text(), nullable=True), - sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), - sa.ForeignKeyConstraint(['asset_id'], ['data.assets.id'], ), - sa.ForeignKeyConstraint(['user_id'], ['data.users.id'], ), - sa.PrimaryKeyConstraint('id'), - schema='data' - ) - op.create_table('audit_logs', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('user_id', sa.Integer(), nullable=True), - sa.Column('target_type', sa.String(), nullable=True), - sa.Column('target_id', sa.String(), nullable=True), - sa.Column('action', sa.String(), nullable=False), - sa.Column('changes', sa.JSON(), nullable=True), - sa.Column('timestamp', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), - sa.ForeignKeyConstraint(['user_id'], ['data.users.id'], ), - sa.PrimaryKeyConstraint('id'), - schema='data' - ) - op.create_index(op.f('ix_data_audit_logs_id'), 'audit_logs', ['id'], unique=False, schema='data') - op.create_index(op.f('ix_data_audit_logs_target_id'), 'audit_logs', ['target_id'], unique=False, schema='data') - op.create_index(op.f('ix_data_audit_logs_target_type'), 'audit_logs', ['target_type'], unique=False, schema='data') - op.create_table('documents', - sa.Column('id', sa.UUID(), nullable=False), - sa.Column('parent_type', sa.String(length=20), nullable=False), - sa.Column('parent_id', sa.String(length=50), nullable=False), - sa.Column('doc_type', sa.String(length=50), nullable=True), - sa.Column('original_name', sa.String(length=255), nullable=False), - sa.Column('file_hash', sa.String(length=64), nullable=False), - sa.Column('file_ext', sa.String(length=10), nullable=True), - sa.Column('mime_type', sa.String(length=100), nullable=True), - sa.Column('file_size', sa.Integer(), nullable=True), - sa.Column('has_thumbnail', sa.Boolean(), nullable=True), - sa.Column('thumbnail_path', sa.String(length=255), nullable=True), - sa.Column('uploaded_by', sa.Integer(), nullable=True), - sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), - sa.ForeignKeyConstraint(['uploaded_by'], ['data.users.id'], ), - sa.PrimaryKeyConstraint('id'), - schema='data' - ) - op.create_table('organizations', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('address_id', sa.UUID(), nullable=True), - sa.Column('full_name', sa.String(), nullable=False), - sa.Column('name', sa.String(), nullable=False), - sa.Column('display_name', sa.String(length=50), nullable=True), - sa.Column('default_currency', sa.String(length=3), nullable=True), - sa.Column('country_code', sa.String(length=2), nullable=True), - sa.Column('language', sa.String(length=5), nullable=True), - sa.Column('address_zip', sa.String(length=10), nullable=True), - sa.Column('address_city', sa.String(length=100), nullable=True), - sa.Column('address_street_name', sa.String(length=150), nullable=True), - sa.Column('address_street_type', sa.String(length=50), nullable=True), - sa.Column('address_house_number', sa.String(length=20), nullable=True), - sa.Column('address_hrsz', sa.String(length=50), nullable=True), - sa.Column('address_stairwell', sa.String(length=20), nullable=True), - sa.Column('address_floor', sa.String(length=20), nullable=True), - sa.Column('address_door', sa.String(length=20), nullable=True), - sa.Column('tax_number', sa.String(length=20), nullable=True), - sa.Column('reg_number', sa.String(length=50), nullable=True), - sa.Column('org_type', postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), nullable=True), - sa.Column('status', sa.String(length=30), nullable=True), - sa.Column('is_deleted', sa.Boolean(), nullable=True), - sa.Column('notification_settings', sa.JSON(), server_default=sa.text('\'{ "notify_owner": true, "alert_days_before": [30, 15, 7, 1] }\'::jsonb'), nullable=True), - sa.Column('external_integration_config', sa.JSON(), server_default=sa.text("'{}'::jsonb"), nullable=True), - sa.Column('owner_id', sa.Integer(), nullable=True), - sa.Column('is_active', sa.Boolean(), nullable=True), - sa.Column('is_transferable', sa.Boolean(), nullable=True), - sa.Column('is_verified', sa.Boolean(), nullable=True), - sa.Column('verification_expires_at', sa.DateTime(timezone=True), nullable=True), - sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), - sa.Column('updated_at', sa.DateTime(timezone=True), nullable=True), - sa.ForeignKeyConstraint(['address_id'], ['data.addresses.id'], ), - sa.ForeignKeyConstraint(['owner_id'], ['data.users.id'], ), - sa.PrimaryKeyConstraint('id'), - schema='data' - ) - op.create_index(op.f('ix_data_organizations_id'), 'organizations', ['id'], unique=False, schema='data') - op.create_index(op.f('ix_data_organizations_tax_number'), 'organizations', ['tax_number'], unique=True, schema='data') - op.create_table('points_ledger', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('user_id', sa.Integer(), nullable=False), - sa.Column('points', sa.Integer(), nullable=False), - sa.Column('reason', sa.String(), nullable=False), - sa.Column('created_at', sa.DateTime(), nullable=False), - sa.ForeignKeyConstraint(['user_id'], ['data.users.id'], ), - sa.PrimaryKeyConstraint('id'), - schema='data' - ) - op.create_index(op.f('ix_data_points_ledger_id'), 'points_ledger', ['id'], unique=False, schema='data') - op.create_table('ratings', - sa.Column('id', sa.UUID(), nullable=False), - sa.Column('author_id', sa.Integer(), nullable=False), - sa.Column('target_type', sa.String(length=20), nullable=False), - sa.Column('target_id', sa.UUID(), nullable=False), - sa.Column('score', sa.Integer(), nullable=False), - sa.Column('comment', sa.String(), nullable=True), - sa.ForeignKeyConstraint(['author_id'], ['data.users.id'], ), - sa.PrimaryKeyConstraint('id'), - schema='data' - ) - op.create_table('user_badges', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('user_id', sa.Integer(), nullable=False), - sa.Column('badge_id', sa.Integer(), nullable=False), - sa.Column('earned_at', sa.DateTime(), nullable=False), - sa.ForeignKeyConstraint(['badge_id'], ['data.badges.id'], ), - sa.ForeignKeyConstraint(['user_id'], ['data.users.id'], ), - sa.PrimaryKeyConstraint('id'), - schema='data' - ) - op.create_index(op.f('ix_data_user_badges_id'), 'user_badges', ['id'], unique=False, schema='data') - op.create_table('user_stats', - sa.Column('user_id', sa.Integer(), nullable=False), - sa.Column('total_xp', sa.Integer(), nullable=False), - sa.Column('social_points', sa.Integer(), nullable=False), - sa.Column('current_level', sa.Integer(), nullable=False), - sa.Column('updated_at', sa.DateTime(), nullable=False), - sa.ForeignKeyConstraint(['user_id'], ['data.users.id'], ), - sa.PrimaryKeyConstraint('user_id'), - schema='data' - ) - op.create_table('vehicle_ownerships', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('vehicle_id', sa.UUID(), nullable=False), - sa.Column('user_id', sa.Integer(), nullable=False), - sa.Column('start_date', sa.Date(), nullable=False), - sa.Column('end_date', sa.Date(), nullable=True), - sa.Column('notes', sa.Text(), nullable=True), - sa.ForeignKeyConstraint(['user_id'], ['data.users.id'], ), - sa.ForeignKeyConstraint(['vehicle_id'], ['data.assets.id'], ), - sa.PrimaryKeyConstraint('id'), - schema='data' - ) - op.create_index(op.f('ix_data_vehicle_ownerships_id'), 'vehicle_ownerships', ['id'], unique=False, schema='data') - op.create_table('verification_tokens', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('token', sa.UUID(), nullable=False), - sa.Column('user_id', sa.Integer(), nullable=False), - sa.Column('token_type', sa.String(length=20), nullable=False), - sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), - sa.Column('expires_at', sa.DateTime(timezone=True), nullable=False), - sa.Column('is_used', sa.Boolean(), nullable=True), - sa.ForeignKeyConstraint(['user_id'], ['data.users.id'], ondelete='CASCADE'), - sa.PrimaryKeyConstraint('id'), - sa.UniqueConstraint('token'), - schema='data' - ) - op.create_index(op.f('ix_data_verification_tokens_id'), 'verification_tokens', ['id'], unique=False, schema='data') - op.create_table('wallets', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('user_id', sa.Integer(), nullable=True), - sa.Column('coin_balance', sa.Numeric(precision=18, scale=2), nullable=True), - sa.Column('credit_balance', sa.Numeric(precision=18, scale=2), nullable=True), - sa.Column('currency', sa.String(length=3), nullable=True), - sa.ForeignKeyConstraint(['user_id'], ['data.users.id'], ), - sa.PrimaryKeyConstraint('id'), - sa.UniqueConstraint('user_id'), - schema='data' - ) - op.create_index(op.f('ix_data_wallets_id'), 'wallets', ['id'], unique=False, schema='data') - op.create_table('asset_assignments', - sa.Column('id', sa.UUID(), nullable=False), - sa.Column('asset_id', sa.UUID(), nullable=False), - sa.Column('organization_id', sa.Integer(), nullable=False), - sa.Column('assigned_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), - sa.Column('released_at', sa.DateTime(timezone=True), nullable=True), - sa.Column('status', sa.String(length=30), nullable=True), - sa.ForeignKeyConstraint(['asset_id'], ['data.assets.id'], ), - sa.ForeignKeyConstraint(['organization_id'], ['data.organizations.id'], ), - sa.PrimaryKeyConstraint('id'), - schema='data' - ) - op.create_table('asset_costs', - sa.Column('id', sa.UUID(), nullable=False), - sa.Column('asset_id', sa.UUID(), nullable=False), - sa.Column('organization_id', sa.Integer(), nullable=False), - sa.Column('driver_id', sa.Integer(), nullable=True), - sa.Column('cost_type', sa.String(length=50), nullable=False), - sa.Column('amount', sa.Numeric(precision=18, scale=2), nullable=False), - sa.Column('currency', sa.String(length=3), nullable=True), - sa.Column('net_amount', sa.Numeric(precision=18, scale=2), nullable=True), - sa.Column('vat_rate', sa.Numeric(precision=5, scale=2), nullable=True), - sa.Column('exchange_rate_at_cost', sa.Numeric(precision=18, scale=6), nullable=True), - sa.Column('date', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), - sa.Column('mileage_at_cost', sa.Integer(), nullable=True), - sa.Column('data', sa.JSON(), server_default=sa.text("'{}'::jsonb"), nullable=True), - sa.ForeignKeyConstraint(['asset_id'], ['data.assets.id'], ), - sa.ForeignKeyConstraint(['driver_id'], ['data.users.id'], ), - sa.ForeignKeyConstraint(['organization_id'], ['data.organizations.id'], ), - sa.PrimaryKeyConstraint('id'), - schema='data' - ) - op.create_table('credit_logs', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('org_id', sa.Integer(), nullable=True), - sa.Column('amount', sa.Numeric(precision=10, scale=2), nullable=True), - sa.Column('description', sa.String(), nullable=True), - sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=True), - sa.ForeignKeyConstraint(['org_id'], ['data.organizations.id'], ), - sa.PrimaryKeyConstraint('id'), - schema='data' - ) - op.create_table('org_subscriptions', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('org_id', sa.Integer(), nullable=True), - sa.Column('tier_id', sa.Integer(), nullable=True), - sa.Column('valid_from', sa.DateTime(), server_default=sa.text('now()'), nullable=True), - sa.Column('valid_until', sa.DateTime(), nullable=True), - sa.Column('is_active', sa.Boolean(), nullable=True), - sa.ForeignKeyConstraint(['org_id'], ['data.organizations.id'], ), - sa.ForeignKeyConstraint(['tier_id'], ['data.subscription_tiers.id'], ), - sa.PrimaryKeyConstraint('id'), - schema='data' - ) - op.create_table('organization_members', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('organization_id', sa.Integer(), nullable=False), - sa.Column('user_id', sa.Integer(), nullable=False), - sa.Column('role', sa.String(), nullable=True), - sa.Column('permissions', sa.JSON(), server_default=sa.text("'{}'::jsonb"), nullable=True), - sa.ForeignKeyConstraint(['organization_id'], ['data.organizations.id'], ), - sa.ForeignKeyConstraint(['user_id'], ['data.users.id'], ), - sa.PrimaryKeyConstraint('id'), - schema='data' - ) - op.create_index(op.f('ix_data_organization_members_id'), 'organization_members', ['id'], unique=False, schema='data') - # ### end Alembic commands ### - - -def downgrade() -> None: - """Downgrade schema.""" - # ### commands auto generated by Alembic - please adjust! ### - op.drop_index(op.f('ix_data_organization_members_id'), table_name='organization_members', schema='data') - op.drop_table('organization_members', schema='data') - op.drop_table('org_subscriptions', schema='data') - op.drop_table('credit_logs', schema='data') - op.drop_table('asset_costs', schema='data') - op.drop_table('asset_assignments', schema='data') - op.drop_index(op.f('ix_data_wallets_id'), table_name='wallets', schema='data') - op.drop_table('wallets', schema='data') - op.drop_index(op.f('ix_data_verification_tokens_id'), table_name='verification_tokens', schema='data') - op.drop_table('verification_tokens', schema='data') - op.drop_index(op.f('ix_data_vehicle_ownerships_id'), table_name='vehicle_ownerships', schema='data') - op.drop_table('vehicle_ownerships', schema='data') - op.drop_table('user_stats', schema='data') - op.drop_index(op.f('ix_data_user_badges_id'), table_name='user_badges', schema='data') - op.drop_table('user_badges', schema='data') - op.drop_table('ratings', schema='data') - op.drop_index(op.f('ix_data_points_ledger_id'), table_name='points_ledger', schema='data') - op.drop_table('points_ledger', schema='data') - op.drop_index(op.f('ix_data_organizations_tax_number'), table_name='organizations', schema='data') - op.drop_index(op.f('ix_data_organizations_id'), table_name='organizations', schema='data') - op.drop_table('organizations', schema='data') - op.drop_table('documents', schema='data') - op.drop_index(op.f('ix_data_audit_logs_target_type'), table_name='audit_logs', schema='data') - op.drop_index(op.f('ix_data_audit_logs_target_id'), table_name='audit_logs', schema='data') - op.drop_index(op.f('ix_data_audit_logs_id'), table_name='audit_logs', schema='data') - op.drop_table('audit_logs', schema='data') - op.drop_table('asset_reviews', schema='data') - op.drop_index(op.f('ix_data_users_id'), table_name='users', schema='data') - op.drop_index(op.f('ix_data_users_email'), table_name='users', schema='data') - op.drop_table('users', schema='data') - op.drop_index(op.f('ix_data_persons_id'), table_name='persons', schema='data') - op.drop_table('persons', schema='data') - op.drop_table('asset_telemetry', schema='data') - op.drop_table('asset_financials', schema='data') - op.drop_table('asset_events', schema='data') - op.drop_table('geo_streets', schema='data') - op.drop_index(op.f('ix_data_assets_vin'), table_name='assets', schema='data') - op.drop_index(op.f('ix_data_assets_license_plate'), table_name='assets', schema='data') - op.drop_table('assets', schema='data') - op.drop_table('addresses', schema='data') - op.drop_index(op.f('ix_data_vehicle_catalog_model'), table_name='vehicle_catalog', schema='data') - op.drop_index(op.f('ix_data_vehicle_catalog_make'), table_name='vehicle_catalog', schema='data') - op.drop_index(op.f('ix_data_vehicle_catalog_id'), table_name='vehicle_catalog', schema='data') - op.drop_table('vehicle_catalog', schema='data') - op.drop_index(op.f('ix_data_system_parameters_key'), table_name='system_parameters', schema='data') - op.drop_index(op.f('ix_data_system_parameters_id'), table_name='system_parameters', schema='data') - op.drop_table('system_parameters', schema='data') - op.drop_table('subscription_tiers', schema='data') - op.drop_table('service_specialties', schema='data') - op.drop_index(op.f('ix_data_regional_settings_id'), table_name='regional_settings', schema='data') - op.drop_table('regional_settings', schema='data') - op.drop_index(op.f('ix_data_point_rules_id'), table_name='point_rules', schema='data') - op.drop_index(op.f('ix_data_point_rules_action_key'), table_name='point_rules', schema='data') - op.drop_table('point_rules', schema='data') - op.drop_index(op.f('ix_data_level_configs_id'), table_name='level_configs', schema='data') - op.drop_table('level_configs', schema='data') - op.drop_table('geo_street_types', schema='data') - op.drop_table('geo_postal_codes', schema='data') - op.drop_table('exchange_rates', schema='data') - op.drop_index(op.f('ix_data_badges_id'), table_name='badges', schema='data') - op.drop_table('badges', schema='data') - # ### end Alembic commands ### diff --git a/backend/migrations/versions/92616f34cdd3_baseline_and_staging_init.py b/backend/migrations/versions/92616f34cdd3_baseline_and_staging_init.py new file mode 100644 index 0000000..d2e9768 --- /dev/null +++ b/backend/migrations/versions/92616f34cdd3_baseline_and_staging_init.py @@ -0,0 +1,253 @@ +"""baseline_and_staging_init + +Revision ID: 92616f34cdd3 +Revises: +Create Date: 2026-02-14 15:23:12.091715 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = '92616f34cdd3' +down_revision: Union[str, Sequence[str], None] = None +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('service_staging', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('name', sa.String(), nullable=False), + sa.Column('postal_code', sa.String(length=10), nullable=True), + sa.Column('city', sa.String(length=100), nullable=True), + sa.Column('street', sa.String(length=255), nullable=True), + sa.Column('house_number', sa.String(length=50), nullable=True), + sa.Column('full_address', sa.String(), nullable=True), + sa.Column('contact_phone', sa.String(), nullable=True), + sa.Column('email', sa.String(), nullable=True), + sa.Column('website', sa.String(), nullable=True), + sa.Column('source', sa.String(length=50), nullable=True), + sa.Column('external_id', sa.String(length=100), nullable=True), + sa.Column('raw_data', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), nullable=True), + sa.Column('status', sa.String(length=20), server_default=sa.text("'pending'"), nullable=True), + sa.Column('trust_score', sa.Integer(), nullable=True), + sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_index(op.f('ix_data_service_staging_city'), 'service_staging', ['city'], unique=False, schema='data') + op.create_index(op.f('ix_data_service_staging_external_id'), 'service_staging', ['external_id'], unique=False, schema='data') + op.create_index(op.f('ix_data_service_staging_id'), 'service_staging', ['id'], unique=False, schema='data') + op.create_index(op.f('ix_data_service_staging_name'), 'service_staging', ['name'], unique=False, schema='data') + op.create_index(op.f('ix_data_service_staging_postal_code'), 'service_staging', ['postal_code'], unique=False, schema='data') + op.create_index(op.f('ix_data_service_staging_source'), 'service_staging', ['source'], unique=False, schema='data') + op.create_index(op.f('ix_data_service_staging_status'), 'service_staging', ['status'], unique=False, schema='data') + op.drop_constraint(op.f('addresses_postal_code_id_fkey'), 'addresses', type_='foreignkey') + op.create_foreign_key(None, 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', type_='foreignkey') + op.drop_constraint(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', type_='foreignkey') + op.create_foreign_key(None, 'asset_assignments', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_assignments', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_costs_driver_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_asset_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_organization_id_fkey'), 'asset_costs', type_='foreignkey') + op.create_foreign_key(None, 'asset_costs', 'users', ['driver_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_events_asset_id_fkey'), 'asset_events', type_='foreignkey') + op.create_foreign_key(None, 'asset_events', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_financials_asset_id_fkey'), 'asset_financials', type_='foreignkey') + op.create_foreign_key(None, 'asset_financials', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', type_='foreignkey') + op.drop_constraint(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', type_='foreignkey') + op.create_foreign_key(None, 'asset_reviews', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_reviews', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', type_='foreignkey') + op.create_foreign_key(None, 'asset_telemetry', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('assets_catalog_id_fkey'), 'assets', type_='foreignkey') + op.drop_constraint(op.f('assets_current_organization_id_fkey'), 'assets', type_='foreignkey') + op.create_foreign_key(None, 'assets', 'vehicle_catalog', ['catalog_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'assets', 'organizations', ['current_organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('audit_logs_user_id_fkey'), 'audit_logs', type_='foreignkey') + op.create_foreign_key(None, 'audit_logs', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('credit_logs_org_id_fkey'), 'credit_logs', type_='foreignkey') + op.create_foreign_key(None, 'credit_logs', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('documents_uploaded_by_fkey'), 'documents', type_='foreignkey') + op.create_foreign_key(None, 'documents', 'users', ['uploaded_by'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', type_='foreignkey') + op.create_foreign_key(None, 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.drop_constraint(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.create_foreign_key(None, 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'org_subscriptions', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('organization_financials_organization_id_fkey'), 'organization_financials', type_='foreignkey') + op.create_foreign_key(None, 'organization_financials', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.alter_column('organization_members', 'role', + existing_type=postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole'), + type_=postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole', schema='data', inherit_schema=True), + existing_nullable=True) + op.drop_constraint(op.f('organization_members_user_id_fkey'), 'organization_members', type_='foreignkey') + op.drop_constraint(op.f('organization_members_person_id_fkey'), 'organization_members', type_='foreignkey') + op.drop_constraint(op.f('organization_members_organization_id_fkey'), 'organization_members', type_='foreignkey') + op.create_foreign_key(None, 'organization_members', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organization_members', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organization_members', 'persons', ['person_id'], ['id'], source_schema='data', referent_schema='data') + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + existing_nullable=True) + op.drop_constraint(op.f('organizations_address_id_fkey'), 'organizations', type_='foreignkey') + op.drop_constraint(op.f('organizations_owner_id_fkey'), 'organizations', type_='foreignkey') + op.create_foreign_key(None, 'organizations', 'users', ['owner_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organizations', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('pending_actions_approver_id_fkey'), 'pending_actions', type_='foreignkey') + op.drop_constraint(op.f('pending_actions_requester_id_fkey'), 'pending_actions', type_='foreignkey') + op.create_foreign_key(None, 'pending_actions', 'users', ['approver_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'pending_actions', 'users', ['requester_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('persons_address_id_fkey'), 'persons', type_='foreignkey') + op.create_foreign_key(None, 'persons', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('points_ledger_user_id_fkey'), 'points_ledger', type_='foreignkey') + op.create_foreign_key(None, 'points_ledger', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('ratings_author_id_fkey'), 'ratings', type_='foreignkey') + op.create_foreign_key(None, 'ratings', 'users', ['author_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('service_expertises_expertise_id_fkey'), 'service_expertises', type_='foreignkey') + op.drop_constraint(op.f('service_expertises_service_id_fkey'), 'service_expertises', type_='foreignkey') + op.create_foreign_key(None, 'service_expertises', 'expertise_tags', ['expertise_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'service_expertises', 'service_profiles', ['service_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('service_profiles_organization_id_fkey'), 'service_profiles', type_='foreignkey') + op.create_foreign_key(None, 'service_profiles', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('service_specialties_parent_id_fkey'), 'service_specialties', type_='foreignkey') + op.create_foreign_key(None, 'service_specialties', 'service_specialties', ['parent_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('social_accounts_user_id_fkey'), 'social_accounts', type_='foreignkey') + op.create_foreign_key(None, 'social_accounts', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data', ondelete='CASCADE') + op.drop_constraint(op.f('user_badges_user_id_fkey'), 'user_badges', type_='foreignkey') + op.drop_constraint(op.f('user_badges_badge_id_fkey'), 'user_badges', type_='foreignkey') + op.create_foreign_key(None, 'user_badges', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'user_badges', 'badges', ['badge_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('user_stats_user_id_fkey'), 'user_stats', type_='foreignkey') + op.create_foreign_key(None, 'user_stats', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('users_person_id_fkey'), 'users', type_='foreignkey') + op.create_foreign_key(None, 'users', 'persons', ['person_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.drop_constraint(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.create_foreign_key(None, 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'vehicle_ownerships', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', type_='foreignkey') + op.create_foreign_key(None, 'verification_tokens', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data', ondelete='CASCADE') + op.drop_constraint(op.f('wallets_user_id_fkey'), 'wallets', type_='foreignkey') + op.create_foreign_key(None, 'wallets', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'wallets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('wallets_user_id_fkey'), 'wallets', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'verification_tokens', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', 'users', ['user_id'], ['id'], ondelete='CASCADE') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id']) + op.create_foreign_key(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'users', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('users_person_id_fkey'), 'users', 'persons', ['person_id'], ['id']) + op.drop_constraint(None, 'user_stats', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_stats_user_id_fkey'), 'user_stats', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_badges_badge_id_fkey'), 'user_badges', 'badges', ['badge_id'], ['id']) + op.create_foreign_key(op.f('user_badges_user_id_fkey'), 'user_badges', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'social_accounts', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('social_accounts_user_id_fkey'), 'social_accounts', 'users', ['user_id'], ['id'], ondelete='CASCADE') + op.drop_constraint(None, 'service_specialties', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_specialties_parent_id_fkey'), 'service_specialties', 'service_specialties', ['parent_id'], ['id']) + op.drop_constraint(None, 'service_profiles', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_profiles_organization_id_fkey'), 'service_profiles', 'organizations', ['organization_id'], ['id']) + op.drop_constraint(None, 'service_expertises', schema='data', type_='foreignkey') + op.drop_constraint(None, 'service_expertises', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_expertises_service_id_fkey'), 'service_expertises', 'service_profiles', ['service_id'], ['id']) + op.create_foreign_key(op.f('service_expertises_expertise_id_fkey'), 'service_expertises', 'expertise_tags', ['expertise_id'], ['id']) + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('ratings_author_id_fkey'), 'ratings', 'users', ['author_id'], ['id']) + op.drop_constraint(None, 'points_ledger', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('points_ledger_user_id_fkey'), 'points_ledger', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'persons', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('persons_address_id_fkey'), 'persons', 'addresses', ['address_id'], ['id']) + op.drop_constraint(None, 'pending_actions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'pending_actions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('pending_actions_requester_id_fkey'), 'pending_actions', 'users', ['requester_id'], ['id']) + op.create_foreign_key(op.f('pending_actions_approver_id_fkey'), 'pending_actions', 'users', ['approver_id'], ['id']) + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organizations_owner_id_fkey'), 'organizations', 'users', ['owner_id'], ['id']) + op.create_foreign_key(op.f('organizations_address_id_fkey'), 'organizations', 'addresses', ['address_id'], ['id']) + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + existing_nullable=True) + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organization_members_organization_id_fkey'), 'organization_members', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('organization_members_person_id_fkey'), 'organization_members', 'persons', ['person_id'], ['id']) + op.create_foreign_key(op.f('organization_members_user_id_fkey'), 'organization_members', 'users', ['user_id'], ['id']) + op.alter_column('organization_members', 'role', + existing_type=postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole', schema='data', inherit_schema=True), + type_=postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole'), + existing_nullable=True) + op.drop_constraint(None, 'organization_financials', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organization_financials_organization_id_fkey'), 'organization_financials', 'organizations', ['organization_id'], ['id']) + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id']) + op.create_foreign_key(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'geo_streets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id']) + op.drop_constraint(None, 'documents', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('documents_uploaded_by_fkey'), 'documents', 'users', ['uploaded_by'], ['id']) + op.drop_constraint(None, 'credit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('credit_logs_org_id_fkey'), 'credit_logs', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'audit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('audit_logs_user_id_fkey'), 'audit_logs', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('assets_current_organization_id_fkey'), 'assets', 'organizations', ['current_organization_id'], ['id']) + op.create_foreign_key(op.f('assets_catalog_id_fkey'), 'assets', 'vehicle_catalog', ['catalog_id'], ['id']) + op.drop_constraint(None, 'asset_telemetry', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_financials', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_financials_asset_id_fkey'), 'asset_financials', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_events', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_events_asset_id_fkey'), 'asset_events', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_costs_organization_id_fkey'), 'asset_costs', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_asset_id_fkey'), 'asset_costs', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_driver_id_fkey'), 'asset_costs', 'users', ['driver_id'], ['id']) + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'addresses', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('addresses_postal_code_id_fkey'), 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id']) + op.drop_index(op.f('ix_data_service_staging_status'), table_name='service_staging', schema='data') + op.drop_index(op.f('ix_data_service_staging_source'), table_name='service_staging', schema='data') + op.drop_index(op.f('ix_data_service_staging_postal_code'), table_name='service_staging', schema='data') + op.drop_index(op.f('ix_data_service_staging_name'), table_name='service_staging', schema='data') + op.drop_index(op.f('ix_data_service_staging_id'), table_name='service_staging', schema='data') + op.drop_index(op.f('ix_data_service_staging_external_id'), table_name='service_staging', schema='data') + op.drop_index(op.f('ix_data_service_staging_city'), table_name='service_staging', schema='data') + op.drop_table('service_staging', schema='data') + # ### end Alembic commands ### diff --git a/backend/migrations/versions/__pycache__/0adbe75a0b3f_complete_sync.cpython-312.pyc b/backend/migrations/versions/__pycache__/0adbe75a0b3f_complete_sync.cpython-312.pyc deleted file mode 100644 index c5e1118d15ece983c61abf517cbe5afef29c9278..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49482 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 V{E$CuG_D$dyp{)_?-?Zx{y%@FpX>kt diff --git a/backend/migrations/versions/__pycache__/134d92edd430_create_translation_and_security_tables.cpython-312.pyc b/backend/migrations/versions/__pycache__/134d92edd430_create_translation_and_security_tables.cpython-312.pyc deleted file mode 100644 index 82c5ab7c001604d01dbc31b50578590a02819a69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22221 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 diff --git a/backend/migrations/versions/__pycache__/143763d5d6fe_fix_member_is_verified.cpython-312.pyc b/backend/migrations/versions/__pycache__/143763d5d6fe_fix_member_is_verified.cpython-312.pyc deleted file mode 100644 index b73d37021c42a42f988698a103b7a800702dd31f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23441 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 MzW|=EjgkZZ53r#sC;$Ke diff --git a/backend/migrations/versions/__pycache__/25afe6f4f063_identity_and_hybrid_org_update.cpython-312.pyc b/backend/migrations/versions/__pycache__/25afe6f4f063_identity_and_hybrid_org_update.cpython-312.pyc deleted file mode 100644 index d4046236a709ee3f663419e5979eeb28ea4f9060..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16587 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 F_e@ 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 diff --git a/backend/migrations/versions/__pycache__/398e76c2fa36_audit_and_moderation_fields.cpython-312.pyc b/backend/migrations/versions/__pycache__/398e76c2fa36_audit_and_moderation_fields.cpython-312.pyc deleted file mode 100644 index 98fcbdbbd531d696cf5c50a7c21fa7a32a197391..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30092 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 diff --git a/backend/migrations/versions/__pycache__/5ca03588ce28_add_penalty_system_and_wallet_.cpython-312.pyc b/backend/migrations/versions/__pycache__/5ca03588ce28_add_penalty_system_and_wallet_.cpython-312.pyc deleted file mode 100644 index 874f99bcd1bd4632b1447b6457e01ac46b61b4a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19072 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 diff --git a/backend/migrations/versions/__pycache__/6197bfddfb4f_add_lang_and_region_to_user.cpython-312.pyc b/backend/migrations/versions/__pycache__/6197bfddfb4f_add_lang_and_region_to_user.cpython-312.pyc deleted file mode 100644 index c2e6e97231882ba763133c9a2dd151f9e14c0a5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19853 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 diff --git a/backend/migrations/versions/__pycache__/85b2a560e599_asset_system_v2_and_catalog.cpython-312.pyc b/backend/migrations/versions/__pycache__/85b2a560e599_asset_system_v2_and_catalog.cpython-312.pyc deleted file mode 100644 index 2684ad76ea61fa1f8617d7539bb7b976de0ad8c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22258 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 C)e7L{Z{RGo)^| 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 diff --git a/backend/migrations/versions/__pycache__/92616f34cdd3_baseline_and_staging_init.cpython-312.pyc b/backend/migrations/versions/__pycache__/92616f34cdd3_baseline_and_staging_init.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..957d642089cd85bae1d6c804d4e3ff646da77be1 GIT binary patch literal 27985 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 UXRqjV3%W0EWlrgICq)DPKbiUN8UO$Q literal 0 HcmV?d00001 diff --git a/backend/migrations/versions/__pycache__/9b20430f0ebb_add_service_specialization_and_postgis.cpython-312.pyc b/backend/migrations/versions/__pycache__/9b20430f0ebb_add_service_specialization_and_postgis.cpython-312.pyc deleted file mode 100644 index 1942e8c97b2a051f64c9cc6ac711051f31a13ef0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20278 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 AC;$Ke diff --git a/backend/migrations/versions/__pycache__/b14d05fd8ac8_add_social_accounts.cpython-312.pyc b/backend/migrations/versions/__pycache__/b14d05fd8ac8_add_social_accounts.cpython-312.pyc deleted file mode 100644 index c499574634df3a6fe560dad6a5dbda804b642cb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21392 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 diff --git a/backend/migrations/versions/__pycache__/bc5669f12ffd_add_pending_actions_for_dual_control.cpython-312.pyc b/backend/migrations/versions/__pycache__/bc5669f12ffd_add_pending_actions_for_dual_control.cpython-312.pyc deleted file mode 100644 index b891b2040ab225c6b1e64dcdc0bc3cb24c2815a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18292 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 Vek~g@8aIr;Etuf?wNWPU{{enz<=p@P diff --git a/backend/migrations/versions/__pycache__/f2d8996357ac_create_system_parameters_table.cpython-312.pyc b/backend/migrations/versions/__pycache__/f2d8996357ac_create_system_parameters_table.cpython-312.pyc deleted file mode 100644 index bd357bd23243330c4e30a475f904e8fb37dba7ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20954 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 2 (+10 pont). \ No newline at end of file +- **Verified Staff:** Ha a szerelőregisztrációk száma > 2 (+10 pont). + +# 20. Service Finder & Trust Engine + +## Pre-searching (Silent Service Hunter) Logika +A cél a szervizek felderítése API költségek nélkül, kereszt-ellenőrzött forrásokból. + +### 1. Felderítési Fázis (Hunter A) +Többmotoros keresés (DuckDuckGo Lite, Bing, Yandex, OSM) segítségével: +- **Kulcsszó-dorking:** `site:facebook.com "Dunakeszi" "szerviz"`. +- **Informális adatok:** Fórumok, blogok és helyi közösségi posztok elemzése. +- **TEAOR Mátrix:** Az e-Cégközlöny napi frissítéseinek szűrése (4520, 4540, 2920 kódok). + +### 2. Validációs Pontrendszer (Trust Engine) +Minden talált entitás pontszámot kap: +- **+40 pont:** Aktív adószám és megfelelő TEAOR (4520/4540). +- **+20 pont:** Friss digitális jelenlét (Facebook/Instagram poszt < 30 nap). +- **+20 pont:** Fizikailag validált cím (OSM vagy lakossági megerősítés). +- **+10 pont:** Hívható, formátum-helyes telefonszám. + +### 3. Döntési Szintek +- **80+ pont:** Ellenőrzött (Verified) - Automatikus publikálás. +- **40-79 pont:** Moderációra vár - Manuális adminisztrátori jóváhagyás szükséges. +- **<40 pont:** Elutasítva/Inaktív - Marad a Stage táblában. \ No newline at end of file diff --git a/docs/V01_gemini/22_ROBOT ÖKOSZISZTÉMA b/docs/V01_gemini/22_ROBOT ÖKOSZISZTÉMA index d1ad5de..dad615c 100644 --- a/docs/V01_gemini/22_ROBOT ÖKOSZISZTÉMA +++ b/docs/V01_gemini/22_ROBOT ÖKOSZISZTÉMA @@ -99,4 +99,15 @@ A Robot 2 három fázisban dolgozik: - **Phase 2 (Deep Enrichment):** Google Places, Web Scraping (Email, telefon, tulajdonos neve). - **Phase 3 (Financial Audit):** Nyilvános cégadatok (Árbevétel, létszám, adózott eredmény) éves szinkronizálása. +# 22. ROBOT ÖKOSZISZTÉMA + +## Robot v1.9.2 (Ghost Commander) & n8n +A robotok és az n8n szoros együttműködésben dolgoznak. + +### Funkciók +- **Auto-Heal:** A járműkatalógus hiányos (null) adatainak automatikus pótlása Holland (RDW) és US (NHTSA) forrásokból. +- **Ban-Detection:** Automatikus "Circuit Breaker" logika. Ha a CarQuery vagy más forrás tilt, a robot átvált "Silent Mode"-ba. +- **Event Hunter:** n8n workflow figyeli a motoros/autós találkozókat és eseményeket, majd összeköti őket a helyi szervizpartnerekkel. +- **Gamification Link:** A robot regisztrálja a felhasználói validálásokat és kiosztja a pontokat/krediteket. + \ No newline at end of file diff --git a/docs/V01_gemini/_00_gemini_gem_kód b/docs/V01_gemini/_00_gemini_gem_kód index 629e222..2e0659f 100644 --- a/docs/V01_gemini/_00_gemini_gem_kód +++ b/docs/V01_gemini/_00_gemini_gem_kód @@ -271,4 +271,4 @@ A rendszer egy magas biztonságú, mikroszolgáltatás-jellegű monolit (Modular könyvtárszerkezetét Bash tree -I "node_modules|vendor|.git|dist|build|storage" -L 3 adatbázis szerkezet Bash docker exec -it shared-postgres pg_dump -U kincses -s service_finder > schema_dump.sq - \ No newline at end of file + \ No newline at end of file diff --git a/full_schema_backup.sql b/full_schema_backup.sql new file mode 100644 index 0000000..e69de29 diff --git a/full_schema_backup_2026-02-14.sql b/full_schema_backup_2026-02-14.sql new file mode 100644 index 0000000..bd7b8e2 --- /dev/null +++ b/full_schema_backup_2026-02-14.sql @@ -0,0 +1,3437 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 15.8 +-- Dumped by pg_dump version 15.8 + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SELECT pg_catalog.set_config('search_path', '', false); +SET check_function_bodies = false; +SET xmloption = content; +SET client_min_messages = warning; +SET row_security = off; + +-- +-- Name: data; Type: SCHEMA; Schema: -; Owner: service_finder_app +-- + +CREATE SCHEMA data; + + +ALTER SCHEMA data OWNER TO service_finder_app; + +-- +-- Name: public; Type: SCHEMA; Schema: -; Owner: service_finder_app +-- + +-- *not* creating schema, since initdb creates it + + +ALTER SCHEMA public OWNER TO service_finder_app; + +-- +-- Name: postgis; Type: EXTENSION; Schema: -; Owner: - +-- + +CREATE EXTENSION IF NOT EXISTS postgis WITH SCHEMA data; + + +-- +-- Name: EXTENSION postgis; Type: COMMENT; Schema: -; Owner: +-- + +COMMENT ON EXTENSION postgis IS 'PostGIS geometry and geography spatial types and functions'; + + +-- +-- Name: actionstatus; Type: TYPE; Schema: data; Owner: service_finder_app +-- + +CREATE TYPE data.actionstatus AS ENUM ( + 'pending', + 'approved', + 'rejected', + 'expired' +); + + +ALTER TYPE data.actionstatus OWNER TO service_finder_app; + +-- +-- Name: logseverity; Type: TYPE; Schema: data; Owner: kincses +-- + +CREATE TYPE data.logseverity AS ENUM ( + 'info', + 'warning', + 'critical', + 'emergency' +); + + +ALTER TYPE data.logseverity OWNER TO kincses; + +-- +-- Name: orgtype; Type: TYPE; Schema: data; Owner: service_finder_app +-- + +CREATE TYPE data.orgtype AS ENUM ( + 'individual', + 'service', + 'service_provider', + 'fleet_owner', + 'club', + 'business' +); + + +ALTER TYPE data.orgtype OWNER TO service_finder_app; + +-- +-- Name: orguserrole; Type: TYPE; Schema: data; Owner: service_finder_app +-- + +CREATE TYPE data.orguserrole AS ENUM ( + 'OWNER', + 'ADMIN', + 'FLEET_MANAGER', + 'DRIVER', + 'MECHANIC', + 'RECEPTIONIST' +); + + +ALTER TYPE data.orguserrole OWNER TO service_finder_app; + +-- +-- Name: userrole; Type: TYPE; Schema: data; Owner: service_finder_app +-- + +CREATE TYPE data.userrole AS ENUM ( + 'admin', + 'user', + 'service', + 'fleet_manager', + 'driver', + 'superadmin' +); + + +ALTER TYPE data.userrole OWNER TO service_finder_app; + +-- +-- Name: emailtype; Type: TYPE; Schema: public; Owner: kincses +-- + +CREATE TYPE public.emailtype AS ENUM ( + 'REGISTRATION', + 'PASSWORD_RESET', + 'GDPR_NOTICE' +); + + +ALTER TYPE public.emailtype OWNER TO kincses; + +-- +-- Name: orgtype; Type: TYPE; Schema: public; Owner: kincses +-- + +CREATE TYPE public.orgtype AS ENUM ( + 'PRIVATE', + 'COMPANY', + 'SERVICE' +); + + +ALTER TYPE public.orgtype OWNER TO kincses; + +-- +-- Name: orguserrole; Type: TYPE; Schema: public; Owner: kincses +-- + +CREATE TYPE public.orguserrole AS ENUM ( + 'OWNER', + 'ADMIN', + 'FLEET_MANAGER', + 'DRIVER', + 'owner', + 'manager', + 'driver', + 'service' +); + + +ALTER TYPE public.orguserrole OWNER TO kincses; + +-- +-- Name: uitheme; Type: TYPE; Schema: public; Owner: kincses +-- + +CREATE TYPE public.uitheme AS ENUM ( + 'LIGHT', + 'DARK', + 'SYSTEM' +); + + +ALTER TYPE public.uitheme OWNER TO kincses; + +-- +-- Name: userrole; Type: TYPE; Schema: public; Owner: kincses +-- + +CREATE TYPE public.userrole AS ENUM ( + 'owner_old', + 'ADMIN', + 'FLEET_MANAGER', + 'DRIVER', + 'owner', + 'admin', + 'user' +); + + +ALTER TYPE public.userrole OWNER TO kincses; + +-- +-- Name: validationstatus; Type: TYPE; Schema: public; Owner: kincses +-- + +CREATE TYPE public.validationstatus AS ENUM ( + 'NOT_VALIDATED', + 'PENDING', + 'VALIDATED', + 'REJECTED' +); + + +ALTER TYPE public.validationstatus OWNER TO kincses; + +SET default_tablespace = ''; + +SET default_table_access_method = heap; + +-- +-- Name: addresses; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.addresses ( + id uuid NOT NULL, + postal_code_id integer, + street_name character varying(200) NOT NULL, + street_type character varying(50) NOT NULL, + house_number character varying(50) NOT NULL, + stairwell character varying(20), + floor character varying(20), + door character varying(20), + parcel_id character varying(50), + full_address_text text, + created_at timestamp with time zone DEFAULT now(), + latitude double precision, + longitude double precision +); + + +ALTER TABLE data.addresses OWNER TO service_finder_app; + +-- +-- Name: asset_assignments; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.asset_assignments ( + id uuid NOT NULL, + asset_id uuid NOT NULL, + organization_id integer NOT NULL, + assigned_at timestamp with time zone DEFAULT now(), + released_at timestamp with time zone, + status character varying(30) +); + + +ALTER TABLE data.asset_assignments OWNER TO service_finder_app; + +-- +-- Name: asset_costs; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.asset_costs ( + id uuid NOT NULL, + asset_id uuid NOT NULL, + organization_id integer NOT NULL, + driver_id integer, + cost_type character varying(50) NOT NULL, + date timestamp with time zone DEFAULT now(), + mileage_at_cost integer, + data jsonb DEFAULT '{}'::jsonb, + amount_local numeric(18,2) NOT NULL, + currency_local character varying(3) NOT NULL, + amount_eur numeric(18,2), + net_amount_local numeric(18,2), + vat_rate numeric(5,2), + exchange_rate_used numeric(18,6) +); + + +ALTER TABLE data.asset_costs OWNER TO service_finder_app; + +-- +-- Name: asset_events; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.asset_events ( + id uuid NOT NULL, + asset_id uuid NOT NULL, + event_type character varying(50) NOT NULL, + recorded_mileage integer, + data jsonb DEFAULT '{}'::jsonb +); + + +ALTER TABLE data.asset_events OWNER TO service_finder_app; + +-- +-- Name: asset_financials; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.asset_financials ( + id integer NOT NULL, + asset_id uuid, + acquisition_price numeric(18,2), + acquisition_date timestamp without time zone, + financing_type character varying, + residual_value_estimate numeric(18,2) +); + + +ALTER TABLE data.asset_financials OWNER TO service_finder_app; + +-- +-- Name: asset_financials_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.asset_financials_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.asset_financials_id_seq OWNER TO service_finder_app; + +-- +-- Name: asset_financials_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.asset_financials_id_seq OWNED BY data.asset_financials.id; + + +-- +-- Name: asset_reviews; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.asset_reviews ( + id integer NOT NULL, + asset_id uuid NOT NULL, + user_id integer NOT NULL, + overall_rating integer, + criteria_scores jsonb DEFAULT '{}'::jsonb, + comment text, + created_at timestamp with time zone DEFAULT now() +); + + +ALTER TABLE data.asset_reviews OWNER TO service_finder_app; + +-- +-- Name: asset_reviews_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.asset_reviews_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.asset_reviews_id_seq OWNER TO service_finder_app; + +-- +-- Name: asset_reviews_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.asset_reviews_id_seq OWNED BY data.asset_reviews.id; + + +-- +-- Name: asset_telemetry; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.asset_telemetry ( + id integer NOT NULL, + asset_id uuid, + current_mileage integer, + mileage_unit character varying(10), + vqi_score numeric(5,2), + dbs_score numeric(5,2) +); + + +ALTER TABLE data.asset_telemetry OWNER TO service_finder_app; + +-- +-- Name: asset_telemetry_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.asset_telemetry_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.asset_telemetry_id_seq OWNER TO service_finder_app; + +-- +-- Name: asset_telemetry_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.asset_telemetry_id_seq OWNED BY data.asset_telemetry.id; + + +-- +-- Name: assets; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.assets ( + id uuid NOT NULL, + vin character varying(17) NOT NULL, + license_plate character varying(20), + name character varying, + year_of_manufacture integer, + catalog_id integer, + is_verified boolean, + status character varying(20), + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone, + current_organization_id integer, + verification_method character varying(20), + verification_notes text, + catalog_match_score numeric(5,2) +); + + +ALTER TABLE data.assets OWNER TO service_finder_app; + +-- +-- Name: audit_logs; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.audit_logs ( + id integer NOT NULL, + user_id integer, + target_type character varying, + target_id character varying, + action character varying NOT NULL, + "timestamp" timestamp with time zone DEFAULT now(), + severity data.logseverity NOT NULL, + old_data json, + new_data json, + ip_address character varying(45), + user_agent text +); + + +ALTER TABLE data.audit_logs OWNER TO service_finder_app; + +-- +-- Name: audit_logs_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.audit_logs_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.audit_logs_id_seq OWNER TO service_finder_app; + +-- +-- Name: audit_logs_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.audit_logs_id_seq OWNED BY data.audit_logs.id; + + +-- +-- Name: badges; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.badges ( + id integer NOT NULL, + name character varying NOT NULL, + description character varying NOT NULL, + icon_url character varying +); + + +ALTER TABLE data.badges OWNER TO service_finder_app; + +-- +-- Name: badges_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.badges_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.badges_id_seq OWNER TO service_finder_app; + +-- +-- Name: badges_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.badges_id_seq OWNED BY data.badges.id; + + +-- +-- Name: credit_logs; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.credit_logs ( + id integer NOT NULL, + org_id integer, + amount numeric(10,2), + description character varying, + created_at timestamp without time zone DEFAULT now() +); + + +ALTER TABLE data.credit_logs OWNER TO service_finder_app; + +-- +-- Name: credit_logs_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.credit_logs_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.credit_logs_id_seq OWNER TO service_finder_app; + +-- +-- Name: credit_logs_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.credit_logs_id_seq OWNED BY data.credit_logs.id; + + +-- +-- Name: documents; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.documents ( + id uuid NOT NULL, + parent_type character varying(20) NOT NULL, + parent_id character varying(50) NOT NULL, + doc_type character varying(50), + original_name character varying(255) NOT NULL, + file_hash character varying(64) NOT NULL, + file_ext character varying(10), + mime_type character varying(100), + file_size integer, + has_thumbnail boolean, + thumbnail_path character varying(255), + uploaded_by integer, + created_at timestamp with time zone DEFAULT now() +); + + +ALTER TABLE data.documents OWNER TO service_finder_app; + +-- +-- Name: exchange_rates; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.exchange_rates ( + id integer NOT NULL, + base_currency character varying(3), + target_currency character varying(3), + rate numeric(18,6) NOT NULL +); + + +ALTER TABLE data.exchange_rates OWNER TO service_finder_app; + +-- +-- Name: exchange_rates_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.exchange_rates_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.exchange_rates_id_seq OWNER TO service_finder_app; + +-- +-- Name: exchange_rates_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.exchange_rates_id_seq OWNED BY data.exchange_rates.id; + + +-- +-- Name: expertise_tags; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.expertise_tags ( + id integer NOT NULL, + key character varying(50), + name_hu character varying(100), + category character varying(30) +); + + +ALTER TABLE data.expertise_tags OWNER TO service_finder_app; + +-- +-- Name: expertise_tags_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.expertise_tags_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.expertise_tags_id_seq OWNER TO service_finder_app; + +-- +-- Name: expertise_tags_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.expertise_tags_id_seq OWNED BY data.expertise_tags.id; + + +-- +-- Name: geo_postal_codes; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.geo_postal_codes ( + id integer NOT NULL, + country_code character varying(5), + zip_code character varying(10) NOT NULL, + city character varying(100) NOT NULL +); + + +ALTER TABLE data.geo_postal_codes OWNER TO service_finder_app; + +-- +-- Name: geo_postal_codes_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.geo_postal_codes_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.geo_postal_codes_id_seq OWNER TO service_finder_app; + +-- +-- Name: geo_postal_codes_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.geo_postal_codes_id_seq OWNED BY data.geo_postal_codes.id; + + +-- +-- Name: geo_street_types; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.geo_street_types ( + id integer NOT NULL, + name character varying(50) NOT NULL +); + + +ALTER TABLE data.geo_street_types OWNER TO service_finder_app; + +-- +-- Name: geo_street_types_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.geo_street_types_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.geo_street_types_id_seq OWNER TO service_finder_app; + +-- +-- Name: geo_street_types_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.geo_street_types_id_seq OWNED BY data.geo_street_types.id; + + +-- +-- Name: geo_streets; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.geo_streets ( + id integer NOT NULL, + postal_code_id integer, + name character varying(200) NOT NULL +); + + +ALTER TABLE data.geo_streets OWNER TO service_finder_app; + +-- +-- Name: geo_streets_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.geo_streets_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.geo_streets_id_seq OWNER TO service_finder_app; + +-- +-- Name: geo_streets_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.geo_streets_id_seq OWNED BY data.geo_streets.id; + + +-- +-- Name: level_configs; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.level_configs ( + id integer NOT NULL, + level_number integer NOT NULL, + min_points integer NOT NULL, + rank_name character varying NOT NULL +); + + +ALTER TABLE data.level_configs OWNER TO service_finder_app; + +-- +-- Name: level_configs_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.level_configs_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.level_configs_id_seq OWNER TO service_finder_app; + +-- +-- Name: level_configs_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.level_configs_id_seq OWNED BY data.level_configs.id; + + +-- +-- Name: org_subscriptions; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.org_subscriptions ( + id integer NOT NULL, + org_id integer, + tier_id integer, + valid_from timestamp without time zone DEFAULT now(), + valid_until timestamp without time zone, + is_active boolean +); + + +ALTER TABLE data.org_subscriptions OWNER TO service_finder_app; + +-- +-- Name: org_subscriptions_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.org_subscriptions_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.org_subscriptions_id_seq OWNER TO service_finder_app; + +-- +-- Name: org_subscriptions_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.org_subscriptions_id_seq OWNED BY data.org_subscriptions.id; + + +-- +-- Name: organization_financials; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.organization_financials ( + id integer NOT NULL, + organization_id integer NOT NULL, + year integer NOT NULL, + turnover numeric(18,2), + profit numeric(18,2), + employee_count integer, + source character varying(50), + updated_at timestamp with time zone DEFAULT now() +); + + +ALTER TABLE data.organization_financials OWNER TO service_finder_app; + +-- +-- Name: organization_financials_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.organization_financials_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.organization_financials_id_seq OWNER TO service_finder_app; + +-- +-- Name: organization_financials_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.organization_financials_id_seq OWNED BY data.organization_financials.id; + + +-- +-- Name: organization_members; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.organization_members ( + id integer NOT NULL, + organization_id integer NOT NULL, + user_id integer, + role data.orguserrole, + permissions json DEFAULT '{}'::jsonb, + person_id bigint, + is_permanent boolean, + is_verified boolean +); + + +ALTER TABLE data.organization_members OWNER TO service_finder_app; + +-- +-- Name: organization_members_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.organization_members_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.organization_members_id_seq OWNER TO service_finder_app; + +-- +-- Name: organization_members_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.organization_members_id_seq OWNED BY data.organization_members.id; + + +-- +-- Name: organizations; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.organizations ( + id integer NOT NULL, + address_id uuid, + full_name character varying NOT NULL, + name character varying NOT NULL, + display_name character varying(50), + default_currency character varying(3), + country_code character varying(2), + language character varying(5), + address_zip character varying(10), + address_city character varying(100), + address_street_name character varying(150), + address_street_type character varying(50), + address_house_number character varying(20), + address_hrsz character varying(50), + tax_number character varying(20), + reg_number character varying(50), + org_type data.orgtype, + status character varying(30), + is_deleted boolean, + notification_settings json DEFAULT '{"notify_owner": true, "alert_days_before": [30, 15, 7, 1]}'::jsonb, + external_integration_config json DEFAULT '{}'::jsonb, + owner_id integer, + is_active boolean, + is_verified boolean, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone, + folder_slug character varying(12) +); + + +ALTER TABLE data.organizations OWNER TO service_finder_app; + +-- +-- Name: organizations_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.organizations_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.organizations_id_seq OWNER TO service_finder_app; + +-- +-- Name: organizations_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.organizations_id_seq OWNED BY data.organizations.id; + + +-- +-- Name: pending_actions; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.pending_actions ( + id integer NOT NULL, + requester_id integer NOT NULL, + approver_id integer, + status data.actionstatus NOT NULL, + action_type character varying(50) NOT NULL, + payload json NOT NULL, + reason character varying(255) NOT NULL, + created_at timestamp with time zone DEFAULT now(), + expires_at timestamp with time zone, + processed_at timestamp with time zone +); + + +ALTER TABLE data.pending_actions OWNER TO service_finder_app; + +-- +-- Name: pending_actions_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.pending_actions_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.pending_actions_id_seq OWNER TO service_finder_app; + +-- +-- Name: pending_actions_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.pending_actions_id_seq OWNED BY data.pending_actions.id; + + +-- +-- Name: persons; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.persons ( + id bigint NOT NULL, + id_uuid uuid NOT NULL, + address_id uuid, + last_name character varying NOT NULL, + first_name character varying NOT NULL, + phone character varying, + identity_docs json DEFAULT '{}'::jsonb, + is_active boolean NOT NULL, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone, + mothers_last_name character varying, + mothers_first_name character varying, + birth_place character varying, + birth_date timestamp without time zone, + ice_contact json DEFAULT '{}'::jsonb, + is_ghost boolean DEFAULT true NOT NULL +); + + +ALTER TABLE data.persons OWNER TO service_finder_app; + +-- +-- Name: persons_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.persons_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.persons_id_seq OWNER TO service_finder_app; + +-- +-- Name: persons_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.persons_id_seq OWNED BY data.persons.id; + + +-- +-- Name: point_rules; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.point_rules ( + id integer NOT NULL, + action_key character varying NOT NULL, + points integer NOT NULL, + description character varying, + is_active boolean NOT NULL +); + + +ALTER TABLE data.point_rules OWNER TO service_finder_app; + +-- +-- Name: point_rules_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.point_rules_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.point_rules_id_seq OWNER TO service_finder_app; + +-- +-- Name: point_rules_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.point_rules_id_seq OWNED BY data.point_rules.id; + + +-- +-- Name: points_ledger; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.points_ledger ( + id integer NOT NULL, + user_id integer NOT NULL, + points integer NOT NULL, + reason character varying NOT NULL, + created_at timestamp without time zone NOT NULL, + penalty_change integer DEFAULT 0 NOT NULL +); + + +ALTER TABLE data.points_ledger OWNER TO service_finder_app; + +-- +-- Name: points_ledger_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.points_ledger_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.points_ledger_id_seq OWNER TO service_finder_app; + +-- +-- Name: points_ledger_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.points_ledger_id_seq OWNED BY data.points_ledger.id; + + +-- +-- Name: ratings; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.ratings ( + id uuid NOT NULL, + author_id integer NOT NULL, + target_type character varying(20) NOT NULL, + target_id uuid NOT NULL, + score integer NOT NULL, + comment character varying +); + + +ALTER TABLE data.ratings OWNER TO service_finder_app; + +-- +-- Name: regional_settings; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.regional_settings ( + id integer NOT NULL, + country_code character varying NOT NULL, + currency character varying NOT NULL, + is_active boolean NOT NULL +); + + +ALTER TABLE data.regional_settings OWNER TO service_finder_app; + +-- +-- Name: regional_settings_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.regional_settings_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.regional_settings_id_seq OWNER TO service_finder_app; + +-- +-- Name: regional_settings_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.regional_settings_id_seq OWNED BY data.regional_settings.id; + + +-- +-- Name: service_expertises; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.service_expertises ( + service_id integer NOT NULL, + expertise_id integer NOT NULL, + validation_level integer DEFAULT 0 +); + + +ALTER TABLE data.service_expertises OWNER TO service_finder_app; + +-- +-- Name: service_profiles; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.service_profiles ( + id integer NOT NULL, + organization_id integer, + location data.geometry(Point,4326), + trust_score integer DEFAULT 30, + is_verified boolean DEFAULT false, + verification_log json DEFAULT '{}'::jsonb, + opening_hours json DEFAULT '{}'::jsonb, + contact_phone character varying, + website character varying, + bio text, + status character varying(20) DEFAULT 'ghost'::character varying, + last_audit_at timestamp with time zone DEFAULT now(), + google_place_id character varying(100), + rating double precision, + user_ratings_total integer, + specialization_tags jsonb DEFAULT '{}'::jsonb +); + + +ALTER TABLE data.service_profiles OWNER TO service_finder_app; + +-- +-- Name: service_profiles_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.service_profiles_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.service_profiles_id_seq OWNER TO service_finder_app; + +-- +-- Name: service_profiles_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.service_profiles_id_seq OWNED BY data.service_profiles.id; + + +-- +-- Name: service_specialties; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.service_specialties ( + id integer NOT NULL, + parent_id integer, + name character varying NOT NULL, + slug character varying +); + + +ALTER TABLE data.service_specialties OWNER TO service_finder_app; + +-- +-- Name: service_specialties_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.service_specialties_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.service_specialties_id_seq OWNER TO service_finder_app; + +-- +-- Name: service_specialties_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.service_specialties_id_seq OWNED BY data.service_specialties.id; + + +-- +-- Name: social_accounts; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.social_accounts ( + id integer NOT NULL, + user_id integer NOT NULL, + provider character varying(50) NOT NULL, + social_id character varying(255) NOT NULL, + email character varying(255) NOT NULL, + extra_data json DEFAULT '{}'::jsonb, + created_at timestamp with time zone DEFAULT now() +); + + +ALTER TABLE data.social_accounts OWNER TO service_finder_app; + +-- +-- Name: social_accounts_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.social_accounts_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.social_accounts_id_seq OWNER TO service_finder_app; + +-- +-- Name: social_accounts_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.social_accounts_id_seq OWNED BY data.social_accounts.id; + + +-- +-- Name: subscription_tiers; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.subscription_tiers ( + id integer NOT NULL, + name character varying, + rules json, + is_custom boolean +); + + +ALTER TABLE data.subscription_tiers OWNER TO service_finder_app; + +-- +-- Name: subscription_tiers_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.subscription_tiers_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.subscription_tiers_id_seq OWNER TO service_finder_app; + +-- +-- Name: subscription_tiers_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.subscription_tiers_id_seq OWNED BY data.subscription_tiers.id; + + +-- +-- Name: system_parameters; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.system_parameters ( + key character varying(50) NOT NULL, + value json NOT NULL, + is_active boolean, + description character varying, + updated_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP +); + + +ALTER TABLE data.system_parameters OWNER TO service_finder_app; + +-- +-- Name: translations; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.translations ( + id integer NOT NULL, + key character varying(100) NOT NULL, + lang_code character varying(5) NOT NULL, + value text NOT NULL, + is_published boolean +); + + +ALTER TABLE data.translations OWNER TO service_finder_app; + +-- +-- Name: translations_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.translations_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.translations_id_seq OWNER TO service_finder_app; + +-- +-- Name: translations_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.translations_id_seq OWNED BY data.translations.id; + + +-- +-- Name: user_badges; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.user_badges ( + id integer NOT NULL, + user_id integer NOT NULL, + badge_id integer NOT NULL, + earned_at timestamp without time zone NOT NULL +); + + +ALTER TABLE data.user_badges OWNER TO service_finder_app; + +-- +-- Name: user_badges_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.user_badges_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.user_badges_id_seq OWNER TO service_finder_app; + +-- +-- Name: user_badges_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.user_badges_id_seq OWNED BY data.user_badges.id; + + +-- +-- Name: user_stats; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.user_stats ( + user_id integer NOT NULL, + total_xp integer NOT NULL, + social_points integer NOT NULL, + current_level integer NOT NULL, + updated_at timestamp without time zone NOT NULL, + penalty_points integer DEFAULT 0 NOT NULL, + restriction_level integer DEFAULT 0 NOT NULL +); + + +ALTER TABLE data.user_stats OWNER TO service_finder_app; + +-- +-- Name: users; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.users ( + id integer NOT NULL, + email character varying NOT NULL, + hashed_password character varying, + role data.userrole, + is_active boolean, + is_deleted boolean, + person_id bigint, + created_at timestamp with time zone DEFAULT now(), + scope_level character varying(30) DEFAULT 'individual'::character varying, + scope_id character varying(50), + custom_permissions json DEFAULT '{}'::jsonb, + preferred_language character varying(5) DEFAULT 'hu'::character varying, + region_code character varying(5) DEFAULT 'HU'::character varying, + folder_slug character varying(12), + refresh_token_hash character varying(255), + two_factor_secret character varying(100), + two_factor_enabled boolean, + preferred_currency character varying(3) DEFAULT 'HUF'::character varying +); + + +ALTER TABLE data.users OWNER TO service_finder_app; + +-- +-- Name: users_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.users_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.users_id_seq OWNER TO service_finder_app; + +-- +-- Name: users_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.users_id_seq OWNED BY data.users.id; + + +-- +-- Name: vehicle_catalog; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.vehicle_catalog ( + id integer NOT NULL, + make character varying NOT NULL, + model character varying NOT NULL, + generation character varying, + year_from integer, + year_to integer, + vehicle_class character varying, + fuel_type character varying, + engine_code character varying, + factory_data jsonb DEFAULT '{}'::jsonb, + engine_variant character varying +); + + +ALTER TABLE data.vehicle_catalog OWNER TO service_finder_app; + +-- +-- Name: vehicle_catalog_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.vehicle_catalog_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.vehicle_catalog_id_seq OWNER TO service_finder_app; + +-- +-- Name: vehicle_catalog_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.vehicle_catalog_id_seq OWNED BY data.vehicle_catalog.id; + + +-- +-- Name: vehicle_ownerships; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.vehicle_ownerships ( + id integer NOT NULL, + vehicle_id uuid NOT NULL, + user_id integer NOT NULL, + start_date date NOT NULL, + end_date date, + notes text +); + + +ALTER TABLE data.vehicle_ownerships OWNER TO service_finder_app; + +-- +-- Name: vehicle_ownerships_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.vehicle_ownerships_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.vehicle_ownerships_id_seq OWNER TO service_finder_app; + +-- +-- Name: vehicle_ownerships_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.vehicle_ownerships_id_seq OWNED BY data.vehicle_ownerships.id; + + +-- +-- Name: verification_tokens; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.verification_tokens ( + id integer NOT NULL, + token uuid NOT NULL, + user_id integer NOT NULL, + token_type character varying(20) NOT NULL, + created_at timestamp with time zone DEFAULT now(), + expires_at timestamp with time zone NOT NULL, + is_used boolean +); + + +ALTER TABLE data.verification_tokens OWNER TO service_finder_app; + +-- +-- Name: verification_tokens_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.verification_tokens_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.verification_tokens_id_seq OWNER TO service_finder_app; + +-- +-- Name: verification_tokens_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.verification_tokens_id_seq OWNED BY data.verification_tokens.id; + + +-- +-- Name: wallets; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.wallets ( + id integer NOT NULL, + user_id integer, + coin_balance numeric(18,2), + credit_balance numeric(18,2), + currency character varying(3) +); + + +ALTER TABLE data.wallets OWNER TO service_finder_app; + +-- +-- Name: wallets_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.wallets_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.wallets_id_seq OWNER TO service_finder_app; + +-- +-- Name: wallets_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.wallets_id_seq OWNED BY data.wallets.id; + + +-- +-- Name: alembic_version; Type: TABLE; Schema: public; Owner: service_finder_app +-- + +CREATE TABLE public.alembic_version ( + version_num character varying(32) NOT NULL +); + + +ALTER TABLE public.alembic_version OWNER TO service_finder_app; + +-- +-- Name: asset_financials id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_financials ALTER COLUMN id SET DEFAULT nextval('data.asset_financials_id_seq'::regclass); + + +-- +-- Name: asset_reviews id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_reviews ALTER COLUMN id SET DEFAULT nextval('data.asset_reviews_id_seq'::regclass); + + +-- +-- Name: asset_telemetry id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_telemetry ALTER COLUMN id SET DEFAULT nextval('data.asset_telemetry_id_seq'::regclass); + + +-- +-- Name: audit_logs id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.audit_logs ALTER COLUMN id SET DEFAULT nextval('data.audit_logs_id_seq'::regclass); + + +-- +-- Name: badges id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.badges ALTER COLUMN id SET DEFAULT nextval('data.badges_id_seq'::regclass); + + +-- +-- Name: credit_logs id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.credit_logs ALTER COLUMN id SET DEFAULT nextval('data.credit_logs_id_seq'::regclass); + + +-- +-- Name: exchange_rates id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.exchange_rates ALTER COLUMN id SET DEFAULT nextval('data.exchange_rates_id_seq'::regclass); + + +-- +-- Name: expertise_tags id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.expertise_tags ALTER COLUMN id SET DEFAULT nextval('data.expertise_tags_id_seq'::regclass); + + +-- +-- Name: geo_postal_codes id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.geo_postal_codes ALTER COLUMN id SET DEFAULT nextval('data.geo_postal_codes_id_seq'::regclass); + + +-- +-- Name: geo_street_types id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.geo_street_types ALTER COLUMN id SET DEFAULT nextval('data.geo_street_types_id_seq'::regclass); + + +-- +-- Name: geo_streets id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.geo_streets ALTER COLUMN id SET DEFAULT nextval('data.geo_streets_id_seq'::regclass); + + +-- +-- Name: level_configs id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.level_configs ALTER COLUMN id SET DEFAULT nextval('data.level_configs_id_seq'::regclass); + + +-- +-- Name: org_subscriptions id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.org_subscriptions ALTER COLUMN id SET DEFAULT nextval('data.org_subscriptions_id_seq'::regclass); + + +-- +-- Name: organization_financials id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.organization_financials ALTER COLUMN id SET DEFAULT nextval('data.organization_financials_id_seq'::regclass); + + +-- +-- Name: organization_members id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.organization_members ALTER COLUMN id SET DEFAULT nextval('data.organization_members_id_seq'::regclass); + + +-- +-- Name: organizations id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.organizations ALTER COLUMN id SET DEFAULT nextval('data.organizations_id_seq'::regclass); + + +-- +-- Name: pending_actions id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.pending_actions ALTER COLUMN id SET DEFAULT nextval('data.pending_actions_id_seq'::regclass); + + +-- +-- Name: persons id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.persons ALTER COLUMN id SET DEFAULT nextval('data.persons_id_seq'::regclass); + + +-- +-- Name: point_rules id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.point_rules ALTER COLUMN id SET DEFAULT nextval('data.point_rules_id_seq'::regclass); + + +-- +-- Name: points_ledger id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.points_ledger ALTER COLUMN id SET DEFAULT nextval('data.points_ledger_id_seq'::regclass); + + +-- +-- Name: regional_settings id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.regional_settings ALTER COLUMN id SET DEFAULT nextval('data.regional_settings_id_seq'::regclass); + + +-- +-- Name: service_profiles id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.service_profiles ALTER COLUMN id SET DEFAULT nextval('data.service_profiles_id_seq'::regclass); + + +-- +-- Name: service_specialties id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.service_specialties ALTER COLUMN id SET DEFAULT nextval('data.service_specialties_id_seq'::regclass); + + +-- +-- Name: social_accounts id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.social_accounts ALTER COLUMN id SET DEFAULT nextval('data.social_accounts_id_seq'::regclass); + + +-- +-- Name: subscription_tiers id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.subscription_tiers ALTER COLUMN id SET DEFAULT nextval('data.subscription_tiers_id_seq'::regclass); + + +-- +-- Name: translations id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.translations ALTER COLUMN id SET DEFAULT nextval('data.translations_id_seq'::regclass); + + +-- +-- Name: user_badges id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.user_badges ALTER COLUMN id SET DEFAULT nextval('data.user_badges_id_seq'::regclass); + + +-- +-- Name: users id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.users ALTER COLUMN id SET DEFAULT nextval('data.users_id_seq'::regclass); + + +-- +-- Name: vehicle_catalog id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.vehicle_catalog ALTER COLUMN id SET DEFAULT nextval('data.vehicle_catalog_id_seq'::regclass); + + +-- +-- Name: vehicle_ownerships id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.vehicle_ownerships ALTER COLUMN id SET DEFAULT nextval('data.vehicle_ownerships_id_seq'::regclass); + + +-- +-- Name: verification_tokens id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.verification_tokens ALTER COLUMN id SET DEFAULT nextval('data.verification_tokens_id_seq'::regclass); + + +-- +-- Name: wallets id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.wallets ALTER COLUMN id SET DEFAULT nextval('data.wallets_id_seq'::regclass); + + +-- +-- Name: addresses addresses_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.addresses + ADD CONSTRAINT addresses_pkey PRIMARY KEY (id); + + +-- +-- Name: asset_assignments asset_assignments_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_assignments + ADD CONSTRAINT asset_assignments_pkey PRIMARY KEY (id); + + +-- +-- Name: asset_costs asset_costs_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_costs + ADD CONSTRAINT asset_costs_pkey PRIMARY KEY (id); + + +-- +-- Name: asset_events asset_events_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_events + ADD CONSTRAINT asset_events_pkey PRIMARY KEY (id); + + +-- +-- Name: asset_financials asset_financials_asset_id_key; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_financials + ADD CONSTRAINT asset_financials_asset_id_key UNIQUE (asset_id); + + +-- +-- Name: asset_financials asset_financials_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_financials + ADD CONSTRAINT asset_financials_pkey PRIMARY KEY (id); + + +-- +-- Name: asset_reviews asset_reviews_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_reviews + ADD CONSTRAINT asset_reviews_pkey PRIMARY KEY (id); + + +-- +-- Name: asset_telemetry asset_telemetry_asset_id_key; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_telemetry + ADD CONSTRAINT asset_telemetry_asset_id_key UNIQUE (asset_id); + + +-- +-- Name: asset_telemetry asset_telemetry_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_telemetry + ADD CONSTRAINT asset_telemetry_pkey PRIMARY KEY (id); + + +-- +-- Name: assets assets_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.assets + ADD CONSTRAINT assets_pkey PRIMARY KEY (id); + + +-- +-- Name: audit_logs audit_logs_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.audit_logs + ADD CONSTRAINT audit_logs_pkey PRIMARY KEY (id); + + +-- +-- Name: badges badges_name_key; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.badges + ADD CONSTRAINT badges_name_key UNIQUE (name); + + +-- +-- Name: badges badges_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.badges + ADD CONSTRAINT badges_pkey PRIMARY KEY (id); + + +-- +-- Name: credit_logs credit_logs_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.credit_logs + ADD CONSTRAINT credit_logs_pkey PRIMARY KEY (id); + + +-- +-- Name: documents documents_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.documents + ADD CONSTRAINT documents_pkey PRIMARY KEY (id); + + +-- +-- Name: exchange_rates exchange_rates_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.exchange_rates + ADD CONSTRAINT exchange_rates_pkey PRIMARY KEY (id); + + +-- +-- Name: exchange_rates exchange_rates_target_currency_key; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.exchange_rates + ADD CONSTRAINT exchange_rates_target_currency_key UNIQUE (target_currency); + + +-- +-- Name: expertise_tags expertise_tags_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.expertise_tags + ADD CONSTRAINT expertise_tags_pkey PRIMARY KEY (id); + + +-- +-- Name: geo_postal_codes geo_postal_codes_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.geo_postal_codes + ADD CONSTRAINT geo_postal_codes_pkey PRIMARY KEY (id); + + +-- +-- Name: geo_street_types geo_street_types_name_key; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.geo_street_types + ADD CONSTRAINT geo_street_types_name_key UNIQUE (name); + + +-- +-- Name: geo_street_types geo_street_types_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.geo_street_types + ADD CONSTRAINT geo_street_types_pkey PRIMARY KEY (id); + + +-- +-- Name: geo_streets geo_streets_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.geo_streets + ADD CONSTRAINT geo_streets_pkey PRIMARY KEY (id); + + +-- +-- Name: level_configs level_configs_level_number_key; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.level_configs + ADD CONSTRAINT level_configs_level_number_key UNIQUE (level_number); + + +-- +-- Name: level_configs level_configs_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.level_configs + ADD CONSTRAINT level_configs_pkey PRIMARY KEY (id); + + +-- +-- Name: org_subscriptions org_subscriptions_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.org_subscriptions + ADD CONSTRAINT org_subscriptions_pkey PRIMARY KEY (id); + + +-- +-- Name: organization_financials organization_financials_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.organization_financials + ADD CONSTRAINT organization_financials_pkey PRIMARY KEY (id); + + +-- +-- Name: organization_members organization_members_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.organization_members + ADD CONSTRAINT organization_members_pkey PRIMARY KEY (id); + + +-- +-- Name: organizations organizations_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.organizations + ADD CONSTRAINT organizations_pkey PRIMARY KEY (id); + + +-- +-- Name: pending_actions pending_actions_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.pending_actions + ADD CONSTRAINT pending_actions_pkey PRIMARY KEY (id); + + +-- +-- Name: persons persons_id_uuid_key; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.persons + ADD CONSTRAINT persons_id_uuid_key UNIQUE (id_uuid); + + +-- +-- Name: persons persons_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.persons + ADD CONSTRAINT persons_pkey PRIMARY KEY (id); + + +-- +-- Name: point_rules point_rules_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.point_rules + ADD CONSTRAINT point_rules_pkey PRIMARY KEY (id); + + +-- +-- Name: points_ledger points_ledger_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.points_ledger + ADD CONSTRAINT points_ledger_pkey PRIMARY KEY (id); + + +-- +-- Name: ratings ratings_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.ratings + ADD CONSTRAINT ratings_pkey PRIMARY KEY (id); + + +-- +-- Name: regional_settings regional_settings_country_code_key; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.regional_settings + ADD CONSTRAINT regional_settings_country_code_key UNIQUE (country_code); + + +-- +-- Name: regional_settings regional_settings_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.regional_settings + ADD CONSTRAINT regional_settings_pkey PRIMARY KEY (id); + + +-- +-- Name: service_expertises service_expertises_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.service_expertises + ADD CONSTRAINT service_expertises_pkey PRIMARY KEY (service_id, expertise_id); + + +-- +-- Name: service_profiles service_profiles_google_place_id_key; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.service_profiles + ADD CONSTRAINT service_profiles_google_place_id_key UNIQUE (google_place_id); + + +-- +-- Name: service_profiles service_profiles_organization_id_key; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.service_profiles + ADD CONSTRAINT service_profiles_organization_id_key UNIQUE (organization_id); + + +-- +-- Name: service_profiles service_profiles_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.service_profiles + ADD CONSTRAINT service_profiles_pkey PRIMARY KEY (id); + + +-- +-- Name: service_specialties service_specialties_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.service_specialties + ADD CONSTRAINT service_specialties_pkey PRIMARY KEY (id); + + +-- +-- Name: service_specialties service_specialties_slug_key; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.service_specialties + ADD CONSTRAINT service_specialties_slug_key UNIQUE (slug); + + +-- +-- Name: social_accounts social_accounts_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.social_accounts + ADD CONSTRAINT social_accounts_pkey PRIMARY KEY (id); + + +-- +-- Name: subscription_tiers subscription_tiers_name_key; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.subscription_tiers + ADD CONSTRAINT subscription_tiers_name_key UNIQUE (name); + + +-- +-- Name: subscription_tiers subscription_tiers_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.subscription_tiers + ADD CONSTRAINT subscription_tiers_pkey PRIMARY KEY (id); + + +-- +-- Name: system_parameters system_parameters_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.system_parameters + ADD CONSTRAINT system_parameters_pkey PRIMARY KEY (key); + + +-- +-- Name: translations translations_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.translations + ADD CONSTRAINT translations_pkey PRIMARY KEY (id); + + +-- +-- Name: social_accounts uix_social_provider_id; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.social_accounts + ADD CONSTRAINT uix_social_provider_id UNIQUE (provider, social_id); + + +-- +-- Name: vehicle_catalog uix_vehicle_catalog_full; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.vehicle_catalog + ADD CONSTRAINT uix_vehicle_catalog_full UNIQUE (make, model, year_from, engine_variant, fuel_type); + + +-- +-- Name: translations uq_translation_key_lang; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.translations + ADD CONSTRAINT uq_translation_key_lang UNIQUE (key, lang_code); + + +-- +-- Name: user_badges user_badges_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.user_badges + ADD CONSTRAINT user_badges_pkey PRIMARY KEY (id); + + +-- +-- Name: user_stats user_stats_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.user_stats + ADD CONSTRAINT user_stats_pkey PRIMARY KEY (user_id); + + +-- +-- Name: users users_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.users + ADD CONSTRAINT users_pkey PRIMARY KEY (id); + + +-- +-- Name: vehicle_catalog vehicle_catalog_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.vehicle_catalog + ADD CONSTRAINT vehicle_catalog_pkey PRIMARY KEY (id); + + +-- +-- Name: vehicle_ownerships vehicle_ownerships_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.vehicle_ownerships + ADD CONSTRAINT vehicle_ownerships_pkey PRIMARY KEY (id); + + +-- +-- Name: verification_tokens verification_tokens_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.verification_tokens + ADD CONSTRAINT verification_tokens_pkey PRIMARY KEY (id); + + +-- +-- Name: verification_tokens verification_tokens_token_key; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.verification_tokens + ADD CONSTRAINT verification_tokens_token_key UNIQUE (token); + + +-- +-- Name: wallets wallets_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.wallets + ADD CONSTRAINT wallets_pkey PRIMARY KEY (id); + + +-- +-- Name: wallets wallets_user_id_key; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.wallets + ADD CONSTRAINT wallets_user_id_key UNIQUE (user_id); + + +-- +-- Name: alembic_version alembic_version_pkc; Type: CONSTRAINT; Schema: public; Owner: service_finder_app +-- + +ALTER TABLE ONLY public.alembic_version + ADD CONSTRAINT alembic_version_pkc PRIMARY KEY (version_num); + + +-- +-- Name: idx_service_profiles_location; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX idx_service_profiles_location ON data.service_profiles USING gist (location); + + +-- +-- Name: ix_data_assets_license_plate; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_assets_license_plate ON data.assets USING btree (license_plate); + + +-- +-- Name: ix_data_assets_vin; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE UNIQUE INDEX ix_data_assets_vin ON data.assets USING btree (vin); + + +-- +-- Name: ix_data_audit_logs_action; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_audit_logs_action ON data.audit_logs USING btree (action); + + +-- +-- Name: ix_data_audit_logs_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_audit_logs_id ON data.audit_logs USING btree (id); + + +-- +-- Name: ix_data_audit_logs_ip_address; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_audit_logs_ip_address ON data.audit_logs USING btree (ip_address); + + +-- +-- Name: ix_data_audit_logs_target_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_audit_logs_target_id ON data.audit_logs USING btree (target_id); + + +-- +-- Name: ix_data_audit_logs_target_type; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_audit_logs_target_type ON data.audit_logs USING btree (target_type); + + +-- +-- Name: ix_data_audit_logs_timestamp; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_audit_logs_timestamp ON data.audit_logs USING btree ("timestamp"); + + +-- +-- Name: ix_data_badges_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_badges_id ON data.badges USING btree (id); + + +-- +-- Name: ix_data_expertise_tags_key; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE UNIQUE INDEX ix_data_expertise_tags_key ON data.expertise_tags USING btree (key); + + +-- +-- Name: ix_data_level_configs_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_level_configs_id ON data.level_configs USING btree (id); + + +-- +-- Name: ix_data_organization_financials_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_organization_financials_id ON data.organization_financials USING btree (id); + + +-- +-- Name: ix_data_organization_members_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_organization_members_id ON data.organization_members USING btree (id); + + +-- +-- Name: ix_data_organizations_folder_slug; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE UNIQUE INDEX ix_data_organizations_folder_slug ON data.organizations USING btree (folder_slug); + + +-- +-- Name: ix_data_organizations_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_organizations_id ON data.organizations USING btree (id); + + +-- +-- Name: ix_data_organizations_tax_number; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE UNIQUE INDEX ix_data_organizations_tax_number ON data.organizations USING btree (tax_number); + + +-- +-- Name: ix_data_pending_actions_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_pending_actions_id ON data.pending_actions USING btree (id); + + +-- +-- Name: ix_data_persons_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_persons_id ON data.persons USING btree (id); + + +-- +-- Name: ix_data_point_rules_action_key; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE UNIQUE INDEX ix_data_point_rules_action_key ON data.point_rules USING btree (action_key); + + +-- +-- Name: ix_data_point_rules_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_point_rules_id ON data.point_rules USING btree (id); + + +-- +-- Name: ix_data_points_ledger_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_points_ledger_id ON data.points_ledger USING btree (id); + + +-- +-- Name: ix_data_regional_settings_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_regional_settings_id ON data.regional_settings USING btree (id); + + +-- +-- Name: ix_data_service_profiles_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_service_profiles_id ON data.service_profiles USING btree (id); + + +-- +-- Name: ix_data_service_profiles_location; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_service_profiles_location ON data.service_profiles USING btree (location); + + +-- +-- Name: ix_data_service_profiles_status; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_service_profiles_status ON data.service_profiles USING btree (status); + + +-- +-- Name: ix_data_social_accounts_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_social_accounts_id ON data.social_accounts USING btree (id); + + +-- +-- Name: ix_data_social_accounts_social_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_social_accounts_social_id ON data.social_accounts USING btree (social_id); + + +-- +-- Name: ix_data_system_parameters_key; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_system_parameters_key ON data.system_parameters USING btree (key); + + +-- +-- Name: ix_data_translations_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_translations_id ON data.translations USING btree (id); + + +-- +-- Name: ix_data_translations_key; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_translations_key ON data.translations USING btree (key); + + +-- +-- Name: ix_data_translations_lang_code; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_translations_lang_code ON data.translations USING btree (lang_code); + + +-- +-- Name: ix_data_user_badges_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_user_badges_id ON data.user_badges USING btree (id); + + +-- +-- Name: ix_data_users_email; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE UNIQUE INDEX ix_data_users_email ON data.users USING btree (email); + + +-- +-- Name: ix_data_users_folder_slug; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE UNIQUE INDEX ix_data_users_folder_slug ON data.users USING btree (folder_slug); + + +-- +-- Name: ix_data_users_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_users_id ON data.users USING btree (id); + + +-- +-- Name: ix_data_vehicle_catalog_engine_variant; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_vehicle_catalog_engine_variant ON data.vehicle_catalog USING btree (engine_variant); + + +-- +-- Name: ix_data_vehicle_catalog_fuel_type; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_vehicle_catalog_fuel_type ON data.vehicle_catalog USING btree (fuel_type); + + +-- +-- Name: ix_data_vehicle_catalog_generation; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_vehicle_catalog_generation ON data.vehicle_catalog USING btree (generation); + + +-- +-- Name: ix_data_vehicle_catalog_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_vehicle_catalog_id ON data.vehicle_catalog USING btree (id); + + +-- +-- Name: ix_data_vehicle_catalog_make; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_vehicle_catalog_make ON data.vehicle_catalog USING btree (make); + + +-- +-- Name: ix_data_vehicle_catalog_model; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_vehicle_catalog_model ON data.vehicle_catalog USING btree (model); + + +-- +-- Name: ix_data_vehicle_ownerships_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_vehicle_ownerships_id ON data.vehicle_ownerships USING btree (id); + + +-- +-- Name: ix_data_verification_tokens_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_verification_tokens_id ON data.verification_tokens USING btree (id); + + +-- +-- Name: ix_data_wallets_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_wallets_id ON data.wallets USING btree (id); + + +-- +-- Name: addresses addresses_postal_code_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.addresses + ADD CONSTRAINT addresses_postal_code_id_fkey FOREIGN KEY (postal_code_id) REFERENCES data.geo_postal_codes(id); + + +-- +-- Name: asset_assignments asset_assignments_asset_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_assignments + ADD CONSTRAINT asset_assignments_asset_id_fkey FOREIGN KEY (asset_id) REFERENCES data.assets(id); + + +-- +-- Name: asset_assignments asset_assignments_organization_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_assignments + ADD CONSTRAINT asset_assignments_organization_id_fkey FOREIGN KEY (organization_id) REFERENCES data.organizations(id); + + +-- +-- Name: asset_costs asset_costs_asset_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_costs + ADD CONSTRAINT asset_costs_asset_id_fkey FOREIGN KEY (asset_id) REFERENCES data.assets(id); + + +-- +-- Name: asset_costs asset_costs_driver_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_costs + ADD CONSTRAINT asset_costs_driver_id_fkey FOREIGN KEY (driver_id) REFERENCES data.users(id); + + +-- +-- Name: asset_costs asset_costs_organization_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_costs + ADD CONSTRAINT asset_costs_organization_id_fkey FOREIGN KEY (organization_id) REFERENCES data.organizations(id); + + +-- +-- Name: asset_events asset_events_asset_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_events + ADD CONSTRAINT asset_events_asset_id_fkey FOREIGN KEY (asset_id) REFERENCES data.assets(id); + + +-- +-- Name: asset_financials asset_financials_asset_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_financials + ADD CONSTRAINT asset_financials_asset_id_fkey FOREIGN KEY (asset_id) REFERENCES data.assets(id); + + +-- +-- Name: asset_reviews asset_reviews_asset_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_reviews + ADD CONSTRAINT asset_reviews_asset_id_fkey FOREIGN KEY (asset_id) REFERENCES data.assets(id); + + +-- +-- Name: asset_reviews asset_reviews_user_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_reviews + ADD CONSTRAINT asset_reviews_user_id_fkey FOREIGN KEY (user_id) REFERENCES data.users(id); + + +-- +-- Name: asset_telemetry asset_telemetry_asset_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_telemetry + ADD CONSTRAINT asset_telemetry_asset_id_fkey FOREIGN KEY (asset_id) REFERENCES data.assets(id); + + +-- +-- Name: assets assets_catalog_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.assets + ADD CONSTRAINT assets_catalog_id_fkey FOREIGN KEY (catalog_id) REFERENCES data.vehicle_catalog(id); + + +-- +-- Name: assets assets_current_organization_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.assets + ADD CONSTRAINT assets_current_organization_id_fkey FOREIGN KEY (current_organization_id) REFERENCES data.organizations(id); + + +-- +-- Name: audit_logs audit_logs_user_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.audit_logs + ADD CONSTRAINT audit_logs_user_id_fkey FOREIGN KEY (user_id) REFERENCES data.users(id); + + +-- +-- Name: credit_logs credit_logs_org_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.credit_logs + ADD CONSTRAINT credit_logs_org_id_fkey FOREIGN KEY (org_id) REFERENCES data.organizations(id); + + +-- +-- Name: documents documents_uploaded_by_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.documents + ADD CONSTRAINT documents_uploaded_by_fkey FOREIGN KEY (uploaded_by) REFERENCES data.users(id); + + +-- +-- Name: geo_streets geo_streets_postal_code_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.geo_streets + ADD CONSTRAINT geo_streets_postal_code_id_fkey FOREIGN KEY (postal_code_id) REFERENCES data.geo_postal_codes(id); + + +-- +-- Name: org_subscriptions org_subscriptions_org_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.org_subscriptions + ADD CONSTRAINT org_subscriptions_org_id_fkey FOREIGN KEY (org_id) REFERENCES data.organizations(id); + + +-- +-- Name: org_subscriptions org_subscriptions_tier_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.org_subscriptions + ADD CONSTRAINT org_subscriptions_tier_id_fkey FOREIGN KEY (tier_id) REFERENCES data.subscription_tiers(id); + + +-- +-- Name: organization_financials organization_financials_organization_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.organization_financials + ADD CONSTRAINT organization_financials_organization_id_fkey FOREIGN KEY (organization_id) REFERENCES data.organizations(id); + + +-- +-- Name: organization_members organization_members_organization_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.organization_members + ADD CONSTRAINT organization_members_organization_id_fkey FOREIGN KEY (organization_id) REFERENCES data.organizations(id); + + +-- +-- Name: organization_members organization_members_person_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.organization_members + ADD CONSTRAINT organization_members_person_id_fkey FOREIGN KEY (person_id) REFERENCES data.persons(id); + + +-- +-- Name: organization_members organization_members_user_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.organization_members + ADD CONSTRAINT organization_members_user_id_fkey FOREIGN KEY (user_id) REFERENCES data.users(id); + + +-- +-- Name: organizations organizations_address_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.organizations + ADD CONSTRAINT organizations_address_id_fkey FOREIGN KEY (address_id) REFERENCES data.addresses(id); + + +-- +-- Name: organizations organizations_owner_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.organizations + ADD CONSTRAINT organizations_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES data.users(id); + + +-- +-- Name: pending_actions pending_actions_approver_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.pending_actions + ADD CONSTRAINT pending_actions_approver_id_fkey FOREIGN KEY (approver_id) REFERENCES data.users(id); + + +-- +-- Name: pending_actions pending_actions_requester_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.pending_actions + ADD CONSTRAINT pending_actions_requester_id_fkey FOREIGN KEY (requester_id) REFERENCES data.users(id); + + +-- +-- Name: persons persons_address_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.persons + ADD CONSTRAINT persons_address_id_fkey FOREIGN KEY (address_id) REFERENCES data.addresses(id); + + +-- +-- Name: points_ledger points_ledger_user_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.points_ledger + ADD CONSTRAINT points_ledger_user_id_fkey FOREIGN KEY (user_id) REFERENCES data.users(id); + + +-- +-- Name: ratings ratings_author_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.ratings + ADD CONSTRAINT ratings_author_id_fkey FOREIGN KEY (author_id) REFERENCES data.users(id); + + +-- +-- Name: service_expertises service_expertises_expertise_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.service_expertises + ADD CONSTRAINT service_expertises_expertise_id_fkey FOREIGN KEY (expertise_id) REFERENCES data.expertise_tags(id); + + +-- +-- Name: service_expertises service_expertises_service_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.service_expertises + ADD CONSTRAINT service_expertises_service_id_fkey FOREIGN KEY (service_id) REFERENCES data.service_profiles(id); + + +-- +-- Name: service_profiles service_profiles_organization_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.service_profiles + ADD CONSTRAINT service_profiles_organization_id_fkey FOREIGN KEY (organization_id) REFERENCES data.organizations(id); + + +-- +-- Name: service_specialties service_specialties_parent_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.service_specialties + ADD CONSTRAINT service_specialties_parent_id_fkey FOREIGN KEY (parent_id) REFERENCES data.service_specialties(id); + + +-- +-- Name: social_accounts social_accounts_user_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.social_accounts + ADD CONSTRAINT social_accounts_user_id_fkey FOREIGN KEY (user_id) REFERENCES data.users(id) ON DELETE CASCADE; + + +-- +-- Name: user_badges user_badges_badge_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.user_badges + ADD CONSTRAINT user_badges_badge_id_fkey FOREIGN KEY (badge_id) REFERENCES data.badges(id); + + +-- +-- Name: user_badges user_badges_user_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.user_badges + ADD CONSTRAINT user_badges_user_id_fkey FOREIGN KEY (user_id) REFERENCES data.users(id); + + +-- +-- Name: user_stats user_stats_user_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.user_stats + ADD CONSTRAINT user_stats_user_id_fkey FOREIGN KEY (user_id) REFERENCES data.users(id); + + +-- +-- Name: users users_person_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.users + ADD CONSTRAINT users_person_id_fkey FOREIGN KEY (person_id) REFERENCES data.persons(id); + + +-- +-- Name: vehicle_ownerships vehicle_ownerships_user_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.vehicle_ownerships + ADD CONSTRAINT vehicle_ownerships_user_id_fkey FOREIGN KEY (user_id) REFERENCES data.users(id); + + +-- +-- Name: vehicle_ownerships vehicle_ownerships_vehicle_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.vehicle_ownerships + ADD CONSTRAINT vehicle_ownerships_vehicle_id_fkey FOREIGN KEY (vehicle_id) REFERENCES data.assets(id); + + +-- +-- Name: verification_tokens verification_tokens_user_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.verification_tokens + ADD CONSTRAINT verification_tokens_user_id_fkey FOREIGN KEY (user_id) REFERENCES data.users(id) ON DELETE CASCADE; + + +-- +-- Name: wallets wallets_user_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.wallets + ADD CONSTRAINT wallets_user_id_fkey FOREIGN KEY (user_id) REFERENCES data.users(id); + + +-- +-- Name: SCHEMA data; Type: ACL; Schema: -; Owner: service_finder_app +-- + +GRANT USAGE ON SCHEMA data TO n8n_hunter; +GRANT USAGE ON SCHEMA data TO PUBLIC; + + +-- +-- Name: TABLE addresses; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.addresses TO n8n_hunter; +GRANT ALL ON TABLE data.addresses TO PUBLIC; + + +-- +-- Name: TABLE asset_assignments; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.asset_assignments TO n8n_hunter; +GRANT ALL ON TABLE data.asset_assignments TO PUBLIC; + + +-- +-- Name: TABLE asset_costs; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.asset_costs TO n8n_hunter; +GRANT ALL ON TABLE data.asset_costs TO PUBLIC; + + +-- +-- Name: TABLE asset_events; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.asset_events TO n8n_hunter; +GRANT ALL ON TABLE data.asset_events TO PUBLIC; + + +-- +-- Name: TABLE asset_financials; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.asset_financials TO n8n_hunter; +GRANT ALL ON TABLE data.asset_financials TO PUBLIC; + + +-- +-- Name: TABLE asset_reviews; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.asset_reviews TO n8n_hunter; +GRANT ALL ON TABLE data.asset_reviews TO PUBLIC; + + +-- +-- Name: TABLE asset_telemetry; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.asset_telemetry TO n8n_hunter; +GRANT ALL ON TABLE data.asset_telemetry TO PUBLIC; + + +-- +-- Name: TABLE assets; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.assets TO n8n_hunter; +GRANT ALL ON TABLE data.assets TO PUBLIC; + + +-- +-- Name: TABLE audit_logs; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.audit_logs TO n8n_hunter; +GRANT ALL ON TABLE data.audit_logs TO PUBLIC; + + +-- +-- Name: TABLE badges; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.badges TO n8n_hunter; +GRANT ALL ON TABLE data.badges TO PUBLIC; + + +-- +-- Name: TABLE credit_logs; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.credit_logs TO n8n_hunter; +GRANT ALL ON TABLE data.credit_logs TO PUBLIC; + + +-- +-- Name: TABLE documents; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.documents TO n8n_hunter; +GRANT ALL ON TABLE data.documents TO PUBLIC; + + +-- +-- Name: TABLE exchange_rates; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.exchange_rates TO n8n_hunter; +GRANT ALL ON TABLE data.exchange_rates TO PUBLIC; + + +-- +-- Name: TABLE expertise_tags; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.expertise_tags TO n8n_hunter; +GRANT ALL ON TABLE data.expertise_tags TO PUBLIC; + + +-- +-- Name: TABLE geo_postal_codes; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.geo_postal_codes TO n8n_hunter; +GRANT ALL ON TABLE data.geo_postal_codes TO PUBLIC; + + +-- +-- Name: TABLE geo_street_types; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.geo_street_types TO n8n_hunter; +GRANT ALL ON TABLE data.geo_street_types TO PUBLIC; + + +-- +-- Name: TABLE geo_streets; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.geo_streets TO n8n_hunter; +GRANT ALL ON TABLE data.geo_streets TO PUBLIC; + + +-- +-- Name: TABLE geography_columns; Type: ACL; Schema: data; Owner: service_finder_app +-- + +REVOKE ALL ON TABLE data.geography_columns FROM kincses; +REVOKE ALL ON TABLE data.geography_columns FROM service_finder_app; +REVOKE SELECT ON TABLE data.geography_columns FROM PUBLIC; +GRANT ALL ON TABLE data.geography_columns TO service_finder_app; +GRANT ALL ON TABLE data.geography_columns TO PUBLIC; +GRANT ALL ON TABLE data.geography_columns TO n8n_hunter; + + +-- +-- Name: TABLE geometry_columns; Type: ACL; Schema: data; Owner: service_finder_app +-- + +REVOKE ALL ON TABLE data.geometry_columns FROM kincses; +REVOKE ALL ON TABLE data.geometry_columns FROM service_finder_app; +REVOKE SELECT ON TABLE data.geometry_columns FROM PUBLIC; +GRANT ALL ON TABLE data.geometry_columns TO service_finder_app; +GRANT ALL ON TABLE data.geometry_columns TO PUBLIC; +GRANT ALL ON TABLE data.geometry_columns TO n8n_hunter; + + +-- +-- Name: TABLE level_configs; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.level_configs TO n8n_hunter; +GRANT ALL ON TABLE data.level_configs TO PUBLIC; + + +-- +-- Name: TABLE org_subscriptions; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.org_subscriptions TO n8n_hunter; +GRANT ALL ON TABLE data.org_subscriptions TO PUBLIC; + + +-- +-- Name: TABLE organization_financials; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.organization_financials TO n8n_hunter; +GRANT ALL ON TABLE data.organization_financials TO PUBLIC; + + +-- +-- Name: TABLE organization_members; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.organization_members TO n8n_hunter; +GRANT ALL ON TABLE data.organization_members TO PUBLIC; + + +-- +-- Name: TABLE organizations; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.organizations TO n8n_hunter; +GRANT ALL ON TABLE data.organizations TO PUBLIC; + + +-- +-- Name: TABLE pending_actions; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.pending_actions TO n8n_hunter; +GRANT ALL ON TABLE data.pending_actions TO PUBLIC; + + +-- +-- Name: TABLE persons; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.persons TO n8n_hunter; +GRANT ALL ON TABLE data.persons TO PUBLIC; + + +-- +-- Name: TABLE point_rules; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.point_rules TO n8n_hunter; +GRANT ALL ON TABLE data.point_rules TO PUBLIC; + + +-- +-- Name: TABLE points_ledger; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.points_ledger TO n8n_hunter; +GRANT ALL ON TABLE data.points_ledger TO PUBLIC; + + +-- +-- Name: TABLE ratings; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.ratings TO n8n_hunter; +GRANT ALL ON TABLE data.ratings TO PUBLIC; + + +-- +-- Name: TABLE regional_settings; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.regional_settings TO n8n_hunter; +GRANT ALL ON TABLE data.regional_settings TO PUBLIC; + + +-- +-- Name: TABLE service_expertises; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.service_expertises TO n8n_hunter; +GRANT ALL ON TABLE data.service_expertises TO PUBLIC; + + +-- +-- Name: TABLE service_profiles; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.service_profiles TO n8n_hunter; +GRANT ALL ON TABLE data.service_profiles TO PUBLIC; + + +-- +-- Name: TABLE service_specialties; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.service_specialties TO n8n_hunter; +GRANT ALL ON TABLE data.service_specialties TO PUBLIC; + + +-- +-- Name: TABLE social_accounts; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.social_accounts TO n8n_hunter; +GRANT ALL ON TABLE data.social_accounts TO PUBLIC; + + +-- +-- Name: TABLE spatial_ref_sys; Type: ACL; Schema: data; Owner: service_finder_app +-- + +REVOKE ALL ON TABLE data.spatial_ref_sys FROM kincses; +REVOKE ALL ON TABLE data.spatial_ref_sys FROM service_finder_app; +REVOKE SELECT ON TABLE data.spatial_ref_sys FROM PUBLIC; +GRANT ALL ON TABLE data.spatial_ref_sys TO service_finder_app; +GRANT ALL ON TABLE data.spatial_ref_sys TO PUBLIC; +GRANT ALL ON TABLE data.spatial_ref_sys TO n8n_hunter; + + +-- +-- Name: TABLE subscription_tiers; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.subscription_tiers TO n8n_hunter; +GRANT ALL ON TABLE data.subscription_tiers TO PUBLIC; + + +-- +-- Name: TABLE system_parameters; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.system_parameters TO n8n_hunter; +GRANT ALL ON TABLE data.system_parameters TO PUBLIC; + + +-- +-- Name: TABLE translations; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.translations TO n8n_hunter; +GRANT ALL ON TABLE data.translations TO PUBLIC; + + +-- +-- Name: TABLE user_badges; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.user_badges TO n8n_hunter; +GRANT ALL ON TABLE data.user_badges TO PUBLIC; + + +-- +-- Name: TABLE user_stats; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.user_stats TO n8n_hunter; +GRANT ALL ON TABLE data.user_stats TO PUBLIC; + + +-- +-- Name: TABLE users; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.users TO n8n_hunter; +GRANT ALL ON TABLE data.users TO PUBLIC; + + +-- +-- Name: TABLE vehicle_catalog; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.vehicle_catalog TO n8n_hunter; +GRANT ALL ON TABLE data.vehicle_catalog TO PUBLIC; + + +-- +-- Name: TABLE vehicle_ownerships; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.vehicle_ownerships TO n8n_hunter; +GRANT ALL ON TABLE data.vehicle_ownerships TO PUBLIC; + + +-- +-- Name: TABLE verification_tokens; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.verification_tokens TO n8n_hunter; +GRANT ALL ON TABLE data.verification_tokens TO PUBLIC; + + +-- +-- Name: TABLE wallets; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.wallets TO n8n_hunter; +GRANT ALL ON TABLE data.wallets TO PUBLIC; + + +-- +-- Name: DEFAULT PRIVILEGES FOR SEQUENCES; Type: DEFAULT ACL; Schema: data; Owner: kincses +-- + +ALTER DEFAULT PRIVILEGES FOR ROLE kincses IN SCHEMA data GRANT ALL ON SEQUENCES TO service_finder_app; + + +-- +-- Name: DEFAULT PRIVILEGES FOR TABLES; Type: DEFAULT ACL; Schema: data; Owner: kincses +-- + +ALTER DEFAULT PRIVILEGES FOR ROLE kincses IN SCHEMA data GRANT ALL ON TABLES TO service_finder_app; +ALTER DEFAULT PRIVILEGES FOR ROLE kincses IN SCHEMA data GRANT ALL ON TABLES TO n8n_hunter; + + +-- +-- PostgreSQL database dump complete +-- + diff --git a/n8n/data/config b/n8n/data/config new file mode 100644 index 0000000..b95cd28 --- /dev/null +++ b/n8n/data/config @@ -0,0 +1,3 @@ +{ + "encryptionKey": "OjlSB/Un86Z7PdPbg03khUZ4Dld4bXV2" +} \ No newline at end of file diff --git a/n8n/data/crash.journal b/n8n/data/crash.journal new file mode 100644 index 0000000..e69de29 diff --git a/n8n/data/n8nEventLog.log b/n8n/data/n8nEventLog.log new file mode 100644 index 0000000..e4100d7 --- /dev/null +++ b/n8n/data/n8nEventLog.log @@ -0,0 +1,219 @@ +{"__type":"$$EventMessageAudit","id":"5869b732-18e3-4469-acf6-4c1494dd6a7d","ts":"2026-02-13T21:35:59.910+00:00","eventName":"n8n.audit.user.login.failed","message":"n8n.audit.user.login.failed","payload":{"authenticationMethod":"email","userEmail":"kincses@gmail.com","reason":"wrong credentials"}} +{"__type":"$$EventMessageAudit","id":"10c34e80-a103-4fa5-817e-ef652538bafc","ts":"2026-02-13T21:36:04.754+00:00","eventName":"n8n.audit.user.login.success","message":"n8n.audit.user.login.success","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","authenticationMethod":"email"}} +{"__type":"$$EventMessageAudit","id":"682f2d00-6de4-4ece-9e2c-a3e74f9d410e","ts":"2026-02-13T21:47:38.976+00:00","eventName":"n8n.audit.user.credentials.created","message":"n8n.audit.user.credentials.created","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","credentialType":"postgres","credentialId":"Jm8msQnZOaEu4FpX","publicApi":false,"projectId":"rhKVh1pVPxnQvrE5","projectType":"personal","isDynamic":false}} +{"__type":"$$EventMessageAudit","id":"237cc6fb-8ee2-4dec-8a09-c8262080b060","ts":"2026-02-13T21:51:41.979+00:00","eventName":"n8n.audit.workflow.created","message":"n8n.audit.workflow.created","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow"}} +{"__type":"$$EventMessageWorkflow","id":"69950600-8d87-433f-b126-3ea85db37f0c","ts":"2026-02-13T21:51:56.862+00:00","eventName":"n8n.workflow.failed","message":"n8n.workflow.failed","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","executionId":"1","success":false,"isManual":true,"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow","errorMessage":"The workflow has issues and cannot be executed for that reason. Please fix them first."}} +{"__type":"$$EventMessageAudit","id":"76b34802-2059-4e6c-9fc7-c6f69baa640b","ts":"2026-02-13T21:52:27.681+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow"}} +{"__type":"$$EventMessageAudit","id":"40b56efa-00bb-4b4b-bf49-be3934ebfb03","ts":"2026-02-13T21:53:16.296+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow"}} +{"__type":"$$EventMessageAudit","id":"fdacb46e-04f8-4a1b-bf90-f7dbf8122dec","ts":"2026-02-13T21:55:27.292+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow"}} +{"__type":"$$EventMessageAudit","id":"d1259331-84cf-4cca-bb0a-d61f34f0fd99","ts":"2026-02-13T21:56:35.275+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow"}} +{"__type":"$$EventMessageAudit","id":"400e57e4-2a36-4b00-8177-492a96d1e082","ts":"2026-02-13T21:56:39.888+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow"}} +{"__type":"$$EventMessageAudit","id":"b172315d-d99d-41fd-87b6-02056c65b0f9","ts":"2026-02-13T21:57:34.897+00:00","eventName":"n8n.audit.user.execution.deleted","message":"n8n.audit.user.execution.deleted","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","executionIds":["1"]}} +{"__type":"$$EventMessageAudit","id":"5265e5d8-de1c-47ba-a4e6-68cd556aaa01","ts":"2026-02-13T22:01:53.807+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow"}} +{"__type":"$$EventMessageAudit","id":"7f524dde-69b8-4a1a-ad25-49211303c9f8","ts":"2026-02-13T22:04:04.860+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow"}} +{"__type":"$$EventMessageWorkflow","id":"dd399605-345a-4a36-bcf0-1b291f9ef609","ts":"2026-02-13T22:04:19.549+00:00","eventName":"n8n.workflow.started","message":"n8n.workflow.started","payload":{"executionId":"2","workflowId":"eRVwBJfXw8ymc6aZ","isManual":false,"workflowName":"My workflow"}} +{"__type":"$$EventMessageAudit","id":"adf99f02-914b-4f47-a149-b6e408fc1d63","ts":"2026-02-13T22:04:19.550+00:00","eventName":"n8n.audit.workflow.executed","message":"n8n.audit.workflow.executed","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow","executionId":"2","source":"user-manual"}} +{"__type":"$$EventMessageNode","id":"647915ce-3954-4792-9db9-abd9f7994262","ts":"2026-02-13T22:04:19.551+00:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow","executionId":"2","nodeType":"n8n-nodes-base.postgres","nodeName":"Execute a SQL query","nodeId":"5225b2de-580f-413c-b5ce-806bff919a40"}} +{"__type":"$$EventMessageNode","id":"2d0dc74f-49a9-4f87-b47e-f76d4cd35fab","ts":"2026-02-13T22:04:19.611+00:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow","executionId":"2","nodeType":"n8n-nodes-base.postgres","nodeName":"Execute a SQL query","nodeId":"5225b2de-580f-413c-b5ce-806bff919a40"}} +{"__type":"$$EventMessageWorkflow","id":"aa888c94-8756-4912-906e-83771dfb0e64","ts":"2026-02-13T22:04:19.613+00:00","eventName":"n8n.workflow.failed","message":"n8n.workflow.failed","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","executionId":"2","success":false,"isManual":true,"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow","lastNodeExecuted":"Execute a SQL query","errorNodeType":"n8n-nodes-base.postgres","errorMessage":"column \"year\" does not exist"}} +{"__type":"$$EventMessageAudit","id":"1803a054-4c0c-46b6-9da1-78659d70d19d","ts":"2026-02-13T22:05:03.907+00:00","eventName":"n8n.audit.user.credentials.created","message":"n8n.audit.user.credentials.created","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","credentialType":"postgres","credentialId":"vhQriarepfU8BmSN","publicApi":false,"projectId":"rhKVh1pVPxnQvrE5","projectType":"personal","isDynamic":false}} +{"__type":"$$EventMessageAudit","id":"ba40a7e5-3565-4609-92e5-2710791e72a6","ts":"2026-02-13T22:05:05.558+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow"}} +{"__type":"$$EventMessageWorkflow","id":"fea8cdd6-505e-48aa-9a21-e8e93aaaa235","ts":"2026-02-13T22:05:36.681+00:00","eventName":"n8n.workflow.started","message":"n8n.workflow.started","payload":{"executionId":"3","workflowId":"eRVwBJfXw8ymc6aZ","isManual":false,"workflowName":"My workflow"}} +{"__type":"$$EventMessageAudit","id":"a8478977-819e-4b1c-b426-e59c347f4cdd","ts":"2026-02-13T22:05:36.681+00:00","eventName":"n8n.audit.workflow.executed","message":"n8n.audit.workflow.executed","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow","executionId":"3","source":"user-manual"}} +{"__type":"$$EventMessageNode","id":"f71bf08f-3bd1-45f5-820d-ed721d0ce111","ts":"2026-02-13T22:05:36.682+00:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow","executionId":"3","nodeType":"n8n-nodes-base.postgres","nodeName":"Execute a SQL query","nodeId":"5225b2de-580f-413c-b5ce-806bff919a40"}} +{"__type":"$$EventMessageNode","id":"85bdf6e2-b33d-4f21-acaa-62f8fcd4a16d","ts":"2026-02-13T22:05:36.719+00:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow","executionId":"3","nodeType":"n8n-nodes-base.postgres","nodeName":"Execute a SQL query","nodeId":"5225b2de-580f-413c-b5ce-806bff919a40"}} +{"__type":"$$EventMessageWorkflow","id":"685429af-bfa7-4b8b-879a-de33d29c3dec","ts":"2026-02-13T22:05:36.726+00:00","eventName":"n8n.workflow.failed","message":"n8n.workflow.failed","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","executionId":"3","success":false,"isManual":true,"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow","lastNodeExecuted":"Execute a SQL query","errorNodeType":"n8n-nodes-base.postgres","errorMessage":"column \"year\" does not exist"}} +{"__type":"$$EventMessageAudit","id":"8c6835a0-225c-4d71-96bc-244a7c2df8d2","ts":"2026-02-13T22:08:33.943+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow"}} +{"__type":"$$EventMessageAudit","id":"8739b4f0-4373-4438-9c33-58d9faa7a803","ts":"2026-02-13T22:08:35.626+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow"}} +{"__type":"$$EventMessageAudit","id":"13a53f6e-0ec3-4dd4-979a-a41d1d7bbcf9","ts":"2026-02-13T22:08:37.860+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow"}} +{"__type":"$$EventMessageAudit","id":"ce0df8e7-540d-494a-9eb1-5796470cbff8","ts":"2026-02-13T22:08:40.520+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow"}} +{"__type":"$$EventMessageAudit","id":"6dfb2d6a-085e-429c-bbb7-dc815423e994","ts":"2026-02-13T22:09:22.257+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow"}} +{"__type":"$$EventMessageWorkflow","id":"2da25985-e9d0-4b2a-af88-c9e49faad80a","ts":"2026-02-13T22:09:23.241+00:00","eventName":"n8n.workflow.started","message":"n8n.workflow.started","payload":{"executionId":"4","workflowId":"eRVwBJfXw8ymc6aZ","isManual":false,"workflowName":"My workflow"}} +{"__type":"$$EventMessageAudit","id":"f2331d63-2908-4a3a-834f-b615a32d391d","ts":"2026-02-13T22:09:23.242+00:00","eventName":"n8n.audit.workflow.executed","message":"n8n.audit.workflow.executed","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow","executionId":"4","source":"user-manual"}} +{"__type":"$$EventMessageNode","id":"b93bc00e-8a55-4eb4-b26c-bb076f960679","ts":"2026-02-13T22:09:23.242+00:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow","executionId":"4","nodeType":"n8n-nodes-base.postgres","nodeName":"Execute a SQL query","nodeId":"5225b2de-580f-413c-b5ce-806bff919a40"}} +{"__type":"$$EventMessageNode","id":"3b93061f-9621-42aa-8cc5-71c875b0dc5c","ts":"2026-02-13T22:09:23.286+00:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow","executionId":"4","nodeType":"n8n-nodes-base.postgres","nodeName":"Execute a SQL query","nodeId":"5225b2de-580f-413c-b5ce-806bff919a40"}} +{"__type":"$$EventMessageWorkflow","id":"d69f349c-a3bc-43b2-8add-845add0996db","ts":"2026-02-13T22:09:23.291+00:00","eventName":"n8n.workflow.success","message":"n8n.workflow.success","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","executionId":"4","success":true,"isManual":true,"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow"}} +{"__type":"$$EventMessageAudit","id":"6d9de1d8-646b-4207-8ed8-18af56277145","ts":"2026-02-13T22:09:53.151+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow"}} +{"__type":"$$EventMessageAudit","id":"44c367a3-b576-4163-9266-7a68d2d35f2f","ts":"2026-02-13T22:10:27.483+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow"}} +{"__type":"$$EventMessageAudit","id":"09974b64-103d-4992-87b7-9f3581461c2f","ts":"2026-02-13T22:12:51.234+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow"}} +{"__type":"$$EventMessageAudit","id":"b2dc631d-7884-411d-80ac-de5e22f39240","ts":"2026-02-13T22:13:12.838+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow"}} +{"__type":"$$EventMessageAudit","id":"88f413ba-26c5-44e3-b419-784e1e47fbb6","ts":"2026-02-13T22:13:14.455+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow"}} +{"__type":"$$EventMessageAudit","id":"43539d91-c6f8-452b-9d49-cae264329dc4","ts":"2026-02-13T22:13:19.305+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow"}} +{"__type":"$$EventMessageAudit","id":"14922d8c-9688-4dd7-90f6-965951e7e470","ts":"2026-02-13T22:13:22.671+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow"}} +{"__type":"$$EventMessageAudit","id":"486789f5-c179-4531-b6b7-3d7132b76118","ts":"2026-02-14T00:16:44.585+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow"}} +{"__type":"$$EventMessageAudit","id":"3ae5edfb-0dd6-41b2-8776-3a7c02e07f09","ts":"2026-02-14T00:16:46.997+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"My workflow"}} +{"__type":"$$EventMessageAudit","id":"7fe3f161-6a60-40a9-af1b-aa6c086d396d","ts":"2026-02-14T00:17:39.089+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageWorkflow","id":"e219ce8f-4f9e-4e0f-b11a-2cec1471bc25","ts":"2026-02-14T00:17:53.433+00:00","eventName":"n8n.workflow.started","message":"n8n.workflow.started","payload":{"executionId":"5","workflowId":"eRVwBJfXw8ymc6aZ","isManual":false,"workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"ac670c4b-3c36-49c3-8c73-a6272e3acdd5","ts":"2026-02-14T00:17:53.433+00:00","eventName":"n8n.audit.workflow.executed","message":"n8n.audit.workflow.executed","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"5","source":"user-manual"}} +{"__type":"$$EventMessageNode","id":"7a79c6fc-8bf5-45c1-ac67-3ed24a3d6c20","ts":"2026-02-14T00:17:53.434+00:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"5","nodeType":"n8n-nodes-base.manualTrigger","nodeName":"When clicking ‘Execute workflow’","nodeId":"1ddbe06f-01d6-44df-a3ea-8feac5b34ce3"}} +{"__type":"$$EventMessageNode","id":"dad25375-152e-4f0d-85d7-ef41cdd69755","ts":"2026-02-14T00:17:53.435+00:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"5","nodeType":"n8n-nodes-base.manualTrigger","nodeName":"When clicking ‘Execute workflow’","nodeId":"1ddbe06f-01d6-44df-a3ea-8feac5b34ce3"}} +{"__type":"$$EventMessageWorkflow","id":"003a46cb-c61b-4459-8f97-f8ca5ea598f2","ts":"2026-02-14T00:17:53.437+00:00","eventName":"n8n.workflow.success","message":"n8n.workflow.success","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","executionId":"5","success":true,"isManual":true,"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"beb95055-5c82-46de-a915-0ae09004cc02","ts":"2026-02-14T00:18:30.074+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"d35ae2c0-2c1b-4918-b10d-4bf8752b7f37","ts":"2026-02-14T00:18:50.955+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"8d59a3f8-6779-415e-9cfc-ac487dc90368","ts":"2026-02-14T00:18:57.945+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"d7b67993-2264-4778-99e8-719803312e09","ts":"2026-02-14T00:19:24.859+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"67f16bf6-1ec5-478d-b518-512c3d6f7149","ts":"2026-02-14T00:19:30.938+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageWorkflow","id":"a81b92e3-d99e-47b1-a06d-bfed49e98358","ts":"2026-02-14T00:20:13.886+00:00","eventName":"n8n.workflow.started","message":"n8n.workflow.started","payload":{"executionId":"6","workflowId":"eRVwBJfXw8ymc6aZ","isManual":false,"workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"88687f84-89ee-4d7a-8d44-a1efaa899d5c","ts":"2026-02-14T00:20:13.886+00:00","eventName":"n8n.audit.workflow.executed","message":"n8n.audit.workflow.executed","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"6","source":"user-manual"}} +{"__type":"$$EventMessageNode","id":"c26ddf9e-caea-4c99-b3a8-75dcbc5fe316","ts":"2026-02-14T00:20:13.887+00:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"6","nodeType":"n8n-nodes-base.httpRequest","nodeName":"HTTP Request","nodeId":"c537e933-add5-4c58-819a-343fa00b8e76"}} +{"__type":"$$EventMessageNode","id":"66f146b1-493a-4574-9bf6-866943b3eea1","ts":"2026-02-14T00:20:14.118+00:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"6","nodeType":"n8n-nodes-base.httpRequest","nodeName":"HTTP Request","nodeId":"c537e933-add5-4c58-819a-343fa00b8e76"}} +{"__type":"$$EventMessageWorkflow","id":"86ab432e-d95e-42ef-9e92-c86a63527e7b","ts":"2026-02-14T00:20:14.121+00:00","eventName":"n8n.workflow.success","message":"n8n.workflow.success","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","executionId":"6","success":true,"isManual":true,"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"2818ee3f-a8a7-4404-8115-bffada9eeaa7","ts":"2026-02-14T00:22:14.904+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"8a825a3e-f7d1-4dcd-b962-9ca87aa18706","ts":"2026-02-14T00:22:17.614+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"7c308a6d-7963-4df6-a8e6-9c192ccc7e34","ts":"2026-02-14T00:22:39.464+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageWorkflow","id":"51c22d50-95c5-4316-8346-5645d930f92e","ts":"2026-02-14T00:22:47.538+00:00","eventName":"n8n.workflow.started","message":"n8n.workflow.started","payload":{"executionId":"7","workflowId":"eRVwBJfXw8ymc6aZ","isManual":false,"workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"9608637b-5102-4ff1-8ffe-ca556e54ec58","ts":"2026-02-14T00:22:47.538+00:00","eventName":"n8n.audit.workflow.executed","message":"n8n.audit.workflow.executed","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"7","source":"user-manual"}} +{"__type":"$$EventMessageNode","id":"cff555b6-be57-46eb-b8a1-3db5026642b9","ts":"2026-02-14T00:22:47.540+00:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"7","nodeType":"n8n-nodes-base.httpRequest","nodeName":"HTTP Request","nodeId":"c537e933-add5-4c58-819a-343fa00b8e76"}} +{"__type":"$$EventMessageNode","id":"2d7b0261-390c-4fe7-ba03-dbd1ce819594","ts":"2026-02-14T00:22:47.755+00:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"7","nodeType":"n8n-nodes-base.httpRequest","nodeName":"HTTP Request","nodeId":"c537e933-add5-4c58-819a-343fa00b8e76"}} +{"__type":"$$EventMessageWorkflow","id":"77123a2e-2a12-420d-835d-9e414f879079","ts":"2026-02-14T00:22:47.758+00:00","eventName":"n8n.workflow.success","message":"n8n.workflow.success","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","executionId":"7","success":true,"isManual":true,"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"1e948f13-5ed3-4cf3-9e73-4e659cde44ab","ts":"2026-02-14T00:23:56.889+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"4e31ce6f-5461-4228-a192-b16dc0b21fd4","ts":"2026-02-14T00:24:09.435+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageWorkflow","id":"006d72ef-613e-45e1-ac71-a1a240066e26","ts":"2026-02-14T00:24:11.935+00:00","eventName":"n8n.workflow.started","message":"n8n.workflow.started","payload":{"executionId":"8","workflowId":"eRVwBJfXw8ymc6aZ","isManual":false,"workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"bc2dd643-abef-4a28-9241-03aac0f9e859","ts":"2026-02-14T00:24:11.935+00:00","eventName":"n8n.audit.workflow.executed","message":"n8n.audit.workflow.executed","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"8","source":"user-manual"}} +{"__type":"$$EventMessageNode","id":"c80ab445-28d3-4285-918b-a8a90c0c8266","ts":"2026-02-14T00:24:11.936+00:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"8","nodeType":"n8n-nodes-base.httpRequest","nodeName":"HTTP Request","nodeId":"c537e933-add5-4c58-819a-343fa00b8e76"}} +{"__type":"$$EventMessageNode","id":"7b73105d-73c5-4b06-9d31-557848248141","ts":"2026-02-14T00:24:15.023+00:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"8","nodeType":"n8n-nodes-base.httpRequest","nodeName":"HTTP Request","nodeId":"c537e933-add5-4c58-819a-343fa00b8e76"}} +{"__type":"$$EventMessageWorkflow","id":"46d8edbf-66b9-4065-8dab-5f82a00cae3a","ts":"2026-02-14T00:24:15.027+00:00","eventName":"n8n.workflow.success","message":"n8n.workflow.success","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","executionId":"8","success":true,"isManual":true,"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"74c8e7ce-4f92-4dcd-9393-42bcea6c35e3","ts":"2026-02-14T00:28:33.362+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"df713c02-39fb-45e5-85de-0467c580f067","ts":"2026-02-14T00:31:12.798+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"54378761-3509-40c1-8cc0-c830d56728f1","ts":"2026-02-14T00:33:32.477+00:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"7fb2c566-3c58-437c-a640-113eed8bf8a7","ts":"2026-02-13T19:33:58.052-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"94ccec9e-4693-450d-abd6-cbf24f07f89b","ts":"2026-02-13T19:34:20.246-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"3b30fa0d-f0ff-45cf-872c-331c0ce2fe16","ts":"2026-02-13T19:34:30.760-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"9da5d30d-2a3b-491f-b902-5edbf999ad47","ts":"2026-02-13T19:36:03.414-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"db2ff622-6ccc-469b-995a-d199be149bf0","ts":"2026-02-13T19:36:57.362-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"e9ff3ff7-11af-4844-8854-48bb7ae55ccb","ts":"2026-02-13T19:37:04.049-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"01a1dba0-7900-42d2-8181-5c9e753c5a33","ts":"2026-02-13T19:37:08.818-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"050dedbb-ea8a-4cbe-a7e3-399e4dc5f91c","ts":"2026-02-13T19:37:17.857-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"45c49c05-37b0-4227-b46c-28e993115cfa","ts":"2026-02-13T19:38:02.616-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"d0c3cfcf-0f04-4e55-b272-64cc7dfb6b8b","ts":"2026-02-13T19:38:04.354-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageWorkflow","id":"58d912dc-a934-41f7-b153-9a256b7e4842","ts":"2026-02-13T19:38:10.534-05:00","eventName":"n8n.workflow.started","message":"n8n.workflow.started","payload":{"executionId":"9","workflowId":"eRVwBJfXw8ymc6aZ","isManual":false,"workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"33182e6e-199a-49b7-a841-efff1539c011","ts":"2026-02-13T19:38:10.534-05:00","eventName":"n8n.audit.workflow.executed","message":"n8n.audit.workflow.executed","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"9","source":"user-manual"}} +{"__type":"$$EventMessageNode","id":"ea5bcd9a-36dd-45e5-b124-b55e2f7122c2","ts":"2026-02-13T19:38:10.535-05:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"9","nodeType":"n8n-nodes-base.httpRequest","nodeName":"OSM Dunakeszi Query","nodeId":"c93e1c88-e915-4d19-882a-417415ecf495"}} +{"__type":"$$EventMessageNode","id":"58bcaa60-1a0b-4bb7-bb91-41e52c1fb040","ts":"2026-02-13T19:38:14.589-05:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"9","nodeType":"n8n-nodes-base.httpRequest","nodeName":"OSM Dunakeszi Query","nodeId":"c93e1c88-e915-4d19-882a-417415ecf495"}} +{"__type":"$$EventMessageWorkflow","id":"d855e6c7-7127-4dac-a424-2b12c049ad93","ts":"2026-02-13T19:38:14.595-05:00","eventName":"n8n.workflow.success","message":"n8n.workflow.success","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","executionId":"9","success":true,"isManual":true,"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"34de871c-4089-4fa4-a6d2-1bd68f9736ff","ts":"2026-02-13T19:38:28.657-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"a644706f-f774-4501-98bd-f6b7ad42fe71","ts":"2026-02-13T19:38:31.263-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"a083a619-dea4-4f6b-963e-8b4f5cbc7f0b","ts":"2026-02-13T19:38:33.192-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageWorkflow","id":"86c9e98b-9aaa-411d-9ad0-384eb8554250","ts":"2026-02-13T19:38:37.848-05:00","eventName":"n8n.workflow.started","message":"n8n.workflow.started","payload":{"executionId":"10","workflowId":"eRVwBJfXw8ymc6aZ","isManual":false,"workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"a6594e64-cebe-4126-a33f-3ba73c68d8d6","ts":"2026-02-13T19:38:37.849-05:00","eventName":"n8n.audit.workflow.executed","message":"n8n.audit.workflow.executed","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"10","source":"user-manual"}} +{"__type":"$$EventMessageNode","id":"18d17b7c-1e1f-44c9-8554-00bd4b99d3bd","ts":"2026-02-13T19:38:37.850-05:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"10","nodeType":"n8n-nodes-base.manualTrigger","nodeName":"When clicking ‘Execute workflow’","nodeId":"1ddbe06f-01d6-44df-a3ea-8feac5b34ce3"}} +{"__type":"$$EventMessageNode","id":"e9c76713-db3d-4156-a9fe-4da59fa96d0e","ts":"2026-02-13T19:38:37.852-05:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"10","nodeType":"n8n-nodes-base.manualTrigger","nodeName":"When clicking ‘Execute workflow’","nodeId":"1ddbe06f-01d6-44df-a3ea-8feac5b34ce3"}} +{"__type":"$$EventMessageWorkflow","id":"844ea0d4-2499-4689-93ff-3385147873ff","ts":"2026-02-13T19:38:37.855-05:00","eventName":"n8n.workflow.success","message":"n8n.workflow.success","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","executionId":"10","success":true,"isManual":true,"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageWorkflow","id":"12f57168-371e-49e6-ac4e-8cbd6bf9460b","ts":"2026-02-13T19:38:45.332-05:00","eventName":"n8n.workflow.started","message":"n8n.workflow.started","payload":{"executionId":"11","workflowId":"eRVwBJfXw8ymc6aZ","isManual":false,"workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"d7561c12-c58f-4a5c-a3b9-65e2a3c1887b","ts":"2026-02-13T19:38:45.332-05:00","eventName":"n8n.audit.workflow.executed","message":"n8n.audit.workflow.executed","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"11","source":"user-manual"}} +{"__type":"$$EventMessageNode","id":"836f27e5-c87c-40da-bdba-5a888c560da0","ts":"2026-02-13T19:38:45.333-05:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"11","nodeType":"n8n-nodes-base.httpRequest","nodeName":"OSM Dunakeszi Query","nodeId":"c93e1c88-e915-4d19-882a-417415ecf495"}} +{"__type":"$$EventMessageNode","id":"87059e8e-7dc8-4c94-a991-3113305365cb","ts":"2026-02-13T19:38:51.605-05:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"11","nodeType":"n8n-nodes-base.httpRequest","nodeName":"OSM Dunakeszi Query","nodeId":"c93e1c88-e915-4d19-882a-417415ecf495"}} +{"__type":"$$EventMessageWorkflow","id":"0df55d0f-adcb-436a-abb8-cfdc28c45674","ts":"2026-02-13T19:38:51.607-05:00","eventName":"n8n.workflow.failed","message":"n8n.workflow.failed","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","executionId":"11","success":false,"isManual":true,"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","lastNodeExecuted":"OSM Dunakeszi Query","errorNodeType":"n8n-nodes-base.httpRequest","errorMessage":"Gateway timed out - perhaps try again later?"}} +{"__type":"$$EventMessageAudit","id":"ef075d35-4ef9-4da4-9f47-0a57192054ff","ts":"2026-02-13T19:39:13.597-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"b288bf7a-6f12-45b3-8689-205c83a06850","ts":"2026-02-13T19:39:17.039-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"01248cb6-09cd-4736-b83b-6422ef48f880","ts":"2026-02-13T19:39:25.065-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageWorkflow","id":"b024d8e8-6e5e-449a-8ee9-e380b60be489","ts":"2026-02-13T19:39:37.847-05:00","eventName":"n8n.workflow.started","message":"n8n.workflow.started","payload":{"executionId":"12","workflowId":"eRVwBJfXw8ymc6aZ","isManual":false,"workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"fc8caf38-42b9-486c-82d7-827f853d557e","ts":"2026-02-13T19:39:37.848-05:00","eventName":"n8n.audit.workflow.executed","message":"n8n.audit.workflow.executed","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"12","source":"user-manual"}} +{"__type":"$$EventMessageNode","id":"486f29c2-2407-4c59-b779-c7d72f82bf16","ts":"2026-02-13T19:39:37.849-05:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"12","nodeType":"n8n-nodes-base.httpRequest","nodeName":"OSM Dunakeszi Query","nodeId":"c93e1c88-e915-4d19-882a-417415ecf495"}} +{"__type":"$$EventMessageNode","id":"1dc749a7-af74-44c4-ac62-448459eee769","ts":"2026-02-13T19:39:42.667-05:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"12","nodeType":"n8n-nodes-base.httpRequest","nodeName":"OSM Dunakeszi Query","nodeId":"c93e1c88-e915-4d19-882a-417415ecf495"}} +{"__type":"$$EventMessageWorkflow","id":"f0cfa9b9-81a2-4871-a20d-7ecb9b72fede","ts":"2026-02-13T19:39:42.670-05:00","eventName":"n8n.workflow.failed","message":"n8n.workflow.failed","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","executionId":"12","success":false,"isManual":true,"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","lastNodeExecuted":"OSM Dunakeszi Query","errorNodeType":"n8n-nodes-base.httpRequest","errorMessage":"Gateway timed out - perhaps try again later?"}} +{"__type":"$$EventMessageAudit","id":"8d126d0c-9363-40c8-93bb-47c05112e696","ts":"2026-02-14T05:18:53.575-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"ce0140d9-1d69-40d0-9cac-45892bdb75e9","ts":"2026-02-14T05:18:56.263-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"658bc4db-ffa9-48fc-88d2-d970808e2635","ts":"2026-02-14T05:19:01.218-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageWorkflow","id":"c78ea193-5a9f-43fe-8006-2a0009a6eb93","ts":"2026-02-14T05:30:23.101-05:00","eventName":"n8n.workflow.started","message":"n8n.workflow.started","payload":{"executionId":"13","workflowId":"eRVwBJfXw8ymc6aZ","isManual":false,"workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"db508d17-9098-48d2-8f2a-e5dd0ede374f","ts":"2026-02-14T05:30:23.102-05:00","eventName":"n8n.audit.workflow.executed","message":"n8n.audit.workflow.executed","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"13","source":"user-manual"}} +{"__type":"$$EventMessageNode","id":"af91453e-bec7-4a27-9cee-256205b04608","ts":"2026-02-14T05:30:23.102-05:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"13","nodeType":"n8n-nodes-base.manualTrigger","nodeName":"When clicking ‘Execute workflow’","nodeId":"1ddbe06f-01d6-44df-a3ea-8feac5b34ce3"}} +{"__type":"$$EventMessageNode","id":"0fda3878-4fa1-4401-9c1a-4498d5f960e8","ts":"2026-02-14T05:30:23.105-05:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"13","nodeType":"n8n-nodes-base.manualTrigger","nodeName":"When clicking ‘Execute workflow’","nodeId":"1ddbe06f-01d6-44df-a3ea-8feac5b34ce3"}} +{"__type":"$$EventMessageNode","id":"eec0e3c5-8bdf-4626-b069-eae598a22cdd","ts":"2026-02-14T05:30:23.106-05:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"13","nodeType":"n8n-nodes-base.httpRequest","nodeName":"OSM Dunakeszi Query","nodeId":"c93e1c88-e915-4d19-882a-417415ecf495"}} +{"__type":"$$EventMessageNode","id":"4c35d592-8650-4a67-abd8-460ced5256b5","ts":"2026-02-14T05:30:23.845-05:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"13","nodeType":"n8n-nodes-base.httpRequest","nodeName":"OSM Dunakeszi Query","nodeId":"c93e1c88-e915-4d19-882a-417415ecf495"}} +{"__type":"$$EventMessageNode","id":"8796b30f-1d1d-433f-a0fd-23365fddf1d7","ts":"2026-02-14T05:30:23.848-05:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"13","nodeType":"n8n-nodes-base.itemLists","nodeName":"Split into Services","nodeId":"b8a98965-296a-4959-91ba-a0202bce4b64"}} +{"__type":"$$EventMessageNode","id":"477aed86-ecf7-48b7-8e17-7dcd907d1f4e","ts":"2026-02-14T05:30:23.852-05:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"13","nodeType":"n8n-nodes-base.itemLists","nodeName":"Split into Services","nodeId":"b8a98965-296a-4959-91ba-a0202bce4b64"}} +{"__type":"$$EventMessageWorkflow","id":"c8efc08c-d46e-46da-a2df-e221520b34f8","ts":"2026-02-14T05:30:23.856-05:00","eventName":"n8n.workflow.success","message":"n8n.workflow.success","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","executionId":"13","success":true,"isManual":true,"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"8488aec1-19c9-4d5b-b4dc-0797cc85f719","ts":"2026-02-14T06:13:53.488-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"3854fbcd-68dd-407f-932e-5b75a1baffce","ts":"2026-02-14T06:14:00.423-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageWorkflow","id":"f8ec573e-869b-4fba-8ea0-779d3b42f80e","ts":"2026-02-14T06:14:02.394-05:00","eventName":"n8n.workflow.started","message":"n8n.workflow.started","payload":{"executionId":"14","workflowId":"eRVwBJfXw8ymc6aZ","isManual":false,"workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"bb6009f2-cc45-4159-bd92-522157b81cc3","ts":"2026-02-14T06:14:02.399-05:00","eventName":"n8n.audit.workflow.executed","message":"n8n.audit.workflow.executed","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"14","source":"user-manual"}} +{"__type":"$$EventMessageNode","id":"90455d15-42ad-4594-a06f-96df4b89720d","ts":"2026-02-14T06:14:02.400-05:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"14","nodeType":"n8n-nodes-base.wait","nodeName":"Wait","nodeId":"0e27eb6c-c5fc-47e0-9fe2-f930e52741ac"}} +{"__type":"$$EventMessageNode","id":"dadd9d3c-a956-4fb0-a884-8b68c6474439","ts":"2026-02-14T06:14:03.401-05:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"14","nodeType":"n8n-nodes-base.wait","nodeName":"Wait","nodeId":"0e27eb6c-c5fc-47e0-9fe2-f930e52741ac"}} +{"__type":"$$EventMessageWorkflow","id":"16c84270-377d-499a-b2af-db7c282550f9","ts":"2026-02-14T06:14:03.407-05:00","eventName":"n8n.workflow.success","message":"n8n.workflow.success","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","executionId":"14","success":true,"isManual":true,"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageWorkflow","id":"a480ee3f-57c1-4704-817b-c0b2fffb3c17","ts":"2026-02-14T06:15:15.549-05:00","eventName":"n8n.workflow.started","message":"n8n.workflow.started","payload":{"executionId":"15","workflowId":"eRVwBJfXw8ymc6aZ","isManual":false,"workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"f5bcaada-8993-4356-80ae-99764a7eec2c","ts":"2026-02-14T06:15:15.549-05:00","eventName":"n8n.audit.workflow.executed","message":"n8n.audit.workflow.executed","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"15","source":"user-manual"}} +{"__type":"$$EventMessageNode","id":"a219400c-0fa1-4a20-b0a0-1b1be372550a","ts":"2026-02-14T06:15:15.550-05:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"15","nodeType":"n8n-nodes-base.manualTrigger","nodeName":"When clicking ‘Execute workflow’","nodeId":"1ddbe06f-01d6-44df-a3ea-8feac5b34ce3"}} +{"__type":"$$EventMessageNode","id":"50b0f9a7-455d-46de-9685-8df8c89f95c2","ts":"2026-02-14T06:15:15.551-05:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"15","nodeType":"n8n-nodes-base.manualTrigger","nodeName":"When clicking ‘Execute workflow’","nodeId":"1ddbe06f-01d6-44df-a3ea-8feac5b34ce3"}} +{"__type":"$$EventMessageNode","id":"0bcfb070-9ed6-4804-bf66-046034315019","ts":"2026-02-14T06:15:15.551-05:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"15","nodeType":"n8n-nodes-base.httpRequest","nodeName":"OSM Dunakeszi Query","nodeId":"c93e1c88-e915-4d19-882a-417415ecf495"}} +{"__type":"$$EventMessageNode","id":"b1ff2a72-6986-4b14-ae8d-133b9256357c","ts":"2026-02-14T06:15:19.614-05:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"15","nodeType":"n8n-nodes-base.httpRequest","nodeName":"OSM Dunakeszi Query","nodeId":"c93e1c88-e915-4d19-882a-417415ecf495"}} +{"__type":"$$EventMessageNode","id":"253f0ba5-61d4-4834-8636-c9d52a6ab0d1","ts":"2026-02-14T06:15:19.616-05:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"15","nodeType":"n8n-nodes-base.itemLists","nodeName":"Split into Services","nodeId":"b8a98965-296a-4959-91ba-a0202bce4b64"}} +{"__type":"$$EventMessageNode","id":"cf951e04-6e87-4d5d-b4f0-6b1837ec04f7","ts":"2026-02-14T06:15:19.617-05:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"15","nodeType":"n8n-nodes-base.itemLists","nodeName":"Split into Services","nodeId":"b8a98965-296a-4959-91ba-a0202bce4b64"}} +{"__type":"$$EventMessageNode","id":"4420cdcc-81d9-432c-bada-8704160c4cbb","ts":"2026-02-14T06:15:19.621-05:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"15","nodeType":"n8n-nodes-base.wait","nodeName":"Wait","nodeId":"0e27eb6c-c5fc-47e0-9fe2-f930e52741ac"}} +{"__type":"$$EventMessageNode","id":"16a28303-31f8-42d7-8262-b1dbb16ae028","ts":"2026-02-14T06:15:20.621-05:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"15","nodeType":"n8n-nodes-base.wait","nodeName":"Wait","nodeId":"0e27eb6c-c5fc-47e0-9fe2-f930e52741ac"}} +{"__type":"$$EventMessageWorkflow","id":"399f7316-c22b-4e71-87a3-269d3c2c700c","ts":"2026-02-14T06:15:20.626-05:00","eventName":"n8n.workflow.success","message":"n8n.workflow.success","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","executionId":"15","success":true,"isManual":true,"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"8507e5ee-07b9-4d4a-ba40-56b02d56d33a","ts":"2026-02-14T06:15:36.208-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"12a4fe9f-bcbd-4755-8076-c77806fc951a","ts":"2026-02-14T06:15:37.833-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"f32ae7db-f1bb-4fe3-9c0f-dc1ea908dd57","ts":"2026-02-14T06:15:40.295-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"690c0513-3259-43a3-b74e-d8abdecc4b4b","ts":"2026-02-14T06:15:44.034-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"d5ff3782-1f8a-47f1-b6ea-2afd1e739feb","ts":"2026-02-14T06:24:28.191-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"31e099cc-d845-4735-b79e-6f5772c6154b","ts":"2026-02-14T06:24:59.089-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"46ffbb65-17e6-43c4-83fc-decff61f4517","ts":"2026-02-14T06:25:09.901-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"b4a4dff6-8ee0-4468-bdae-1a8a821be1b0","ts":"2026-02-14T06:25:20.226-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"7b951c4d-745d-49fe-b090-5f68ba5862cc","ts":"2026-02-14T06:25:27.959-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageWorkflow","id":"72ccb333-8c36-4561-a59f-1ee04e856b53","ts":"2026-02-14T07:49:39.514-05:00","eventName":"n8n.workflow.failed","message":"n8n.workflow.failed","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","executionId":"16","success":false,"isManual":true,"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","errorMessage":"The workflow has issues and cannot be executed for that reason. Please fix them first."}} +{"__type":"$$EventMessageAudit","id":"84bdec4d-233d-4428-a79d-cc2958dcfea3","ts":"2026-02-14T07:49:49.340-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"5ac09daf-9252-4710-93fe-3d8bcc553832","ts":"2026-02-14T07:49:53.046-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"feb81ad9-d0d6-43ea-912f-c523c51917e9","ts":"2026-02-14T07:52:20.840-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"d1fdffa3-e2e2-4f95-b6b3-0f6b55577c4a","ts":"2026-02-14T07:52:25.776-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageWorkflow","id":"6674e7ba-f972-41fa-af17-d18bb78c6f85","ts":"2026-02-14T07:52:29.308-05:00","eventName":"n8n.workflow.started","message":"n8n.workflow.started","payload":{"executionId":"17","workflowId":"eRVwBJfXw8ymc6aZ","isManual":false,"workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"e546b4e0-04f7-4b49-8514-b8634a579296","ts":"2026-02-14T07:52:29.308-05:00","eventName":"n8n.audit.workflow.executed","message":"n8n.audit.workflow.executed","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"17","source":"user-manual"}} +{"__type":"$$EventMessageNode","id":"350286e7-be70-4237-a625-ec602a529364","ts":"2026-02-14T07:52:29.309-05:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"17","nodeType":"n8n-nodes-base.manualTrigger","nodeName":"When clicking ‘Execute workflow’","nodeId":"1ddbe06f-01d6-44df-a3ea-8feac5b34ce3"}} +{"__type":"$$EventMessageNode","id":"6e15c770-05bd-4cea-b964-eb27cefbcfcf","ts":"2026-02-14T07:52:29.311-05:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"17","nodeType":"n8n-nodes-base.manualTrigger","nodeName":"When clicking ‘Execute workflow’","nodeId":"1ddbe06f-01d6-44df-a3ea-8feac5b34ce3"}} +{"__type":"$$EventMessageNode","id":"79bc8219-5d46-4d5a-a455-bd09bb769b30","ts":"2026-02-14T07:52:29.311-05:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"17","nodeType":"n8n-nodes-base.httpRequest","nodeName":"OSM Dunakeszi Query","nodeId":"c93e1c88-e915-4d19-882a-417415ecf495"}} +{"__type":"$$EventMessageNode","id":"d6071e75-b4b3-4774-b8c2-e4a7eee77e26","ts":"2026-02-14T07:52:29.901-05:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"17","nodeType":"n8n-nodes-base.httpRequest","nodeName":"OSM Dunakeszi Query","nodeId":"c93e1c88-e915-4d19-882a-417415ecf495"}} +{"__type":"$$EventMessageNode","id":"6f335404-6d74-416e-9691-9d127d2cda55","ts":"2026-02-14T07:52:29.904-05:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"17","nodeType":"n8n-nodes-base.itemLists","nodeName":"Split into Services","nodeId":"b8a98965-296a-4959-91ba-a0202bce4b64"}} +{"__type":"$$EventMessageNode","id":"e80841e2-3fd7-497d-9be8-8fd17f190b58","ts":"2026-02-14T07:52:29.906-05:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"17","nodeType":"n8n-nodes-base.itemLists","nodeName":"Split into Services","nodeId":"b8a98965-296a-4959-91ba-a0202bce4b64"}} +{"__type":"$$EventMessageNode","id":"5abd0988-a5e3-4751-b647-9d83734a9cf8","ts":"2026-02-14T07:52:29.907-05:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"17","nodeType":"n8n-nodes-base.wait","nodeName":"Wait","nodeId":"0e27eb6c-c5fc-47e0-9fe2-f930e52741ac"}} +{"__type":"$$EventMessageNode","id":"2fc5a840-2823-48f4-9114-18a8720b666a","ts":"2026-02-14T07:52:30.907-05:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"17","nodeType":"n8n-nodes-base.wait","nodeName":"Wait","nodeId":"0e27eb6c-c5fc-47e0-9fe2-f930e52741ac"}} +{"__type":"$$EventMessageNode","id":"f07f2541-2fc5-480f-a726-c14244b292c0","ts":"2026-02-14T07:52:30.909-05:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"17","nodeType":"n8n-nodes-base.postgres","nodeName":"Insert rows in a table","nodeId":"1694daf7-4805-4d38-8e87-377b5cd33525"}} +{"__type":"$$EventMessageNode","id":"1b13f2a6-0e54-43be-be0b-0ec00f1ec1f1","ts":"2026-02-14T07:52:31.006-05:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"17","nodeType":"n8n-nodes-base.postgres","nodeName":"Insert rows in a table","nodeId":"1694daf7-4805-4d38-8e87-377b5cd33525"}} +{"__type":"$$EventMessageWorkflow","id":"2d9f4963-22ed-4480-bb86-a4163c285bd7","ts":"2026-02-14T07:52:31.008-05:00","eventName":"n8n.workflow.failed","message":"n8n.workflow.failed","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","executionId":"17","success":false,"isManual":true,"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","lastNodeExecuted":"Insert rows in a table","errorNodeType":"n8n-nodes-base.postgres","errorMessage":"relation \"data.data.service_staging.\" does not exist"}} +{"__type":"$$EventMessageAudit","id":"0efd80e6-e003-4f96-8246-6015fd4eb1ee","ts":"2026-02-14T07:52:59.101-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"75052e11-8ce9-432d-b95f-46dacdd7b730","ts":"2026-02-14T07:53:25.187-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"37bf7d63-54c4-4763-9082-7bd5580c1938","ts":"2026-02-14T07:53:32.148-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"0b0aef6d-f67d-43f4-b694-9715bdee1433","ts":"2026-02-14T07:53:40.822-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"f2e3bc93-57f2-4b38-87e4-00e1249f2af1","ts":"2026-02-14T07:54:16.712-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"6829cb58-9df4-4739-b7aa-e8cfea0e73ae","ts":"2026-02-14T07:54:20.998-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"07c46290-6ffb-4096-a9ad-10b0265e7305","ts":"2026-02-14T07:54:23.086-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageWorkflow","id":"efbbf536-fc52-4719-a634-2965152235a9","ts":"2026-02-14T07:54:23.876-05:00","eventName":"n8n.workflow.started","message":"n8n.workflow.started","payload":{"executionId":"18","workflowId":"eRVwBJfXw8ymc6aZ","isManual":false,"workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"d22c1357-66d7-4d10-9440-9d48d1febb30","ts":"2026-02-14T07:54:23.883-05:00","eventName":"n8n.audit.workflow.executed","message":"n8n.audit.workflow.executed","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"18","source":"user-manual"}} +{"__type":"$$EventMessageNode","id":"37e44c84-cefa-42da-b667-7bb808d19961","ts":"2026-02-14T07:54:23.883-05:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"18","nodeType":"n8n-nodes-base.postgres","nodeName":"Insert rows in a table","nodeId":"1694daf7-4805-4d38-8e87-377b5cd33525"}} +{"__type":"$$EventMessageNode","id":"787ef72e-b9b6-4297-9e71-3ddc3ddda3f8","ts":"2026-02-14T07:54:23.969-05:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"18","nodeType":"n8n-nodes-base.postgres","nodeName":"Insert rows in a table","nodeId":"1694daf7-4805-4d38-8e87-377b5cd33525"}} +{"__type":"$$EventMessageWorkflow","id":"d77a573b-24c7-4d99-a6c0-e9fdd48dd62f","ts":"2026-02-14T07:54:23.972-05:00","eventName":"n8n.workflow.failed","message":"n8n.workflow.failed","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","executionId":"18","success":false,"isManual":true,"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","lastNodeExecuted":"Insert rows in a table","errorNodeType":"n8n-nodes-base.postgres","errorMessage":"column \"type\" of relation \"service_staging\" does not exist"}} +{"__type":"$$EventMessageWorkflow","id":"f839f0ed-d507-43c6-9862-0c42ca7569de","ts":"2026-02-14T07:54:57.087-05:00","eventName":"n8n.workflow.started","message":"n8n.workflow.started","payload":{"executionId":"19","workflowId":"eRVwBJfXw8ymc6aZ","isManual":false,"workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"2c6f14db-14b1-457a-9e1d-4e3d7b4820ed","ts":"2026-02-14T07:54:57.092-05:00","eventName":"n8n.audit.workflow.executed","message":"n8n.audit.workflow.executed","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"19","source":"user-manual"}} +{"__type":"$$EventMessageNode","id":"5163c2d2-b1f3-484a-94c5-5824b4d4af71","ts":"2026-02-14T07:54:57.093-05:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"19","nodeType":"n8n-nodes-base.postgres","nodeName":"Insert rows in a table","nodeId":"1694daf7-4805-4d38-8e87-377b5cd33525"}} +{"__type":"$$EventMessageNode","id":"38ae162b-b084-4f2a-8045-ec51f5038530","ts":"2026-02-14T07:54:57.174-05:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"19","nodeType":"n8n-nodes-base.postgres","nodeName":"Insert rows in a table","nodeId":"1694daf7-4805-4d38-8e87-377b5cd33525"}} +{"__type":"$$EventMessageWorkflow","id":"6943aff3-8528-4b14-8f98-a09259803c14","ts":"2026-02-14T07:54:57.177-05:00","eventName":"n8n.workflow.failed","message":"n8n.workflow.failed","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","executionId":"19","success":false,"isManual":true,"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","lastNodeExecuted":"Insert rows in a table","errorNodeType":"n8n-nodes-base.postgres","errorMessage":"column \"type\" of relation \"service_staging\" does not exist"}} +{"__type":"$$EventMessageAudit","id":"7dd31fb2-78a2-4fd5-a15d-f229346cffbb","ts":"2026-02-14T07:56:16.439-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageWorkflow","id":"75f3ab0e-57c6-4e0d-89b4-5dcc3733d917","ts":"2026-02-14T07:56:22.091-05:00","eventName":"n8n.workflow.started","message":"n8n.workflow.started","payload":{"executionId":"20","workflowId":"eRVwBJfXw8ymc6aZ","isManual":false,"workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"47b0760c-179a-464d-b372-649f409cb9f7","ts":"2026-02-14T07:56:22.099-05:00","eventName":"n8n.audit.workflow.executed","message":"n8n.audit.workflow.executed","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"20","source":"user-manual"}} +{"__type":"$$EventMessageNode","id":"4c62e1d6-db5d-4988-88d6-ac58d1383f18","ts":"2026-02-14T07:56:22.100-05:00","eventName":"n8n.node.started","message":"n8n.node.started","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"20","nodeType":"n8n-nodes-base.postgres","nodeName":"Insert rows in a table","nodeId":"1694daf7-4805-4d38-8e87-377b5cd33525"}} +{"__type":"$$EventMessageNode","id":"50442fcb-493b-4020-b2b5-dde1e956bfaa","ts":"2026-02-14T07:56:22.180-05:00","eventName":"n8n.node.finished","message":"n8n.node.finished","payload":{"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","executionId":"20","nodeType":"n8n-nodes-base.postgres","nodeName":"Insert rows in a table","nodeId":"1694daf7-4805-4d38-8e87-377b5cd33525"}} +{"__type":"$$EventMessageWorkflow","id":"39577d06-de03-4bcd-b07a-5835e32c7071","ts":"2026-02-14T07:56:22.183-05:00","eventName":"n8n.workflow.failed","message":"n8n.workflow.failed","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","executionId":"20","success":false,"isManual":true,"workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter","lastNodeExecuted":"Insert rows in a table","errorNodeType":"n8n-nodes-base.postgres","errorMessage":"permission denied for table service_staging"}} +{"__type":"$$EventMessageAudit","id":"6a3642fd-08db-492e-8453-945a7dad98a1","ts":"2026-02-14T07:59:45.227-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"54e9a006-1a04-46f5-93f3-f52836454ff8","ts":"2026-02-14T08:01:36.381-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"bfadc201-aef1-4a82-a72d-a38ce5703425","ts":"2026-02-14T08:02:19.364-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"456ca4d2-93e1-47c8-acf4-e6fa3a080d32","ts":"2026-02-14T08:03:21.657-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"17971dc5-2578-4430-add2-2ac305dea97c","ts":"2026-02-14T08:04:45.060-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"222b508d-f23e-4d29-934f-e81fc23f35fb","ts":"2026-02-14T08:04:55.136-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"3fe50cf4-5ae9-4e60-ab6a-48be49c425ff","ts":"2026-02-14T08:05:02.789-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"056728b2-6b80-445f-b9df-ab114d5cffa1","ts":"2026-02-14T08:49:56.576-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"2a34b359-b84c-446e-80bf-f2740a48ef9f","ts":"2026-02-14T08:50:10.430-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"150927be-db4c-4b8d-8a3a-d7052e38b801","ts":"2026-02-14T08:58:51.135-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"c7c0f254-2966-455d-bca3-cebfa1b2dab5","ts":"2026-02-14T08:59:22.718-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"bc2ae192-ebfa-4cce-97e9-32e725a15cc5","ts":"2026-02-14T08:59:25.438-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"5f91b541-7a73-4630-9592-bf8df5e3aa27","ts":"2026-02-14T08:59:30.313-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"aac6019c-d935-4ff9-a7fa-236ae76add07","ts":"2026-02-14T08:59:44.159-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"153c56b1-3cca-4b3b-adc6-80ba93079d1d","ts":"2026-02-14T09:00:04.356-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"36f93747-2b8b-45d4-b0fd-9857b566980a","ts":"2026-02-14T09:11:58.119-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"87e05440-992a-4166-8bcb-01ba52f374b8","ts":"2026-02-14T09:12:11.567-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"8dac283b-2861-4d3f-8307-81317bc1ce4c","ts":"2026-02-14T09:12:17.827-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"57704429-5b09-428c-984f-fe3aa7fc4aea","ts":"2026-02-14T09:12:20.895-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"0fad1c53-af81-4ec0-ac41-d7cd1992aca4","ts":"2026-02-14T09:12:45.565-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"c7f6327c-7788-4105-96b8-c3c608b3709e","ts":"2026-02-14T09:12:49.760-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"f7e6feab-0a45-4b78-b526-bd61d90421c8","ts":"2026-02-14T09:12:58.006-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"ff14b040-c2d8-4f98-8d9a-68789d96ca9f","ts":"2026-02-14T09:13:10.495-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"ad2b88bc-5aea-4a57-bc0d-f75b70237e9f","ts":"2026-02-14T09:13:22.220-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} +{"__type":"$$EventMessageAudit","id":"f439a7c2-7aec-4bc5-8ef4-2891aa75072a","ts":"2026-02-14T09:13:32.643-05:00","eventName":"n8n.audit.workflow.updated","message":"n8n.audit.workflow.updated","payload":{"userId":"07cbc1c9-f562-4c77-88d0-c0c8faff3e82","_email":"kincses@gmail.com","_firstName":"Zsolt","_lastName":"Gyongyossy","globalRole":"global:owner","workflowId":"eRVwBJfXw8ymc6aZ","workflowName":"01 - Dunakeszi Seed Hunter"}} diff --git a/n8n/data/nodes/package.json b/n8n/data/nodes/package.json new file mode 100644 index 0000000..9e96546 --- /dev/null +++ b/n8n/data/nodes/package.json @@ -0,0 +1,5 @@ +{ + "name": "installed-nodes", + "private": true, + "dependencies": {} +} \ No newline at end of file