o
    
j&                     @   sj   d Z ddlZddlZddlmZ ddlmZ ddlmZmZ e	e
ZdefddZd	ed
dfddZdS )zIEDA-Report einlesen, Mitgliederdaten aktualisieren, KPI-Kurven berechnen.    N)datetime)load_workbook)MitgliedDEFAULT_DATEreport_pathc           '   
   C   s  z	t |ddd}W n ty( } ztd| d td W Y d}~nd}~ww |j}t|dk r;td td t||d  jdd	}|	  t|d
k rZtd td |d }|d }|d }|d }	|d }
|d }| j
dd}| j
dd}| j
d }| j
d }| j
d }| j
d }| j
d }dd }i }t|}td|D ]}|| }|| }|
| }|| }|du s|dv s|||fvst|ttfsqt|}||vri ||< ||| vrddi d|| |< || | }||d |< ||| }||	| }|r|d du r|nt|d ||d< |r.|d  du r%|nt|d  ||d < q|s;td! td | D ]\}}d} | jD ]}!|t|!jt|!jfv r[|!}  nqH| du rotd"| d# td | D ]\}}|d }"|d }|d  }||kr|"|d$pd$}#|  j|#7  _|  j|#7  _|  j|"|d$pd$7  _|r| jtkr|nt| j|| _|r| jtkr|nt| j|| _n`||kr2|"|d$pd$}$|"|d$pd$}%|  j|$|% 7  _|  j|"|d$pd$7  _|  j|$7  _|  j |%7  _ |r | j!tkr|nt| j!|| _!|r2| j"tkr+|nt| j"|| _"d| _#qsq?| jD ]}&|&j#sLt$d%|&j% d& q<t$d't| d(t&j'(|  |S ))u   Liest den EDA-Report aus Blatt 2 und aktualisiert Mitglieder-Daten sowie Gemeinschafts-KPIs.

    system: Abrechnungssystem-Instanz.
    Gibt rows2 zurück, damit _validate_eda_sheet_consistency das Workbook nicht nochmal öffnet.
    T)	data_only	read_onlyu*   EDA-Report konnte nicht geöffnet werden: u    – ABBRUCH   N   u9   EDA-Report hat weniger als 2 Tabellenblätter – ABBRUCH)values_only   u<   Blatt 2 (Energiedaten) enthält zu wenige Zeilen – ABBRUCH               EDA_direction_CCONSUMPTIONEDA_direction_G
GENERATIONEDA_EigendeckungEDA_ErzeugungEDA_OverflowEDA_GesamterzeugungEDA_Gesamtverbrauchc              	   S   J   | d u rd S t |  }dD ]}z	t||W   S  ty"   Y qw d S )N)%d.%m.%Y %H:%M:%S%d.%m.%Y %H:%M%Y-%m-%d %H:%M:%Sstrstripr   strptime
ValueErrorvsfmt r(   d/sessions/vibrant-dreamy-cray/mnt/energie-durchdacht/EEG-Abrechnung/v1.07b_upload/core/eda_reader.py_parse_date5      z$read_eda_report.<locals>._parse_dateMMTOTAL)pspevalsr1   r/   r0   u:   Blatt 2 enthält keine auswertbaren ZP-Spalten – ABBRUCHu   Zählpunkt u)    nicht in der Mitgliederliste – ABBRUCH        z	Mitglied z nicht im EDA-Filez!EDA-Report eingelesen (Blatt 2): u    Zählpunkte, Datei: ))r   	Exceptionloggererrorexit
sheetnameslenlist	iter_rowscloseconfiggetrange
isinstanceintfloatr    minmaxitems
mitgliederZP_ConsumptionZP_GenerationConsumptiontotal_eigendeckungtotal_gesamtverbrauchStart_Cr   Ende_C
Generationtotal_gesamterzeugungtotal_erzeugung_tf   total_restüberschussStart_GEnde_G	DataCheckinfoNameospathbasename)'systemr   wbesheet_namesrows2row_zprow_dirrow_psrow_perow_coderow_sumdir_cdir_gcode_eigendeckungcode_erzeugungcode_overflowcode_gesamterzeugungcode_gesamtverbrauchr*   zp_datan_colscizp_valdir_valcodevalzp_strentryr/   r0   
directionsmitglied_matchmr1   eigendeckung	erzeugungoverflowmitgliedr(   r(   r)   read_eda_report   s   






$$










!
r{   r]   returnc                    s(  ddl m} d}d}d}d}d}t||krdS || }|| }	|| }
|| }| jd	d
| jdd| jdd| jdd| jddg }tdt|D ]0}|| }|	| }|
| }|| }|r|dvr|fv r|rt|ttfr|	|||d qTfdd|D }fdd|D }fdd|D }dd }|t
|t
 |t
|t
||d D ]p	|	d }|du rqt	fdd|D }t	fdd|D }t	fdd|D }|dkr|j 	tdtd|| d  |dkr |j 	tdtd|| d  |j 	|d  |j 	|d  qfd dtd!D | _ fd"dtd!D | _fd#dtd!D | _fd$dtd!D | _d%d | jD }d&d | jD }td'tt|tdt| d d(tt|tdt| d d) |S )*u  Berechnet stündliche EVQ- und Autarkiegrad-Kurven aus der 15-Min-Zeitreihe.

    Schreibt die Ergebnisse direkt in system.hourly_eigenverbrauch / hourly_autarkiegrad /
    hourly_avg_consumption / hourly_avg_generation.
    Wird von _validate_eda_sheet_consistency() aufgerufen.
    r   )defaultdictr   r	   r   r   r   Nr   r   r   r   r    r   r   r,   )idxdirrp   c                    ,   g | ]}|d   kr|d kr|d qS rp   r   r   r(   .0c)code_erz	dir_g_valr(   r)   
<listcomp>      , z'compute_hourly_kpis.<locals>.<listcomp>c                    r   r   r(   r   )code_eig	dir_c_valr(   r)   r      r   c                    r   r   r(   r   )code_ges_verbr   r(   r)   r      r   c              	   S   r   )N)r   r   r   r   r$   r(   r(   r)   	_parse_ts   r+   z&compute_hourly_kpis.<locals>._parse_tsc                 3   *    | ]}t  | ttfr | V  qd S Nr?   r@   rA   r   rm   rowr(   r)   	<genexpr>      ( z&compute_hourly_kpis.<locals>.<genexpr>c                 3   r   r   r   r   r   r(   r)   r      r   c                 3   r   r   r   r   r   r(   r)   r      r   r2   g      Y@g      @c                    6   g | ]} | rt t | t |  d ndqS r	   Nroundsumr8   r   h)evq_bucketsr(   r)   r          (   c                    r   r   r   r   )aut_bucketsr(   r)   r      r   c                    r   r   Nr   r   )cons_bucketsr(   r)   r      r   c                    r   r   r   r   )gen_bucketsr(   r)   r      r   c                 S      g | ]}|d ur|qS r   r(   r   r%   r(   r(   r)   r          c                 S   r   r   r(   r   r(   r(   r)   r      r   u/   Stündliche EVQ berechnet – Tagesmittel EVQ: z %  |  Autarkie: z %)collectionsr}   r8   r<   r=   r>   r?   r@   rA   appendr9   r   hourrC   rB   hourly_eigenverbrauchhourly_autarkiegradhourly_avg_consumptionhourly_avg_generationr4   rT   r   )rY   r]   r}   IDX_DATA_STARTIDX_ZPIDX_DIRIDX_CODEIDX_SUM_PREr^   r_   rb   row_sum_pre	data_colsrm   zpdirnrp   preerz_colseig_colsges_verb_colsr   tserz_tfeigges_verbvals_evqvals_autr(   )
r   r   r   r   r   r   r   r   r   r   r)   compute_hourly_kpis   s   
$
$



r   )__doc__loggingrV   r   openpyxlr   core.modelsr   r   	getLogger__name__r4   r    r{   r9   r   r(   r(   r(   r)   <module>   s    
 