
    chg                     *   d dl mZmZ d dlmZmZ d dlmZ d dlm	Z	 d dlm
Z
 d dlT d dlT ddlT d dlmZ d d	lmZ d d
lmZ d dlmZ d dlT 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! d dlm"Z" d dl#m#Z#m$Z$m%Z% d dl m&Z& d dl'Z'd dl(Z(d dl)m*Z* d dl+T d dl,Z,d dl-Z-d dl.m/Z/  e,j0        e1          Z2 G d dej3                  Z4 G d de          Z5d Z6d Z7 G d dej8                  Z9d  Z: G d! d"ej8                  Z; G d# d$e          Z<dS )%    )renderget_object_or_404)genericspermissions)IsAuthenticated)Responsestatus)*   )transaction)CustomPagination)cache_response)ValidationError)Decimal)APIView)viewsets)UpdateAPIView)action)Q)AllowAny)datetime	timedeltatime)SumN)send_vendor_payout_email)create_user_notificationc                   (    e Zd ZegZeZeZd Z	d Z
dS )VendorWalletCreditViewc                    | j         j        }t          j                            |d                              d                              d          }| j         j                            d          }| j         j                            d          }|r|rt          j
        |d          }t          j        t          j
        |d          t          j                  }|                    t          ||g          t          ||g	          z            }n|rJt          j
        |d          }|                    t          |
          t          |          z            }nh|rft          j        t          j
        |d          t          j                  }|                    t          |          t          |          z            }| j         j                            d          }|rV|                    t          |          t          |          z  t          |          z  t          |          z            }|S )Ncredit)vendortransaction_typer"   z-created_at
start_dateend_date%Y-%m-%dcreated_at__range)credited_date__rangecreated_at__gte)credited_date__gtecreated_at__lte)credited_date__ltesearchamount__icontainsstatus__icontains)+order_purchase__transactions__id__icontains)created_at__icontains)requestuserWalletTransactionobjectsfilterselect_relatedorder_byquery_paramsgetr   strptimecombiner   maxr   )selfr"   querysetr$   r%   start_date_objend_date_objsearch_querys           -/var/www/html/e360mart/wallet/views/vendor.pyget_querysetz#VendorWalletCreditView.get_queryset'   s?   "$,33% 4 
 
 .
"
"88M#:#: 	 \.22<@@
<,00<<  	( 	%.z:FFN#+H,=h
,S,SUYU]^^L^\$BCCC'EFFFG HH  	%.z:FFN.111^4445 HH  	#+H,=h
,S,SUYU]^^L,///\2223 H |044X>> 	L111L1112lKKKL 5556 H     c                 T   |                                  }|                     |          }|L|                     |dd|i          }|                     |j                  }t          dd|j        d          S |                     |dd|i          }t          dd|j        d          S )NTr7   manycontextz(Wallet transactions fetched successfullyr
   messagedata)rI   paginate_querysetget_serializerget_paginated_responserQ   r   rC   r7   argskwargsrD   page
serializerpaginated_responses           rH   listzVendorWalletCreditView.listZ   s    $$&& %%h//,,TyRYFZ,[[J!%!<!<Z_!M!ME*/     ((yRYFZ([[
AO
 
   	rJ   N)__name__
__module____qualname__r   permission_classesVendorCreditListingSerializersserializer_classr   pagination_classrI   r[    rJ   rH   r   r   "   sH        )*5'1 1 1f    rJ   r   c                       e Zd ZegZd ZdS )WalletBankDetailAPIViewc                 p   |j         }t          j                            |                              dd                                          pt          d          }t          j                            |          }t          |d          }||j	        d}t          dd|d	t          j        
          S )Nr"   balanceTflat0.00)rM   )wallet_balancebank_detailsz6Wallet balance and bank details retrieved successfullyrO   r	   )r8   WalletBalancer:   r;   values_listfirstr   VendorBankDetailVendorBankDetailSerializerrQ   r   r
   HTTP_200_OK)	rC   r7   rV   rW   r"   rl   rm   bank_serializerrQ   s	            rH   r?   zWalletBankDetailAPIView.getu   s     '.55 6 
 

+id+
+
+EEGGG7>v 	 (/66f6EE4\MMM -+0
 

 O
 
 $	& & & 	&rJ   N)r\   r]   r^   r   r_   r?   rc   rJ   rH   re   re   r   s,        )*& & & & &rJ   re   c                     d}dt           j         dd}| |d}t          j        |||          }|                                S )Nz/https://api.flutterwave.com/v3/accounts/resolveBearer zapplication/json)AuthorizationzContent-Type)account_numberaccount_bankjsonheaders)settingsFLUTTERWAVE_SECRET_KEYrequestspostr{   )rx   	bank_codeurlr|   payloadresponses         rH   verify_bank_accountr      s^    
;CD8#BDD* G )! G }Sw@@@H==??rJ   c                     dt          j                     ddd| j        || j        d}t                              d|           ddt          j         i}t          j	        d	||
          }|
                                S )NzMM-1TZSmobilemoneytz)tx_refamountcurrencypayment_typeemailphone_numberfullnamez&Mobile number verification payload: %srw   rv   z8https://api.flutterwave.com/v3/charges?type=mobile_moneyrz   )uuiduuid4r   	full_nameloggerinfor}   r~   r   r   r{   )r8   mobile_numberr   r|   r   s        rH   verify_mobile_moneyr      s    &
&&'%N	 	G KK8'BBB 	D8#BDDG }W")7< < <H ==??rJ   c                   0    e Zd ZegZeZd Zd Zd Z	d Z
dS )VendorBankViewSetc                 z    t           j                            | j        j                                                  S )Nrg   )rq   r:   r;   r7   r8   rp   )rC   s    rH   rI   zVendorBankViewSet.get_queryset   s-    '..dl6G.HHNNPPPrJ   c                     |                                  }|st          ddd dt          j                  S |                     |          }t          dd|j        dt          j                  S )NFzNo bank account found.rO   r	   successzBank account retrieved.)rI   r   r
   HTTP_404_NOT_FOUNDrS   rQ   rs   )rC   r7   rV   rW   instancerY   s         rH   r[   zVendorBankViewSet.list   s    $$&& 	 -EtTT0   
 ((22
 -FPZP_``%
 
 
 	
rJ   c                    |j         }|j                            d          }|st          dddd          S t          j                            |                                          }t          d|           t          d	t          j	        j
                   |t          j	        j        k    r|j                            d
          }|j                            d          }t          ||          }	|	                    d          dk    r6|	                    d          pd}
t          d|
d dt          j                  S nh|t          j	        j
        k    r5|j                            d          }|j                            d          }nt          dddt          j                  S |j                                        }|j        |d<   |r|                     ||d          }n|                     |          }|                                r:|                    |           t          dd|j        dt          j                  S t          dd|j        dt          j                  S )Npayout_methodFzMissing payout methodr
   errori  r	   rg   z-----payout_method-----z-----payout_method//-----bank_account_numberr   r
   r   rP   zVerification failedrO   mobile_account_numbermobile_account_bankzInvalid payout method.r
   rP   r"   TrQ   partialrQ   z!Payout method added successfully.r   zValidation failed.r
   rP   errors)r8   rQ   r?   r   rq   r:   r;   rp   printPayoutMethodMOBILE_MONEYBANK_ACCOUNTr   r
   HTTP_400_BAD_REQUESTcopyidrS   is_validsaveHTTP_201_CREATEDr   )rC   r7   rV   rW   r"   r   existing_entryrx   r   verification_resultrP   r   r   rQ   rY   s                  rH   createzVendorBankViewSet.create7  s   ((99 	]u7NOOX[\\\\ *1888GGMMOO'777)+;+H+UVVV,9FFF$\--.CDDN((55I"5ni"P"P"&&x00I==-11)<<U@U$$GG!6    > .;HHH$+L$4$45L$M$M!"),"2"23H"I"I  -EFF2   : |  ""X  	8,,^$PT,UUJJ,,$,77J   	OO6O***$1T^h^mnn.   
 +?:K\]].
 
 
 	
rJ   c                 :   t           j                            |                    d          |j                                                  }|st          ddd dt          j                  S |j	                            d          }|j	                            d          }|rJ|rHt          ||          }|                    d	          d
k    rt          ddd dt          j                  S |j	                                        }|j        j        |d<   |                     ||d          }	|	                                r8|	                                 t          d
d|	j	        dt          j                  S t          dd|	j        dt          j                  S )Npk)r   r"   FzBank account not found.rO   r	   r   r   r
   r   zPlease enter valid bank detailsr"   Tr   z"Bank details updated successfully.r   zBank update failed.r   )rq   r:   r;   r?   r8   rp   r   r
   r   rQ   r   r   r   r   rS   r   r   rs   r   )
rC   r7   rV   rW   vendor_bankrx   r   r   rQ   rY   s
             rH   updatezVendorBankViewSet.update  s   &.55D9I9IRYR^5__eegg 	 -FPTUU0   
 !))*?@@L$$[11	 	i 	"5ni"P"P"&&x00I==$1R\`aa!6   
 |  "" X((4(NN
   	OO$1U_i_noo)    +@JL]^^.
 
 
 	
rJ   N)r\   r]   r^   r   r_   VendorBankSerializerra   rI   r[   r   r   rc   rJ   rH   r   r      sg        )*+Q Q Q
 
 
\V
 V
 V
p"
 "
 "
 "
 "
rJ   r   c                  F    t          t          j        dd                    S )Nl    h] l   J))strrandomrandintrc   rJ   rH   generate_unique_idr     s    v~fl33444rJ   c                   *    e Zd ZegZeZd Zd Zd Z	dS )VendorPayoutViewc                    t           j                            | j        j                                      d          }| j        j                            d          }| j        j                            d          }|rb|r`t          j	        |d          }t          j
        t          j	        |d          t          j                  }|                    ||g          }nx|r,t          j	        |d          }|                    |          }nJ|rHt          j
        t          j	        |d          t          j                  }|                    |          }| j        j                            d	          }|rE|                    t          |
          t          |          z  t          |          z            }|S )Nrg   z-requested_dater$   r%   r&   r'   r*   r-   r0   r1   r3   )transaction_id)PayoutRequestr:   r;   r7   r8   r=   r>   r?   r   r@   rA   r   rB   r   )rC   rD   r$   r%   rE   rF   rG   s          rH   rI   zVendorPayoutView.get_queryset  s    (//t|7H/IIRRSdee\.22<@@
<,00<< 		E( 		E%.z:FFN#+H,=h
,S,SUYU]^^L.,9WXXHH 	E%.z:FFN~FFHH 	E#+H,=h
,S,SUYU]^^L|DDH |044X>> 	L111L1112.../ H rJ   c                    |                                  }|                     |          }|X|                     |dd|i          }|                     |j                  }t          dd|j        dt          j                  S |                     |dd|i          }t          dd|j        dt          j                  S )NTr7   rL   z#Payout requests fetched successfullrO   r	   )rI   rR   rS   rT   rQ   r   r
   rs   rU   s           rH   r[   zVendorPayoutView.list  s    $$&&%%h//,,TyRYFZ,[[J!%!<!<Z_!M!M@*/  (	* * * * ((yRYFZ([[
<O
 
 $	& & & 	&rJ   c                 >
   |j                                         }|                    d          r|                    d          nd }|st	          ddd dt
          j                  S ||j        j        k    rY|j        j	        r.t                      |j        j	        z
  t          d          k    rn=t	          ddd dt
          j                  S t	          dd	d dt
          j                  S t          j                            |j        
                                          }|t	          ddd dt
          j                  S |r|j        nd |d<   |j        r*t&                              d|j                   |j        |d<   |j                             d          }|t+          |          dk     rt	          ddd dt
          j                  S t&                              d|           |                     |          }|                    d           |j        }	|j        d         }
t3                      }t4          j                            |                                          r@t3                      }t4          j                            |                                          @|                    |	d|          }t:          j                            |	
                              dd                                          pt?          d          }|pt?          d          }||z
  }t&                              d|	j                    t&                              d|            t&                              d|            t&                              d|            t:          j                             |	d|i            	 tC          j"        |	j        |           t&                              d!|	j         d"|            nI# tF          $ r<}t&          $                    d#|	j         d$tK          |                      Y d }~nd }~ww xY w	 d%| d&}tM          j"        d'|	j        d(|)           t&                              d*|	j         d"|            nL# tF          $ r?}t&          $                    d+|	j         d"| d$tK          |                      Y d }~nd }~ww xY wdd,tO          |          j         d}t	          |t
          j(                  S )-NotpFz+Pleass pass otp for verify withdraw requestrO      )minutesz*OTP has expired. Please request a new one.r	   z3The OTP you entered is incorrect. Please try again.rg   zIBank account not found. Please add a bank account to complete the payout.bankzpayout method----:%spayment_methodr   i  z8Withdrawal amount must be greater than or equal to 5000.zpayout Data----:%sr   T)raise_exception)	unique_idpending)r"   r
   r   rh   ri   rk   z[Wallet Update] Vendor ID: zCurrent Balance: zMinus Amount: zNew Balance: )r"   defaultsu+   ✅ Payout email task queued for vendor ID z, Amount: TZS u4   ❌ Failed to queue payout email task for vendor ID : zYour payout request for TZS uc    has been received. We’ll notify you once it’s processed. Thank you for being a valued partner!r"   zPayout Request Submitted)	user_typeuser_idtitlerP   u+   ✅ Notification task queued for vendor ID u6   ❌ Failed to queue vendor notification for vendor ID z%Payout request generated successfully))rQ   r   r?   popr   r
   r   r8   withdraw_otpwithdraw_otp_atnowr   r   rq   r:   r;   rp   r   r   r   r   floatrS   r   validated_datar   r   existsr   rn   ro   r   update_or_creater   delay	Exceptionr   r   r   VendorPayoutSerializerr   )rC   r7   rV   rW   rQ   r   r   r   rY   r8   payout_amountr   payout_requestcurrent_balanceminus_amountnew_balanceemessage_textresponse_datas                      rH   r   zVendorPayoutView.create  s   |  ""#'88E??< 	*H  (	* * * ',+++|+ 78T0TXajkXlXlXl0l0l#K ! ! !5	7 7 7 7 P  (	* * *  '..gl.CCIIKK<f  (	* * * #'0twwDV 	8KK.0BCCC%)%7D!"!!(++>U6]]T11U  1	3 3 3 3" 	($/// ((d(33
D111|"1(; '((	#**Y*??FFHH 	-*,,I #**Y*??FFHH 	- $YR[\\ (/66 7 
 

+id+
+
+EEGGG7>v 	 0%4;$';;<<<999:::3\334441K11222 	..- 	/ 	
 	
 	
	e$*47F;;;KKedgee]ceeffff 	e 	e 	eLLcPTPWcc[^_`[a[accdddddddd	e	}cv c c c 
 %*"0$	    KKedgee]ceeffff 	} 	} 	}LL{RVRY{{io{{svwxsysy{{||||||||	}
 >*>::?
 
 f.EFFFFs1   ?P 
Q2QQAR   
S)*5S$$S)N)
r\   r]   r^   r   r_   r   ra   rI   r[   r   rc   rJ   rH   r   r     sZ        )*-  6& & &,IG IG IG IG IGrJ   r   c                       e Zd ZegZd ZdS )VendorWithdrawOtpc           	         |j         }|j        s@t                              d|j                    t          dddt          j                  S 	 t          d          }||_	        t                      |_        |                                 |j        r8t          |j        |           t                              d|j                    n#t                              d|j         d	           ng# t           $ rZ}t                              d
|j         dt%          |                      t          dddt          j                  cY d }~S d }~ww xY wt          dddt          j                  S )Nz4Unauthorized OTP request attempt by non-vendor user Fz*Only vendors can request a withdrawal OTP.r   r	      z2Withdrawal OTP email task successfully for vendor zVendor z* has no email associated. Cannot send OTP.z,Failed to process withdrawal OTP for vendor r   z=Something went wrong while sending the OTP. Please try again.TzIA One-Time Password (OTP) has been sent to your registered email address.r   )r8   	is_vendorr   warningr   r   r
   r   generate_otpr   r   r   r   send_withdraw_otp_emailr   r   r   	exceptionr   HTTP_500_INTERNAL_SERVER_ERRORrs   )rC   r7   r"   r   r   s        rH   r   zVendorWithdrawOtp.post}  s    	NN`RXR^``aaa +WXX2   
	q//C"%F%(UUF"KKMMM| `'c:::_QWQ]__````^^^^___ 	 	 	dFLdd\_`a\b\bddeee +jkk<        	 (stt%
 
 
 	
s    BC0 0
E:AE	EEN)r\   r]   r^   r   r_   r   rc   rJ   rH   r   r   z  s,        )*!
 !
 !
 !
 !
rJ   r   )=django.shortcutsr   r   rest_frameworkr   r   rest_framework.permissionsr   rest_framework.responser   r
   order.modelsproduct.modelsserializers	django.dbr   suscription.custom_paginationr   Help_Support.decoratorsr   rest_framework.exceptionsr   setting.viewsdecimalr   rest_framework.viewsr   r   rest_framework.genericsr   rest_framework.decoratorsr   django.db.modelsr   r   r   r   r   r   r   r   vendor_listing.tasksr   login_signup.utilsloggingr   notification.tasksr   	getLoggerr\   r   ListAPIViewr   re   r   r   ModelViewSetr   r   r   r   rc   rJ   rH   <module>r     s-   6 6 6 6 6 6 6 6 0 0 0 0 0 0 0 0 6 6 6 6 6 6 , , , , , , ! ! ! ! ! !             ! ! ! ! ! ! : : : : : : 2 2 2 2 2 2 5 5 5 5 5 5           ( ( ( ( ( ( # # # # # # 1 1 1 1 1 1 , , , , , ,       / / / / / / . . . . . . . . . .               9 9 9 9 9 9           7 7 7 7 7 7		8	$	$M M M M MX1 M M M`"& "& "& "& "&g "& "& "&H     6p
 p
 p
 p
 p
- p
 p
 p
d5 5 5@G @G @G @G @Gx, @G @G @GF$
 $
 $
 $
 $
 $
 $
 $
 $
 $
rJ   