o
    $
j                     @   s   d Z ddlZddlmZmZ ddlmZ ddlmZ dZ	dZ
edd	d	Zg d
ZdddddddZeG dd dZ			dddZ		d dedededededefddZdS )!uN   Datenmodelle, Konstanten und Validierungslogik für das EEG-Abrechnungssystem.    N)	dataclassfield)datetime)Listmwil     )
 RechnungsdatumBuchungsdatumBuchungstextBeschreibungNameSteuertarifRechnungsnummerBetrag
Kassastandz/Verein zur Abrechnung von Energiegemeinschaften
1530088359zAT04 2020 2015 2002 7564	301928160AT64ZZZ00000086084u.   Sergius-Pauser-Straße 19, 3340 Waidhofen/Ybbs)namezvribanbiccreditor_idadressec                   @   s  e Zd ZU dZeed< eed< eed< eed< eed< eed< eed< eed	< eed
< eed< eed< eed< dZeed< dZeed< e	dd dZ
eed< e	dd dZeed< e	dd dZeed< e	dd dZeed< dZeed< dZeed< dZeed< d Zeed!< dZeed"< d#S )$MitglieduN   Datensatz eines EEG-Mitglieds mit Zählpunkt-, Verbrauchs- und Rechnungsdaten.IDr   SexMailStrassePLZOrtIBANBICZP_ConsumptionZP_GenerationName4Rechnungg        Consumption
Generationc                   C      t S NDEFAULT_DATE r.   r.   `/sessions/vibrant-dreamy-cray/mnt/energie-durchdacht/EEG-Abrechnung/v1.07b_upload/core/models.py<lambda>1       zMitglied.<lambda>)default_factoryStart_Cc                   C   r*   r+   r,   r.   r.   r.   r/   r0   2   r1   Ende_Cc                   C   r*   r+   r,   r.   r.   r.   r/   r0   3   r1   Start_Gc                   C   r*   r+   r,   r.   r.   r.   r/   r0   4   r1   Ende_GKostenr	   r   F	DataCheckr   
SteuersatzUIDN)__name__
__module____qualname____doc__str__annotations__r(   floatr)   r   r3   r   r4   r5   r6   r7   r   r8   boolr9   intr:   r.   r.   r.   r/   r       s2   
 r   c              
   C   s  dd }|| } ||}||}||}|| dd}|| dd}||}||}||}||	}| d|  p>d}d| fd|fd|fd	|fd
|fd|fd|fd|fd|fg	}|D ]\}}|sm| d|   S q^ztt| }|dkstt| | dkrtW n ttfy   d| d|  d Y S w t|dk s| sd| dS t|dvs| r|	 sd| dS d|vrd| dS t|dks|
 sd| d S |r| d!vrd"| d| d#S ||
}|r!ztt| d$d%}W n ttfy   d&| d| d' Y S w |d(vr!d&| d)| d*S ||}|rO|  dd}|d+rFt|d,krF|d-d. 
 sOd/| d| d0S d.S )1u  Prüft die Pflichtfelder eines Mitglieds-Datensatzes.

    Gibt einen Fehlertext zurück oder None wenn alles gültig ist.
    Wird sowohl von Abrechnungssystem.validate_member_data als auch vom
    Upload-Validator in app.py verwendet – Regeln bleiben an einer Stelle.
    c              	   S   sD   | d u rdS z
t | rW dS W n ttfy   Y nw t|  S )Nr	   )pdisna	TypeError
ValueErrorr?   strip)vr.   r.   r/   _strI   s   
z!validate_member_row.<locals>._str r	   z(ohne Namen)r   VornameNachnamezE-Mailr#   r$   r!   r"   Adresseu    fehlt für Mitglied r   g&.>uA   ID muss eine positive Ganzzahl sein (z.B. 1, 2, 3) für Mitglied z: ''   u   Ungültige IBAN für Mitglied z (Format stimmt nicht))      u   Ungültiger BIC für Mitglied u*    (muss 8 oder 11 Zeichen, Großbuchstaben)@u    Ungültige E-Mail für Mitglied z (kein '@' enthalten)   u   Ungültige PLZ für Mitglied z (4 Ziffern erwartet))r   r   u%   Ungültiges Geschlecht für Mitglied z$' (erwartet: 'm' oder 'w' oder leer),.u%   Ungültiger Steuersatz für Mitglied z ' (erlaubt: 0, 13, 20 oder leer))r         z: z (erlaubt: 0, 13, 20 oder leer)ATUrR      Nu$   Ungültige UID-Nummer für Mitglied z.' (Format: ATU + 8 Ziffern, z. B. ATU12345678))replacerH   rC   rA   absrG   rF   lenisalnumisupperisdigitlowerupper
startswith)	member_idvornamenachnamemailr   r   plzortstrassesex
steuersatzuidrJ   
iban_clean	bic_cleanplz_strort_strstrasse_strsex_strr   required_fieldsfield_labelfield_value_id_int
steuer_strs_valuid_str	uid_cleanr.   r.   r/   validate_member_row>   s   

,r|   Tkleinunternehmer
verein_uidmitglied_steuersatz	has_bezughas_einspeisungreturnc                 C   s   |sd}n| r
d}n|pd  }d| d}|sd}||fS |dkr(d}||fS |dkr2d}||fS | r:d	}||fS d}||fS )
u	  Gibt (bezug_hint, einspeisung_hint) als Strings zurück – leer = Zeile wird ausgeblendet.

    BEZUG: KU → § 6 Abs. 1 Z 27 UStG; Regelbesteuerung → 20% USt enthalten.
    EINSPEISUNG: Steuersatz 0 = kein/KU-Hinweis; 20 = Reverse Charge; 13 = § 22 UStG.
    r	   uM   Umsatzsteuerbefreit gemäß § 6 Abs. 1 Z 27 UStG (Kleinunternehmerregelung).z9Im Bezugspreis sind 20% Umsatzsteuer enthalten (UID-Nr.: z).rX   u   Übergang der Steuerschuld (Reverse Charge) gemäß § 19 Abs. 1c UStG, 20% Umsatzsteuer – zu entrichten durch den Leistungsempfänger.rW   ub   Durchschnittssteuersatz 13% gemäß § 22 UStG (pauschalierter Forst- und Landwirtschaftsbetrieb).uX   Umsatzsteuerbefreit – Einspeisung durch Privatperson (kein Unternehmer i. S. d. UStG).)rH   )r}   r~   r   r   r   
bezug_hintrm   einspeisung_hintr.   r.   r/   build_ust_hints   s6   r   )NNNNNNNNNNNN)TT)r>   pandasrD   dataclassesr   r   r   typingr   SEX_MALE
SEX_FEMALEr-   RECHNUNG_COLUMNS_AV_KONSTANTENr   r|   rB   r?   rC   tupler   r.   r.   r.   r/   <module>   sJ    

c