o
    2fh"                     @   sx   d dl Z d dlZd dlZd dlmZ d dlmZmZmZmZ d dl	m
Z
 d dlmZ ejejdd G dd	 d	e
ZdS )
    N)datetime)ListOptionalTupleAny)BaseBankStatementParser)Transactionz&%(asctime)s %(levelname)s: %(message)s)levelformatc                       s(  e Zd ZdZedZedZedZedZ	edZ
edejZ fdd	Zd
edee fddZdeddfddZdee deeee ef  fddZdee dedee fddZdee dedee fddZededee fddZdedefdd Zd!edefd"d#Z  ZS )$MTBBankPdfParseru<   
    Парсер PDF-выписок МТБ Банка.
    u$   (?:Дата\s+)(\d{2}\.\d{2}\.\d{4})z\b\d{2}\.\d{2}\.\d{4}\bu   (?:Док\.\s*№\s*)([\S]+)u,   (?:Ід\.код|ЄДРПОУ|ІПН)\s*(\d+)z\b\d{8,10}\bu   Сума\s+([\d\s.,]+)c                    s,   t    d | _d | _d | _d | _d | _d S )N)super__init__our_bank_nameour_bank_codeour_accountour_company_nameour_company_inn)self	__class__ //var/www/html/app/parsers/mtbbank_pdf_parser.pyr      s   

zMTBBankPdfParser.__init__	file_pathreturnc                 C   s   t |+}|jsg W  d    S | |jd  dd |jD }dd |D }W d    n1 s3w   Y  tdt|  | |}g }|D ]\}}|| 	|| qKg }	t
 }
|D ]}|j|j|jf}||
vrx|	| |
| q`|	S )Nr   c                 S   s&   g | ]}|  p	d  D ]}|qqS ) )extract_text
splitlines).0ptr   r   r   
<listcomp>-   s
    z*MTBBankPdfParser.parse.<locals>.<listcomp>c                 S   s   g | ]
}|  r|  qS r   )strip)r   lnr   r   r   r    0   s    u9   Всего строк после объединения: )
pdfplumberopenpages_extract_header_dataloggingdebuglen_extract_all_sectionsextend_parse_section_as_blockssetnumberdateamountappendadd)r   r   pdf	full_textZ	all_linessectionsZall_transactionsZ	sec_linesis_debituniqseentxkr   r   r   parse&   s4   



zMTBBankPdfParser.parsepageNc                 C   s   |  pd}td| }rd| _|d| _td| }r)|ddd| _td| }r9|d | _	| j
| }rI|d| _d S d S )Nr   uG   Банк\s+ПАТ\s+"?МТБ\s+БАНК"?\s+Код\s+банку\s+(\d+)u   ПАТ "МТБ БАНК"   u'   №\s*рахунка\s*(UA\s*\d[\w\s]+) u<   №\s*рахунка\s*UA[^\n]+\s+\[*\]*\s*(ФОП\s+[^\n]+))r   researchr   groupr   replacer   r!   r   RE_INNr   )r   r<   textmr   r   r   r&   H   s   z%MTBBankPdfParser._extract_header_datalinesc                 C   s   dd t ttj|D }|s|dfgS g }t |D ]'\}\}}|d t|k r0||d  d nt|}|||d | |f q|S )Nc                 S   s2   g | ]\}}| d s| dr|| dfqS )u5   реєстр документів за дебетомu7   реєстр документів за кредитом)
startswith)r   isr   r   r   r    Y   s    z:MTBBankPdfParser._extract_all_sections.<locals>.<listcomp>Fr=   r   )	enumeratemapstrlowerr)   r1   )r   rF   idxsr5   jstartZ	is_creditendr   r   r   r*   X   s   
(z&MTBBankPdfParser._extract_all_sectionsr6   c                 C   s   g g }}|dg D ]C}|  }| |r,|r&| || }r$|| g }|| q
|drF|| | || }rC|| g }q
|rM|| q
|S )Nu   Проведений …u   проведений)rM   _line_has_sum_finalize_blockr1   rG   )r   rF   r6   resblocklinelowr9   r   r   r   r,   k   s$   






z)MTBBankPdfParser._parse_section_as_blocksblock_linesc                 C   sR  d |}td| d | j|}|std d S |ddddd	}zt|}W n ty?   td
 Y d S w | j	|pHdgd }| j
| }r\| |d}	n| j| }rm| |d}	nt }	|	pvt }	g g d}
}}|D ]1}| }d|v sd|v rd}|dr|
| q|drd}|| q|r|n|
| qd |
}d |}| | d| }|rt| nt|}t||	 ||r| jpdn||r| jpdn||r| jpdnd|r|n| jpd|r|n| jpd|rdn| jpd||rd n|	 |r|	 nd d}td|  |S )N
z
--- Finalizing block ---
z
--- End block ---uT   Не нашли цифры после «Сума» — блок пропускаемr=   r>   r   ,.uU   Сумма не преобразуется в float — блок пропускаемr   Fu   розрах заu   з реєстромTu   кореспондентu   призн. платежуOUR_COMPANY)r.   r/   r0   	payer_inn
payer_namepayer_accountrecipient_innrecipient_namerecipient_accountpayment_detailsdate_incomedate_outcomezGot transaction: )joinr'   r(   RE_SUM_INLINEr@   rA   rB   float
ValueErrorRE_DOCRE_DATE_LINE_parse_dateRE_ANY_DATEr   nowrM   rG   r1   	_find_innabsr   r/   r   r   r   )r   rX   r6   rD   Zm_sumZraw_sumr0   
doc_numberrE   Zdoc_dateZ	corr_partZpurpose_partpurposer"   rW   Zcorr_strZpurpose_str	contr_innr9   r   r   r   rS      sr   






   z MTBBankPdfParser._finalize_blockrI   c              	   C   s2   dD ]}z	t | |W   S  ty   Y qw d S )N)z%d.%m.%Yz%d.%m.%Y %H:%Mz%d.%m.%Y %H.%M.%S)r   strptimeri   )rI   fmtr   r   r   rl      s   zMTBBankPdfParser._parse_daterD   c                 C   s8   | j | }r|dS | j| }r|dS dS )Nr=   r   r   )rC   r@   rA   RE_DIGITS8_10)r   rD   rE   r   r   r   ro      s
   

zMTBBankPdfParser._find_innrV   c                 C   s   | j |}t|o|dS )uZ   
        «Сума» + ОБЯЗАТЕЛЬНО хотя бы одна цифра.
        r=   )rg   r@   boolrA   )r   rV   rE   r   r   r   rR      s   zMTBBankPdfParser._line_has_sum) __name__
__module____qualname____doc__r?   compilerk   rm   rj   rC   rv   
IGNORECASErg   r   rL   r   r   r;   r   r&   r   rw   r*   r,   r   rS   staticmethodr   rl   ro   rR   __classcell__r   r   r   r   r      s<    





"&

Hr   )r#   r?   r'   r   typingr   r   r   r   app.parsers.base_parserr   app.models.transactionr   basicConfigDEBUGr   r   r   r   r   <module>   s    