§
    s�’j   ã                  ól   — d dl mZ d dlZd dlmZ d dlmZ  ej        d¦  «        Z G d„ d¦  «        Z	dS )é    )ÚannotationsN)ÚAny)Ú
Connectionz(dscons.postgres.dossier_reviews.findingsc                  ó.   — e Zd ZdZddœdd„Zddœdd„ZdS )Ú"DossierReviewFindingMutationsMixinz.Finding assignment and supplement submissions.N)Ú
connectionÚ	review_idÚstrÚ
finding_idÚpayloadúdict[str, Any]r   úConnection[Any] | NoneÚreturnc          
     ó¸   ‡ ‡‡‡‡‡‡	— dŠdŠdŠ	‰                       |ˆˆˆˆˆˆ ˆ	fd„¦  «        }‰                      ‰|d¬¦  «        }‰                      |‰|¦  «        S )zGAssign a finding to a department or employee and update workflow state.a`  
            INSERT INTO dossier_review_assignments (
                review_session_id, finding_id, assigned_department_code, assigned_employee_id, assigned_by_employee_id,
                assignment_note, status, priority, due_date, accepted_at, metadata
            )
            SELECT
                review.id, finding.id, %(assigned_department_code_insert)s::varchar,
                (SELECT employee.id FROM employees employee WHERE employee.employee_code = %(assigned_employee_code_lookup)s::varchar LIMIT 1),
                (SELECT employee.id FROM employees employee WHERE employee.employee_code = %(assigned_by_employee_code_lookup)s::varchar LIMIT 1),
                %(assignment_note_insert)s::text, %(status_insert)s::varchar, %(priority_insert)s::varchar, %(due_date_insert)s::date,
                CASE
                    WHEN %(status_acceptance)s::varchar IN ('accepted', 'in_progress', 'submitted', 'returned', 'verified', 'overdue')
                    THEN NOW()
                    ELSE NULL
                END,
                %(metadata_insert)s::jsonb
            FROM dossier_review_sessions review
            JOIN dossier_review_findings finding ON finding.review_session_id = review.id
            WHERE review.id::text = %(review_id)s::text AND finding.id::text = %(finding_id)s::text
            RETURNING id::text AS assignment_id
        z²
            SELECT status, supplement_status, responsible_department_code, due_date
            FROM dossier_review_findings
            WHERE id::text = %(finding_id)s
        a  
            UPDATE dossier_review_findings
            SET
                current_assignment_id = %(assignment_id_update)s::uuid,
                responsible_department_code = %(assigned_department_code_update)s::varchar,
                status = %(finding_status_update)s::varchar,
                supplement_status = %(supplement_status_update)s::varchar,
                due_date = COALESCE(%(due_date_update)s::date, due_date),
                updated_at = NOW()
            WHERE id::text = %(finding_id_update)s::text
        c           	     ó<   •— ‰                      | ‰‰‰‰‰‰¬¦  «        S )N)Úcursorr	   r   r   Úcreate_assignment_queryÚfinding_state_queryÚupdate_finding_query)Ú*_assign_dossier_review_finding_with_cursor)r   r   r   r   r   r	   Úselfr   s    €€€€€€€úIC:\Projects\DSCons\app\core\postgres\dossier_reviews\finding_mutations.pyú<lambda>zRDossierReviewFindingMutationsMixin.assign_dossier_review_finding.<locals>.<lambda>>   s2   ø€ ˜4×JÒJØØ#Ø%ØØ(?Ø$7Ø%9ð Kñ ô € ó    u?   KhÃ´ng thá»ƒ táº£i láº¡i review session sau khi assign finding.©r	   r   Úerror_message)Ú!_execute_with_optional_connectionÚ$_fetch_single_dossier_review_sessionÚ_find_finding_assignment)
r   r	   r   r   r   Úassignment_idÚsessionr   r   r   s
   ````   @@@r   Úassign_dossier_review_findingz@DossierReviewFindingMutationsMixin.assign_dossier_review_finding   s¬   øøøøøøø€ ð#Ðð*Ðð

 Ðð ×>Ò>Øðð ð ð ð ð ð ð ð ð ñ
ô 
ˆð ×;Ò;ØØ!Ø[ð <ñ 
ô 
ˆð
 ×,Ò,¨W°jÀ-ÑPÔPÐPr   c               óð   ‡ ‡‡‡‡‡‡	‡
‡— dŠdŠdŠ	dŠ
dŠ‰                       |ˆˆˆˆ	ˆˆˆ ˆ
ˆf	d„¦  «        }‰                      ‰|d¬¦  «        }‰                      |‰‰                     d	¦  «        |¦  «        S )
zJRecord a supplement submission for an assignment and update review status.a{  
            INSERT INTO dossier_review_submissions (
                review_session_id, assignment_id, finding_id, submitted_by_employee_id,
                submission_type, submission_note, attachment_count, submitted_payload
            )
            SELECT
                f.review_session_id, a.id, f.id, submitter.id, %(submission_type)s, %(submission_note)s,
                %(attachment_count)s, %(submitted_payload)s::jsonb
            FROM dossier_review_sessions rs
            JOIN dossier_review_findings f ON f.review_session_id = rs.id AND f.id::text = %(finding_id)s
            JOIN dossier_review_assignments a ON a.finding_id = f.id AND a.id::text = %(assignment_id)s
            LEFT JOIN employees submitter ON submitter.employee_code = %(submitted_by_employee_code)s
            WHERE rs.id::text = %(review_id)s
            RETURNING id::text AS submission_id
        zvSELECT status, latest_submission_note, submitted_at FROM dossier_review_assignments WHERE id::text = %(assignment_id)sz]SELECT status, supplement_status FROM dossier_review_findings WHERE id::text = %(finding_id)sa7  
            UPDATE dossier_review_assignments
            SET
                status = %(assignment_status)s::text,
                latest_submission_note = %(submission_note)s,
                accepted_at = CASE
                    WHEN accepted_at IS NULL AND %(assignment_status)s::text IN ('accepted', 'in_progress', 'submitted', 'returned', 'verified', 'overdue') THEN NOW()
                    ELSE accepted_at
                END,
                submitted_at = NOW(),
                updated_at = NOW()
            WHERE id::text = %(assignment_id)s
        z×
            UPDATE dossier_review_findings
            SET status = %(finding_status)s::text, supplement_status = %(supplement_status)s::text, updated_at = NOW()
            WHERE id::text = %(finding_id)s
        c                ó@   •	— ‰                      | ‰‰‰‰‰‰‰‰	¬¦	  «	        S )N)	r   r	   r   r   Úcreate_submission_queryÚassignment_state_queryr   Úupdate_assignment_queryr   )Ú-_submit_dossier_review_supplement_with_cursor)
r   r&   r%   r   r   r   r	   r   r'   r   s
    €€€€€€€€€r   r   zUDossierReviewFindingMutationsMixin.submit_dossier_review_supplement.<locals>.<lambda>}   s8   ø€ ˜4×MÒMØØ#Ø%ØØ(?Ø'=Ø$7Ø(?Ø%9ð Nñ 
ô 
€ r   u@   KhÃ´ng thá»ƒ táº£i láº¡i review session sau khi ná»™p bá»• sung.r   r    )r   r   Ú_find_assignment_submissionÚget)r   r	   r   r   r   Úsubmission_idr!   r&   r%   r   r'   r   s   ````   @@@@@r   Ú submit_dossier_review_supplementzCDossierReviewFindingMutationsMixin.submit_dossier_review_supplementO   sÜ   øøøøøøøøø€ ð#Ðð "ZÐØ}Ðð#Ðð Ðð
 ×>Ò>Øð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ñ
ô 
ˆð ×;Ò;ØØ!Ø\ð <ñ 
ô 
ˆð
 ×/Ò/Ø�Z §¢¨_Ñ!=Ô!=¸}ñ
ô 
ð 	
r   )
r	   r
   r   r
   r   r   r   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r"   r,   © r   r   r   r      so   € € € € € Ø8Ð8ð .2ð?Qð ?Qð ?Qð ?Qð ?Qð ?QðN .2ðA
ð A
ð A
ð A
ð A
ð A
ð A
ð A
r   r   )
Ú
__future__r   ÚloggingÚtypingr   Úpsycopg.connectionr   Ú	getLoggerÚloggerr   r1   r   r   ú<module>r8      s“   ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð à )Ð )Ð )Ð )Ð )Ð )à	ˆÔ	ÐEÑ	FÔ	F€ðE
ð E
ð E
ð E
ð E
ñ E
ô E
ð E
ð E
ð E
r   