o
    -6iK                    @   s  d dl Z d dlZd dlZd dlZd dlZd dlmZ eeZ	d dl
mZ d dlmZ d dl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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$m%Z%m&Z& ddl'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z; d dl<m=Z=m>Z>m?Z?m@Z@ d dlAmAZAmBZB d dlCmDZD d dlEmFZF ddlGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZO d dlPmQZQ d dlRZRd dlSZSd dlTZTd dlUZUd dlVmWZW d dlXmYZY d dlZm[Z[ d dl\m]Z] d dl^m_Z_ d dl`Z`d dlambZb d dlmZ ddlcmdZd G dd dZeG dd  d eeeZfG d!d" d"eeeZgG d#d$ d$eeeZhG d%d& d&eeeZiG d'd( d(eZjG d)d* d*eeeZkG d+d, d,eeeZlG d-d. d.eeeZmG d/d0 d0eZnG d1d2 d2eeeZoG d3d4 d4eZpG d5d6 d6eZqG d7d8 d8eZrG d9d: d:eZsG d;d< d<eZtG d=d> d>eZuG d?d@ d@eZvG dAdB dBeZwG dCdD dDeZxG dEdF dFeZyG dGdH dHeeeZzG dIdJ dJeZ{G dKdL dLeZ|dMdN Z}G dOdP dPeZ~G dQdR dReZG dSdT dTeZG dUdV dVeZdS )W    N)check_and_verify_order_status)	localtime)parse)ROUND_HALF_UPDecimal)APIView)Responsestatus)get_object_or_404render)ProductionUnitShop)order_confirmed)CustomProductProductImageProductsWishlistSalesUnitProductSelectionCustomProductImage   )CartCartItemSKUCartItemCustomizationCustomOrderTrackingDeliverySlotDiscountOrderProductCustomizationOrdersDropaddressOrderProductsCouponsCustomCouponPaymentAdsOrderDeliveryNotificationStatSomeOneElseDeliverySettingsDeliveryDiscount)UserLocationAddressReferralUsers)datetime	timedelta)timezone)transaction)CustomOrderCreateSerializerOrderSerializerPastOrderListSerializerAdSerializerOrderSerializer2CourierDetailsSerializerCustomOrderSerializerOrderBillDetailsSerializer)CustomProductSerializer)settings)View)csrf_exempt)Q)FileResponse)template_writer)r   )billdesk_utilsc                   @   s.   e Zd ZdddZdd Zdd Zdd	 Zd
S )CartViewMixinr   c                    s  t j }|stddfS tt|}tt  |jtdkrN|jtdkrN||jkrN |jkr7tddfS |j  }|jtdtd}|j	d| dfS |j	}|j
}|j}||krf|| }|||  }	n|}	tjd}
d	}d }|
D ]} |jkrt|jtd
 }||	 }|	|8 }	|} nqt fdd|
D }|r|d }|j  }|jtdtd}d| d|j d}n
|
d }|j d}t|	d|fS )Nz0.0z!Delivery settings not configured.zFree delivery applied!z0.01)roundingu   Add ₹z more to get free delivery.z-min_order_value z100.0c                    s   g | ]	} |j k r|qS  )min_order_value).0dsubtotalrF   6/var/www/html/Testing_prj/Navya-Bakers/orders/views.py
<listcomp>       z@CartViewMixin.calculate_dynamic_delivery_fee.<locals>.<listcomp>z more to get z% off on delivery.r   z% discount applied on delivery.   )r)   objectsfirstr   strfree_delivery_max_distancefree_delivery_min_order_valuequantizer   base_feebase_km
per_km_feer*   order_byrG   discount_percentround)selfrK   distance_kmr<   	remainingrW   rX   rY   extra_kmdelivery_fee	discountsmessageapplied_discountdiscountr[   discount_amountnext_discountsnext_discountrF   rJ   rL   calculate_dynamic_delivery_feee   sP   





z,CartViewMixin.calculate_dynamic_delivery_feec                 C   sZ   t jj|d }|r"td|jr|jnd|jr|jnddtjdS tddddtj	dS )Ncartr   rE   )r
   namephone_numberr	   r   )
r(   rQ   filterrR   r   rl   rm   r
   HTTP_200_OKHTTP_404_NOT_FOUND)r]   rk   some_one_detailsrF   rF   rL   order_for_someone_else_details   s    	z,CartViewMixin.order_for_someone_else_detailsc           $      C   sn  |j  }i }d}d}d}|D ]S}|j}	|	j}
|	j}||vrG|	j|	j|	j|	j|	j|
j	|
j
 r7|
j
 jjnd|	jg |	jdd|jdd||< d}tjtd|
jgdtd|
jgdB td	|
gd
B td|	gdB }|D ]D}|jdkr|
j|j v r|} n2|jdkr|
j|j v r|} n!|jd	kr|
|j v r|} n|jdkr|	|j v r|} nqm|	j}|r|j}tt|dt|d   d}| d}n|}d}|
jpd|
j pd|
j!pdd}d}|  D ]\}}|tt|t|d  d7 }q||| d< ||| d< || d  |j"7  < |tt||j" d7 }|t||j" 7 }|tt|t| |j" d7 }|	jrc|j# D ]!}|| d $|j|j|j%|j&rW|j&jnd|j'|( d qAqt)|* }d}|j+rt,|j+t-rt-jj|j+j.d }|r| /|||j0}n|j1r|j1}| /|||j0}nd}d}|j0rt2jj|j0d3d }|r|j4dur|j4}| j5||d\}}tt|t| t| t| t| d} t|dt|dt|dt|dt|| dt|d| |j+r|j+j.n|j1d}!t6jj|d }"|"r'|"j7r|"j7nd|"j8r"|"j8ndd}#ni }#t9d|||!|#|d t:j;d!S )"z3Helper method to format cart items into a response.r   Nz0%)sku_idsku_namesku_codesku_unitsku_quantityproduct_nameproduct_imagecustomization_availablecustomization_items	sku_priceoffer_priceoffercart_item_idquantityCategory)
DiscountOnApplicableCategory__inSubCategory)r   ApplicableSubCategory__inProduct)r   ApplicableProduct__inSku)r   ApplicableSku__inr   d   rP   %)s_gstc_gstcessr}   r~   r   r{   )r   	custom_idcustom_notecustom_imagecustom_image_idhas_customization)
CouponCode        userz-created_at)r^   )rK   taxes_and_chargesra   re   total_savingscoupon_savingsgrand_totalcoupon_coderj   rE   )rl   rm   )r
   rc   data
price_datasome_one_else_orderdelivery_discount_messager	   )<itemsallskuproductidrt   ru   rv   rw   	item_nameimagesexistsrR   imageurlrz   sku_mrpr   rQ   rn   r?   item_categoryitem_sub_categoryr   ApplicableCategoryApplicableSubCategoryApplicableProductApplicableSkuDiscountPercentager\   floatr   r   r   r   customizationsappendr   r   r   r   listvaluescoupon
isinstancer"   r   calculate_coupon_savingsr   custom_couponr+   rZ   distanceri   r(   rl   rm   r   r
   ro   )$r]   rk   rc   
cart_itemsgrouped_itemssubtotal_sumgst_charges_sumr   itemr   r   rs   applicable_discountrb   re   r   discount_percentager}   r~   
gst_values
gst_amountgst_typegst_percentcustomization
items_datar   
coupon_objr   r^   user_locationra   r   r   r   rq   some_one_orderrF   rF   rL   get_cart_items_response   s   


  	.
z%CartViewMixin.get_cart_items_responsec           	   
   C   s2  d}zjt |tr-|jdkr"|jpdd | }|jr!t||jpd}nI|jdkr,|jp+d}n>t |trktj	j
|d }|rP|j|krPtj	j
|d }|sOd}ntj	j
|d	 }|rk|j|krk|jjri|jj}nd}W n ty } zt| W Y d }~nd }~ww ztt|d
W S  ttfy   Y dS w )Nr   
percentager   r   amountreferral_code	user_uuidg      Y@r   rP   )r   r"   
CouponTyper   MaxDiscountAmountForPercentageminDiscountAmountrS   r-   rQ   rn   rR   r   r   r   r#   r   rf   	Exceptionloggingerrorr\   r   	TypeError
ValueError)	r]   r   rK   r   savingsreferralhas_previous_ordersr   erF   rF   rL   r   K  sD   






z&CartViewMixin.calculate_coupon_savingsN)r   )__name__
__module____qualname__ri   rr   r   r   rF   rF   rF   rL   rC   F   s    
: rC   c                   @      e Zd Zdd ZdS )AddOrUpdateCartViewc              
   C   s  |j d}zt|trt|n|}W n tjy(   tdddtj	d Y S w |j d}|j dd}|sF|sF|sFtdd	dtj	dS |j
jrP|j
}d }n|j d
}d }tjj|r_|nd |sd|nd d\}}	|rtjj|t d }
|
r|
|_|  | |dS tjj|d }|r|j
|krtjj|d }|s||_|  | |dS tdddtj	dS tdddtj	dS tjj|d }|r|j
|krtdddtj	dS ||_|  | |dS tdddtj	dS |rd |_d|_|  | |dS |D ]}|d}|dd}|dg }|r$|dkr0tdddtj	d  S tt|d}tjj||d\}}t|}||_ |  g }|D ]}|d }|d!}|d"}|ri|j!|nd }|rz=t"jj||d#}|d$v r|d$v r|s|#  W qO||_$||_%|r||_&|d u rd |_&|  |'|j( W qO t"j)y   Y qOw |d$v r|s|sŐqOt"jj*|||d%}|r||_&|  |'|j( qOt"jj|d&j+|d'#  q	| |d(S ))Nskusr   z%Invalid JSON format for 'skus' field.r
   rc   r	   r   remove_couponFz)SKU data or coupon code must be provided.anonymous_id)r   r   )r   validity_end_date__gtezCoupon added successfully!r   r   z#Referral code applied successfully!z1Referral code is only valid for first-time users.z&You cannot use your own referral code.r   z-Coupon code is only valid for approved users.z!Coupon code applied successfully!z(Invalid or expired coupon/referral code.rE   zCoupon removed successfully!r   r   r   customisationz;SKU ID and quantity must be provided and greater than zero.r   )rk   r   r   r   r   )r   	cart_item)rE   N)r   r   r   )r   )id__inzCart Updated Successfully!),r   getr   rS   jsonloadsJSONDecodeErrorr   r
   HTTP_400_BAD_REQUESTr   is_authenticatedr   rQ   get_or_creater"   rn   r1   nowrR   r   saver   r-   r   r   r   r#   r   r   r   lenr   FILESr   deleter   r   r   r   r   DoesNotExistcreateexclude)r]   requestsku_data_rawsku_datar   r   r   r   rk   createdr   r   r   r   sku_infors   r   customization_datar   r   _total_custom_entriesexisting_custom_idscustomr   r   r   r   r   
new_customrF   rF   rL   postq  s   









	

zAddOrUpdateCartView.postNr   r   r   r
  rF   rF   rF   rL   r   p      r   c                   @   r   )RemoveFromCartViewc                 C   sh   t t|d}|j}|  tjj|d}|r|  |j s.|  t	ddd dt
jdS | |dS )Nr   rj   r   zCart is now empty.r
   rc   r   r	   z$Item removed from cart successfully!)r   r   rk   r   r(   rQ   rn   r   r   r   r
   ro   r   )r]   r   r   r   rk   some_one_elserF   rF   rL   r   3  s$   
	zRemoveFromCartView.deleteN)r   r   r   r   rF   rF   rF   rL   r  2  r  r  c                   @   r   )FlushCartViewc                 C   s   |j jrtjj|j d }nz|jd}tjj|d }W n   d }Y |s4tddd dt	j
dS tjj|d}|rA|  |j   |j sQ|  tdd	d dt	j
dS )
Nr   r   r   r   No cart found for this user.r  r	   rj   zCart flushed successfully.)r   r   r   rQ   rn   rR   r   r   r   r
   ro   r(   r   r   r   r   )r]   r   rk   r   r  rF   rF   rL   r
  P  s,   


zFlushCartView.postNr  rF   rF   rF   rL   r  O  r  r  c                   @   r   )GetCartViewc                 C   st   |j jrtjj|j d }nz|jd}tjj|d }W n   d }Y |s4tddd dt	j
dS | |dS )	Nr   r   r  r   r  r  r	   zCart retrieved successfully!)r   r   r   rQ   rn   rR   r   r   r   r
   ro   r   )r]   r   rk   r   rF   rF   rL   r
  o  s   
zGetCartView.postNr  rF   rF   rF   rL   r  n  r  r  c                   @      e Zd Zdd Zdd ZdS )DeliverySlotSelectionViewc              
   C   s  z|j jrtjj|j d }d}d }|r*|jr*d}|j}|j|j|j	|j
|jd}|  }g }t }tt }	|D ]Z}
tddD ]R}|	t|d }tt| |
j}tt| |
j}|dkrm||	krmqC|
j}||v ruqC|| |d d	|d
 }|||
j|d|d qCq<|jdd d |d d }tdd|||dtj dW S tdddtj!dW S  t"y } ztddt#|dtj!dW  Y d }~S d }~ww )Nr   FT)	shop_name
shop_phoneshop_locationlatitude	longituder      )daysz%d %b %Y %I:%M %pz to z%I:%M %p%Y-%m-%d)delivery_slotslot_iddate
start_timec                 S   s   | d | d fS )Nr   r!  rF   )xrF   rF   rL   <lambda>  s    z/DeliverySlotSelectionView.get.<locals>.<lambda>keyr   z0Available delivery slots retrieved successfully!)r
   rc   r   pickup_availableshop_detailsr	   zUser is not authenticated.r   An unexpected error occurred.r
   rc   	exception)$r   r   r+   rQ   rn   rR   shop	unit_name
contact_nounit_locationr  r  get_available_delivery_slotssetr1   r   r   ranger0   
make_awarer/   combiner   r!  end_timer   addstrftimer   sortr   r
   ro   r   r   rS   )r]   r   r   r&  r'  r+  available_slots
slots_dataseencurrent_timeslot
day_offsetfuture_dater!  r4  r%  r  r   rF   rF   rL   r     s   

zDeliverySlotSelectionView.getc                 C   s"   t  }tjjdddd}|S )z-Retrieve active and available delivery slots.Tactive)is_availabler
   r!  )r1   r   r   rQ   rn   rZ   )r]   r   r8  rF   rF   rL   r/    s   z6DeliverySlotSelectionView.get_available_delivery_slotsN)r   r   r   r   r/  rF   rF   rF   rL   r    s    Ur  c                   @   r   )!AddOrUpdateSomeOneElseOrderDetailc              
   C   s  |j dd}|j dd}|j dd}tjj|jd }|j dd}|s4|s4tddd	tj	d
S |rt
jj|d }|r|jdkrPtddd	tj	d
S z/tjj|d\}}	|r^|nd|_|re|nd|_|rl|nd|_|  tdd||dtjd
W S  ty }
 ztddt|
dtjd
W  Y d }
~
S d }
~
ww d S |s|s|stddd	tj	d
S |stddd	tjd
S z/tjj|d\}}	|r|nd|_|r|nd|_|r|nd|_|  tdd||dtjd
W S  ty }
 ztddt|
dtjd
W  Y d }
~
S d }
~
ww )Nrl   rE   rm   rc   r   order_idr   z%other person details should be given.r   r	   )uuidCustom Ordersz,Invalid Order type please check order detail)ordersr   z(Some one else data created successfully!r
   rc   rl   rm   z"Some one else data creation failedr
   rc   r   z5Cart detail and other person details should be given.z,Cart couldn't found please check cart numberrj   )r   r   r   rQ   rn   r   rR   r   r
   r   r   
order_typer(   r   rl   rm   rc   r   HTTP_201_CREATEDr   rS   HTTP_500_INTERNAL_SERVER_ERRORrp   )r]   r   rl   rm   rc   rk   rB  ordersome_oner  r   rF   rF   rL   r
    s   
z&AddOrUpdateSomeOneElseOrderDetail.postNr  rF   rF   rF   rL   rA    r  rA  c                   @   r   )GetSomeOneElseOrderDetailc                 C   sr   t jj|jd }|r/tjj|d }|r%tdd|j|jdt	j
dS tddd	t	jdS tdd
d	t	jdS )Nr   rj   r   z*Some one else data retrieved successfully!rF  r	   r   Some one else data not foundr   Cart not found)r   rQ   rn   r   rR   r(   r   rl   rm   r
   ro   rp   )r]   r   rk   some_one_datarF   rF   rL   r   /  s0   zGetSomeOneElseOrderDetail.getNr   r   r   r   rF   rF   rF   rL   rM  .  r  rM  c                   @   r   )DeleteGetSomeOneElseOrderDetailc                 C   s   t jj|jd }|r9tjj|d}| }|j}|j}|r/|  t	dd||dt
jdS t	ddd	t
jdS t	dd
d	t
jdS )Nr   rj   r   z(Some one else data deleted successfully!rF  r	   r   rN  r   rO  )r   rQ   rn   r   rR   r(   rl   rm   r   r   r
   ro   rp   )r]   r   rk   rL  rP  rl   rm   rF   rF   rL   r
  H  s8   z$DeleteGetSomeOneElseOrderDetail.postNr  rF   rF   rF   rL   rR  G  r  rR  c                   @   r  )CheckoutAPIViewc                 C   D   	 dt dd t tj t tj }tjj|d s!|S qzGenerate a unique order ID.TIDr   i  order_ID	randomrandintchoicestringascii_uppercaser   rQ   rn   r   r]   rB  rF   rF   rL   generate_unique_order_idh  
   *z(CheckoutAPIView.generate_unique_order_idc           6      O   s  z|j }|jdd}t|}|jj}td|  d}|dks.|dks.|dks.|dkr1d	}n|d
kr8d}n|dks@|dkrCd}nd}tt	|d}	|j
dd}
d }d }|
s|j
d}tt|d}tjtjd}d|j d|j d| }t|}|jdkr| }|d dkr|d d d }d } } }}|D ]"}|d }|d }d |v r|}d!|v r|}d"|v r|}d#|v r|}qntdd$t| d%tjd&W S tdd'd(tjd&W S |j
d)}tt|d}|j}|j
d*}tt|d}|j}|
rd+nd,}|jsd-}d } |
s*tjj|j  d.|j! |j"|j#|||||j|j|j$|j%d/} | & }!t' }"|"(|	d0}#|#j
d1 }$|$d2 }%|$d3 }&|$d4 }'|$d5 }(|$d6 })|$d7 }*|$d8 }+t)* ; z	t+jjd[i d9|!d:|d;d<d=|d>| rw| nd d?|j
d?dd@|j
d@ddA|dB|
s|ndCd7|*d3|&dD|+dE|%d5|(d6|)d4|'dFdGdHt,- dI|},t.jj/|	dJ0 }-|-r|,|-_1|-2  |,j3d,ks|,j3d+kr||,_4|,2  n*|,j3d-krzt5j0 }.W n t6y }/ zd }.W Y d }/~/nd }/~/ww |.|,_7|,2  |	j89 D ]}0|0j:}1|0j;}2|1j<|2 }3t=jj|1j>j?|,|1|2|3dK qt@jtjAtjBfdL}4|4jCtD|*dM dNdOdP}5tEjj|,|5dQ dRdS tdOdT|,jF|5dQ |5dU |*dVdWtjGd&W W  d    W S  t6y }/ z"dX|,_H|,2  tddYt|/dZtjd&W  Y d }/~/W  d    W S d }/~/ww 1 sw   Y  W d S  t6y }/ ztddYt|/dZtjd&W  Y d }/~/S d }/~/ww )\NHTTP_USER_AGENTrE   Platform : OtherWindowsMac OS XLinuxUbuntuWebAndroidAndriodiOSFlutter Mobile App / iOSIOSr   pickupF
address_idr   r$  z9https://maps.googleapis.com/maps/api/geocode/json?latlng=,z&key=   r
   OKresultsr   address_componentstypes	long_nameroutelocalityadministrative_area_level_1postal_codez1Unable to fetch address details from Google Maps.r
   rc   excr	   z$Error connecting to Google Maps API.r   r  deliver_datePick UpLocal OrdersLong Distance Orders rl   house_number_or_name	land_markstreetcitystate_or_provincepin_coder  r  address_typecontact_numberCart data fetched successfullyr   rK   r   re   r   r   r   ra   rX  rH  order_status	New Orderr   drop_addressdelivery_instructioncooking_instructiondelivery_slot_datedelivery_slot_time19:00delivery_charges	sub_totalcolor_statusWhitecolor_status_updation_timeplatformrj   rx   rK  r   r   priceauthr   INRr   )r   currencypayment_capturer   pending)rK  razorpay_order_idpayment_statusOrder Created Successfullyreceipt)rB  r  razorpay_payment_linkr   r  Failedr(  r)  rF   )Ir   METAr   r   osfamilyr   infor   r   r   r,   
googlemapsClientr<   GOOGLE_MAPS_API_KEYr  r  requestsstatus_coder   r   rS   r
   r   r   r!  r+   r+  r    rQ   r   
first_name	last_nameflat_nolandmarkr  rm   r`  rC   r   r2   atomicr   r/   r   r(   rn   rR   rE  r   rH  
store_uuidr   r   pu_uuidr   r   r   r   r   r!   r   r   razorpayRAZORPAY_KEY_IDRAZORPAY_KEY_SECRETrK  intr$   rX  rI  r  )6r]   r   argskwargsr   	ua_string
user_agentr  platform_datark   ro  addressr  rp  google_maps_api_keygeocode_urlresponser   ru  r  r  stater  	componentrv  rw  delivery_slot_idr  r  r   	shop_uuidrH  r  rB  
cart_mixincart_responser   rK   r   re   r   r   r   ra   rK  r  pur   r   r   r   r  razorpay_clientrazorpay_orderrF   rF   rL   r
  p  s   	

 
	





TT`zCheckoutAPIView.postNr   r   r   r`  r
  rF   rF   rF   rL   rS  f      rS  c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	CouponsListViewzf
    View to list all available valid coupons and calculate the savings based on the user's cart.
    c                 C   s  z|j jrtjj|j d }nz|jd}tjj|d }W n   d }Y |s5tdddt	j
dW S | |d}|jd	i d
d}tjj|d}tjjt d}g }|D ]G}	| |	|}
d}d}|
rq| |	|
|}d}||	j|	j|	j|	j|	j|	jdkr|	jnd |	jdkr|	jnd |	j|	jr|	jjnd |	j||d qZtdd|dt	jdW S  ty } ztddt |dt	j
dW  Y d }~S d }~ww )Nr   r   r  r   zNo cart found for the user.r   r	   zCart detailsr   rK   rj   )r   FTr   r   )coupon_namer   coupon_descriptioncoupon_typeminimum_bill_amountr  r   max_discount_amounticonterms_and_conditionsr   
applicabler   z%Valid coupons retrieved successfully.)r
   rc   couponsr(  r
   rc   r   )!r   r   r   rQ   rn   rR   r   r   r   r
   r   r   r   r"   r1   r   get_applicable_itemscalculate_savingsr   
CouponNamer   CouponDescriptionr   TotalBillAmountr   r   r   Iconr   TermsAndConditionsro   r   rS   )r]   r   rk   r   price_data_response
cart_totalr   valid_couponsapplicable_couponsr   applicable_itemsr   is_applicabler   rF   rF   rL   r
  \  sv   zCouponsListView.postc                    s   g } j dkr fdd|D }|S  j dkr" fdd|D }|S  j dkr2 fdd|D }|S  j dkr@ fd	d|D }|S )
zw
        Check if any items in the cart match the applicable categories, subcategories, or SKUs of the coupon.
        r   c                    s    g | ]}|j  j v r|qS rF   )r   r   r   rH   r   r   rF   rL   rM     s    z8CouponsListView.get_applicable_items.<locals>.<listcomp>r   c                    $   g | ]}|j jj j v r|qS rF   )r   r   r   r   r   r  r  rF   rL   rM     s
    r   c                    r  rF   )r   r   r   r   r   r  r  rF   rL   rM     s    r   c                    s"   g | ]}|j j j v r|qS rF   )r   r   r   r   r  r  rF   rL   rM     s
    )CouponOn)r]   r   r   r  rF   r  rL   r    s*   







z$CouponsListView.get_applicable_itemsc                 C   sX   d}||j kr%|jdkr|j}n|jdkr%|jd | }|jr%t||j}t|d}|S )zu
        Calculate the savings for the user based on the coupon type (DiscountAmount or DiscountPercentage).
        r   r   r   r   rP   )r  r   r   r   r   r   r\   )r]   r   r  r  r   rF   rF   rL   r    s   



z!CouponsListView.calculate_savingsN)r   r   r   __doc__r
  r  r  rF   rF   rF   rL   r  W  s
    O$r  c                   @   r   )VerifyPayBillDeskc                 O   s  z%|j d}tjj|d}td|j  tjj|d}|j}|j	
 }ztd|  |j	dks:|j	dkrd|_|  |jdkrq|j}tt|d	}	td
|	  |	  |	j}
td|
  |
rqtjj|
d  ztjd|j|jjd W n   Y |jdkrtddt|j dddW W S |jdkrtddt|d|idj dddW W S |jdkrtddt|j dddW W S tddt|j dddW W S d|_|  td|j dt    tdddddW W S  t!y& } z(d|_|  td|j d | d!t    tdd"dddW  Y d }~W S d }~ww  t!yg } z4tjj|d#}|j}d|_|  td|j d | d!t    tddt"|d$ddW  Y d }~S d }~ww )%NrB  rW   the payment value is rK  paidPaid	ConfirmedrD  r   z the cart value isz the custom_coupon value isr   Order CreationsenderrB  store_idr  r   Payment Verified Successfullyr
   rc   order_detailsrr  r	   r   contextr  r  zPayment Failed  for z:
r   r(  r      Payment Verification Failed for : 
Payment verification failedrB  r)  )#r   r   r   rQ   loggerr  r  r$   rK  r  lowerr  r   rH  r   r   r   r   r   r#   rn   r   sendrX  r  rC  r   r4   r9   r7   r   	traceback
format_excr   rS   )r]   r   r  r  rB  rK  paymenttestr   rk   r   r   rF   rF   rL   r
    s   







	
	
	
zVerifyPayBillDesk.postNr  rF   rF   rF   rL   r    r  r  c                   @   r   )VerifyPaymentAPIViewc              
   O   s  |j }|jd}|jd}|jd}ztjj|d}|j}	tjtj	tj
fd}
|||d}z|
j| d|_||_|  d|	_|	  tt|d	}|  |j}|r`tjj|d
  ztjd|	j|	jjd W n   Y |	jdkrtddt|	jdddW W S |	jdkrtddt|	jdW W S |	jdkrtddt |	jdddW W S tddt|	jdddW W S  tj!j"y   d|	_|	  t#$d|	j d tddddd Y W S  t%y } z#d|	_&|	  t#$d|	j d|  tdddddW  Y d }~W S d }~ww  t%yK } z/tjj|d}|j}	d|	_|	  t#$d|	j d|  tddt'|dddW  Y d }~S d }~ww ) Nr  razorpay_payment_idrazorpay_signature)r  r  )r  r  r  r  r  r   r   r  r  r  r   r  r  rr  r	   rD  r  r  zPayment Failed for z : Signature Verification Failed r   r  r   r  r  r  r(  r)  )(r   r   r   r$   rQ   rK  r  r  r<   r  r  utilityverify_payment_signaturer  r  r   r  r   r   r   r   r#   rn   r   r  rX  r  rC  rH  r   r4   r9   r7   errorsSignatureVerificationErrorr  r   r   r
   rS   )r]   r   r  r  r   r  r  r  r  rK  r  paramsrk   r   r   rF   rF   rL   r
  X  s   





	



zVerifyPaymentAPIView.postNr  rF   rF   rF   rL   r
  W  r  r
  c                   @   r   )PastOrdersListAPIViewc                 O   s   |j }tjj|djddd}t|ddj}|D ]2}|d dkr,|d	 d
kr,d|d	< |d dkr7d|d< q|d dkrBd|d< q|d dkrLd|d< qtdd|dt	j
dS )Nr   r  )r  -created_dateTmanyrH  r  r  	DeliveredOrder collectedr  homeHomeworkWorkothersOthersr   z Past orders fetched successfully)r
   rc   rE  r	   )r   r   rQ   rn   r   rZ   r5   r   r   r
   ro   )r]   r   r  r  r   rE  
serializerirF   rF   rL   r     s*   

zPastOrdersListAPIView.getNrQ  rF   rF   rF   rL   r    r  r  c                   @   r   )PastOrderDetailAPIViewc                 C   s  ztt jj||jd}|jdkrt|j}nT|jdkr@t|j}|ddks-|ddkr?tjj	|d
 }t|j}||d< n)|jd	krOt|d
|idj}n|jdkrdt|j}|d dkrcd|d< nt|j}tdd|dtjdW S  t jy   tddttdtjd Y S w )N)rC  r   r  r  r  
Despatchedr  r  courier_detailsrD  r   r  r  r  r   z"Order details fetched successfullyr  r	   r   z"Error while fetching order detailsr|  )r   rQ   r   r   rH  r4   r   r7   r&   rn   rR   r8   r9   r   r
   ro   r   rS   r   )r]   r   
order_uuidrK  r  order_deliveryr"  rF   rF   rL   r     sF   








zPastOrderDetailAPIView.getNrQ  rF   rF   rF   rL   r     r  r   c                   @   r   )AddressChangeViewc                 C   s  |j jr|j }|jd}tjj||d}tjj|d }d }|j	r|j	}|j
|jf}|j
|jf}tjtjd}	|	j||dd}
|
d d d	 d d
 dkrx|
d d d	 d d d }||jd krntddddddS tddddddS tddddddS tddddddS d S )Nrp  )r   r   r   r$  driving)originsdestinationsmoderowsr   elementsr
   rs  r   valuei  r   zAddress change applicable.T)r
   rc   proceedrr  r	   zDAddress change not possible. Address is outside the delivery radius.F)r   r   r   r   r,   rQ   r+   rn   rR   r+  r  r  r  r  r<   r  distance_matrixdelivery_radiusr   )r]   r   r   rp  r  r   r+  new_address_coordsshop_location_coordsgmapsresultroad_distancerF   rF   rL   r
     sX   			zAddressChangeView.postNr  rF   rF   rF   rL   r%    r  r%  c                   @   r   )CustomOrderCheckoutAPIViewc                 O   sV  z	|j jr|j }|jd}tjj|d }|jdkr&t	dddW S |s0t	dddW S t
  tjj|djd|jd	d
|jdd
d}tj|jfdd |dkr^tdz;|j}|tjtd|dttjd ddddddd}	tj|	dd}
t|
tjtjtj}t|tj tjtj}W n' ty } zt	ddt|dt!j"dW  Y d }~W  d    W S d }~ww z)ddtt#$ %d d
d d! tt&t d"}d#}t'j(|||d$}|)  W n0 t'j*y } z"d%|_|+  t	dd&t|dt!j"dW  Y d }~W  d    W S d }~ww z
t,|j-tj}W n/ t.yT } z"d%|_|+  t	dd't|dt!j"dW  Y d }~W  d    W S d }~ww zt/|t0sct.d(| d)|vrot.d*| W n1 t1t.fy } z"d%|_|+  t	dd+t|dt!j"dW  Y d }~W  d    W S d }~ww zt2jj3||d) d,d- W n/ ty } z"d%|_|+  t	dd.t|dt!j"dW  Y d }~W  d    W S d }~ww t	d/d0|j||d1d2t!j4dW  d    W S 1 sw   Y  W d S t	dd3dW S  ty* } zt	dd4t|dt!j"dW  Y d }~S d }~ww )5NrB  rW  Bill Createdr   zPayment not allowed!r   zOrder not found!r  r  rE   r  )r  r  r  ,  	countdownz(Update failed! Rolling back transaction.%Y-%m-%dT%H:%M:%S+05:30356orders/payment_return_url/DIRECTinternet	123.0.0.1IMozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0gapplication/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9init_channelipr  accept_header)orderidmercid
order_dater   r  ruitemcodedevicerq  :
separators#Failed to prepare BillDesk payload.r)  r	   application/jose-   zContent-TypeAcceptz
BD-TraceidzBD-Timestamp9https://uat1.billdesk.com/u2/payments/ve1_2/orders/createheadersr   r  "Failed to connect to BillDesk API.$Failed to decrypt BillDesk response.$Decrypted data is not a dictionary: 	bdorderid.Missing 'bdorderid' key in BillDesk response: $Invalid BillDesk response structure.r  rK  bill_desk_order_idr   Failed to create payment record.r   r  )rB  billdesk_paramsr   r  User not Authenticatedr(  )5r   r   r   r   r   rQ   rn   rR   r  r   r2   r  updater   apply_asyncrX  r   r   r<   BILLDESK_MERCHANT_IDtimer6  rS   DOMAINr   dumpsrB   encrypt_jwe_billdeskBILLDESK_ENCRYPTION_KEYBILLDESK_KEY_IDBILLDESK_CLIENT_IDsign_jws_billdeskBILLDESK_SIGNING_KEYr
   r   rC  uuid4replacer  r  r
  raise_for_statusRequestExceptionr   decrypt_jwe_billdesktextr   r   dictKeyErrorr$   r   rI  )r]   r   r  r  r   rB  rK  order_updater   payloadpayload_jsonencrypted_datasigned_encrypted_datar   rX  r   r  decrypted_datarF   rF   rL   r
  \  s  

	"3	>	
L	
[	*qzCustomOrderCheckoutAPIView.postNr  rF   rF   rF   rL   r5  Z      r5  c                   @   r   )AdListAPIViewc              
   C   st   zt j }t|dd}tddd|jidtjdW S  ty9 } ztdd	t	|d
tj
dW  Y d }~S d }~ww )NTr  r   zAd Listed Successfullyadsr  r	   r   r(  r)  )r%   rQ   r   r6   r   r   r
   ro   r   rS   r   )r]   r   r  ad_serializerr   rF   rF   rL   r     s*   
zAdListAPIView.getNrQ  rF   rF   rF   rL   r    r~  r  c                   @      e Zd ZdZdd ZdS )DiscountDetailViewz_
    View to retrieve the details of a selected discount and list the associated products.
    c                    s  z9|j jrtjj|j d n|jd}tjj|d r:jr:jj	}t
jj|dd}dd |D  tt|d}g }|jd	krT|j }tjj|d
}	n0|jdkrf|j }
tjj|
d}	n|jdkrs|j }|}	n|jdkr|j }tjj|d}	|	D ]}tjj|d }|r|jjnd }rjrtjj|ddgd}ntjj|ddgdd}|j|j|j|jr|jnd|j r|j jnd |j rt !|j jd|jd   nd || r| j"nd | r| j#nd | r| j$nd  fdd|D |j jr!|jdd t%jj|j dD v ndd}|&| qt'dd|j(|j)|dt*j+d W S  t,yZ } zt'dd!t-|d"t*j.d W  Y d }~S d }~ww )#Nr   r   r  )sales_unit__uuidr   c                 S   s   i | ]}|j r|j j|jqS rF   )r   r   shop_admin_status)rH   	selectionrF   rF   rL   
<dictcomp>+  s    
z*DiscountDetailView.get.<locals>.<dictcomp>r   r   )item_category__inr   )item_sub_category__inr   r   )skus__in)r   VisiblezOut of Stock)r   sku_status__in   )r   r  sku_expiry_duration__gtr   r   r   c                    s0   g | ]}|j rjr |jn|jd qS ))rt   
sku_status)rt   r+  r   r   r  )rH   r   sku_status_mapr   rF   rL   rM   e  s    z*DiscountDetailView.get.<locals>.<listcomp>c                 S   s   g | ]}|j jqS rF   )r   r   )rH   wishlistrF   rF   rL   rM   l  s    F)
product_idrx   product_typer~   r  
offerpriceproduct_imgrt   rw   rv   r   r  z5Discount details and products retrieved successfully.)r
   rc   discount_namediscount_codeproductsr	   r(  r  )/r   r   r+   rQ   rn   rR   r   r   r+  rC  r   select_relatedr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   veg_or_non_veg_statusr   r   r   r   r   
from_floatrt   rw   rv   r   r   r   DiscountNameDiscountCoder
   ro   r   rS   r   )r]   r   discount_idr   shop_idproduct_selectionsre   product_info_listapplicable_categoriesr  applicable_subcategoriesapplicable_productsapplicable_skusr   ry   product_image_urlr   product_infor   rF   r  rL   r     s   









,,
zDiscountDetailView.getNr   r   r   r  r   rF   rF   rF   rL   r        r  c                   @   r  )DiscountsListViewzI
    View to list all discounts with DiscountName and StandardImage.
    c              
   C   sR  zd }|j jrtjj|j d }n|jdd}|r%tjj|d }d}|rA|jrAt	
d t
d|jj d |j}d	}ztj }W n   g }Y g }|d	kr|D ]}|jd
kr{|jj|gd rz||j|j|jru|jjnd d qW|jdkr|jj|gd r||j|j|jr|jjnd d qW|jdkr|jj|gd r||j|j|jr|jjnd d qW|jj|gd r||j|j|jr|jjnd d qWn|D ]}|jd
kr|j D ]}	|	jr||j|j|jr|jjnd d  nqq|jdkr1|j D ]}
|
jr.||j|j|jr'|jjnd d  nqq|jdkrZ|j D ]}|jrW||j|j|jrP|jjnd d  nq<q|j D ]}|jrz||j|j|jrs|jjnd d  nq_qtdd|dtjdW S  ty } ztddt|dtj dW  Y d }~S d }~ww )Nr   r   rE   r  long_distancezQ////////////////....User Location Fetched................////////////////////////z////////////////////////////.......Shop Found : z........./////////r+  r   )sales_unit__in)r   r  StandardImager   r   r   z!Discounts retrieved successfully.)r
   rc   rb   r	   r   r(  r  )!r   r   r+   rQ   rn   rR   r   r   r+  r   r  r  r,  r   r   r   r   r   r   r   r  r  r   r   r   r   long_distance_availabilityr   r
   ro   r   rS   r   )r]   r   r   r   rH  r  rb   discounts_datare   categorysub_categoryr   r   r   rF   rF   rL   r     s   




 	
	zDiscountsListView.getNr  rF   rF   rF   rL   r    r  r  c                   @   r  )Customorder_placingc                 C   rT  rU  rY  r_  rF   rF   rL   r`  	  s
   *z,Customorder_placing.generate_unique_order_idc                 C   s  zY|j }|jdd}t|tr| dk}|j|kr&||_|jdgd tt	|d}|jd}|jd}|d u r>d}|j
d	d}t|}	td
|  |	jj}
td|
  d}|
dkso|
dkso|
dkso|
dkrrd}n|
dkryd}n|
dks|dkrd}nd}|stdditjdW S |jstdditjdW S tt|d}|stdditjdW S |j}|stdditjdW S |jd}|stdd d!tjdW S ztt|d"}W n  ty } ztdd#t|d$tjdW  Y d }~W S d }~ww tjj|j d%|j |j|jd&d'd(d|j |j!|j"d)
}| # }t$jj||d*||||d+d,||d-}t$jj|d.}|jd/}|rFt%jj||d0 nt%jj|d1 td2d3t&|jd4d5dW S  tyz } ztdd6t|d7tj'dW  Y d }~S d }~ww )8Nopt_inFtrueupdate_fields)pkdescriptionrc   rE   rb  $Platform for the user agent string: rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  r   zDescription field is required!r	   zUser is not authenticatedr   zPlease add your locationzNo shops found at your locationrp  r   +Address ID is required for delivery orders.r   r   Failed to fetch address.r)  r  r  r  r  )
rl   r  r  r  r  r  r  r  r  r  rD  Enquiryr  )rX  custom_productrH  r   r  r  rc   r  r  r  r  rW  r   )rB  r   r  r   z"Custom order created successfully!r  rr  r(  rG  )(r   r   r   r   rS   r  r  r   r   r   r  r   r   r  r  r  r   r
   r   r   HTTP_401_UNAUTHORIZEDr+   r+  r,   r   r    rQ   r   r  r  r  r  r  r  r  r`  r   r   r3   rJ  )r]   r   r   r   r  r  r  rc   r  r  r  r  locationr+  rp  r  r   r  rB  	new_orderrK  r   rF   rF   rL   r
    s   

 zCustomorder_placing.postNr  rF   rF   rF   rL   r    s    r  c                   @   r  )NotificationListViewz0
    View to list all notification history.
    c                 C   sh  z|j jrztjd}|j|j d }W n   g }Y g }|D ]_}|jdkr\t|j	}t
|j	j}||j|j|j|j	j|j	j|j	jt|jdt|jdd|j|jd q!||j|j|j|j	j|j	j|j	jt|jdt|jddd	 q!td	d
|dtjdW S tdddW S  ty } ztddt|dtjdW  Y d }~S d }~ww )Nr  )sendTor6  r  z%H:%M:%S)r   SendmsgDescriptionOrderIDrH  r#  r   rg  notification_typeproduct_detailsbill_detailsNormal)	r   r  r  r  rH  r#  r   rg  r  r   z,Notification history retrieved successfully.)r
   rc   notification_listr	   r   rc  r   r(  r  )r   r   r'   rQ   rZ   rn   r   r  r:   r  r;   r  r   r   r  rX  rH  rC  r   created_dater6  r   r   r
   ro   r   rS   r   )r]   r   r  notification_list_datanotificationr  r  r   rF   rF   rL   r     sr   



	
zNotificationListView.getNr  rF   rF   rF   rL   r  ~  s    r  c                   @   r  )ExcelWriterz;
    View for user login (also used for registration).
    c              
   C   sb   d}zt ||}tdddtjdW S  ty0 } ztdt|dtjdW  Y d }~S d }~ww )N%bill_writer/navya_bill_template2.xlsxr   zPdf bill created successfullyr   r	   r   )rA   r   r
   ro   r   rS   r   )r]   r   rB  tempate_pathoutputr   rF   rF   rL   r
    s   
zExcelWriter.postN)r   r   r   r  r
  rF   rF   rF   rL   r    r  r  c                   @   r   )DownloadBillc              
   C   s   |  }d}zGt|| tjd| d}tj|r*tt|dd| ddW S t|| tj|rCtt|dd| ddW S tddd	t	j
d
W S  tyk } ztdt|d	t	jd
W  Y d }~S d }~ww )Nr  media/output/pdfz.pdfrbT)as_attachmentfilenamer   zFile Not Foundr   r	   )striprA   r  pathjoinr   r@   openr   r
   rp   r   rS   r   )r]   r   rB  template_path	file_pathr   rF   rF   rL   r
    s$   

zDownloadBill.postNr  rF   rF   rF   rL   r    r~  r  c                 C   sH   t | D ]}t j| |}t j|r!t | td|  qd S )Nz	Deleted: )r  listdirr  r  isfileremover   r  )folder_pathr  r  rF   rF   rL   delete_all_files  s   
r  c                   @   r   )DeleteBillsc              
   C   sd   zt d t d tdddtjdW S  ty1 } ztdt|dtjdW  Y d }~S d }~ww )Nr  zmedia/output/excelr   zFiles Deletedr   r	   r   )r  r   r
   ro   r   rS   r   )r]   r   r   rF   rF   rL   r
  	  s   zDeleteBills.postNr  rF   rF   rF   rL   r  		  r~  r  c                   @   r  )CheckoutAPIViewBillc                 C   rT  rU  rY  r_  rF   rF   rL   r`  	  ra  z,CheckoutAPIViewBill.generate_unique_order_idc           8      O   sv  z|j }|r
|jstdddtjdW S |jdd}|jdd }|jdd	}t|t	r5|
 d
k}|j|krD||_|jdgd |rId}nAt|}	td|  |	jj}
td|
  d}|
dkss|
dkss|
dkss|
dkrvd}n|
dkr}d}n|
dks|dkrd}nd}ztt|d}W n  ty } ztddt	|dtjdW  Y d }~W S d }~ww |jdd	}d }d }d }d }|s|jd}|stdddtjdW S ztt|d }W n! ty } ztdd!t	|dtjdW  Y d }~W S d }~ww |jd"}tt|d }|j}|jd#}td$|  ztt|d}|j}|r.d%nd&}|s5d'}W n! tyW } ztdd(t	|dtjdW  Y d }~W S d }~ww d }|s{tjj|j d)|j  |j!|j"d*d+d,d|j#|j$|j%|j&d-}z| ' }W n! t(y } ztdd.t	|dtjdW  Y d }~W S d }~ww z,t) }|*|d/}|jd0 }|d1 }|d2 }|d3 }|d4 }|d5 } |d6 }!|d7 }"W n# t+t,fy } ztdd8t	|dtjdW  Y d }~W S d }~ww t-.  zlt/jjdi d9|d:|d;d<d=|d>|r|nd d?|jd?dd@|jd@ddA|dB|s-|ndCd6|!d2|dD|"dE|d4|d5| d3|dFdGdHt01 d|}#t2j3|#j4fdIdJ zt5jj6|dK7 }$|$rn|#|$_8|$  W n) ty } ztddLt	|dtjdW  Y d }~W W  d    W S d }~ww z%|#j9dMv r||#_:n|#j9d'krt;j7 }%|%st(dN|%|#_<|#  W n) ty } ztddOt	|dtjdW  Y d }~W W  d    W S d }~ww zs|j=> D ]k}&|&j?}'|&j@A rF|&j@> D ]$}(tBjj|'jCjD|#|'dP|'jEdQ})tFjj|)|(jG|(jHr|(jHnd |(jIdR q|&j@J }*tK|&jL|* }+|+dkrDtBjj|'jCjD|#|'|+|'jE|+ dQ qtBjj|'jCjD|#|'|&jL|'jE|&jL dQ qW n) ty } ztddSt	|dtjdW  Y d }~W W  d    W S d }~ww z^tMjN dT},|,}-|jOdUd}.d }/|.PdVr|.QdVdP R }/|r|, dW|/ }-|tMjStTUdX|!dYdZ|-d[d\d]d^d_d`da	}0tVjW|0dbdc}1tXY|1tMjZtMj[tMj\}2tX]|2tMj^tMj[tMj\}3W n) ty } ztdddt	|dtjdW  Y d }~W W  d    W S d }~ww z)dedet	t_` adfdd dg t	tKtTT dh}4di}5tbjc|5|4|3dj}6|6d  W nO tbjey } zAdk|#_ftXg|6jhtMjZ}7|#  tddlt	||0|2|3dmti v ra|6jhndndoti v rj|7ndpdqtjdW  Y d }~W W  d    W S d }~ww z
tXg|6jhtMjZ}7W n0 t(y } z#dk|#_f|#  tddrt	|dtjdW  Y d }~W W  d    W S d }~ww zt|7tjst(ds|7 dt|7vrt(du|7 W n2 t+t(fy } z#dk|#_f|#  tddvt	|dtjdW  Y d }~W W  d    W S d }~ww ztkjj|#|7dt dwdx W n0 tyL } z#dk|#_f|#  tddyt	|dtjdW  Y d }~W W  d    W S d }~ww tdPdz|#j4|0|7|!d{d|tjldW W  d    W S  ty } ztdd}t	|dtjdW  Y d }~W  d    W S d }~ww 1 sw   Y  W d S  ty } ztdd~t	|dtjdW  Y d }~S d }~ww )Nr   zUser not authenticated.r   r	   rb  rE   r  r  Fr  r  Flutter_web_appr  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  r   zFailed to fetch cart.r)  ro  rp  r  r   r  r  r~  r  r  r  r  zFailed to fetch user location.r  r  r  r  r  zFailed to generate order ID.r  r   rK   r   re   r   r   r   ra   z Failed to fetch cart price data.rX  rH  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r7  r8  rj   zFailed to update SomeOneElse.)r  r  z0No production unit found for long distance orderz*Failed to assign store or production unit.r   r  )order_productr   r   r   z Failed to create order products.r<  AuthorizationzToken z?token=r:  r;  BDUAT2K672001r=  r>  r?  r@  rA  rB  )	rF  rG  rH  r   r  settlement_lobrI  rJ  rK  rL  rN  rP  rQ  rR  rS  rT  rV  rW  r  rY  r  zNo responser}  zNo decrypted data)r
   rc   r*  ry  r{  r|  exception_bodyr}  rZ  r[  r\  r]  r^  r  r_  ra  r  )rB  ry  rb  r   r  zFailed to create order.r(  rF   )mr   r   r   r
   r  r  r   r   r   rS   r  r  r   r   r   r  r  r  r   r   r   r   r,   r   r!  r  r+   r+  r    rQ   r   r  r  r  r  r  r  r  rm   r`  r   rC   r   rw  r   r2   r  r   r/   r   r   re  rX  r(   rn   rR   rE  rH  r  r   r  r   r   r   r   r   r!   r   r   r   r   r   r   r   countr  r   r<   rh  rX  
startswithsplitr  rf  rg  r6  r   ri  rB   rj  rk  rl  rm  rn  ro  rC  rp  rq  r  r
  rr  rs  r  rt  ru  localsrv  r$   rI  )8r]   r   r  r  r   r  pf_typer  r  r  r  rk   r   ro  r  r  r  r  rp  r  r   r  rH  r  rB  r  r  r   rK   r   re   r   r   r   ra   rK  r  r  r   r   r   r  customized_countremaining_qtybase_url
return_urlauth_headertokenry  rz  r{  r|  rX  r   r  r}  rF   rF   rL   r
  #	  s  


 
	
 
0


	



1g  :  $
  0	
  >	
  M
  c  c  izCheckoutAPIViewBill.postNr  rF   rF   rF   rL   r  	  r  r  c                   @   r   )BillPaymentAPIc                    s>  |j dd }|jdd }t|tj  dd}tjj|d}t	jj
|d}g d}	 dd	kr9d
}
d}nd}
d} fdd|	D }|
|d< |jd!i | |jdv rZd}n0|jdv rl dd	krid}n!d}n|jdv r|
d
krtd dtjdS tdd dtjdS t||| dd|
d
krdnd|d S )"Ntransaction_responser  rF  rE   rW  r  )bank_ref_nobankidcharge_amountr  rJ  payment_categorypayment_method_typetransaction_error_codetransaction_error_desctransaction_error_typetransactionidtxn_process_type	surcharger   r  successr  zpayment_success.htmlr  zpayment_failed2.htmlc                    s   i | ]	}|  |d qS )rE   )r   )rH   fieldr   rF   rL   r  
  rN   z'BillPaymentAPI.post.<locals>.<dictcomp>r  )r  z"https://navyabaker.svpstaging.com/)ri  rd  z4https://navyabaker.svpstaging.com/order-confirmationz*https://navyabaker.svpstaging.com/checkout)rj  rn  r   r   r	   r   Transaction Failed)r
   rc   detailsr   zPayment Successful!zPayment Failed!)rB  r   rc   checkout_urlrF   )r   r   GETrB   decryptr<   rk  r   rQ   r$   rn   rd  r  r   r
   ro   rJ  r   )r]   r   r  r  r  r  rB  rK  r  extract_fieldsr  templateupdate_datar  rF   r  rL   r
  
  sX   1




zBillPaymentAPI.postNr  rF   rF   rF   rL   r  
  r  r  c                   @   r   )VerifyPaymentAPIViewBillDeskc              
   O   s  |j d}|stdddtjdS ztjj|d}tjj|d}|j}d}t	t
 d	d
d d }	t	tt }
dd|	|
d}tj|d}tj|dd}t|tjtjtj}t|tjtjtj}tj|||d}|jdkrtdd|j|	dtjdW S t|jtj}|dd
}|dkrd|_d|_ d}d}n
d|_d|_ d}d}|!  |!  td|||	dtj"dW S  tj#y   tdd dtj$d Y S  tj#y   tdd!dtj$d Y S  t%y } ztdd"t	|d#tj&dW  Y d }~S d }~ww )$NrB  r   zorder_id is requiredr   r	   rW  r  z<https://uat1.billdesk.com/u2/payments/ve1_2/transactions/getrR  rE   rS  rQ  rT  )rG  rF  rL  rN  rW  rr  zBillDesk API error)r
   rc   r  trace_idauth_status0300r  r  SuccesszTransaction Completedr  Failurer  r   )r
   rc   transaction_statusr  zOrder not foundzPayment record not foundzUnexpected errorr)  )'r   r   r   r
   r   r   rQ   r$   r`  rS   rC  rp  rq  r  rg  r<   rf  r   ri  rB   rj  rk  rl  rm  rn  ro  r  r
  r  ru  rt  r  r  r   ro   r   rp   r   rJ  )r]   r   r  r  rB  rK  r  billdesk_order_idr   r  	timestamprX  ry  rz  r{  r|  r  r}  r  rc   r  r   rF   rF   rL   r
     s   
&z!VerifyPaymentAPIViewBillDesk.postNr  rF   rF   rF   rL   r    r  r  )rg  r  rC  r  r   orders.tasksr   	getLoggerr   r  django.utils.timezoner   user_agentsr   r   decimalr   r   rest_framework.viewsr   rest_framework.responser   rest_frameworkr
   django.shortcutsr   r   shops.modelsr   r   orders.signals.custom_signalsr   products.modelsr   r   r   r   r   r   modelsr   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   accounts.modelsr+   r,   r-   r.   r/   r0   django.utilsr1   	django.dbr2   serializersr3   r4   r5   r6   r7   r8   r9   r:   products.serializersr;   rZ  r]  r  r  django.confr<   django.viewsr=   django.views.decorators.csrfr>   django.db.modelsr?   django.httpr@   r  bill_writer.BillWriterrA   rE   rB   rC   r   r  r  r  r  rA  rM  rR  rS  r  r  r
  r  r   r%  r5  r  r  r  r  r  r  r  r  r  r  r  r  rF   rF   rF   rL   <module>   s    
 X(  , CdH r s{/; t vO    