o
    h*B                     @   s  d dl mZ d dlmZmZ d dl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lmZ d d	l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l Z!d dl"m#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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d&d' Z.dS )(    )login_required)renderget_object_or_404)SumFCountSale)ProductCustomer)Supplier)Order)Employee
AttendancePayrollLeave)timezone)	timedelta)render_to_string)HttpResponseN)Decimalz/auth/login/)	login_urlc                 C   sr   t   }|tdd }tjjd||djtddd pd}d}|}t	j
 }||||t  d	}t| d
|S )z2Reports dashboard with overview of all key metrics   daysT)is_completesale_date__date__gtesale_date__date__ltetotal_amounttotalr!   r   )total_salestotal_expensesprofit_losstotal_customersgenerated_datezreports/reports_dashboard.html)r   nowdater   r	   objectsfilter	aggregater   r   countr   )requesttodaythirty_days_agor"   r#   r$   r%   context r1   "/var/www/html/pos/reports/views.pyreports_dashboard   s.   
r3   c                 C   sx   | j dt  }| j dt  }tjjd||gdjt	ddd p)d}d}|}|||||d	}t
| d
|S )N
start_dateend_dateTr   sale_date__ranger   r    r!   r   )r"   r#   r$   r4   r5   zreports/profit_loss_report.html)GETgetr   r'   r(   r	   r)   r*   r+   r   r   )r-   r4   r5   r"   r#   r$   r0   r1   r1   r2   profit_loss_report3   s    r:   c                 C   s   | j dt  }| j dt  }tjj||gdjt	dd}tj
djt	ddd	d d
 }||||d}t| d|S )Nr4   r5   r7   r   )r"   items__product__nameitems__quantity)
total_soldz-total_sold   )salestop_selling_productsr4   r5   zreports/sales_report.html)r8   r9   r   r'   r(   r	   r)   r*   r+   r   valuesannotateorder_byr   )r-   r4   r5   r@   rA   r0   r1   r1   r2   sales_reportO   s   rE   c                 C   sJ   t jjttdtd dd pd}t jjdd}||d}t| d	|S )
Nstock_quantitybuying_price)total_valuerH   r   
   )stock_quantity__lt)total_inventory_valuelow_stock_itemszreports/inventory_report.html)r
   r)   r+   r   r   r*   r   )r-   rK   rL   r0   r1   r1   r2   inventory_reporth   s   rM   c                  C   s@  ddl m} ddlm} ddlm} ddlm} ddlm	} ddl
m
}m} t||d}	z|j }
W n |jy?   d }
Y nw d }|
rT|
jrTz|
jj}W n   d }Y | jd	}| jd
}| jdd}|sut |dd  }n||d }|st  }n||d }td}|jj|	d|dd}|D ]}||j7 }|jptd}|dkr||8 }q|jj|	||dd}|}g }td}td}td}|d}|D ]}}t|j|j|j}|jdkr6||j7 }||j7 }| |j!d|j" d| dd |jd ||d |jr5|jdkr5||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 |	|||||t |
||||d}|d}|$|}t%d d!}d"|	j& d#|d$< |j'||d%}|j(rt%d&| d' S |S )(Nr   )get_template)pisar   r   )Shop)datetimer   )customer_idr4   r5   
sort_orderdescr   r   z%Y-%m-%dz0.00credit)customerpayment_methodsale_date__date__lt	sale_date)rV   r   r   z	Invoice #z ())r(   description	cash_salecredit_salecredit_paymentbalancesalezPayment for Invoice #zSale #c                 S   s   | d S )Nr(   r1   )xr1   r1   r2   <lambda>   s    z(customer_statement_pdf.<locals>.<lambda>)keyreverse)rV   statement_entriesopening_balancefinal_balancer4   r5   r&   shop	logo_pathtotal_debitstotal_creditstotal_cash_salesz#reports/customer_statement_pdf.htmlzapplication/pdfcontent_typez attachment; filename="statement_z.pdf"Content-Disposition)destzWe had some errors <pre>z</pre>))django.template.loaderrN   	xhtml2pdfrO   customers.modelsr   sales.modelsr	   settings.modelsrP   rQ   r   r   r)   firstDoesNotExistlogopathr8   r9   r   r'   r(   strptimer   r*   rD   r   credit_amountdictPAYMENT_METHOD_CHOICESrW   appendrY   idsortr   r   rR   	CreatePDFerr) r-   rR   rN   rO   r   r	   rP   rQ   r   rV   rh   ri   r4   r5   rS   rf   opening_salesr`   credit_paid	all_salesrunning_balancere   rj   rk   rl   sales_for_balancepayment_method_displayr0   templatehtmlresponsepisa_statusr1   r1   r2   customer_statement_pdfx   s   












r   c                 C   s   | j dt  tdd }| j dt  }tjj||gd	 }t
jj||gdddd	jtd
ddd d }tjjtdd d}tjj||gd	 }||||||d}t| d|S )Nr4   r   r   r5   )date_added__ranger;   customer__idcustomer__first_namecustomer__last_namer   total_spent-total_spentr?   credit_limitd   )credit_balance__gte)r%   top_customerscustomers_nearing_credit_limitcustomer_growthr4   r5   zreports/customer_report.html)r8   r9   r   r'   r(   r   r   r)   r*   r,   r	   rB   rC   r   rD   r   r   )r-   r4   r5   r%   r   r   r   r0   r1   r1   r2   customer_report  s(    	r   c                 C   s   | j dt  tdd }| j dt  }tj }t	jj
||gdjttdtd dd	d
dd d }t	jj
||gdjttdtd dd
 pXd}t	jj
d||gdd	jtdd}||||||d}t| d|S )Nr4   r   r   r5   created_at__rangeitems__quantity_ordereditems__buying_pricer   supplier__namer   r   r?   r   F)is_receivedr   r   )total_pending)total_supplierstop_supplierstotal_expenditurepending_ordersr4   r5   zreports/supplier_report.html)r8   r9   r   r'   r(   r   r   r)   r,   r   r*   rC   r   r   rB   rD   r+   r   r   )r-   r4   r5   r   r   r   r   r0   r1   r1   r2   supplier_report0  s8    
	r   c           	      C   s   | j dt  tdd }| j dt  }tj }t	jj
||gddddjtdd	d
}tjj
||gdjtddd pId}tjj
||gd }tjj
||gddddddd}|||||||d}t| d|S )Nr4   r   r   r5   )date__rangeemployee__first_nameemployee__last_namestatusr    z-total)month__rangesalary_paid)
total_paidr   r   )hire_date__range)start_date__rangeapproved)total_employeesattendance_summarytotal_payrollemployee_growthleave_summaryr4   r5   zreports/employee_report.html)r8   r9   r   r'   r(   r   r   r)   r,   r   r*   rB   rC   r   rD   r   r+   r   r   r   )	r-   r4   r5   r   r   r   r   r   r0   r1   r1   r2   employee_reportU  s@    


r   c                 C   sj   | j dt  }| j dt  }tjjdd }tjj||gd}||||d}t	| d|S )Nr4   r5   F)r   r   )r   recent_ordersr4   r5   zreports/order_report.html)
r8   r9   r   r'   r(   r   r)   r*   r,   r   )r-   r4   r5   r   r   r0   r1   r1   r2   order_report~  s   r   c           	      C   s   | j dt  }| j dt  }tjjd||gdjt	ddd p)d}d}|}g d	|||gd
}t
|}tdd}d|d< |j|dd |S )Nr4   r5   Tr6   r   r    r!   r   )zTotal SaleszTotal ExpenseszProfit/Loss)MetriczAmount (Ksh)zapplication/vnd.ms-excelrm   z.attachment; filename="profit_loss_report.xlsx"ro   F)index)r8   r9   r   r'   r(   r	   r)   r*   r+   r   pd	DataFramer   to_excel)	r-   r4   r5   r"   r#   r$   datadfr   r1   r1   r2   export_profit_loss_excel  s   (

r   c                 C   sf   | j d}| j d}tjjtdddddd}t|}t	dd	}d
|d< |j
|ddd |S )Nr4   r5   low_stock_threshold)stock_quantity__ltenamecategory__namerF   zAapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheetrm   z,attachment; filename="inventory_report.xlsx"ro   Fopenpyxl)r   engine)r8   r9   r
   r)   r*   r   rB   r   r   r   r   )r-   r4   r5   rL   r   r   r1   r1   r2   export_inventory_report_excel  s   

r   )/django.contrib.auth.decoratorsr   django.shortcutsr   r   django.db.modelsr   r   r   rt   r	   inventory.modelsr
   rs   r   suppliers.modelsr   orders.modelsr   	hr.modelsr   r   r   r   django.utilsr   rQ   r   rq   r   django.httpr   pandasr   decimalr   r3   r:   rE   rM   r   r   r   r   r   r   r   r1   r1   r1   r2   <module>   sL    
 



 
 
$
(

