o
    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}zzt|jdd}|d	| f | }|s9td
dddfW  d    W W |  S |drG|d d|d< |drU|d d|d< ||d|d|d< |d| f |	 |d< |d| f |	 }||d< t|dddfW  d    W W |  S 1 sw   Y  W n% t
y } ztdt| dddfW  Y d }~W |  S d }~ww W |  d S |  w )NPaidDraftPending PaymentOverdueCanceledpaiddraftpendingZoverdue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   r   cursorexecutefetchoner   closegetstrftimefetchall	Exceptionstr)
invoice_id
connection
status_mapr#   invoicer   e r1   S/Users/harjaapdhillon/Desktop/newidea/medvista_backend/Services/Billing/Invoices.pyget_invoice   sZ   
.


.+(
.r3   c                 C   s   d S )Nr1   )r,   r1   r1   r2   generate_invoice_pdfE   s   r4   )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}z6zt|jdd}d}	| g}
|rL|	d7 }	|
| |rW|	d7 }	|
| |rb|	d7 }	|
| d|	 d }|||
 |	 d }|	d7 }	|

||d | g ||	|
 | }|stg d||dddfW  d   W W |  S dd |D }d d!gt| }|d"| d#t| | }i }|D ]}||d$ g | q|D ]8}||d% g |d&< ||d|d|d'< |d(r|d( d)|d*< |d+r|d+ d)|d,< qt||||dddfW  d   W W |  S 1 s3w   Y  W n& ty_ } ztd-t| dd.d/fW  Y d}~W |  S d}~ww W |  dS |  w )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    rC   r5   per_pager   r!   Nc                 S      g | ]}|d  qS idr1   .0r/   r1   r1   r2   
<listcomp>       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,   rI   r   r   r   r   r   r   r   Error fetching invoices: r   r"   r   argsr'   intr   r   r#   appendr$   r%   extendr)   r   r&   joinlentuple
setdefaultr(   r*   r+   )user_idr   r5   r:   start_date_strend_date_strr-   r.   r#   queryparamscount_queryrC   invoicesinvoice_idsformat_stringsr   payments_mappayr/   r0   r1   r1   r2   get_user_invoicesK   s   



Q
QN(
Qrg   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}z5zt|jdd}d}g }	| rK|d7 }|	|  |rV|d7 }|	| |ra|d7 }|	| d| d }
||
|	 |	 d }|d7 }|	
||d | g |||	 | }|stg d||dddfW  d   W W |  S dd |D }d d!gt| }|d"| d#t| | }i }|D ]}||d$ g | q|D ]8}||d% g |d&< ||d|d|d'< |d(r|d( d)|d*< |d+r|d+ d)|d,< qt||||dddfW  d   W W |  S 1 s2w   Y  W n& ty^ } ztd-t| dd.d/fW  Y d}~W |  S d}~ww W |  dS |  w )0zYGet all invoices with their payments, optionally filtered by status or invoice date ranger   r5   r6   r7   r:   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@   rA   rB   rC   rD   r   FrE   r!   Nc                 S   rG   rH   r1   rJ   r1   r1   r2   rL      rM   z$get_all_invoices.<locals>.<listcomp>rN   rO   rP   rQ   r,   rI   r   r   r   r   r   r   r   rR   r   r"   rS   )r   r5   r:   r]   r^   r-   r.   r#   r_   r`   ra   rC   rb   rc   rd   r   re   rf   r/   r0   r1   r1   r2   get_all_invoices   s   



Q
QN(
Qrh   c                 C   s^  t  }t }zz|t| _}|d| |tdd |f | }|D ]B}|\}}}}	}
}}|tdd |tdd d|}d|	d d	| }|d
||||tdd |
|
|f |d||f q$W d    n1 sqw   Y  |
  dddW W |  S  ty } z|  dt| ddW  Y d }~W |  S d }~ww |  w )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(   commitr&   r*   rollbackr+   )r\   r-   todayr#   subscriptionssubsubscription_idbilling_cyclenext_billing_date
package_idpricecurrency_idpackage_namenew_billing_dateinvoice_numberr0   r1   r1   r2   generate_next_invoice_if_due  sN   5
 

r   c                  C   s  t  } t }zzt|  e}|d|tdd |f | }d}|D ]G}|\}}}}	}
}}}|tdd |tdd d|}d|	d	 d
| }|d||||tdd |||f |d||f |d7 }q%W d    n1 sww   Y  | 
  t| ddddfW W |   S  ty } z|   tdt| dddfW  Y d }~W |   S d }~ww |   w )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
            ri   rj   r   rl   rm   rn   rq   rr   rs   rt   z
                    UPDATE subscriptions 
                    SET next_billing_date = %s
                    WHERE id = %s
                r6   z invoice(s) generated.Fr   r!   zFailed to generate invoices: Tr"   )r   r   ru   r   r#   r$   r   r)   r'   r(   rv   r   r&   r*   rw   r+   )r-   rx   r#   ry   countrz   r{   r|   r}   r~   r\   r   r   r   r   r   r0   r1   r1   r2   $generate_next_invoices_for_all_users]  sP   
7
(

r   N)flaskr   r   
contextlibr   confr   r   r   r3   r4   rg   rh   r   r   r1   r1   r1   r2   <module>   s    =ffD