o
    ëšjèÇ  ã                   @   sØ  d dl Z d dlZd dlZd dlmZmZmZmZmZm	Z	m
Z
mZ d dlmZmZ d dlmZ d dlmZmZmZ d dlmZmZ d dlmZ d dlmZmZmZmZ d d	lm Z  d d
l!m"Z" d dl#m$Z$ d dl%m&Z& d dl'm(Z) d dl*m+Z+m,Z,m-Z-m.Z.m/Z/ d dl0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9 d dl:m;Z; d dlm<Z< d dl=m>Z> d dl0m?Z? d dl@mAZA d dlBmCZC d dlDmEZE d dlFZFd dl8mGZG d dlHmIZI d dlJmKZKmLZLmMZMmNZN d dl:m;Z; d dlOmPZP d dl6m7Z7mQZQ d d lRmSZS d d!lTmUZU d d"lmZ d d#lVmWZWmXZX d d$lVmXZXmWZW d d%lYmZZZm[Z[ d d&lmZmZ d d	lm Z  d d'lYm[Z[mZZZ d d$lVmXZXmWZW d d&lmZmZ e[ƒ Z\eXd(d)„ ƒd*d+„ ƒZ]d d,lYmZZZm^Z^m[Z[ d d-lmZmZ d d.lVmWZW e[ƒ Z\eWd/d0„ ƒZ_G d1d2„ d2e$eƒZ`d dl Z d d3lmZmZ d dl%m&Z& d dlmZ d d4lmZ d dl#m$Z$ d dl2m3Z3 d dlBmCZC G d5d6„ d6e$eƒZaejb ceEjdd7d8¡Zed9Zfz$eS geUefejb ceed:¡ƒ¡ eS geUef› d;�ejb ceed<¡ƒ¡ ef› d;�ZhW n ei�yó   d=Zfd>ZhY nw G d?d@„ d@e$eƒZjG dAdB„ dBejƒZkG dCdD„ dDejƒZlG dEdF„ dFe$eƒZmG dGdH„ dHe$eƒZnG dIdJ„ dJe$eƒZoG dKdL„ dLe$eƒZpG dMdN„ dNepƒZqG dOdP„ dPe$eƒZrdQdR„ ZsdSdT„ ZtdUeudVevdWeufdXdY„ZwG dZd[„ d[e$eƒZxd\d]„ Zyd^dT„ Ztd_d`„ ZzdS )aé    N)ÚQÚSumÚCaseÚWhenÚIntegerFieldÚ	CharFieldÚFÚDecimalField©ÚDecimalÚInvalidOperation)ÚHttpResponseRedirect)Úget_object_or_404ÚredirectÚrender)ÚreverseÚreverse_lazy)Ú
make_aware)Ú
CreateViewÚ
DetailViewÚListViewÚView)Úmessages)ÚPermissionDenied)ÚLoginRequiredMixin)Ú	TruncDate)Úgettext_lazy)ÚSimpleDocTemplateÚTableÚ
TableStyleÚ	ParagraphÚSpacer)ÚNewTransactionForm)ÚAccount)ÚA4)ÚgetSampleStyleSheet©Útimezone)Úcolors)ÚHttpResponse)ÚPaymentVerification)ÚPaymentVerificationForm)Ú	send_mail)ÚTransaction)Úsettings)Útranslation)Útransaction)ÚurlparseÚ	urlencodeÚ	parse_qslÚ
urlunparse)Úmm)r%   ÚParagraphStyle)Ú
pdfmetrics)ÚTTFont)r   )Úlogin_requiredÚuser_passes_test)r:   r9   )ÚloginÚget_user_model)r   r   )r<   r;   c                 C   ó   | j S ©N)Úis_staff)Úu© rA   úFC:\Users\Uzivatel\Documents\attachments\prilohy\bp_ib\banking\views.pyÚ<lambda>6   s    rC   c                 C   s`   t t|d�}| jj}d|_t| |ƒ || jd< |j| jd< d| jd< d| jd< | j ¡  tdƒS )	N©Úpkú)django.contrib.auth.backends.ModelBackendÚimpersonate_original_idÚimpersonate_user_idTÚis_impersonatingÚimpersonate_read_onlyÚaccount_list)	r   ÚUserÚuserrE   Úbackendr;   ÚsessionÚsaver   )ÚrequestÚuser_idÚtargetZorig_admin_idrA   rA   rB   Úimpersonate_user6   s   




rT   )r;   Úlogoutr<   )r   r   )r9   c                 C   sŽ   | j  d¡}|st| ƒ tdƒS tt|d�}t| ƒ | j  ¡  d|_t| |ƒ | j  	dd¡ | j  	dd¡ | j  	dd¡ | j  	dd¡ td	ƒS )
uL   
    UkonÄ�Ã­ impersonÃ¡ciu â€“ admin je kompletne prihlÃ¡senÃ½ spÃ¤Å¥.
    rG   z/admin/rD   rF   rH   NrI   rJ   z/admin/auth/user/)
rO   ÚgetrU   r   r   rL   ÚflushrN   r;   Úpop)rQ   Zorig_idZ
admin_userrA   rA   rB   Ústop_impersonationW   s   

rY   c                       s0   e Zd ZeZdZdZdd„ Z‡ fdd„Z‡  Z	S )ÚAccountsListViewÚaccountszbanking/account_list.htmlc                 C   ó   t jj| jjd�S ©N)rM   ©r#   ÚobjectsÚfilterrQ   rM   ©ÚselfrA   rA   rB   Úget_queryset‰   ó   zAccountsListView.get_querysetc                    s  ddl m} ddlm} tƒ jd7i |¤Ž}d|d< |d }tjj|d�j	t
dƒd	�d
 p-d}tjj|d�j	t
dƒd	�d
 p>d}t|ƒ|d< t|ƒ|d< t|jddd�ƒ‰ | ¡ ‰tjjtˆ d�tˆ d�B ˆd� dd¡}‡ fdd„}	‡ fdd„}
ˆtjdd� ‰‡‡fdd„|D ƒ}|tƒ‰|tƒ‰|D ]%}|j ¡ }|	|ƒrªˆ|  t|jƒ7  < |
|ƒr¹ˆ|  t|jƒ7  < q”‡fdd„tdƒD ƒ}dd„ |D ƒ|d < ‡fd!d„|D ƒ|d"< ‡fd#d„|D ƒ|d$< d%d&„ }|d'ˆƒ}t |d d |d d( d(¡‰‡fd)d„|D ƒ}|tƒ‰|tƒ‰|D ]+}|jj|jjf}|	|ƒ�r)ˆ|  t|jƒ7  < |
|ƒ�r9ˆ|  t|jƒ7  < �qd*d„ |D ƒ}||d+< ‡fd,d„|D ƒ|d-< ‡fd.d„|D ƒ|d/< |d0d … }d1d„ |D ƒ|d2< ‡fd3d„|D ƒ|d4< ‡fd5d„|D ƒ|d6< |S )8Nr   ©Údefaultdictr&   TZis_accounts_list_pager[   )Z	payer__inÚamount©Útotalri   )Zbeneficiary__inZprofile_expenses_totalZprofile_income_totalÚid)Úflat)Zpayer_id__in)Zbeneficiary_id__in©Zcreated__date__lteÚpayerÚbeneficiaryc                    ó
   | j ˆ v S r>   )Úbeneficiary_id©Útx©Úaccount_idsrA   rB   Ú	is_income±   ó   
z4AccountsListView.get_context_data.<locals>.is_incomec                    ro   r>   )Úpayer_idrq   rs   rA   rB   Ú
is_expense´   rv   z5AccountsListView.get_context_data.<locals>.is_expenseé   ©Údaysc                    ó.   g | ]}ˆ |j  ¡   krˆkrn n|‘qS rA   ©ÚcreatedÚdate©Ú.0Út©Ústart_30ÚtodayrA   rB   Ú
<listcomp>¹   s   . z5AccountsListView.get_context_data.<locals>.<listcomp>c                    s   g | ]
}ˆ t j|d � ‘qS ©rz   )ÚdatetimeÚ	timedelta©r�   Úi)r„   rA   rB   r†   Å   ó    é   c                 S   ó   g | ]}|  d ¡‘qS ©z%d.%m.©Ústrftime©r�   ÚdrA   rA   rB   r†   Æ   ó    Zpchart_30_labelsc                    ó   g | ]}ˆ   |d ¡‘qS ©g        ©rV   r’   )Ú
inc_by_dayrA   rB   r†   Ç   ó    Zpchart_30_incomec                    r•   r–   r—   r’   )Ú
exp_by_dayrA   rB   r†   È   r™   Zpchart_30_expensesc                 S   sV   |j |j}}g }t| ƒD ]}| ||f¡ |d8 }|dkr$d}|d8 }q| ¡  |S ©Né   r   é   ©ÚyearÚmonthÚrangeÚappendr   )ÚnÚendÚyÚmÚresÚ_rA   rA   rB   Úlast_n_monthsË   s   €z8AccountsListView.get_context_data.<locals>.last_n_monthsr�   rœ   c                    ó   g | ]}|j  ¡ ˆ kr|‘qS rA   r}   r€   ©Ústart_12rA   rB   r†   Û   ó    c                 S   ó    g | ]\}}|d ›d|› �‘qS ©Ú02dú/rA   ©r�   r¥   r¦   rA   rA   rB   r†   ç   ó     Zpchart_12_labelsc                    ó    g | ]\}}ˆ   ||fd ¡‘qS r–   r—   r²   ©Úinc_by_monthrA   rB   r†   é   ó    ÿZpchart_12_incomec                    r´   r–   r—   r²   ©Úexp_by_monthrA   rB   r†   ì   r·   Zpchart_12_expenseséúÿÿÿc                 S   r®   r¯   rA   r²   rA   rA   rB   r†   ò   r³   Zpchart_6_labelsc                    r´   r–   r—   r²   rµ   rA   rB   r†   ó   r·   Zpchart_6_incomec                    r´   r–   r—   r²   r¸   rA   rB   r†   ö   r·   Zpchart_6_expensesrA   )Úcollectionsrf   Údjango.utilsr'   ÚsuperÚget_context_datar-   r_   r`   Ú	aggregater   ÚfloatÚlistÚvalues_listÚ	localdater   Úselect_relatedrˆ   r‰   r~   r   rg   r¡   rŸ   r    )rb   Úkwargsrf   r'   Úcontextr[   Úexpenses_totalÚincome_totalZtx_allru   rx   Útx_30r‚   r“   r{   r©   Ú	months_12Útx_12ÚkeyÚ	labels_12Úmonths_6©Ú	__class__)rt   rš   r¹   r˜   r¶   r¬   r„   r…   rB   r¾   �   s˜   ÿÿýÿÿýþû
€


€

ÿ

ÿ

ÿ

ÿz!AccountsListView.get_context_data)
Ú__name__Ú
__module__Ú__qualname__r#   ÚmodelÚcontext_object_nameÚtemplate_namerc   r¾   Ú__classcell__rA   rA   rÏ   rB   rZ   „   s    rZ   ©r   r   )r   c                       s4   e Zd ZeZdZdZdZdd„ Z‡ fdd„Z	‡  Z
S )ÚAccountDetailViewÚaccountzbanking/account_detail.htmlÚslugc                 C   r\   r]   r^   ra   rA   rA   rB   rc     rd   zAccountDetailView.get_querysetc           .         s>  ddl m}m} ddlm} ddlm} ddlm‰ m	‰ dd l
‰ddlm} tƒ jd`i |¤Ž}|d ‰| j}|j}	d|	v }
|
rLd	}d	}d	}d	}d	}d	}n6|	 d
¡pRd	 ¡ }|	 d¡p[d	 ¡ }|	 d¡pdd	 ¡ }|	 d¡pmd	 ¡ }|	 d¡pvd	 ¡ }|	 d¡pd	 ¡ }|	 d¡pˆd ¡ }tj |ˆd�|ˆd�B ¡}|
�s|r¶zˆj |¡}|j|d�}W n	 tyµ   Y nw |rÐzˆj |¡}|j|d�}W n	 tyÏ   Y nw |rß| ||d�||d�B ¡}dtf‡ ‡fdd„}||ƒ}||ƒ}|d urû|j|d�}|d u�r|j|d�}|dk�r|jˆd�}n|dk�r|jˆd�}|dv �rp|jttˆtd ƒ d!�td ƒtd"d#d$�d%�ttˆd&d!�dtƒ d%�d'�}|d k�rQ|  d(d)¡}n2|d*k�r]|  d+d)¡}n&|d,k�ri|  d-d)¡}n|  d.d)¡}nd/d)d0d1d2œ}| |d)¡}|  |d)¡}tjjˆd�j!|d ƒd3�d4 �p”d}tjjˆd�j!|d ƒd3�d4 �p¦d}d5d6g|d7< t"|ƒt"|ƒg|d8< | #¡ ‰
tjj|ˆd�|ˆd�B ˆ
d� $d9d:¡}‡fd;d<„}‡fd=d>„}ˆ
ˆj%d?d@� ‰	‡	‡
fdAdB„|D ƒ}|t"ƒ‰|t"ƒ‰|D ](} | j& ¡ }!|| ƒ�rˆ|!  t"| j'ƒ7  < || ƒ�rˆ|!  t"| j'ƒ7  < �q÷‡‡	fdCdB„t(dDƒD ƒ}"dEdB„ |"D ƒ|dF< ‡fdGdB„|"D ƒ|dH< ‡fdIdB„|"D ƒ|dJ< dKdL„ }#|#d"ˆ
ƒ}$ˆ |$d d |$d d& d&¡‰‡fdMdB„|D ƒ}%|t"ƒ‰|t"ƒ‰|%D ]+} | j&j)| j&j*f}&|| ƒ�r�ˆ|&  t"| j'ƒ7  < || ƒ�r ˆ|&  t"| j'ƒ7  < �qvdNdB„ |$D ƒ}'‡fdOdB„|$D ƒ}(‡fdPdB„|$D ƒ})|'|dQ< |(|dR< |)|dS< |$dTd … }*dUdB„ |*D ƒ}+‡fdVdB„|*D ƒ},‡fdWdB„|*D ƒ}-|+|dX< |,|dY< |-|dZ< ||d[< ||d
< ||d< ||d< ||d< ||d< ||d< ||d< |d\d]ˆj+id^�|d_< |S )aNr   rØ   )r   r&   r
   re   rÚ   ÚclearÚ Úbeneficiary_qÚ	date_fromÚdate_toÚ
amount_minÚ
amount_maxÚtx_directionÚsortú-date©rm   ©rn   ©Zcreated__date__gterl   ©Zpayer__iban__icontains©Zbeneficiary__iban__icontainsÚvalc                    s0   | sd S z	ˆ |   dd¡ƒW S  ˆy   Y d S w ©Nú,Ú.)Úreplace©rë   r
   rA   rB   Ú
to_decimalV  s   ÿz6AccountDetailView.get_context_data.<locals>.to_decimal©Zamount__gte©Zamount__lteÚsentÚreceived)rg   ú-amountÚtypez-typerg   )rm   Úthenr�   é   )Ú
max_digitsÚdecimal_places)ÚdefaultÚoutput_fieldrœ   )Úsigned_amountÚtx_kindrþ   ú-createdrö   z-signed_amountr÷   rÿ   z-tx_kindr~   Zbeneficiary__ibanz-beneficiary__iban)r   rå   Úibanz-ibanrh   ri   ZexpensesZincomeZbeneficiariesZamountsrm   rn   c                    ó   | j ˆ jkS r>   )rp   rj   rq   ©rÚ   rA   rB   ru   ´  ó   z5AccountDetailView.get_context_data.<locals>.is_incomec                    r  r>   )rw   rj   rq   r  rA   rB   rx   ·  r  z6AccountDetailView.get_context_data.<locals>.is_expensery   rz   c                    r|   rA   r}   ©r�   rr   rƒ   rA   rB   r†   ¼  s    ÿ
ÿÿz6AccountDetailView.get_context_data.<locals>.<listcomp>c                    s   g | ]
}ˆˆ j |d � ‘qS r‡   )r‰   rŠ   )rˆ   r„   rA   rB   r†   Ê  rŒ   r�   c                 S   rŽ   r�   r�   r’   rA   rA   rB   r†   Ë  r”   Zchart_30_labelsc                    r•   r–   r—   r’   )Úincome_by_dayrA   rB   r†   Ì  r™   Zchart_30_incomec                    r•   r–   r—   r’   )Úexpenses_by_dayrA   rB   r†   Í  r™   Zchart_30_expensesc                 S   sT   |j }|j}g }t| ƒD ]}| ||f¡ |d8 }|dkr#d}|d8 }q| ¡  |S r›   rž   )r£   Zend_dater¥   r¦   Úresultr¨   rA   rA   rB   r©   Ð  s   €z9AccountDetailView.get_context_data.<locals>.last_n_monthsc                    rª   rA   r}   r  r«   rA   rB   r†   á  r­   c                 S   r®   r¯   rA   r²   rA   rA   rB   r†   í  r³   c                    r´   r–   r—   r²   ©Úincome_by_monthrA   rB   r†   î  r³   c                    r´   r–   r—   r²   ©Úexpenses_by_monthrA   rB   r†   ï  r³   Zchart_12_labelsZchart_12_incomeZchart_12_expensesrº   c                 S   r®   r¯   rA   r²   rA   rA   rB   r†   ÷  r³   c                    r´   r–   r—   r²   r	  rA   rB   r†   ø  r³   c                    r´   r–   r—   r²   r  rA   rB   r†   ù  r³   Zchart_6_labelsZchart_6_incomeZchart_6_expensesZall_transactionsÚtransaction_createrÛ   ©rÅ   Z
new_tx_urlrA   ),Údjango.db.modelsr   r   Údjango.urlsr   r¼   r'   Údecimalr   r   rˆ   r»   rf   r½   r¾   rQ   ÚGETrV   Ústripr-   r_   r`   r   ÚfromisoformatÚ
ValueErrorÚstrÚannotater   r   r   r	   r   Úorder_byr¿   rÀ   rÃ   rÄ   r‰   r~   rg   r¡   rŸ   r    rÛ   ).rb   rÅ   r   r   r   r'   rf   rÆ   rQ   ÚparamsZis_clearrÞ   rß   rà   rá   râ   rã   rä   ÚqsÚd_fromÚd_torñ   Úmin_valÚmax_valZsort_mapr  rÇ   rÈ   Zall_for_chartsru   rx   rÉ   rr   r“   r{   r©   rÊ   rË   rÌ   rÍ   Z	income_12Zexpenses_12rÎ   Zlabels_6Zincome_6Z
expenses_6rÏ   )r   r   rÚ   rˆ   r  r  r  r
  r¬   r„   r…   rB   r¾     sJ  ÿÿÿÿÿ




ý
ýú


üÿüÿþüþûÿ


€


€

ÿz"AccountDetailView.get_context_data)rÑ   rÒ   rÓ   r#   rÔ   rÕ   rÖ   Ú
slug_fieldrc   r¾   r×   rA   rA   rÏ   rB   rÙ     s    rÙ   ÚstaticZfontsZ
DejaVuSanszDejaVuSans.ttfz-BoldzDejaVuSans-Bold.ttfZ	HelveticazHelvetica-Boldc                   @   sV   e Zd ZdZdZdd„ Zdd„ Zdd„ Zdd
ede	fdd„Z
defdd„Zdd„ Zd	S )ÚBaseAccountStatementPDFViewuœ   
    SpoloÄ�nÃ½ zÃ¡klad pre PDF vÃ½pisy ÃºÄ�tu.
    VizuÃ¡l napodobÅˆuje webovÃº aplikÃ¡ciu "VirtualBank" z fotiek,
    bez zasahovania do inej logiky.
    rÝ   c                 C   s   t t| jd | jjd�S )NrÛ   ©rÛ   rM   )r   r#   rÅ   rQ   rM   ra   rA   rA   rB   Úget_account#  s
   ýz'BaseAccountStatementPDFView.get_accountc                 C   s   t ‚)uv   
        TÃºto Ä�asÅ¥ musÃ­Å¡ implementovaÅ¥ vo svojom potomkovi.
        VrÃ¡ti queryset/zoznam transakciÃ­.
        )ÚNotImplementedError©rb   rÚ   rA   rA   rB   Úget_transactions*  ó   z,BaseAccountStatementPDFView.get_transactionsc                 C   s   g S )uˆ   
        DodatoÄ�nÃ© riadky filtrov do informaÄ�nej tabuÄ¾ky v hlaviÄ�ke PDF.
        KaÅ¾dÃ¡ poloÅ¾ka mÃ¡ tvar: [label, value]
        rA   ra   rA   rA   rB   Úget_filter_rows1  r'  z+BaseAccountStatementPDFView.get_filter_rowsNÚperiod_labelÚreturnc           "      C   sX  t  ¡ }t|tdt dt dt dt d�}tƒ }tdtdtj	t 
ddd¡dt dt dd	d
dddd�}td|dtj	d
d�}	tdtdtjdd�}
td|
tdt 
ddd¡d	dd�}g }| tdt› dt› d�|	ƒ¡ | tddt ƒ¡ ttdƒ|
ƒd|j› �gtd|
ƒd|j› �gttdƒ|
ƒdt t ¡ ¡ d¡› �gg}|r¯| ttdƒ|
ƒd|› �g¡ |rÅ|D ]\}}| t||
ƒd|› �g¡ q³t|d t d!gd"�}| td#d$d%tfd#d$d&tfd'd(d)gƒ¡ | |¡ | tdd	t ƒ¡ | ttd*ƒ|ƒ¡ td+ƒtd,ƒtd-ƒtd.ƒtd/ƒgg}g }|D ]‹}|j|jk}|�r |jn|j}t |j¡ d¡}|jd0›}|�rDd1|› �}| t 
d2dd¡¡ n
| t 
dd3d¡¡ |�rUtd4ƒntd5ƒ}g }|j �re| |j ¡ |j!�rr| d6|j!› �¡ |j"�r| d7|j"› �¡ |j#�rŒ| d8|j#› �¡ d9 $|¡}| ||j|||g¡ �qt|dd t d:t d;t dt d<t gd=�}td>d$d%tfd?d@d$dAt 
ddd¡fdBd$dAtj	fd>d$dAtfdCdDdEdFd%dGt 
d2d2d2¡fdHdIdJdKdLgƒ}t%|ƒD ]"\}}|d }| &d@d
|fdM|f|¡ | &dBd
|fdM|ftj	¡ �qé| |¡ | |¡ dNdO„ } |j'|| | dP� | (¡ }!| )¡  |!S )Qu@   Vygeneruje PDF a vrÃ¡ti bytes s modernÃ½m vizuÃ¡lom VirtualBank.é   )ZpagesizeZ
leftMarginZrightMarginZ	topMarginZbottomMarginZ	HeaderBaré   gš™™™™™¹?g333333Ã?g333333Ó?é
   é   r   é   )ÚfontNameÚfontSizeÚ	textColorZ	backColorZ
leftIndentZrightIndentÚspaceBeforeÚ
spaceAfterÚ	alignmentÚleadingZ
paddingTopZpaddingBottomZLogoText)Úparentr1  r2  r5  ZNormalSlovaké   )r0  r1  r2  r6  ZSubTitler�   )r7  r0  r1  r2  r3  r4  z<font name="z">Virtual</font><font name="z">Bank</font>rœ   é   zAccount namez: ZIBANZ	Generatedz%d.%m.%Y %H:%MZPeriodr�   N)Ú	colWidthsZFONT©r   r   ©éÿÿÿÿr=  ©r   r=  )ÚVALIGNr;  r<  ZMIDDLE)ÚALIGNr;  r<  ÚLEFT)ÚLEFTPADDINGr;  r>  r   zTransaction DetailsÚDatezCounterparty IBANzAmount [EUR]ÚTypeZDetailsz.2fú-gš™™™™™é?g333333ã?ZSentZReceivedzVS: zSS: zKS: z, é2   é   é-   )Z
repeatRowsr:  ZFONTNAME)ZFONTSIZEr;  r<  é   Z
BACKGROUND©r=  r   Z	TEXTCOLOR)r@  r;  rJ  ZCENTER)r?  r;  r<  ZTOPZ	LINEBELOW)r   rœ   g      Ð?)r@  )rù   rœ   )rù   r=  ÚRIGHT)Z
TOPPADDINGr;  r<  r9  )ZBOTTOMPADDINGr;  r<  r9  )rB  r;  r<  rI  )ZRIGHTPADDINGr;  r<  rI  r=  c                 S   sD   |   ¡ }|› }|  ¡  |  td¡ |  dt dt |¡ |  ¡  d S )Né	   éi   r-  )ZgetPageNumberZ	saveStateZsetFontÚDEFAULT_FONT_NAMEZdrawCentredStringr5   ZrestoreState)ZcanvasÚdocZpage_numÚtextrA   rA   rB   Úadd_page_numberå  s   z?BaseAccountStatementPDFView.render_pdf.<locals>.add_page_number)ZonFirstPageZonLaterPages)*ÚioÚBytesIOr   r$   r5   r%   r6   ÚDEFAULT_FONT_NAME_BOLDr(   ÚwhiteZColorrN  Úblackr¢   r    r!   r¨   Únamer  r'   Ú	localtimeÚnowr‘   r   ZsetStyler   rw   rj   rn   rm   r~   rg   ÚinformationÚvariable_symbolÚspecific_symbolÚconstant_symbolÚjoinÚ	enumerateÚaddÚbuildÚgetvalueÚclose)"rb   rÚ   Ztransactionsr)  Úfilter_rowsÚbufferrO  ÚstylesZheader_bar_styleZlogo_text_styleZnormal_styleZsub_title_styleÚelementsZaccount_info_dataÚlabelÚvalueZaccount_info_tableÚdataZ
row_colorsrr   Zis_outgoingZcounterpartyZdate_strZ
amount_strÚttypeZ
info_partsÚinfoÚtableÚtsZ	row_indexZ	row_colorZreal_row_indexrQ  ÚpdfrA   rA   rB   Ú
render_pdf8  s  ú	óûûù
þþý	

û
ûÿ



ûÿ,


ó

ýz&BaseAccountStatementPDFView.render_pdfc                 C   r=   r>   )r)  ra   rA   rA   rB   Úget_period_labelù  s   z,BaseAccountStatementPDFView.get_period_labelc                 O   s¸   t |dd ƒp	t ¡ }t |¡�C |  ¡ }|  |¡}|  ¡ }|  ¡ }|  ||||¡}	|r/| 	¡ nd}
d|j
› d|
› d�}t|	dd�}d|› d	�|d
< |W  d   ƒ S 1 sUw   Y  d S )NÚLANGUAGE_CODEZENZ
statement_r¨   z.pdfzapplication/pdf)Úcontent_typezinline; filename="ú"zContent-Disposition)Úgetattrr/   Úget_languageÚoverrider#  r&  rq  r(  rp  Úupperr  r)   )rb   rQ   ÚargsrÅ   ÚlangrÚ   Ztxsr)  rd  Z	pdf_bytesZlang_suffixÚfilenameÚresponserA   rA   rB   rV   ü  s   
$ózBaseAccountStatementPDFView.getr>   )rÑ   rÒ   rÓ   Ú__doc__r)  r#  r&  r(  r  Úbytesrp  rq  rV   rA   rA   rA   rB   r!    s     Br!  c                   @   s    e Zd ZdZedƒZdd„ ZdS )ÚAccountStatementPDFViewu'   PDF s *vÅ¡etkÃ½mi* transakciami ÃºÄ�tu.zAll transactionsc                 C   s*   t j t|d�t|d�B ¡ dd¡ d¡S )Nræ   rç   rm   rn   r   )r-   r_   r`   r   rÄ   r  r%  rA   rA   rB   r&    s   ÿûz(AccountStatementPDFView.get_transactionsN)rÑ   rÒ   rÓ   r}  r¨   r)  r&  rA   rA   rA   rB   r    s    r  c                   @   s&   e Zd ZdZdefdd„Zdd„ ZdS )ÚAccountStatementFilteredPDFViewu:   PDF, ktorÃ© reÅ¡pektuje aktuÃ¡lny filter z detailu ÃºÄ�tu.r*  c           	      C   sv   | j j d¡pd ¡ }| j j d¡pd ¡ }|r#|r#tdƒ||dœ S |r-tdƒd|i S |r7tdƒd	|i S td
ƒS )Nrß   rÝ   rà   zFrom %(df)s to %(dt)s)ÚdfÚdtzFrom %(df)sr�  zUp to %(dt)sr‚  zCurrent filter)rQ   r  rV   r  r¨   r  r¢   )	rb   r�  r‚  r(  rÞ   rá   râ   rã   ÚrowsrA   rA   rB   rq     s   z0AccountStatementFilteredPDFView.get_period_labelc                 C   s¨  t j t|d�t|d�B ¡ dd¡}| jj}| d¡}| d¡}|r:ztj	 
|¡}|j|d�}W n	 ty9   Y nw |rTztj	 
|¡}|j|d�}W n	 tyS   Y nw | d	¡pZd
 ¡ }|rl| t|d�t|d�B ¡}| d¡prd
 ¡ }	| d¡p{d
 ¡ }
| d¡p„d
 ¡ }dd„ }||	ƒ}||
ƒ}|d ur�|j|d�}|d ur§|j|d�}|dkr²|j|d�}n
|dkr¼|j|d�}| dd¡}|dkrÍ| d¡}|S | d¡}|S )Nræ   rç   rm   rn   rß   rà   rè   rl   rÞ   rÝ   ré   rê   rá   râ   rã   c                 S   s(   z	t |  dd¡ƒW S  ty   Y d S w rì   )rÀ   rï   r  rð   rA   rA   rB   Úto_floatq  s
   ÿzBAccountStatementFilteredPDFView.get_transactions.<locals>.to_floatrò   ró   rô   rõ   rä   rå   r   r~   r   )r-   r_   r`   r   rÄ   rQ   r  rV   rˆ   r   r  r  r  r  )rb   rÚ   r  r  rß   rà   r  r  rÞ   rá   râ   rã   r„  r  r  Z
sort_paramrA   rA   rB   r&  N  sb   ÿþ

ÿÿÿÿ

þz0AccountStatementFilteredPDFView.get_transactionsN)rÑ   rÒ   rÓ   r}  r  rq  r&  rA   rA   rA   rB   r€    s    .r€  c                       s$   e Zd ZeZdZ‡ fdd„Z‡  ZS )ÚTransactionDetailViewrÛ   c                    sB   |   ¡ }|jj|jkr|jj|jkrt‚tƒ j|g|¢R i |¤ŽS r>   )Ú
get_objectrm   rM   rn   r   r½   Údispatch)rb   rQ   ry  rÅ   ÚobjrÏ   rA   rB   r‡  —  s   zTransactionDetailView.dispatch)rÑ   rÒ   rÓ   r-   rÔ   r  r‡  r×   rA   rA   rÏ   rB   r…  “  s    r…  c                   @   s   e Zd Zdd„ ZdS )ÚUpdateAccountNameViewc                 C   s2   t t||jd�}|j d¡|_| ¡  td|d�S )Nr"  Znew_account_nameÚaccount_detail©rÛ   )r   r#   rM   ÚPOSTrV   rW  rP   r   )rb   rQ   rÛ   rÚ   rA   rA   rB   Úpost¢  s   zUpdateAccountNameView.postN)rÑ   rÒ   rÓ   r�  rA   rA   rA   rB   r‰  ¡  s    r‰  c                       ó8   e Zd ZeZeZdZdd„ Z‡ fdd„Z	dd„ Z
‡  ZS )Ú#NewTransactionFromAccountCreateViewúbanking/NEW_PAYMENT.htmlc                 C   ó    | j j d¡dkrdgS | jgS ©Nzx-requested-withZXMLHttpRequestzbanking/payment_form_inner.html©rQ   ÚheadersrV   rÖ   ra   rA   rA   rB   Úget_template_names±  s   z6NewTransactionFromAccountCreateView.get_template_namesc                    s8   t ƒ  ¡ }| jj|d< tt| jd d�}d|i|d< |S )NrM   rÛ   r‹  Ú
payer_ibanÚinitial)r½   Úget_form_kwargsrQ   rM   r   r#   rÅ   )rb   rÅ   rÚ   rÏ   rA   rB   r˜  ·  s
   
z3NewTransactionFromAccountCreateView.get_form_kwargsc                 C   ó   t | j|ƒS r>   ©Ú_start_payment_verificationrQ   ©rb   ÚformrA   rA   rB   Ú
form_valid¾  r  z.NewTransactionFromAccountCreateView.form_valid©rÑ   rÒ   rÓ   r-   rÔ   r"   Ú
form_classrÖ   r•  r˜  rž  r×   rA   rA   rÏ   rB   r�  ¬  s    r�  c                       rŽ  )ÚNewTransactionCreateViewr�  c                 C   r‘  r’  r“  ra   rA   rA   rB   r•  Ê  ó   z+NewTransactionCreateView.get_template_namesc                    s   t ƒ  ¡ }| jj|d< |S )NrM   )r½   r˜  rQ   rM   )rb   rÅ   rÏ   rA   rB   r˜  Ï  s   
z(NewTransactionCreateView.get_form_kwargsc                 C   r™  r>   rš  rœ  rA   rA   rB   rž  Ô  r  z#NewTransactionCreateView.form_validrŸ  rA   rA   rÏ   rB   r¡  Å  s    r¡  c                       s,   e Zd ZdZ‡ fdd„Z‡ fdd„Z‡  ZS )ÚProcessPaymentViewuç   
    ÄŒÃ­ta parametre z URL query-stringu a pred-vyplnÃ­ nimi formulÃ¡r.
    PouÅ¾Ã­va tÃº istÃº validÃ¡ciu + ukladanie ako NewTransactionCreateView.
    GET  â€“ zobrazenie formulÃ¡ra s prefillom
    POST â€“ odoslanie platby
    c                    sp   |j  d¡}|j  d¡}|j  d¡}|r+|r+|r+t|ƒt|ƒt|ƒdœ|jd< d|j_tƒ j|g|¢R i |¤ŽS )NÚorder_idÚtokenÚcallback)r¤  r¥  r¦  Úeshop_paymentT)r  rV   r  rO   Úmodifiedr½   r‡  )rb   rQ   ry  rÅ   r¤  r¥  r¦  rÏ   rA   rB   r‡  à  s   ýzProcessPaymentView.dispatchc                    sz   t ƒ  ¡ }| jj}ddddddddœ}| ¡ D ]\}}| |¡r'| |¡||< q| d¡r;| d¡s;t| d¡ƒ|d< |S )	Nrg   Úbeneficiary_ibanrZ  r[  r\  r]  )rg   r©  r  rZ  r[  r\  r]  r¤  )r½   Úget_initialrQ   r  ÚitemsrV   r  )rb   r—  r  ÚmappingZqs_keyZform_keyrÏ   rA   rB   rª  ï  s"   
ù

€zProcessPaymentView.get_initial)rÑ   rÒ   rÓ   r}  r‡  rª  r×   rA   rA   rÏ   rB   r£  Ø  s    r£  c                       rŽ  )ÚDuplicateTransactionViewr�  c                 C   r‘  r’  r“  ra   rA   rA   rB   r•    r¢  z+DuplicateTransactionView.get_template_namesc              	      sh   t ƒ  ¡ }| jj|d< tt| jd d�}tt| jd |d�}t||j	j
|j|j|j|j|jd�|d< |S )NrM   rÛ   r‹  Ztransaction_id)rj   rm   )r–  r©  rg   r[  r\  r]  rZ  r—  )r½   r˜  rQ   rM   r   r#   rÅ   r-   Údictrn   r  rg   r[  r\  r]  rZ  )rb   rÅ   rÚ   rr   rÏ   rA   rB   r˜    s    
ÿ
ù	z(DuplicateTransactionView.get_form_kwargsc                 C   r™  r>   rš  rœ  rA   rA   rB   rž  &  r  z#DuplicateTransactionView.form_validrŸ  rA   rA   rÏ   rB   r­  
  s    r­  c                 C   s¤   | j }|j }| ¡ p|j}| ¡ p|j}|jr1ttdƒtdƒ|||jdœ ttddƒ|jgdd� |jrPttdƒtd	ƒ||| jdœ ttddƒ|jgdd� dS dS )
u5   
    E-maily pre oboch ÃºÄ�astnÃ­kov transakcie.
    zPayment sentzCYou have sent a payment of %(amount).2f EUR to %(name)s (%(iban)s).)rg   rW  r  ÚDEFAULT_FROM_EMAILNF©ÚsubjectÚmessageÚ
from_emailÚrecipient_listÚfail_silentlyzPayment receivedzIYou have received a payment of %(amount).2f EUR from %(name)s (%(iban)s).)	rM   Úget_full_nameÚusernameÚemailr,   r¨   r  ru  r.   )Ú	payer_accÚbeneficiary_accrg   Z
payer_userZbeneficiary_userZ
payer_nameZbeneficiary_namerA   rA   rB   Ú_send_payment_success_emails)  sF   ÿýþ
õÿýþ

õÿr»  c                 C   sª  |j d }|j d }z	tjj|d�}W n tjy-   | dtdƒ¡ t| dd|iƒ Y S w ||jkrC| dtdƒ¡ t| dd|iƒS t	|j d ƒ}|t	|j
ƒkra| dtd	ƒ¡ t| dd|iƒS |d
kru| dtdƒ¡ t| dd|iƒS |j  d¡p|d}|j  d¡p„d}|j  d¡pŒd}|j  d¡p”d}	t d
d¡d›}
tjj| j|||||||	|
d�	}| jjrÊttdƒtdƒ||
dœ ttddƒ| jjgdd� ttdd|jid�ƒS )u™   
    1) ValidÃ¡cia
    2) Vytvor PaymentVerification (amount ako FLOAT)
    3) PoÅ¡li kÃ³d na email odosielateÄ¾a
    4) Redirect na verify strÃ¡nku
    r–  r©  ©r  z&Please enter correct beneficiary IBAN.r�  r�  z2Payer IBAN cannot be the same as beneficiary IBAN.rg   zFTransaction amount cannot be greater than the payer's account balance.r   z-Transaction amount must be greater than zero.rZ  rÝ   r[  r\  r]  é?B Ú06d©	rM   Úpayer_accountÚbeneficiary_accountrg   rZ  r[  r\  r]  ÚcodeúPayment verification codeúCYour verification code for payment of %(amount).2f EUR is %(code)s.©rg   rÂ  r¯  NFr°  Úverify_paymentrE   r  )Úcleaned_datar#   r_   rV   ÚDoesNotExistÚ	add_errorr¨   r   r  rÀ   ÚbalanceÚrandomÚrandintr*   ÚcreaterM   r¸  r,   ru  r.   r   r   rE   ©rQ   r�  r¹  r©  rº  rg   rZ  r[  r\  r]  rÂ  ÚverificationrA   rA   rB   r›  T  s\   

þ
÷þ
ør›  ÚurlÚextrar*  c                 C   sJ   t | ƒ}tt|jƒƒ}| |¡ t|dd�}t|j|j|j	|j
||jfƒS )uT   
    BezpeÄ�ne pridÃ¡ query parametre do existujÃºcej URL (zachovÃ¡ pÃ´vodnÃ©).
    T)Údoseq)r1   r®  r3   ÚqueryÚupdater2   r4   ÚschemeÚnetlocÚpathr  Úfragment)rÐ  rÑ  ÚpartsrÓ  Z	new_queryrA   rA   rB   Ú_append_query_params•  s
   
rÚ  c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚVerifyPaymentViewz!banking/payment_verification.htmlc                 C   s   t t|| jjdd�S )NF)rE   rM   Úis_used)r   r*   rQ   rM   )rb   rE   rA   rA   rB   r†  ¢  s   üzVerifyPaymentView.get_objectc                 C   s$   |   |¡}tƒ }t|| j||dœƒS )N©rÏ  r�  )r†  r+   r   rÖ   )rb   rQ   rE   rÏ  r�  rA   rA   rB   rV   ª  s   
zVerifyPaymentView.getc              
   C   sR  |   |¡}t|jƒ}| ¡ st|| j||dœƒS | ¡ r.| dtdƒ¡ t|| j||dœƒS |j	d |j
krH| dtdƒ¡ t|| j||dœƒS |j}|j}t|jƒ}t ¡ �} tj ¡ j|jd�}tj ¡ j|jd�}|t|jƒkrŒ| d tdƒ¡ t|| j||dœƒW  d   ƒ S t|jƒ| |_t|jƒ| |_|jdgd� |jdgd� tjj||||jp´d	|jp¸d	|jp¼d	|jpÀd	d
�}d|_|jdgd� W d   ƒ n1 s×w   Y  t|||ƒ t  !|tdƒ¡ |j" #dd ¡}	d|j"_$|	�r|	 d¡}
|	 d¡}|	 d¡}|
�r|�r|�rt%|
||dœƒ}t&|ƒS t&t'dd|j( )¡ id�ƒS )NrÝ  rÂ  zCThe verification code has expired. Please create the payment again.zInvalid verification code.rD   z*Insufficient balance on the payer account.rÊ  )Úupdate_fieldsrÝ   )rm   rn   rg   r[  r\  r]  rZ  TrÜ  úTransaction successfully sent!r§  r¦  r¤  r¥  )r¤  r¥  rŠ  rÛ   r  )*r†  r+   rŒ  Úis_validr   rÖ   Ú
is_expiredrÉ  r¨   rÇ  rÂ  rÀ  rÁ  rÀ   rg   r0   Úatomicr#   r_   Úselect_for_updaterV   rE   rÊ  rP   r-   rÍ  r[  r\  r]  rZ  rÜ  r»  r   ÚsuccessrO   rX   r¨  rÚ  r   r   r  Úlower)rb   rQ   rE   rÏ  r�  r¹  rº  rg   rr   Úpayloadr¦  r¤  r¥  Úredirect_urlrA   rA   rB   r�  ¯  sd   



øù
ä


ÿzVerifyPaymentView.postN)rÑ   rÒ   rÓ   rÖ   r†  rV   r�  rA   rA   rA   rB   rÛ  Ÿ  s
    rÛ  c                 C   s   t | dd| jiƒS )Nzbanking/landing_page.htmlÚcurrent_path)r   r×  )rQ   rA   rA   rB   Úlanding_page_viewÿ  s   ré  c                 C   s¢  |j d }|j d }z	tjj|d�}W n tjy-   | dtdƒ¡ t| dd|iƒ Y S w ||jkrC| dtdƒ¡ t| dd|iƒS |j d }||j	kr]| dtd	ƒ¡ t| dd|iƒS |d
krq| dtdƒ¡ t| dd|iƒS |j  d¡pxd}|j  d¡p€d}|j  d¡pˆd}|j  d¡p�d}	t
 d
d¡d›}
tjj| j|||||||	|
d�	}| jjrÆttdƒtdƒ||
dœ ttddƒ| jjgdd� ttdd|jid�ƒS )uÎ   
    1. OverÃ­ dÃ¡ta platby (rovnakÃ¡ logika ako doteraz v _process_transaction_form).
    2. VytvorÃ­ PaymentVerification.
    3. PoÅ¡le mail s kÃ³dom.
    4. Redirectne na strÃ¡nku s overenÃ­m kÃ³du.
    r–  r©  r¼  ú%Please enter correct beneficiary ibanr�  r�  ú7Payer iban cannot be the same as the beneficiary's ibanrg   úETransaction amount cannot be greater than the payer's account balancer   ú,Transaction amount must be greater than zerorZ  rÝ   r[  r\  r]  r½  r¾  r¿  rÃ  rÄ  rÅ  r¯  NFr°  rÆ  rE   r  )rÇ  r#   r_   rV   rÈ  rÉ  r¨   r   r  rÊ  rË  rÌ  r*   rÍ  rM   r¸  r,   ru  r.   r   r   rE   rÎ  rA   rA   rB   r›    sn   

þ
þ

þ÷ÿý
øÿc                 C   sT  |j d }|j d }z	tjj|d�}W n tjy.   | dtdƒ¡ t| |jd|iƒ Y S w ||j	krC| dd¡ t| |jd|iƒS |j d }||j
kr\| dd¡ t| |jd|iƒS |d	kro| dd
¡ t| |jd|iƒS | j
|8  _
| ¡  | j
|7  _
| ¡  |jdd�}||_||_| ¡  t | tdƒ¡ ttdd|j	 ¡ id�ƒS )Nr–  r©  r¼  rê  r�  rë  rg   rì  r   rí  F)Úcommitrß  rŠ  rÛ   r  )rÇ  r#   r_   rV   rÈ  rÉ  r¨   r   rÖ   r  rÊ  rP   rm   rn   r   rä  r   r   rå  )rQ   r�  r¹  r©  rº  rg   rr   rA   rA   rB   Ú_process_transaction_formQ  sH   

þ
þ

þÿrï  ){rˆ   rR  Úosr  r   r   r   r   r   r   r   r	   r  r   r   Údjango.httpr   Údjango.shortcutsr   r   r   r  r   r   Údjango.utils.timezoner   Zdjango.views.genericr   r   r   r   Údjango.contribr   Údjango.core.exceptionsr   Zdjango.contrib.auth.mixinsr   Údjango.db.models.functionsr   Údjango.utils.translationr   r¨   Úreportlab.platypusr   r   r   r    r!   Zbanking.formsr"   Úbanking.models.accountr#   Úreportlab.lib.pagesizesr$   Úreportlab.lib.stylesr%   r¼   r'   Úreportlab.libr(   r)   Z#banking.models.payment_verificationr*   r+   Údjango.core.mailr,   Úbanking.models.transactionr-   Údjango.confr.   rË  r/   Ú	django.dbr0   Úurllib.parser1   r2   r3   r4   Zreportlab.lib.unitsr5   r6   Zreportlab.pdfbaser7   Zreportlab.pdfbase.ttfontsr8   Údjango.contrib.auth.decoratorsr9   r:   Údjango.contrib.authr;   r<   rL   rT   rU   rY   rZ   rÙ   r×  r^  ÚBASE_DIRZFONT_DIRrN  ZregisterFontrT  ÚFileNotFoundErrorr!  r  r€  r…  r‰  r�  r¡  r£  r­  r»  r›  r  r®  rÚ  rÛ  ré  rï  rA   rA   rA   rB   Ú<module>   s¼    (


,|   ý uv2+A
`J