o
    whC                     @   sn  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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mZmZ d dlZd dlZedddd Zedddd Zedddd Z edddd Z!edddd Z"eddej#dd Z$edddd Z%edddd Z&eddd d! Z'eddd"d# Z(dS )$    )renderredirectget_object_or_404)login_required)messages)JsonResponseHttpResponse)	Paginator)QSumF)transactionmodels)Decimal   )Customer)CustomerForm)SaleSaleItemNz/auth/login/)	login_urlc           	      C   s   | j d}tj d}|r'|t|dt|dB t|dB t|dB }g }|D ]/}tjj|ddj	t
d	t
d
d}|d	 pEtd}|d pMtd}|| }||_|| q+t| d||dS )Nqz-date_added)first_name__icontains)last_name__icontains)phone__icontains)customer_id__icontainscreditcustomerpayment_methodtotal_amountcredit_amountr   
total_paid0.00r"   zcustomers/customer_list.html)	customersquery)GETgetr   objectsallorder_byfilterr
   r   	aggregater   r   outstanding_balanceappendr   )	requestr%   r$   customers_with_balancer   credit_salesr   r"   r-    r2   +/var/www/html/hyperkenya/customers/views.pycustomer_list   s>   r4   c                 C   sP   | j dkrt| j}| r|  t| d tdS nt }t| dd|iS )NPOSTzCustomer added successfully!r4   zcustomers/add_customer.htmlform)	methodr   r5   is_validsaver   successr   r   )r/   r6   r2   r2   r3   customer_add8   s   

r;   c           
      C   s   t t|d}tjj|ddd d }tjj|ddjtdtdd	}|d p,td
}|d p4td
}|| }|j	| }|dk rFtd
}||||d}	t
| d|	S )Ncustomer_id)r   
-sale_date   r   r   r   r    r!   r#   r"   r   )r   recent_salescurrent_balance_owedavailable_creditcustomers/customer_detail.html)r   r   r   r(   r+   r*   r,   r   r   credit_limitr   )
r/   idr   r@   total_credit_salesr   r"   rA   rB   contextr2   r2   r3   customer_detailF   s,   
rH   c                 C   sl   t t|d}| jdkr(t| j|d}| r'|  t| d t	d|j
dS nt|d}t| d||dS )	Nr<   r5   )instancezCustomer updated successfully!rH   rE   zcustomers/customer_edit.html)r6   r   )r   r   r7   r   r5   r8   r9   r   r:   r   r=   r   )r/   rE   r   r6   r2   r2   r3   customer_editg   s   

rK   c                 C   sB   t t|d}| jdkr|  t| d tdS t| dd|iS )Nr<   r5   zCustomer deleted successfully!r4   rC   r   )r   r   r7   deleter   r:   r   r   )r/   rE   r   r2   r2   r3   customer_deletez   s   
rM   c              
   C   s(  t t|d}tjj|ddjtdtdd}|d ptd}|d p&td}|| }| jd	krt| j	
d
d}| j	
dd}| j	
dd}	| j	
dd}
| j	
dd}| j	
dd}|dkrnt| d td|jdS ||krt| d td|jdS |dkr|
st| d td|jdS |st| d td|jdS tjj||
dd }|rt| d|
 d td|jdS |dkr|st| d td|jdS ztjj|ddjtdtd djdd d!}|}|D ]+}|dkr n$|j|jptd }t||}|jptd| |_|  ||8 }qtg d"
||}d#| d$| d%}|dkrB|
rB|d&|
 d'7 }n|dkrR|rR|d(| d'7 }|	r\|d)|	 7 }t| | W n ty } zt| d*t|  W Y d }~nd }~ww td|jdS ||d+}t| d,|S )-Nr<   r   r   r   r    r!   r#   r"   r5   amount0r    notescheque_numbercheque_datempesa_referencer   z)Payment amount must be greater than zero.rH   rJ   z5Payment amount cannot exceed the outstanding balance.chequez.Cheque number is required for cheque payments.z,Cheque date is required for cheque payments.)r   rR   r   zCheque number z" already exists for this customer.mpesaz1M-Pesa reference is required for M-Pesa payments.)	remaining)remaining__gt	sale_date))cashCash)rV   zM-Pesa)bankzBank Transfer)rU   ChequezPayment of Ksh z recorded successfully via !z
 (Cheque #)z (Ref: z Notes: zError processing payment: )r   rA   z"customers/make_credit_payment.html)r   r   r   r(   r+   r,   r   r   r7   r5   r'   r   errorr   r=   existsannotater   r   r*   r   r    minr9   dictr:   	Exceptionstrr   )r/   rE   r   rF   r   r"   rA   rN   r   rQ   rR   rS   rT   existing_chequeunpaid_salesremaining_paymentsalecurrent_remainingpayment_for_this_salepayment_method_displaysuccess_messageerG   r2   r2   r3   make_credit_payment   s   


"rp   c                 C   s0   t t|d}t t||d}||d}t| d|S )Nr<   )rE   r   )r   rj   zcustomers/invoice_detail.html)r   r   r   r   )r/   r=   sale_idr   rj   rG   r2   r2   r3   invoice_detail   s   rr   c                 C   sr  ddl m }m} ddlm} tt|d}| jd}| jd}| jdd}|s5| |d	d
 	 }n|
|d	 }|sF| 	 }n|
|d	 }td}	tjj|d|dd}
|
D ]}|	|j7 }	|jpmtd}|dkrv|	|8 }	q`tjj|||d|dkrdnd}|	}g }td}td}td}|d}|D ]z}ttj|j|j}|jdkr||j7 }||j7 }||jd|j d| dd |jd ||d |jr|jdkr||j8 }||j7 }||jd|j d d |j||d q||j7 }||j7 }||jd|j d| d|jd d ||d q|jdd |dkd |||	|||||||d
}t| d|S )Nr   )datetime	timedelta)timezoner<   
start_dateend_date
sort_orderdesc   )days%Y-%m-%dr#   r   )r   r   sale_date__date__ltrY   )r   sale_date__date__gtesale_date__date__lteascr>   z	Invoice #z (r_   )datedescription	cash_salecredit_salecredit_paymentbalancerj   zPayment for Invoice #zSale #c                 S   s   | d S )Nr   r2   )xr2   r2   r3   <lambda>m  s    z$customer_statement.<locals>.<lambda>)keyreverse)
r   statement_entriesopening_balancefinal_balancerv   rw   rx   total_debitstotal_creditstotal_cash_salesz!customers/customer_statement.html)rs   rt   django.utilsru   r   r   r&   r'   nowr   strptimer   r   r(   r+   r*   r   r    rd   PAYMENT_METHOD_CHOICESr   r.   rY   rE   sortr   )r/   r=   rs   rt   ru   r   rv   rw   rx   r   opening_salesrj   credit_paid	all_salesrunning_balancer   r   r   r   sales_for_balancerm   rG   r2   r2   r3   customer_statement  s   










r   c                 C   sv   t dd}d|d< t|}|g d tj }|D ]}||j|j|j	|j
|j|j|j|j|jdg	 q|S )Nztext/csv)content_typez$attachment; filename="customers.csv"zContent-Disposition)	zCustomer IDz
First Namez	Last NamePhoneEmailAddresszCredit LimitzCredit Balancez
Date Addedr|   )r   csvwriterwriterowr   r(   r)   r=   
first_name	last_namephoneemailaddressrD   credit_balance
date_addedstrftime)r/   responser   r$   r   r2   r2   r3   export_customers  s$   



r   c              
   C   s  | j dkr| jd}|st| d tdS |jds't| d tdS zw| 	d}t
|}t| d}tj|d	d
dD ]M}t|dkr|d |d |d |d t|dkr`|d ndt|dkrq|d rqt|d ntdd}tjj|d d stjjdi | |d7 }qBt| d| d tdW S  ty } zt| dt|  tdW  Y d }~S d }~ww t| dS )Nr5   csv_filezPlease select a CSV file.import_customersz.csvzPlease upload a valid CSV file.zUTF-8r   ,")	delimiter	quotechar   r         rP   r?   r#   )r   r   r   r   r   rD   r   )r   zSuccessfully imported z customers.r4   zError importing customers: zcustomers/import_customers.htmlr2   )r7   FILESr'   r   r`   r   nameendswithreaddecodeioStringIOnextr   readerlenr   r   r(   r+   ra   creater:   re   rf   r   )r/   r   data_set	io_stringimported_countcolumncustomer_dataro   r2   r2   r3   r     sD   

&


r   ))django.shortcutsr   r   r   django.contrib.auth.decoratorsr   django.contribr   django.httpr   r   django.core.paginatorr	   django.db.modelsr
   r   r   	django.dbr   r   decimalr   r   formsr   sales.modelsr   r   r   r   r4   r;   rH   rK   rM   atomicrp   rr   r   r   r   r2   r2   r2   r3   <module>   sD   
&

 

r

w
