import type { VrLike } from './clients.js'; export type PersonCompaniesConfidenceTier = 'HIGH' | 'LOW'; export interface PersonCompanyRole { ico: string; name: string | null; role: string | null; share_type: string | null; valid_from: string | null; valid_to: string | null; status: string | null; registered_at: string | null; deleted_at: string | null; member_ico: string | null; member_company_name: string | null; } export interface PersonCompaniesPerson { person_id: string; full_name: string; given_name: string | null; family_name: string | null; birth_year: number | null; confidence: { tier: PersonCompaniesConfidenceTier; score: number; basis: 'NAME_AND_BIRTH_YEAR' | 'NAME_ONLY'; }; namesake_flag: boolean; distinguisher: string; companies: PersonCompanyRole[]; } export interface PersonCompaniesResult { query: { name: string; birth_year?: number; }; persons: PersonCompaniesPerson[]; namesake_flag: boolean; } export declare const PERSON_COMPANIES_SQL = "\nWITH input AS (\n SELECT\n lower(trim($1::text)) AS q_name,\n $2::int AS q_birth_year\n),\nmatched_persons AS (\n SELECT\n p.id,\n p.canonical_key,\n p.full_name,\n p.given_name,\n p.family_name,\n p.birth_date,\n CASE WHEN i.q_birth_year IS NOT NULL AND p.birth_date IS NOT NULL\n AND extract(year FROM p.birth_date)::int = i.q_birth_year THEN 'HIGH' ELSE 'LOW' END AS confidence_tier,\n CASE WHEN i.q_birth_year IS NOT NULL AND p.birth_date IS NOT NULL\n AND extract(year FROM p.birth_date)::int = i.q_birth_year THEN 0.95 ELSE 0.50 END AS confidence_score,\n CASE WHEN i.q_birth_year IS NOT NULL AND p.birth_date IS NOT NULL\n AND extract(year FROM p.birth_date)::int = i.q_birth_year THEN 'NAME_AND_BIRTH_YEAR' ELSE 'NAME_ONLY' END AS confidence_basis\n FROM vr.persons p\n CROSS JOIN input i\n WHERE (\n lower(trim(p.full_name)) = i.q_name\n OR lower(trim(coalesce(p.given_name, '') || ' ' || coalesce(p.family_name, ''))) = i.q_name\n OR lower(trim(p.family_name)) = i.q_name\n )\n AND (\n i.q_birth_year IS NULL\n OR (p.birth_date IS NOT NULL AND extract(year FROM p.birth_date)::int = i.q_birth_year)\n )\n LIMIT 8000\n),\nnamesake AS (\n SELECT (\n SELECT count(*) FROM (\n SELECT 1 FROM matched_persons WHERE birth_date IS NOT NULL GROUP BY canonical_key LIMIT 2\n ) t\n ) > 1 AS flag\n),\nidentities AS (\n SELECT\n canonical_key,\n min(id) AS person_id,\n max(full_name) AS full_name,\n max(given_name) AS given_name,\n max(family_name) AS family_name,\n max(birth_date) AS birth_date,\n max(confidence_tier) AS confidence_tier,\n max(confidence_score) AS confidence_score,\n max(confidence_basis) AS confidence_basis\n FROM matched_persons\n GROUP BY canonical_key\n ORDER BY max(full_name)\n LIMIT 200\n),\nperson_roles AS (\n SELECT\n id.canonical_key,\n id.person_id,\n id.full_name,\n id.given_name,\n id.family_name,\n extract(year FROM id.birth_date)::int AS birth_year,\n id.confidence_tier,\n id.confidence_score,\n id.confidence_basis,\n r.company_ico AS ico,\n c.name,\n r.role,\n r.share_type,\n r.valid_from,\n r.valid_to,\n c.status,\n c.registered_at,\n c.deleted_at,\n r.member_ico,\n mc.name AS member_company_name\n FROM identities id\n JOIN matched_persons mp ON mp.canonical_key = id.canonical_key\n JOIN vr.roles r ON r.person_id = mp.id\n LEFT JOIN vr.companies c ON c.ico = r.company_ico\n LEFT JOIN vr.companies mc ON mc.ico = r.member_ico\n WHERE r.company_ico IS NOT NULL\n)\nSELECT\n pr.person_id::text,\n pr.full_name,\n pr.given_name,\n pr.family_name,\n pr.birth_year,\n pr.confidence_tier,\n pr.confidence_score,\n pr.confidence_basis,\n (SELECT flag FROM namesake) AS namesake_flag,\n concat(\n 'person_id=', pr.person_id::text,\n coalesce(', birth_year=' || pr.birth_year::text, ', birth_year=unknown')\n ) AS distinguisher,\n jsonb_agg(DISTINCT jsonb_build_object(\n 'ico', pr.ico,\n 'name', pr.name,\n 'role', pr.role,\n 'share_type', pr.share_type,\n 'valid_from', pr.valid_from,\n 'valid_to', pr.valid_to,\n 'status', pr.status,\n 'registered_at', pr.registered_at,\n 'deleted_at', pr.deleted_at,\n 'member_ico', pr.member_ico,\n 'member_company_name', pr.member_company_name\n )) AS companies\nFROM person_roles pr\nGROUP BY\n pr.person_id,\n pr.full_name,\n pr.given_name,\n pr.family_name,\n pr.birth_year,\n pr.confidence_tier,\n pr.confidence_score,\n pr.confidence_basis\nORDER BY pr.full_name, pr.birth_year NULLS LAST, pr.person_id\nLIMIT 200\n"; export declare function lookupPersonCompanies(vr: VrLike, input: { name: string; birthYear?: number; }): Promise; //# sourceMappingURL=vr-person-companies.d.ts.map