U
    Rh;                     @   s>   d dl Z d dlmZ d dlT d dlmZ G dd dejZdS )    N)Decimal)*)	cmf_transc                       sj  e Zd Zejjdg ZedN fdd	Zdd Zdd Z	d	d
 Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Z d7d8 Z!g fd9d:Z"d;d< Z#d=d> Z$d?d@ Z%dAdB Z&dCdD Z'dEdF Z( fdGdHZ) fdIdJZ*e+ddddKdLdMZ,  Z-S )OCmfTranstrans_ui_form_getNc                    s   |dkrl|sg }d }|r$| dd }|r6|dd|gg}|dkrl| dd }|d k	rlt|dkrl|ddd	gg}t j|f|||d
|S )N)status_from	status_toworkflow_idworkflow=r   r   r   status_typeOPEN)filtermodels_listobject_fields)getlensuperfield_options_list)clsZrelation_field_namer   r   r   kwargsr	   r   	__class__ ./common/models/cmf_trans.pyr      s    zCmfTrans.field_options_listc                 C   s8   t |j}t|}ddd|jg|g}t|j|dS )NANDidr   r   )cmfutilZget_model_by_name
class_nameZjsonloadsr   boolr   )selfZbql_strobjZmodelZ
filter_bqlr   r   r   _trans_ok_bql   s    
zCmfTrans._trans_ok_bqlc           
      C   s  d}t jjddd|jgddtjjgggdd}|r6d}|jd	ksF|jsJ|S | S d S ] }t|t j	rrtj|k}nt|t j
r|tjjk}nt|t jrtj|jk}nt|t jrRt|j }t }|rl| }|| t|t jrtj|jk}|rNqlqt|t jr<|j D ]}	|	|kr||	 qqtd
| dd qntd| d|j dd |rT qxqT|jd	ks|js|S | S d S )NFr   r   r   wz_value_objINT)r   cache_inmemory)z1 =z5 >=z6 <=z7 INz9 LIKEz	11 REGEXPz:DEV: FATAL _trans_filter_ok_current_user Unsupported obj: abortz@DEV: FATAL _trans_filter_ok_current_user Unsopported obj_class:  )modelsCmfTransFilterr   r   gZcurrent_personwz_conditionr%   
isinstanceZ	CmfPersonZCmfPersonGroupZrg_member_ofZCmfRoleZpersonZ
CmfOrgUnitsetZ
tree_nodesloadpopadd	cmf_alertr   )
r"   r   r#   resZ
search_objZ	value_objZnodesZchecked_nodesZnodeZ_noder   r   r   _trans_filter_ok_current_user)   sZ    


z&CmfTrans._trans_filter_ok_current_userc              
   C   sf  t ||jj j}|d kr d}|jjdd }|jj}|d krFd}|dkrd|s\t| S ||kS |dkr|sxt|S ||kS |dkr||kS |dkr||k S |dkr||kS |d	kr||kS |d
kr||kS |dk r||kS |dk r||kS |dkr||kS |dkrrzt	|}W nD tj
k
rb } z"td| d| d| dd W 5 d }~X Y nX t||S |dkrzt	|}W nD tj
k
r } z"td| d| d| dd W 5 d }~X Y nX t|| S |dkrt| S |dkrt|S |dkr*||jjko(||jjkS |dkrP||jjkoL||jjk S td| dd d S )N r*      r   !=><>=<=r&   NOT INLIKENOT LIKEREGEXP   Ошибка в условии uC   : некорректное регулярное выражение : Tr(   
NOT REGEXPIS_NULLNOT_NULLBETWEENNOT_BETWEENz@DEV: FATAL _trans_field_compare_text unknown clean_wz_condition=)getattrwz_field_namevaluer1   r.   	partitionwz_value_textr!   recompileerrorr4   searchZwz_start_valueZwz_end_value)r"   
trans_metar#   obj_valclean_wz_conditionZvalidator_valZregexper   r   r   _trans_field_compare_texta   sh    




0
0




z"CmfTrans._trans_field_compare_textc                 C   s8  t ||jjj}|jjdd }d }|dkr||d kr:dS zt|jj}W n0 tk
rz   td| d|jj dd Y nX |d	kr||kS |d
kr||kS |dkr||kS |dkr||k S |dkr||kS |dkr||kS |dkrtd| d| ddd n0|dkr,td| d| ddd n|dkrRtd| d| ddd n|dkrxtd| d| ddd n|dkrtd| d| ddd n|dkrtd| d| ddd np|dkr|d kS |dkr|d k	S |dkr||ko||kS |dkr"||ko||k S td| dd d S )Nr*   r8   )rE   rF   F!   Ошибка в Действии 4   : значние должно быть числом Tr(   r   r9   r:   r;   r<   r=   r&   rB   rC   uE    не поддерживается для цифровых полейr>   r?   r@   rA   rD   rE   rF   rG   rH   zCDEV: FATAL _trans_field_compare_numeric unknown clean_wz_condition=)	rI   rJ   rK   r.   rL   r   rM   
ValueErrorr4   )r"   rR   r#   rS   rT   valr   r   r   _trans_field_compare_numeric   s\    









z%CmfTrans._trans_field_compare_numericc                 C   s  t ||jjj}t|}|jjs&d}nH|jj dkr<d}n2|jj dkrRd}ntd| d|jj dd |jjdd	 }|d
kr||kS |dkr||kS |dkrtd| d| ddd n|dkrtd| d| ddd n|dkrtd| d| ddd n|dkr<td| d| ddd nj|dkrdtd| d| ddd nB|dkrtd| d| ddd n|dkrtd| d| ddd n|dkrtd| d| ddd n|dkrtd| d| ddd n|dkr$td| d| ddd n|dkr6|d kS |dkrH|d k	S |dkrntd| d| ddd n8|dkrtd| d| ddd ntd| dd d S )NF0Zfalseu   нет1trueu   даTrW   Q   : значние должно быть Boolean (0, 1, true, false, да, нет) r(   r*   r8   r   r9   r:   rB   rC   u<    не поддерживается для Boolean полейr;   r<   r=   r&   r>   r?   r@   rA   rD   rE   rF   rG   rH   zCDEV: FATAL _trans_field_compare_boolean unknown clean_wz_condition=)	rI   rJ   rK   r!   rM   lowerr4   r.   rL   )r"   rR   r#   rS   Zobj_val_boolrZ   rT   r   r   r   _trans_field_compare_boolean   s\    











z%CmfTrans._trans_field_compare_booleanc                 C   s  t ||jj j}|j }tdd |D }tdd |D }|jjdd }|dkrd||kS |dkrt||kS |dkr||kS |d	kr||k S |d
kr||kS |dkr||kS |dkr||kS |dkr||kS |dk rtd| d| ddd n|dkr td| d| ddd n|dkrFtd| d| ddd n|dkrltd| d| ddd n|dkrt	| S |dkrt	|S |dkrtd| d| ddd n8|dkrtd| d| ddd ntd| dd d S )Nc                 S   s   g | ]}|j jqS r   r   rK   .0or   r   r   
<listcomp>  s     z5CmfTrans._trans_field_compare_m2m.<locals>.<listcomp>c                 S   s   g | ]}|j jqS r   rd   re   r   r   r   rh     s     r*   r8   r   r9   r:   r;   r<   r=   r&   r>   r?   rB   rC   u8    не поддерживается для m2m полейTr(   r@   rA   rD   rE   rF   rG   rH   z?DEV: FATAL _trans_field_compare_m2m unknown clean_wz_condition=)
rI   rJ   rK   r1   r%   r0   r.   rL   r4   r!   )r"   rR   r#   rS   val_listZobj_val_id_setval_list_id_setrT   r   r   r   _trans_field_compare_m2m	  sL    









z!CmfTrans._trans_field_compare_m2mc                    sr  t | jj j} j tdd D } fdd} jjdd }|dkrj|  |d kS |d	kr|  |d kS |d
krtd  d| ddd n|dkrtd  d| ddd n|dkrtd  d| ddd nx|dkrtd  d| ddd nP|dkr4|j	j|kS |dkrJ|j	j|kS |dkrrtd  d| ddd  n|dkrtd  d| ddd n|dkrtd  d| ddd n|dkrtd  d| ddd n|dkrt
| S |dkr
t
|S |dkr0td  d| ddd n>|dkrVtd  d| ddd ntd  d| dd d S )Nc                 S   s   g | ]}|j jqS r   rd   re   r   r   r   rh   8  s     z4CmfTrans._trans_field_compare_fk.<locals>.<listcomp>c                      s(   t dkr$td  d dd d S )N   rB   :    должен быть только один объект Tr(   )r   r4   r   rR   ri   r   r   Z__check_one_item:  s
    z:CmfTrans._trans_field_compare_fk.<locals>.__check_one_itemr*   r8   r   r   r9   r:   rB   rC   u7    не поддерживается для fk полейTr(   r;   r<   r=   r&   r>   r?   r@   rA   rD   rE   rF   rG   rH   z#DEV: FATAL _trans_field_compare_fk z unknown clean_wz_condition=)rI   rJ   rK   r1   r%   r0   r.   rL   r4   r   r!   )r"   rR   r#   rS   rj   Z_CmfTrans__check_one_itemrT   r   rn   r   _trans_field_compare_fk5  sP    












z CmfTrans._trans_field_compare_fkc                 C   s@  |j |jkrdS |jsdS t||jj}t|tjj	rB| 
||S t|tjjr\| ||S t|tjjrv| ||S t|tjjr| ||S t|tjjr| ||S t|tjjrtd| dt| dd nJt|tjjrtd| dt| dd nt|tjjr | ||S td| dt| dd d S )NFz0DEV: FATAL _trans_field_compare NotImplemented: r*   Tr(   uH   DEV: FATAL _trans_field_compare Неизвестный тип поля: )r   cmf_model_namer.   rI   rJ   rK   r/   cmffields
CmfM2MBaserk   
CmfRelBasero   CmfStrrV   CmfIntr[   
CmfNumericCmfDateTimer4   typeCmfDateCmfBoolrc   )r"   rR   r#   fieldr   r   r   _trans_field_compareh  s,    zCmfTrans._trans_field_comparec                 C   sV   | j d }|j sdS t|tjr.|jj}nd}tjj	|||dgd}|oT|j
dkS )Nr   T
resolution)r#   obj_versionZ
obj_statusrr   approved)r   need_approver1   r/   r+   CmfDocumentZcur_workflow_versionZdoc_version
CmfApprover   r~   )r"   r   r#   r   r   aggreg_fullr   r   r   _trans_filter_approved  s    


  zCmfTrans._trans_filter_approvedc                 C   s6   | j d j sdS tjj|ddgd}|o4|jdkS )Nr   Tr~   )r#   Zis_cur_approverr   rejected)r   r   r1   r+   r   r   r~   )r"   r   r#   r   r   r   r   _trans_filter_rejected  s    zCmfTrans._trans_filter_rejectedc                 C   s   |  ||S Nr}   r"   r   r#   r   r   r   _trans_filter_ok_field  s    zCmfTrans._trans_filter_ok_fieldc                 C   s   dS NFr   r   r   r   r   _trans_filter_ok_always_false  s    z&CmfTrans._trans_filter_ok_always_falsec                 C   s   |  |jj|S r   )r$   bqlrK   r   r   r   r   _trans_filter_ok_bql  s    zCmfTrans._trans_filter_ok_bqlc                 C   s@   t jr<||}| }|r8tjs*|t_nttj|t_|S dS r   )configBZPYTHON_ENABLEDeval_bzpythonZget_bzpython_jscache_timelifer-   jscache_timelifemin)r"   r   r#   r5   r   r   r   r   _trans_filter_ok_eval  s    
zCmfTrans._trans_filter_ok_evalc                 C   s   t ddd d S )Nz,DEV: Not supported _trans_filter_ok_union_orTr(   r4   r   r   r   r   _trans_filter_ok_union_or  s    z"CmfTrans._trans_filter_ok_union_orc                 C   s   t ddd d S )Nz-DEV: Not supported _trans_filter_ok_union_andTr(   r   r   r   r   r   _trans_filter_ok_union_and  s    z#CmfTrans._trans_filter_ok_union_andc                 C   s  t tdd }dt_d}tjj| dgddgddD ]T}|js>q0|jjdd }|d	krh| 	||}n|d
kr~| 
||}n|dkr| ||}n|dkr| ||}n|dkr| ||}n|dkr|jjr|jj}|jj|_| ||}||_n| ||}nt|dkr| ||}n\|dkr6| ||}nD|dkrN| ||}n,|dkrf| ||}ntd|j dd |s0|  S q0|t_|S )Ndisable_raise_lazyloadTordernor   r%   
transitionZorderbyrr   r'   r*   r8   Zcurrent_userr|   Zalways_falseprev_statusr   evalZunion_orZ	union_andr   r   z5DEV: FATAL trans_filter_ok unknown filter.logic_type=r(   )rI   r-   r   r+   r,   list
logic_typerK   rL   r6   r   r   _trans_prev_statusr   status
is_changedoldr   r   r   r   r   r4   )r"   r#   prev_disable_raise_lazyloadr5   r   clean_logic_typeZ
new_statusr   r   r   trans_filter_ok  sN    






zCmfTrans.trans_filter_okc                 C   s   |  ||S r   r   r"   	validatorr#   r   r   r   _trans_validator_field  s    zCmfTrans._trans_validator_fieldc                 C   s   |j  }|sdS |j j}|s&i }|dd}|dd}|dd}d}|jjrZd}d}	|r|jj|krrd}	|r||	 S |	S |D ]}
ddd|
jj d	 g}|sddd
|
jj d	 g}|r|st	j
jdd|g|gd}|dkrd}	 qqt	j
jdd|g|gdsd}	 qq|r|	 S |	S )NTinclude_current_statusFreverse_rulemost_recent_status_onlyZ
audit_dataz
SIMILAR TOz%{"status":{[^}]*"z"%z%{"status":{[^}]*old":"parentr   r   rl   )r%   r1   wz_prev_status_optionsrK   r   r   r   r   r   r+   ZCmfAuditcount)r"   rR   r#   Zstatus_listr   r   r   r   Z
audit_doner5   r   Zstatus_filterr   r   r   r   r     sP    
zCmfTrans._trans_prev_statusc                 C   s   t ddd dS )Nz4DEV: Not supported _trans_validator_trans_form_fieldTr(   r   r   r   r   r   !_trans_validator_trans_form_field(  s    z*CmfTrans._trans_validator_trans_form_fieldc                 C   s\   |  |jj|}|sX|jr(t|jdd |j  td|jj d|j d|j dd |S )NTr(   u   Переход "u/   " запрещен UBQL-Валидатором     у объекта )	r$   r   rK   error_messager4   r   r1   namecode)r"   r   r#   r5   r   r   r   _trans_validator_bql,  s    
&zCmfTrans._trans_validator_bqlc                 C   s   t jr||S dS r   r   r   r   r   r   r   r   _trans_validator_eval5  s    
zCmfTrans._trans_validator_evalc              	   C   sJ  t tdd }dt_d}| jr"| jn| }tjj|dgdgddD ]}|jsJq>|jj	dd }|dkrr| 
||}nl|d	kr| ||}nV|d
kr| ||}n@|dkr| ||}n*|dkr| ||}ntd|j dd |s> qq>|t_|rd S |jrt|jdd |j  td|j d|jj d|jj d|j dd d S )Nr   Tr   r   r   r*   r8   r|   r   Ztrans_form_fieldr   r   z;DEV: FATAL trans_validator_ok unknown validator.logic_type=r(   u7   Ошибка выполнения Валидатора u    для перехода r   rC   )rI   r-   r   Zdo_validation_byr+   ZCmfTransValidr   r   rK   rL   r   r   r   r   r   r4   r   r   r1   r   r   )r"   r#   r   Zvalidr   r   r   r   r   r   trans_validator_ok:  s8    
zCmfTrans.trans_validator_okc                 C   s  d}|j jdd }|dkr2t||jjg  dS |dkrX|j }t||jj| dS |dkrt||jj }|j }|D ]}||kr|| d}q|S |dkrt||jj }|j }|D ]}||kr|	| d}q|S t
d	|j d
| dd d S )NFr*   r8   clearT:=)ZaddItemr3   )ZdelItemdeluX   DEV: FATAL _trans_action_field_m2m неподдерживаемое действие в  wz_operate=r(   )
wz_operaterK   rL   setattrrJ   r%   r1   rI   appendremover4   r   )r"   actionr#   has_changesclean_wz_operaterZ   r|   ri   r   r   r   _trans_action_field_m2m\  s4    




z CmfTrans._trans_action_field_m2mc                 C   s  |j jdd }|dkr.t||jjd  dS |dkr|j }t|dkrdtd| d| dd	 |std| d
| dd	 t||jj|d  dS |dkr"t	||jj }|j
rdS |j }t|dkrtd| d| dd	 |s
td| d
| dd	 t||jj|d  dS |dkrzt	||jj }|j }|D ](}||jkrLt||jjd   dS qLdS td|j d| dd	 d S )Nr*   r8   r   Tr   rl   rW   rm   r(   u8    не указан обьект для значения r   r3   Fr   uW   DEV: FATAL _trans_action_field_fk неподдерживаемое действие в r   )r   rK   rL   r   rJ   r%   r1   r   r4   rI   Zis_not_nullr   )r"   r   r#   r   rZ   r|   ri   r   r   r   _trans_action_field_fky  sX    





zCmfTrans._trans_action_field_fkc                 C   s  |j jdd }|dkr.t||jjd  dS |dkrLt||jj|j dS |dkrt||jj}|jj}|srdS |jd | }t||jj| dS |dkrt||jj}|jj}|sdS ||jkr|j|d	}t||jj| dS dS td
|j	 d| dd d S )Nr*   r8   r   Tr   r3   Fr   r7   uY   DEV: FATAL _trans_action_field_text неподдерживаемое действие в r   r(   )
r   rK   rL   r   rJ   rM   rI   replacer4   r   )r"   r   r#   r   r|   rZ   new_valr   r   r   _trans_action_field_text  s4    
z!CmfTrans._trans_action_field_textc           	         s  |j jdd }t||jjj}|s*d}|dkrFt||jjd  dS zt|jj}W n0 tk
r   t	d| d|jj dd Y nX |d	krt||jj| dS |d
kr0||  |r |kr }t
|}tt fdd|}|r|d  n|d  t	d|jj d| d   t||jj  dS |dkr||  |r |kr }t
|}tt fdd|}|r|d  n|d  t	d|jj d| d   t||jj  dS t	d|j d| dd d S )Nr*   r8   r   r   TrW   rX   r(   r   )Zincr3   c                    s   |  kS r   r   xr   r   r   <lambda>      z6CmfTrans._trans_action_field_numeric.<locals>.<lambda>u5   Действие пыталось выставить uC    в недопустимое значение для выбора: u<   . Выставили ближайшее доступное: )Zdecr   c                    s   |  kS r   r   r   r   r   r   r     r   u\   DEV: FATAL _trans_action_field_numeric неподдерживаемое действие в r   )r   rK   rL   rI   rJ   r   r   rM   rY   r4   sortedr   r   r   )	r"   r   r#   choice_limitr   Z
prev_valuerZ   Zbad_valZnew_val_tmpr   r   r   _trans_action_field_numeric  sT    



z$CmfTrans._trans_action_field_numericc                 C   s   |j jdd }|jjs d}nH|jj dkr6d}n2|jj dkrLd}ntd| d|jj dd	 |d
krt||jjd  dS |dkrt||jj| dS td|j d| dd	 d S )Nr*   r8   Fr\   r^   TrW   ra   r(   r   r   u\   DEV: FATAL _trans_action_field_boolean неподдерживаемое действие в r   )	r   rK   rL   rM   rb   r4   r   rJ   r   )r"   r   r#   r   rZ   r   r   r   _trans_action_field_boolean  s$    z$CmfTrans._trans_action_field_booleanc                 C   s   | dddg |jr|j}t }|jr2|jj}n|}t|jdkrj|jrV|j|d< ||d< || nt|jdkr||d< |	|}t|jjdkrt
jj|d	}|j|j |  |jst|jdkrt
jj|d	}||_|  d
S )Nwz_templatewz_template_targetzwz_template_target.parentr   Ztree_parentr   CmfTaskZCmfList)r   F)Zload_fieldsr   dictr   r   r   Zget_class_name_by_idr   Zcreate_doc_from_templateZcreate_task_from_templater+   r   r   Zlistsr   saveZparent_task)r"   r   r#   Ztmpltparamsr   Ztask_idZnew_taskr   r   r   "_trans_action_create_from_template,  s0    


z+CmfTrans._trans_action_create_from_templatec                 C   sf  |j |jkrdS |jsdS t||jj}t|tjj	rB| 
||S t|tjjr\| ||S t|tjjrv| ||S t|tjjr| j|||j dS t|tjjr| ||S t|tjjr| ||S t|tjj rtd| dt| dd nJt|tjjr*td| dt| dd nt|tjjrF| ||S td| dt| dd d S )NF)r   zDEV: FATAL NotImplemented: r*   Tr(   u3   DEV: FATAL Неизвестный тип поля: )r   rp   r   rI   rJ   rK   r/   rq   rr   rs   r   rt   r   ru   r   ZCmfChoiceIntr   choiceskeysrv   rw   rx   r4   ry   rz   r{   r   )r"   r   r#   r|   r   r   r   _trans_action_fieldK  s0    zCmfTrans._trans_action_fieldc                 C   s   t jr|| dS dS )NTFr   )r"   r   r#   r   r   r   _trans_action_evalj  s    
zCmfTrans._trans_action_evalc                 C   s   d}t ddd |S )NFz(DEV: Not supported _trans_action_webhookTr(   r   )r"   r   r#   r   r   r   r   _trans_action_webhooku  s    zCmfTrans._trans_action_webhookc                 C   s   t tdd }dt_d}tjj| dgdgddD ]}|jdkrN|| ||O }q.|jdkrj|| ||O }q.|jd	kr|| 	||O }q.|jd
kr|| 
||O }q.|jsq.q.td|j dd q.|t_|S )Nr   TFr   r   r   r|   r   ZwebhookZcreate_from_templatez7DEV: FATAL trans_run_actions unknown action.logic_type=r(   )rI   r-   r   r+   ZCmfTransActionr   r   r   r   r   r   r4   )r"   r#   r   r   r   r   r   r   trans_run_actionsz  s"    



zCmfTrans.trans_run_actionsc                    s   t   ddddg S )Nr   zstatus_to.status_typer
   is_create_transition)r   save_preload_fields)r"   r   r   r   r     s    zCmfTrans.save_preload_fieldsc                    sz   | j rJ| jrJdd| jgdddgdd| jgg}tjj|d}|rJtddd	 | jrh| jj	d
kshtddd	 t
 j|| d S )Nr
   r   r   Tr   r9   r   u[   В этом бизнес-процессе уже есть стартовый переходr(   r   uj   Cтартовый переход должен вести в статус с типом статуса OPEN)Zis_newr   r
   r   r+   r   r   r4   r   r   r   r   )r"   argsr   r   Ztransr   r   r   r     s     zCmfTrans.save)obj_id
obj_fieldsuser_form_inputc           
   
      sj  t jj|ddi|}|jrf| rft jt|jjD ],}d|kr8|d D ]}||krL|| qLq8|	dddddd	d
dg t
jd| |d}tt |j j||jd|_|r<| D ]\ }	 fdd|D t|	trd|	krt
jd|	d d}	n2|	r.t|	tr.d|	d kr.fdd|	D }	t| |	 qtt dr\t jj|||jd |j|j_|S )Nr'   Trr   Zrequest_type_idr   Zactivityzproject.ui_form_schemezproject.cust_field_conf_schemezproject.logic_prefixZcmf_deletedZis_dummyZsimpler   rr   )Zui_formc                    s2   g | ]*}|   d r|t  d d qS ).N)
startswithr   )rf   f)kr   r   rh     s      z.CmfTrans.trans_ui_form_get.<locals>.<listcomp>r   r   c                    s    g | ]}t jd |d  dqS )Tr   r   )r   get_obj_by_id)rf   i)relation_fieldsr   r   rh     s     CmfAutomationUiForm)r   cmf_ui_form)r+   r   r   r   Z	CmfUiFormZget_ui_group_fieldsstrr   r   extendr   r   varsr   Z_build_ui_formZui_form_jsonitemsr/   r   r   r   hasattrr   Zui_get_hook)
r   r   r   r   r   Z	trans_objZ	gr_fieldsZ
field_namer#   vr   )r   r   r   r     s>           
zCmfTrans.trans_ui_form_get)NNN).__name__
__module____qualname__r   r   Zapi_methodsclassmethodr   r$   r6   rV   r[   rc   rk   ro   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   staticmethodr   __classcell__r   r   r   r   r      sT   8A34,318	"-96r   )rN   decimalr   Zcmf.includeZcommon.fieldsr   r   r   r   r   r   <module>   s   