o
    I@h#                     @   s   d Z ddlZddlZddlmZ ddlmZmZ ddlZddlm	Z	 ddl
mZ eeZeej e Zeed ee edZed	Zed
ZedZedZdedefddZdedefddZG dd deZ dS )u   
PDF-парсер АБ «Укргазбанк» / форма «Обороти по рахунку»,  v2.5
Исправлены: ИНН, поступления, назначение одним полем.
    N)datetime)ListOptional)Transaction)BaseBankStatementParserz&%(asctime)s %(levelname)s: %(message)sz.^\d{2}\.\d{2}\.\d{4}(?:\s+\d{2}:\d{2}:\d{2})?$z
^UA\d{25}$z\b\d{8,10}\bz\d[\d\u00A0\u202F ]*,\d{2}z[ \u00A0\u202F]numreturnc                 C   s   t d| ddS )N ,.)_SPACESsubreplacer    r   2/var/www/html/app/parsers/ukrgasbank_pdf_parser.py_clean   s   r   c                 C   s   t t| S N)floatr   r   r   r   r   	_to_float   s   r   c                   @   st   e Zd Zdedee fddZdefddZdefd	d
Zdd Z	dd Z
edd Zdee fddZdd ZdS )UkrgasbankPdfParser	file_pathr   c           
      C   s   t d| t|}| |jd  pd W d    n1 s"w   Y  | | |}| 	|}t dt
| g t }}|D ]"}| |}|sNqD|j|jt|jf}	|	|vrf||	 || qDt dt
| |S )Nu   Старт парсинга %sr   r	   u   Найдено блоков: %du-   Уникальных транзакций: %d)loggerdebug
pdfplumberopen_init_headerpagesextract_text_normalize_rows_extract_rows_group_blockslenset_parse_blocknumberdateabsamountaddappend)
selfr   pdfrowsblocksZtxsseenblktkeyr   r   r   parse%   s&   



zUkrgasbankPdfParser.parsetxtc                    sD    fdd}|d| _ |d| _|d| _td| j | j| j d S )Nc                    s   t |  p	d dgd  S )Nr	      )researchstrip)rr4   r   r   <lambda>>       z2UkrgasbankPdfParser._init_header.<locals>.<lambda>u#   Назва\s+рахунку:\s*(.+)u#   Код\s+ЄДРПОУ:\s*(\d{8,10})z
(UA\d{25})u   Шапка: %s / %s / %s)our_company_nameour_company_innour_company_accountr   r   )r+   r4   gr   r:   r   r   =   s   


z UkrgasbankPdfParser._init_headerpathc              	   C   s   g }t |B}t|jdD ]2\}}|dddddp$|dddd}|s(q|D ]}|d	d
 |D  q*td|t| qW d    |S 1 sLw   Y  |S )Nr5   lines      )vertical_strategyhorizontal_strategyintersection_tolerancesnap_tolerancetextT)rE   rF   keep_blank_charsc                 S   s   g | ]
}|r
|  nd qS )r	   )r8   .0cr   r   r   
<listcomp>Y   r<   z5UkrgasbankPdfParser._extract_rows.<locals>.<listcomp>u#   Страница %d: +%d строк)	r   r   	enumerater   extract_tabler*   r   r   r"   )r+   rA   outr,   ppagetblrowr   r   r   r    H   s2   

z!UkrgasbankPdfParser._extract_rowsc                 C   s^   g }|D ](}t |sqt dd |D rqt dd |D rq|d dr'q|| q|S )Nc                 s   s    | ]}d |v V  qdS )u	   Стор.Nr   rK   r   r   r   	<genexpr>a   s    z6UkrgasbankPdfParser._normalize_rows.<locals>.<genexpr>c                 s   s    | ]}| d V  qdS )u   Номер документN)
startswithrK   r   r   r   rV   b       r   )u   Підсумокu   Вихідний)anyrW   r*   )r+   rawokr9   r   r   r   r   ]   s   
z#UkrgasbankPdfParser._normalize_rowsc                 C   s~   g g }}|D ])}|d r+t |d s+t|d s+|r'| |r'|| |g}q|| q|r=| |r=|| |S )Nr   )_RE_DATEmatch_RE_IBAN	_has_dater*   )r+   r-   r.   curr9   r   r   r   r!   h   s   
$

z!UkrgasbankPdfParser._group_blocksc                 C   s   t dd | D S )Nc                 s   s    | ]
}t |d  V  qdS )r   Nr\   r]   rL   r9   r   r   r   rV   x   s    z0UkrgasbankPdfParser._has_date.<locals>.<genexpr>)rY   )blockr   r   r   r_   v   s   zUkrgasbankPdfParser._has_datec                    s  |d d }t dd |D }d|v rt|dnt|d}| |\}}}|d u rLddd |D }t|}	|	sDtd| d S t	|	
 }d	}|d
  }
t dd |D d}t dd |D d}ddd |D  tdd   d}|
| jkst fdd|D rd}|r| j| j| jf}|
||f}| }|d }}n|
||f}| j| j| jf}d |}}td|rdnd|||
| t||| |d |d
 |d |d |d
 |d ||dS )Nr   c                 s   (    | ]}|D ]
}t |r|V  qqd S r   ra   rL   r9   rM   r   r   r   rV         & z3UkrgasbankPdfParser._parse_block.<locals>.<genexpr> z%d.%m.%Y %H:%M:%Sz%d.%m.%Yc                 s   s    | ]}d  |V  qdS )rg   N)joinrb   r   r   r   rV      rX   u&   Нет суммы в блоке «%s»Fr5   c                 s   rd   r   )r^   	fullmatchre   r   r   r   rV      rf   r	   c                 s   s,    | ]}|D ]}t t|r|V  qqd S r   )_RE_INNri   r   re   r   r   r   rV         * c                 s   s,    | ]}t |d kr|d  r|d  V  qdS )   N)r"   rb   r   r   r   rV      rk   z\s+)u
   платаu   абонu
   податu   еквайрингu   ком.u   списаноc                 3   s    | ]	}|   v V  qd S r   )lower)rL   wpurposer   r   rV      s    Tu   %s %s %.2f → %s (INN %s)ZDEBITZCREDITrC   )r%   r&   r(   payment_details
payer_name	payer_innpayer_accountrecipient_namerecipient_innrecipient_accountdate_outcomedate_income)nextr   strptime_find_amount_in_tablerh   _RE_NUMr7   r   warningr   groupr8   r6   r   r=   rY   r>   r?   r   r   )r+   r0   r   Z	date_celldtamtis_debitZamt_rowjoinedmrr   accinnZdebit_wordsZpayerZrecipZdoutZdinr   ro   r   r$   {   sZ   

 



z UkrgasbankPdfParser._parse_blockc                 C   s>   |D ]}dd t |D }|sq|d \}}|d|f  S dS )uN   
        Возвращает (сумма, is_debit, row_with_amount)
        c                 S   s*   g | ]\}}t |r|tt|fqS r   )r}   ri   r   r   )rL   idxrM   r   r   r   rN      s    z=UkrgasbankPdfParser._find_amount_in_table.<locals>.<listcomp>r   F)NNN)rO   )r+   r0   rU   numsr   valr   r   r   r|      s   z)UkrgasbankPdfParser._find_amount_in_tableN)__name__
__module____qualname__strr   r   r3   r   r    r   r!   staticmethodr_   r   r$   r|   r   r   r   r   r   "   s    
>r   )!__doc__loggingr6   r   typingr   r   r   app.models.transactionr   app.parsers.base_parserr   	getLoggerr   r   setLevelDEBUGStreamHandlershsetFormatter	Formatter
addHandlercompiler\   r^   rj   r}   r   r   r   r   r   r   r   r   r   r   <module>   s(   






