o
    
j&                  	   @   s   d Z ddlZddlZddlZddlmZmZmZm	Z	 e
eZ		ddedededefdd	Zdedefd
dZdededdfddZdd ZdededdfddZdS )uW   DOCX-Rechnungserstellung: Template befüllen, Platzhalter ersetzen, Akzentfarbe setzen.    N)MitgliedSEX_MALE
SEX_FEMALEDEFAULT_DATEmitgliedtemplate_pathoutput_pathreturnc              
   C   s  ddl m} |du rEtj| jd| jdd}tj|r!|}n$tjtj	tj
tddd}tj|rC|}td	|  n|}tj|sRtd
| |du rgtj| jd|j d|j d}tj
|}z^||}| |}t|| }	|	dur|	|d< || || t| jdd }
|
rzt||
 W n ty } ztd|  W Y d}~nd}~ww tdtj|  |W S  ty } ztd|j d|   d}~ww )u   Rendert eine Rechnung aus dem DOCX-Template via docxtpl.

    system: Abrechnungssystem-Instanz (liefert config, folder_rechnungen, _build_docx_context).
    Gibt den absoluten Pfad der geschriebenen DOCX-Datei zurück.
    r   )DocxTemplateNConfigFile_Rechnungsvorlage_DOCXzRechnung_Default.docxz..sepa_templatesu=   DOCX-Template aus Config/ nicht gefunden – nutze Built-in: zDOCX-Template nicht gefunden: 	Rechnung__z.docxlogoAccent_Color z,Akzentfarbe konnte nicht angewendet werden: zDOCX-Rechnung erstellt: u    Fehler beim DOCX-Rendering für : )docxtplr
   ospathjoin	main_pathconfiggetexistsdirnameabspath__file__loggerinfoFileNotFoundErrorfolder_rechnungenRechnungsnummerName4Rechnung_build_docx_context_build_logo_imagerendersavestrstrip_apply_accent_color	ExceptionwarningbasenameerrorName)systemr   r   r   r
   primarybuiltindoccontextlogo_imgaccente r9   f/sessions/vibrant-dreamy-cray/mnt/energie-durchdacht/EEG-Abrechnung/v1.07b_upload/core/invoice_docx.pyrender_invoice_docx   s^   



r;   c              
   C   s   t j| jd| jd }t j| jd|j d|j d}t j|}t j	dkr.|
dd}z'd	d
lm} ||ddd}|j}t||| j| j| j || |  |W S  tyn } ztd|j d|   d}~ww )u   Füllt die Excel-Vorlage (Legacy-Pfad) mit Mitgliedsdaten und speichert sie.

    Gibt den absoluten Pfad der geschriebenen XLSX-Datei zurück.
    r   File_Rechnungsvorlager   r   z.xlsxnt/\r   )load_workbookF)	read_only
keep_linksu%   Fehler beim Füllen der Vorlage für r   N)r   r   r   r   r   r"   r#   r$   r   namereplaceopenpyxlr@   active_replace_placeholdersdatum_rechnungdatum_abbuchungr(   closer,   r   r/   r0   )r1   r   r   r   _lwwbwsr8   r9   r9   r:   fill_templateR   s2   

rN   r   c              
   C   s$  ddl m} i d|d d|d d|d d|d	 d
|d	 d|d d|d d|ddd|d d|d d|d dt|ddd|ddd|jrW|jn|jd|jd|jd|ji d|j	d|
d d!|
d d"|jtkrd#n|jtkrd$nd%d&|jd't|jr|jd(d) nd*d+|jdkr|j
d n|j
d d,|jdkr|j
d n|j
d d-|jdkr|jd.nd/d0|d1 d2d3d4|jdkr|jt|d1 d3d2 d5nd/d6t|jr|jd(d) nd*d7|jdkr
|j
d n|j
d d8|jdkr|j
d n|j
d d9|jdkr1d:|jd.nd/d;|d< d2d3d=|jdkrTd:|jt|d< d3d2 d5nd/|jd5||jd>}|  D ](}|D ]"}|jrt|jtr| D ]\}	}
|j|	t|
|_q|qkqgd)S )?z0Ersetzt alle [Platzhalter] in der Excel-Vorlage.r   )	mask_ibanz[Vereinsname]Vereinsnamez[Vereinsstrasse]Vereinsstrassez[Vereinsadresse]z[Vereinsort]
Vereinsortz	[PLZ_Ort]z[SEPA_IBAN]	SEPA_IBANz[VereinsIBAN]z
[SEPA_BIC]SEPA_BICr   z[Bank]Bankz[SEPA_Creditor_ID]SEPA_Creditor_IDz[Creditor_ID]z[ZVR]ZVRz[Mail_Adresse]Mail_Adressez[Anschrift]u	   [Straße]z[PLZ]z[Ort]z[Rechnungsnummer]z[Rechnungsdatum]z%d.%m.%Yu   [Fälligkeitsdatum]z[Anrede]LieberLiebezLiebe/rz[Name]z[Consumption aktiv]iN-z[Consumption von]z[Consumption bis]z[Consumption]z.1f0z[Tarif Bezug]Tarif_Bezug.,z[Kosten Consumption]z.2fz[Generation aktiv]z[Generation von]z[Generation bis]z[Generation]z- z[Tarif Einspeisung]Tarif_Einspeisungz[Kosten Generation])z[Gesamtkosten]z[Kontonummer]) 
core.utilsrO   r   r)   r$   r0   StrassePLZOrtr#   strftimeSexr   r   pdnotnaZP_ConsumptionConsumptionStart_CStart_GEnde_CEnde_GrD   floatZP_Generation
GenerationKostenIBAN	iter_rowsvalue
isinstanceitems)rM   r   r   rH   rI   rO   replacementsrowcellplaceholderreplacementr9   r9   r:   rG   p   s   	







!"#
'
)
,
/01"59rG   c              
   C   s  |j ddp|j dd}t| }|sdS g }tj|r&|| n|tj|j	d| |tj|j	| t
dd |D d}|du rVtd| d	 dS zd
dlm} d
dlm} || ||ddW S  ty } ztd| d|  W Y d}~dS d}~ww )u\   Erstellt ein docxtpl InlineImage-Objekt für das Vereinslogo, oder None wenn nicht gefunden.	Logo_Pathr   Logo_FilenameNr   c                 s   s     | ]}t j|r|V  qd S N)r   r   r   ).0pr9   r9   r:   	<genexpr>   s    z$_build_logo_image.<locals>.<genexpr>z%Logo-Datei nicht gefunden (probiert: z).r   )InlineImage)Mm   )widthz"Logo konnte nicht geladen werden (z): )r   r   r)   r*   r   r   isabsappendr   r   nextr   r-   r   r   docx.sharedr   r,   )r4   r1   logo_cfg
candidates	logo_pathr   r   r8   r9   r9   r:   r&      s,   r&   	docx_path	hex_colorc                    s   ddl m} ddlm} | d}t|dks"tdd |D s)td||t	|dd	 d
t	|d	d d
t	|dd d
|| }g dfdd |j
D ]} | qV fdd|jD ]}| qg||  dS )uM   Setzt die Akzentfarbe auf ausgewählte Text-Runs im bereits gerenderten DOCX.r   )Document)RGBColor#   c                 s   s    | ]}|d v V  qdS )0123456789abcdefABCDEFNr9   )r   cr9   r9   r:   r      s    z&_apply_accent_color.<locals>.<genexpr>u   Ungültige Hex-Farbe:          )RECHNUNGGesamtkostenKostenaufstellungc                    s0   | j D ] t fddD r jj_qd S )Nc                 3   s&    | ]}|   jpd   v V  qdS )r   N)lowertext)r   mkrunr9   r:   r      s   $ zK_apply_accent_color.<locals>._colorize_runs_in_paragraph.<locals>.<genexpr>)runsanyfontcolorrgb)r   )accent_markersr   r   r:   _colorize_runs_in_paragraph   s
   

z8_apply_accent_color.<locals>._colorize_runs_in_paragraphc                    sD   | j D ]}|jD ]}|jD ]} | q|jD ]}| qqqd S r   )rowscells
paragraphstables)try   rz   r   nested)r   _walk_tabler9   r:   r      s   





z(_apply_accent_color.<locals>._walk_tableN)docxr   r   r   r*   lstriplenall
ValueErrorintr   r   r(   )r   r   _Docr   hr4   r   r   r9   )r   r   r   r   r:   r+      s   6



r+   )NN)__doc__r   loggingpandasrg   core.modelsr   r   r   r   	getLogger__name__r   r)   r;   rN   dictrG   r&   r+   r9   r9   r9   r:   <module>   s*    

FD