o
    I@h1                     @   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edZg dZ fddZde	de
e fdd	Zd ddZde
e
e	  de
e
e	  fddZde	defddZde	dee fddZ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de	de	fddZde	de	fddZ  ZS )!MonobankPdfParseru  
    Парсер PDF-выписок Монобанка (АТ "УНІВЕРСАЛ БАНК") через extract_tables().
    Ожидается, что каждая страница содержит таблицу с 9 колонками:
      [0] Дата/время операции (многострочно)
      [1] Деталі операції (многострочно)
      [2] Реквізити контрагента (многострочно)
      [3] Сумма операции (+/-)
      [4] Валюта (обычно UAH)
      [5] Сумма во «внутренней» валюте (игнор)
      [6] Курс (игнор)
      [7] Сумма комиссии (число или «—»)
      [8] Остаток после операции (можно игнорировать или использовать)

    Если строка в первой колонке пустая, считаем, что это продолжение предыдущей строки
    (для колонок [1] и [2]).
    u1   Комісія\s+банку\s+([\d\.,]+)\s*грн)z%d.%m.%Y %H:%M:%Sz%d.%m.%Y %H:%Mz%d.%m.%Yc                    s&   t    d | _d | _d | _d | _d S N)super__init__our_company_nameour_company_innour_company_accountour_bank_nameself	__class__ ,/var/www/html/app/parsers/mono_pdf_parser.pyr
      s
   

zMonobankPdfParser.__init__	file_pathreturnc           '         s  g }t |t}|jr |jd  g }t|jD ]/\}}| }|s&q|D ]!}t|dk s8t|d dk r9q(|dd  }	 |	}
||
 q(q fdd|D }t|ddD ]\}}|d 	 }|d }|d }|d prd	
d
d	}|d p|d		 }|d pd		 } |}z
t|
dd}W n ty   d}Y nw d| } |} |} |} |}|dk rd} jpd} jpd	}|}|}|} |r| nd }!d }"n|}|}|}d} jpd} jpd	} d }!|r| nd }"t||r| nd ||||||| ||"|!d}#||#_||# |dkrs |}$|$d u r+ |}$|$rs|$dkrs|d }%t|%|r@| nd t|$ d jpKd jpPd	|||d| dd |r`| nd d}& d| d|&_||& qZW d    |S 1 sw   Y  |S )Nr      	      c                    s   g | ]}  |d  r|qS )r   )_looks_like_date).0rowr   r   r   
<listcomp>A   s    z+MonobankPdfParser.parse.<locals>.<listcomp>)start           ,.g        ZMNB_1ZOUR_FOP)numberdateamount	payer_inn
payer_namepayer_accountrecipient_innrecipient_namerecipient_accountpayment_detailsdate_incomedate_outcome_COMu2   Комісія банку (из операции: ))
pdfplumberopenpages_extract_header_data	enumerateextract_tableslen_merge_rowsextendstripreplace_parse_datetimefloat
ValueError	_find_inn
_find_iban_keep_all_lines_to_single_liner   r   r(   r   Zpayment_details_one_lineappend_extract_commissionabs)'r   r   transactionspdfall_rowsZ
page_indexpage
raw_tablestable	data_rowsmergedfiltered_rowsZrow_ir   date_strZdetails_strZcontragent_str
amount_strZcurrency_strZcommission_strop_dater)   
doc_numbercontragent_innZcontragent_ibancontragent_nameZdetails_one_liner*   r+   r,   r-   r.   r/   r2   r1   main_txZ
found_commZdoc_number_commcomm_txr   r   r   parse&   s   





















   zMonobankPdfParser.parseNc                 C   s   |  pd}|dD ]2}| }td|}|r|d| _td|}|r-|d| _td|}|r=|d | _qd| _	d S )Nr    
u   ІПН:\s*(\d+)r   u8   Рух\s+коштів\s+по\s+рахунку:\s+(UA\d+)u   Клієнт:\s+(.+)u"   АТ "УНІВЕРСАЛ БАНК")
extract_textsplitr>   researchgroupr   r   r   r   )r   rM   textlineZm_innZm_accZm_clientr   r   r   r8      s   
z&MonobankPdfParser._extract_header_datarP   c                 C   s   g }d }|D ]i}|dgdt |   }|d  }|rO| |r.|r'|| |d d  }q|rHdD ]}||  }|rF||  d| 7  < q2q|d d  }q|ridD ]}||  }|rg||  d| 7  < qSq|d d  }q|rw|| |S )Nr    r   r   )r   r   r\   )r;   r>   r   rG   )r   rP   rQ   currentr   	first_colcolpartr   r   r   r<      s:   


zMonobankPdfParser._merge_rowsrb   c              	   C   s>   |  }| jD ]}z
t|| W  dS  ty   Y qw dS )NTFr>   DATETIME_FORMATSr   strptimerB   )r   rb   fmtr   r   r   r      s   
z"MonobankPdfParser._looks_like_daterS   c              	   C   s<   |  }| jD ]}z	t||W   S  ty   Y qw d S r   rh   )r   rS   rk   r   r   r   r@      s   
z!MonobankPdfParser._parse_datetimec                 C   sF   | j |}|r!|ddd}zt|W S  ty    Y d S w d S )Nr   r$   r%   )RE_COMMISSIONr`   ra   r?   rA   rB   )r   rb   matchval_strr   r   r   rH      s   
z%MonobankPdfParser._extract_commissionc                 C   s8   t d|}|r|dS t d|}|r|dS dS )Nu   ЄДРПОУ:\s*(\d+)r   z\b\d{8,10}\br   r    )r_   r`   ra   )r   rb   mm2r   r   r   rC     s   

zMonobankPdfParser._find_innc                 C   s&   t d|}|r|dddS dS )Nz(UA\d{2}\s*\d+)r   r!   r    )r_   r`   ra   r?   )r   rb   ro   r   r   r   rD     s   zMonobankPdfParser._find_ibanc                 C   s   |  S r   )r>   r   rb   r   r   r   rE     s   z!MonobankPdfParser._keep_all_linesc                 C   s   d | S )u   
        Преобразует многострочный текст в одну строку,
        удаляя переводы строк и лишние пробелы.
        r!   )joinr^   rq   r   r   r   rF     s   z!MonobankPdfParser._to_single_line)r   N)__name__
__module____qualname____doc__r_   compilerl   ri   r
   strr   r   r[   r8   r<   boolr   r   r   r@   rA   rH   rC   rD   rE   rF   __classcell__r   r   r   r   r   
   s     
 
	"(
	
	r   )r5   r_   typingr   r   r   app.parsers.base_parserr   app.models.transactionr   r   r   r   r   r   <module>   s    