§
    y�’jÄ  ã                  óf   — d dl mZ d dlZddlmZmZmZmZmZm	Z	 ddl
mZ dd„Zdd
„Zdd„Zdd„ZdS )é    )ÚannotationsNé   )ÚINGEST_BATCHÚROOT_DIRÚSOURCE_CODEÚSOURCE_NAMEÚSOURCE_TYPEÚSOURCE_YEAR)ÚProjectCandidateÚreturnÚNonec                ó  — |                       ¦   «         5 }|                     d¦  «         |                     d¦  «         |                     d¦  «         d d d ¦  «         n# 1 swxY w Y   |                      ¦   «          d S )NaÝ  
            CREATE TABLE IF NOT EXISTS dossier_sources (
                id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
                source_code VARCHAR(50) NOT NULL UNIQUE,
                source_name VARCHAR(255) NOT NULL,
                source_path TEXT NOT NULL,
                source_year INTEGER,
                source_type VARCHAR(100) NOT NULL,
                notes TEXT,
                created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
            );
            a©  
            CREATE TABLE IF NOT EXISTS dossier_entries (
                id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
                source_id UUID NOT NULL REFERENCES dossier_sources(id) ON DELETE CASCADE,
                entry_name VARCHAR(255) NOT NULL,
                entry_path TEXT NOT NULL,
                entry_level INTEGER NOT NULL DEFAULT 1,
                entry_kind VARCHAR(50) NOT NULL,
                classification VARCHAR(100) NOT NULL,
                is_project_candidate BOOLEAN NOT NULL DEFAULT FALSE,
                metadata JSONB NOT NULL DEFAULT '{}'::jsonb,
                created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
            );
            aQ  
            CREATE TABLE IF NOT EXISTS dossier_project_candidates (
                id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
                source_id UUID NOT NULL REFERENCES dossier_sources(id) ON DELETE CASCADE,
                project_code VARCHAR(50) NOT NULL UNIQUE,
                project_name VARCHAR(255) NOT NULL,
                client_name VARCHAR(255),
                location TEXT,
                description TEXT,
                project_type VARCHAR(100),
                status VARCHAR(50) NOT NULL DEFAULT 'planning',
                priority VARCHAR(50) NOT NULL DEFAULT 'medium',
                progress_percent INTEGER NOT NULL DEFAULT 0,
                notes TEXT,
                metadata JSONB NOT NULL DEFAULT '{}'::jsonb,
                created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
            );
            )ÚcursorÚexecuteÚcommit)Ú
connectionr   s     ú=C:\Projects\DSCons\tools\hd2026_ingest_support\persistence.pyÚensure_classification_tablesr      sÖ   € Ø	×	Ò	Ñ	Ô	ð 2
 Ø�Šðñ	
ô 	
ð 	
ð 	�Šðñ	
ô 	
ð 	
ð  	�Šðñ	
ô 	
ð 	
ð?2
ð 2
ð 2
ñ 2
ô 2
ð 2
ð 2
ð 2
ð 2
ð 2
ð 2
øøøð 2
ð 2
ð 2
ð 2
ðf ×ÒÑÔÐÐÐs   •A A!Á!A%Á(A%Ústrc           
     ó4  — |                       ¦   «         5 }|                     dt          t          t	          |¦  «        t
          t          df¦  «         |                     ¦   «         d         }d d d ¦  «         n# 1 swxY w Y   |                      ¦   «          |S )NaY  
            INSERT INTO dossier_sources (
                source_code,
                source_name,
                source_path,
                source_year,
                source_type,
                notes
            )
            VALUES (%s, %s, %s, %s, %s, %s)
            ON CONFLICT (source_code) DO UPDATE
            SET source_name = EXCLUDED.source_name,
                source_path = EXCLUDED.source_path,
                source_year = EXCLUDED.source_year,
                source_type = EXCLUDED.source_type,
                notes = EXCLUDED.notes
            RETURNING id;
            un   Kho há»“ sÆ¡ há»—n há»£p gá»“m cÃ´ng trÃ¬nh, há»£p Ä‘á»“ng thÆ°Æ¡ng máº¡i, váº­t tÆ° vÃ  há»“ sÆ¡ dá»‹ch vá»¥.Úid)	r   r   r   r   r   r
   r	   Úfetchoner   )r   Úroot_dirr   Ú	source_ids       r   Úupsert_sourcer   G   sÓ   € Ø	×	Ò	Ñ	Ô	ð , Ø�Šðõ& ÝÝ�H‘”ÝÝð Aðñ'	
ô 	
ð 	
ð8 —O’OÑ%Ô% dÔ+ˆ	ð;,ð ,ð ,ñ ,ô ,ð ,ð ,ð ,ð ,ð ,ð ,øøøð ,ð ,ð ,ð ,ð< ×ÒÑÔÐØÐs   •AA9Á9A=Â A=r   Úrowsúlist[dict[str, object]]c                óÈ  — |                       ¦   «         5 }|                     d|f¦  «         |D ]†}|                     d||d         t          t          t          |d         ¦  «        z  ¦  «        d|d         |d         |d         dk    t	          j        dt          t          d	œd
¬¦  «        f¦  «         Œ‡	 d d d ¦  «         n# 1 swxY w Y   |                      ¦   «          d S )Nz0DELETE FROM dossier_entries WHERE source_id = %sa›  
                INSERT INTO dossier_entries (
                    source_id,
                    entry_name,
                    entry_path,
                    entry_level,
                    entry_kind,
                    classification,
                    is_project_candidate,
                    metadata
                )
                VALUES (%s, %s, %s, %s, %s, %s, %s, %s::jsonb)
                Ú
entry_namer   Ú
entry_typeÚcategoryÚowner_project_dossierÚ	top_level)Úreview_scopeÚsource_codeÚingest_batchF©Úensure_ascii)	r   r   r   r   ÚjsonÚdumpsr   r   r   )r   r   r   r   Úrows        r   Úreplace_entry_rowsr,   j   sH  € ð 
×	Ò	Ñ	Ô	ð " Ø�ŠÐIÈIÈ<ÑXÔXÐXØð  	ð  	ˆCØ�NŠNðð Ø˜Ô%Ý�¥3 s¨<Ô'8Ñ#9Ô#9Ñ9Ñ:Ô:ØØ˜Ô%Ø˜
”OØ˜
”OÐ'>Ò>Ý”Jà,7Ý+6Ý,8ðð ð
 &+ðñ ô ðñô ð ð ð 	ð"ð "ð "ñ "ô "ð "ð "ð "ð "ð "ð "øøøð "ð "ð "ð "ðF ×ÒÑÔÐÐÐs   •B!CÃCÃ
CÚ
candidatesúlist[ProjectCandidate]c                ó¬  — |                       ¦   «         5 }|                     d|f¦  «         |D ]x}|                     d||j        |j        |j        |j        |j        |j        |j        |j	        |j
        |j        t          j        dt          t          dœd¬¦  «        f¦  «         Œy	 d d d ¦  «         n# 1 swxY w Y   |                      ¦   «          d S )Nz;DELETE FROM dossier_project_candidates WHERE source_id = %sar  
                INSERT INTO dossier_project_candidates (
                    source_id,
                    project_code,
                    project_name,
                    client_name,
                    location,
                    description,
                    project_type,
                    status,
                    priority,
                    progress_percent,
                    notes,
                    metadata
                )
                VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s::jsonb)
                ON CONFLICT (project_code) DO UPDATE
                SET project_name = EXCLUDED.project_name,
                    client_name = EXCLUDED.client_name,
                    location = EXCLUDED.location,
                    description = EXCLUDED.description,
                    project_type = EXCLUDED.project_type,
                    status = EXCLUDED.status,
                    priority = EXCLUDED.priority,
                    progress_percent = EXCLUDED.progress_percent,
                    notes = EXCLUDED.notes,
                    metadata = EXCLUDED.metadata
                Úhd2026_manual_classification)Úingest_sourcer%   r&   Fr'   )r   r   Úproject_codeÚproject_nameÚclient_nameÚlocationÚdescriptionÚproject_typeÚstatusÚpriorityÚprogress_percentÚnotesr)   r*   r   r   r   )r   r   r-   r   Ú	candidates        r   Úreplace_project_candidatesr=   “   sG  € ð 
×	Ò	Ñ	Ô	ð 7 Ø�ŠØIÈIÈ<ñ	
ô 	
ð 	
ð $ð 3	ð 3	ˆIØ�NŠNðð: ØÔ*ØÔ*ØÔ)ØÔ&ØÔ)ØÔ*ØÔ$ØÔ&ØÔ.Ø”OÝ”Jà-KÝ+6Ý,8ðð ð
 &+ðñ ô ðñ;2ô 2ð 2ð 2ð3	ð	7ð 7ð 7ñ 7ô 7ð 7ð 7ð 7ð 7ð 7ð 7øøøð 7ð 7ð 7ð 7ðp ×ÒÑÔÐÐÐs   •BB5Â5B9Â<B9)r   r   )r   r   )r   r   r   r   r   r   )r   r   r-   r.   r   r   )Ú
__future__r   r)   Úconfigr   r   r   r   r	   r
   Úmodelsr   r   r   r,   r=   © ó    r   ú<module>rC      sá   ðØ "Ð "Ð "Ð "Ð "Ð "à €€€ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð %Ð $Ð $Ð $Ð $Ð $ð4ð 4ð 4ð 4ðn ð  ð  ð  ðF&ð &ð &ð &ðR;ð ;ð ;ð ;ð ;ð ;rB   