o
    g&Ch                     @  s   d dl mZ d dlmZ d dlZd dlmZ d dlmZ d dlZd dl	m
Z
 d dlmZmZ d dlmZmZmZ d	Zd
ZdZd-ddZd.ddZd/ddZd0ddZd1d#d$Zd2d'd(Zd3d+d,ZdS )4    )annotations)
LocalProxyN)datetime)Tuple)Flask)db	scheduler)PlanfixTokenPlanfixFetchLogPlanfixCompanyd   i i token_or_modelPlanfixToken | strreturndict[str, str]c                 C  s(   t | tr	| j}n| }dd|  iS )u   
    Принимает либо модель PlanfixToken, либо сам raw-токен,
    возвращает заголовок Authorization.
    AuthorizationzBearer )
isinstancer	   	api_tokenstrip)r   tok r   */var/www/html/app/services/planfix_jobs.py_headers   s   
r   statusstrmsgNonec                 C  s"   t jt| |d t j  dS )uK   
    Пишем одну строку в журнал PlanfixFetchLog.
    )r   messageN)r   sessionaddr
   commit)r   r   r   r   r   _save'   s   r!   cf_data
list[dict]c                 C  sP   t tfD ]!}| D ]}|d d |kr$|dd}|r |    S   dS qqdS )u   
    Ищем сначала поле с id=CF_PAY_STATUS_1, если нет — CF_PAY_STATUS_2.
    Если ни того, ни другого нет — возвращаем 'Не сплачений'.
    fieldidvalue u   Не сплачений)CF_PAY_STATUS_1CF_PAY_STATUS_2get)r"   field_idcfvalr   r   r   _extract_status/   s   	r.   tasksintc                 C  s   d}| D ]5}t jj|d d }|du r"t |d d}tj| |d |_t|	dg |_
t |_|d7 }qtj  |S )u   
    INSERT / UPDATE записей в таблицу planfix_companies
    на основе списка задач (tasks) из PlanFix.
    Возвращает число созданных/обновлённых строк.
    r   r%   )pf_company_idNnameZcustomFieldData   )r   query	filter_byfirstr   r   r   r2   r.   r*   
pay_statusr   utcnow
updated_atr    )r/   changedtexistingr   r   r   _upsert_companiesA   s    



r=   	api_loginr   Tuple[bool, str]c              
   C  s   ddddddgdd}z't jd	|t|d
d}|  | ddk}||r,dfW S t| fW S  tyK } zdt|fW  Y d}~S d}~ww )u   
    Быстрый тест соединения: берём 1 задачу (task) с фильтром value=37.
    Используется в маршруте settings(), чтобы проверить, что api_login/api_token рабочие.
    r   r3   3   equal%   typeoperatorr&   zid,nameoffsetZpageSizefiltersfields+https://smartcafe.planfix.ua/rest/task/list
   jsonheaderstimeoutresultsuccessOKFN)requestspostr   raise_for_statusrM   r*   r   	Exception)r>   r   payloadrokexcr   r   r   _do_test[   s&   r[   appr   c              	   C  s<  |    tjjdd }|du r tdd 	 W d   dS d\}}zK	 |tddd	d
gdt dt dd}t	j
d|t|dd}|  | dg }|sSn|t|7 }t|tk r`n|t7 }q&tdd| d W n ty   tdt dd  Y n	w W d   dS W d   dS 1 sw   Y  dS )u  
    Основная задача для APScheduler. APScheduler при добавлении передаёт сюда Flask-app
    через kwargs={"app": app}.
    Внутри открываем app.app_context(), чтобы был доступ к db.session.
    T)
is_enabledNerrorzNo active token)r   r   r@   rA   rB   rC   zid,name,,z,customFieldDatarF   rJ      rL   r/   rQ   zOK, imported z
 companiesi  )app_contextr	   r4   r5   r6   r!   	PAGE_SIZEr(   r)   rS   rT   r   rU   rM   r*   r=   lenrV   	traceback
format_exc)r\   tokenZtotal_importedrG   rW   respr/   r   r   r   fetch_contractst   sJ   

	&"rh   rf   r	   c             
   C  sb   t |tr	| }tdrtd | jr/| j ^}}}tj	dt
d||d|iddd dS dS )u   
    Пересоздаём / удаляем задачу planfix_fetch.
    Вызываем КАЖДЫЙ раз после изменения cron-строки или флага is_enabled.
    Zplanfix_fetchcronr\   Ti,  )r%   functriggerminutehourkwargsreplace_existingmisfire_grace_timeN)r   r   _get_current_objectr   get_job
remove_jobr]   	cron_exprsplitadd_jobrh   )rf   r\   mh_r   r   r   reschedule_job   s"   



rz   )r   r   r   r   )r   r   r   r   r   r   )r"   r#   r   r   )r/   r#   r   r0   )r>   r   r   r   r   r?   )r\   r   r   r   )rf   r	   )
__future__r   werkzeug.localr   rd   r   typingr   rS   flaskr   app.extensionsr   r   app.models.planfix_modelsr	   r
   r   rb   r(   r)   r   r!   r.   r=   r[   rh   rz   r   r   r   r   <module>   s&   





/