
    fei                        d Z ddlmZmZmZmZmZ ddlmZm	Z	m
Z
mZmZmZmZmZmZmZ ddlmZ ddlZddlmZ ddlmZ ddlmZmZ dd	lmZmZm Z  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,m-Z-m.Z. ddl/m0Z0 ddl1m2Z3m4Z5m6Z7m8Z9m:Z;m<Z=m>Z?m@ZAmBZBmCZCmDZEmFZGmHZImJZJ ddlKmLZLmMZMmNZNmOZOmPZP ddlQmRZRmSZSmTZTmUZUmVZV ddlWmXZYmZZ[m\Z]m^Z_m`Za ddlbmcZcmdZdmeZe ddlfmgZgmhZh ddlimjZjmkZk ddllmmZm ddlnmoZo ddlpmqZq ddlrmsZs ddltmuZu  e       Zv ej                  ex      Zyevj                  de dg       edd      fd e{d!e fd"       Z|evj                  d#ee{ef   ej                  dg$       e	e      d%d&ed'e"d!efd(       Z4evj                  d)ee{ef   dg       e	e      d%d&ed*e%d!efd+       ZHevj                  d#ee{ef   dg       e	        e	        e	e      fd,e'd-e&d&ed!efd.       Z6evj                  d/ee{ef   dg       e	e      fd&ed!efd0       Zevj                  d1ee{ef   dg       e	e       ed2d3d24       edd5d64       edd7d84       ed9d:d;d<d9=      fd&ed>ed?ee{   d@ee{   dAed!efdB       Zevj                  dCee{ef   dg       e	e       eddDdE4      fdFe{d&edGee{   d!efdH       Z2evj                  dCee{ef   dg       e	e      fdFe{dIe#d&ed!efdJ       Z:evj	                  dCee{ef   dg       e	e      fdFe{d&ed!efdK       Z<evj                  dLee{ef   ej                  dMg$       e	e      fdFe{dNe*d&ed!ee{ef   fdO       Zevj                  dLee{ef   dMg       e	e       ed:d:dPd:Q       ed9d:dRdSd9=       eddTdUg dVW       eddXdY4       eddZdY4       edd[d\4      fdFe{d&ed]ed^ed_ee{   d`ee   daee   dbee{   d!ee{ef   fdc       Zevj                  ddee{ef   dMg       e	e      fdFe{deed&ed!ee{ef   fdf       Zevj                  ddee{ef   dMg       e	e      fdFe{deedNed&ed!ee{ef   f
dg       Zevj	                  ddee{ef   dMg       e	e      fdFe{deed&ed!ee{ef   fdh       Zevj                  diee{ef   ej                  djg$       e	e      fdFe{dke-d&ed!ee{ef   fdl       Zevj                  diee{ef   djg       e	e       ed:d:dPd:Q       ed9d:dRdSd9=       eddXdY4       eddmdn4       eddodp4       eddqdr4      fdFe{d&ed]ed^ed`ee   dbee{   dsee{   dtee{   d!ee{ef   fdu       Zevj                  dvee{ef   djg       e	e      fdFe{dwe{d&ed!ee{ef   fdx       Zevj                  dvee{ef   djg       e	e      fdFe{dwe{dke.d&ed!ee{ef   f
dy       Zevj	                  dvee{ef   djg       e	e      fdFe{dwe{d&ed!ee{ef   fdz       Zevj                  d{ee{ef   d|g       e	e      d%d&edFe{d!efd}       ZDevj                  d~ee{ef   dgddd       edd       edd       eeoj                   d       e	e      fdFe{dee   deod&ed!ee{ef   f
d       Zevj                  d~ee{ef   dgddd       edd       e	e      fdFe{d&ed!ee{ef   fd       Zevj	                  dee{ef   dgddd       edd       edd       e	e      fdFe{ded&ed!ee{ef   fd       Zevj                  dee{ef   dgdddddddYdd:ddddd:d:dddddgd:d:d9ddddiidddiddid       eddd4       ed9d:dRdSd9=       eddddQ       eddd4       e	e      fdFe{dAededbee{   d&ed!ee{ef   fd       ZXevj                  dee{ef   ej                  dgdddddddYdd:ddddd:d:ddddddiidddiddiddid       eddd4       edd       e	e      fdFe{dejd&ed!ee{ef   fd       ZZevj                  dee{ef   dgdddddddYdd:ddddd:d:ddddddiidddiddid       eddd4       eddd:4       e	e      fdFe{ded&ed!ee{ef   fdȄ       Z`evj                  dee{ef   dgdddddddYdd:ddddd:d:ddddddiidddiddiddidϜ       eddd4       eddd:4       eddѬ       e	e      fdFe{dedekd&ed!ee{ef   f
d҄       Z\evj	                  dee{ef   dgdddddddYdddiidddiddid       eddd4       eddd:4       e	e      fdFe{ded&ed!ee{ef   fdׄ       Z^y)z>
Customer router for handling customer-related API endpoints.
    )ListOptionalDictUnionAny)
	APIRouterDependsHTTPExceptionstatusQueryPathBody
UploadFileFormFile)SessionN)get_session)APIException)get_current_userget_current_merchant)CustomerSchemaCustomerListSchemaPhoneLookupResponseSchema)CustomerCreateRequestSchemaCustomerUpdateRequestSchemaCustomerActionRequestSchemaCustomerBulkActionRequestSchemaCustomerFilterSchemaCustomerPaginationSchema)AddressSchemaAddressCreateRequestSchema)CustomerContactSchema"CustomerContactCreateRequestSchema"CustomerContactUpdateRequestSchema)User)get_customercreate_customerget_customers_listget_customer_by_emailupdate_customerdelete_customeractivate_customerdeactivate_customercheck_customer_id_existscheck_account_literal_existsget_customer_activitiesget_customer_summarybulk_customer_actionslookup_phone_number)create_customer_addressget_customer_addressesget_customer_addressupdate_customer_addressdelete_customer_address)create_customer_contactget_customer_contactsget_customer_contactupdate_customer_contactdelete_customer_contact)get_customer_notescreate_customer_noteupdate_customer_notedelete_customer_noteget_customer_note)upload_customer_attachmentsdelete_customer_attachmentget_customer_attachments)NoteResponseSchemaNoteListResponseSchema)NoteCreateRequestSchemaNoteUpdateRequestSchema)FileResponseSchema)	FileTypes)generate_id)MerchantSchema)
UserSchemaz/number-lookup	CUSTOMERS)response_modeltags.zPhone number to lookup)descriptionphonereturnc                 >   K   t        |       }t        |ddd      S w)a4  
    Lookup phone number information including validation, formatting, and carrier details.
    
    Args:
        phone: Phone number to lookup (can be in various formats)
        
    Returns:
        Phone lookup data including country code, formatted number, location, carrier, and validation status
       Tz
Phone data)datastatus_codesuccessmessage)r3   r   )rS   
phone_datas     I/var/www/html/hwPaymentPortal-be-uat/backend/src/apps/customers/router.pyphone_number_lookupr]   p   s+      %U+J$	 s    )rP   rX   rQ   )dbr_   customer_inc                    K   t        | |       d{   \  }}|t        t        j                  |      d|t	        |d      r|j                         dS |dS 7 Hw)ac  
    Create new customer.
    
    The system supports two ways to handle account literals:
    1. User-provided: Include 'account_literal' field (15 characters) - system will validate uniqueness
    2. Auto-generated: Leave 'account_literal' empty - system will generate a unique account literal
    
    Use /customers/account-suggestions to get suggested account literals before creation.
    
    Note: All validation (email uniqueness, account literal format, etc.) is handled by Pydantic validators.
    Note: customer_id is for internal use only, account_literal is the public-facing account number.
    )customer_dataNrX   detailT
model_dumprY   rZ   rW   )create_customer_servicer
   r   HTTP_400_BAD_REQUESThasattrre   )r_   r`   customerrZ   s       r\   r'   r'      sy     & 6bTTHg33
 	
 )0<)H##%  OW  Us   AAA	Az/actionsaction_requestc                   K   	 t        | |j                  |j                         d{   }|d   dk(  }|rd|d    d|j                   d}nd	|d    d
|d    d}|||dS 7 :# t        $ r&}t	        |j
                  |j                        d}~wt        $ r8}t        j                  d|        t	        t        j                  d      d}~ww xY ww)a  
    Perform bulk actions on multiple customers.
    
    Limit- Maximum 10 customers per request for performance optimization.
    
    Available actions:
    - activate: Enable customers and restore soft-deleted ones
    - deactivate: Disable active customers  
    - delete: Soft delete customers
    
    For single customers, pass one ID in the ids array.
    Returns detailed success/failure results for each customer.
    )r_   actioncustomer_idsNfailed_countr   zAll success_countz customers were successfully dzBulk action completed: z succeeded, z failedrf   rc   z+Unexpected error in bulk customer actions: z:An unexpected error occurred while processing bulk actions)bulk_customer_actions_servicerm   idsr   r
   rX   rZ   	Exceptionloggingerrorr   HTTP_500_INTERNAL_SERVER_ERROR)r_   rk   resultsoverall_successrZ   es         r\   r2   r2      s    & 
5!(('++
 
 ".1Q6W_566STbTiTiSjjklG/0H/IV]^lVmUnnuvG '
 	

(  
99
 	
  
CA3GH==O
 	

sD   C%A& A$9A& #C$A& &	C/!BC3CCC
paginationfiltersc           	        K   | j                   dz
  | j                  z  }|j                  dk7  r|j                  nd|_        |j                  dk7  r|j                  nd|_        t	        ||| j                  |d       d{   }d|d   |d   |d   |d	   |d   |d	   z   dz
  |d	   z  |d
   du|d   dud|d
   |d   |d   |d   ddS 7 Kw)z_
    Retrieve customers with filtering and pagination using schema-based query parameters.
       r   NT)r_   r|   limitoffsetpaginaterW   totalpageper_pagenextprevious)r   r   r   total_pageshas_nexthas_previousfirstlast)r   r   r   r   )rY   rW   metalinks)r   r   	is_active	is_vendorget_customers_list_service)r{   r|   r_   r   pagination_results        r\   r(   r(      s#     oo!Z%8%88F .5->->!-C))G-4->->!-C))G 9!!  !&)&w/%f-)*5-g69J:9VVYZZ_pq{_||)&1=-j9E
 &f-)*5&w/%f-	
 s   A>C CACz/account-suggestionsc                   K   	 g }d}d}t        |      dk  rR||k  rMt        d      }t        | |       d{   s||vr|j                  |       |dz  }t        |      dk  r||k  rMt        |      dk  r%t        j                  dt        |       d| d       d	d
t        |       d|ddddddS 7 # t        $ r8}t        j                  d|        t        t        j                  d      d}~ww xY ww)a0  
    Generate four unique 15-character account literal suggestions.
    
    Returns four automatically generated account literals that are:
    - Exactly 15 characters long
    - Follow a consistent pattern
    - Validated against database for uniqueness
    - Used as public-facing account numbers
       r   r~   rj   NzCould only generate z unique suggestions after z	 attemptsTz
Generated z account literal suggestions   z9ACC + 3-char identifier + 6-digit timestamp + 3-char UUIDACCM7X123456ABC)lengthformatexample)suggestionspattern_inforf   z&Error generating account suggestions: z&Failed to generate account suggestionsrc   )lenrL   r/   appendloggerwarningrt   rv   r
   r   rw   )r_   r   max_attemptsattemptsaccount_literalrz   s         r\   get_account_suggestionsr     s0    '
+"x,'>)*5O 6b/JJJ"+5&&7MH +"x,'> {aNN1#k2B1CC]^j]kktuv #C$4#55QR* Y0!
 	
 K.  
=aSAB==;
 	

s?   C=3B9 B71B9 *AB9 6C=7B9 9	C:3C55C::C=z/summaryFzFInclude vendor statistics: true=vendor summary, false=customer summary)rR   r   z5Start date for summary statistics (YYYY-MM-DD format)z
2024-01-01z3End date for summary statistics (YYYY-MM-DD format)z
2024-12-31
   r~   2   z(Number of top/lowest customers to return)gelerR   r   r   	date_fromdate_tor   c                 6  K   	 t        | |       d{   }|S 7 # t        $ r&}t        |j                  |j                        d}~wt
        $ rD}t        j                  d|        t        t        j                  dt        |             d}~ww xY ww)z
    Get customer summary statistics.
    
    Returns summary data including top customers, lowest customers, and most frequent customers.
    Currently returns static data for demonstration purposes.
    Nrc   z!Error fetching customer summary: Internal server error: )get_customer_summary_servicer   r
   rX   rZ   rt   r   rv   r   rw   str)r_   r   r   r   r   summary_datarz   s          r\   get_customer_summary_endpointr   B  s     
9"iHH I 
99
 	
  
8<===,SVH5
 	

s<   B  B 	B!AB?BBBz/{customer_id}z]Comma-separated list of related fields to include: addresses, contacts, merchant, attachmentszaddresses,contactscustomer_idfieldsc                    K   	 t        || |       d{   }ddt        |d      r|j                         dS |dS 7 (# t        $ r&}t	        |j
                  |j                        d}~ww xY ww)z
    Get customer by ID with optional related fields.
    
    By default, no related fields are loaded for better performance.
    Use the 'fields' parameter to specify which relationships to include.
    r   r   NTzCustomer foundre   rf   rc   )get_customer_serviceri   re   r   r
   rX   rZ   )r   r_   r   rj   api_excs        r\   r&   r&   `  s     
-bkRXYY'-4X|-LH'')
 	
 S[
 	
 Z  
++??
 	

?   A2A  >#A  A2A  A2A   	A/	!A**A//A2customer_updatec                    K   	 t        || |       d{   }ddt        |d      r|j                         dS |dS 7 (# t        $ r&}t	        |j
                  |j                        d}~ww xY ww)z 
    Update customer by ID.
    )r   rb   NTzCustomer updated successfullyre   rf   rc   )update_customer_serviceri   re   r   r
   rX   rZ   )r   r   r_   updated_customerr   s        r\   r*   r*   |  s     
!8ds!tt65<=M|5\$//1
 	
 cs
 	
 u  
++??
 	

r   c                 f  K   	 t        || d       d{   }t        ||        d{   }|st        t        j                  d      dd	d
S 7 ;# t        $ rP}|j                  dk(  rt        t        j
                  d      t        |j                  |j                        d}~ww xY w7 w)z.
    Delete (soft delete) customer by ID.
    Nr     Customer not foundrc   )r   zFailed to delete customerTzCustomer deleted successfullyrY   rZ   )	r   r   rX   r
   r   HTTP_404_NOT_FOUNDrZ   delete_customer_servicerh   )r   r_   existing_customerrz   rY   s        r\   r+   r+     s     
"6r{[_"`` ,BKHHG33.
 	
 2 + a 	
==C"55+  99
 	
	
 IsB   B1A AA B1B/&B1A 	B,AB''B,,B1z/{customer_id}/addresseszCUSTOMER ADDRESSESaddress_datac                   K   	 t        || |       d{   }ddt        |d      r|j                         dS |dS 7 (# t        $ r&}t	        |j
                  |j                        d}~wt        $ rG}t        j                  d|  d|        t	        t        j                  d	t        |             d}~ww xY ww)
z>Create a new address for a customer with use_as_default=False.NTzAddress created successfullyre   rf   rc   z$Error creating address for customer : r   )r4   ri   re   r   r
   rX   rZ   rt   r   rv   r   rw   r   )r   r   r_   addressrz   s        r\    create_customer_address_endpointr          
/KNN5,3G\,JG&&(
 	
 QX
 	
 O  
99
 	
  
;K=1#NO==,SVH5
 	

G   B?? =#? B?? B?? 	B<!A))B<5AB77B<<B?zPage number for pagination)r   rR   r   d   z"Number of items per page (max 100)zFilter by address typebilling)r   shippinglegalmailing)rR   r   enumz>Filter by active status: true=active only, false=inactive onlyTz Filter by default address statusz0Search in address lines, city, state, or countryzNew Yorkr   r   address_typer   use_as_defaultsearchc                   K   	 |}|dz
  |z  }	t        || ||	||||       d{   }
dd|
d    d|
d   |
d   |
d	   |
d
   |
d   |
d   |
d   |
d   ddS 7 2# t        $ r&}t        |j                  |j                        d}~wt
        $ rG}t        j                  d|  d|        t        t        j                  dt        |             d}~ww xY ww)zAGet paginated list of customer addresses with optional filtering.r~   )r_   r   r   r   r   r   r   r   NTFound r   z
 addressesrW   r   r   r   r   r   r   r   r   r   r   r   r   r   rY   rZ   rW   r   rc   z%Error listing addresses for customer r   r   )r5   r   r
   rX   rZ   rt   r   rv   r   rw   r   )r   r_   r   r   r   r   r   r   r   r   resultrz   s               r\   list_customer_addressesr     s    '
(h&-#%)	
 	
 w0
;6Nv":.v":.v	
 	
	
0  
99
 	
  
<[MA3OP==,SVH5
 	

E   C A A1A CA 	C"!BCACCCz%/{customer_id}/addresses/{address_id}
address_idc           	        K   	 t        || |       d{   }ddt        |d      r|j                         dS |dS 7 (# t        $ r&}t	        |j
                  |j                        d}~wt        $ rJ}t        j                  d| d|  d	|        t	        t        j                  d
t        |             d}~ww xY ww)z,Get a specific address by ID for a customer.NTzAddress foundre   rf   rc   zError getting address  for customer r   r   )r6   ri   re   r   r
   rX   rZ   rt   r   rv   r   rw   r   )r   r   r_   r   rz   s        r\   get_customer_address_endpointr   
       
,RjII&,3G\,JG&&(
 	
 QX
 	
 J  
99
 	
  
-j\}TVWXVYZ[==,SVH5
 	

G   C? =#? C? C? 	B?!A))B?5AB::B??Cc           	        K   	 t        || ||       d{   }ddt        |d      r|j                         dS |dS 7 (# t        $ r&}t	        |j
                  |j                        d}~wt        $ rJ}t        j                  d| d|  d	|        t	        t        j                  d
t        |             d}~ww xY ww)z4Update a customer address with partial or full data.NTzAddress updated successfullyre   rf   rc   zError updating address r   r   r   )r7   ri   re   r   r
   rX   rZ   rt   r   rv   r   rw   r   )r   r   r   r_   r   rz   s         r\    update_customer_address_endpointr   %       
/K\ZZ5,3G\,JG&&(
 	
 QX
 	
 [  
99
 	
  
.zl.UWXYWZ[\==,SVH5
 	

L   CA  >#A  CA  CA   	C 	!A**C 6AB;;C  Cc           	      J  K   	 t        || |       d{    dddS 7 	# t        $ r&}t        |j                  |j                        d}~wt
        $ rJ}t        j                  d| d|  d|        t        t        j                  d	t        |             d}~ww xY ww)
z/Soft delete a customer address with validation.NTzAddress deleted successfullyr   rc   zError deleting address r   r   r   )r8   r   r
   rX   rZ   rt   r   rv   r   rw   r   )r   r   r_   rz   s       r\    delete_customer_address_endpointr   A       
%b+zBBB5
 	
 	C
  
99
 	
  
.zl.UWXYWZ[\==,SVH5
 	

=   B#    B#  	B !A

B ABB  B#z/{customer_id}/contactszCUSTOMER CONTACTScontact_datac                   K   	 t        || |       d{   }ddt        |d      r|j                         dS |dS 7 (# t        $ r&}t	        |j
                  |j                        d}~wt        $ rG}t        j                  d|  d|        t	        t        j                  d	t        |             d}~ww xY ww)
z$Create a new contact for a customer.NTzContact created successfullyre   rf   rc   z$Error creating contact for customer r   r   )r9   ri   re   r   r
   rX   rZ   rt   r   rv   r   rw   r   )r   r   r_   contactrz   s        r\    create_customer_contact_endpointr   \  r   r   z9Search across contact name, email, title, or phone numberjohnz+Filter by contact job title (partial match)ManagerzFilter by contact relation typeprimarytitlerelationc                   K   	 |}|dz
  |z  }	t        || ||	||||       d{   }
dd|
d    d|
d   |
d   |
d	   |
d
   |
d   |
d   |
d   |
d   ddS 7 2# t        $ r&}t        |j                  |j                        d}~wt
        $ rG}t        j                  d|  d|        t        t        j                  dt        |             d}~ww xY ww)z@Get paginated list of customer contacts with optional filtering.r~   )r_   r   r   r   r   r   r   r   NTr   r   z	 contactsrW   r   r   r   r   r   r   r   r   rc   z$Error listing contacts for customer r   r   )r:   r   r
   rX   rZ   rt   r   rv   r   rw   r   )r   r_   r   r   r   r   r   r   r   r   r   rz   s               r\   list_customer_contactsr   w  s    '
(h&,#	
 	
 w0	:6Nv":.v":.v	
 	
	
0  
99
 	
  
;K=1#NO==,SVH5
 	

r   z$/{customer_id}/contacts/{contact_id}
contact_idc           	        K   	 t        || |       d{   }ddt        |d      r|j                         dS |dS 7 (# t        $ r&}t	        |j
                  |j                        d}~wt        $ rJ}t        j                  d| d|  d	|        t	        t        j                  d
t        |             d}~ww xY ww)z4Get a specific contact by contact_id for a customer.NTzContact foundre   rf   rc   zError getting contact r   r   r   )r;   ri   re   r   r
   rX   rZ   rt   r   rv   r   rw   r   )r   r   r_   r   rz   s        r\   get_customer_contact_endpointr     r   r   c           	        K   	 t        || ||       d{   }ddt        |d      r|j                         dS |dS 7 (# t        $ r&}t	        |j
                  |j                        d}~wt        $ rJ}t        j                  d| d|  d	|        t	        t        j                  d
t        |             d}~ww xY ww)z4Update a customer contact with partial or full data.NTzContact updated successfullyre   rf   rc   zError updating contact r   r   r   )r<   ri   re   r   r
   rX   rZ   rt   r   rv   r   rw   r   )r   r   r   r_   r   rz   s         r\    update_customer_contact_endpointr     r   r   c           	      J  K   	 t        || |       d{    dddS 7 	# t        $ r&}t        |j                  |j                        d}~wt
        $ rJ}t        j                  d| d|  d|        t        t        j                  d	t        |             d}~ww xY ww)
z/Soft delete a customer contact with validation.NTzContact deleted successfullyr   rc   zError deleting contact r   r   r   )r=   r   r
   rX   rZ   rt   r   rv   r   rw   r   )r   r   r_   rz   s       r\    delete_customer_contact_endpointr     r   r   z/{customer_id}/activitieszCUSTOMER ACTIVITIESc                 <  K   	 t        | |       d{   }|S 7 # t        $ r&}t        |j                  |j                        d}~wt
        $ rG}t        j                  d| d|        t        t        j                  dt        |             d}~ww xY ww)z
    Get customer activities.
    
    Returns a list of activities for the specified customer.
    Currently returns static data for demonstration purposes.
    Nrc   z'Error fetching activities for customer r   r   )get_customer_activities_servicer   r
   rX   rZ   rt   r   rv   r   rw   r   )r_   r   activities_datarz   s       r\   r0   r0     s     
 ?K PP Q 
99
 	
  
>{m2aSQR==,SVH5
 	

s=   B  B 	B!ABABBBz/{customer_id}/attachmentszCUSTOMER ATTACHMENTSzUpload Customer AttachmentszyUpload multiple attachment files for a customer. Files are stored in uploads/data_files/merchant_id/accounts/customer_id/zList of uploaded files)rP   rQ   summaryrR   response_descriptionzThe unique ID of the customerzFiles to uploadzType of files being uploaded)defaultrR   files	file_typec                    K   t        j                  dd      }t        j                  dd      }t        ||t	        |d      rt        |j                        n
t        |      |||        d{   }|dd	S 7 	w)
z'Upload attachment files for a customer.merchant_001r~   merchant_ididuser_idr  value)r_   r   r   current_usermerchantr   Nz&Attachment files uploaded successfullyrW   rZ   )rM   model_constructrN   rC   ri   r   r  )r   r   r   r_   r	  r  responses          r\    upload_customer_attachment_filesr    sx     & --.QOH--aA>L0*1)W*E#ioo&3y>! H )QRRs   A-A;/A90
A;zGet Customer Attachmentsz,Retrieve all attachment files for a customerzList of customer attachmentsc                 B   K   t        ||        d{   }|ddS 7 	w)z(Get all attachment files for a customer.)r_   r   Nz+Customer attachments retrieved successfullyr
  )rE   )r   r_   r  s      r\   get_customer_attachment_filesr  <  s0      . H )VWW	s   
z$/{customer_id}/attachments/{file_id}zDelete Customer Attachmentz0Delete a specific attachment file for a customerzDeletion confirmationzThe unique ID of the filefile_idc                    K   t        j                  dd      }t        j                  dd      }t        || |||       d{   }|ddS 7 	w)	z)Delete an attachment file for a customer.r  r~   r  r  )r_   r   r	  r  r  Nz$Attachment file deleted successfullyr
  )rM   r  rN   rD   )r   r  r_   r	  r  r  s         r\   delete_customer_attachment_filer  P  s]     $ --.QOH--aA>L/! H )OPPs   AAA
Az/{customer_id}/noteszCUSTOMER NOTESzGet Customer Notesz8Retrieve paginated list of notes for a specific customerz2Paginated list of customer notes with user detailsNotes retrieved successfullyzapplication/jsonr   z)Customer called regarding payment inquiryz2025-12-02T15:30:00.000ZAdminr%   zadmin@example.com)r  
first_name	last_nameemail)r  rR   
created_at
updated_at
deleted_atcreated_by_id
created_by)r   r   r   r   r   )rY   rZ   rW   r{   )rR   contentrR   r   Internal server error)rV   r     )rP   rQ   r   rR   r   	responseszCustomer ID (customer_id field)ACCKDU1537895E7z&Number of items to skip for paginationz2Search term to filter notes by description contentpaymentr   c                 r  K   	 t        || |||       d{   }dd|d   |d   |d   |d   |d	   |d
   |d   |d   dddS 7 ,# t        $ r&}t        |j                  |j                        d}~wt
        $ r8}t        j                  d|        t        t        j                  d      d}~ww xY ww)a  
    Get paginated list of notes for a specific customer.
    
    Returns paginated notes associated with the customer, ordered by creation date (most recent first).
    Each note includes full details of the user who created it.
    
    **Features:**
    - Pagination support with configurable page size
    - Search functionality in note descriptions
    - Full user details for note creators
    - Ordered by creation date (newest first)
    
    **Parameters:**
    - **customer_id**: The customer's unique identifier
    - **limit**: Number of notes per page (1-100, default: 10)
    - **offset**: Number of notes to skip (default: 0)
    - **search**: Optional search term to filter notes
    )r   r   r   NTr  rW   r   r   r   r   r   r   r   r   rV   )rY   rZ   rW   r{   rX   rc   z(Unexpected error in get_customer_notes: r  )
get_customer_notes_servicer   r
   rX   rZ   rt   r   rv   r   rw   )r   r   r   r   r_   r   r   rz   s           r\   r>   r>   p  s     N
15
 
 56Nv":.v":.v 
 	

$  
++??
 	
  
?sCD==*
 	

sD   B7A A+A B7A 	B4!A00B4<3B//B44B7zCreate Customer Notez)Create a new note for a specific customerz+Note created successfully with full detailsNote created successfullyrf   z&Invalid input data or validation error)     r   r  )rP   rX   rQ   r   rR   r   r   z7Note creation data with description (1-2000 characters)	note_datac                 h  K   	 t        ddddd      }t        || ||       d{   }dd	|j                         d
dS 7 # t        $ r&}t	        |j
                  |j                        d}~wt        $ r8}t        j                  d|        t	        t        j                  d      d}~ww xY ww)a  
    Create a new note for a customer.
    
    Creates a new note associated with the specified customer.
    The note will be attributed to the currently authenticated user.
    
    **Features:**
    - Automatic user attribution to authenticated user
    - Description validation (1-2000 characters)
    - Customer existence validation
    - Returns full note details with user information
    
    **Request Body Example:**
    ```json
    {
        "description": "Customer called regarding payment inquiry and requested status update"
    }
    ```
    
    **Authorization Required:** Valid JWT token (currently uses placeholder user ID)
    r~   temp@example.com	temp_userTempr%   r  r  usernamer  r  NTr%  r&  rY   rZ   rW   rX   rc   z*Unexpected error in create_customer_note: r  )r%   create_customer_note_servicere   r   r
   rX   rZ   rt   r   rv   r   rw   )r   r(  r_   created_by_usernoter   rz   s          r\   r?   r?     s     F
 $ 
 2Y
 
 2OO%	
 	

  
++??
 	
  
A!EF==*
 	

sA   B2!A ?A B2A 	B/
!A++B/73B**B//B2z/{customer_id}/notes/{note_id}zGet Customer Notez(Get a specific note by ID for a customerz"Note details with user informationzNote found successfully
Note foundzCustomer or note not foundzNote ID to retrievenote_idc                 F  K   	 t        || |       d{   }dd|j                         ddS 7 # t        $ r&}t        |j                  |j
                        d}~wt        $ r8}t        j                  d|        t        t        j                  d      d}~ww xY ww)	a  
    Get a specific note by ID for a customer.
    
    Returns full details of the specified note, including the user who created it.
    
    **Features:**
    - Full note details with user information
    - Customer and note existence validation
    - Soft-delete awareness (won't return deleted notes)
    
    **Parameters:**
    - **customer_id**: The customer's unique identifier
    - **note_id**: The note's unique ID to retrieve
    NTr3  rV   r/  rc   z'Unexpected error in get_customer_note: r  )get_customer_note_servicere   r   r
   rX   rZ   rt   r   rv   r   rw   )r   r4  r_   r2  r   rz   s         r\   rB   rB   <  s     p
.r;HH#OO%	
 	
 I  
++??
 	
  
>qcBC==*
 	

s<   B!0 .0 B!0 	B!AB&3BBB!zUpdate Customer Notez&Update an existing note for a customerz+Note updated successfully with full detailsNote updated successfullyzWUpdated note: Customer called regarding payment inquiry and provided additional detailsz2025-12-02T16:15:00.000Z)rV   r'  r   r  zNote ID to updatez5Note update data with description (1-2000 characters)c                 j  K   	 t        ddddd      }t        || |||       d{   }dd	|j                         d
dS 7 # t        $ r&}t	        |j
                  |j                        d}~wt        $ r8}t        j                  d|        t	        t        j                  d      d}~ww xY ww)a  
    Update an existing note for a customer.
    
    Updates the specified note with new data.
    Only the user who created the note or admin users should be able to update it.
    
    **Features:**
    - Description validation (1-2000 characters)
    - Customer and note existence validation
    - Automatic timestamp update
    - Full note details in response
    
    **Request Body Example:**
    ```json
    {
        "description": "Updated note: Customer called regarding payment inquiry and provided additional details"
    }
    ```
    
    **Authorization Required:** Valid JWT token (currently uses placeholder user ID)
    **Permissions:** Note creator or admin users
    r~   r*  r+  r,  r%   r-  NTr7  rV   r/  rc   z*Unexpected error in update_customer_note: r  )r%   update_customer_note_servicere   r   r
   rX   rZ   rt   r   rv   r   rw   )r   r4  r(  r_   updated_by_userr2  r   rz   s           r\   r@   r@     s     H
 $ 
 2Wi
 
 2OO%	
 	

  
++??
 	
  
A!EF==*
 	

sC   B3"A A A B3 A 	B0!A,,B083B++B00B3zDelete Customer Notez!Soft delete a note for a customerzNote deleted successfullyzNote ID to deletec                 B  K   	 t        ddddd      }t        || ||       d{   }|S 7 # t        $ r&}t        |j                  |j
                        d}~wt        $ r8}t        j                  d	|        t        t        j                  d
      d}~ww xY ww)a  
    Delete a note for a customer.
    
    Soft deletes the specified note (sets deleted_at timestamp).
    Only the user who created the note or admin users should be able to delete it.
    
    **Features:**
    - Soft delete (preserves data with deleted_at timestamp)
    - Customer and note existence validation
    - Returns success confirmation
    
    **Parameters:**
    - **customer_id**: The customer's unique identifier
    - **note_id**: The note's unique ID to delete
    
    **Authorization Required:** Valid JWT token (currently uses placeholder user ID)
    **Permissions:** Note creator or admin users
    
    **Note:** This is a soft delete operation - the note will be marked as deleted but data is preserved in the database.
    r~   r*  r+  r,  r%   r-  Nrc   z*Unexpected error in delete_customer_note: r  )r%   delete_customer_note_servicer   r
   rX   rZ   rt   r   rv   r   rw   )r   r4  r_   deleted_by_userr   r   rz   s          r\   rA   rA     s     f
 $ 
 4Wo
 
 
  
++??
 	
  
A!EF==*
 	

s<   B!. ,. B. 	B!AB$3BBB)__doc__typingr   r   r   r   r   fastapir   r	   r
   r   r   r   r   r   r   r   FastAPIFilesqlalchemy.ormr   ru   src.core.databaser   src.core.exceptionsr   src.apps.auth.utils.authr   r   *src.apps.customers.schemas.customer_commonr   r   r   ,src.apps.customers.schemas.customer_requestsr   r   r   r   r   r   src.apps.base.schemas.commonr    r!   +src.apps.customers.schemas.customer_contactr"   r#   r$   src.apps.users.models.userr%   src.apps.customers.servicesr&   r   r'   rg   r(   r   r)   get_customer_by_email_servicer*   r   r+   r   r,   activate_customer_servicer-   deactivate_customer_servicer.   r/   r0   r   r1   r   r2   rr   r3   ,src.apps.customers.services.address_servicesr4   r5   r6   r7   r8   ,src.apps.customers.services.contact_servicesr9   r:   r;   r<   r=   3src.apps.customers.services.customer_notes_servicesr>   r$  r?   r0  r@   r9  rA   r<  rB   r6  9src.apps.customers.services.customer_attachments_servicesrC   rD   rE   "src.apps.notes.schemas.note_commonrF   rG   $src.apps.notes.schemas.note_requestsrH   rI   "src.apps.files.schemas.file_commonrJ   src.core.utils.enumsrK   src.core.functionsrL   *src.apps.merchants.schemas.merchant_commonrM   "src.apps.users.schemas.user_commonrN   router	getLogger__name__r   getr   r]   postHTTP_201_CREATEDr   boolintr   putdeleter   r   r   dictr   r   r   r   r   r   r   GALLERYr  r  r       r\   <module>rh     sP   4 3 w w w "  ) , K 
  S  ,   $     B * * E 9 
			8	$ -Fk][s(@A \, RS#XF<S<S[fZgh +& - 		 i@ ZS#Xk]K +&2
2
 42
 		2
 L2
j BtCH~[MB+29$+I+&)()!) 	) 		) C)X "4S>V+&3
3
3
 W3
l JtCH~[MJ+&E/w  BG  H$T7n  yE   F"45j  uA  BraB4^hjk


 }
 c]	

 
 	
 K
: T#s(^;-P +&!$  5T  ^r  s


 SM
 		
 Q
6 T#s(^;-P +&

0
 	
 		
 Q
, S#Xk]S +&!!! 	! T!J 'S#XTZTkTk  tH  sI  J +&

,
 	
 
#s(^	
 J
4 &tCH~MaLbc +&aA+GQRS"s8\fhi"':R\e  mX  #Y %d8x  CG  !H%*4=_im%n!$4fpz{2
2
2
 2
 	2

 3-2
 ~2
 TN2
 SM2
 
#s(^2
 d2
j 3DcNZnYop +&


 	
 
#s(^	
 q
4 3DcNZnYop
 +&	


 
 		

 
#s(^
 q
6 6tCQTH~]q\rs +&


 	
 
#s(^	
 t
4 &tCH~SYSjSj  sF  rG  H +&

4
 	
 
#s(^	
 H
4 %d38nL_K`a +&aA+GQRS"s8\fhi %d8x  CG  !H!$4oy  A 3`jst#D6Wajk2
2
2
 2
 	2

 ~2
 SM2
 C=2
 sm2
 
#s(^2
 b2
j 24S>YlXmn +&


 	
 
#s(^	
 o
4 24S>YlXmn
 +&	


 5
 		

 
#s(^
 o
6 5d3PS8n\o[pq +&


 	
 
#s(^	
 r
2 'S#XNcMde +&

 
 		
 f
8  S>
 	!) L1   C-LM)#;LM	(9(9Gef+&	SS
S S 		S 
#s(^SS2  S>
 	!&>7   C-LM+&	X	X	X 
#s(^	X	X *S>
 	!(B0   C-LM)DE+&QQQ 	Q 
#s(^QQ0 S>
	 JM :"#'#A '(/Z.H.H.212*+2917-@	/"!" &'$%(*$((,'' %!
D 1245I%  -^ C-NXijraC5Ycefa-U_`a!$4hr{|+&6
6
6
 6
 SM	6

 	6
 
#s(^6
]-\6
r S>''
	";F 7"#'#>"#+V*D*D*.-.&'.5-3)<	+! %
2 EF12459  &P C-NXij)-c?x)y+&;
;
&;
 	;
 
#s(^;
O&N;
| $S>
	:= 5"#'#/"#+V*D*D*.-.&'.5-3)<	+! %
2 9:457  $L C-NXij)>J+&%
%
%
 	%
 
#s(^	%
K$J%
P $S>
	"8F 7"#'#>"# ,E*D*D*.-.&'.5-3)<	+! %
2 EF9:459  %N C-NXij)<aH)-c?v)w+&	=
=
=
 '=
 		=
 
#s(^=
M%L=
@ $S>
	"34 7"#'#> $ %
 9:45  2 C-NXij)<aH+&5
5
5
 	5
 
#s(^5
105
rg  