o
    g=                     @   s  d dl Z d dlZd dlmZ d dlmZmZmZ d dlm	Z	 d dl
mZ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mZ d d
lmZ d dlmZmZ ddlmZ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 Z+dd Z,dd Z-dd Z.dd Z/dd Z0dd Z1dd  Z2e	d!d" Z3e	d#d$ Z4d%d& Z5e	d'd( Z6e	d)d* Z7e	d+d$ Z4e	d,d- Z8d.d/ Z9d0d1 Z:d2d3 Z;d4d5 Z<d6d& Z5ed7d8 Z=e	d9d: Z>e	d;d< Z?e	d=d> Z@e	d?d@ ZAdS )A    N)	timedelta)renderredirectget_object_or_404)login_required)QSum)now)csrf_exempt   )CartCartItemShippingAddressOrder	OrderItemShippingMethod)Shop)ProductCategory)AddToCartFormGuestCheckoutFormShippingAddressForm
SearchFormShippingMethodForm)JsonResponse)messages)MpesaSTKPush)model_to_dictc           	      C   s   t  }| jd}|r|t |dM }| jd}|dkr$|t ddM }n|dkr8t tdd	 }|t |d
M }n|dkrC|t ddM }| jd}|dkrPd}n|dkrWd}n	|dkr^d}nd}tj||}t	j
 }t| d||dS )Ncategory)category_idfiltersaleF)discount_price__isnullnewr   )weeks)created_at__gtebest_sellerT	is_activesort	price_ascselling_price
price_descz-selling_pricename-created_atzshop/product_list.html)products
categories)r   GETgetr	   r   r   objectsr    order_byr   allr   )	requestqueryr   special_filterone_week_agosort_optionr4   r/   r0    r;   &/var/www/html/hyperkenya/shop/views.pyproduct_list   s4   
r=   c                 C   s@   t t|d}tjj|jdj|jdd d }t| d||dS )Nid)r      zshop/product_detail.html)productrecommended_products)r   r   r3   r    r   excluder?   r   )r6   
product_idrA   rB   r;   r;   r<   product_detail:   s   "rE   c           	      C   s   | j dkrbt| j}| rbtt|jd d}|jd }| jjr+t	j
j| jd\}}n| jjp3| j }t	j
j|d\}}tj
j||d\}}|sP| j|7  _|  t| |j d td	S td
S )z$
    Add a product to the cart.
    POSTrD   r>   quantityusersession_key)cartrA   z added to cart.shop:cart_detailr=   )methodr   rF   is_validr   r   cleaned_datarI   is_authenticatedr   r3   get_or_createsessionrK   saver   rG   r   successr-   r   )	r6   formrA   rG   rL   _rK   	cart_itemcreatedr;   r;   r<   add_to_cartE   s    


rZ   c                 C   s   | j jrtjj| j d\}}n| jjs| j  | jj}tjj|dd\}}|j	d
 }tdd |D }t| d||dS )	zi
    Display the cart details for the user or guest.
    Creates a cart if it doesn't already exist.
    rH   N)rK   rI   rA   c                 s   s    | ]}|  V  qd S )N)get_total_price).0itemr;   r;   r<   	<genexpr>v   s    zcart_detail.<locals>.<genexpr>zshop/cart_detail.html)itemstotal_price)rI   rQ   r   r3   rR   rS   rK   creater_   select_relatedr5   sumr   )r6   rL   rY   rK   r_   r`   r;   r;   r<   cart_detailb   s   
rd   c                 C   sd   t t|d}| jjr|jj| jkrtdS n| jj}|jj|kr$tdS |  t	
| d tdS )z'
    Remove an item from the cart.
    r>   rd   rM   zItem removed from cart.)r   r   rI   rQ   rL   r   rS   rK   deleter   rU   )r6   cart_item_idrX   rK   r;   r;   r<   remove_from_cart~   s   rg   c                 C   sv   | j dkr7| jd}| jd}tt|d}|dkr#| jd7  _n|dkr3|jdkr3| jd8  _|  tdS )	NrF   item_idactionr>   	incrementr   	decrementrM   )rN   rF   r2   r   r   rG   rT   r   )r6   rh   ri   rX   r;   r;   r<   update_cart   s   
rl   c              
   C   s  | j jrtjj| j d }n| jjp| j }tjj|d }|r(|j	
 s2t| d tdS t| jp7d}tjjdd}d}| }| jdkrC| jd	}|r_tt|d
}||j7 }| rC| j jrw|jdd}| j |_ |  n|jdd}| jd|_|  tjj| j jr| j nd| j js|jnd|||d}	|j	 D ]}
tjj|	|
j|
j|
 d q|j	   | jd}t j }|st| d t!d tdS t"|}z7|#||d|	j$ }|ddkrd|	_%|	  t&| d td|	j$dW S t| d|dd  W n- t'yB } z t!d|	j$ d|  t| d  |	  tdW  Y d}~S d}~ww t(| d!||||d"S )#zE
    Handle checkout process for both logged-in and guest users.
    rH   rJ   zYour cart is empty.rM   NTr'   rF   shipping_methodr>   F)commitemail)rI   guest_emailshipping_addressrm   r`   )orderrA   rG   pricephone_numberz!Payment configuration is missing.z0Checkout attempted without a Shop configuration.zshop:checkoutzOrder #ResponseCode0Pendingz9STK Push sent. Please complete the payment on your phone.zshop:order_confirmation)order_idzFailed to initiate payment: errorMessagezUnknown errorzSTK Push failed for Order #z: zBAn error occurred while processing your payment. Please try again.zshop/checkout.html)rL   shipping_methodsshipping_formr`   ))rI   rQ   r   r3   r    firstrS   rK   rT   r_   existsr   errorr   r   rF   r   r[   rN   r2   r   costrO   rp   r   ra   r5   r   rA   rG   get_unit_pricere   r   loggingr   initiate_stk_pushr?   mpesa_payment_statusrU   	Exceptionr   )r6   rL   rK   r{   rz   selected_shipping_methodr`   shipping_method_idrq   rr   r]   rt   shopmpesaresponseer;   r;   r<   checkout   s   




r   c                 C   s   t t|d}t| dd|iS )z-
    Display order confirmation details.
    r>   zshop/order_confirmation.htmlrr   )r   r   r   r6   rx   rr   r;   r;   r<   order_confirmation   s   r   c                 C   &   t jj| jdd}t| dd|iS )5
    Display the logged-in user's order history.
    rH   r.   zshop/order_list.htmlordersr   r3   r    rI   r4   r   r6   r   r;   r;   r<   
order_list      r   c                 C       t t|| jd}t| dd|iS z.
    Display details of a specific order.
    )r?   rI   zshop/order_detail.htmlrr   r   r   rI   r   r   r;   r;   r<   order_detail     r   c                 C   s@   | j dd}tjjt|dt|dB dd}t| d||dS 	z5
    Search for products by name or description.
    q )name__icontains)description__icontainsTr'   zshop/search_results.html)r/   r7   )r1   r2   r   r3   r    r   r   r6   r7   r/   r;   r;   r<   search  s    r   c                 C   s   | j }t| dd|iS )z+
    Display user account information.
    zshop/my_account.htmlrI   )rI   r   )r6   rI   r;   r;   r<   
my_account  s   r   c                 C   r   )r   rH   r.   zshop/my_orders.htmlr   r   r   r;   r;   r<   	my_orders&  r   r   c                 C   r   r   r   r   r;   r;   r<   r   /  r   c                 C   s   | j jj }t| dd|iS )z3
    Display the logged-in user's saved items.
    zshop/saved_items.htmlsaved_items)rI   profiler   r5   r   )r6   r   r;   r;   r<   r   9  s   r   c                 C   
   t | dS )z
    About Us page.
    zshop/about_us.htmlr   r6   r;   r;   r<   about_usA     
r   c                 C   r   )z
    Help Center page.
    zshop/help_center.htmlr   r   r;   r;   r<   help_centerH  r   r   c                 C   r   )z"
    Terms & Conditions page.
    zshop/terms_and_conditions.htmlr   r   r;   r;   r<   terms_and_conditionsO  r   r   c                 C   r   )z
    Privacy Policy page.
    zshop/privacy_policy.htmlr   r   r;   r;   r<   privacy_policyV  r   r   c                 C   sN   | j dd}|rtjjt|dt|dB ddntj }t| d||dS r   )r1   r2   r   r3   r    r   noner   r   r;   r;   r<   r   \  s   c              
   C   s  | j dkrz]t| j}|di di d}|di di d}|dkrPtjj|d }|rHd|_	d|_
|  td	|j  td
ddW S td| d|  tdddW S  ty } ztd|  tdddW  Y d}~S d}~ww tdddS )z2
    Handle M-Pesa STK Push payment callback.
    rF   BodystkCallback
ResultCodeMerchantRequestIDr   )account_referencePaidzPayment successful for Order #rU   zPayment successful.)statusmessagez%Payment failed for MerchantRequestID z: ResultCode failurezPayment failed or cancelled.z"Error processing M-Pesa callback: r~   zCallback processing failed.NInvalid request method.)rN   jsonloadsbodyr2   r   r3   r    r|   payment_statusr   rT   r   infor?   r   warningr   r~   )r6   dataresult_codemerchant_request_idrr   r   r;   r;   r<   mpesa_callbacki  s*   
r   c                 C   s"   t j }t }t| d||dS )zS
    List all shipping methods and display the form for creating a new method.
    zshop/shipping_method_list.html)rz   rV   )r   r3   r5   r   r   )r6   rz   rV   r;   r;   r<   shipping_method_list  s   
r   c                 C   sL   | j dkr"t| j}| r|  t| d tdS t| d tdS )zE
    Create a new shipping method and redirect to the list view.
    rF   z%Shipping method created successfully.3There were errors in the form. Please correct them.zshop:shipping)	rN   r   rF   rO   rT   r   rU   r~   r   )r6   rV   r;   r;   r<   shipping_method_create  s   

r   c                 C   sp   t t|d}| jdkr.t| j|d}| r$|  t| d t
dS t	| d t
dS t	| d t
dS )z+
    Edit an existing shipping method.
    pkrF   )instancez%Shipping method updated successfully.r   shop:shipping_method_listr   )r   r   rN   r   rF   rO   rT   r   rU   r~   r   )r6   r   rm   rV   r;   r;   r<   shipping_method_edit  s   
r   c                 C   sF   t t|d}| jdkr|  t| d tdS t| d tdS )zK
    Delete an existing shipping method and redirect to the list view.
    r   rF   z%Shipping method deleted successfully.r   r   )r   r   rN   re   r   rU   r~   r   )r6   r   rm   r;   r;   r<   shipping_method_delete  s   
r   )Br   r   datetimer   django.shortcutsr   r   r   django.contrib.auth.decoratorsr   django.db.modelsr   r   django.utils.timezoner	   django.views.decorators.csrfr
   modelsr   r   r   r   r   r   settings.modelsr   inventory.modelsr   r   formsr   r   r   r   r   django.httpr   django.contribr   stk_pushr   django.forms.modelsr   r=   rE   rZ   rd   rg   rl   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r;   r;   r;   r<   <module>   sh     &R





	

	




