
    Li                         d dl mZmZmZ d dlmZ d dlmZ d dlm	Z	m
Z
 d dlmZ d dlmZmZ d dlmZm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mZmZ  G d dej:                        Zy)    )viewsetsstatuspermissions)action)Response)SumCount)DjangoFilterBackend)SearchFilterOrderingFilter)datetime	timedeltaN   )Payment)Member)PaymentSerializerPaymentCreateSerializerPaymentListSerializerPaymentStatisticsSerializerc                      e Zd ZdZej
                  j                         Zee	e
gZg dZddgZg dZdgZd Zd Zd	 Zd
 Z eddg      d        Z eddg      d        Z eddg      d        Z eddg      d        Zy)PaymentViewSetz-
    ViewSet for Payment CRUD operations
    )r   payment_methodmembermember__namereference_number)payment_dateamount
created_atz-payment_datec                 b    | j                   dk(  rt        S | j                   dk(  rt        S t        S )z-Return appropriate serializer based on actioncreatelist)r   r   r   r   )selfs    8/var/www/kalinger_portal/trust-backend/payments/views.pyget_serializer_classz#PaymentViewSet.get_serializer_class   s,    ;;("**[[F"((      c                 r   | j                   j                  }|j                  rt        j                  j                         S 	 t        j                  j                  |      }t        j                  j                  |      S # t        j                  $ r! t        j                  j                         cY S w xY w)z"Filter payments based on user roleuserr   )requestr(   is_staffr   objectsallr   getfilterDoesNotExistnone)r"   r(   r   s      r#   get_querysetzPaymentViewSet.get_queryset&   s    ||  ==??&&((.+++6--V-<<&& .++--.s   ?B 1B65B6c                 Z   |j                   j                         }d|vs|d   s| j                         |d<   | j                  |      }|j	                  d       | j                  |       | j                  |j                         }t        |j                   t        j                  |      S )z9Create a new payment with auto-generated reference numberr   )dataT)raise_exception)r   headers)
r4   copygenerate_reference_numberget_serializeris_validperform_createget_success_headersr   r   HTTP_201_CREATED)r"   r*   argskwargsr4   
serializerr6   s          r#   r    zPaymentViewSet.create4   s    ||  " T)6H1I'+'E'E'GD#$((d(3
D1J'**:??;OO**
 	
r%   c                     d}dj                  t        j                  t        j                  t        j
                  z   d            }| | S )z"Generate a unique reference numberTXN 	   )k)joinrandomchoicesstringascii_uppercasedigits)r"   prefix
random_strs      r#   r8   z(PaymentViewSet.generate_reference_numberG   s?    WWV^^F,B,BV]],RVWXY
*&&r%   Fr.   )detailmethodsc                 H   	 t         j                  j                  |j                        }t        j                  j                  |      }t        |d      }t        |j                        S # t         j                  $ r  t        ddit        j                        cY S w xY w)z"Get current user's payment historyr'   r)   TmanyerrorzMember profile not foundr   )r   r,   r.   r(   r   r/   r   r   r4   r0   r   HTTP_404_NOT_FOUND)r"   r*   r   paymentsr@   s        r#   my_paymentszPaymentViewSet.my_paymentsM   s    		^^''W\\':F--V-<H*8$?JJOO,,"" 	4500 	s   A+A. .0B! B!c                     |j                   j                  st        ddit        j                        S t
        j                  j                  d      j                         }t
        j                  j                  d      j                  t        d            d   xs d}t        j                  j                  t        d	            d   xs d}t        j                         }|j                  d
      }t
        j                  j                  d|      j                         }t
        j                  j                  d|      j                  t        d            d   xs d}|||||d}	t        |	      }
t        |
j                         S )z#Get payment statistics (Admin only)rS   Admin access requiredrT   	completedr   )totalr[   r   
amount_duer   )day)r   payment_date__gte)total_paymentstotal_amount_collectedtotal_pendingpayments_this_monthamount_this_month)r(   r+   r   r   HTTP_403_FORBIDDENr   r,   r/   count	aggregater   r   r   nowreplacer   r4   )r"   r*   r_   total_collectedra   todayfirst_day_monthrb   rc   r4   r@   s              r#   
statisticszPaymentViewSet.statistics[   s    ||$$1200  !//{/CIIK!//000DNNh- O 

  	
 00l# 1 

  	
 --A-.%oo44- 5 
 %' 	
 $OO22- 3 
 )#h-)
(2 7 67 	 -&5*#6!2
 16

((r%   c                 8   |j                   j                  st        ddit        j                        S t        |j                  j                  dd            }t        j                  j                         d| }t        |d      }t        |j                        S )	z Get recent payments (Admin only)rS   rY   rT   limit
   NTrQ   )r(   r+   r   r   rd   intquery_paramsr.   r   r,   r-   r   r4   )r"   r*   rn   recent_paymentsr@   s        r#   recentzPaymentViewSet.recent   s     ||$$1200 
 G((,,Wb9:!//--/7&TB

((r%   c           
      0   |j                   j                  st        ddit        j                        S ddlm} ddl} |d      }d	|d
<   |j                  |      }|j                  g d       t        j                  j                  d      j                         }|D ]t  }|j                  |j                  |j                  j                   |j                  j"                  |j$                  |j&                  |j(                  |j                  g       v |S )z%Export payments to Excel (Admin only)rS   rY   rT   r   )HttpResponseNztext/csv)content_typez#attachment; filename="payments.csv"zContent-Disposition)zPayment DatezMember NamezMember PhoneAmountzPayment MethodzReference NumberStatusr   )r(   r+   r   r   rd   django.httpru   csvwriterwriterowr   r,   select_relatedr-   r   r   namephoner   r   r   )r"   r*   ru   rz   responser{   rV   payments           r#   export_excelzPaymentViewSet.export_excel   s     ||$$1200 
 	-Z8*O&'H% 
 	
 ??11(;??A 		GOO$$##$$&&(( 		 r%   N)__name__
__module____qualname____doc__r   r,   r-   querysetr
   r   r   filter_backendsfilterset_fieldssearch_fieldsordering_fieldsorderingr$   r2   r    r8   r   rW   rl   rs   r    r%   r#   r   r      s     ""$H*L.IO=#%78M>O H!.
&' 55'* + 55'**) +*)X 55'*) +) 55'*  + r%   r   )rest_frameworkr   r   r   rest_framework.decoratorsr   rest_framework.responser   django.db.modelsr   r	   django_filters.rest_frameworkr
   rest_framework.filtersr   r   r   r   rG   rI   modelsr   members.modelsr   serializersr   r   r   r   ModelViewSetr   r   r%   r#   <module>r      sG    8 8 , , ' = ? (    ! dX** dr%   