o
    I@h7)                     @   sX   d dl Z d dlZd dlmZmZ d dlmZ d dlmZ d dlm	Z	 G dd deZ
dS )    N)ListOptional)datetime)BaseBankStatementParser)Transactionc                   @   s   e Zd ZdZdd Zdedee fddZd"d	d
Z	dede
fddZdedefddZdedefddZdedefddZdedededefddZdede
dedededededefd d!ZdS )#TaskombankPdfParseru  
    Парсер PDF-выписок ТАСКОМБАНКА.
    1) Извлекает "наши" реквизиты (юрлицо, счёт, ИНН) из шапки первой страницы.
    2) Обрабатывает таблицу, где, условно:
       - col 0: Дата опер. (с временем)
       - col 1: Дебет
       - col 2: Кредит
       - col 3: Реквізити кореспондента
       - col 4: Призначення платежу
    3) Определяет расход/приход по заполненной колонке Дебет/Кредит.
    4) Склеивает многострочные ячейки реквизитов контрагента.
    c                 C   s"   d | _ d | _d | _d | _d | _d S N)our_company_nameour_company_innour_company_accountour_bank_nameour_bank_id)self r   2/var/www/html/app/parsers/taskombank_pdf_parser.py__init__   s
   
zTaskombankPdfParser.__init__	file_pathreturnc                 C   s  g }t |}|jr| |jd  |jD ]}| }|sq|D ]}t|dk r*q!|d }t|dk r5q!|dd  }|D ]}	t|	dk rFq=|	d pKd }
|	d pSddddd}|	d paddddd}|	d	 pod}|	d
 pud }| |
}d}|rzt	| }W n t
y   d}Y nw |rzt	|}W n t
y   d}Y nw | }ddd |D }tdd| }| |d | }| |}| |}| |||}| j|||||||d}|| q=q!qW d    |S 1 sw   Y  |S )Nr             ,.       g        c                 s   s    | ]}|  V  qd S r   )strip).0liner   r   r   	<genexpr>S   s    z,TaskombankPdfParser.parse.<locals>.<genexpr>\s+)
doc_numberop_dateamountpayment_detailscontragent_namecontragent_inncontragent_account)
pdfplumberopenpages_extract_our_company_dataextract_tableslenr   replace_parse_datefloat
ValueError
splitlinesjoinresub_extract_doc_number_extract_inn_extract_account_cleanup_name_build_transactionappend)r   r   transactionspdfpagetablestableheader	data_rowsrowdate_strZ	debit_strZ
credit_strZcorr_info_rawr%   r#   r$   linesZ	corr_infor"   r'   r(   r&   transactionr   r   r   parse    sz   



	
JJzTaskombankPdfParser.parseNc           
      C   s   |  pd}|d}|D ]I}| }td|tj}|r&d| _|d| _td|tj}|r@|d | _	|d | _
td|tj}|rV|dd	d}	|	| _qd
S )u/  
        Считываем текст шапки (первая страница) и ищем:
          - "ТОВ 'РЕВІ-НАЙТ', ЄДРПОУ 45619342"
          - "Виписка по рахунку N UA30 ..."
          - "АТ 'ТАСКОМБАНК' Київ, код ID НБУ 339500"
        r   
u;   АТ\s+"ТАСКОМБАНК".*код\s+ID\s+НБУ\s+(\d+)u   АТ "ТАСКОМБАНК"r   u*   ТОВ\s+"([^"]+)",\s*ЄДРПОУ\s+(\d+)r   u8   Виписка\s+по\s+рахунку\s+N\s+(UA[\d\s]+)r   N)extract_textsplitr   r5   search
IGNORECASEr   groupr   r	   r
   r/   r   )
r   r?   textrF   r   Zline_str
match_bankmatch_companyZ	match_accZraw_accr   r   r   r,   p   s$   
z-TaskombankPdfParser._extract_our_company_datarE   c              	   C   sF   | dd}dD ]}zt| |W   S  ty   Y qw t S )NrI   r   )z%d.%m.%Y %H:%M:%Sz%d.%m.%Y %H:%Mz%d.%m.%Y)r/   r   strptimer   r2   now)r   rE   fmtr   r   r   r0      s   zTaskombankPdfParser._parse_daterO   c                 C   s   t d|}|r|dS dS )Nu!   Номер\s+док-та:\s*(\S+)r   UNKNOWNr5   rL   rN   )r   rO   matchr   r   r   r7      s   
z'TaskombankPdfParser._extract_doc_numberc                 C   s8   t d|}|r|dS t d|}|r|dS dS )uX   
        Ищем "ЄДРПОУ: 12345678" либо 8-10 цифр подряд.
        u   ЄДРПОУ:\s*(\d+)r   z\b\d{8,10}\br   r   rV   )r   rO   rW   Zmatch_digitsr   r   r   r8      s   

z TaskombankPdfParser._extract_innc                 C   s@   t d|}|r|dddS t d|}|r|dS dS )uk   
        Ищем "Рахунок: UA..." или просто UA.., убираем пробелы.
        u   Рахунок:\s*(UA[\w\d]+)r   r   r   z\b(UA\d{2,})\b)r5   rL   rN   r/   )r   rO   rW   Zmatch_uar   r   r   r9      s   
z$TaskombankPdfParser._extract_accountinnaccountc                 C   sV   |}t dd|}|r||d}|r||d}t dd|}t dd| }|S )uf   
        Удаляем "ЄДРПОУ:...", сам inn, "Рахунок:...", сам account.
        u   ЄДРПОУ:\s*\d+r   u   Рахунок:\s*UA[\w\d]+r!   r   )r5   r6   r/   r   )r   rO   rX   rY   cleanedr   r   r   r:      s   z!TaskombankPdfParser._cleanup_namer"   r#   r$   r%   r&   r'   r(   c                 C   s   | j pd}| jp	d}	|dk r!d}
|}|	}|}|}|}| }d}n|}
|}|}d}|}|	}d}| }t|| ||
|||||| ||dS )u   
        Если amount < 0 => мы платим => payer_inn="1", recipient_inn=contragent_inn
        Если amount > 0 => нам платят => payer_inn=contragent_inn, recipient_inn="1"
        OUR_COMPANYr   r   1N)numberdater$   	payer_inn
payer_namepayer_accountrecipient_innrecipient_namerecipient_accountr%   date_incomedate_outcome)r	   r   r^   r   r   )r   r"   r#   r$   r%   r&   r'   r(   our_nameour_accountr_   r`   ra   rb   rc   rd   rf   re   r   r   r   r;      sB   

z&TaskombankPdfParser._build_transaction)r   N)__name__
__module____qualname____doc__r   strr   r   rH   r,   r   r0   r7   r8   r9   r:   r1   r;   r   r   r   r   r   	   s6    	
P		r   )r)   r5   typingr   r   r   app.parsers.base_parserr   app.models.transactionr   r   r   r   r   r   <module>   s    