o
    -hG                     @   sz  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 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)PermissionDenied)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.    r3   $/var/www/html/pos/customers/views.pycustomer_list   s>   r5   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!customers:customer_listzcustomers/add_customer.htmlform)	methodr   r6   is_validsaver   successr   r   )r0   r8   r   r3   r3   r4   customer_add;   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   )
r0   idr   rB   total_credit_salesr    r#   rC   rD   contextr3   r3   r4   customer_detailL   s,   
rJ   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>   r6   )instancezCustomer updated successfully!customers:customer_detailrG   zcustomers/customer_edit.html)r8   r   )r   r   r9   r   r6   r:   r;   r   r<   r   r?   r   )r0   rG   r   r8   r3   r3   r4   customer_edito   s   

rN   c                 C   sB   t t|d}| jdkr|  t| d tdS t| dd|iS )Nr>   r6   zCustomer deleted successfully!r7   rE   r   )r   r   r9   deleter   r<   r   r   )r0   rG   r   r3   r3   r4   customer_delete   s   
rP   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#   r6   amount0r    notescheque_numbercheque_datempesa_referencer   z)Payment amount must be greater than zero.rL   rM   z5Payment amount cannot exceed the outstanding balance.chequez.Cheque number is required for cheque payments.z,Cheque date is required for cheque payments.)r   rU   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)rY   zM-Pesa)bankzBank Transfer)rX   ChequezPayment of Ksh z recorded successfully via !z
 (Cheque #)z (Ref: z Notes: zError processing payment: )r   rC   z"customers/make_credit_payment.html)r   r   r   r)   r,   r-   r   r   r9   r6   r(   r   errorr   r?   existsannotater   r   r+   r    r!   minr;   dictr<   	Exceptionstrr   )r0   rG   r   rH   r    r#   rC   rQ   r   rT   rU   rV   rW   existing_chequeunpaid_salesremaining_paymentsalecurrent_remainingpayment_for_this_salepayment_method_displaysuccess_messageerI   r3   r3   r4   make_credit_payment   s   


"rs   c                 C   s0   t t|d}t t||d}||d}t| d|S )Nr>   )rG   r   )r   rm   zcustomers/invoice_detail.html)r   r   r   r   )r0   r?   sale_idr   rm   rI   r3   r3   r4   invoice_detail
  s   ru   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__ltr\   )r   sale_date__date__gtesale_date__date__lteascr@   z	Invoice #z (rb   )datedescription	cash_salecredit_salecredit_paymentbalancerm   zPayment for Invoice #zSale #c                 S   s   | d S )Nr   r3   )xr3   r3   r4   <lambda>~  s    z$customer_statement.<locals>.<lambda>)keyreverse)
r   statement_entriesopening_balancefinal_balancery   rz   r{   total_debitstotal_creditstotal_cash_salesz!customers/customer_statement.html)rv   rw   django.utilsrx   r   r   r'   r(   nowr   strptimer   r   r)   r,   r+   r    r!   rg   PAYMENT_METHOD_CHOICESr   r/   r\   rG   sortr   )r0   r?   rv   rw   rx   r   ry   rz   r{   r   opening_salesrm   credit_paid	all_salesrunning_balancer   r   r   r   sales_for_balancerp   rI   r3   r3   r4   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addressrF   credit_balance
date_addedstrftime)r0   responser   r%   r   r3   r3   r4   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 )Nr6   csv_filezPlease select a CSV file.zcustomers:import_customersz.csvzPlease upload a valid CSV file.zUTF-8r   ,")	delimiter	quotechar   r         rS   rA   r$   )r   r   r   r   r   rF   r   )r   zSuccessfully imported z customers.r7   zError importing customers: zcustomers/import_customers.htmlr3   )r9   FILESr(   r   rc   r   nameendswithreaddecodeioStringIOnextr   readerlenr   r   r)   r,   rd   creater<   rh   ri   r   )r0   r   data_set	io_stringimported_countcolumncustomer_datarr   r3   r3   r4   import_customers  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   django.core.exceptionsr   decimalr   r   formsr   sales.modelsr   r   r   r   r5   r=   rJ   rN   rP   atomicrs   ru   r   r   r   r3   r3   r3   r4   <module>   sF   
(

"

v

x
