U
    - i<                     @   s   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 Z	dd Z
d d	lmZ d
d Zd d	lmZ dd Zdd Zdd ZdS )    )requestjsonify)closing)connect_to_database)datetime	timedeltac              
   C   s  t  }dddddd}z\zt|jdd}|d	| f | }|sptd
dddfW  5 Q R  W W S |dr|d d|d< |dr|d d|d< ||d|d|d< |d| f |	 |d< |d| f |	 }||d< t|dddfW  5 Q R  W W XS Q R X W nH t
k
rp } z(tdt| dddf W Y W S d }~X Y nX W 5 |  X d S )NPaidDraftPending PaymentOverdueCanceledpaiddraftpendingZoverdueZcanceledT
dictionaryz
                SELECT i.*, s.user_id, p.package_name
                FROM invoices i
                JOIN subscriptions s ON i.subscription_id = s.id
                JOIN packages p ON s.package_id = p.id
                WHERE i.id = %s
            zInvoice not foundmessageerrori  
issue_date	%b %d, %Yissue_date_friendlydue_datedue_date_friendlystatusstatus_friendlyz1SELECT * FROM invoice_items WHERE invoice_id = %sitemsz
                SELECT id, amount, payment_method, transaction_id, payment_date, status, gateway_response
                FROM payments
                WHERE invoice_id = %s
                ORDER BY payment_date DESC
            paymentsF)datar      zError fetching invoice:   )r   closer   cursorexecutefetchoner   getstrftimefetchall	Exceptionstr)
invoice_id
connection
status_mapr#   invoicer   e r0   7/var/www/html/api-medvista/Services/Billing/Invoices.pyget_invoice   sH    &

 :r2   c                 C   s   d S )Nr0   )r+   r0   r0   r1   generate_invoice_pdfE   s    r3   )r   c              
   C   s  t jd}t jjddtd}t jjddtd}t jd}t jd}t }d	d
dddd}zLzt|jdd}d}	| g}
|r|	d7 }	|
| |r|	d7 }	|
| |r|	d7 }	|
| d|	 d }|	||
 |
 d }|	d7 }	|
||d | g |	|	|
 | }|sNtg d||dddfW  5 Q R  W W bS dd |D }dd gt| }|	d!| d"t| | }i }|D ]}||d# g | q|D ]r}||d$ g |d%< ||d|d|d&< |d'r|d' d(|d)< |d*r|d* d(|d+< qt||||dddfW  5 Q R  W W XS Q R X W nH tk
r } z(td,t| dd-d.f W Y W S d/}~X Y nX W 5 |  X d/S )0zDGet all invoices for a specific user with filters and their paymentsr   page   defaulttypelimit
   
start_dateend_dater   r	   r
   r   r   r   Tr   a  
                SELECT i.*, p.package_name, s.start_date as subscription_start
                FROM invoices i
                JOIN subscriptions s ON i.subscription_id = s.id
                JOIN packages p ON s.package_id = p.id
                WHERE s.user_id = %s
             AND i.status = %s AND i.issue_date >= %s AND i.issue_date <= %sSELECT COUNT(*) as total FROM (	) as temptotal. ORDER BY i.issue_date DESC LIMIT %s OFFSET %sr   Fr   rB   r4   per_pager   r    c                 S   s   g | ]}|d  qS idr0   .0r.   r0   r0   r1   
<listcomp>   s     z%get_user_invoices.<locals>.<listcomp>,%s
                SELECT id, invoice_id, amount, payment_method, transaction_id, payment_date, status
                FROM payments
                WHERE invoice_id IN (9)
                ORDER BY payment_date DESC
            r+   rG   r   r   r   r   r   r   r   Error fetching invoices: r   r!   Nr   argsr&   intr   r"   r   r#   appendr$   r%   extendr(   r   joinlentuple
setdefaultr'   r)   r*   )user_idr   r4   r9   start_date_strend_date_strr,   r-   r#   queryparamscount_queryrB   invoicesinvoice_idsformat_stringsr   payments_mappayr.   r/   r0   r0   r1   get_user_invoicesK   s    


 :rd   c               
   C   s  t jd} t jjddtd}t jjddtd}t jd}t jd}t }d	d
dddd}zJzt|jdd}d}g }	| r|d7 }|	|  |r|d7 }|	| |r|d7 }|	| d| d }
|	|
|	 |
 d }|d7 }|	||d | g |	||	 | }|sLtg d||dddfW  5 Q R  W W bS dd |D }dd gt| }|	d!| d"t| | }i }|D ]}||d# g | q|D ]r}||d$ g |d%< ||d|d|d&< |d'r
|d' d(|d)< |d*r|d* d(|d+< qt||||dddfW  5 Q R  W W XS Q R X W nH tk
r } z(td,t| dd-d.f W Y W S d/}~X Y nX W 5 |  X d/S )0zYGet all invoices with their payments, optionally filtered by status or invoice date ranger   r4   r5   r6   r9   r:   r;   r<   r   r	   r
   r   r   r   Tr   a  
                SELECT i.*, p.package_name, s.user_id, s.start_date as subscription_start
                FROM invoices i
                JOIN subscriptions s ON i.subscription_id = s.id
                JOIN packages p ON s.package_id = p.id
                WHERE 1=1
            r=   r>   r?   r@   rA   rB   rC   r   FrD   r    c                 S   s   g | ]}|d  qS rF   r0   rH   r0   r0   r1   rJ      s     z$get_all_invoices.<locals>.<listcomp>rK   rL   rM   rN   r+   rG   r   r   r   r   r   r   r   rO   r   r!   NrP   )r   r4   r9   rZ   r[   r,   r-   r#   r\   r]   r^   rB   r_   r`   ra   r   rb   rc   r.   r/   r0   r0   r1   get_all_invoices   s    


 :re   c                 C   sL  t  }t }z,zt| }|d| |tdd |f | }|D ]}|\}}}}	}
}}|tdd |tdd d	|}d|
d d	| }|d
||||tdd |
|
|f |d||f qJW 5 Q R X |  dddW W NS  tk
r8 } z(|  dt| dd W Y W S d }~X Y nX W 5 |  X d S )Nag  
                SELECT 
                    s.id AS subscription_id,
                    s.billing_cycle,
                    s.next_billing_date,
                    s.package_id,
                    p.price,
                    p.currency_id,
                    p.package_name
                FROM subscriptions s
                JOIN packages p ON s.package_id = p.id
                WHERE s.user_id = %s 
                  AND s.status = 'active' 
                  AND s.next_billing_date IS NOT NULL
                  AND s.next_billing_date <= %s
                  AND s.next_billing_date > %s
               days   m  monthlyannualINV-%Y%m%d-*  
                    INSERT INTO invoices (
                        subscription_id, invoice_number, issue_date, due_date,
                        amount, total_amount, currency_id, status, gateway_type
                    ) VALUES (%s, %s, %s, %s, %s, %s, %s, 'draft', 'razorpay')
                z
                    UPDATE subscriptions
                    SET next_billing_date = %s
                    WHERE id = %s
                z+Invoice generated if within billing window.Fr   zFailed to generate invoice: T)r   r   nowr"   r   r#   r$   r   r(   r&   r'   commitr)   rollbackr*   )rY   r,   todayr#   subscriptionssubsubscription_idbilling_cyclenext_billing_date
package_idpricecurrency_idpackage_namenew_billing_dateinvoice_numberr/   r0   r0   r1   generate_next_invoice_if_due  sL         2r   c                  C   sn  t  } t }zNzt|  }|d|tdd |f | }d}|D ]}|\}}}}	}
}}}|tdd |tdd d	|}d|
d	 d
| }|d||||tdd |||f |d||f |d7 }qLW 5 Q R X |   t| ddddfW W VS  tk
rZ } z0|   tdt| dddf W Y W S d }~X Y nX W 5 |   X d S )Na_  
                SELECT 
                    s.id AS subscription_id,
                    s.billing_cycle,
                    s.next_billing_date,
                    s.package_id,
                    s.user_id,
                    p.price,
                    p.currency_id,
                    p.package_name
                FROM subscriptions s
                JOIN packages p ON s.package_id = p.id
                WHERE s.status = 'active'
                  AND s.next_billing_date IS NOT NULL
                  AND s.next_billing_date <= %s
                  AND s.next_billing_date > %s
            rf   rg   r   ri   rj   rk   rn   ro   rp   rq   z
                    UPDATE subscriptions 
                    SET next_billing_date = %s
                    WHERE id = %s
                r5   z invoice(s) generated.Fr   r    zFailed to generate invoices: Tr!   )r   r   rr   r"   r   r#   r$   r   r(   r&   r'   rs   r   r)   rt   r*   )r,   ru   r#   rv   countrw   rx   ry   rz   r{   rY   r|   r}   r~   r   r   r/   r0   r0   r1   $generate_next_invoices_for_all_users]  sN         :r   N)flaskr   r   
contextlibr   confr   r   r   r2   r3   rd   re   r   r   r0   r0   r0   r1   <module>   s   =ffD