
    |xj"                    B   d dl mZ d dlZd dlZd dlmZ d dlmZmZ d dl	m
Z
 d dlmZ d dlmZ dd	lmZ  ed
           G d d                      Z ed
           G d d                      Zd,dZd-dZd.dZd/dZd0d!Zd1d$Zd2d&Zd3d'Zd3d(Zd3d)Zd4d+ZdS )5    )annotationsN)Counter)	dataclassfield)Path)Iterable)ElementTree   )normalize_nameT)frozenc                      e Zd ZU ded<   ded<   ded<   ded<   ded<   dZded	<   d
Zded<   d
Zded<   dZded<   dZded<   dZ	ded<   dZ
ded<    ee          Zded<   edd            ZdS )ParsedBrokerRowstrsource_platformsource_file_typesource_row_refsource_labeldetected_asset_classN
str | Nonedetected_currencyFbooldetected_quantity_presentdetected_market_value_presentaccount_labelisintickerexchangedefault_factorytuple[str, ...]quality_flagsreturnc                *    t          | j                  S N)r   r   selfs    ,src/jarvis_finance/imports/broker_parsers.pynormalized_namezParsedBrokerRow.normalized_name   s    d/000    )r"   r   )__name__
__module____qualname____annotations__r   r   r   r   r   r   r   r   tupler!   propertyr(    r)   r'   r   r      s        $(((((&+++++*/!//// $M$$$$DFH%*U5%A%A%AMAAAA1 1 1 X1 1 1r)   r   c                      e Zd ZU ded<   ded<   ded<   ded<   ded	<   ded
<   ded<    ee          Zded<    ee          Zded<   edd            Z	edd            Z
edd            ZdS )ParsedBrokerFiler   r   r   int
rows_totalztuple[ParsedBrokerRow, ...]
candidatesr   detected_snapshot_datesnapshot_date_statusr    detected_sectionsr   warningserrorsr"   c                >    t          d | j        D                       S )Nc              3  ,   K   | ]}|j         d v dV  dS )>   etfotherequityr
   Nr   .0rs     r'   	<genexpr>z7ParsedBrokerFile.candidate_positions.<locals>.<genexpr>1   s0      ff1GKe1e1e11e1e1e1effr)   sumr5   r%   s    r'   candidate_positionsz$ParsedBrokerFile.candidate_positions/   s!    ffdoffffffr)   c                >    t          d | j        D                       S )Nc              3  0   K   | ]}|j         d k    dV  dS )cashr
   Nr@   rA   s     r'   rD   z7ParsedBrokerFile.candidate_cash_rows.<locals>.<genexpr>5   s/      RR1G61Q1Q11Q1Q1Q1QRRr)   rE   r%   s    r'   candidate_cash_rowsz$ParsedBrokerFile.candidate_cash_rows3   s!    RRdoRRRRRRr)   dict[str, int]c                X    t          t          d | j        D                                 S )Nc              3  .   K   | ]}|j         D ]}|V  d S r$   r!   )rB   rowflags      r'   rD   z9ParsedBrokerFile.quality_flags_summary.<locals>.<genexpr>9   s2      ZZSHYZZDZZZZZZZr)   )dictr   r5   r%   s    r'   quality_flags_summaryz&ParsedBrokerFile.quality_flags_summary7   s)    GZZDOZZZZZ[[[r)   N)r"   r3   )r"   rL   )r*   r+   r,   r-   r   r.   r9   r:   r/   rG   rK   rS   r0   r)   r'   r2   r2   #   s        OOO++++&&&&&&&& %e < < <H<<<<#eE:::F::::g g g Xg S S S XS \ \ \ X\ \ \r)   r2   cell
ET.Elementr"   r   c                    d |                                  D             }d                    d |D                                                       S )Nc                j    g | ]0}|j                             d           s|j         dk    '|j        pd1S )}tt )tagendswithtextrB   rY   s     r'   
<listcomp>z_cell_text.<locals>.<listcomp>=   s9    WWWa!%..2F2FW!%SV,,QV\r,,,r)    c              3  j   K   | ].}||                                 |                                 V  /d S r$   )striprB   xs     r'   rD   z_cell_text.<locals>.<genexpr>>   s<      @@!@aggii@AGGII@@@@@@r)   )iterjoinrb   )rT   textss     r'   
_cell_textrh   <   sJ    WW499;;WWWE88@@u@@@@@FFHHHr)   pathr   list[list[list[str]]]c                   t          j        |           5 }|                    d          }d d d            n# 1 swxY w Y   t          j        |          }g }d |                                D             D ]I}g }d |D             D ]!}|                    d |D                        "|r|                    |           J|S )Nzword/document.xmlc                F    g | ]}|j                             d           |S )z}tblr[   r\   rB   es     r'   r_   z _docx_tables.<locals>.<listcomp>F   +    AAAa!%..*@*@AAAAr)   c                F    g | ]}|j                             d           |S )z}trrm   rn   s     r'   r_   z _docx_tables.<locals>.<listcomp>H   s+    ;;;QU^^E%:%:;1;;;r)   c                `    g | ]+}|j                             d           t          |          ,S )z}tc)r[   r\   rh   )rB   tcs     r'   r_   z _docx_tables.<locals>.<listcomp>I   s1    OOOB8N8NOBOOOr)   )zipfileZipFilereadET
fromstringre   append)ri   zfxmlroottablestblrowstrs           r'   _docx_tablesr   A   s   			 +"gg)**+ + + + + + + + + + + + + + +=D$&FAA499;;AAA     ";;c;;; 	Q 	QBKKOO"OOOPPPP 	 MM$Ms   7;;list[list[str]]c           	     *   t          j        |           5 }g }d|                                v rt          j        |                    d                    }|                                D ]r}|j                            d          rV|	                    d
                    d |                                D                                                                  st          d |                                D                       }t          j        |                    |                    }d d d            n# 1 swxY w Y   g }d |                                D             D ]}g }	d |D             D ]x}
t          d |
D             d           }||j        |j        nd	}|
j                            d
          dk    r|r|t!          |                   }|		                    |           yt#          |	          r|	                    |	           |S )Nzxl/sharedStrings.xmlz}sir`   c              3     K   | ]9}|j                             d           |j        pd                                V  :dS )rX   rZ   N)r[   r\   r]   rb   r^   s     r'   rD   z_xlsx_rows.<locals>.<genexpr>V   sL      *m*maXYX]XfXfgkXlXl*mAFLb+?+?+A+A*m*m*m*m*m*mr)   c              3  n   K   | ]0}|                     d           |                    d          ,|V  1dS )zxl/worksheets/sheetz.xmlN)
startswithr\   )rB   ns     r'   rD   z_xlsx_rows.<locals>.<genexpr>W   sI      qqallCX6Y6Yq^_^h^hio^p^pq!qqqqqqr)   c                F    g | ]}|j                             d           |S )z}rowrm   rn   s     r'   r_   z_xlsx_rows.<locals>.<listcomp>Z   rp   r)   c                F    g | ]}|j                             d           |S )z}crm   rn   s     r'   r_   z_xlsx_rows.<locals>.<listcomp>\   s+    999AENN4$8$89!999r)   c              3  N   K   | ] }|j                             d           |V  !dS )z}vNrm   rc   s     r'   rD   z_xlsx_rows.<locals>.<genexpr>]   s5      ;;AaennT&:&:;a;;;;;;r)   rZ   rY   s)rt   ru   namelistrw   rx   rv   re   r[   r\   ry   rf   rb   nextr]   attribgetr3   any)ri   rz   sharedsssi
sheet_namer|   r   rP   valscvvalues                r'   
_xlsx_rowsr   O   s4   			 2"!R[[]]22rww'=>>??Bggii w w6??5)) wMM#((*m*m27799*m*m*m"m"m"s"s"u"uvvvqqR[[]]qqqqq
}RWWZ00112 2 2 2 2 2 2 2 2 2 2 2 2 2 2 DAA499;;AAA 	 	99S999 	 	A;;;;;TBBAm0BAFFEx||C  C''E's5zz*KKt99 	KKKs   DD::D>D>rg   Iterable[str]tuple[str | None, str]c                    d                     |           }t          j        d|          }|sdS |                    d          dfS )Nr`   z'(\d{2}\.\d{2}\.\d{4}|\d{4}-\d{2}-\d{2}))Nmissingr
   clear)rf   researchgroup)rg   joinedms      r'   _date_statusr   g   sE    XXe__F
	<fEEA 771::wr)   cellsr   c                n    d                     |                                           }dD ]
}||v r|c S d S )Nr`   )CHFUSDEURGBP)rf   upper)r   r]   curs      r'   	_currencyr   o   sH    88E??  ""D+  $;;JJJ 4r)   	list[str]r   c                    d                     |                                           t          fddD                       S )Nr`   c              3      K   | ]}|v V  	d S r$   r0   )rB   kr]   s     r'   rD   z_is_cash.<locals>.<genexpr>y   s'      ``QqDy``````r)   )rJ   kontou   liquidität
barbestandprivatkontorf   lowerr   )r   r]   s    @r'   _is_cashr   w   sB    88E??  ""D````"_``````r)   markersc                    d                     |                                           t          fd|D                       S )Nr`   c              3      K   | ]}|v V  	d S r$   r0   )rB   r   r]   s     r'   rD   z%_has_amount_marker.<locals>.<genexpr>~   s'      **QqDy******r)   r   )r   r   r]   s     @r'   _has_amount_markerr   |   sA    88E??  ""D****'******r)   c                B   t          |           }d |D             }t          |          \  }}g }t          |d          D ]p\  }}t          |r
|dd          ng d          D ]K\  }}	|	r|	d                                         nd}
|
r|
                                dv r=t          |	          }t          |	          }dg}|r|                    d	           d
}n]d|
                                v sd|
                                v rdnd}|g dz  }t          |	dd          r|                    d           |                    t          ddd| d| |
||t          |	ddd          t          |	dd          dt          t                              |                    
  
                   Mrt          ddt          d |D                       t          |          ||t          d t          dt!          |          dz             D                                 S )Nc                &    g | ]}|D ]	}|D ]}|
S r0   r0   rB   tablerP   rT   s       r'   r_   z*parse_postfinance_docx.<locals>.<listcomp>   2    FFFUFF#FF$DFFFFFr)   r
   start   r   rZ   >   nameproduktneeds_manual_reviewsnapshot_onlyrJ   r=   fundr?   )missing_isinmissing_tickerr   cost_basis_uncertain	marktwertzmarket valuemarket_value_legacyPostFinancedocxr   :rowmengequantityu   stückzPostFinance DepotrO   c              3  4   K   | ]}t          |          V  d S r$   lenr^   s     r'   rD   z)parse_postfinance_docx.<locals>.<genexpr>   (      6N6N!s1vv6N6N6N6N6N6Nr)   c              3      K   | ]	}d | V  
dS table_Nr0   rB   is     r'   rD   z)parse_postfinance_docx.<locals>.<genexpr>   a        wf  wf  IJ  xD  AB  xD  xD  wf  wf  wf  wf  wf  wfr)   )r   r   	enumeraterb   r   r   r   ry   r   r   r.   rR   fromkeysr2   rF   ranger   ri   r}   flatdatestatusr5   tir   rir   labelr   is_cashflagsassets                  r'   parse_postfinance_docxr      s,   $FFFfFFFD%%LD&(*JvQ/// a a	E"#=5992QGGG 	a 	aIB(-5E!HNN$$$2E EKKMM-@@@E""CuooG*+E 8_---!&%++--!7!76U[[]];R;RX`dddd%e[.II 8LL!6777omVEYREYEYUWEYEY[`bgil  oA  BG  IP  R\  ^f  og  og  i{  |A  CN  P^  i_  i_  at  DI  JN  JW  JW  X]  J^  J^  D_  D_  `  `  `  a  a  a  a	a  M636N6Nv6N6N6N3N3NPUV`PaPacgioqv  wf  wf  NS  TU  WZ  [a  Wb  Wb  cd  Wd  Ne  Ne  wf  wf  wf  rf  rf  g  g  gr)   c                ~   t          |           }d |D             }t          |          \  }}g }t          |d          D ]\  }}t          |r
|dd          ng d          D ]\  }}	|	r|	d                                         nd}
|
s&t	          |	          }t          |	          }ddg}|rd	nd
}|s|g dz  }|r|dk    r|                    d           |                    t          ddd| d| |
||t          |	ddd          t          |	dd          dt          t                              |                    
  
                   t          ddt          d |D                       t          |          ||t          d t          dt          |          dz             D                                 S )Nc                &    g | ]}|D ]	}|D ]}|
S r0   r0   r   s       r'   r_   z*parse_true_wealth_docx.<locals>.<listcomp>   r   r)   r
   r   r   r   rZ   r   r   rJ   r=   )r   r   r   r   
missing_fxzTrue Wealthr   r   r   anteiler   r   wertr   zTrue Wealth PortfoliorO   c              3  4   K   | ]}t          |          V  d S r$   r   r^   s     r'   rD   z)parse_true_wealth_docx.<locals>.<genexpr>   r   r)   c              3      K   | ]	}d | V  
dS r   r0   r   s     r'   rD   z)parse_true_wealth_docx.<locals>.<genexpr>   r   r)   )r   r   r   rb   r   r   ry   r   r   r.   rR   r   r2   rF   r   r   r   s                  r'   parse_true_wealth_docxr      s   $FFFfFFFD%%LD&(*JvQ/// Z Z	E"#=5992QGGG 	Z 	ZIB(-5E!HNN$$$2E E""CuooG*O<E%0FF5E TSSSS +se||\***omVEYREYEYUWEYEY[`bgil  oA  BG  IR  T^  `g  oh  oh  j|  }B  DJ  LS  jT  jT  Vm  }B  CG  CP  CP  QV  CW  CW  }X  }X  Y  Y  Y  Z  Z  Z  Z	Z M636N6Nv6N6N6N3N3NPUV`PaPacgioqv  wf  wf  NS  TU  WZ  [a  Wb  Wb  cd  Wd  Ne  Ne  wf  wf  wf  rf  rf  g  g  gr)   c                t   t          |           }t          d |D                       \  }}g }t          |r
|dd          ng d          D ]\  }}|r|d                                         nd}|s&t	          |          }t          |          }	dg}
|	r	|
dgz  }
d	}n	|
d
dgz  }
d}|                    t          ddd| |||dt          |ddd          dt          t                              |
                    
  
                   t          ddt          |          t          |          ||d          S )Nc              3  $   K   | ]}|D ]}|V  d S r$   r0   )rB   rP   rT   s      r'   rD   z(parse_raiffeisen_xlsx.<locals>.<genexpr>   s/      EEEEEEEEEEEr)   r
   r   r   r   rZ   r   cash_snapshot_candidaterJ   aggregate_onlymissing_instrument_detailsr>   
Raiffeisenxlsxz
sheet1:rowFr   saldobetragu   Raiffeisen ÜbersichtrO   )sheet_1)r   r   r   rb   r   r   ry   r   r   r.   rR   r   r2   r   )ri   r   r   r   r5   r   r   r   r   r   r   r   s               r'   parse_raiffeisen_xlsxr      s   dDEEEEEEELD&(*J47tABBxxRqAAA h h	E$)1a   r 	5//&' 	/00EEE&(DEEEE/,@QR@Q@QSXZ_adfkm  AF  HN  PW  Ya  nb  nb  d{  KP  QU  Q^  Q^  _d  Qe  Qe  Kf  Kf  g  g  g  	h  	h  	h  	hL&#d))U:=N=NPTV\^jkkkr)   r   c                P   |                                                      dd          }|j                                         }|dk    r|dk    rt          |          S |dk    r|dk    rt	          |          S |dk    r|dk    rt          |          S t          d|  d|           )	Nr`   rZ   postfinancez.docx
truewealth
raiffeisenz.xlsxz'Unsupported broker parser combination: )r   replacesuffixr   r   r   
ValueError)r   ri   platformr  s       r'   parse_broker_filer     s    $$&&..sB77H[  F=  Vw%6%6%d+++<Fg$5$5%d+++<Fg$5$5$T***
YYYQWYY
Z
ZZr)   )rT   rU   r"   r   )ri   r   r"   rj   )ri   r   r"   r   )rg   r   r"   r   )r   r   r"   r   )r   r   r"   r   )r   r   r   r   r"   r   )ri   r   r"   r2   )r   r   ri   r   r"   r2   )
__future__r   r   rt   collectionsr   dataclassesr   r   pathlibr   typingr   	xml.etreer	   rw   broker_mappingr   r   r2   rh   r   r   r   r   r   r   r   r   r   r  r0   r)   r'   <module>r     s'   " " " " " " 				        ( ( ( ( ( ( ( (             ' ' ' ' ' ' * * * * * * $1 1 1 1 1 1 1 1( $\ \ \ \ \ \ \ \0I I I I
      0      a a a a
+ + + +
g g g g2g g g g,l l l l*	[ 	[ 	[ 	[ 	[ 	[r)   