§
    Ó]¶jK  ã                  ó`   — d dl mZ d dlZd dlmZ  ej        d¦  «        Z G d„ d¦  «        ZdS )é    )ÚannotationsN)ÚAnyz$dscons.postgres.project_crud.queriesc                  ó2   — e Zd ZdZ	 	 	 ddd	„Zdd„Zdd„ZdS )ÚProjectsQueriesMixinz?Project master list and detailed project view query operations.NÚstatusú
str | NoneÚsearchÚ
company_idÚreturnúlist[dict[str, Any]]c                ó"  — d}g }|r|dz  }|                      |¦  «         |r2|dk    r,|dk    s|dk    r|dz  }n|dz  }|                      |¦  «         |r$|dz  }d	|› d	�}|                     ||||g¦  «         |d
z  }|                      ¦   «         5 }|                     ¦   «         5 }|                     ||¦  «         |                     ¦   «         cddd¦  «         cddd¦  «         S # 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )uL   Láº¥y danh sÃ¡ch dá»± Ã¡n kÃ¨m chá»‰ sá»‘ WBS vÃ  tiáº¿n Ä‘á»™ tá»•ng há»£p.aº  
            SELECT
                p.id,
                p.project_code,
                p.project_name,
                p.client_name,
                p.location,
                p.project_type,
                p.status,
                p.priority,
                p.budget_amount,
                p.contract_value,
                p.start_date,
                p.expected_end_date,
                p.actual_end_date,
                p.progress_percent,
                p.contract_number,
                p.contract_type,
                p.contract_duration_days,
                p.advance_payment_percent,
                p.retention_percent,
                p.contract_signing_date,
                p.notes,
                p.created_at,
                p.updated_at,
                pm.full_name AS project_manager_name,
                COALESCE(wbs_stats.total_tasks, 0) AS total_wbs_tasks,
                COALESCE(wbs_stats.completed_tasks, 0) AS completed_wbs_tasks
            FROM projects p
            LEFT JOIN employees pm ON p.project_manager_id = pm.id
            LEFT JOIN LATERAL (
                SELECT
                    COUNT(w.id) FILTER (WHERE w.task_type = 'task') AS total_tasks,
                    COUNT(w.id) FILTER (WHERE w.task_type = 'task' AND w.status = 'completed') AS completed_tasks
                FROM erp_project_wbs w
                WHERE w.project_id = p.id
            ) wbs_stats ON TRUE
            WHERE 1=1
        z AND p.company_id = %sÚallÚactiveÚin_progressz* AND p.status IN ('active', 'in_progress')z AND p.status = %szq AND (p.project_code ILIKE %s OR p.project_name ILIKE %s OR p.client_name ILIKE %s OR p.contract_number ILIKE %s)ú%a/   ORDER BY 
            CASE 
                WHEN p.project_code LIKE 'DA-2026%%' OR p.project_code IN ('DA-2608281122', 'DA-IB2600471890', 'DA-KM-DENCS-2026', 'DA-THCS-DAIDONG-2026', 'DA-DADO-PHULIEN-2026', 'DA-THIENDUYEN-KIENHAI-2026') THEN 2026
                WHEN p.project_code LIKE 'DA-2025%%' OR p.project_code LIKE '%%-2025%%' THEN 2025
                WHEN p.project_code LIKE 'DA-2024%%' OR p.project_code LIKE '%%-2024%%' THEN 2024
                WHEN p.project_code LIKE 'DA-2023%%' OR p.project_code LIKE '%%-2023%%' THEN 2023
                WHEN p.project_code LIKE 'DA-2022%%' OR p.project_code LIKE '%%-2022%%' THEN 2022
                ELSE 2020
            END DESC,
            COALESCE(p.start_date, p.contract_signing_date, p.created_at::date) DESC,
            p.project_code DESC;
        N)ÚappendÚextendÚget_connectionÚcursorÚexecuteÚfetchall)	Úselfr   r	   r
   ÚsqlÚparamsÚpatternÚconnÚcurs	            úEC:\Projects\DSCons\app\core\postgres\project_crud\projects_queries.pyÚlist_projectsz"ProjectsQueriesMixin.list_projects   sñ  € ð&ˆðN ˆØð 	&ØÐ+Ñ+ˆCØ�MŠM˜*Ñ%Ô%Ð%Øð 	&�f ’o�oØ˜Ò!Ð! V¨}Ò%<Ð%<ØÐCÑC��àÐ+Ñ+�Ø—’˜fÑ%Ô%Ð%Øð 	@Øð  Gñ  GˆCØ#˜&�m�m�mˆGØ�MŠM˜7 G¨W°gÐ>Ñ?Ô?Ð?àð ñ 	ˆð × Ò Ñ"Ô"ð 	" d¨D¯KªK©M¬Mð 	"¸SØ�KŠK˜˜VÑ$Ô$Ð$Ø—<’<‘>”>ð	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"ð 	"ð 	"s6   ÂDÂ)*C,ÃDÃ,C0	Ã0DÃ3C0	Ã4DÄDÄDÚproject_id_or_codeÚstrúdict[str, Any] | Nonec                óþ  — d}|                       ¦   «         5 }|                     ¦   «         5 }|                     |d|i¦  «         |                     ¦   «         }|s	 ddd¦  «         ddd¦  «         dS |d         }d}|                     ||f¦  «         |                     ¦   «         }d}	|                     |	|f¦  «         |                     ¦   «         }
d}|                     ||f¦  «         |                     ¦   «         }d}|                     ||f¦  «         |                     ¦   «         }ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   |                      |¦  «        }i |¥|||
||d	œ¥S )
uZ   Láº¥y chi tiáº¿t toÃ n diá»‡n cá»§a 1 dá»± Ã¡n kÃ¨m WBS tree, milestones, timeline, risks.a‹  
            SELECT 
                p.*,
                pm.full_name AS project_manager_name,
                c.legal_name AS company_legal_name
            FROM projects p
            LEFT JOIN employees pm ON p.project_manager_id = pm.id
            LEFT JOIN companies c ON p.company_id = c.id
            WHERE p.id::text = %(val)s OR p.project_code = %(val)s
            LIMIT 1;
        ÚvalNÚidz¨
                    SELECT * FROM erp_project_wbs
                    WHERE project_id = %s
                    ORDER BY sort_order ASC, wbs_code ASC;
                z¹
                    SELECT * FROM project_milestones
                    WHERE project_id = %s
                    ORDER BY sort_order ASC, target_date ASC NULLS LAST;
                z´
                    SELECT * FROM project_timeline_events
                    WHERE project_id = %s
                    ORDER BY event_date DESC, created_at DESC;
                zž
                    SELECT * FROM project_risks
                    WHERE project_id = %s
                    ORDER BY identified_date DESC;
                )Ú	wbs_itemsÚwbs_treeÚ
milestonesÚtimeline_eventsÚrisks)r   r   r   Úfetchoner   Ú_build_wbs_tree)r   r    Úsql_projr   r   ÚprojectÚ
project_idÚsql_wbsÚwbs_rowsÚsql_msr(   Úsql_tlr)   Úsql_riskr*   r'   s                   r   Úget_project_detailz'ProjectsQueriesMixin.get_project_detailZ   sH  € ð
ˆð × Ò Ñ"Ô"ð *	# d¨D¯KªK©M¬Mð *	#¸SØ�KŠK˜ 5Ð*<Ð"=Ñ>Ô>Ð>Ø—l’l‘n”nˆGØð Øð	*	#ð *	#ð *	#ñ *	#ô *	#ð *	#ð *	#ð *	#ð *	#ñ *	#ô *	#ð *	#ð *	#ð *	#ð ! œˆJðˆGð
 �KŠK˜ * Ñ/Ô/Ð/Ø—|’|‘~”~ˆHðˆFð
 �KŠK˜  Ñ.Ô.Ð.ØŸš™œˆJðˆFð
 �KŠK˜  Ñ.Ô.Ð.Ø!Ÿlšl™nœnˆOðˆHð
 �KŠK˜ : -Ñ0Ô0Ð0Ø—L’L‘N”NˆEðU*	#ð *	#ð *	#ñ *	#ô *	#ð *	#ð *	#ð *	#ð *	#ð *	#ð *	#øøøð *	#ð *	#ð *	#ð *	#ð *	#ð *	#ð *	#ñ *	#ô *	#ð *	#ð *	#ð *	#ð *	#ð *	#ð *	#øøøð *	#ð *	#ð *	#ð *	#ðZ ×'Ò'¨Ñ1Ô1ˆð
Øð
à!Ø Ø$Ø.Øð
ð 
ð 
ð 	
sA   —E¬0D<ÁEÁ4B<D<Ä0EÄ<E 	Å EÅE 	ÅEÅEÅEr/   c                ó*  — d}|                       ¦   «         5 }|                     ¦   «         5 }|                     ||f¦  «         |                     ¦   «         cddd¦  «         cddd¦  «         S # 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )uO   Láº¥y danh sÃ¡ch cáº¥u kiá»‡n 3D BIM cá»§a dá»± Ã¡n gáº¯n liá»�n vá»›i mÃ£ WBS.aG  
            SELECT 
                b.*,
                w.task_name AS wbs_task_name,
                w.wbs_code
            FROM erp_project_bim_elements b
            LEFT JOIN erp_project_wbs w ON b.wbs_id = w.id
            WHERE b.project_id = %s
            ORDER BY b.installation_day ASC, b.element_guid ASC;
        N)r   r   r   r   )r   r/   Úsql_bimr   r   s        r   Úget_project_bim_elementsz-ProjectsQueriesMixin.get_project_bim_elements    s&  € ð	ˆð × Ò Ñ"Ô"ð 	" d¨D¯KªK©M¬Mð 	"¸SØ�KŠK˜ * Ñ/Ô/Ð/Ø—<’<‘>”>ð	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"ð 	"ð 	"s4   —B¬+A0ÁBÁ0A4	Á4BÁ7A4	Á8BÂBÂB)NNN)r   r   r	   r   r
   r   r   r   )r    r!   r   r"   )r/   r!   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r5   r8   © ó    r   r   r   	   sq   € € € € € ØIÐIð "Ø!Ø!%ð	L"ð L"ð L"ð L"ð L"ð\D
ð D
ð D
ð D
ðL"ð "ð "ð "ð "ð "r>   r   )Ú
__future__r   ÚloggingÚtypingr   Ú	getLoggerÚloggerr   r=   r>   r   ú<module>rD      s�   ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð à	ˆÔ	ÐAÑ	BÔ	B€ðe"ð e"ð e"ð e"ð e"ñ e"ô e"ð e"ð e"ð e"r>   