o
    h                     @   sB  d dl 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	m
Z
 ddlmZ dd	lmZ d d
lmZ d dlmZ e eZdZdd Zdd Zdedejdede	fddZ	d(dededee dee dee dee dejdedefddZd edejde	fd!d"Zd ed#e
dejdede	f
d$d%Z dejdefd&d'Z!dS ))    N)datedatetime)BackgroundTasks)
Collection   )SaaSInvoiceCreateSaaSInvoiceDBSaaSInvoiceUpdate)InvoiceStatus   )database)Optional)ObjectIdsaas_invoicesc                 C   s.   t | tr| S t | trt| tj S | S )z#Convert date to datetime if needed.)
isinstancer   r   combinemintimevalue r   9/var/www/html/moveengine/app/v1/services/saas/invoices.pyensure_datetimeJ   s
   

r   c                 C   s   t | dr| jS | S )zConvert Enum -> string value.r   )hasattrr   r   r   r   r   ensure_enumR   s   r   
invoice_indbbackground_tasksreturnc                    s   |t  }t }tt }|  }t|d|d< t|d|d< t|d|d< t|d|d< ||d< ||d< ||d< |	i |dt|i t
d	i |S )
Ninvoice_datedue_datestatusinvoice_typecreated_dateupdated_date
invoice_id_idr   )INVOICE_COLLECTIONr   utcnowstrr   dictr   getr   
insert_oner   )r   r   r   collnowr%   datar   r   r   create_invoice_serviceV   s   
r0   skiplimitqr!   created_date_fromcreated_date_to
account_idc                    s   |t  }|rd|ini }	|r||	d< |r!|dd}
d|
ig|	d< |s%|r?i }|r1t|d|d< |r;t|d|d	< ||	d
< ||	}||	d
d| |}t|}g }|D ]}t	|d |d< |
dd  |tdi |  q[||dS )Nr6   r!   i)z$regexz$optionsinvoice_titlez$orz%Y-%m-%dz$gtez$lter   r&   r%   )total_countinvoicesr   )r'   r   strptimecount_documentsfindsortr1   r2   listr)   popappendr   r*   )r1   r2   r3   r!   r4   r5   r   r6   r-   queryregex_querydate_filterr:   cursordocsr;   docr   r   r   list_invoices_service   s6   


rI   r%   c                    sr   |t  }zt| }W n ty   tdw |d|i}|s$tdt|d |d< |dd  tdi |S )NzInvalid invoice IDr&   zInvoice not foundr%   r   )r'   r   	Exception
ValueErrorfind_oner)   rA   r   )r%   r   r-   oidrH   r   r   r   get_invoice_service   s   rN   updatec                    sz   |t  }|dt| idd|jii |dt| i}tdi |d| i}|jtjkr;|j	t
| |j|jd |S )Nr&   $setr!   r%   )r%   
to_accountamountr   )r'   
update_oner   str_to_objectidr!   rL   r   r
   PAIDadd_tasksend_invoice_paid_emailr6   rR   )r%   rO   r   r   r-   updatedinvoicer   r   r   update_invoice_status_service   s    rZ   c                    s   | t  }t }|d|idtjidddtjii |}||dtjid}|D ]}t|d }|j	t
||d |d d	 q+d
S )z5Mark overdue + send reminders for upcoming due dates.z$ltz$ne)r    r!   rP   r!   r&   r6   r    )r%   rQ   r    N)r'   r   todayupdate_manyr
   rU   OVERDUEr>   r)   rV   send_invoice_reminder_email)r   r   r-   r[   tomorrowrF   rH   r%   r   r   r   run_due_reminders   s$   r`   )N)"loggingr   r   fastapir   pymongo.collectionr   models.saas.invoicesr   r   r	   models.commonr
   r   r   typingr   bsonr   	getLogger__name__loggerr'   r   r   MongoDBr0   intr)   r*   rI   rN   rZ   r`   r   r   r   r   <module>   sz   
7
4	
7

