
    ei                     v   d dl mZmZmZ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mZmZmZmZmZmZmZmZ d dlmZmZmZ d dlmZ d dlm Z m!Z!m"Z" d dl#m$Z$m%Z%m&Z&m'Z' d d	l(m)Z) d d
l*m+Z+m,Z,m-Z-  ede.dd          Z/d Zd Ze/0                    d          e
 e)ddg          d                                     Z1e/0                    dddg          e
 e)ddg           e'j2        d          d                                                 Z3e/0                    d          e
 e)ddg          d                                     Z4e/0                    ddg          e
 e)ddg           e'j2        d          d                                                 Z5e/0                    ddg          e
 e)ddg          d                                      Z6e/0                    d!          e
 e)ddg          d"                                     Z7e/0                    d#          e
 e)ddg          d$                                     Z8e/0                    d%dg          e
 e)ddg          d&                                     Z9e/0                    d'dg          e
 e)ddg          d(                                     Z:e/0                    d)dg          e
 e)ddg          d*                                     Z;e/0                    d+dg          e
 e)ddg          d,                                     Z<d-S ).    )	Blueprintrender_templaterequestredirecturl_forflashcurrent_appabort)login_requiredcurrent_user)Message)	send_pending_account_emailsend_team_invitation_emailsend_account_suspended_emailsend_account_reactivated_emailsend_audit_blocked_emailsend_audit_unblocked_email'send_action_confirmation_to_distributor send_distributor_action_to_admin*send_admin_pending_validation_notification)datetimetimezone	timedelta)func)UserRapportAuditLog)dbbcryptmaillimiter)role_required)validate_email_formatescape_like_patterngenerate_random_passworddistributorz/distributorz../templates)
url_prefixtemplate_folderc                 "    t          | |          S )u>   Envoie l'email de compte en attente via le service centralisé)send_pending_email)userdistributor_names     9/var/www/html/MCyber-Diagnostic/blueprints/distributor.pyr   r      s    d$4555    c                 j   	 |                      dt          t          j        d                             }t	          d|d          }t
          j        pt
          j        }t          | ||          S # t          $ r7}t          j
                            d| j         d| d	           Y d
}~dS d
}~ww xY w)u6   Envoie l'email d'invitation via le service centraliséiQ 
SECRET_KEY)expires_sec
secret_keyzauth.reset_passwordT)token	_externalu(   Erreur envoi email team distributeur à : exc_infoNF)get_reset_tokenstrr	   configr   r   company_nameemailsend_team_email	Exceptionloggererror)r+   r3   	reset_urlinviter_namees        r-   r   r   #   s    $$3{GYZfGgChCh$ii1$OOO	#0FL4FtY===     !]DJ!]!]Z[!]!]hl mmmuuuuus   A.A1 1
B2;,B--B2z
/dashboardadminc                     t           j                            ddt                    } t           j                            dd          }t           j                            dd                                          }t           j                            dd	          }d
}t
          j        }d t          j        	                    t          j
        |k    t          j        |k    z                                            D             }t          j        	                    t          j                            |                    }|dk    r3|	                    t          j        dk    t          j        dk              }n|dk    r$|	                    t          j        dk              }n|dk    r3|	                    t          j        dk    t          j        dk              }nS|dk    r$|	                    t          j        dk              }n)|dk    r#|	                    t          j        dk              }|rmt%          |          }|	                    t          j                            d| dd          t          j                            d| dd          z            }|dk    r2|                    t          j                                                  }n|dk    rO|                    t          j                                        t          j                                                  }n|dk    rP|                    t          j                            d          t          j                                                  }n1|                    t          j                                                  }|                    | |d          }	d |	j        D             }
d |	j        D             }i }|
rt<          j                            t@          j!        tE          j#        t@          j
                            	                    t@          j!                            |
                    $                    t@          j!                                                  }d |D             }i }i }i }i }|r&t<          j                            t          j%        tE          j#        t          j
                            	                    t          j%                            |                    $                    t          j%                                                  }d |D             }t<          j                            t          j%        tE          j#        t@          j
                            &                    t@          t@          j!        t          j
        k              	                    t          j%                            |                    $                    t          j%                                                  }d |D             }t<          j                            t          j        tE          j#        t          j
                            	                    t          j                            |                    $                    t          j                                                  }d  |D             }t<          j                            t          j        tE          j#        t@          j
                            &                    t@          t@          j!        t          j
        k              	                    t          j                            |                    $                    t          j                                                  }d! |D             }g }|	j        D ]}|j        dk    r|                    |j
        d"          |_'        |                    |j
        d"          |_(        |                    |j
        d"          |                    |j
        d"          z   |                    |j
        d"          z   |_)        n.|                    |j
        d"          |_)        d"|_'        d"|_(        |*                    |           t          j        	                    t          j                            |                                                    }d# |D             }tW          |          }tY          d$ |D                       }tY          d% |D                       }tY          d& |D                       }tY          d' |D                       }d"}d"} |rt<          j                            tE          j#        t@          j
                            	                    t@          j!                            |                    -                                pd"}!d( |D             }"d"}#d"}$|"rd) t          j        	                    t          j%                            |"                                                    D             }%|%rt<          j                            tE          j#        t@          j
                            	                    t@          j!                            |%                    -                                pd"}#d* t          j        	                    t          j                            |"                                                    D             }&|&rt<          j                            tE          j#        t@          j
                            	                    t@          j!                            |&                    -                                pd"}$|!|#z   |$z   }t]          j/                    ta          d+,          z
  }'t<          j                            tE          j#        t@          j
                            	                    t@          j!                            |          t@          j1        |'k              -                                pd"}(d"})d"}*|"rd- t          j        	                    t          j%                            |"                                                    D             }%|%rt<          j                            tE          j#        t@          j
                            	                    t@          j!                            |%          t@          j1        |'k              -                                pd"})d. t          j        	                    t          j                            |"                                                    D             }&|&rt<          j                            tE          j#        t@          j
                            	                    t@          j!                            |&          t@          j1        |'k              -                                pd"}*|(|)z   |*z   } d"d/l2m3}+ d"},|rIt<          j                            tE          j#        |+j
                            	                    |+j!                            |                    -                                pd"},|"rd0 t          j        	                    t          j%                            |"                                                    D             }%|%rx|,t<          j                            tE          j#        |+j
                            	                    |+j!                            |%                    -                                pd"z  },|||||||,| d1}-ti          d2||-|	|||t]          j/                    3          S )4z#Dashboard principal du Distributeurpage   typesortdatesearch filterall
   c                     g | ]	}|j         
S  id.0us     r-   
<listcomp>z)distributor_dashboard.<locals>.<listcomp>C   &          r.   activeTFpendinginactivemanagerr+   %\escapenamerole
engagementNrF   per_page	error_outc                     g | ]	}|j         
S rR   rS   rV   as     r-   rX   z)distributor_dashboard.<locals>.<listcomp>p   s    222A14222r.   c                 2    g | ]}|j         d k    |j        S r]   rc   rT   ri   s     r-   rX   z)distributor_dashboard.<locals>.<listcomp>q   s&    IIIAQVy5H5H145H5H5Hr.   c                     i | ]\  }}||	S rR   rR   )rV   user_idcounts      r-   
<dictcomp>z)distributor_dashboard.<locals>.<dictcomp>|   s    EEENGU%EEEr.   c                     i | ]\  }}||	S rR   rR   rV   
manager_idrp   s      r-   rq   z)distributor_dashboard.<locals>.<dictcomp>   s    YYY0A
E*eYYYr.   c                     i | ]\  }}||	S rR   rR   rs   s      r-   rq   z)distributor_dashboard.<locals>.<dictcomp>   s    SSS/@z5USSSr.   c                     i | ]\  }}||	S rR   rR   rV   	parent_idrp   s      r-   rq   z)distributor_dashboard.<locals>.<dictcomp>   s    ZZZ4DIuy%ZZZr.   c                     i | ]\  }}||	S rR   rR   rw   s      r-   rq   z)distributor_dashboard.<locals>.<dictcomp>   s    TTT3C9eiTTTr.   r   c                     g | ]	}|j         
S rR   rS   ri   s     r-   rX   z)distributor_dashboard.<locals>.<listcomp>   s    222qt222r.   c              3   (   K   | ]}|j         	d V  dS rG   N)pending_validationri   s     r-   	<genexpr>z(distributor_dashboard.<locals>.<genexpr>   s*      KKa6JK1KKKKKKr.   c              3   6   K   | ]}|j         	|j        d V  dS r|   )is_active_accountr}   ri   s     r-   r~   z(distributor_dashboard.<locals>.<genexpr>   s3      ffQ5HfQRQef!ffffffr.   c              3   0   K   | ]}|j         d k    dV  dS )r]   rG   Nrc   ri   s     r-   r~   z(distributor_dashboard.<locals>.<genexpr>   s.      HHqAFi4G4G4G4G4G4GHHr.   c              3   0   K   | ]}|j         d k    dV  dS )r+   rG   Nr   ri   s     r-   r~   z(distributor_dashboard.<locals>.<genexpr>   s.      BBA61A1Aa1A1A1A1ABBr.   c                 2    g | ]}|j         d k    |j        S rl   rm   ri   s     r-   rX   z)distributor_dashboard.<locals>.<listcomp>   s&    QQQQVy=P=Pqt=P=P=Pr.   c                     g | ]	}|j         
S rR   rS   rU   s     r-   rX   z)distributor_dashboard.<locals>.<listcomp>       jjj1!$jjjr.   c                     g | ]	}|j         
S rR   rS   rU   s     r-   rX   z)distributor_dashboard.<locals>.<listcomp>       nnnqtnnnr.      daysc                     g | ]	}|j         
S rR   rS   rU   s     r-   rX   z)distributor_dashboard.<locals>.<listcomp>   r   r.   c                     g | ]	}|j         
S rR   rS   rU   s     r-   rX   z)distributor_dashboard.<locals>.<listcomp>   r   r.   	DnsReportc                     g | ]	}|j         
S rR   rS   rU   s     r-   rX   z)distributor_dashboard.<locals>.<listcomp>
  r   r.   )totalr[   rZ   managersuserstotal_diags	total_dnsdiags_trendzdistributor_dashboard.html)accountsstats
paginationcurrent_sortcurrent_searchcurrent_filternow)5r   argsgetintstripr   owner_idr   queryrN   rT   rx   rO   distributor_idin_r   r}   rc   r$   r;   iliker<   order_byascdescengagement_end_dateis_
created_atpaginateitemsr   sessionr   ro   r   rp   group_byrt   joinclients_countteam_members_countr   appendlensumscalarr   r   r   date_creationmodelsr   r   ).rF   sort_byrL   filter_typerf   r   team_idsr   search_escapedr   account_idsmanager_idsreport_countscountsclients_countsclients_diagsteam_members_countsteam_members_diagsclient_counts_queryclient_reportsteam_counts_queryteam_reportsr   accountall_accountsall_account_idstotal_accountspending_accountsactive_accountsmanagers_countusers_countr   diags_last_30_daysdirect_diagsmanager_account_idsclients_diags_totalteam_diags_total
client_idsteam_member_idsthirty_days_agodiags_30d_directdiags_30d_clientsdiags_30d_teamr   r   r   s.                                                 r-   distributor_dashboardr   2   s@    <FAC00Dlvv..G\h++1133F,""8U33KH $H dj//	H	8!;< 	cee  H
 Jd155h??@@E hT3t;T=TX]=]^^			!	!T4<==	
	"	"T3u<d>UY^>^__			!	!TY)344			TY&011  
,V44$$%:%:%:%:4$HHZ3.333DAAC
 
 &t0446677	F		ty~~//1B1F1F1H1HII	L	 	 $((..$((**
 

 t335566 THNNJ 32!1222KII!1IIIK M F!!OJwz""
 
 &$$[11
2
2
(7?
#
#
#%% 	 FEfEEE NM %U j..OJtw
 
 &$$[11
2
2
(4?
#
#
#%% 	 ZYEXYYY ))OJwz""
 
 $w472
3
3
&$$[11
2
2
(4?
#
#
#%% 	 TSNSSS J,,NJtw
 
 &##K00
1
1
(4>
"
"
#%% 	 [ZHYZZZ z''NJwz""
 
 $w472
3
3
&##K00
1
1
(4>
"
"
#%% 	 UT|TTT H# ! !<9$$$2$6$6wz1$E$EG!)<)@)@Q)O)OG&!!'*a00!!'*a001"&&wz1556  #0"3"3GJ"B"BG$%G!)*G&     :$$T%8%<%<X%F%FGGKKMML22\222O&&NKKlKKKKKff\fffffOHHLHHHHHNBBBBBBBK K 6Sz''
7:(>(>??VGO''8899VXX 	
 RQ\QQQ 	#jj
(9(9$/:M:MNa:b:b(c(c(g(g(i(ijjjJ #&(j&6&6tz'*7M7M&N&NVGO//
;;<<VXX'#!" $
 onTZ->->t~?Q?QRe?f?f-g-g-k-k-m-mnnnO ##%:#3#3DJwz4J4J#K#KVGO//@@AAVXX$#!" ! #%88;KK #,..9"+=+=+==:++DJwz,B,BCCV##O44%8  fhh	 	 	  	$jj
(9(9$/:M:MNa:b:b(c(c(g(g(i(ijjjJ $$&J$4$4TZ
5K5K$L$LV++J77-@  fhh	%$ #$	 " onTZ->->t~?Q?QRe?f?f-g-g-k-k-m-mnnnO $!#!1!1$*WZ2H2H!I!IV++O<<-@  fhh	"$ #$	  .0AANR !     I 
#J$$TZ	%=%=>>VI%))/::;;VXX 	  	#jj
(9(9$/:M:MNa:b:b(c(c(g(g(i(ijjjJ #RZ--dj.F.FGGVI-11*==>>VXX#!"#	
  #!"")	 	E 7#+ %%/'.)/)4&lnn. . . .r.   z/new_accountGETPOST)methodsz50 per hourc                     t           j        dk    r#t           j                            dd                                                                          } t           j                            dd                                          }t           j                            dd                                          }t           j                            dd                                          }| r|r|st          dd	           t          d
          S t          |           st          dd	           t          d
          S t          j
                            |                                           r#t          d|  dd           t          d
          S |dvrt          dd	           t          d
          S |dvrd}t          |          dk    rt          dd	           t          d
          S t          d          }t          j        |                              d          }t          | ||||t$          j        ddd	  	        }t           j                            dd                                          }|r,	 t)          j        |d          |_        n# t.          $ r Y nw xY w	 t0          j                            |           t0          j                                         t8          j                            dt$          j         d|  d| d| d t           j          
           tC          |t$          j"        pt$          j                   t          j
                            d!"                                          }|rtG          |j        |t$                     t          d#| d$d%           tI          tK          d&                    S # tL          $ r\}	t0          j        '                                 t8          j        (                    d'|	 d(           t          d)d	           Y d*}	~	nd*}	~	ww xY wt          d
          S )+u*   Créer un nouveau compte (Manager ou User)r   r<   rM   r;   rc   subscription_planstartu    ❌ Tous les champs sont requis.dangerzdistributor_new_account.htmlu   ❌ Format d'email invalide.r<   u   ❌ L'email u    est déjà utilisé.warning)r]   r+   u6   ❌ Rôle invalide. Choisissez Manager ou Utilisateur.)r   premiumbusiness   u5   ❌ Nom d'entreprise trop long (150 caractères max).    utf-8FT)	r<   passwordrc   r;   r   r   r   r}   	can_auditengagement_date%Y-%m-%du   ➕ Distributeur u    crée compte z (role: z, plan: z) - EN ATTENTE | IP: rD   r   u   ✅ Compte créé pour z0. En attente de validation par l'administrateur.success!distributor.distributor_dashboardu*   Erreur création compte par distributeur: r6   u*   ❌ Erreur technique lors de la création.N))r   methodformr   r   lowerr   r   r#   r   r   	filter_byfirstr   r%   r   generate_password_hashdecoder   r   r   strptimer   
ValueErrorr   r   addcommitr	   r?   infor<   remote_addrr   r;   r   r   r   r>   rollbackr@   )
r<   r;   rc   r   temp_passwordhashed_passwordnew_userr   rD   rC   s
             r-   new_accountr  (  sh    ~  "--3355;;==|'';;AACC|++1133#L,,-@'JJPPRR  	CL 	C 	C4h???"#ABBB$U++ 	C0(;;;"#ABBB:e,,2244 	C====yIII"#ABBB***JHUUU"#ABBB$DDD '|s""I8TTT"#ABBB 144 7FFMMgVV$%/'0##

 

 

 ",**+<bAAGGII 	/7/@R\/]/],,   	JJNN8$$$J##fL$6 f fe f ff f(9f fPWPcf f   'x1J1`lN`aaa J((g(66<<>>E `:5;R^___jLjjjluvvvG$GHHIII 	J 	J 	JJ!!!$$%URS%U%U`d$eee>IIIIIIII	J
 9:::s,   <J 
J$#J$(D#O 
P2AP--P2z/teamc                     t           j        r,t          dd           t          t	          d                    S t
          j                            t           j        d          	                                } t          d|           S )u)   Affiche la liste des membres de l'équipeu@   ❌ Seul le titulaire principal du compte peut gérer l'équipe.r   r   r&   )rx   rc   zdistributor_team.htmlmembers)r   rx   r   r   r   r   r   r   rT   rO   r   r  s    r-   manage_teamr    sw      FPR[\\\ CDDEEE j""\_="QQUUWWG2GDDDDr.   z	/team/addz20 per hourc            	         t           j        r,t          dd           t          t	          d                    S t
          j                            dd                                          	                                } t
          j                            dd                                          }| s,t          dd           t          t	          d                    S t          |           s,t          d	d           t          t	          d                    S t          j                            | 
                                          r,t          dd           t          t	          d                    S t          d          }t!          j        |                              d          }t          | |dt           j        |p|                     d          d         dd          }	 t*          j                            |           t*          j                                         t3          |          rt          d|  dd           nt          dd           t4          j                            dt           j         d|             ni# t<          $ r\}t*          j                                         t4          j                             d| d           t          dd           Y d}~nd}~ww xY wt          t	          d                    S )z%Ajouter un collaborateur distributeur   Action non autorisée.r   r   r<   rM   rb   zL'email est requis.distributor.manage_teamzFormat d'email invalide.r   u   Cet email est déjà utilisé.   r   r&   @r   TrG   )r<   r   rc   rx   r;   r   max_concurrent_sessionsu   ✅ Invitation envoyée à .r   u6   ⚠️ Utilisateur créé mais erreur d'envoi d'email.r      👥 Distributeur z ajoute membre z'Erreur ajout team member distributeur: r6   z!Erreur technique lors de l'ajout.N)!r   rx   r   r   r   r   r   r   r   r   r#   r   r   r   r   r%   r   r   r   rT   splitr   r   r   r   r   r	   r?   r   r<   r>   r   r@   )r<   nomr   	hashed_pw
new_memberrC   s         r-   add_team_memberr    s     F&111 CDDEEELWb))//117799E
,

62
&
&
,
,
.
.C <#X... 9::;;; '' <((333 9::;;;z%((..00 <.999 9::;;; -R00M-m<<CCGLLI //EKK,,Q/ !  J=

z"""

 &j11 	X8888)DDDDKYWWW _\5G _ _X] _ _```` = = =

  !N1!N!NY] ^^^18<<<<<<<<=
 G566777s   (B J	 	
K/AK**K/z/team/delete/<string:member_id>c                    t           j        rt          d           t          j                            |           }|j        t           j        k    r,t          dd           t          t          d                    S 	 |j
        }t          j                            |           t          j                                         t          d| dd           t          j                            dt           j
         d	|            ng# t$          $ rZ}t          j                                         t          j                            d
|            t          dd           Y d}~nd}~ww xY wt          t          d                    S )zSupprimer un collaborateuri  r	  r   r
  u   ✅ Membre u    supprimé.r   r  z supprime membre z Erreur suppression team member: zErreur lors de la suppression.N)r   rx   r
   r   r   
get_or_404rT   r   r   r   r<   r   r   deleter   r	   r?   r   r>   r   r@   )	member_idmemberr<   rC   s       r-   delete_team_memberr    sv     c


Z""9--F <?**&111 9::;;;	:

&!!!

.E...	::: a\5G a aZ_ a abbbb : : :

  !GA!G!GHHH.99999999:
 G566777s   =BD 
E)AE$$E)z/logsc                  `   t           j        } d t          j                            t          j        | k    t          j        | k    z                                            D             }d t          j                            t          j        	                    |                                                    D             }||z   }t          j                            ddt                    }t          j                            dd          }t          j                            dd	          }t          j                            d
d                                          }t          j                            t          j        	                    |          t          j        	                    ddg                    }|d	k    rtt          |                    d                    }	t'          j        t*          j                  t/          |	          z
  }
|                    t          j        |
k              }|d	k    r5|                    t          j        |                                k              }|r_t7          |          }|                    t                                        t          j                            d| dd                    }|                    t          j                                                   !                    |dd          }tE          d|j#        ||||          S )u>   Affiche les logs d'activité de l'organisation du distributeurc                     g | ]	}|j         
S rR   rS   rU   s     r-   rX   z!activity_logs.<locals>.<listcomp>  rY   r.   c                     g | ]	}|j         
S rR   rS   rU   s     r-   rX   z!activity_logs.<locals>.<listcomp>  s    dddA14dddr.   rF   rG   rH   period7dcategoryrO   r+   rM   INFOWARNINGdr   r^   r_   r`      Fre   zdistributor_logs.html)logsr   r  r   user_search)$r   r   r   r   rN   rT   rx   rO   r   r   r   r   r   r   r   r   ro   levelrstripr   r   r   utcr   	timestampr   upperr$   r   r<   r   r   r   r   r   r   )r   r   created_account_idsallowed_user_idsrF   r  r   r&  r   r   cutoffuser_search_escapedr   s                r-   activity_logsr0    s    $H
 dj//	H	8!;< 	cee  H
 ed):):4;N;R;RS[;\;\)])])a)a)c)cddd  "55 <FAC00D\h--F|
E22H,""62..4466K N!!-..FI.// E 6==%%&&hl++iT.B.B.BBX/69::5X.(..2B2BBCC c1+>>

4  ''
(8(89S=P9S9S9S\`(8(a(abb  2 7 7 9 9::xTB%xHH     r.   z/account/<string:account_id>c                    t           j                            |           }t          j        dk    rt          j        }d t           j                            t           j        |k    t           j        |k    z            	                                D             }|j
        |vr,t          dd           t          t          d                    S t          j                            |j                                                  }g }d}d}g }|j        dk    rdd	lm}	 t           j                            |j        
          	                                }
t'          |
          }|
D ] }t          j                            |j                                      t          j                                                  	                                |_        t'          |j                  |_        |	j                            |j                                      |	j                                                  	                                |_        t'          |j                  |_        |                    |           ||j        z  }"t           j                            |j                  	                                }|D ] }t          j                            |j                                      t          j                                                  	                                |_        t'          |j                  |_        |	j                            |j                                      |	j                                                  	                                |_        t'          |j                  |_        |                    |           ||j        z  }"t:          j                            ddt@                    }t:          j                            dd          !                                }t          j                            |j                  }|rGtE          |          }|                    t          j#        $                    d| dd                    }|                    t          j                                                  %                    |dd          }dd	lm} t:          j                            ddt@                    }t:          j                            dd          !                                }d}|j                            |j                  }|rstE          |          }|                    tM          j'        |j(        $                    d| dd          |j)        $                    d| dd                              }|                    |j                                                  %                    ||d          }tU          d||j+        ||||||||j+        ||tY          j-                              S )u8   Voir les détails d'un compte créé par le distributeurr&   c                     g | ]	}|j         
S rR   rS   rU   s     r-   rX   z"account_detail.<locals>.<listcomp>?  &       QAD   r.   u   ❌ Accès non autorisé.r   r   ro   r   r]   r   rt   )rx   rF   rG   rH   rL   rM   r^   r_   r`   rP   Fre   dns_page
dns_searchzdistributor_account_detail.html)r   rapportsr   rapports_countclientsr   team_memberstotal_auditsr   dns_reportsdns_paginationr7  r   ).r   r   r  r   rc   r   rN   rT   rx   rO   r   r   r   r   r   r   rp   r   r   r   r   r   r   r8  rapport_countr   r=  	dns_countr   r   r   r   r   r   r$   
nom_clientr   r   r   or_client_namedomainr   r   r   r   )
account_idr   r   r   r9  r:  r   r<  r;  DnsReportModelclients_rawclientteam_members_rawr  rF   rL   r   r   r   r   r6  r7  dns_per_page	dns_querydns_search_escapedr>  s                             r-   account_detailrM  4  s    j##J//G M))( $*"3"3W T^x%?@#
 #

#%%   !11-x888G$GHHIII ],,WZ,@@FFHHN GMLL|y  666666j**gj*AAEEGGK(( " 	1 	1F%m55fi5HHQQRYRgRlRlRnRnoossuuFO#&v#7#7F !/!5!?!?	!?!R!R![![\j\u\z\z\|\|!}!}  "B  "B  "D  "DF"6#566FNN6"""F00LL  ://'*/EEIIKK& 	1 	1F%m55fi5HHQQRYRgRlRlRnRnoossuuFO#&v#7#7F !/!5!?!?	!?!R!R![![\j\u\z\z\|\|!}!}  "B  "B  "D  "DF"6#566F'''F00LL <FAC00D\h++1133FM##GJ#77E [,V44W/556K.6K6K6KTX5YYZZ 5 : : < <==FFD[]inFooJ
 !     |
AC88H!!,3399;;JL))'*)==I 
0<<$$F%++,E0B,E,E,Ed+SS &&'@+='@'@'@&NN 
 
	 ''	(<(A(A(C(CDD'xXX]x^^  <")#-#3%/)7")(5'3'3)/&4&:)7%/&lnn. . . .r.   z*/account/<string:account_id>/toggle_accessc                 l   t           j                            |           }t          j        dk    rt          j        }d t           j                            t           j        |k    t           j        |k    z            	                                D             }|j
        |vr,t          dd           t          t          d                    S |j         |_        |j        rdnd}|j        rdnd	}t          j                                         t$          j                            d
t          j         d| d|j                    t          j        pt          j        }|j        rt/          ||d           nt1          ||d           t3          t          j        ||           t           j                            d                                          }|rt9          |j        t          ||           t          d|j        p|j         d| dd           t          t          d|j                            S )zActiver/Suspendre un compter&   c                     g | ]	}|j         
S rR   rS   rU   s     r-   rX   z)toggle_account_access.<locals>.<listcomp>  r3  r.      ❌ Action non autorisée.r   r   u
   réactivésuspendureactivated	suspendedu   🔒 Distributeur  a z le compte DistributeurrD   r   u   ✅ Le compte de u	    a été r  r   distributor.account_detailrE  )r   r   r  r   rc   r   rN   rT   rx   rO   r   r   r   r   r   r   r   r   r	   r?   r   r<   r;   r   r   r   r   r   r   rE  r   r   r   actionaction_typer,   rD   s           r-   toggle_account_accessr[    s&    j##J//G M))( $*"3"3W T^x%?@#
 #

#%%   !11.999G$GHHIII$+$= =G$6F\\JF#*#<M--+KJmL4Fmm6mm^e^kmmnnn $0FL4F   P&w0@.QQQQ$W.>OOO ,L,>WUUU J  g ..4466E Z(lKQXYYY	
Wg2Cgm
W
Wf
W
W
WYbcccG8WZPPPQQQr.   z)/account/<string:account_id>/toggle_auditc                 N   t           j                            |           }t          j        dk    rt          j        }d t           j                            t           j        |k    t           j        |k    z            	                                D             }|j
        |vr,t          dd           t          t          d                    S |j         |_        |j        rdnd}|j        rdnd	}t          j                                         t$          j                            d
t          j         d| d|j                    t          j        pt          j        }|j        rt/          ||d           nt1          ||d           t3          t          j        ||           t           j                            d                                          }|rt9          |j        t          ||           t          d| dd           t          t          d|j                            S )u%   Activer/Bloquer la création d'auditsr&   c                     g | ]	}|j         
S rR   rS   rU   s     r-   rX   z(toggle_account_audit.<locals>.<listcomp>  r3  r.   rP  r   r   u
   autoriséeu   bloquéeaudit_unblockedaudit_blockedu   📝 Distributeur rT  u    la création d'audit pour rU  rD   r   u(   ✅ La création d'audit est maintenant r  r   rV  rW  )r   r   r  r   rc   r   rN   rT   rx   rO   r   r   r   r   r   r   r   r   r	   r?   r   r<   r;   r   r   r   r   r   r   rX  s           r-   toggle_account_auditr`    s    j##J//G M))( $*"3"3W T^x%?@#
 #

#%%   !11.999G$GHHIII#--G$.>\\JF'.'8M##oKJz1Czzzzkrkxzz{{{ $0FL4F  L"7,<nMMMM *:NKKK ,L,>WUUU J  g ..4466E Z(lKQXYYY	
>V
>
>
>	JJJG8WZPPPQQQr.   z./account/<string:account_id>/update_engagementc                    t           j                            |           }t          j        dk    rt          j        }d t           j                            t           j        |k    t           j        |k    z            	                                D             }|j
        |vr,t          dd           t          t          d                    S t          j                            dd                                          }|r	 t%          j        |d          |_        t*          j                                         t0          j                            d	t          j         d
|j         d|            t          dd           nU# t8          $ r t          dd           Y n9w xY wd|_        t*          j                                         t          dd           t          t          d|j                            S )z$Modifier la date de fin d'engagementr&   c                     g | ]	}|j         
S rR   rS   rU   s     r-   rX   z-update_account_engagement.<locals>.<listcomp>  r3  r.   rP  r   r   r   rM   r   u   📅 Distributeur z modifie engagement pour r5   u#   ✅ Date d'engagement mise à jour.r   u   ❌ Format de date invalide.r   Nu!   ✅ Date d'engagement supprimée.r   rV  rW  )r   r   r  r   rc   r   rN   rT   rx   rO   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r	   r?   r   r<   r   )rE  r   r   r   date_strs        r-   update_account_engagementrd    s    j##J//G M))( $*"3"3W T^x%?@#
 #

#%%   !11.999G$GHHIII| 1266<<>>H ;	=*2*;Hj*Q*QG'J##  %B9K  %B  %Bfmfs  %B  %Bw  %B  %B  C  C  C7CCCC 	= 	= 	=0)<<<<<	= '+#

16:::G8WZPPPQQQs    A?F   FFz#/account/<string:account_id>/deletec                    t           j                            |           }t          j        dk    rt          j        }d t           j                            t           j        |k    t           j        |k    z            	                                D             }|j
        |vr,t          dd           t          t          d                    S |j        r3t          dd           t          t          d|j        	                    S |j        d
k    rtt           j                            |j                                                  }|dk    r7t          d| dd           t          t          d|j        	                    S |j        }|j        }t&          j                            dt          j         d|            t           j                            d                                          }|rt/          |j        t          d|           	 ddlm}m}	 |j                            |j                                                   t8          j                            |j                                                   |	j                            |j                                                   t:          j                            |j                                                   t<          j                            |           t<          j                                          t          d| dd           t          t          d                    S # tB          $ r}
t<          j        "                                 t&          j        #                    d|  d|
 d           t          dd           t          t          d|j        	                    cY d}
~
S d}
~
ww xY w)u   Supprimer un compte créér&   c                     g | ]	}|j         
S rR   rS   rU   s     r-   rX   z"delete_account.<locals>.<listcomp>&  r3  r.   rP  r   r   uG   ❌ Ce compte est en attente de validation. Contactez l'administrateur.r   rV  rW  r]   r5  r   u)   ❌ Impossible : ce manager gère encore z client(s).u   🗑️ Distributeur z supprime le compte rD   r   deleted)r   UserSessionr4  u   ✅ Compte u    supprimé définitivement.r   zErreur suppression compte r5   Tr6   u,   ❌ Erreur technique lors de la suppression.N)$r   r   r  r   rc   r   rN   rT   rx   rO   r   r   r   r   r}   r   rp   r<   r;   r	   r?   r   r   r   r   r   rh  r  r   r   r   r   r   r>   r   r@   )rE  r   r   r   r   account_emailaccount_companyrD   r   rh  rC   s              r-   delete_accountrk    s    j##J//G M))( $*"3"3W T^x%?@#
 #

#%%   !11.999G$GHHIII ! VWYbccc <TTTUUU |y  
,,
,CCIIKK1XmXXXZbcccG$@WZXXXYYYMM*On|7Inn_lnnooo J  g ..4466E X(lIwWWWV11111111!!'*!55<<>>>
33::<<<##GJ#77>>@@@   44;;===

'"""

FMFFF	RRR CDDEEE V V V

  !Oj!O!OA!O!OZ^ ___<hGGG <TTTUUUUUUUU	Vs    EM 
O%#A7O O% O%N)=flaskr   r   r   r   r   r   r	   r
   flask_loginr   r   
flask_mailr   services.email_servicer   r*   r   r=   r   r   r   r   r   r   r   r   r   r   
sqlalchemyr   r   r   r   r   
extensionsr   r   r    r!   
decoratorsr"   utilsr#   r$   r%   __name__r&   router   limitr  r  r  r  r0  rM  r[  r`  rd  rk  rR   r.   r-   <module>rw     s   c c c c c c c c c c c c c c c c c c c c 4 4 4 4 4 4 4 4      
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 3 2 2 2 2 2 2 2 2 2       * * * * * * * * * * 0 0 0 0 0 0 0 0 0 0 0 0 $ $ $ $ $ $          ixN\jkkk6 6 6	 	 	 <  w'((m. m. )(  ! m.f >E6?;;w'((}R; R;  )(  <;R;p 7w'((E E )(  E ;11w'((}78 78  )(  2178r 4vhGGw'((8 8 )(  HG8> 7w'((8 8 )(  8| 122w'((`. `. )(  32`.D ?&RRw'((*R *R )(  SR*RX >QQw'((*R *R )(  RQ*RX CfXVVw'((R R )(  WVRB 86(KKw'((6V 6V )(  LK6V 6V 6Vr.   