
    zxj}                       d Z ddlmZ ddlZ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mZ ddlmZ ddlmZ dd	lmZmZ dd
lmZ dZdZdZdZdZdZdZh dZ ed           G d d                      Z ed           G d d                      Z ed           G d d                      Z  ed           G d d                      Z! ed           G d d                      Z" ed           G d d                       Z#dLd&Z$dMd*Z%dNd,Z&d-d.dOd3Z'dPd4Z(dQd8Z)dRd;Z*dSd=Z+dTd>Z,dRd?Z-dUd@Z.dVdBZ/dWdEZ0dXdGZ1dYdHZ2dZdKZ3dS )[a2  Deterministic, in-memory PostFinance ZIP/PDF parser for verified customer exports.

Raw source bytes and filenames are intentionally never logged. The parser keeps source
identity hashes and semantic references so callers can provide Preview -> Confirm -> Audit
without trusting extracted temporary files.
    )annotationsN)	dataclassreplace)datetime)DecimalInvalidOperation)sha256)PurePosixPath)
BadZipFileZipFile)	PdfReaderpostfinance_verified_documentsz1.0.0id   i i  i  >
   AUDCADCHFDKKEURGBPJPYNOKSEKUSDT)frozenc                  ~    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	<   ded
<   ded<   ded<   ded<   dS )
PFDocumentstrdocument_hashfilename_hashdocument_typesemantic_referencesemantic_identity
str | Nonedocument_dateaccount_reference_hashaccount_roleint
page_countbytesrawtextN__name__
__module____qualname____annotations__     k/home/agent/.hermes/worktrees/FinanceManager-sprint20h1/src/jarvis_finance/imports/postfinance_documents.pyr   r       s         &&&&OOOJJJIIIIIr2   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	<   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ed<   ded<   ded<   ded<   ded<   ded<   dS )PFEventr   event_fingerprintr   r!   
event_typer&   occurred_onr#   settlement_on	directioninstrument_nameisinDecimal | Nonequantityprice_originalgross_originalr   fee_originaltax_originalnet_originalcurrencyfx_rate_to_chfinternal_transfer_groupquality_statustuple[str, ...]reason_codesNr,   r1   r2   r3   r5   r5   /   s        OOO""""""""    MMM""""''''!!!!!!r2   r5   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
<   ded<   ded<   ded<   ded<   dS )PFSnapshotPositionr   row_referencesource_labelnormalized_labelasset_classr   r>   r=   provider_average_cost_originalprovider_cost_total_originalmarket_price_originalprice_currencymarket_value_chf
weight_pctNr,   r1   r2   r3   rK   rK   H   s         22220000""""r2   rK   c                  8    e Zd ZU ded<   ded<   ded<   ded<   dS )PFSnapshotCashr   rD   r   amount_originalrE   source_value_chfNr,   r1   r2   r3   rW   rW   W   s?         MMMr2   rW   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<   d
ed<   d
ed<   d
ed<   ded<   dS )
PFSnapshotr   source_hashr'   r(   valuation_atztuple[PFSnapshotPosition, ...]	positionsztuple[PFSnapshotCash, ...]cashr   securities_total_chfcash_total_chftotal_value_chfstock_total_chfetf_total_chfopen_ordersNr,   r1   r2   r3   r[   r[   _   s         OOO----$$$$!!!!r2   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<   ded<   dS )PFBundler   zip_hashoverview_hashbundle_hashztuple[PFDocument, ...]	documentstuple[PFEvent, ...]eventsr[   snapshotrH   transfer_groupsrI   Nr,   r1   r2   r3   rg   rg   n   so         MMM%%%%$$$$!!!!!!r2   rg   r_   list[PFSnapshotCash]ra   r   returnc                v   d | D             st          d          t          d          t          t          d                    z  dk    fdD             }                              t          |t          d                    z
  }|r>t	          t          t                              fd          }||xx         |z  cc<   t          |t          d                                                  k    rt          d	          d
 t          | |d          D             S )zAllocate the official cash subtotal across rows whose displayed FX is rounded.

    The final CHF-looking column in the source row is the whole portfolio's currency
    exposure, not the currency-cash value. It must never be projected as cash.
    c                ,    g | ]}|j         |j        z  S r1   )rX   rE   .0items     r3   
<listcomp>z._reconcile_cash_components.<locals>.<listcomp>   s#    
G
G
G$4$"55
G
G
Gr2   z0PostFinance cash components cannot be reconciledz0.010r   c                N    g | ]!}r|z  z  n|                               "S r1   )quantize)ru   valuera   money	raw_totalsame_nonzero_signs     r3   rw   z._reconcile_cash_components.<locals>.<listcomp>   sM         !EN"Y..
(5//  r2   c                .    t          |                    S N)abs)indexr*   s    r3   <lambda>z,_reconcile_cash_components.<locals>.<lambda>   s    SZ r2   )keyz6PostFinance allocated cash components do not reconcilec                6    g | ]\  }}t          ||           S ))rY   )r   )ru   rv   r{   s      r3   rw   z._reconcile_cash_components.<locals>.<listcomp>   s9       D% 	u---  r2   Tstrict)
ValueErrorr   sumrz   maxrangelenzip)	r_   ra   	allocatedresiduallargestr|   r*   r}   r~   s	    `   @@@@r3   _reconcile_cash_componentsr   z   s~    H
G$
G
G
GC MKLLLFOOE C&&I!N2Q6         I &&u--Iws||0L0LLH 'eCHHoo+H+H+H+HIII'h&
9gcll##~'>'>u'E'EEEQRRR tYt<<<   r2   partsobjectr   c                     t          d                    d | D                                                                                                 S )N|c              3  4   K   | ]}t          |          V  d S r   )r   ru   ps     r3   	<genexpr>z_hash.<locals>.<genexpr>   s(      11a3q66111111r2   )r	   joinencode	hexdigest)r   s    r3   _hashr      sC    #((1151111188::;;EEGGGr2   r{   c                    dd l }|                    d|                               dd                                          }t	          j        dd|                                                                          S )Nr   NFKDasciiignorez
[^a-z0-9]+ )unicodedata	normalizer   decoderesublowerstrip)r{   r   ascii_values      r3   normalize_labelr      sk    ''66==gxPPWWYYK6-k&7&7&9&9::@@BBBr2   Frequiredr#   r   boolr=   c                  | pd                                                     dd                              dd                              dd                              dd          }t          j        dd|          }d	|v rqd
|v rm|                    d	          |                    d
          k    r*|                    d
d                              d	d
          n|                    d	d          }nd	|v r|                    d	d
          }t          j        dd|          }|s|rt          d          d S 	 t          |          }n"# t          $ r}t          d          |d }~ww xY w|                                st          d          |S )N     u    u   ’'u   −-z(?<=\d)[ '\u2009](?=\d),.z
[^0-9+\-.]z.PostFinance source has a missing numeric valuez/PostFinance source has an invalid numeric valuez1PostFinance source has a non-finite numeric value)	r   r   r   r   rfindr   r   r   	is_finite)r{   r   r+   resultexcs        r3   _numberr      s   	"		2			2								 	 6,b$77D
d{{sd{{ zz#C00 LLb!!))#s333c2&& 	
 
||C%%6-T**D  	OMNNNtU U U UJKKQTTU NLMMMMs   8E 
E'E""E'c                    | sd S |                                  }dD ]M}	 t          j        ||                                                                          c S # t
          $ r Y Jw xY wd S )N)z%d.%m.%Yz%d/%m/%Yz%Y%m%dz%Y-%m-%d)r   r   strptimedate	isoformatr   )r{   r+   fmts      r3   _dater      s     t;;==D=  	$T3//4466@@BBBBB 	 	 	H	4s   8A
A&%A&r*   r)   tuple[str, int]c                   | r-t          |           t          k    s|                     d          st          d          	 t	          t          j        |           d          }|j        rt          d          t          |j                  t          k    rt          d          g }|j        D ]W}	 |
                    d          pd	}n&# t          $ r |
                                pd	}Y nw xY w|                    |           Xn,# t          $ r  t          $ r}t          d
          |d }~ww xY w|rt          d |D                       rt          d          d                    |          t          |          fS )Ns   %PDFz/PostFinance PDF is empty, too large, or invalidFr   z,Encrypted PostFinance PDFs are not supportedz+PostFinance PDF exceeds the safe page limitlayout)extraction_moder   z PostFinance PDF cannot be parsedc              3  @   K   | ]}|                                  V  d S r   r   )ru   pages     r3   r   z_pdf_text.<locals>.<genexpr>   s-      ;;TDJJLL(;;;;;;r2   z2PostFinance PDF has a page without selectable text
)r   MAX_PDF_BYTES
startswithr   r   ioBytesIOis_encryptedpagesMAX_PDF_PAGESextract_text	Exceptionappendanyr   )r*   readerr   r   	extractedr   s         r3   	_pdf_textr      s    L#c((]**#..2I2I*JKKKF 2:c??5999 	MKLLLv|},,JKKKL 	$ 	$D6 --h-GGM2		 6 6 6 --//52			6LL####	$     F F F;<<#EF OC;;U;;;;; OMNNN99USZZ''s=    A0D 1C
	D 
 C-*D ,C--D D0D++D0namer+   c                    t          t          |           j                  }d}|D ]\  }}||v r|c S t          |d d                   }d|v rd|v rdS d|v rd|v rdS t          d          )	N))account_statementkontoauszug)trade_confirmationborsenabrechnung)corporate_actionzcorporate action abrechnung)transfer_confirmationtransferabrechnung)custody_feedepotgebuhr)interest_statementzinsabrechnung)portfolio_performancezportfolio wertentwicklungi	  transaktionsbelegborsentransaktionr   	dividender   z*Unsupported document in PostFinance bundle)r   r
   r   r   )r   r+   r   testskindmarkerlows          r3   	_classifyr      s    
---2
3
3CE   fS==KKK 
$uu+
&
&Cc!!&9S&@&@##c!!kS&8&8!!
A
B
BBr2   labelc                    t          j        |dz   | t           j                  }|r'|                    d                                          nd S )Nz\s*:?\s*([^\n]+)flags   )r   searchIgroupr   )r+   r   matchs      r3   _fieldr     sF    Ie114rtDDDE%*45;;q>>!!!4r2   c                    t          j        d| t           j                  }|r)t          j        dd|                    d                    nd S )Nz<(?:Kontonummer|Konto-Nr\.|Konto)\s*:?[ ]*([0-9][0-9 .-]{4,})r   z\Dr   r   )r   r   r   r   r   )r+   r   s     r3   _account_referencer     sM    IGUWUY  E 16?26%U[[^^,,,4?r2   c                   t          j        d|t           j                  }|s!t          j        d| t           j                  }|r|                    d          S t          j        d|t           j        t           j        z            }t          dg|r|                                n3t          |                                          	                                fR  d d         S )NzUnsere Referenz\s*:\s*([0-9]+)r   z!_(\d{8,})_\d{8}(?:\(\d+\))?\.pdf$r   z](?:vom|von)\s+(\d{1,2}[./]\d{1,2}[./]\d{4}).{0,40}(?:bis|per)\s+(\d{1,2}[./]\d{1,2}[./]\d{4})period   )
r   r   r   r   Sr   groupsr	   r   r   )r   r+   r   r   s       r3   
_referencer     s    I7RTJJJE R	>BDQQQ {{1~~YhdRTk  F
 b`V]]___VDKKMM=R=R=\=\=^=^<`bbb r2   c                   t          j        d| t           j                  }|r"t          |                    d                    S t          j        d|t           j                  }|r"t          |                    d                    nd S )Nz_(20\d{6})(?:\(\d+\))?\.pdf$r   r   uL   (?:Ausführungsdatum|Valutadatum|Stand)\s*:?\s*(\d{1,2}[./]\d{1,2}[./]\d{4}))r   r   r   r   r   )r   r+   r   s      r3   _document_dater   $  s    I5t24HHHE %U[[^^$$$IWd  E
 %*35Q   t3r2   tuple[str, Decimal] | Nonec                P   t          j        |dz   | t           j                  }|r.|                    d                                          t
          vrd S t          |                    d          d          }|J |                    d                                          |fS )Nu3   [^\n]*?\b([A-Z]{3})\s+([+\-−]?[0-9][0-9'’., ]*)r   r      Tr   )r   r   r   r   upper
CURRENCIESr   )r+   r   r   amounts       r3   _currency_amountr  0  s    IeTTVZbdbfgggE EKKNN((***<<tU[[^^d333F;;q>>!!6))r2   docPFEvent | Nonec                x   | j         }| j        }| j        pd}d }t          j        d|t          j                  }|r$t          |                    d                    p|}t          j        d|t          j                  }|r"t          |                    d                    }|st          d          t          d          }t          d          }d }d }	d }
d x}x}x}}d }d }g }d}d}| j
        d	k    rt          j        d
|t          j                  rdn$t          j        d|t          j                  rdnd}|st          d          t          j        d|          }|st          d          |                    d                                          |                    d                                          }
}	|                                }t          d t          |          D             d           }g }|x||dz   |dz            D ]g}d t          j        d|                                          D             }t#          |          dk    r!t%          d |D                       dk    r|} nh|st          d          t'          |d         d          }t'          |d         d          }t          d |D             d          }t'          |d         d          }|st          d          t)          |d           }t)          |d!          }|r|d         nt          d          }|r|d         nt          d          }t)          |d"          }|J |r|d         n|dk    r||z   |z   n||z
  |z
  }|dk    rd#nd$}n| j
        d%k    rt          j        d&|t          j                  r:d'}t          j        d|          }|sAt          j        d(|          }|r'|                    d                                          nd }
nN|                    d                                          |                    d                                          }
}	t)          |d)          }t)          |d*          }|r|st          d+          |\  }}|d         }t          j        d,|z   d-z   |t          j                  }t%          d. |D             t          d                    }d$}nGt          j        d/|t          j                  r[d0}t          j        d(|          }|r'|                    d                                          nd }
d}|                    d1           nt          d2          | j
        d3k    r@d4}t)          |d5          pt)          |d6          } | st          d7          | \  }}|}|}d#}nq| j
        d8k    r&t/          t          j        d9|t          j                            }!t/          t          j        d:|t          j                            }"|!|"k    rt          d;          d<}|!rd$nd#}t)          |d=          pt)          |d*          } | st          d>          | \  }}|}t          j        d?|t          j                  }#|#r"t'          |#                    d                    nd }t1          d@|          d dA         }|                    dB           n?| j
        dCk    r2dD}|                    dE           d}d$}|                    dF           d S d S t1          || j        |||
pd|||pd|pd|pd
  
        }$t5          |$| j        ||| j        ||||	|
||||||||||rdGndHt;          t=          t?          |                                        S )INr   u6   Ausführungsdatum\s*:?\s*(\d{1,2}[./]\d{1,2}[./]\d{4})r   r   z0Valutadatum\s*:?\s*(\d{1,2}[./]\d{1,2}[./]\d{4})z1PostFinance economic document lacks an event daterx   r   r   u   Börsentransaktion\s*:\s*Kaufbuyu    Börsentransaktion\s*:\s*Verkaufsellz'Unsupported PostFinance trade directionz1([^\n]+?)\s+ISIN\s*:\s*([A-Z]{2}[A-Z0-9]{9}[0-9])z+PostFinance trade lacks instrument identityr  c              3  8   K   | ]\  }}d |v 	d|v d|v |V  dS )AnzahlPreisBetragNr1   )ru   ilines      r3   r   z'_event_from_document.<locals>.<genexpr>b  sO        Att##4H<L<L <L<L<L<L r2      c                ^    g | ]*}|                                 |                                 +S r1   r   rt   s     r3   rw   z(_event_from_document.<locals>.<listcomp>l  s2    cccVZV`V`VbVbc

cccr2   \s{2,}   c              3  Z   K   | ]&}t          t          j        d |                    V  'dS )\dN)r   r   r   rt   s     r3   r   z'_event_from_document.<locals>.<genexpr>m  s6      )X)X4$ry/E/E*F*F)X)X)X)X)X)Xr2      z-PostFinance trade amount row cannot be parsedr   Tr   c              3  ,   K   | ]}|t           v |V  d S r   )r  rt   s     r3   r   z'_event_from_document.<locals>.<genexpr>t  s,      GG$DJ4F4F4F4F4F4FGGr2   z%PostFinance trade currency is missing
Kommissionz&Abgabe\s*\([^\n]*Stempelsteuer[^\n]*\)zBetrag\s+belastet[^\n]*outinr   z\bDividende\bdividendz%ISIN\s*:\s*([A-Z]{2}[A-Z0-9]{9}[0-9])z(?:Dividende|Betrag)Totalz,PostFinance dividend totals cannot be parsedu,   (?:Quellensteuer|Steuerrückbehalt)[^\n]*?\bu    \s+([+\-−]?[0-9][0-9'’., ]*)c              3  V   K   | ]$}t          |d           pt          d          V  %dS )Tr   rx   N)r   r   rt   s     r3   r   z'_event_from_document.<locals>.<genexpr>  s:      PP$---=PPPPPPr2   z	\bSplit\bsplitnon_cash_corporate_actionz(Unsupported PostFinance corporate actionr   feezBetrag\s+belastetBruttobetragz/PostFinance custody fee amount cannot be parsedr   z Zahlungsverkehr\s*-\s*GutschriftzZahlungsverkehr\s*-\s*Belastungz+PostFinance transfer direction is ambiguousinternal_transferz((?:Gutgeschriebener|Belasteter)\s+Betragz,PostFinance transfer amount cannot be parsedu"   Wechselkurs\s+([0-9][0-9'’., ]*)transfer    'internal_transfer_not_income_or_expenser   interest!multi_currency_interest_statementcomponent_events_requiredpartialcomplete) r+   r!   r$   r   r   r   r   r   r   r   r    r   r  
splitlinesnext	enumerater"  r   r   r   r  findallr   r   r   r"   r5   r   r&   tuplesortedset)%r  r+   	referenceoccurred
settlementr   r$  taxfx
instrumentr<   r>   pricegrossnetr:   transfer_groupreasonsrD   r7   imlinesheadervaluesr  colsfee_item
stamp_itemnet_item
gross_item
total_itemtaxesrv   creditdebitfx_matchfingerprints%                                        r3   _event_from_documentrP  9  s   8D&I &BHJIOQU]_]abbbE 5Q((4HII4WYW[\\\E +5;;q>>**
 NLMMM
#,,C
#,,C	BJD%))H)u)usINGHJ
000 y94rtLLLEE y<d"$OOO 	  	HFGGGYKTRR 	LJKKK88A;;,,..0A0A0C0CD
!! (//  
 
 
 fqj6A:56  cc)TZZ\\1R1Rccct99>>c)X)XSW)X)X)X&X&X\]&]&]!FE 	NLMMM6!9t444q	D111GG&GGGLLr
T222 	FDEEE#D-88%d,UVV
%7hqkk73<<);jmmws||#D*DEE    SHQKK'1U':':%#+##c@Q 	
 (500EEd				0	0	09%t24888  	I#JOQUVVB LYGNN.0:rxx{{((***d#%88A;;#4#4#6#68I8I8K8KD
)$0GHHJ)$99J QZ Q !OPPP(OHeQ-CJ?56 d  E PP%PPPRYZ]R^R^ C IIY|T666 	I JCTJJB*,6288A;;$$&&&$DHNN67777GHHH		m	+	+
&:;; 
?O/@
 @
  	PNOOO#				5	5	5bi CTQSQUVVVWWRYA4rtTTTUUU??JKKK(
"-DD	=
 
 .dH-- 	  	MKLLL%9BDPRPTUUU+3=WX^^A&&'''z955crc:@AAAA		2	2	2
:;;; 	2333tt
B	r K 
,		*fS\\""##+  r2   rl   c                   | j         dk    rdS g }t          j        d| j        t          j                  dd          D ]
}t          j        d|t          j                  }|r.|                    d                                          t          vrU|                    d                                          }t          j	        d|          }t          d |                                D             d	          }d
 t          j	        d|          D             }t          |          dk     s|st          d          t          |d                   }|J |dk    r|d         }	t          d          }
n3t          |          dk    r|d         }	|d         }
nt          d          |	J |	dk    rdnd}t!          | j        | j        d|||	          }|                    t)          || j        | j        dd|||d d d d t-          |	          t          d          t          d          t-          |	          ||
d dd                     t          |          dk    rt          d          t/          |          S )Nr   r1   ABSCHLUSSBUCHUNGENr   r   u   Währung\s*:\s*([A-Z]{3})z\d{1,2}[./]\d{1,2}[./]\d{4}c              3     K   | ]B}|                                                     d           )t          j        d|          >|V  CdS )r   r  N)r   r   r   r   )ru   r  s     r3   r   z#_interest_events.<locals>.<genexpr>  sh        ::<<**733 9;	%8N8N     r2   r   c                0    g | ]}t          |d           S Tr   r   ru   r{   s     r3   rw   z$_interest_events.<locals>.<listcomp>  s5     
 
 
 ED)))
 
 
r2      [+\-−]?[0-9][0-9'’.,]*r  z/PostFinance interest component cannot be parsedr   r  1r  z=PostFinance foreign-currency interest component is incompleter   r  r  r*  etrading_cashrx   r-  )#interest_breakdown_source_preservedzEPostFinance interest statement must contain three currency components)r    r   r"  r+   r   r   r   r  r  r2  r0  r/  r   r   r   r   r   r!   r"   r   r5   r   r   r3  )r  rm   blockcmrD   period_dates
total_linerD  r7  r>  r:  r:   rO  s                r3   _interest_eventsrb    s   
000rF/FFFqrrJ ;
 ;
Y3U"$GGG 	RXXa[[&&((
::88A;;$$&&z"@%HH !,,..  
 
 


 
$A:NN
 
 
 |q   NOOOa))###u*CBB[[A*CBB\]]]1HHDD%	"C$9:xQY[^
 
 	!&CC8+ 	
 	
 	
 	
2 6{{a`aaa==r2   c                t   t          |           \  }}t          j        d|          }|st          d          t	          |                    d                    }|J | d|                    d           }g }g }d }d}	d x}
x}x}x}}d }|                                D ]}|                                }|dk    rd} |d	k    rd
})d|v rd|v rd|v rd}	8d t          j        d|          D             }t          |          dk    r|d         t          v rt          j        d|d                   rzt          |d         d          }t          |d         d          }t          |d         d          }|||J |                    t          |d         |||                     |	r|rt          |          dk    rt          j        d|d                   rmt          j        d|d                   rQt          |d         d          }t          |d                   }t          |d                   }t          j        d|d                   }|st          d          t          |                    d          d          }|                    d          }t          |d         d          }t          |d                   }|||J |d         }|                    t          t          dt          |          dz   t!          |                    d d         |t!          |          ||||||||                     |                    d          rN|	sLd t          j        d |          D             }t          |          dk    r|d         |d         |d         }}}
|                    d!          r<d" t          j        d |          D             }t          |          dk    r|d         }e|                    d#          r<d$ t          j        d |          D             }t          |          dk    r|d         }t          j        d%|          }|r"t'          |                    d                    }t          j        d&|          }|r$t          |                    d          d          }t          j        d'|          }|r$t          |                    d          d          }
t          j        d(|          }|r&|$t          |                    d          d          }t          j        d)|          }|r$t          |                    d          d          }t          j        d*|          }|r$t          |                    d          d          }t          |          d+k    st          |          dk    rt          d,          d |
|||||fv rt          d-          |

|||||J t)          t+          d. |D             t-          d/                    |z
            t-          d0          k    rt          d1          t)          ||
z   |z
            t-          d0          k    rt          d2          t)          ||z   |z
            t-          d0          k    rt          d3          t/          ||
          }t1          t3          |                                           ||t7          |          t7          |          ||
||||          S )4Nz/(\d{1,2}/\d{1,2}/\d{4})\s+(\d{1,2}:\d{2}:\d{2})z?PostFinance account overview lacks an exact valuation timestampr   Tr  FAktienstockETFsetfProduktr  EinstandskursTc                ^    g | ]*}|                                 |                                 +S r1   r   rt   s     r3   rw   z#_parse_snapshot.<locals>.<listcomp>Q  s-    WWW$**,,W

WWWr2   r     r   r  r      	   z[A-Z]{3}r  u*   ([+\-−]?[0-9][0-9'’., ]*)\s*([A-Z]{3})z2PostFinance overview position lacks price/currency   zsnapshot-rowr(  z
Gesamt CHFc                0    g | ]}t          |d           S rU  rV  rW  s     r3   rw   z#_parse_snapshot.<locals>.<listcomp>}  5        ---  r2   rX  zZwischensumme Aktien in CHFc                0    g | ]}t          |d           S rU  rV  rW  s     r3   rw   z#_parse_snapshot.<locals>.<listcomp>  rq  r2   zZwischensumme ETFs in CHFc                0    g | ]}t          |d           S rU  rV  rW  s     r3   rw   z#_parse_snapshot.<locals>.<listcomp>  rq  r2   u   Offene Aufträge\s+([0-9]+)u:   Wert der Wertschriften\s+([0-9][0-9'’.,]*(?: [0-9]{3})*)u/   Barguthaben\s+([0-9][0-9'’.,]*(?: [0-9]{3})*)u-   Totalwert\s+([0-9][0-9'’.,]*(?: [0-9]{3})*)u?   Zwischensumme Aktien in CHF\s+([0-9][0-9'’.,]*(?: [0-9]{3})*)u=   Zwischensumme ETFs in CHF\s+([0-9][0-9'’.,]*(?: [0-9]{3})*)   zLPostFinance account overview does not contain the expected complete snapshotz2PostFinance account overview lacks required totalsc              3  $   K   | ]}|j         V  d S r   )rT   r   s     r3   r   z"_parse_snapshot.<locals>.<genexpr>  s%      66q"666666r2   rx   z0.05z+PostFinance position sum does not reconcilez,PostFinance account total does not reconcilez/PostFinance asset-class totals do not reconcile)r   r   r   r   r   r   r/  r   r"  r   r  r   r   rW   rK   r   r   r   r2  r'   r   r   r   r   r[   r	   r   r3  ) r*   r+   r(   	timestampr   r]   r^   r_   sectionin_positions
cash_totalsecurities_totaltotalstock_total	etf_totalre   r  strippedrE  r:  r  r{   r>   averageprovider_totalpmr<  rD   weightr   rD  ms                                    r3   _parse_snapshotr  8  s    ~~D*	LdSSI \Z[[[##$$D11Y__Q//11L*,I!#DGLFJJJJ!JEJK)K!! _; _;::<<xGvG  X%9%9oQY>Y>YLWW)X)F)FWWWt99>>d1g33	%a8Q8Q3a4000BT!Wt444FDGd333E>f&8U=N=NNKKtAwEBBCCC"	"	 D		Q	%a)) 	+tAw//  tAw666Hd1g&&G$T!W--NH$q'RRB W !UVVVBHHQKK$777Exx{{HDGd333ET!W%%F'E,=%BSBSSGE".#i..1*<oe>T>TUUVYWYVYZ#E**"    |,, 	\ 	 Z(ExPP  F 6{{a6<QiFSTIe,
<== 	 Z(ExPP  F 6{{a$Qi:;; 	 Z(ExPP  F 6{{a"1I	I4h?? 	*aggajj//KISU]^^ 	B&qwwqzzDAAAIH(SS 	< d;;;JIFQQ 	7AGGAJJ666EIXZbcc 	=!!''!**t<<<KIVX`aa 	;

T:::I
9~~s4yyA~~Z
 
 	
 
,e[)[YYYMNNN(#!##	$ 366I666EEHXXYY\c] ]   FGGG
j(5011GFOOCCGHHH
;"%5566HHJKKK%dJ77Dsid  r2   zip_rawoverview_rawc                   | rt          |           t          k    rt          d          g }	 t          t	          j        |                     5 }|                                }|rt          |          t          k    rt          d          t          d |D                       t          k    rt          d          |D ]}t          |j                            dd                    }|j        dz	  dz  }|j        d	z  s1|                                sd
|j        v st#          j        |          rt          d          |                                s-|j                                        dk    s|j        t.          k    rt          d          |                    |          }t3          |          \  }	}
t5          |j        |	          }t7          |j        |	          }t9          |	          }|rt;          d|          nd }|dv rdn	|dk    rdnd}d|	v rdnd|	v rdnd}t;          |||pd|          }|                    t?          tA          |          !                                tA          |j"        #                                          !                                |||tI          |j        |	          |||
||	                     	 d d d            n# 1 swxY w Y   n,# t          $ r  tJ          $ r}t          d          |d }~ww xY wg }|D ]}|j&        dk    r|                    |           #d|j'        v rd}nd|j'        v rd}nt          d          |                    t?          |j(        |j)        |j*        |j+        |j,        |j-        |j.        ||j/        |j0        |j'                             |}d |D             }t          tc          |                    t          |          k    rt          d          i }|D ];}|j*        dk    r.|2                    |j+        g                               |           <tg          d |4                                D                       rt          d           i }|D ]<}|2                    |j,        |j(                  }||j(        k    rt          d!          =g }|D ]J}|5                    tm          |                     to          |          }||                    |           Ktq          |          }t          d" |D                       t          |          k    rt          d#          ts          |          }tA          |           !                                }tA          |          !                                }tu          ||t;          ||tv          tx                    tq          |          ||tq          t{          d$ |D                                 d%          S )&Nz%PostFinance ZIP is empty or too largez:PostFinance ZIP has no documents or exceeds the safe limitc              3  $   K   | ]}|j         V  d S r   )	file_sizert   s     r3   r   z+parse_postfinance_bundle.<locals>.<genexpr>  s$      44d4>444444r2   z-PostFinance ZIP is too large after extraction\/   i  r   z..z(PostFinance ZIP contains an unsafe entryz.pdfz-PostFinance ZIP contains an unsupported entryaccount>   r   r   r   r   r   r\  r   unresolved_transferetrading_depotzZahlungsverkehr - GutschriftrL  zZahlungsverkehr - BelastungrM  noner   z%PostFinance source is not a valid ZIPefinancez&PostFinance transfer role is ambiguousc                    g | ]	}|j         
S r1   )r   )ru   documents     r3   rw   z,parse_postfinance_bundle.<locals>.<listcomp>0  s    HHH(x-HHHr2   z0PostFinance bundle contains a duplicate documentc              3  `   K   | ])}t          |          d k    pd |D             ddhk    V  *dS )r  c                    h | ]	}|j         
S r1   )r&   )ru   ds     r3   	<setcomp>z5parse_postfinance_bundle.<locals>.<genexpr>.<setcomp>8  s    :::qAN:::r2   r  r\  N)r   )ru   itemss     r3   r   z+parse_postfinance_bundle.<locals>.<genexpr>7  s^         	E

a[::E:::z?>[[     r2   z@PostFinance internal transfer pairing is incomplete or ambiguouszEPostFinance semantic document identity has conflicting original bytesc                    h | ]	}|j         
S r1   )r6   )ru   events     r3   r  z+parse_postfinance_bundle.<locals>.<setcomp>J  s    888E#888r2   z5PostFinance bundle contains duplicate economic eventsc              3  F   K   | ]}t          d |          dd         V  dS )r'  Nr(  )r   )ru   refs     r3   r   z+parse_postfinance_bundle.<locals>.<genexpr>V  s5      CCSU:s++CRC0CCCCCCr2   )!interest_components_document_onlystatements_reconciliation_only)>r   MAX_ZIP_BYTESr   r   r   r   infolist	MAX_FILESr   MAX_UNCOMPRESSED_BYTESr
   filenamer   external_attr	flag_bitsis_absoluter   statS_ISLNKis_dirsuffixr   r  r   readr   r   r   r   r   r   r   r	   r   r   r   r   r   r&   r+   r   r   r    r!   r"   r$   r%   r(   r*   r5  
setdefaultr   rD  extendrb  rP  r3  r  rg   	PARSER_IDPARSER_VERSIONr4  ) r  r  rk   archiveinfosinfopathmoder*   r+   r(   r   r6  r  account_hashroler:   identityr   resolved_docsr  document_hashesr   r  
identitiesprior
event_listr  rm   rn   rh   ri   s                                    r3   parse_postfinance_bundler    s    Bc'll]22@AAA"$IAKRZ(()) <	W$$&&E _CJJ22 !]^^^44e444447MMM !PQQQ 6 6$T]%:%:4%E%EFF*b0F:NS(Q''))Q tz))|D)) * %%OPPP;;== VDK$5$5$7$76$A$AT^VcEcEc$%TUUUll4((#,S>> j 55&t}d;;	,T22<CMuY888   $O 666 /.)   6== H 5<< !  !y,2D"iPP  s--//ty//1122<<>>! &t}d;;$"    Q6<	 <	 <	 <	 <	 <	 <	 <	 <	 <	 <	 <	 <	 <	 <	z     K K K@AAsJK
 ')M 
 
>222  ###)QV33"DD*af44DDEFFF$#( 	
 	
 	
 	
 IHHiHHHO
3  C$8$888KLLL*,F F F 777c4b99@@EEE
  ]]__     ] [\\\!#J  %%c&;S=NOOC%%%W   & !#J % %*3//000$S))e$$$:F
8888899S[[HHPQQQ|,,Hg((**H<((2244Mhy.AAifCCFCCCCCDDO	 	 	s<   !K& I?KK& KK& !K"K& &L:L

L)r_   rp   ra   r   rq   rp   )r   r   rq   r   )r{   r   rq   r   )r{   r#   r   r   rq   r=   )r{   r#   rq   r#   )r*   r)   rq   r   )r   r   r+   r   rq   r   )r+   r   r   r   rq   r#   )r+   r   rq   r#   )r   r   r+   r   rq   r#   )r+   r   r   r   rq   r  )r  r   rq   r	  )r  r   rq   rl   )r*   r)   rq   r[   )r  r)   r  r)   rq   rg   )4__doc__
__future__r   r   r   r  dataclassesr   r   r   decimalr   r   hashlibr	   pathlibr
   zipfiler   r   pypdfr   r  r  r  r  r  r   r   r  r   r5   rK   rW   r[   rg   r   r   r   r   r   r   r   r   r   r   r   r  rP  rb  r  r  r1   r2   r3   <module>r     s	    # " " " " " 				 				  * * * * * * * *       - - - - - - - -       ! ! ! ! ! ! ' ' ' ' ' ' ' '      ,		$ SSS
 $        $" " " " " " " "0 $        $        $        $" " " " " " " "# # # #LH H H HC C C C 49      @	 	 	 	( ( ( (6C C C C,5 5 5 5
@ @ @ @    	4 	4 	4 	4* * * *w w w wtB B B BJQ Q Q QhL L L L L Lr2   