o
    85i#                     @   s   d Z ddlmZmZ ddlmZmZ ddlmZ ddl	m
Z
mZmZmZmZ dedefd	d
Zdeee  deee ee f fddZdee dee fddZdee dee deeef fddZdeee  dedededede
fddZdS )u   데이터 파싱 및 변환    )DecimalInvalidOperation)AnyOptional)date   )FinancialReportPLItemMonthlyValueKPICard	ChartDatavaluereturnc                 C   s   | du s| dkrt dS t| ttfrt t| S z<t| dddddd }|dr>|dr>d	|d
d  }|dd}|dksL|d	krQt dW S t |W S  t	yb   t d Y S w )u   문자열을 Decimal로 변환N r   ,   ¥   円()-r   %)
r   
isinstanceintfloatstrreplacestrip
startswithendswithr   )r   cleaned r!   W/var/www/tkim.planitai.co.jp/gemegg/20251207-make-pdf-report/project/src/data_parser.pyparse_number   s   $

r#   datac              	      s  t | dk r
g g fS t | dkr| d ng }t | dkr | d ng }i }d}t|D ]\}}t| }|rB|dkrB|}d|i||< q*| D ]:\}}	|	d }
t|
t|
d t |D ]%}|t |k rt||  }|dkrv||| d	< q[|d
kr||| d< q[qGt| }g }tdt | D ]}| | }|rt |dk rqd d}t |dkrt|d  rt|d   d}nt |dkrt|d  rt|d   d} sqt	 fdddD }g }| D ]F\}}|
d	d}|
dd}td}td}|dkr|t |k rt|| }|dkr%|t |k r%t|| }|t|||d q|t |||d q||fS )u_  GemEgg 스프레드시트 형식에서 P/L 항목 파싱

    형식:
    - Row 3: 월 헤더 (예: ['', '', '', '', '2025-04', '', '', '', '2025-05', ...])
    - Row 4: 컬럼 헤더 (예: ['', '項目', '', '', '予算', '実績', '差異', '達成率', ...])
    - Row 5+: 데이터 행

    Returns:
        (PLItem 목록, 월 라벨 목록)
             Nr   start
   u   予算budgetu   実績actual   r   r   c                 3   s    | ]}| v V  qd S )Nr!   ).0kwZ	item_namer!   r"   	<genexpr>i   s    z4parse_pl_items_from_gemegg_format.<locals>.<genexpr>)u   計u   金額u   総r   )monthr*   r+   )namelevelis_totalmonthly_values)len	enumerater   r   itemsrangeminlistkeysanygetr   r#   appendr
   r	   )r$   Zmonth_header_rowZcolumn_header_rowZmonth_columnsZcurrent_monthicellZcell_strr1   infoZ	start_coljZcol_namemonth_labelspl_itemsZrow_idxrowr3   r4   r5   Zmonth_labelcolsZ
budget_colZ
actual_colr*   r+   r!   r/   r"   !parse_pl_items_from_gemegg_format(   s|   

rH   rE   c              	   C   s:  g }t dd | D d}|r|td|jd|jdd t dd | D d}|r=|td	|jd|j|jd
kr8dndd t dd | D d}|r^|td|jd|j|jd
krYdndd |rz|rz|jd
krz|j|j d }|td|ddd t dd | D d}|r|td|jd|j|jd
krdndd |S )u   P/L 항목에서 KPI 계산c                 s       | ]
}|j d kr|V  qdS 	   売上高Nr2   r-   itemr!   r!   r"   r0          z!calculate_kpis.<locals>.<genexpr>NrK   r   #2563eb)titler   unitZtarget_valuecolorc                 s       | ]
}d |j v r|V  qdS )u	   売上総NrL   rM   r!   r!   r"   r0      rO   u   売上総利益r   #16a34a#dc2626c                 s   rT   u   営業損益NrL   rM   r!   r!   r"   r0      rO   u   営業利益d   u   営業利益率r   z#8b5cf6)rQ   r   rR   rS   c                 s   rT   )u   経常損益NrL   rM   r!   r!   r"   r0      rO   u   経常利益z#0891b2)nextr?   r   Ztotal_actualZtotal_budget)rE   Zkpis
sales_itemZgross_profitZ	op_profitZ	op_marginZ
ord_profitr!   r!   r"   calculate_kpis   s\   			r[   rD   c              
   C   s  i }t dd | D d}t dd | D d}|rH|rHtd|ddd |jD d	d
dddd |jD d	ddddd |jD dddgdd|d< |rg }|jD ]}|jdkrat|j|j d }nd}|| qOtd|d|dddddgt| ddddgdd|d< |S ) u   차트 데이터 생성c                 s   rI   rJ   rL   rM   r!   r!   r"   r0      rO   z#build_chart_data.<locals>.<genexpr>Nc                 s   rT   rW   rL   rM   r!   r!   r"   r0      rO   u   売上高・営業利益推移u   売上高(予算)c                 S      g | ]}t |jqS r!   )r   r*   r-   vr!   r!   r"   
<listcomp>       z$build_chart_data.<locals>.<listcomp>Zbarz#93c5fd)labelr$   typerS   u   売上高(実績)c                 S   r\   r!   r   r+   r]   r!   r!   r"   r_      r`   rP   u   営業利益(実績)c                 S   r\   r!   rc   r]   r!   r!   r"   r_      r`   linerV   Zcombo)rQ   labelsZdatasetsZ
chart_typeZsales_profitr   rX   u   売上達成率推移u	   達成率rU   u   目標(100%)z#9ca3afT)ra   r$   rb   rS   ZdashedZachievement)rY   r   r5   r*   r   r+   r?   r6   )rE   rD   chartsrZ   Zprofit_itemZachievement_ratesr^   Zrater!   r!   r"   build_chart_data   sd   



rg   raw_datacompany_namefiscal_yearperiodtarget_monthc           	      C   s<   t | \}}t|}t||}t||||t ||||d	S )u4   원시 데이터에서 FinancialReport 객체 생성)	ri   rj   rk   rl   Zgenerated_atannual_kpisrE   rD   rf   )rH   r[   rg   r   r   today)	rh   ri   rj   rk   rl   rE   rD   rm   rf   r!   r!   r"   build_financial_report  s   

ro   N)__doc__Zdecimalr   r   typingr   r   datetimer   Zdata_modelsr   r	   r
   r   r   r#   r;   tupler   rH   r[   dictrg   ro   r!   r!   r!   r"   <module>   s,    	*a&=E
