
    bj                        d dl mZ d dlmZmZ d dlmZmZ d dlm	Z	 d dl
mZ d dlZh dZh dZh d	Zh d
Zh 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S )*    )annotations)MappingSequence)DecimalInvalidOperation)Path)AnyN>      mär   märzapraugdezfebjanjuljunmaimarnovoktsepjulijuniseptaprilmaerzaugustjanuarfebruaroktoberdezembernovember	september>   	   jährlichjahrsummetotalannual	jaehrlich>   bereichcategory	kategoriehauptkategorie>   wasnamedetailpositionbeschreibungunterkategorie>   abofixfixedmiete	fixkosten	recurringwiederkehrendvaluer	   returnstrc                L    | dS t          |                                           S )N )r=   stripr;   s    /home/agent/.hermes/worktrees/FinanceManager-sprint3-reconciliation-snapshot-foundation/src/jarvis_finance/budget/excel_seed.py_textrC      s$    }ru::    c                    t          |                                                               dd                              dd                              dd          S )N   äae   öoe   üue)rC   lowerreplacerA   s    rB   _normrN      sL    <<''d33;;D$GGOOPTVZ[[[rD   boolc                    t          |           }|sdS |                    d          rdS |                    dd                              dd          }	 t          |           n# t          t
          f$ r Y dS w xY wdS )NF=T'r?   ,.)rC   
startswithrM   r   r   
ValueError)r;   texts     rB   _is_numberishrX      s    <<D us t<<R  ((c22Dj)   uu4s   A& &A;:A;rowsSequence[Sequence[Any]]tuple[int, list[str]] | Nonec                   t          | d d                   D ]h\  }}d |D             }t          d |D                       }t          d |D                       }t          d |D                       }|s|r|r||fc S id S )N   c                ,    g | ]}t          |          S  )rN   .0cells     rB   
<listcomp>z _find_header.<locals>.<listcomp>.   s    ///45;;///rD   c              3  (   K   | ]}|t           v V  d S NCATEGORY_HEADERSra   hs     rB   	<genexpr>z_find_header.<locals>.<genexpr>/   (      BBQ1 00BBBBBBrD   c              3  (   K   | ]}|t           v V  d S re   POSITION_HEADERSrh   s     rB   rj   z_find_header.<locals>.<genexpr>0   rk   rD   c              3  :   K   | ]}|t           v p|t          v V  d S re   )MONTH_HEADERSYEAR_HEADERSrh   s     rB   rj   z_find_header.<locals>.<genexpr>1   s1      QQA]*?a<.?QQQQQQrD   )	enumerateany)rY   idxrowheadershas_categoryhas_position	has_months          rB   _find_headerrz   ,   s    d3B3i((    S//3///BB'BBBBBBB'BBBBBQQQQQQQ	 	 L 	 i 	 <4rD   sheets%Mapping[str, Sequence[Sequence[Any]]]
str | Nonec                H  	 g }|                                  D ]5\  }}t          |          	d}t          j        d	          }|r|dt	          	          z   z  }n(d	v r|dz  }nt          d 	D                       r|dz  }t          	fdd	D                       r|d
z  }t          |          }|rZ|dz  }|\  }}|t          d |D                       z  }|t          dt          dt          |          |z
  dz
                      z  }|s|d
z  }t          	fddD                       r|dz  }|                    ||f           7|                    d           |r |d         d         dk    r|d         d         nt          t          |           d           S )Nr   z20\d{2}i  budget2   c              3  >   K   | ]}|                                 V  d S re   )isdigit)ra   chs     rB   rj   z&_current_sheet_name.<locals>.<genexpr>B   s*      ,,",,,,,,rD      c              3      K   | ]}|v V  	d S re   r_   ra   wordlows     rB   rj   z&_current_sheet_name.<locals>.<genexpr>D   s'      IItts{IIIIIIrD   )aktuellcurrentlaufendd   P   c              3  ,   K   | ]}|t           v d V  dS )   Nrp   rh   s     rB   rj   z&_current_sheet_name.<locals>.<genexpr>J   s,      BBqqM/A/A/A/A/A/ABBrD      r   c              3      K   | ]}|v V  	d S re   r_   r   s     rB   rj   z&_current_sheet_name.<locals>.<genexpr>N   s'      DDtts{DDDDDDrD   )archivarchivealtT)reverse)itemsrN   re	fullmatchintrs   rz   summinmaxlenappendsortnextiter)
r{   scoredr/   rY   score
year_matchheader
header_idxrv   r   s
            @rB   _current_sheet_namer   7   s   $&Fllnn % %
dDkk\*c22
 	TCHH_$EE__RKEE,,,,,,, 	QJEIIII'HIIIII 	SLEd## 	ARKE"(JSBBGBBBBBBESSCII
$:Q$>??@@@E 	SLEDDDD'CDDDDD 	RKEudm$$$$
KKK!VfQilQ&6&66!9Q<<T$v,,PT=U=UVrD   dict[str, Any]c                f   t          |           }g }t                      }g }d}d}d}d}|rp|                     |g           }	t          |	          }
|
s|                    d           n2|
\  }}t          d t          |          D             d           }t          d t          |          D             d           }d t          |          D             }d t          |          D             }d t          |          D             }|	|dz   d          D ]|(|t                    k     rt          |                   nd	}|(|t                    k     rt          |                   nd	}|s|s`fd
|D             }fd|D             }d D             }|t          d |D                       z  }|t          d |D                       z  }t          |p|          }|r|                    |           d                    fd|D                       dz   t          |          z   t          fdt          D                       }|rB|dz  }|                    |pd |p|pd t          |          t          |          |d           |dz  }t          d |D                       }t          |           t!          |                                           |t          |          t          |          |t          |          |||||t%          |          d |D             dS )Nr   z!Kein klarer Budget-Header erkanntc              3  2   K   | ]\  }}|t           v |V  d S re   rf   ra   iri   s      rB   rj   z/analyze_budget_workbook_rows.<locals>.<genexpr>f   1       [ [tq!QJZEZEZEZEZEZEZ [ [rD   c              3  2   K   | ]\  }}|t           v |V  d S re   rm   r   s      rB   rj   z/analyze_budget_workbook_rows.<locals>.<genexpr>g   r   rD   c                *    g | ]\  }}|t           v |S r_   r   r   s      rB   rc   z0analyze_budget_workbook_rows.<locals>.<listcomp>h   s&    TTT41amASASQASASASrD   c                *    g | ]\  }}|t           v |S r_   )rq   r   s      rB   rc   z0analyze_budget_workbook_rows.<locals>.<listcomp>i   s&    RRR$!Q\@Q@QA@Q@Q@QrD   c                     g | ]\  }}|d v 	|S )>   arttyptyper_   r   s      rB   rc   z0analyze_budget_workbook_rows.<locals>.<listcomp>j   s'    \\\$!QE[@[@[A@[@[@[rD   r   r?   c                d    g | ],}|t                    k     t          |                   *|-S r_   r   rX   ra   r   ru   s     rB   rc   z0analyze_budget_workbook_rows.<locals>.<listcomp>p   s7    !e!e!ea#c((ll}]`ab]cOdOdl!lllrD   c                d    g | ],}|t                    k     t          |                   *|-S r_   r   r   s     rB   rc   z0analyze_budget_workbook_rows.<locals>.<listcomp>q   s7     c c cqACLL][^_`[aMbMbLLLLrD   c                ,    g | ]}t          |          S r_   )rC   r`   s     rB   rc   z0analyze_budget_workbook_rows.<locals>.<listcomp>r   s    555t555rD   c              3  D   K   | ]}|                     d           dV  dS )rQ   r   NrU   r`   s     rB   rj   z/analyze_budget_workbook_rows.<locals>.<genexpr>s   s3      $Q$Q4DOOC<P<P$QQ$Q$Q$Q$Q$Q$QrD   c              3  L   K   | ]}d |v s|                     d          dV   dS )!rQ   r   Nr   r`   s     rB   rj   z/analyze_budget_workbook_rows.<locals>.<genexpr>t   s7      &b&bTcTkkT__]`MaMakqkkkk&b&brD    c              3  h   K   | ],}|t                    k     t          |                   V  -d S re   )r   rN   r   s     rB   rj   z/analyze_budget_workbook_rows.<locals>.<genexpr>x   s;      %Z%ZQQTUXQYQY\\eCFmm\\\\%Z%ZrD   c              3      K   | ]}|v V  	d S re   r_   )ra   hint
fixed_texts     rB   rj   z/analyze_budget_workbook_rows.<locals>.<genexpr>y   s(      JJdtz1JJJJJJrD   )category_nameposition_namehas_monthly_valueshas_annual_valueis_fixed_cost_candidatec              3  *   K   | ]}|d          
dV  dS )r   r   Nr_   ra   items     rB   rj   z/analyze_budget_workbook_rows.<locals>.<genexpr>   s-      QQD6O1PQaQQQQQQrD   c                J    g | ] }d  |                                 D             !S )c                "    i | ]\  }}|d v	||S )>   amountannual_amountmonthly_amountr_   )ra   kvs      rB   
<dictcomp>z;analyze_budget_workbook_rows.<locals>.<listcomp>.<dictcomp>   s)    eeedaa7d.d.dQ.d.d.drD   )r   r   s     rB   rc   z0analyze_budget_workbook_rows.<locals>.<listcomp>   s?     #
 #
 #
 fedjjlleee#
 #
 #
rD   )sheet_countsheet_namescurrent_budget_sheetmain_category_countposition_countfixed_cost_candidate_countbudget_plan_candidate_countformula_cell_countreference_cell_countseed_suitable_range_countunclean_range_countwarningscategory_candidatesbudget_plan_candidates)r   setgetrz   r   r   rr   r   rC   r   rO   addjoinrN   rs   FIXED_HINTSlistkeyssorted)r{   r   r   category_names	positionsformula_countreference_countsuitable_countunsuitable_countrY   r   r   rv   category_idxposition_idxmonth_indicesyear_indicestype_indicesr+   r1   numeric_monthsnumeric_yearscellshas_budget_valuesis_fixedfixed_countr   ru   s                             @@rB   analyze_budget_workbook_rowsr   U   s   !&))GH"uuN&(IMON '*zz'2&&d## $	*OO?@@@@"(J [ [y/A/A [ [ []abbL [ [y/A/A [ [ []abbLTT9W+=+=TTTMRR)G*<*<RRRL\\)G*<*<\\\LJN,,- * *7C7OT`cfgjckckTkTk5\!2333qs7C7OT`cfgjckckTkTk5\!2333qs  !e!e!e!e]!e!e!e c c c cL c c c55555$Q$Q5$Q$Q$Q!Q!QQ3&b&bU&b&b&b#b#bb$()H=$I$I! 1"&&x000 XX%Z%Z%Z%Z\%Z%Z%ZZZ]``chiqcrcrr
JJJJkJJJJJ$ *"a'N$$-5-=-5-I-IT26~2F2F04]0C0C7?     %)$$QQIQQQQQK6{{FKKMM** '">22i..&1'*9~~+ /%3/%n55#
 #
!#
 #
 #
  rD   path
str | Pathdict[str, list[list[Any]]]c                   t          |           }|j                                        }|dk    r%ddlm}  ||dd          }d |j        D             S |dk    rj	 dd l}n"# t          $ r}t          d	          |d }~ww xY w|	                    t          |          d
          }d |                                D             S t          d|           )Nz.xlsxr   )load_workbookFT)	data_only	read_onlyc                Z    i | ](}|j         d  |                    d          D             )S )c                &    g | ]}d  |D             S )c                    g | ]}|S r_   r_   r`   s     rB   rc   z<load_workbook_rows.<locals>.<dictcomp>.<listcomp>.<listcomp>   s    111TD111rD   r_   )ra   ru   s     rB   rc   z1load_workbook_rows.<locals>.<dictcomp>.<listcomp>   s'    \\\c11S111\\\rD   T)values_only)title	iter_rows)ra   wss     rB   r   z&load_workbook_rows.<locals>.<dictcomp>   s;    uuuac\\R\\VZ\=[=[\\\uuurD   z.xlsz.xlrd is required to read .xls budget workbooks)	on_demandc                \    i | ](j         fd t          j                  D             )S )c                T    g | ]$}t                              |                    %S r_   )r   
row_values)ra   r   sheets     rB   rc   z1load_workbook_rows.<locals>.<dictcomp>.<listcomp>   s/    SSS1T%"2"21"5"566SSSrD   )r/   rangenrows)ra   r  s    @rB   r   z&load_workbook_rows.<locals>.<dictcomp>   s=    oooX]
SSSSek@R@RSSSooorD   zUnsupported workbook suffix: )r   suffixrL   openpyxlr   
worksheetsxlrdImportErrorRuntimeErroropen_workbookr=   r{   rV   )r   sourcer  r   wbr  excbooks           rB   load_workbook_rowsr     s   $ZZF]  ""F******]6UdCCCuugigtuuuu	ZKKKK 	Z 	Z 	ZOPPVYY	Z!!#f++!>>ooaealalananoooo
=V==
>
>>s   A   
A?*A::A?c                :    t          t          |                     S re   )r   r  )r   s    rB   analyze_budget_workbookr     s    '(:4(@(@AAArD   )r;   r	   r<   r=   )r;   r	   r<   rO   )rY   rZ   r<   r[   )r{   r|   r<   r}   )r{   r|   r<   r   )r   r   r<   r   )r   r   r<   r   )
__future__r   collections.abcr   r   decimalr   r   pathlibr   typingr	   r   rp   rq   rg   rn   r   rC   rN   rX   rz   r   r   r  r  r_   rD   rB   <module>r$     ss   " " " " " " - - - - - - - - - - - - - - - -             				  
 NMMIII ZZZ YYY   \ \ \ \      W W W W<F F F FR? ? ? ?$B B B B B BrD   