a
    'gS                     @   sX  d dl Z d dlZd dlmZmZ d dlZd dlZd dlZd dlZd dlm	Z	 e	
  dd Ze ZdZdZdZdZd	Zd
ZdddddZddddddeddeddeddeddeddeddeddeddd
Zdd ZdGddZdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Z d+d, Z!d-d. Z"d/d0 Z#d1d2 Z$d3d4 Z%d5d6 Z&d7d8 Z'd9d: Z(d;d< Z)e*d=krTzze+d> e,d? e-d@. Z/e/0 re/Z1n6ee/Z2e2re+dAe2  e2Z1ne3dB e4d ee1 e+dC W nF e5yR Z6 z,ej3dDe7e6 dEdF e4d W Y dZ6[6n
dZ6[60 0 dS )H    N)datetime	timedelta)Configc                  C   s   t jtjd} tj| dd}|tj t	d}|
| t }|tj t	d}|
| t }|tj || || |S )zKonfiguruje system logowaniazsec_downloader.logutf-8encodingz)%(asctime)s - %(levelname)s - %(message)sz%(levelname)s: %(message)s)ospathjoinr   ZLOGS_DIRloggingZFileHandlerZsetLevelDEBUGZ	FormatterZsetFormatterZStreamHandlerINFOZ	getLoggerZ
addHandler)Zlog_fileZfile_handlerZfile_formatterZconsole_handlerZconsole_formatterlogger r   2/var/www/html/inwestownie/raporty/src/getreport.pysetup_logging   s    





r         2   
            )4SC 13GS-3424B5      )	max_countperiod_months
10-K10-Q8-KDEF 14Ar   r   zSC 13G/Ar   zS-3ASRr   c           	   
   C   s(  | rt | tstd d S t| dkr2td d S td|  d d}ddd	d
}ztj||d}|jdkr|jd}|D ]>}|	 r||	 d\}}|
 | 
 kr||d  W S q|td|   W d S td|j  W d S W n: ty" } z tdt|  W Y d }~d S d }~0 0 d S )Nu   Błędny format tickerar   u   Ticker jest zbyt długiz"
=== Wyszukiwanie CIK dla tickera  ===z&https://www.sec.gov/include/ticker.txtz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36z
text/plainwww.sec.gov
User-AgentAcceptHostheaders   
	r   zNie znaleziono CIK dla tickera u)   Błąd podczas wyszukiwania CIK. Status: u!   Błąd podczas wyszukiwania CIK: )
isinstancestrprintlenrequestsgetstatus_codetextsplitstriplowerzfill	Exception)	tickerZ
search_urlr-   responseZticker_datalinetciker   r   r   get_cik_from_tickerJ   s8    

rD      c                 C   s   t |D ]}ztj| |d}|jdkrX|d | d }td| d t| W qn6|jdkrl|W   S td|j d	|   t| W q t	y } zJtd
|d  d| dt
|  ||d kr|t| W Y d}~qd}~0 0 qdS )u}  
    Pobiera dane z URL z obsługą ponownych prób i limitów API.
    
    Args:
        url (str): URL do pobrania
        headers (dict): Nagłówki HTTP
        max_retries (int): Maksymalna liczba prób
        delay (int): Podstawowe opóźnienie między próbami (w sekundach)
    
    Returns:
        Response: Obiekt odpowiedzi requests lub None w przypadku błędu
    r,   i  r   r   z Rate limit przekroczony. Czekam z
 sekund...r.   u   Błąd HTTP z
 dla URL: u   Próba /u    nie powiodła się: N)ranger5   r6   r7   r   Zwarningtimesleeperrorr=   r2   )urlr-   Zmax_retriesZdelayZattemptr?   Z	wait_timerC   r   r   r   download_with_retryp   s$    



$"rL   c                 C   s$   | d| d| d}t j| |S )u  
    Generuje standardową ścieżkę pliku dla raportu.
    
    Args:
        save_dir (str): Katalog docelowy
        date (str): Data raportu
        form (str): Typ formularza
        accession (str): Numer akcesyjny
    
    Returns:
        str: Pełna ścieżka do pliku
    _.txt)r   r	   r
   )save_dirdateform	accession	file_namer   r   r   get_file_path   s    rT   c                 C   s2   t | |||}tj|}|r.td|  |S )u1  
    Sprawdza czy raport istnieje w katalogu.
    
    Args:
        save_dir (str): Katalog do sprawdzenia
        date (str): Data raportu
        form (str): Typ formularza
        accession (str): Numer akcesyjny
    
    Returns:
        bool: True jeśli plik istnieje, False w przeciwnym razie
    u   Znaleziono istniejący plik: )rT   r   r	   isfiler   info)rO   rP   rQ   rR   	file_pathexistsr   r   r   check_if_report_exists   s
    rY   c                 C   sl   t j| sdS d}t | D ]H}|ds.qz&|dd }|du sN||krR|}W q   Y qY q0 q|S )u   
    Znajduje datę najnowszego pobranego raportu.
    
    Args:
        save_dir (str): Katalog z raportami
    
    Returns:
        str: Data najnowszego raportu w formacie YYYY-MM-DD lub None jeśli brak raportów
    NrN   rM   r   )r   r	   rX   listdirendswithr9   )rO   Zlatest_datefilenameZ	file_dater   r   r   get_latest_report_date   s    

r]   c              
   C   s  t d|  d t| }tj|dd t|}|rFt d|  t| d}ddd	d
d}d| d}z6t	||}|st 
d W dS | }|di di }dddddd}	tt|dg |dg |dg D ]\}
\}}}t|||	s|	d  d7  < q|rJ||krJt d| d|  |	d  d7  < qt||||||d}|r|	d  d7  < t||	 n|	d  d7  < td qt|	 W n: ty } z t 
dt|  W Y d}~n
d}~0 0 dS ) z5
    Pobiera raporty finansowe dla podanego CIK.
    u+   === Rozpoczynam wyszukiwanie raportów dla r&   T)exist_okz!Najnowszy lokalny raport z daty: r   zIndividual kwaq@example.comzapplication/jsonzgzip, deflatezdata.sec.gov)r)   r*   zAccept-Encodingr+   z$https://data.sec.gov/submissions/CIKz.jsonu)   Nie udało się pobrać listy dokumentówNZfilingsZrecentr   )
downloadedskippederrorsform_8k_countproxy_countrQ   Z
filingDateZaccessionNumberr`   r   zPomijam starszy raport  z )rB   rQ   rP   rR   rO   r-   r_   ra   g      ?u"   Błąd podczas pobierania danych: )r   rV   r   get_company_dirr   makedirsr]   r2   r<   rL   rJ   jsonr6   	enumeratezipshould_download_reportdebugdownload_single_reportupdate_form_statsrH   rI   log_download_summaryr=   )rB   rO   Zlatest_local_dateZ
padded_cikr-   Zsubmissions_urlr?   dataZrecent_filingsstatsidxrQ   rP   rR   ZsuccessrC   r   r   r   download_financial_reports   sl    


	


	rr   c              
   C   s  zRt |d}t  ttd d }||k rPtd|  d| dt d W dS W n: ty } z"td	t	|  W Y d
}~dS d
}~0 0 | dkr|d t
krtd|  dt
  dS | dkr|d tkrtd|  dt  dS | dvr
td|  d dS dS )u   
    Sprawdza czy należy pobrać raport danego typu.
    
    Args:
        form (str): Typ formularza
        date (str): Data raportu w formacie YYYY-MM-DD
        stats (dict): Statystyki pobrań
    z%Y-%m-%dim  dayszPomijam raport rd   u    - starszy niż z lataFu!   Błąd podczas sprawdzania daty: Nr$   rb   u    - osiągnięto limit r%   rc   )r"   r#   r$   r%   u    - nieobsługiwany typT)r   strptimenowr   MAX_REPORT_AGE_YEARSr   rk   r=   rJ   r2   MAX_8K_REPORTSMAX_PROXY_REPORTS)rQ   rP   rp   report_datecutoff_daterC   r   r   r   rj   #  s&    


rj   c              
   C   s   z| dd}dt|  d| d| d}|d ddd	}t||}	|	sNW d
S t||||}
t|
d}||	j W d   n1 s0    Y  td|
  W dS  t	y } z"t
dt|  W Y d}~d
S d}~0 0 dS )z;
    Pobiera pojedynczy raport i zapisuje go do pliku.
    - z(https://www.sec.gov/Archives/edgar/data/rF   rN   r)   z/text/html,application/xhtml+xml,application/xmlr'   r(   FwbNzPobrano i zapisano: Tu%   Błąd podczas pobierania dokumentu: )replaceintrL   rT   openwritecontentr   rV   r=   rJ   r2   )rB   rQ   rP   rR   rO   r-   Zaccession_noZdoc_urlZdoc_headersr?   rW   frC   r   r   r   rl   E  s$    
*rl   c                 C   s6   | dkr|d  d7  < n| dkr2|d  d7  < dS )z6
    Aktualizuje statystyki pobranych formularzy.
    r$   rb   r   r%   rc   Nr   )rQ   rp   r   r   r   rm   b  s    rm   c                 C   sr   t d t d| d   t d| d   t d| d   t d| d	   t d
| d   dS )u2   
    Loguje podsumowanie pobranych raportów.
     
=== Podsumowanie pobierania ===u   Pobrano nowych raportów: r_   u   Pominięto istniejących: r`   u   Błędy pobierania: ra   u   Pobrano raportów 8-K: rb   zPobrano proxy statements: rc   N)r   rV   )rp   r   r   r   rn   k  s    
rn   c           
   
      s  z@| j ddd}d|v rd|v r|dd }|dd }g }| D ]( t fdd	d
D rJ|   qJd|d | }tjdd|tj	tj
B d}tjdd|tj	d}tjdd|tj	d}tjdd|tj	d}tjdd|tj	tj
B d}tjdd|tj	d}tjdd|tj	d}tjdd|tj	d}tjdd|tj	d}tdd|}d|v rd|v r||d|d }td|}|td| |dd d  d| d! |dd  }td"d#|}td$d|}dd%d	 | D }g d&}|D ]0}d'| }tj|d(|  d)|tj	d}q|W S  ty~ }	 z"td*t|	  W Y d+}	~	d+S d+}	~	0 0 d+S ),u   
    Czyści plik SEC zachowując istotne dane i strukturę dokumentu.
    
    Args:
        file_content (bytes): Zawartość pliku w formacie bajtowym
    
    Returns:
        str: Oczyszczona zawartość dokumentu
    r   ignore)ra   z<SEC-HEADER>z</SEC-HEADER>r   r   c                 3   s   | ]}| v V  qd S Nr   ).0keyr@   r   r   	<genexpr>      z!clean_sec_file.<locals>.<genexpr>)zCOMPANY CONFORMED NAME:zFILED AS OF DATE:zTYPE:zFISCAL YEAR END:r/   z

z
<TABLE.*?>z

[TABELA]
)flagsz</TABLE>z
[KONIEC TABELI]
z<(CAPTION|THEAD|TBODY|TR).*?>z</(CAPTION|THEAD|TBODY|TR)>z<T[HD].*?>(.*?)</T[HD]>z\1\tz<p.*?>z<br.*?>z<div.*?>z</div>z<[^>]+> z<XBRL>z</XBRL>z)<ix:nonNumeric[^>]*>(.*?)</ix:nonNumeric>z+<ix:nonFraction[^>]*>(.*?)</ix:nonFraction>z

[DANE XBRL]
z
[KONIEC DANYCH XBRL]
zItem\s+(\d+[A-Za-z]?\.)z\n\nITEM \1z\n{3,}c                 s   s   | ]}|  V  qd S r   )rstripr   r@   r   r   r   r     r   )BusinessRisk FactorsManagement DiscussionFinancial StatementszItem.*z

=== z ===

u"   Błąd podczas czyszczenia pliku: N)decoder9   
splitlinesanyappendr:   r
   resub
IGNORECASEDOTALLfindfindallextendupperr=   r   rJ   r2   )
Zfile_contentr   headermetadataZ	xbrl_dataZxbrl_valuessectionsZsectionpatternrC   r   r   r   clean_sec_filev  sH    
.
$r   c              
   C   s   zZ| dd}t|ddd}||  W d   n1 s<0    Y  td|  W dS  ty } z"td	t|  W Y d}~d
S d}~0 0 dS )u&   Zapisuje oczyszczoną treść raportu.z.htmrN   wr   r   Nu!   ✓ Zapisano oczyszczony raport: Tu/   ✗ Błąd podczas zapisu oczyszczonego pliku: F)r   r   r   r   rV   r=   rJ   r2   )r   rW   Zclean_file_pathr   rC   r   r   r   save_report  s    (r   c                 C   s~   t | ddd}| }W d   n1 s,0    Y  ddd |dD }d| }td	d
|}tdd
|}|S )z/Przygotowuje tekst raportu do analizy przez AI.rr   r   Nr/   c                 s   s   | ]}|  r|V  qd S r   )r:   r   r   r   r   r     r   z$preprocess_report.<locals>.<genexpr>r   z\[.*?\]r}   z\(.*?\))r   readr
   r9   r   r   )rW   r   r8   r   r   r   preprocess_report  s    &r   c                 C   s   t dd| S )Nz[<>:"/\\|?*]rM   )r   r   )r\   r   r   r   clean_filename  s    r   c                 C   sf   ddddd}|   D ]J}d|v r,d|d< qd|v r>d|d< qd|v rPd|d	< qd
|v rd|d< q|S )u$   Wyodrębnia główne sekcje raportu.r}   )r   r   r   r   zItem 7. ManagementZActiver   zItem 8. Financialr   zItem 1A. Risk Factorsr   zItem 1. Businessr   )r   )r   r   r@   r   r   r   extract_sections  s    



r   c                 C   s6   t |sdS t| d }t t|d d }| |kS )u8   Sprawdza czy raport mieści się w zdefiniowanym okresieFr       rs   )is_report_supportedSUPPORTED_REPORTSr   rv   r   )rz   report_typeZmonthsr{   r   r   r   is_report_in_period  s
    r   c                 C   s   t | sdS t|  d S )u*   Zwraca limit ilości raportów danego typur   r   )r   r   r   r   r   r   get_report_count_limit  s    r   c                 C   s,   d|  }|j }t|}tj|t||S )u*   Tworzy strukturę katalogów dla raportówz
./reports/)yearget_report_categoryr   r	   r
   r2   )rB   r   rz   base_dirr   Zreport_categoryr   r   r   get_report_directory  s    
r   c                 C   s&   ddddddddddd
}| | d	S )
zKategoryzuje raportyZannualZ	quarterlyZcurrentproxyZinsiderZ	ownershipZ
securitiesr!   other)r6   )r   Z
categoriesr   r   r   r     s    r   c                 C   s   | t v S )u/   Sprawdza czy dany typ raportu jest obsługiwany)r   r   r   r   r   r   %  s    r   c                 C   s>   t d |  D ]&\}}|dkrt d| d|  qdS )u%   Loguje statystyki pobranych raportówr   r   u   Pobrano raportów z: N)r   rV   items)Zreport_countsr   countr   r   r   log_download_statistics)  s    
r   __main__z#=== SEC EDGAR Report Downloader ===u:   
Możesz podać ticker (np. AAPL) lub CIK (np. 0000320193)z
Podaj ticker lub CIK: zZnaleziono CIK: u-   Nie można kontynuować bez prawidłowego CIKu    Zakończono pobieranie raportówu   Wystąpił błąd: T)exc_info)rE   r   )8r5   r   r   r   rH   rg   r   r   configr   Zensure_dirsr   r   rx   ry   rw   ZMAX_FORM4_REPORTSZMAX_SC13G_REPORTSZMAX_SECURITIES_REPORTSZREPORT_PERIODSr   rD   rL   rT   rY   r]   rr   rj   rl   rm   rn   r   r   r   r   r   r   r   r   r   r   r   __name__rV   r3   inputr:   Z
user_inputisdigitr>   rB   rJ   exitr=   rC   r2   r   r   r   r   <module>   s   
&
!U"	O	



