o
    i                  
   @   s   d Z ddlZddlmZmZmZ ddlZddlmZ ddddd	Z	g d
Z
dedefddZdefddZdedefddZddededeeeef  fddZdedededefddZdS )u   
Goalskillsales_team.xlsx / Goalskillsales_personal.xlsx 에서 데이터 추출(export).
Excel_Parsing_Specification.md 기준. openpyxl 사용.
    N)ListDictAny)insert_sales_sheet_recordsquartermonthweekday)            )	)      )      )
      )   r
   )r   r   )      )      )      )      rowcolc                 C   sf   z(| j ||dj}|du rW dS t|ttfr&t|tr!t|W S t|W S |W S  ty2   Y dS w )uK   시트에서 셀 값 읽기. 1-based. 숫자는 그대로, None이면 None.)r   columnN)cellvalue
isinstanceintfloat	Exception)wsr   r   v r(   H/home/air/goalskill_sales/back/app/services/sales_sheet_excel_service.py_cell_value"   s   r*   returnc                 C   s4   t | dd}|du rdS dt|v pdt| v S )u5   B12 값에 'Team' 포함 여부로 팀 시트 판별.      NFTeamteam)r*   strlower)r&   b12r(   r(   r)   _is_team_sheet/   s   r3   filenamec                 C   s$   |pd  }d|v st| rdS dS )u_   파일이 팀 시트인지 개인 시트인지 한 번만 판별 → '1s'(개인) or '2s'(팀). r/   2s1s)r1   r3   )r&   r4   fn_lowerr(   r(   r)   _sheet_type_from_sheet7   s   r9   r5   file_contentc                 C   s   t jt| ddd}|j}t||}g }t D ]?\}}tt	D ]6\}\}	}
|d }t
|||	}t
|||
}|durG|d||d||d |durW|d||d||d q!q|  |S )	u   
    엑셀 바이트에서 명세대로 데이터만 추출(export). DB는 건드리지 않음.
    Returns:
        DB insert용 딕셔너리 리스트. session_id는 호출하는 쪽에서 채움(예: 요청 session_id).
    T)	read_only	data_only   Nr5   target)
session_id
sheet_typeperiod_typerecord_typecategoryr!   result)openpyxlload_workbookioBytesIOactiver9   
ROW_PERIODitems	enumerateCOLS_1BASEDr*   appendclose)r:   r4   wbr&   r@   records	excel_rowrA   category_one_index
target_col
result_colrC   
target_val
result_valr(   r(   r)   parse_sales_sheet_excel?   s>   
rX   r?   c                 C   s,   t | |}|s	dS |D ]}||d< qt|S )u   
    엑셀 업로드 → 파싱 → session_id 를 요청 세션으로 통일 → DB 저장.
    Returns:
        저장(INSERT/UPDATE)된 행 수.
    r   r?   )rX   r   )r:   r4   r?   rQ   rr(   r(   r)   save_sales_sheet_from_excele   s   


rZ   )r5   )__doc__rG   typingr   r   r   rE   app.models.sales_sheet_moduler   rJ   rM   r#   r*   boolr3   r0   r9   bytesrX   rZ   r(   r(   r(   r)   <module>   s0    $&