
    XjV                        d dl Z d dlmZmZmZmZmZ d dlmZ d dl	m
Z
 d dl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 d dlmZ d dlmZmZmZ d dlmZ  ee          Z ee          Z edg          Z e !                    de"e                   d d ee           e e                      fde#de#de
defd            Z$e !                    de           ee           ee          fde#dede
defd            Z%e &                    deej'                   ee           e e                      fdedede
defd            Z(e )                    de           ee           e e                      fde#dedede
def
d            Z*e +                    d           ee           e e                      fde#dede
defd            Z,dS )     N)	APIRouterDependsHTTPExceptionRequeststatus)
get_logger)Session)get_current_user)require_platform_admin)get_translator)get_db_without_tenant)deprovision_tenant_schemaprovision_tenant_schema)Tenant)User)TenantCreateTenantResponseTenantUpdatetenants)tags )response_modeld   skiplimitdbcurrent_userc                     |                     t                                        |                               |                                          }|S )N)queryr   offsetr   all)r   r   r   r   r   s        C/lsinfo/ai/hellotax_ai/base_platform/app/api/v1/platform/tenants.pylist_tenantsr#      sB     hhv%%d++11%88<<>>GN    z/{tenant_id}	tenant_idrequestc                    t          |          }|j        dk    rn&|j        | k    rt          t          j        d          |                    t                                        t          j	        | k              
                                }|s.t          t          j        |                    d                    |S )Nplatform_adminzAccess deniedstatus_codedetailcompany.not_found)r   roler%   r   r   HTTP_403_FORBIDDENr   r   filteridfirstHTTP_404_NOT_FOUNDt)r%   r&   r   r   r3   tenants         r"   
get_tenantr5   "   s     	wA,,,		9	,	,(A/ZZZZXXf$$VY)%;<<BBDDF d(A!##NaJbJbccccMr$   )r   r*   r4   c                 F   t          |          }t                              | j        |j                                      d           |                    t                                        t          j        | j        k              	                                }|rat                              | j                  
                    d           t          t          j        |                    d                    |                                 }|                    d          swt#          t%          t'          j                    dz                      d	d          }| j        d d
                                                             dd          }| d| |d<   |d         r|                    t                                        t          j        |d         k              	                                }	|	rbt                              |d                   
                    d           t          t          j        |                    d                    |                    d          sd|d<   t          di |}
|                    |
           |                                 |                    |
           	 t5          ||
j                  }|swt                              |
j                                      d           |                    |
           |                                 t          t          j        d          t                              |
j                                      d           n# t<          $ r}t                              |
j                                      d|            |                    |
           |                                 t          t          j        dt#          |                     |d }~ww xY w|
S )N)tenant_nameuser_idzCreating tenant)r7   zTenant name already existscompany.name_existsr)   codei  i
    _)tenant_codezTenant code already existscompany.code_existsdescriptionr   r%   z!Failed to provision tenant schemazTenant created with schemaz"Error provisioning tenant schema: zFailed to provision tenant:  )r   loggerbindnamer0   infor   r   r/   r1   warningr   r   HTTP_400_BAD_REQUESTr3   
model_dumpgetstrinttimeupperreplacer:   addcommitrefreshr   errordeleteHTTP_500_INTERNAL_SERVER_ERROR	Exception)r4   r&   r   r   r3   existingtenant_data	timestamp	base_codeexisting_code	db_tenantsuccesses                r"   create_tenantr_   4   s    	wA
KKFKKAAFFGXYYYxx&&v{fk'ABBHHJJH 
,,445QRRR3ACC@U<V<V
 
 
 	
 ##%%K??6"" 9DIKK$.//005	K$**,,44S#>>	!*88Y88F6 ((//{6?R0RSSYY[[ 	KKK$7K88@@A]^^^"7DY@Z@Z    ??=)) (%'M"%%%%IFF9IIKKKJJy)"il;; 	KK),K//556YZZZIIi   IIKKK"A:    	il++001MNNNN   il++112ZWX2Z2Z[[[
		)
		=:#a&&::
 
 
 		 s   CN 
PBPPc                 v   t          |          }t                              | |j                                      d           |                    t                                        t          j        | k                                              }|s\t                              |           	                    d           t          t          j        |                    d                    |j        r|j        |j        k    r|                    t                                        t          j        |j        k                                              }|r.t          t          j        |                    d                    |j        r|j        |j        k    r|                    t                                        t          j        |j        k                                              }|r.t          t          j        |                    d                    |                    d	
          }	|	                                D ]\  }
}t'          ||
|           |                                 |                    |           t                              |                               d           |S )Nr%   r8   zUpdating tenantrA   zTenant not found for updater,   r)   r9   r?   T)exclude_unsetzTenant updated)r   rC   rD   r0   rF   r   r   r/   r1   rG   r   r   r2   r3   rE   rH   r:   rI   itemssetattrrQ   rR   )r%   r4   r&   r   r   r3   r\   rW   r[   update_datafieldvalues               r"   update_tenantrh   k   sO    	wA
KK)\_K==BBCTUUU  ''	Y(>??EEGGI di((001NOOO(A!##NaJbJbcccc{ v{in4488F##**6;&++EFFLLNN 	"7DY@Z@Z    { v{in44((//v{0JKKQQSS 	"7DY@Z@Z    ##$#77K#))++ ) )u	5%((((IIKKKJJy
KK)K$$))*:;;;r$   c                 4   t          |          }t                              | |j                                      d           |                    t                                        t          j        | k                                              }|s\t                              |           	                    d           t          t          j        |                    d                    |                    t                                        t          j        | k                                              }|dk    r_t                              | |          	                    d	           t          t          j        |                    d
|                    	 t%          ||           }|s.t                              |           	                    d           nH# t&          $ r;}t                              |                               d|            Y d }~nd }~ww xY w|                    |           |                                 t                              |                               d           d|                    d          dS )Nra   zDeleting tenantrA   zTenant not found for deletionr,   r)   r   )r%   
user_countz&Cannot delete tenant with active userszcompany.has_users)countz6Failed to deprovision schema, continuing with deletionz$Error deprovisioning tenant schema: zTenant deletedTzcompany.deleted)r]   message)r   rC   rD   r0   rF   r   r   r/   r1   rG   r   r   r2   r3   r   r%   rk   rH   r   rV   rS   rT   rQ   )	r%   r&   r   r   r3   r\   rj   r]   r^   s	            r"   delete_tenantrm      sE    	wA
KK)\_K==BBCTUUU  ''	Y(>??EEGGI di((001PQQQ(A!##NaJbJbcccc$&&t~'BCCIIKKJA~~iJ??GGHpqqq333**3==
 
 
 	
[+B	:: 	oKK)K,,445mnnn [ [ [i((../YVW/Y/YZZZZZZZZ[IIiIIKKK
KK)K$$))*:;;;,=(>(>???s   "A G# #
H(-1H##H()-rM   fastapir   r   r   r   r   common_loggingr   sqlalchemy.ormr	   app.api.depsr
   app.api.permissionsr   app.core.i18nr   app.db.sessionr   app.db.tenant_schemar   r   app.models.tenantr   app.models.userr   app.schemas.tenantr   r   r   __name__rC   routerrJ   listrL   r#   r5   postHTTP_201_CREATEDr_   putrh   rT   rm   rB   r$   r"   <module>r      s    F F F F F F F F F F F F F F % % % % % % " " " " " " ) ) ) ) ) ) 6 6 6 6 6 6 ( ( ( ( ( ( 0 0 0 0 0 0 S S S S S S S S $ $ $ $ $ $             I I I I I I I I I I % % % % % %	H			H				$	$	$ BtN344'/00 !7!7!9!9::	 
 	 	   54 N>:: '/00 !122	  	 	   ;:" RF<STT '/00 !7!7!9!9::	3 333 	3 	3 3 3 UT3l N>::
 '/00 !7!7!9!9::   		
    ;:D ~ '/00 !7!7!9!9::	@ @@@ 	@ 	@ @ @ @ @ @r$   