o
    0iP                     @   s  d dl Z d dlZd dlmZmZmZmZ d dlZd dlm	Z	 d dl
mZ d dlmZ d dlZd dlmZ d dlZG dd dZG d	d
 d
ZG dd dZdee dededee dededdfddZ	d/dededededededee dedededee ddfddZdeeef dededee d ededefd!d"Zd0d#d$Zdejjfd%d&Zd'ejjdedeee  fd(d)Zd'ejjd*ee dededdf
d+d,Zdeddfd-d.Z dS )1    N)ListDictAnyOptional)Credentials)PigeonCloud)send_slack_message)load_environment_variablesc                   @   sF   e Zd ZdZdZdZdgZg dZg dZdgZ	dZ
d	Zed
ZdS )
BaseConfig   g?"   z,https://www.googleapis.com/auth/spreadsheets)u	   選考中u0   説明会キャンセル(AG専用→CS要対応)u%   説明会キャンセル(CS対応済)$   辞退依頼(AG専用→CS要対応)	   不採用u   内定承諾   選考中辞退(CS専用))u   選考開始前u   説明会着座u   1次選考中u1   1次選考中（キャンセル・辞退意向）u"   1次選考中（日程調整中）u   2次選考中u1   2次選考中（キャンセル・辞退意向）u"   2次選考中（日程調整中）u   3次選考中u1   3次選考中（キャンセル・辞退意向）u"   3次選考中（日程調整中）u   4次選考中u1   4次選考中（キャンセル・辞退意向）u"   4次選考中（日程調整中）u   5次選考中u1   5次選考中（キャンセル・辞退意向）u"   5次選考中（日程調整中）u   最終選考前（B）u:   最終選考前（B）（キャンセル・辞退意向）u+   最終選考前（B）（日程調整中）u   最終選考（A）u:   最終選考前（A）（キャンセル・辞退意向）u+   最終選考前（A）（日程調整中）u   内定z#N/AzB4:F300   WEBHOOK_URL_CS_NOTICEN)__name__
__module____qualname__
BATCH_SIZEAPI_WAIT_TIMESTANDARD_COLUMN_COUNTSCOPESTARGET_STATUSESTARGET_STEPSERROR_VALUESCOMPANY_DATA_RANGEDATA_START_ROWosgetenvCS_NOTICE_WEBHOOK_URL r!   r!   A/var/www/html/status_management/src/workflows/progress_manager.pyr
      s    r
   c                   @   s8   e Zd ZdZdedededefddZdefd	d
ZdS )ManagementStatusConfigu$   進捗管理処理の設定クラスgraduation_yearworksheet_namemanagement_worksheet_namecompletion_messagec                 C   s   || _ || _|| _|| _dS )u  
        Args:
            graduation_year: 卒業年（"26卒" or "27卒"）
            worksheet_name: ワークシート名
            management_worksheet_name: 管理ワークシート名
            completion_message: 完了メッセージ
        N)r$   r%   r&   r'   )selfr$   r%   r&   r'   r!   r!   r"   __init__$   s   
zManagementStatusConfig.__init__returnc                 C   s   | j S )u   完了メッセージを取得)r'   )r(   r!   r!   r"   get_completion_message7   s   z-ManagementStatusConfig.get_completion_messageN)r   r   r   __doc__strr)   r+   r!   r!   r!   r"   r#   !   s    
r#   c                   @   sT   e Zd Zedd Zedd Zedd Zedd Zed	d
 Zedd Z	dS )SlackMessagesc              
   C   &   d|  d| d| d| d| 
}|S )N<@   >
卒業年：   
『uC   』の、ステップが記入されていません。
学生名：u   
ステップ名：r!   )cs_idcompany_name	user_nameuser_step_originalr$   messager!   r!   r"   step_error_message>      z SlackMessages.step_error_messagec              
   C   r/   )Nr0   r1   r2   uF   』の、ステータスが記入されていません。
学生名：u   
ステータス名：r!   )r3   r4   r5   user_status_originalr$   r7   r!   r!   r"   status_error_messageI   r9   z"SlackMessages.status_error_messagec                 C   s   d| d|  d| }|S )Nu)   <@U050VK2UD1B><@U082BLHC6HJ>
卒業年：u9   
スプシAPIエラーが発生しました。
会社名:u   
エラー内容:r!   )r4   errorr$   r7   r!   r!   r"   api_error_messageT   s   zSlackMessages.api_error_messagec              
   C   r/   )Nr0   r1   uu  
下記のステップ or ステータスを更新できませんでした。

【予想される原因】
①エントリーリストに「企業名×学生名」のエントリーが見当たらない、もしく複数件見つかったため
②学生名が完全一致していないため
③求人IDが進捗管理対象シートに未入力のため

会社名：『u   』
学生名：u   
step or status：r!   )r3   r4   r5   step_statusr$   r7   r!   r!   r"   is_not_single_entry_message_   s   	
z)SlackMessages.is_not_single_entry_messagec                 C   s,   d|  d| d| d| d| d| }|S )Nr0   r1   r2   u@   』の、ステップが逆戻りしています。
学生名：u   
現在のステップ名：u"   
変更予定のステップ名：r!   )r3   r4   r5   current_step_namenew_step_namer$   r7   r!   r!   r"   step_backward_messageq   s   z#SlackMessages.step_backward_messagec                 C   s4   d|  d| d| d| d| d| d| d}|S )	Nr0   r1   r2   uF   』のステータスは変更されませんでした。
学生名：u   
現在のステータス：u"   
変更予定のステータス：u(   
理由：現在のステータスが「u   」のためr!   )r3   r4   r5   current_status_nameuser_statusr$   r7   r!   r!   r"   status_skip_message}   s   	z!SlackMessages.status_skip_messageN)
r   r   r   staticmethodr8   r;   r=   r?   rB   rE   r!   r!   r!   r"   r.   =   s    







r.   company_management_valuer4   company_job_idfront_cs_slack_idconfigpigeonr*   c                 C   s   t | dk r| d t | dk s| d }| d }| d }| d }	| d }
| d }|s-d	S zt|||
|	||||||| W d	S  tyn } z$td
| d| d| d tj|||jd}t|t	j
 W Y d	}~d	S d	}~ww )ut  
    一企業の学生データを処理し、進捗状況を更新する

    Args:
        company_management_value: シートから取得した行データ
        company_name: 企業名
        company_job_id: 企業求人ID
        front_cs_slack_id: CS担当者のSlack ID
        config: 設定オブジェクト
        pigeon: PigeonCloudインスタンス
    	       r               NuA   求人情報更新中に、エラー発生
            会社名:u   
            ユーザー名:u   
            エラー内容:z
            r$   )lenappendprocess_entry_data	Exceptionprintr.   r=   r$   r   r
   r    )rG   r4   rH   rI   rJ   rK   r6   r:   r5   	user_steprD   user_undo_texter7   r!   r!   r"   process_company_data   s>   


r\   id_valuer5   rD   rY   rZ   r:   r6   c              	   C   s  |
du rt  }
|	| |}t||||||
sdS |sdS |d d d d }d}d}g }|tjv ra|d d d d }|dv rU||krTt||||||
j}t|tj	 n|	
|}|}|d	 |tjv rwtj|||||
jd
}t|tj	 |tjv r|d d d d }|	|}|dur|dur||kr|d d d d }td| d| d| d|  t||||||
j}t|tj	 n|	|}|}|d n|	|}|}|d |tjv rtj|||||
jd
}t|tj	 |r|	j|||d ttj |r0|tjvr/|	||}|d }|dkr'|| }|	||| n"td| d n|	|}dd |d D }|D ]}|	| q@ttj td| d| dd|  dS )u!   エントリーデータの処理Ndatar   raw_dataid	view_data
field__343)r   u$   辞退企業連絡(RA→CS要対応)r   u   内定後辞退(CS専用)u   承諾後辞退(CS専用)u   再予約中r   u	   枠待ちstatusrS   field__1316
field__330u'   ステップ後戻り防止: 会社名=u   , ユーザー名=u   , 現在順序=u   , 新順序=step)rY   rD   countz[SKIP] u.   件のUNDOタスクが既に存在します。c                 S   s   g | ]}|d  d qS )r_   r`   r!   ).0itemr!   r!   r"   
<listcomp><  s    z&process_entry_data.<locals>.<listcomp>u   会社名：u   
ユーザー名：u   
更新完了: z, )r#   fetch_job_entry_datais_single_entryr
   r   r.   rE   r$   r   r    status_convert_idrU   r   r;   r   get_step_orderrX   rB   step_convert_idr8   update_entry_data_alltimesleepr   get_user_undo_taskcreate_user_undo_taskget_user_latest_undo_taskupdate_user_undo_task_statusjoin)r]   r5   rD   rY   rZ   r4   rI   r:   r6   rK   rJ   
entry_dataentry_idupdate_stepupdate_statusupdate_fieldsrC   r7   user_status_idcurrent_step_ordernew_step_orderr@   user_step_idresrecord_countuser_step_statuslatest_undo_taskslatest_undo_task_idslatest_undo_task_idr!   r!   r"   rV      s   





 





$rV   rx   user_step_or_statusc                 C   sH   | d }|dkr
dS t | d tj|||||jd}t|tj dS )u  
    エントリーデータの件数をチェックし、適切な件数(１件)かどうかを判定

    Args:
        entry_data: エントリー情報
        company_name: 企業名
        user_name: 学生名
        front_cs_slack_id: CS担当者Slack ID
        user_step_or_status: ステップまたはステータス情報
        config: 設定オブジェクト

    Returns:
        bool: 処理続行可能かどうか
    rg      Tui   名前重複、もしくは該当者なしでエントリーリストが0 or 2件以上発生しましたrS   F)rX   r.   r?   r$   r   r
   r    )rx   r4   r5   rI   r   rJ   
list_countr7   r!   r!   r"   rl   D  s   rl   c                   C   s   t jt jdt dgd dS )u   ロギングの設定を行うz4%(asctime)s - %(name)s - %(levelname)s - %(message)szapp.log)levelformathandlersN)loggingbasicConfigDEBUGFileHandlerr!   r!   r!   r"   setup_logginge  s
   

r   c                  C   sJ   t d} | stdt j| std|  tj| tj	d}t
|S )uA   Google Sheets APIクライアントのセットアップを行うPROD_SERVICE_ACCOUNT_FILEu   環境変数 'PROD_SERVICE_ACCOUNT_FILE' が設定されていません。.env.production ファイルを確認してください。uA   サービスアカウントファイルが見つかりません: )scopes)r   r   
ValueErrorpathexistsFileNotFoundErrorr   from_service_account_filer
   r   gspread	authorize)r   credsr!   r!   r"   setup_google_sheetsn  s   

r   clientc                 C   s,   t d}| |}||j}|tjS )uB   メインスプレッドシートから企業一覧を取得するSPREADSHEET_ID)r   r   open_by_key	worksheetr%   getr
   r   )r   rJ   r   sheetr   r!   r!   r"   get_company_list|  s   

r   company_valuec              
   C   s  t |dk r|d t |dk s|d }|d }|d }|d }|r%|s+td dS |s7td	| d
 dS d}z||}W n ty\ }	 ztd| d|	  W Y d}	~	nd}	~	ww zL| |}
|
|j}|d}t |t	j
 }|dt	j
 d| }|D ]}t |t	jk r|d t |t	jk sq|D ]}t|||||| qW dS  ty }	 z$d| dt|	 }t| tj||	|jd}t|t	j W Y d}	~	dS d}	~	ww )u'   個別企業のシートを処理する   rM   r   r   r   rO   uF   スキップ: 企業名またはスプレッドシートIDが未入力Nu   スキップ: u    - 求人IDが未入力u%   CS Slack ID取得エラー - 企業: u   , エラー: zA:AAz:AHu#   シート処理エラー - 企業: rS   )rT   rU   rX   fetch_cs_front_slack_idrW   r   r   r&   r   r
   r   r   r\   r-   r.   r=   r$   r   r    )r   r   rJ   rK   r4   company_spreadsheet_idrH   company_id_for_cs_slackrI   r[   sheet_managementworksheet_management
all_valueslast_rowcompany_management_valuesrowrG   	error_msgr7   r!   r!   r"   process_company_worksheet  sX   	
 


r   c           
   
   C   s>  ddl m} |d zzTt  t  t }t }t|| }|d tdt|t	j
D ])}|||t	j
  }|D ]	}t||| | q7t  |dd| d|t	j
   q*|  }t|t	j W n  ty }	 zt|	 |dd	t|	  W Y d
}	~	nd
}	~	ww W |d t  d
S W |d t  d
S |d t  w )u   
    進捗管理のメイン処理（統合版）

    Args:
        config: ManagementStatusConfig 設定オブジェクト
    r   )log_memory_usagemanagement_status_startspreadsheet_data_loadedbatch_processing_endzBatch: -r<   zGeneral Error: Nmanagement_status_end)utils.memory_loggerr   r	   r   r   r   r   rangerT   r
   r   r   gccollectr+   r   r    rW   rX   r-   )
rJ   r   r   rK   company_valuesibatchr   r'   r[   r!   r!   r"   run_management_status  s@   
 
r   )N)r*   N)!r   r   typingr   r   r   r   r   google.oauth2.service_accountr   services.pigeon_cloudr   services.my_slackr   rq   config.load_envr	   r   r
   r#   r.   r-   r\   rV   boolrl   r   r   Clientr   r   r   r   r!   r!   r!   r"   <module>   s    N
?	

 


!	"
=