o
    'h6                      @   sl  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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 d dlmZmZ d dlm Z m!Z!m"Z"m#Z#m$Z$m%Z% dd Z&eee&dd Z'ee#ddd Z(ee#ddd Z)edd Z*ee#ddd Z+ee#ddd  Z,G d!d" d"e"eZ-G d#d$ d$eeZ.d%S )&    )renderget_object_or_404redirect)login_requireduser_passes_test)messages)JsonResponse)timezone)	timedeltadate)Decimal   )InvoiceBillingCycle)CustomerPackage)	Paginator)ListView)LoginRequiredMixinUserPassesTestMixin)has_financial_accessEmployeeRequiredMixinCustomerRequiredMixinpermission_requiredhas_permissionget_user_permissionsc                 C   s   | j p| jS )N)is_staffis_superuser)user r   -/var/www/html/optinet_system/billing/views.pyis_admin   s   r!   c           	      C   s   t j d}| jd}|r|j|d}| jd}|r$|j|d}t|d}| jd}||}t	j }||||d}t
| d	|S )
N-created_atstatus)r#   customer)customer__id   page)page_obj	customersstatus_filtercustomer_filterzbilling/invoice_list.html)r   objectsallorder_byGETgetfilterr   get_pager   r   )	requestinvoicesr*   r+   	paginatorpage_numberr(   r)   contextr   r   r    invoice_list   s"   


r8   zbilling.view_invoicec                 C   s   t t|d}t| dd|iS )Ninvoice_numberzbilling/invoice_detail.htmlinvoice)r   r   r   )r3   r:   r;   r   r   r    invoice_detail6   s   r<   zbilling.add_invoicec                 C   s6  | j dkr| jd}| jd}| jd}| jd}| jdd}| jdd	}tt|d
}tt|d
}t  }	|j	dkrJ|	t
dd }
n|j	dkrW|	t
dd }
n|	t
dd }
tjj|||jt||	|
|||d	}t| d|j d td|jdS tjjdd}tjjdd}||d}t| d|S )NPOSTr$   packagebilling_period_startbilling_period_endinstallation_feer   notes )idmonthly   days	quarterlyZ   m  )	r$   r>   package_amountrA   
issue_datedue_dater?   r@   rB   zInvoice z created successfully!zbilling:invoice_detailr9   T)	is_active)r)   packageszbilling/create_invoice.html)methodr=   r0   r   r   r   r	   nowr   billing_cycler
   r   r,   createpricer   r   successr:   r   r1   r   )r3   customer_id
package_idr?   r@   rA   rB   r$   r>   rM   rN   r;   r)   rP   r7   r   r   r    create_invoice<   sD   


rY   c                 C   sl   t | jdst| d tdS tjj| jjd	d}t
|d}| jd}||}d|i}t| d	|S )
z*View for clients to see their own invoicescustomer_profilez"You don't have a customer profile.zcustomers:dashboardr$   r"   r&   r'   r(   billing/my_invoices.html)hasattrr   r   errorr   r   r,   r1   rZ   r.   r   r/   r0   r2   r   )r3   r4   r5   r6   r(   r7   r   r   r    my_invoicesk   s   

r_   z#billing.generate_recurring_invoicesc           
   
   C   s0  | j dkrtjjt  dd}d}|D ]o}|j}|jr|j	rt  }|jj
dkr=|}|tdd }|tdd }n'|jj
dkrT|}|td	d }|td	d }n|}|td
d }|td
d }tjj||j|jj||tdd ||d}	||_|  |d7 }qt| d| d tdS t| dS )Nr=   T)next_billing_date__lterO   r   rE   rF   rG   rI   rJ   rK      )r$   r>   rL   rM   rN   r?   r@   r   z
Generated z recurring invoices!zbilling:invoice_listzbilling/generate_recurring.html)rQ   r   r,   r1   r	   rR   r   r$   r>   rO   rS   r
   r   rT   rU   next_billing_datesaver   rV   r   r   )
r3   billing_cyclescreated_countcycler$   todayperiod_start
period_endnext_billingr;   r   r   r    generate_recurring_invoices   sJ   


rk   billing.view_customer_invoicesc                 C   sV   t t|d}tjj|dd}t|d}| jd}|	|}||d}t
| d|S )z:View for admin to see all invoices for a specific customerrW   r[   r"   r&   r'   )r$   r(   billing/customer_invoices.html)r   r   r   r,   r1   r.   r   r/   r0   r2   r   )r3   rW   r$   r4   r5   r6   r(   r7   r   r   r    customer_invoices   s   

ro   c                   @   s$   e Zd ZeZdZdZdZdd ZdS )MyInvoicesViewr\   r4   
   c                 C   s2   t | jjdrtjj| jjjddS tj S )NrZ   r[   r"   )	r]   r3   r   r   r,   r1   rZ   r.   noneselfr   r   r    get_queryset   s   
zMyInvoicesView.get_querysetN)	__name__
__module____qualname__r   modeltemplate_namecontext_object_namepaginate_byru   r   r   r   r    rp      s    rp   c                       s<   e Zd ZeZdZdZdZdd Zdd Z	 fdd	Z
  ZS )
CustomerInvoicesViewrn   r4   rq   c                 C   s   t | jjdS )Nrl   )r   r3   r   rs   r   r   r    	test_func   s   zCustomerInvoicesView.test_funcc                 C   s*   | j d }tt|d}tjj|ddS )NrW   rm   r[   r"   )kwargsr   r   r   r,   r1   r.   )rt   rW   r$   r   r   r    ru      s   
z!CustomerInvoicesView.get_querysetc                    s0   t  jdi |}| jd }tt|d|d< |S )NrW   rm   r$   r   )superget_context_datar   r   r   )rt   r   r7   rW   	__class__r   r    r      s   
z%CustomerInvoicesView.get_context_data)rv   rw   rx   r   ry   rz   r{   r|   r~   ru   r   __classcell__r   r   r   r    r}      s    r}   N)/django.shortcutsr   r   r   django.contrib.auth.decoratorsr   r   django.contribr   django.httpr   django.utilsr	   datetimer
   r   decimalr   modelsr   r   customers.modelsr   r   django.core.paginatorr   django.views.genericr   django.contrib.auth.mixinsr   r   accounts.permissionsr   r   r   r   r   r   r!   r8   r<   rY   r_   rk   ro   rp   r}   r   r   r   r    <module>   sB     	-
0