
    Th                        d Z ddlZddlZddlZddlmZmZmZmZm	Z	 ddl
m
Z
mZ ddlmZ ddlmZ ddlmZ dd	lmZmZ dd
lmZmZmZmZ e G d d                      Ze G d d                      Z G d d          ZdS )u  
Продвинутый анализатор транзакций с отслеживанием жизненного цикла ордеров
Учитывает не только изменения объемов, но и появление/исчезновение ордеров
    N)DictListOptionalSetTuple)datetime	timedelta)Decimal)	dataclass)logger   )P2POrderOrderBookSnapshot)	DVariableMerchantLiquidityStatsTransactionTypeIndividualTransactionc                       e Zd ZU dZeed<   eed<   eed<   eed<   eeef         ed<   eed<   e	e
eef                  ed<   d	efd
Zd ZdS )MerchantOrderStateu2   Состояние ордеров мерчантаmerchant_idmerchant_nameassetfiatactive_orders	last_seentotal_volume_historyreturnc                 b    t          d | j                                        D                       S )u`   Получить общий объем всех активных ордеров мерчантаc              3   $   K   | ]}|j         V  d S Navailable_amount.0orders     3/app/src/analyzers/advanced_transaction_analyzer.py	<genexpr>z6MerchantOrderState.get_total_volume.<locals>.<genexpr>'   s%      SSe5)SSSSSS    )sumr   valuesselfs    r&   get_total_volumez#MerchantOrderState.get_total_volume%   s.    SSt7I7P7P7R7RSSSSSSr(   c                     |                                  }| j                            t          j                    |f           t          | j                  dk    r| j        dd         | _        dS dS )u.   Обновить историю объемов
   iN)r-   r   appendr   nowlen)r,   current_volumes     r&   update_volume_historyz(MerchantOrderState.update_volume_history)   so    ..00!(((,...)IJJJ t())B..(,(A#$$(GD%%% /.r(   N)__name__
__module____qualname____doc__str__annotations__r   r   r   r   r   floatr-   r4    r(   r&   r   r      s         <<JJJ
III X&&&& uXu_56666T% T T T TH H H H Hr(   r   c                       e Zd ZU dZeed<   eed<   eed<   eed<   eed<   eed<   eeef         ed<   e	ed	<   eeef         ed
<   e	ed<   e
e         ed<   e
e         ed<   e
eeef                  ed<   dZe	ed<   d ZdS )OrderTransitionuA   Переход состояния ордеров мерчантаr   r   r   r   
trade_type	timestamporders_beforetotal_volume_beforeorders_aftertotal_volume_afterdisappeared_ordersappeared_ordersmodified_orders        volume_changec                 .    | j         | j        z
  | _        d S r    )rD   rB   rI   r+   s    r&   __post_init__zOrderTransition.__post_init__K   s    !4t7OOr(   N)r5   r6   r7   r8   r9   r:   r   r   r   r;   r   r   rI   rK   r<   r(   r&   r>   r>   3   s        KKJJJ
IIIOOO X&&&& sH}%%%% X&&&(^###%( 234444M5P P P P Pr(   r>   c                   v   e Zd ZdZd*defdZdedededefd	Zd
ede	fdZ
	 d+dedee         defdZdefdZdefdZdededee         fdZdedededededefdZdedefdZdefdZdefdZdefdZdedefdZded eded!ed"ef
d#Zdeded$ededed%edefd&Zd' Zdefd(Z de!ee"f         fd)Z#dS ),AdvancedTransactionAnalyzeru   
    Продвинутый анализатор P2P транзакций с отслеживанием жизненного цикла ордеров
      d_variable_timeoutc                     || _         i | _        i | _        i | _        t	                      | _        i | _        t          j        d           d S )Nu.   🚀 Advanced Transaction Analyzer initialized)	rO   merchant_statesd_variablesmerchant_statssetprocessed_transactionslast_snapshotsr   info)r,   rO   s     r&   __init__z$AdvancedTransactionAnalyzer.__init__T   sZ    "4 ?A 24 BD 14# =?DEEEEEr(   r   r   r   r   c                     | d| d| S )uL   Получить ключ для идентификации мерчанта_r<   )r,   r   r   r   s       r&   _get_merchant_keyz-AdvancedTransactionAnalyzer._get_merchant_keyh   s    .......r(   merchantc           	          t          |j        |j        |j        |j        |j        |it          j                    g           S )uD   Инициализировать состояние мерчантаr   r   r   r   r   r   r   )r   r   r   r   r   order_idr   r1   )r,   r\   s     r&   _initialize_merchant_statez6AdvancedTransactionAnalyzer._initialize_merchant_statel   sF    ! ,"0.#,h7lnn!#
 
 
 	
r(   Ncurrent_snapshotprevious_snapshotc                    g }|j          d|j         d|j         }|| j                            |          }|| j        |<   |D|                     |           t          j        d| dt          |j	                   d           |S | 
                    ||          }|D ],}|                     |          }|                    |           -|                     |           |                                  |S )u   Анализ изменений в ордербуке с отслеживанием жизненного цикла ордеровrZ   Nu   🔍 First snapshot for z, initialized z
 merchants)r   r?   r   rV   get)_initialize_merchant_states_from_snapshotr   rW   r2   orders_analyze_merchant_transitions_process_merchant_transitionextend%_update_merchant_states_from_snapshot_cleanup_expired_d_variables)r,   ra   rb   eventssnapshot_keytransitions
transitiontransition_eventss           r&   analyze_orderbook_changesz5AdvancedTransactionAnalyzer.analyze_orderbook_changesx   s1    *0hh3C3NhhQaQfhh $ $ 3 7 7 E E -=L)$::;KLLLKw<wwsScSjOkOkwwwxxxM 889IK\]] & 	- 	-J $ A A* M MMM+,,,, 	223CDDD 	))+++r(   snapshotc                     |j         D ]i}|                     |j        |j        |j                  }|| j        vr|                     |          | j        |<   O|| j        |         j        |j        <   jdS )u\   Инициализировать состояния мерчантов из снапшотаN)	rf   r[   r   r   r   rQ   r`   r   r_   )r,   rr   r%   merchant_keys       r&   re   zEAdvancedTransactionAnalyzer._initialize_merchant_states_from_snapshot   s    _ 	Y 	YE11%2CU[RWR\]]L4#777595T5TUZ5[5[$\22 TY$\2@PP	Y 	Yr(   c           
      h   i }|j         D ]A}|                     |j        |j        |j                  }||vri ||<   |||         |j        <   B|                                D ]\  }}|| j        v rU|| j        |         _        t          j
                    | j        |         _        | j        |                                          ct          t          |                                                    }t!          |j        |j        |j        |j        |t          j
                    g           | j        |<   | j        |                                          t%          | j                                                  D ]7}||vr1i | j        |         _        | j        |                                          8dS )uL   Обновить состояния мерчантов из снапшотаr^   N)rf   r[   r   r   r   r_   itemsrQ   r   r   r1   r   r4   nextiterr*   r   r   listkeys)r,   rr   current_merchantsr%   rt   rf   first_orders          r&   rj   zAAdvancedTransactionAnalyzer._update_merchant_states_from_snapshot   s    _ 	D 	DE11%2CU[RWR\]]L#44424!,/>Cl+EN;; %6$;$;$=$= 	K 	K L&t333CI$\2@?G|~~$\2<$\2HHJJJJ #4#8#8995G + 7"-";%+$)"(&lnn)+6 6 6$\2 $\2HHJJJJ !!5!:!:!<!<== 	K 	KL#444CE$\2@$\2HHJJJ	K 	Kr(   c                 \     fd} ||          } ||          }g }t          |                                          t          |                                          z  }|D ]D}|                    |i           |                    |i           k    r6t          d                                 D                       }	t          d                                 D                       }
fd                                D             }fd                                D             }g }t                                                    t                                                    z  D ]9}|         }|         }|j        |j        k    r|                    ||f           :                     |	|
|||          r!t          j
        d| d|	dd	|
d           t          |
|	z
            d
k    s|s|s|rt                                                    p t                                                    d         }t          |j        |j        |j        |j        |j        t'          j                    |	|
|||          }|                    |           F|S )uq   Анализировать переходы состояний мерчантов между снапшотамиc                     i }| j         D ]A}                    |j        |j        |j                  }||vri ||<   |||         |j        <   B|S r    )rf   r[   r   r   r   r_   )rr   groupsr%   rt   r,   s       r&   group_by_merchantszUAdvancedTransactionAnalyzer._analyze_merchant_transitions.<locals>.group_by_merchants   sg    F! = =#55e6GV[V`aav--+-F<(7<|$U^44Mr(   c              3   $   K   | ]}|j         V  d S r    r!   r#   s     r&   r'   zLAdvancedTransactionAnalyzer._analyze_merchant_transitions.<locals>.<genexpr>   s%      %a%ae&<%a%a%a%a%a%ar(   c              3   $   K   | ]}|j         V  d S r    r!   r#   s     r&   r'   zLAdvancedTransactionAnalyzer._analyze_merchant_transitions.<locals>.<genexpr>   s%      $_$_U%;$_$_$_$_$_$_r(   c                 "    g | ]\  }}|v	|S r<   r<   )r$   r_   r%   rC   s      r&   
<listcomp>zMAdvancedTransactionAnalyzer._analyze_merchant_transitions.<locals>.<listcomp>   s4     "A "A "AOHe#+<#?#? #(#?#?#?r(   c                 "    g | ]\  }}|v	|S r<   r<   )r$   r_   r%   rA   s      r&   r   zMAdvancedTransactionAnalyzer._analyze_merchant_transitions.<locals>.<listcomp>   s1     ? ? ?5 ( = =  % = = =r(   u   🎭 Filtering manipulation: z
 - volume .2f    → {Gz?r   )r   r   r   r   r?   r@   rA   rB   rC   rD   rE   rF   rG   )rT   rz   rd   r)   r*   rv   r"   r0   _is_likely_manipulationr   debugabsry   r>   r   r   r   r   r?   r   r1   )r,   ra   rb   r   previous_merchantsr{   rn   all_merchant_keysrt   rB   rD   rE   rF   rG   r_   	old_order	new_ordermerchant_inforo   rC   rA   s   `                  @@r&   rg   z9AdvancedTransactionAnalyzer._analyze_merchant_transitions   sh   	 	 	 	 	 0/0ABB../?@@   2 7 7 9 9::SARAWAWAYAY=Z=ZZ- 6	/ 6	/L.22<DDM,00rBBL ,, #&%a%a-J^J^J`J`%a%a%a"a"a!$$_$_I\I\I^I^$_$_$_!_!_"A "A "A "A}?R?R?T?T "A "A "A? ? ? ?L<N<N<P<P ? ? ?O !O 2 2 4 455L<M<M<O<O8P8PP C C)(3	(2	-1KKK#**Iy+ABBB ++,?AS*<o|] ]  \\ \ \%8[\ \CU[\ \ ] ] ] &)<<==DD" E&5 E9H E "&l&9&9&;&;!<!<!\]EYEYE[E[@\@\^_ `, - 9"/"='-&+/:&lnn"/(;!-'9'9$3$3  
  "":...r(   volume_beforevolume_afterrE   rF   rt   c                    || j         vrdS | j         |         }t          |j                  dk    r{d |j        dd         D             }|}t          |          dk    rMt          ||d         z
            dk     r1t	          j        d	| d
|d         dd|d         dd|d           dS |dk    r[|dk    rUt          |          dk    rBt          |          dk    r/t          ||z
            dk     rt	          j        d|            dS dS )uf   Проверить, является ли изменение манипуляцией мерчантаF   c                     g | ]\  }}|S r<   r<   )r$   rZ   vols      r&   r   zGAdvancedTransactionAnalyzer._is_likely_manipulation.<locals>.<listcomp>.  s    YYYfacYYYr(   Nr   r   r   u#   🔄 Circular pattern detected for : r   r      Tu$   🔀 Order reshuffling detected for )rQ   r2   r   r   r   r   )	r,   r   r   rE   rF   rt   merchant_staterecent_volumesr3   s	            r&   r   z3AdvancedTransactionAnalyzer._is_likely_manipulation!  s~    t3335-l; ~233q88YY0STVTWTW0XYYYN)N >""a''CPQAR0R,S,SVZ,Z,Z k< k k,Q/jk k:H:Kjk kVdjk k l l lt A,"2"2"##a''C,@,@1,D,D,--44LNNNOOO4ur(   ro   c                    g }t          j        d|j         d|j        dd|j        dd|j        dd|j         
           t          |j                  dk     r|                     |           no|j        d	k     r-| 	                    |          }|r|
                    |           n7|j        dk    r,|                     |          }|r|
                    |           |S )
u   Обработать переход состояния мерчанта и классифицировать как сделку/пополнение/отменуu   🔄 Processing transition for r   r   r   z (z+.2fz) r   g{Gz)r   r   r   rB   rD   rI   r   r   _process_neutral_transition#_process_volume_decrease_transitionr0   #_process_volume_increase_transition)r,   ro   rl   trade_eventincrease_events        r&   rh   z8AdvancedTransactionAnalyzer._process_merchant_transitionE  s5     	 Lz7O L L!5dL L@J@]dL L"0KL L9C9IL L 	M 	M 	M
 z'((4//,,Z8888%--BB:NNK +k***%,,!EEjQQN .n---r(   c                    t          |j                  }|                     |j        |j        ||j        |j        d          }|| j        v rt          j	        d|j
         d           dS | j                            |           |j         d|j         d|dd          }t          ||j        |j        |j        |j        |t          j                    t          j                    t#          | j                  z   |                     |          |j
        
  
        }|| j        |<   t          j	        d	| d
| d|j         d| j         d	           dS )u   Обработать уменьшение объема (создание D-переменной для потенциальной сделки)volume_decreaseu,   🔄 Duplicate volume decrease detected for 
, skippingNrZ      )seconds)
idr   r   r   r?   amountr@   
expires_atprice_at_d1r   u   📉 Created D-variable: z for  z (expires in s))r   rI   _create_transaction_hashr   r   rB   rD   rU   r   r   r   addr   r   r?   r   r1   r	   rO   _estimate_price_from_transitionrR   )r,   ro   decrease_amounttransaction_hashd_var_id
d_variables         r&   r   z?AdvancedTransactionAnalyzer._process_volume_decrease_transitionb  s    j677  88"*)
 
 t:::Ll
H`lllmmm4#''(8999 !,XXz/?XXBRSUTUSUBVXX"."!,"lnn|~~	$:Q(R(R(RR<<ZHH$2
 
 

 &0" ? ? ? ? ?R\Rb ? ?#'#:? ? ? 	@ 	@ 	@ tr(   c                    |j         }|                     |j        |j        ||j        |j        d          }|| j        v rt          j        d|j	         d           dS | j        
                    |           d}| j                                        D ]O\  }}|j        |j        k    s|j        |j        k    r'	 t          t          |j                  t          |          z
            }|                     |          p|j        pd}|dk    r||z  n|}	t%          d|dk    r'dt          t          |j                  |z            z  n#dt          t          |j                            z            }
|dk    rGt%          ddt%          t          |j                  t          |                    z            }||k    }n|	|
k    }n# t&          $ r d	}Y nw xY w|r|} nQ|rt          j        d
|j	         d|dd|j         dt+          j                    |j        z
                                  dd	           | j        |j        = t5          |j        |j	        |j        |j        d||                     |          |j        |j        |j        
  
        }|                     |j        |j	        |j        d|           |S t          j        d|j	         d|dd|j         d|j        dd|j        dd           t5          |j        |j	        |j        |j        d||                     |          |j        |j        |j        
  
        }|                     |j        |j	        |j        d|           |S )u   Обработать увеличение объема (поиск соответствующей D-переменной или пополнение)volume_increaseu,   🔄 Duplicate volume increase detected for r   NrH   r   g      @g{Gz?Fu"   🚫 Order cancellation detected: r   r   z (time since decrease: z.0fr   order_cancellation
r   r   r   r   transaction_typer   pricer   r   r?   u   💰 Merchant top-up detected: z +z
 (volume: r   )top_up)rI   r   r   r   rB   rD   rU   r   r   r   r   rR   rv   r   r;   r   r   r   max	ExceptionrW   r   r1   r@   total_secondsr   r   r   r?   '_update_merchant_stats_with_transaction)r,   ro   increase_amountr   matching_d_varr   d_vardiffr   diff_usdbase_usd_tol	tolerancecondtransactions                 r&   r   z?AdvancedTransactionAnalyzer._process_volume_increase_transition  sy    %2  88"*)
 
 t:::Ll
H`lllmmm4#''(8999 #/5577 	 	OHe J$:::ekZM]>]>]5..1G1GGHH<<ZHHdEL]dad+01994%<<$"3SX[\S\S\s53F3F3N/O/O(O(Obfilmrsxs  nA  nA  jB  jB  cB   C   CA:: #D$U5<5H5H%P_J`J`1a1a*a b bI9,DD#|3D    !&  >	K tZ=U t t)Ct t0:0@t t19.BZ1Z0i0i0k0kst t t u u u
  !23 0&2(6 &_!5&:::FF(<':%0  K 88&( $    K q*:R q q*Dq q1;1Aq q#-#Apq qLVLipq q q r r r
 0&2(6 &_!)&:::FF(<':%0  K 88&(    s   ;DG

GGc           
          |j         s|j        rIt          j        d|j         dt          |j                    dt          |j                   d           dS dS )u_   Обработать нейтральный переход (объем не изменился)u   🔄 Order refresh: z (disappeared: z, appeared: r   N)rE   rF   r   r   r   r2   )r,   ro   s     r&   r   z7AdvancedTransactionAnalyzer._process_neutral_transition  s     ( 	IJ,F 	IL H
0H H H),Z-J)K)KH H%()C%D%DH H H I I I I I	I 	Ir(   c                 *   |j         rBd |j                                         D             }t          |          t          |          z  S |j        rBd |j                                        D             }t          |          t          |          z  S dS )u@   Оценить цену из перехода состоянияc                     g | ]	}|j         
S r<   r   r#   s     r&   r   zOAdvancedTransactionAnalyzer._estimate_price_from_transition.<locals>.<listcomp>	  s    PPPeekPPPr(   c                     g | ]	}|j         
S r<   r   r#   s     r&   r   zOAdvancedTransactionAnalyzer._estimate_price_from_transition.<locals>.<listcomp>  s    QQQeekQQQr(   rH   )rC   r*   r)   r2   rA   )r,   ro   pricess      r&   r   z;AdvancedTransactionAnalyzer._estimate_price_from_transition  s     " 	PPz/F/M/M/O/OPPPFv;;V,,% 	QQz/G/N/N/P/PQQQFv;;V,,3r(   r   
event_typer   c                 4   || j         vrt          |||          | j         |<   | j         |         }|j        s	|r||_        |dk    r|                    |           dS |dk    r|                    |           dS |dk    r|                    |           dS dS )uq   Обновление статистики мерчанта с индивидуальной транзакцией)r   r   r   
real_trader   r   N)rS   r   r   add_confirmed_tradeadd_cancelled_orderadd_merchant_topup)r,   r   r   r   r   r   statss          r&   r   zCAdvancedTransactionAnalyzer._update_merchant_stats_with_transaction  s     d111/E'+0 0 0D, #K0" 	0} 	0"/E%%%%k22222///%%k222228##$$[11111 $#r(   r   r   c                     | d| d|dd|dd|dd| }t          j        |                                                                          dd         S )ue   Создание уникального хеша для дедупликации транзакцийrZ   z.6fN   )hashlibsha256encode	hexdigest)r,   r   r   r   r   r   r   hash_strings           r&   r   z4AdvancedTransactionAnalyzer._create_transaction_hash(  ss     %uuuuuvuuuMuuuP\uuucsuu~k002233==??DDr(   c                    t          j                    }g }g d}| j                                        D ]\  }}||j        z
                                  }|j        }|t          |          k     r0|||         k    r$|dz  }|t          |          k     r|||         k    $||j        k    ra||_        ||_        t          j
        d|j         d|j         dt          |j                  dd|j         dt          |           d	           |j        r|                    |           |j        d
k    rt          j
        d|j         dt          |j                  dd|j         dt          |           d		           |                     |j        |j        |j                  }| j                            |          }	|j        p
|	r|	j        nd}
|j        p|	rt1          |	dd          pd}|j        }|j        pz|	rw|                     t7          |j        |
|j        |||	r|	j        ni |	r|	                                nd|	r|	j        ni |	r|	                                ndg g g |                    nd}t=          |j        |
|j        |dt          |j                  |dd|
  
        }|                     |j        |
|j        d|           |                    |           |D ]!}t          j         d|            | j        |= "dS )u   Эскалация подтверждений D‑переменных и финальное подтверждение реальных сделок)iX  i  i  rN   r   u   ⏱️ D-stage z/4 for z -r   r   z (age r      u(   ✅ Real trade auto-confirmed: merchant  r?   NSELLrH   )r   r   r   r   r@   rA   rB   rC   rD   rE   rF   rG   r?   r   r   u   🗑️ Removing D-variable: )!r   r1   rR   rv   r@   r   confirmation_stager2   last_confirmation_atr   rW   r   r;   r   r   int
is_matchedr0   r[   r   rQ   rd   r   r?   getattrr   r   r>   r   r-   r   r   r   )r,   current_time	to_deletestages_secondsr   r   age_seconds
next_stage	state_keystateresolved_nameresolved_trade_typeresolved_fiatresolved_pricer   s                  r&   rk   z8AdvancedTransactionAnalyzer._cleanup_expired_d_variables.  s   |~~	 100#/5577 C	+ C	+OHe'%/9HHJJK 1Js>2222{nU_F`7`7`a
 s>2222{nU_F`7`7`U555+5(-9*Ze&> Z ZuGX Z Zel++YZ Z27+Z ZEHEUEUZ Z Z      ***'1,,Zu?P Z Zel++YZ Z27+Z ZEHEUEUZ Z Z  
 !2253DekSXS]^^	,00;; % 3 ]u8\8K8KZ\&+&6&r5;gWUT`bfEgEg&rlr# %
!&!2 "%  !8$t7[7[#$)$5&3#k*".=B&Je&9&9HM,VE,B,B,D,D,DSV<A%IU%8%8rGL+U5+A+A+C+C+CRU+-(*(*#6  8 8 8  !$! $ 4 % 1"/+&%1 ..("%!$2   <<%!K      ***! 	+ 	+HLCCCDDD **	+ 	+r(   c                   	 dt           dt          fd	i }| j                                        D ]z}|j        }||vrddd||<   ||         dxx         dz  cc<   	 ||         d	xx         t          |j                  z  cc<   U# t          $ r ||         d	xx         dz  cc<   Y ww xY wi }| j        	                                D ]\  }}|j
        |j        |j        |j        |j        |j        |j        |j        |j        r|j                                        nd
t)          |                    |i                               dd                    t          |                    |i                               d	d                    	fd|j        D             	fd|j        D             	fd|j        D             d||<   | j        	                                D ]j\  }}|j         d|j         d|j         }|j        |v s||v r,|j
        |j        dddddd|j        r|j                                        nd
ddg g g d||<   kt9          j                                                    t=          |          t=          | j                  t=          | j                  t=          | j                  |d | j        	                                D             dS )u8   Экспорт статистики в JSON форматr   r   c                 *    |                                  S r    )to_dict)r   s    r&   serialize_transactionzOAdvancedTransactionAnalyzer.export_stats_to_json.<locals>.serialize_transaction  s    &&(((r(   r   rH   )countvolumer   r   r   Nc                 &    g | ]} |          S r<   r<   r$   tr   s     r&   r   zDAdvancedTransactionAnalyzer.export_stats_to_json.<locals>.<listcomp>  s%    %`%`%`1&;&;A&>&>%`%`%`r(   c                 &    g | ]} |          S r<   r<   r   s     r&   r   zDAdvancedTransactionAnalyzer.export_stats_to_json.<locals>.<listcomp>  s%    &b&b&bA'<'<Q'?'?&b&b&br(   c                 &    g | ]} |          S r<   r<   r   s     r&   r   zDAdvancedTransactionAnalyzer.export_stats_to_json.<locals>.<listcomp>  s%    ,n,n,n!-B-B1-E-E,n,n,nr(   )r   r   real_trades_countreal_trades_volumeorder_cancellations_countorder_cancellations_volumetop_ups_counttop_ups_volumelast_activitypending_real_trades_countpending_real_trades_volumeindividual_tradesindividual_top_upsindividual_cancellationsrZ   c                 P   i | ]\  }}||j         |j        |j        |j        |j        t          |j                  |j        |j        	                                |j
        r|j
        	                                nd |j        |j        	                                |j        |j        dS )N)r   r   r   r   r?   r   r   r@   r   r   r   r   matched_with)r   r   r   r   r?   r;   r   r   r@   	isoformatr   r   r   r   r	  )r$   d_idds      r&   
<dictcomp>zDAdvancedTransactionAnalyzer.export_stats_to_json.<locals>.<dictcomp>  s         D! #$=%&_WF"#,#AHoo#$=!"!6!6!8!8RSRh,rA,B,L,L,N,N,Nnr*+*>"#,"8"8":":"#,$%N   r(   )r@   total_merchantsactive_d_variablesactive_merchant_statesrU   rS   rR   ) r   dictrR   r*   r   r;   r   r   rS   rv   r   r   r   r   r   r   r   r  r  r
  r   rd   r  r  r  rQ   r   r   r   r1   r2   rU   )
r,   pending_by_merchantr   r   merchant_stats_jsonr   r   r   derived_keyr   s
            @r&   export_stats_to_jsonz0AdvancedTransactionAnalyzer.export_stats_to_json  s   	)/D 	) 	) 	) 	) 	) <>%,,.. 		B 		BE+K"555=>#3N3N#K0,W555:555B#K0:::eEL>Q>QQ:::: B B B#K0:::cA:::::B !"&"5";";"="= 	 	K!&!4%*%<&+&>-2-L.3.N!&!4"'"6DIDW!a!4!>!>!@!@!@]a-01D1H1HVX1Y1Y1]1]^egh1i1i-j-j.34G4K4KKY[4\4\4`4`aikn4o4o.p.p%`%`%`%`H_%`%`%`&b&b&b&bIa&b&b&b,n,n,n,nuOm,n,n,n0 0,,( !% 4 : : < < 	 	Iu".KKKKuzKKK $777;J];];]!&!4%&&)-..1!""%@E!Y!:!:!<!<!<UY-..1%'&(,.0 0,,$ "1133"#677"%d&6"7"7&)$*>&?&?&)$*E&F&F1    $/5577!  
 
 	
s   (B B'&B'c                     | j         S )u8   Получить статистику мерчантов)rS   r+   s    r&   get_merchant_statsz.AdvancedTransactionAnalyzer.get_merchant_stats  s    ""r(   )rN   r    )$r5   r6   r7   r8   r   rX   r9   r[   r   r   r`   r   r   r   rq   re   rj   r>   rg   r;   boolr   rh   r   r   r   r   r   r   r   rk   r  r  r   r   r  r<   r(   r&   rM   rM   O   s%        F F3 F F F F(/S / /C /C / / / /

8 

@R 

 

 

 

 :>% %+% $$56% 
	% % % %N	YBS 	Y 	Y 	Y 	Y"K>O "K "K "K "KHQ+Q -Q 
o		Q Q Q Qf"U "% "37"JN"-0"59" " " "H 4    :-o - - - -^jo j j j jXIo I I I I
/ 
e 
 
 
 
23 2WZ 2582FI2Xm2 2 2 2.EC E EU E/4EDIE]`EehE E E EO+ O+ O+b[
d [
 [
 [
 [
z#D.D)D$E # # # # # #r(   rM   )r8   asynciotimer   typingr   r   r   r   r   r   r	   decimalr
   dataclassesr   logurur   models.orderr   r   models.transactionr   r   r   r   r   r>   rM   r<   r(   r&   <module>r!     s   
    3 3 3 3 3 3 3 3 3 3 3 3 3 3 ( ( ( ( ( ( ( (       ! ! ! ! ! !       6 6 6 6 6 6 6 6           
 H H H H H H H H8 P P P P P P P P6O
# O
# O
# O
# O
# O
# O
# O
# O
# O
#r(   