o
    i85i;3                     @   s   d Z ddlmZ ddlmZ ddlmZmZ ddlm	Z	m
Z
mZmZmZmZmZmZ ddlmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZmZmZ ddl m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& G dd dZ'dS )   PDF 리포트 생성기    )Path)BytesIO)A4	landscape)SimpleDocTemplate	ParagraphSpacerTable
TableStyleImage	PageBreakKeepTogether)getSampleStyleSheetParagraphStyle)mm)colors)
pdfmetrics)TTFont   )FinancialReportPLItemKPICard   )COLORS
FONT_SIZESMARGINSTABLE_STYLESformat_currencyget_font_pathc                   @   s   e Zd ZdZdedefddZdd Zdd	 Zd
d Z	dd Z
defddZdee defddZdedefddZdefddZdee defddZdefddZdefddZd S )!ReportGeneratorr   output_pathreport_datac                 C   s2   t || _|| _d| _|   t | _|   d S )Nr   )r   r!   datatotal_pages_register_fontsr   styles_setup_styles)selfr!   r"    r)   Y/var/www/tkim.planitai.co.jp/gemegg/20251207-make-pdf-report/project/src/pdf/generator.py__init__   s   
zReportGenerator.__init__c                 C   sT   zt d}|dkrttd| d| _W dS d| _W dS  ty)   d| _Y dS w )u   일본어 폰트 등록ZgothicZ	HelveticaJapaneseN)r   r   ZregisterFontr   	font_name	Exception)r(   Z	font_pathr)   r)   r*   r%   &   s   zReportGenerator._register_fontsc              
   C   s   | j td| jtd td dd | j td| jtd td d	d
d | j| j d _td | j d _td | j d _| j td| jtd td d dS )u   커스텀 스타일 설정	PageTitletitleZ	dark_gray   )namefontNamefontSize	textColor
spaceAfterSectionTitleheading1Zprimary   
   )r2   r3   r4   r5   ZspaceBeforer6   BodyTextbody	SmallTextsmall	secondary)r2   r3   r4   r5   N)	r&   addr   r-   r   r   r3   r4   r5   )r(   r)   r)   r*   r'   2   s0   
zReportGenerator._setup_stylesc                 C   s   t t| jtttd td td td d}g }||   |t	  || 
  |t	  ||   | jjrK|t	  ||   |j|| j| jd |j| _dS )u
   PDF 생성page_topZpage_bottom	page_leftZ
page_right)ZpagesizeZ	topMarginZbottomMarginZ
leftMarginZrightMargin)ZonFirstPageZonLaterPagesN)r   strr!   r   r   r   extend_create_dashboard_pageappendr   _create_summary_page_create_pl_table_pager#   charts_create_charts_pagebuild_add_header_footerpager$   )r(   docZstoryr)   r)   r*   generateQ   s*   	
zReportGenerator.generatec                 C   s   |   || jtd  |td  |td |jtd  d | j	j
 d| j	j  ||jtd  dd| j	jd d	|j  |  d
S )u   헤더/푸터 추가r>   r?   rB   rA   r9   z - zGenerated: z%Y-%m-%dz | Page N)Z	saveStateZsetFontr-   r   ZsetFillColorr   Z
drawStringr   heightr#   company_namefiscal_yearZdrawRightStringwidthgenerated_atstrftimerM   ZrestoreState)r(   ZcanvasrN   r)   r)   r*   rL   u   s   z"ReportGenerator._add_header_footerreturnc                 C   sx   g }| td| jj | jd  | jjr*| | jj}| | | tdd | td| jj | jd  |S )u   대시보드 페이지 생성u   業績見通し - r/   r   r1   u   対象期間: r=   )	rF   r   r#   target_monthr&   annual_kpis_create_kpi_cards_tabler	   period)r(   elementsZ	kpi_tabler)   r)   r*   rE      s   
z&ReportGenerator._create_dashboard_pagekpisc                 C   s   d}g }g }|D ]}|  |}|| t||kr!|| g }q|r:t||k r5|d t||k s*|| |sBtdggS t|dg| d}|tg d |S )u   KPI 카드 테이블 생성       Z	colWidths))ZVALIGNr   r   rc   ZTOP)LEFTPADDINGra   rb      )RIGHTPADDINGra   rb   re   )
TOPPADDINGra   rb   re   )BOTTOMPADDINGra   rb   re   )_create_kpi_card_contentrF   lenr
   setStyler   )r(   r\   Zcards_per_rowZrowsZcurrent_rowkpiZcard_contenttabler)   r)   r*   rY      s(   




z'ReportGenerator._create_kpi_cards_tablerl   c           	   
   C   s  t d| jtd td d}t d| jtd t|jd}t|j|gt|j	|gg}|j
r_|j
dkr_|j|j
 d }d	|d
d}t d| jtd |dkrPtd ntd d}|t||g t|dgd}|tdddtd fddddtd fddddg |S )u   개별 KPI 카드 내용 생성ZKPITitler>   r?   )r3   r4   r5   ZKPIValuer8   r   d   u   達成率: .1f%ZKPIRatetinysuccessZdanger   r`   
BACKGROUNDra   rb   Z
light_grayZBOXr   border)rd   ra   rb   r:   )rf   ra   rb   r:   )rg   ra   rb      )rh   ra   rb   rv   )r   r-   r   r   r   ZHexColorcolorr   r0   formatted_valuetarget_valuevaluerF   r
   rk   r   )	r(   rl   Ztitle_styleZvalue_styler#   rateZ	rate_textZ
rate_styleZcardr)   r)   r*   ri      sF   
	z(ReportGenerator._create_kpi_card_contentc                 C   sP   g }| td| jd  | jjr&dd | jjD }|r&| |}| | |S )u   요약 페이지 생성u	   サマリr/   c                    s&   g | ] t  fd ddD r qS )c                 3   s    | ]}| j v V  qd S )N)r2   ).0kwitemr)   r*   	<genexpr>   s    zBReportGenerator._create_summary_page.<locals>.<listcomp>.<genexpr>)u	   売上高u   売上原価u   売上総利益u   営業利益u   経常利益)any)r|   r)   r~   r*   
<listcomp>   s    z8ReportGenerator._create_summary_page.<locals>.<listcomp>)rF   r   r&   r#   pl_items_create_summary_table)r(   r[   Zsummary_itemsrm   r)   r)   r*   rG      s   

z$ReportGenerator._create_summary_pageitemsc                 C   s  g d}|g}|D ])}|j }|j}|j}|j}|jt|t|t||r*|ddndg}	||	 q	t|g dd}
|
t	ddd	t
d
 fddd	t
d fddd| jfddd	td fdddtd fddddddtd fddddgdd tdt|dD  |
S )u   요약 테이블 생성)   科目u   予算(累計)u   実績(累計)u   差異u	   達成率ro   rp   -)x   rn   rn   P   <   r`   rt   ra   rc   r   	header_bg	TEXTCOLORheader_textFONTNAMErb   FONTSIZEr>   r   r   r<   ALIGN)r   r   rb   RIGHTr   ra   )r   rc   LEFTGRID      ?ru   )rd   ra   rb   rv   )rf   ra   rb   rv   )rg   ra   rb      )rh   ra   rb   r   c                 S   s$   g | ]}d d|fd|ft d fqS )rt   r   rc   Z
alt_row_bg)r   )r|   ir)   r)   r*   r   -  s    z9ReportGenerator._create_summary_table.<locals>.<listcomp>r   )total_budgettotal_actualtotal_variancetotal_achievement_rater2   r   rF   r
   rk   r   r   r-   r   r   rangerj   )r(   r   headerr#   r   budgetactualvariancer{   rowrm   r)   r)   r*   r     sD   z%ReportGenerator._create_summary_tablec                 C   s~  g }| td| jd  | jjs| td| jd  |S | jjdd }dg| dg }|g}| jjdd	 D ]4}|jg}t|D ]\}}|t|j	k rZ| t
|j	| j qC| d
 qC| t
|j | | q9dgdgt|  dg }	t||	d}
|
tdddtd fdddtd fddd| jfdddtd fdddtd fddddddtd fdd d!d"g | |
 |S )#u   P/L 테이블 페이지 생성u   損益計算書r/   u   データがありませんr;   Nr   r   u   累計   r   rn   F   r   r`   rt   ra   r   r   r   r   r   rb   r   rq   r   r   r   r   r   ru   )rd   ra   rb   r]   )rf   ra   rb   r]   )rg   ra   rb      )rh   ra   rb   r   )rF   r   r&   r#   r   month_labelsr2   	enumeraterj   monthly_valuesr   r   r   r
   rk   r   r   r-   r   r   )r(   r[   r   r   r#   r   r   r   monthZ
col_widthsrm   r)   r)   r*   rH   3  sD   
z%ReportGenerator._create_pl_table_pagec           	      C   s   g }| td| jd  ddlm}m} | jj D ]^\}}| t|j| jd  z.|j	dkr6||}n|j	dkr@||}nW q|rXt
|dd	d
}| | | tdd W q tyy } z| td| | jd  W Y d}~qd}~ww |S )u   차트 페이지 생성u   業績分析r/   r   )create_combo_chartcreate_line_chartr7   combolinei     )rS   rP   r   r1   u   チャート生成エラー: r=   N)rF   r   r&   rI   r   r   r#   r   r0   
chart_typer   r	   r.   )	r(   r[   r   r   Z	chart_keyZ
chart_dataZ
img_bufferZimger)   r)   r*   rJ   i  s*   




(z#ReportGenerator._create_charts_pageN)__name__
__module____qualname____doc__r   r   r+   r%   r'   rO   rL   listrE   r   r
   rY   ri   rG   r   r   rH   rJ   r)   r)   r)   r*   r       s    $#--6r    N)(r   pathlibr   ior   Zreportlab.lib.pagesizesr   r   Zreportlab.platypusr   r   r	   r
   r   r   r   r   Zreportlab.lib.stylesr   r   Zreportlab.lib.unitsr   Zreportlab.libr   Zreportlab.pdfbaser   Zreportlab.pdfbase.ttfontsr   data_modelsr   r   r   r&   r   r   r   r   r   r   r    r)   r)   r)   r*   <module>   s    ( 