
    $1i6                        d Z ddlmZmZmZmZmZ ddlmZmZ ddl	Z	ddl
mZmZ ddl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 dd
lmZmZmZ ddlm Z  ddl!m"Z" ddl#m$Z$  e	jJ                  e&      Z'dede(dedefdZ)	 	 	 	 	 	 ddede(de*de*dee+   dee(   dee(   dee(   defdZ,dede(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+fdZ/y)z3
Contact Services for customer contact management.
    )DictListOptionalTupleUnion)datetimetimezoneN)HTTPExceptionstatus)selectand_or_funcdescasc)Sessionselectinload)CustomerContact)Customer)CustomerContactSchema"CustomerContactCreateRequestSchema"CustomerContactUpdateRequestSchema)QueryPaginator)APIException)generate_iddbcustomer_idcontact_datareturnc                   K   	 t        t              j                  t        j                  |k(        }t	        t        d      r.|j                  t        j
                  j                  d            }| j                  |      j                         }|st        ddd      d}|j                  r(|j                  r|j                   d|j                   }n|j                  r|j                  }t        d|      }d	}d
}||k  rt        t              j                  t        j                  |k(        }	| j                  |	      j                         }
|
sn5t        j!                  d| d|dz           t        d|      }|dz  }||k  r||k\  r't        j#                  d| d       t        ddd      |j%                  ddh      }||d<   |j&                  |d<   d|d<   d|vs|d   d|d<   t        di |}| j)                  |       | j+                          | j-                  |       t        j/                  d| d|j                          t1        j2                  |      S # t        $ r  t4        $ rJ}t        j#                  d| d|        | j7                          t        dt9        |       dd      d}~ww xY ww) z$Create a new contact for a customer.
deleted_atNCustomer not found  customers.contact_servicesmessagestatus_codemodule contact   r   zContact ID z. already exists, generating new one. Attempt:    z+Failed to generate unique contact ID after z	 attemptsz$Failed to generate unique contact ID  addresswebsite)exclude
contact_idr   user_account_id	is_activeTzContact created for customer z
 with ID: z$Error creating contact for customer : zFailed to create contact:  )r   r   wherer   hasattrr!   is_executescalar_one_or_noner   
first_name	last_namer   r   r1   loggerwarningerror
model_dumpidaddcommitrefreshinfor   model_validate	Exceptionrollbackstr)r   r   r   customer_stmtcustomercontact_namer1   max_attemptsattemptcontact_check_stmtexisting_contactcontact_dictcontact_objes                 a/var/www/html/hwPaymentPortal-be-dev/hw-payment-portal-api/src/apps/customers/contact_services.pycreate_customer_contactrU      s    L
x(..x/C/C{/RS8\*)//0C0C0G0G0MNM::m,??A,3  ""|'='=*556a8N8N7OPL$$'22L L9
 $!'!8!>!>?Y?Y]g?g!h!zz*<=PPR#NN[4bcjmncnbopq$Y=JqLG $ l"LLF|nT]^_>3  $..	97M.N &0\"&.kk]# +/&' l*l;.G.O(,L% &55
{
		


;3K=
;KaKaJbcd$33K@@  
;K=1#NO
0Q9/
 	

s1   KFI' 	CI' &K'K9AJ>>KKlimitoffsetr3   searchtitlerelationc                   K   	 t        t              j                  t        j                  |k(        }t	        t        d      r.|j                  t        j
                  j                  d            }| j                  |      j                         }	|	st        ddd      t        t              j                  t        j                  |	j                  k(        }
t	        t        d      r.|
j                  t        j
                  j                  d            }
|"|
j                  t        j                  |k(        }
|r2|
j                  t        j                  j                  d| d            }
|r2|
j                  t        j                  j                  d| d            }
|rd| d}|
j                  t!        t        j"                  j                  |      t        j$                  j                  |      t        j&                  j                  |      t        j                  j                  |      t        j(                  j                  |      t        j*                  j                  |                  }
|
j-                  t/        t        j0                              }
t3        |
t4        | t        d| d	||d
      }|j7                         }|j8                  |j:                  |j<                  |j>                  |j@                  |jB                  |jD                  |jF                  dS # t        $ r  tH        $ r:}tJ        jM                  d| d|        t        dtO        |       dd      d}~ww xY ww)z(Get paginated list of customer contacts.r!   Nr"   r#   r$   r%   %z/api/v1/customers/z	/contactsT)queryschemar   modelurlrW   rV   use_orm)datatotalpageper_pagenextpreviousfirstlastz$Error getting contacts for customer r4   z!Failed to get customer contacts: r-   )(r   r   r6   r   r7   r!   r8   r9   r:   r   r   rA   r3   rY   ilikerZ   r   r;   r<   emailphoneaccount_phoneorder_byr   
created_atr   r   paginateresultrc   rd   re   rf   rg   rh   ri   rG   r=   r?   rI   )r   r   rV   rW   r3   rX   rY   rZ   rJ   rK   stmtsearch_term	paginatorpagination_resultrS   s                  rT   get_customer_contactsrv   o   s    O
x(..x/C/C{/RS8\*)//0C0C0G0G0MNM::m,??A,3  o&,,_-H-HHKK-WX ?L1::o88<<TBCD  ::o779DED::o3399AeWA,GHD::o66<<q
!_MND fXQ-K::#..44[A#--33K@#))//<#))//<#))//<#1177D	D }}T/"<"<=> #(!$[M;	
	 &..0 &,,&,,%**)22%**)22&,,%**	
 		
   
;K=1#NO7Ax@/
 	

s)   M9L%L* )M9*M6<5M11M66M9r1   c           	        K   	 t        t              j                  t        j                  |k(        }t	        t        d      r.|j                  t        j
                  j                  d            }| j                  |      j                         }|st        ddd      t        t              j                  t        t        j                  |k(  t        j                  |j                  k(              }t	        t        d      r.|j                  t        j
                  j                  d            }| j                  |      j                         }|st        ddd      t        j                  |      S # t        $ r  t         $ r=}t"        j%                  d| d	| d
|        t        dt'        |       dd      d}~ww xY ww)z4Get a specific contact by contact_id for a customer.r!   Nr"   r#   r$   r%   Contact not foundzError getting contact  for customer r4   zFailed to get contact: r-   )r   r   r6   r   r7   r!   r8   r9   r:   r   r   r   r1   rA   r   rF   rG   r=   r?   rI   r   r   r1   rJ   rK   rr   r*   rS   s           rT   get_customer_contactr{      s    *
x(..x/C/C{/RS8\*)//0C0C0G0G0MNM::m,??A,3  o&,,**j8++x{{:
 ?L1::o88<<TBCD**T"557+3  %33G<<  
-j\}TVWXVYZ[-c!fX6/
 	

s)   GE1E6 5G6G8G  GGc           	      
  K   	 t        t              j                  t        j                  |k(        }t	        t        d      r.|j                  t        j
                  j                  d            }| j                  |      j                         }|st        ddd      t        t              j                  t        t        j                  |k(  t        j                  |j                  k(              }t	        t        d      r.|j                  t        j
                  j                  d            }| j                  |      j                         }|st        ddd      |j                  dd	d
h      }|j                         D ]  \  }	}
t	        ||	      st!        ||	|
       ! t#        j$                  t&        j(                        |_        | j-                          | j/                  |       t0        j3                  d| d|        t5        j6                  |      S # t        $ r  t8        $ rM}t0        j;                  d| d| d|        | j=                          t        dt?        |       dd      d}~ww xY ww)zUpdate a customer contact.r!   Nr"   r#   r$   r%   rx   Tr.   r/   )exclude_unsetr0   Contact z updated for customer zError updating contact ry   r4   zFailed to update contact: r-   ) r   r   r6   r   r7   r!   r8   r9   r:   r   r   r   r1   rA   r@   itemssetattrr   nowr	   utc
updated_atrC   rD   r=   rE   r   rF   rG   r?   rH   rI   )r   r   r1   r   rJ   rK   rr   r*   update_datafieldvaluerS   s               rT   update_customer_contactr      s-    8
x(..x/C/C{/RS8\*)//0C0C0G0G0MNM::m,??A,3  o&,,**j8++x{{:
 ?L1::o88<<TBCD**T"557+3  #--D9V_J`-a'--/ 	/LE5w&.	/ &\\(,,7
		


7hzl*@NO$33G<<  
.zl.UWXYWZ[\
0Q9/
 	

s1   JFH! BH!  J!J 3AI;;J  Jc           	        K   	 t        t              j                  t        j                  |k(        }t	        t        d      r.|j                  t        j
                  j                  d            }| j                  |      j                         }|st        ddd      t        t              j                  t        t        j                  |k(  t        j                  |j                  k(              }t	        t        d      r.|j                  t        j
                  j                  d            }| j                  |      j                         }|st        ddd      t	        |d      r)t        j                  t         j"                        |_        nd|_        t        j                  t         j"                        |_        | j)                          t*        j-                  d	| d
|        y# t        $ r  t.        $ rM}t*        j1                  d| d| d|        | j3                          t        dt5        |       dd      d}~ww xY ww)zSoft delete a customer contact.r!   Nr"   r#   r$   r%   rx   Fr~   z deleted for customer TzError deleting contact ry   r4   zFailed to delete contact: r-   )r   r   r6   r   r7   r!   r8   r9   r:   r   r   r   r1   rA   r   r   r	   r   r3   r   rC   r=   rE   rG   r?   rH   rI   rz   s           rT   delete_customer_contactr   A  s    7
x(..x/C/C{/RS8\*)//0C0C0G0G0MNM::m,??A,3  o&,,**j8++x{{:
 ?L1::o88<<TBCD**T"557+3  7L)!)hll!;G !&G%\\(,,7
		hzl*@NO  
.zl.UWXYWZ[\
0Q9/
 	

s*   IG,G1 0I1IAIII)
   r   NNNN)0__doc__typingr   r   r   r   r   r   r	   loggingfastapir
   r   
sqlalchemyr   r   r   r   r   r   sqlalchemy.ormr   r   *src.apps.customers.models.customer_contactr   "src.apps.customers.models.customerr   +src.apps.customers.schemas.customer_contactr   r   r   src.helpers.paginationr   src.core.exceptionsr   src.core.functionsr   	getLogger__name__r=   rI   rU   intboolrv   r{   r   r   r5       rT   <module>r      s   6 5 '  ) 9 9 0 F 7 
 2 , *			8	$R
R
R
 5R
 	R
p  $ "Z
Z
Z
 Z
 	Z

 ~Z
 SMZ
 C=Z
 smZ
 
Z
z0
0
0
 0
 	0
f?
?
?
 ?
 5	?

 ?
D=
=
=
 =
 
	=
r   