
    qj3                     $   d Z ddlZddlZddlZddlZddlZddlmZmZ dZdZ	dZ
dZdZg dZd	d
dddZddddddddZdddddZdddZg dZd Zd  Zd! Zd" Zd# Zd$ed%efd&Zd'ed%efd(Zd%efd)Zd'ed%efd*Zd+ Ze d,k    r e             dS dS )-uc  
Получение документов из Bitrix24 iblock_57.

Использование:
    python3 fetch_api.py              # текущая неделя → data/api_records.json
    python3 fetch_api.py --all        # все записи    → data/raw_all.json
    python3 fetch_api.py --all --from 01.01.2026  # с даты → data/raw_all.json

Использует B24 batch API: 50 запросов × 50 элементов = 2500 за 1 HTTP-вызов.
Сырые данные сохраняются до парсинга — при сбое повторный запрос не нужен.
    N)datetime	timedeltaz:https://engeocentr.bitrix24.ru/rest/4391/n8rq6nyzr9z8tvdz/bitrix_processes572   )IDNAMEDATE_CREATE
CREATED_BYPROPERTY_1367PROPERTY_423PROPERTY_389PROPERTY_391PROPERTY_383PROPERTY_421PROPERTY_401PROPERTY_427PROPERTY_387PROPERTY_397PROPERTY_413PROPERTY_415PROPERTY_451PROPERTY_503PROPERTY_2185PROPERTY_1415PROPERTY_431PROPERTY_2989u   БДКu   ТЗКu
   ИНГЕОu   ВЦПО)3733753771059u   Камергер (общий)u   Дмитровка (общий)u	   БД-ПАu	   КА-НСu	   КА-ПАu)   Стр.7 Б. Дмитровка, дом.9u	   БД-НС)107110731588115883158851736339129u   Отклоненоu   Согласованоu0   Согласовано и распечатаноu   Не установлен)363365367419u   Договор/ДСu   Счет/Акт)357361)
)u   КС-2/КС-3u   КС-2\s*/\s*КС-3)u   УПДu
   \bУПД\b)u   Счет-фактураu)   [Сс]чет-фактура|[Сс]ч-ф\b)u   Актu
   \bАкт\b)u   Счетu   [Сс]чет\s*№)u   КС-2u   КС-2\b)u   КС-3u   КС-3\b)u   Справкаu   [Сс]правка)u   Договорu   Дог(?:овор)?\.?\s*№)u   ДСu   \bДС\s*№c                     | sdS t          | t                    r-t          |                                           }|r|d         ndS | S )N r   )
isinstancedictlistvaluesfieldvalss     4/Users/genius/Desktop/AI_BOT_V2/baseDoc/fetch_api.pyscalarr9   H   sK    % 'ELLNN##&tAwwB&L    c                 &   | sg S t          | t                    rRt          |                                           }|r#t          |d         t                    r|d         S d |D             S t          | t                    r| S t	          |           gS )Nr   c                 0    g | ]}|t          |          S  )str).0vs     r8   
<listcomp>z multi_values.<locals>.<listcomp>T   s#    ***1*A***r:   )r1   r2   r3   r4   r>   r5   s     r8   multi_valuesrB   O   s    )% +ELLNN##=JtAw--=d1g~******%,uJJ<r:   c                     g }t           D ]1\  }}t          j        || pd          r|                    |           2t	          t
                              |                    S )Nr0   )DOC_PATTERNSresearchappendr3   r2   fromkeys)textfoundnamepats       r8   parse_doc_typesrM   X   s\    E! : :	c9S$*"%%9u||D'9'9'9e$$%%%r:   c                     g }t          j        d| pd          D ]}|                    d|z              t          j        d| pd          D ]}|                    d|z              |S )Nu-   к\s*Договору\s*№\s*([\w\d\.\-\/]+)r0   u   Договор №u   по\s*ДС\s*№\s*([\w\d\.]+)u   ДС №)rE   findallrG   )rI   refsms      r8   extract_contract_refsrR   ^   s    DZH$*RTUU . .(1,----Z:DJBGG $ $JN####Kr:   c                     t          |                     d                    }t          |t                    r|                    dd          S |pdS )Nr   TEXTr0   )r9   getr1   r2   )itemress     r8   get_analysis_textrX   f   sH    
/**
+
+C#t8SWWVR%8%889"r:   rV   returnc                    t          |                     dd                    }|                     dd          }g }dD ]'}|t          |                     |                    z  }(d |D             }t          t          |                     dd                              }t          t          |                     dd                              }t          t          |                     dd                              }t	          |          pt	          |          }i d	| d
         d|d|                     dd          d d         dt          |                     dd                    dt          |                     dd                    dt
                              ||          dt                              ||          d|dt          |          d|dt          |                     dd                    dt          |                     dd                    dt                              ||          dt                              t          t          |                     dd                              t          |                     dd                              dt          |                     d d                    d!t          |                     d"d                    d#t          |                     d$d                    t          |                     d%d                    |t          |          t          t          |                     t          |           d&S )'Nr   r0   r	   )r   r   r   r   c                     g | ]}||S r=   r=   )r?   fs     r8   rA   z build_record.<locals>.<listcomp>q   s    ***q****r:   r   r   r   
element_idr   rK   date_creater
   
   
contractorr   
company_idr   payerdoc_type_raw	doc_typescontract_refsnum_date_strnum_date_inr   amountr   statusobjectr   expense_itemr   commentr   payment_duer   r   )approved_datefile_ids
file_counthas_analysisanalysis_text)r9   rU   rB   r>   rM   	PAYER_MAPTYPE_MAPrR   
STATUS_MAP
OBJECT_MAPlenboolrX   )	rV   nom_dattitlero   proppayer_id	status_idtype_idrd   s	            r8   build_recordr   k   sO   txx3344G$$EHQ 1 1L$000**H***HF488NB778899HF488NB778899IF488NB778899G((BOE,B,BId 	-44SbS9 	" = =>>	
 	 < <== 	x:: 	gw77 	 	.w77 	 	 < <== 	 < <== 		9== 	F488NB3O3O,P,P(Q(QSYZ^ZbZbcqsuZvZvSwSwxx 	 < <==  	 < <==!" 	" = =>>#$   < <==!X/5566*400-   r:   
filter_valc           	          t          j        t          dz   t          t          | ddgdd          }|                                 t          |                                                    dd                    S )uD   Получить общее количество элементов.lists.element.getr   r   )IBLOCK_TYPE_ID	IBLOCK_IDFILTERLIST_NUMSELECT   jsontimeouttotal)	requestspostWEBHOOKIBLOCK_TYPEr   raise_for_statusintr   rU   )r   resps     r8   	get_totalr      sx    =#66%#$&> >   D 	tyy{{w**+++r:   c                  |   t          ddi          } t          d|             d                    d t          t                    D                       }d}dt
           dt           }d	}g }d
g d}d
}t          d
| t          z   t                    D ](}d| d| d| d| d| 
}	|d         	                    |	           t          |d                   dk    s|| k    r|dz  }t          j        t          dz   |d          }
|
                                 |
                                                    di                               dg           }|D ]}t#          |t$                    r||z  }t          d| dt          |          |dz
  dz  dz  z
   dt          |           d|  d	           g |d<   *|S )u'  
    Загрузка ВСЕХ активных элементов через B24 batch.
    50 команд × 50 элементов = 2500 записей за 1 HTTP-запрос.
    Используем start= (не LIST_NUM) и cmd как список — как в референсе.
    ACTIVEYu   Всего элементов: &c              3   ,   K   | ]\  }}d | d| V  dS )zselect[z]=Nr=   )r?   iss      r8   	<genexpr>z"fetch_all_batch.<locals>.<genexpr>   s7      MM41a.a..1..MMMMMMr:   zfilter[ACTIVE]=YzIBLOCK_TYPE_ID=z&IBLOCK_ID=zELEMENT_ORDER[DATE_CREATE]=DESCr   )haltcmdzlists.element.get?z&start=r   r      batchx   r   resultu     Батч : +    (итого /))r   printjoin	enumerater   r   r   range	PAGE_SIZErG   rw   r   r   r   r   r   rU   r1   r3   )r   
select_str
filter_str
iblock_str	order_str	all_itemsbatch_params	batch_numstartr   r   r   
page_itemss                r8   fetch_all_batchr      s@    xo&&E	
3E
3
344488MM9V;L;LMMMMMJ%JH[HHYHHJ4IIb))LIq%)+Y77 % %       	  	 	U""3'''|E"##r))Ue^^NI=7!2sSSSD!!###YY[[__Xr2266xDDF$ , ,
j$// ,+I ;	 ; ;c)nn	AQS?SVX?X.X ; ;!$Y; ;27; ; ; < < <"$Lr:   c                    g dd}}}	 t          j        t          dz   t          t          | ddit
          |dd	          }|                                 |                                }|                    d
g           }|sn||z  }t          |                    dd                    }t          d| dt          |           dt          |           d| d	           t          |          |k    rn|t          z  }|dz  }|S )u   
    Загрузка за период через прямую пагинацию.
    Для недели/фильтров с датами — фильтры корректно передаются в POST-теле.
    r   r   Tr   r
   DESC)r   r   r   ELEMENT_ORDERr   r   r   r   r   r   u     Страница r   r   r   r   )r   r   r   r   r   r   r   r   rU   r   r   rw   r   )r   r   r   pager   dataitemsr   s           r8   fetch_periodr      s/   
  AduI}W'::)'(,f5$#B
 B
    			2&&eU	DHHWa(())_D__SZZ__c)nn__W\___```y>>U""E
%& r:   c                   	   t          j                    } |                     ddd           |                     ddd           |                                 }t	          j        d	d
           |j        s|j        rddi}|j        r|j        dz   |d<   d}t          j        	                    |          rDt          |          5 }t          j        |          }d d d            n# 1 swxY w Y   t          d| dt          |           d           t          d                                                                          }|dk    rt          d           d |D             }nt          d           t%          |          }t          |dd          5 }t          j        ||dd           d d d            n# 1 swxY w Y   t          d| d t          |           d!           d" |D             }nt          d#           t)                      }t          |dd          5 }t          j        ||dd           d d d            n# 1 swxY w Y   t          d| d t          |           d!           d$ |D             }d%}	nt+          j                    }
|
t/          |
                                &          z
  }|                    d'          dz   }|
                    d'          d(z   }t          d)| d*|            ||d+}t5          |          }d, |D             }d-}	t          |	dd          5 }t          j        ||dd           d d d            n# 1 swxY w Y   t          d.|	 d t          |           d/           t          d0t7          d1 |D                                   t          d2t7          d3 |D                                   t          d4t7          d5 |D                                   t          d6t7          d7 |D                                   d8d9lm}  |d: |D                       }t          d;           |                                D ]\  }}t          d<|d=d>|            d S )?Nz--all
store_trueu4   Все записи (не только неделя))actionhelpz--from	date_fromu    Дата начала dd.mm.yyyy)destr   r   T)exist_okr   r   z	 00:00:00>=DATE_CREATEzdata/raw_all.jsonu   ⚠️  u    уже существует (u    сырых записей)u!   Перезаписать? [y/N]: yu7   Используем существующий файл.c                 ,    g | ]}t          |          S r=   r   r?   r   s     r8   rA   zmain.<locals>.<listcomp>  s    ===q<??===r:   u   Загружаю из API...wzutf-8)encodingF   )ensure_asciiindentu    ✅ Сырые данные → z (u    записей)c                 ,    g | ]}t          |          S r=   r   r   s     r8   rA   zmain.<locals>.<listcomp>	  s    >>>q<??>>>r:   u$   Загружаю из API (batch)...c                 ,    g | ]}t          |          S r=   r   r   s     r8   rA   zmain.<locals>.<listcomp>  s    :::1|A:::r:   zdata/all_records.json)daysz%d.%m.%Yz	 23:59:59u   Период: u    → )r   z<=DATE_CREATEc                 ,    g | ]}t          |          S r=   r   r   s     r8   rA   zmain.<locals>.<listcomp>!  s    888\!__888r:   zdata/api_records.jsonu   
✅ Записи → r   u      С файлами:        c              3   2   K   | ]}|d          dk    dV  dS )rp   r   r   Nr=   r?   rs     r8   r   zmain.<locals>.<genexpr>)  s1      -X-XAAlOVWDWDWaDWDWDWDW-X-Xr:   u      С анализом:       c              3   *   K   | ]}|d          
dV  dS )rq   r   Nr=   r   s     r8   r   zmain.<locals>.<genexpr>*  s,      .W.WQQ~EV.Wq.W.W.W.W.W.Wr:   u!      С реф. договора:  c              3   *   K   | ]}|d          
dV  dS )re   r   Nr=   r   s     r8   r   zmain.<locals>.<genexpr>+  s,      1[1[/HZ1[!1[1[1[1[1[1[r:   u      Без типа:         c              3   *   K   | ]}|d          
dV  dS )rd   r   Nr=   r   s     r8   r   zmain.<locals>.<genexpr>,  s+      ,V,V1q~,VQ,V,V,V,V,V,Vr:   r   )Counterc              3   0   K   | ]}|d          D ]}|V  dS )rd   Nr=   )r?   r   ts      r8   r   zmain.<locals>.<genexpr>/  s3      <<qQ{^<<<<<<<<<r:   u"   
   Типы документов:z     4zx  )argparseArgumentParseradd_argument
parse_argsosmakedirsallr   pathexistsopenr   loadr   rw   inputstriplower	fetch_alldumpr   r   nowr   weekdaystrftimer   sumcollectionsr   most_common)apargsr   raw_pathr\   existingansrecords	raw_itemsout_pathtodaymondayr   date_tor   ctr   ns                     r8   mainr      s   		 	"	"BOOG|:pOqqqOOH[:\O]]]==??DK&&&&x 0,4> 0,_
> 	G*..;*FJ'& 7>>(## 	;h (19Q<<( ( ( ( ( ( ( ( ( ( ( ( ( ( (oXooS]]oooppp;<<BBDDJJLLCczzOPPP==H===4555%j11	(C'::: JaIiqIIIIJ J J J J J J J J J J J J J JeeeS^^eeefff>>I>>>8999'))Ihg666 F!	)QU1EEEEF F F F F F F F F F F F F F FaXaaYaaabbb::	:::G* 8888OOJ//+=	NN:..+=8y88w88999 '$
 

 !,,	88i888+	hg	.	.	. <!	'15;;;;< < < < < < < < < < < < < < < 

?H
?
?G
?
?
?@@@	
Z#-X-X-X-X-X*X*X
Z
Z[[[	
Y3.W.W'.W.W.W+W+W
Y
YZZZ	
]c1[1[W1[1[1[.[.[
]
]^^^	
X,V,V,V,V,V)V)V
X
XYYY######	<<G<<<	<	<B	
/000   # #1!a!!!a!!""""# #sH   C''C+.C+G  GG*III=M""M&)M&__main__)!__doc__r   r   rE   r   r   r   r   r   r   r   
BATCH_SIZEr   r   rs   rv   ru   rt   rD   r9   rB   rM   rR   rX   r2   r   r   r   r3   r   r   r   __name__r=   r:   r8   <module>r     s  
 
  				 				   ( ( ( ( ( ( ( (J 	
		
 	
 	
 h|ZXX	,.8 
  (@=Fa 
 )1BCC       & & &    
"t " " " " "N
,$ 
,3 
, 
, 
, 
,* * * * *ZT d    <H# H# H#V zDFFFFF r:   