o
    
jR(                     @   s   d Z ddlZddlZddlZddlZddlmZmZmZ ddlm	Z	m
Z
 ddlmZmZ eeZd!ddZd!d	d
Zd"dedefddZdefddZdefddZdeddfddZd!ddZde	fddZde	deddfddZde	deddfdd ZdS )#zBSEPA-XML-Erstellung: Lastschrift (SepaDD) und Gutschrift (SepaCT).    N)datetimedate	timedelta)SepaCTSepaDD)_AV_KONSTANTENMitgliedreturnc                 C   sJ  zt | j dd | jD }|std W dS t|  t| \}}}| jd |||d}t }t	| j
dd }|sBtd	 t|}|jt| d
dp[| jd  d| j d| t | jd |d |jd| j dt  | j| jd | jd | jd | jd d t|ddD ]@\}	}
z#|j|
j|
j|
j|
j|
jt | jd  d| j d|
j |	d W q ty } zt d|
j d|   d}~ww | jd  dt !d d}t"j#$| j|}|%| td|  W dS  t&t't(fy } z
t d| d  d}~w ty$ } z
t d| d  d}~ww )ut   Erstellt die SEPA-Lastschrift-XML für Mitglieder mit positiven Kosten.

    system: Abrechnungssystem-Instanz.
    c                 S   s   g | ]	}|j d kr|qS r   Kosten.0m r   core/sepa_handler.py
<listcomp>       z/create_sepa_xml_lastschrift.<locals>.<listcomp>u0   Keine Mitglieder für SEPA-Lastschrift gefunden.NVereinsname)nameIBANBICcreditor_idZVR uA   ZVR-Nummer fehlt – SEPA-Lastschrift-XML wird ohne ZVR erstellt.	_ls_msgidz-LS--)
message_idcreation_datetimeinitiating_party_namer   zLastschrift-	SEPA_IBANSEPA_BICSEPA_Creditor_ID)
payment_idrequested_execution_datecreditor_namecreditor_ibancreditor_bicr      )start)amountdebtor_namedebtor_iban
debtor_bic
mandate_idmandate_date	referenceidu!   Fehler bei SEPA-Transaktion für : z-SEPA_Lastschrift_%Y-%m-%d.xmlzSEPA-Lastschrift-XML erstellt: zSEPA-Lastschrift Fehler:     – ABBRUCHz)Unbekannter Fehler bei SEPA-Lastschrift: ))_validate_sepa_folderfolder_sepa
mitgliederloggerinfo_validate_sepa_config	_sepa_idsconfig_random_suffixstrgetstripwarningr   add_group_headergetattrperioder   nowadd_payment_infodatum_abbuchung	enumerateadd_transactionr   Namer   r   IDr   todayRechnungsnummer	ExceptionerrorstrftimeospathjoinexportFileNotFoundErrorPermissionError
ValueError)systemlastschrift_mitglieder_iban_bic	_creditorsepa_configrandom_suffixzvrsepaidxmitgliedeoutput_filenameoutput_pathr   r   r   create_sepa_xml_lastschrift   s   


	


rg   c              
   C   s   zLt | j dd | jD }|std W dS t|  t| }t|||  tj	
| j| jd  dt d d}t|||  td	|  W dS  tttfye } z
td
| d  d}~w tyz } z
td| d  d}~ww )u   Erstellt die SEPA-Gutschrift-XML (Credit Transfer) für Mitglieder mit negativen Kosten.

    system: Abrechnungssystem-Instanz.
    c                 S   s   g | ]	}|j d k r|qS r
   r   r   r   r   r   r   d   r   z.create_sepa_xml_gutschrift.<locals>.<listcomp>u/   Keine Mitglieder für SEPA-Gutschrift gefunden.Nr   z-SEPA_Gutschrift_r3   r4   zSEPA-Gutschrift-XML erstellt: zSEPA-Gutschrift Fehler: r5   z(Unbekannter Fehler bei SEPA-Gutschrift: )r6   r7   r8   r9   r:   r;   _create_sepa_ct_object_add_gutschrift_transactionsrR   rS   rT   r=   r   rF   rQ   _export_sepa_ctrV   rW   rX   rP   rO   )rY   gutschrift_mitgliedersepa_ctrf   rd   r   r   r   create_sepa_xml_gutschrift\   s4   

rm      kc                 C   s   d tjd| dS )u?   Erzeugt einen zufälligen alphanumerischen Suffix der Länge k.r   >abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ro   )rT   randomchoicesrq   r   r   r   r>      s   r>   c                 C   sF   t | rtd td td fS | jdd| jdd| jddfS )u^   Gibt (IBAN, BIC, Creditor_ID) zurück – im AV-Modus aus den AV-Konstanten, sonst aus Config.ibanbicr   r    r   r!   r"   )_is_av_moder   r=   r@   rY   r   r   r   r<      s   r<   c                 C   s$   | j d| j dd  dkS )z.True wenn Abbuchungsmodus = abrechnungsverein.Abbuchung_Modusabbuchung_modusueberweisungabrechnungsverein)r=   r@   rA   lowerrw   r   r   r   rv      s
   
rv   sepa_folderc                 C   s:   t j| std|  t | t jstd|  dS )u7   Prüft ob der SEPA-Ordner existiert und schreibbar ist.zSEPA-Ordner existiert nicht: u&   Keine Schreibrechte für SEPA-Ordner: N)rR   rS   existsrV   accessW_OKrW   )r}   r   r   r   r6      s
   r6   c           	      C   s   t | \}}}| jd| jdd  }| jdddd f| jddd	d f| jd
ddd fd}|dkrT|dd f|d< |dd f|d< |dd f|d< | D ]\}\}}|sgtd| ||sutd| d| qXdS )u   Prüft ob alle SEPA-Konfigurationswerte gültig sind.

    Im AV-Modus werden IBAN/BIC/Creditor_ID nicht geprüft (kommen aus _AV_KONSTANTEN).
    rx   ry   rz   r   r   c                 S      t |  S NboolrA   xr   r   r   <lambda>       z'_validate_sepa_config.<locals>.<lambda>Vereinsstrassec                 S   r   r   r   r   r   r   r   r      r   
Vereinsortc                 S   r   r   r   r   r   r   r   r      r   )r   r   r   eigenes_kontoc                 S   s$   t | dddko| dd S )N r      )lenreplaceisalnumr   r   r   r   r      s   $ r    c                 S   s   t | dv o|  o|  S )N)      )r   r   isupperr   r   r   r   r      s    r!   c                 S   s   |   o	t| dkS )N#   )r   r   r   r   r   r   r      s    r"   zFehlende SEPA-Konfiguration: u   Ungültige SEPA-Konfiguration: z = N)r<   r=   r@   rA   r|   itemsrX   )	rY   rt   ru   creditorry   required_fieldsfieldvalue	validatorr   r   r   r;      s*   r;   c                 C   s   t i d}|jt| ddp| jd  d| j dt  t d | jd }|d	d
^}}d		|}|j
d| j dt  | jtd
d | jd | jd ||dt| d t| d
 d |S )u?   Erstellt und konfiguriert ein SEPA-CT-Objekt für Gutschriften.)r=   	_gs_msgidNr   z-GS-r   )r   r   r   r   r(   zGutschrift-)daysr   )Vereinsadresser   PLZr   )r#   r$   r+   debtor_addressr,   r-   )r   rC   rD   r=   rE   r>   r   rF   splitrT   rG   rH   r   r<   )rY   rl   plz_ortplz	ort_teileortr   r   r   rh      s*   




rh   rl   rk   c                 C   s   |D ]t}zSt t|j}t|rtd|j d W q|jr#|j	s.t|j d W q| j
||j|j|j|jd|j|j	|jd  d|j d|j d|j |jd W q tyv } ztd|j d	| d W Y d
}~qd
}~ww d
S )u8   Fügt Gutschrift-Transaktionen zum SEPA-CT-Objekt hinzu.u   Ungültiger Betrag (NaN) für u    – überspringe.u.    hat keine gültige IBAN/BIC – überspringe.)Strasser   Ortr   r   )r*   r%   creditor_addressr&   r'   r0   r1   u   Fehler bei Transaktion für r2   N)absfloatr   mathisnanr9   rP   rK   r   r   rJ   Name4Rechnungr   r   r   r=   rL   rE   rN   rO   )rl   rk   rY   rc   r*   rd   r   r   r   ri      s>   

ri   rf   c              
   C   sV   z| j ||jd |jd |jd dd W dS  ty* } ztd| d}~ww )z,Exportiert das SEPA-CT-Objekt als XML-Datei.r   r   r   )r   r   )r   initiating_party_addressz-Fehler beim Exportieren der SEPA-Gutschrift: N)rU   r=   rO   IOError)rl   rf   rY   rd   r   r   r   rj      s   rj   )r	   N)rn   ) __doc__loggingr   rR   rr   r   r   r   SEPAr   r   core.modelsr   r   	getLogger__name__r9   rg   rm   intr?   r>   tupler<   r   rv   r6   r;   rh   listri   rj   r   r   r   r   <module>   s&    


M$
!