
    $1i,                        d Z ddl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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 ddl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,Z,ddl-Z-ddl.m/Z/  e	j`                  e1      Z2de3fdZ4de3fdZ5d5dede3de3defdZ6dededeeeedf   e3f   fdZ7	 	 	 d6deddde8de8d e9deeeee   e8f   f   fd!Z:ded"e3defd#Z;dede3de9fd$Z<dede3de9fd%Z=dede3de defd&Z>dede3de9fd'Z?dede3d(e8dee   fd)Z@dede3de9fd*ZA	 d5ded+e3dee8   dee+   fd,ZBded-e3de9fd.ZCdede3defd/ZDd7ded0e9defd1ZEded2e3d3ee3   dee3ef   fd4ZFy)8zA
Customer Services for handling customer-related business logic.
    )DictListOptionalTupleUnionAny)datetimeN)HTTPExceptionstatus)selectand_or_funcdescasc)Sessionselectinload)Customer)Address)CustomerSchemaCustomerListSchema)CustomerCreateRequestSchemaCustomerUpdateRequestSchemaCustomerFilterSchema)QueryPaginator)generate_id)APIException)Merchant)CustomerContact)ValidationErrorsearchc                 l   d| d}| j                  t        t        j                  j	                  |      t        j
                  j	                  |      t        j                  j	                  |      t        j                  j	                  |      t        j                  j	                  |                  S )z&Apply search filter to customer query.%)	wherer   r   
first_nameilike	last_nameemailuincustomer_id)stmtr!   search_terms      Y/var/www/html/hwPaymentPortal-be-dev/hw-payment-portal-api/src/apps/customers/services.py_apply_search_filterr.   %   s    fXQ-K::%%k2$$[1NN  -LL{+  &&{3	
     fieldsc                 ^   |j                  d      D cg c]  }|j                          }}g }t        j                  t        j                  t        j
                  t        j                  d}|D ]$  }||v s|j                  t        ||                & |r | j                  | } | S c c}w )z2Apply selective loading based on fields parameter.,)	addressescontactsmerchantattachments)
splitstripr   r3   r4   r5   r6   appendr   options)r+   r0   fieldrequested_fieldsload_optionsfield_mappings         r-   _apply_selective_loadingr?   3   s    39<<3DE%EEL ''%%%%++	M " DM!]5-A BCD t||\*K# Fs   B*dbr*   returnc                 "  K   	 t        t              j                  t        j                  |k(        }|rt	        ||      }t        t        d      r.|j                  t        j                  j                  d            }| j                  |      j                         }|st        ddd      t        j                  |      S # t        $ r  t        $ r7}t        j                  d|        t        dt!        |       d	d      d}~ww xY ww)
z9Get customer by customer_id with optional related fields.
deleted_atNCustomer not found  customers.servicesmessagestatus_codemodulezError getting customer: zFailed to retrieve customer:   )r   r   r$   r*   r?   hasattrrC   is_executescalar_one_or_noner   r   model_validate	Exceptionloggererrorstr)r@   r*   r0   r+   resultes         r-   get_customerrW   I   s     
h%%h&:&:k&IJ +D&9D8\*::h1155d;<DD!446,+  ,,V44  
/s343CF8<'
 	

s)   DB>C DD2DDDcustomer_datac           
        K   	 d}|j                   r(|j                  r|j                    d|j                   }n|j                   r|j                   }t        d|      }t        j	                  d| d|        d}d}||k  rt        t              j                  t        j                  |k(        }| j                  |      j                         }|st        j	                  d| d	       n5t        j                  d| d
|dz           t        d|      }|dz  }||k  r||k\  rt        j                  d| d       y||_        t        j	                  d|        d}|j                   r(|j                  r|j                    d|j                   }n|j                   r|j                   }t        d|      }t        | |       d{   r!t        d|      }t        | |       d{   r!d}	t        |d      r|j                  r|j                  }	nAt        d|      }	t!        | |	       d{   r!t        d|      }	t!        | |	       d{   r!d}
|j"                  r5t%        |j"                  t&              rdj)                  |j"                        }
|j*                  }|st        t,              j/                  d      }| j                  |      j                         }|s	 t        dd      }t-        |ddddt1        j2                         j4                  dd j7                          dd      }| j9                  |       | j;                          |j<                  }t        j	                  d|        n|j<                  }|jC                  h d       }|jD                  }||d!<   |	|d<   ||d"<   ||d#<   |
|d$<   tG        |d%d      |d%<   tG        |d&d'      |d&<   t        d=i |}| j9                  |       | jI                          | jK                  |       t        j	                  d(|jL                  xs |j                          t        j	                  d)|j<                   d*|jN                          |jP                  r	 |jP                  jC                  d+      }|j<                  |d!<   ||d"<   d%|vrd|d%<   d,|vrd|d,<   tS        d=i |}| j9                  |       | jI                          | jK                  |       t        j	                  d-|jN                   d.|j<                          g }|jT                  r|jW                  |jT                         |jX                  r|j[                  |jX                         |D ]  }	 d}|j                   r(|j                  r|j                    d|j                   }n|j                   r|j                   }t        d1|      }d2}d}||k  rt        t\              j                  t\        j^                  |k(        }| j                  |      j                         }|sn5t        j                  d3| d
|dz           t        d1|      }|dz  }||k  r||k\  rt        j                  d4| d       |jC                  d5d6h       }||d7<   |j<                  |d!<   d|d#<   |j`                  |j`                  nd|d%<   t]        d=i |}| j9                  |       | jI                          | jK                  |       t        j	                  d8|jN                   d.|j^                           tc        | |jN                         d{   }|d:fS 7 7 7 H7 +# t>        $ r2}t        j                  d|        ddtA        |       fcY d}~S d}~ww xY w# t>        $ r0}t        j                  d/|jN                   d0|        Y d}~d}~ww xY w# t>        $ r0}t        j                  d9|jN                   d0|        Y d}~d}~ww xY w7 # t>        $ r2}t        j                  d;|        dd<tA        |       fcY d}~S d}~ww xY ww)>z/Create a new customer with Pydantic validation.N r)   zGenerated UIN: z for customer: 
   r   zUIN z
 is uniquez. already exists, generating new one. Attempt:    z$Failed to generate unique UIN after z	 attempts)Nz5Failed to generate unique UIN after multiple attemptszFinal UIN assigned: customeraccount_literalr2   r5   zDefault Merchantzdefault@merchant.comz+1234567890MERCH_   generalT)r)   namer(   phonemerchant_idindustry	is_activez!Created default merchant with ID z!Error creating default merchant: z#Failed to create default merchant: >   addresscontactr4   	role_typer^   )excluder*   rd   user_account_idtagsrf   	is_vendorFz#Customer inserted using ORM query: z(Customer committed to database with ID: z, customer_id: )exclude_noneuse_as_defaultz'Address created and linked to customer z
 with ID: z$Error creating address for customer : rh      zContact ID z+Failed to generate unique contact ID after rg   website
contact_idzContact created for customer z$Error creating contact for customer zCustomer created successfullyzError creating customer: zFailed to create customer:  )2r%   r'   r   rR   infor   r   r$   r)   rN   rO   warningrS   check_customer_id_existsrL   r^   check_account_literal_existsrl   
isinstancelistjoinrd   r   limituuiduuid4hexupperaddflushidrQ   rT   
model_dumprk   getattrcommitrefreshr(   r*   rg   r   rh   r9   r4   extendr   rs   rf   rW   )r@   rX   customer_namegenerated_uinmax_attemptsattemptuin_check_stmtexistingr*   r^   tags_strrd   first_merchant_stmtfirst_merchantmerchant_uindefault_merchantrV   customer_dictrk   customer_objaddress_dictaddress_objcontacts_to_createcontact_datacontact_namers   contact_check_stmtexisting_contactcontact_dictcontact_objcustomer_with_relationss                                  r-   create_customerr   k   sz    
m> ##(?(?,778-:Q:Q9RSM%%)44M#E=9om_OM?ST $#H-33HLLM4QRNzz.1DDFHd=/<=NNT-0^_fij_j^klm'}=MqLG $ l"LL?~YWXR **=/:; ##(?(?,778-:Q:Q9RSM%%)44M!*m< -R===%j-@K -R===  ="349V9V+;;O **mDO 5RIII"-j-"H 5RIII *]-?-?"Fxx 2 23H $//"("2"8"8";ZZ(;<OOQN!R#.z;M#NL'/(/4+&,TZZ\-=-=bq-A-G-G-I,J$K!*"&($ FF+,HHJ"2"5"5KKK"CK= QR
 -// &00 :
0  (77 (3m$+:'('2m$+:'( (f &-]K%Nk"%,]K%Ok"  0-0
|
		


< 9,:L:L:`P\P`P`9abc>|>O_k_w_w^xyz   e,44??T?R /;oo]+.9]+ l204L-#<759L!12 &55{#		

;'ElF^F^E__ijujxjxiyz{     %%m&;&;< !!%%m&<&<=
 / +	eL*e  $**|/E/E&2&=&=%>a@V@V?W#XL!,,#/#:#:L(LA
  !,)/)@)F)FGaGaeoGo)p&')zz2D'E'X'X'Z$+NN[<jkruvkvjw#xy!,Y!EJqLG , l*LL#N|n\e!fg  ,66	9?U6V-7\*.:oo]+26./FRF\F\FhL,B,Bnr[) .=={#		

;';L<T<T;UU_`k`v`v_wxyQ+	e` )5R9Q9Q(R"R')HIIw >= JIB ! RLL#DQC!HI $GAx"PQQRL  eCLD\D\C]]_`a_bcddez  eCLD\D\C]]_`a_bcdde #S  >0453CF8<==>sL  a4D`6 !`6 ?a4 B`6 ]2	`6 (]5)`6 .A`6 0]81`6 ];`6 B`6 'B]> :D`6 	B.^< 7A`6 C(_87_8`6 B6_8`6 )`4*`6 1a42`6 5`6 8`6 ;`6 >	^9'^4.^9/`6 3a44^99`6 <	_5%_0*`6 0_55`6 8	`1%`,&`6 ,`11`6 6	a1?'a,&a1'a4,a11a4filtersr   r|   offsetpaginatec           
      l  K   	 t        t              }t        t        d      r.|j                  t        j                  j                  d            }|j                  rt        ||j                        }|j                  t        j                  df|j                  t        j                  dfi}|j                         D ]<  \  }\  }}	|dk(  r|j                  |dk(        }#|dk(  s)|j                  |dk(        }> |j                  r,|j                  t        j                  |j                  k(        }|j                  r,|j                  t        j                  |j                  k(        }|j                  r<|j                  t        j                  j                  d	|j                   d	            }|j                  red	|j                   d	}
|j                  t!        t        j"                  j                  |
      t        j$                  j                  |
                  }|j&                  r<|j                  t        j&                  j                  d	|j&                   d	            }|j(                  r<|j                  t        j(                  j                  d	|j(                   d	            }|j*                  rd	|j*                   d	}|j-                  t        j.                        j                  t!        t0        j2                  j                  |      t0        j4                  j                  |      t0        j6                  j                  |      t0        j8                  j                  |                  j;                         }|j<                  rd	|j<                   d	}|j*                  r/|j                  t0        j>                  j                  |            }nY|j-                  t        j.                        j                  t0        j>                  j                  |            j;                         }|j@                  rtC        ||j@                        }|jE                  tG        t        jH                              }|rtK        |tL        | t        d
||d      }|jO                         }|jP                  |jR                  |jT                  |jV                  |jX                  |jZ                  |j\                  |j^                  dS | ja                  |      jc                         je                         }|D cg c]  }tg        jh                  |       }}|tk        |      fS c c}w # tl        $ r8}tn        jq                  d|        |rg dd|dddddcY d}~S g dfcY d}~S d}~ww xY ww)z5Get paginated list of customers using QueryPaginator.rC   NvendoractiveFr\   Tr#   z/api/v1/customers)queryschemar@   modelurlr   r|   use_orm)datatotalpageper_pagenextpreviousfirstlastzError getting customers list: r   )9r   r   rL   r$   rC   rM   r!   r.   rm   rf   itemscustomer_typeaccount_typere   r&   rb   r   r%   r'   r(   rc   rg   r{   r3   r   address_line_1address_line_2citystatedistinctzip_codezipcoder0   r?   order_byr   
created_atr   r   r   rU   r   r   r   r   r   r   r   rN   scalarsallr   rP   lenrQ   rR   rS   )r@   r   r|   r   r   r+   boolean_filtersfilter_valuer;   
field_name	name_termaddress_termzip_code_term	paginatorpagination_resultresultsrU   customers_listrV   s                      r-   get_customers_listr   `  s    Ah 8\*::h1155d;<D >>'gnn=D  2 2H= 2 2H=

 2A1F1F1H 	1-L-5*r!zz%5.1"zz%4-0		1   ::h448M8MMND ::h33w7K7KKLD ::h//55':J:J9K16MNOD <<GLL>+I::''--i8&&,,Y7D ==::hnn22Qw}}oQ3GHID ==::hnn22Qw}}oQ3GHID ??w/q1L99X//066**00>**00>LL&&|4MM''5	 hj   0 013Mzz'//"7"7"FGyy!3!34::OO))-8(* 
 >>+D'..AD }}T("5"567&)'	I !* 2 2 4 *00*00)..-66)..-66*00)..	 	 jj&..0446GRYZn;;FCZNZ!3~#666 [  5aS9:! 	 	 q5Lsl   V4C!U0 &P(U0 V41U0  U+U0 *V4+U0 0	V19$V,V1V4#V,&V1'V4,V11V4r(   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        j                  |      S # t        $ r  t        $ r7}t        j                  d|        t        dt        |       d	d      d}~ww xY ww)
z'Get customer by email using proper ORM.rC   NrD   rE   rF   rG   z!Error getting customer by email: z&Failed to retrieve customer by email: rK   )r   r   r$   r(   rL   rC   rM   rN   rO   r   r   rP   rQ   rR   rS   rT   )r@   r(   r+   rU   rV   s        r-   get_customer_by_emailr     s     
h%%hnn&=>8\*::h1155d;<DD!446,+  ,,V44  
8<=<SVHE'
 	

s)   DB0B5 4D5C>2C99C>>Dc                   K   	 t        t              j                  t        j                  |k(        }| j	                  |      j                         }|syd|_        t        j                         |_	        t        |d      r|j                  d|_        | j                          y# t        $ r"}t        j                  d|        Y d}~yd}~ww xY ww)zhActivate a customer by customer_id (alphanumeric unique identifier). Can restore soft-deleted customers.FTrC   NzError activating customer: )r   r   r$   r*   rN   rO   rf   r	   utcnow
updated_atrL   rC   r   rQ   rR   rS   r@   r*   r+   r]   rV   s        r-   activate_customerr     s     h%%h&:&:k&IJ::d#668!&oo/8\*x/B/B/N"&H
		 21#67s<   CAB% CAB% $C%	C.CCCCc                   K   	 t        t              j                  t        j                  |k(        }t	        t        d      r.|j                  t        j
                  j                  d            }| j                  |      j                         }|syd|_	        t        j                         |_        | j                          y# t        $ r"}t        j!                  d|        Y d}~yd}~ww xY ww)zFDeactivate a customer by customer_id (alphanumeric unique identifier).rC   NFTzError deactivating customer: )r   r   r$   r*   rL   rC   rM   rN   rO   rf   r	   r   r   r   rQ   rR   rS   r   s        r-   deactivate_customerr      s     h%%h&:&:k&IJ8\*::h1155d;<D::d#668"&oo/
		 4QC89s;   C2BC C20C C2	C/C*%C2*C//C2c                 h  K   	 t        t              j                  t        j                  |k(        }t	        t        d      r.|j                  t        j
                  j                  d            }| j                  |      j                         }|st        ddd      |j                  d      }d	|v r/|d	   *t        |d	   t              rd
j                  |d	         |d	<   |j                         D ]  \  }}t	        ||      st        |||       ! t!        j"                         |_        | j'                          | j)                  |       t+        j,                  |      S # t        $ r  t.        $ r7}t0        j3                  d|        t        dt5        |       dd      d}~ww xY ww)z+Update customer by ID using SQLAlchemy ORM.rC   NrD   rE   rF   rG   T)exclude_unsetrl   r2   zError updating customer: zFailed to update customer: rK   )r   r   r$   r*   rL   rC   rM   rN   rO   r   r   ry   rz   r{   r   setattrr	   r   r   r   r   r   rP   rQ   rR   rS   rT   )	r@   r*   rX   r+   r]   update_datar;   valuerV   s	            r-   update_customerr   7  s    )
h%%h&:&:k&IJ8\*::h1155d;<D::d#668,+  $..T.B [ [%8%D+f-t4&)hh{6/B&CF#'--/ 	0LE5x'%/	0 'oo/
		


8 ,,X66  
0451#a&:'
 	

s0   F2DE& AE& %F2&F/82F**F//F2c                   K   	 t        t              j                  t        j                  |k(        }t	        t        d      r.|j                  t        j
                  j                  d            }| j                  |      j                         }|syt        j                         |_        t        j                         |_        | j                          y# t        $ r"}t        j                  d|        Y d}~yd}~ww xY ww)zESoft delete customer by customer_id (alphanumeric unique identifier).rC   NFTzError deleting customer: )r   r   r$   r*   rL   rC   rM   rN   rO   r	   r   r   r   rQ   rR   rS   r   s        r-   delete_customerr   e  s     h%%h&:&:k&IJ8\*::h1155d;<D::d#668&oo/&oo/
		 045s<   DBC DAC D	DC<7D<DDrd   c                   K   	 t        t              j                  t        t        j                  |k(  t        j
                  |k(              }t        t        d      r.|j                  t        j                  j                  d            }| j                  |      j                         }|rt        j                  |      S y# t        $ r7}t        j                  d|        t!        dt#        |       dd      d}~ww xY ww)ab  
    Get customer by customer_id and merchant_id.
    
    Args:
        db: Database session
        customer_id: Customer account literal identifier
        merchant_id: Merchant ID to filter by
        
    Returns:
        CustomerSchema: Customer data if found, None otherwise
        
    Raises:
        APIException: If database error occurs
    rC   Nz+Error getting customer by account_literal: z0Failed to retrieve customer by account_literal: rK   rF   rG   )r   r   r$   r   r*   rd   rL   rC   rM   rN   rO   r   rP   rQ   rR   rS   r   rT   )r@   r*   rd   r+   rU   rV   s         r-   get_customer_by_merchantr   |  s     
h%%$$3$$3
 8\*::h1155d;<DD!446!0088 
B1#FGFs1vhO'
 	

s)   DB=C D	D2C>>DDc                   K   	 t        t              j                  t        j                  |k(        }t	        t        d      r.|j                  t        j
                  j                  d            }| j                  |      j                         }|duS # t        $ r"}t        j                  d|        Y d}~yd}~ww xY ww)z6Check if a customer ID already exists in the database.rC   Nz&Error checking customer ID existence: T)r   r   r$   r*   rL   rC   rM   rN   rO   rQ   rR   rS   )r@   r*   r+   rU   rV   s        r-   rw   rw     s     
h%%h&:&:k&IJ8\*::h1155d;<DD!446T!! =aSAB/   CBB C	B?B:5C:B??Crs   c                   K   	 t        t              j                  t        j                  |k(        }|r"|j                  t        j                  |k(        }t        t        d      r.|j                  t        j                  j                  d            }| j                  |      j                         }|S # t        $ r"}t        j                  d|        Y d}~yd}~ww xY ww)z<Get customer contact by contact_id and optional customer_id.rC   Nz Error getting customer contact: )r   r   r$   rs   r*   rL   rC   rM   rN   rO   rQ   rR   rS   )r@   rs   r*   r+   rU   rV   s         r-   get_customer_contactr     s     o&,,_-G-G:-UV::o99[HID?L1::o88<<TBCDD!446 7s;<s/   C$B1B6 5C$6	C!?CC$C!!C$r^   c                   K   	 t        t              j                  t        j                  |k(        }t	        t        d      r.|j                  t        j
                  j                  d            }| j                  |      j                         }|duS # t        $ r"}t        j                  d|        Y d}~yd}~ww xY ww)z;Check if an account literal already exists in the database.rC   Nz*Error checking account literal existence: T)r   r   r$   r^   rL   rC   rM   rN   rO   rQ   rR   rS   )r@   r^   r+   rU   rV   s        r-   rx   rx     s     
h%%h&>&>/&QR8\*::h1155d;<DD!446T!! A!EFr   c                 ~  K   t        | |       d{    i dddddddd	d
ddi ddddddddddddddddddddddd d!d"d#d$d%d&dd'dd(dd)g id*dd+dd,d-d.|d"dd/dd0dd1dd2dd3dd4dddddd5d6i dddd7dd8dd	d
d9di d:d;d<d=d>dd?dddd@dAdddddBddCdDd dEd.|ddddd$dFd&dd'di dGdd(dd)ddHg dIddJddKdLdMddNddOddPddQddRdSdTddUddddddVddWd*dd+dd,d-d.|d"dd/dd0dd1dd2dd3dd4ddddddXd6gdYddZd[S 7 (w)\z8Get customer activities - currently returns static data.Nlevelru   eventzEVENTS.CUSTOMER.CONTACT.CREATErH   zContact CreatedrJ   r]   	submodulerh   r   rb   zGarry PorterdesignationCEOrelationr(   zgarryporter375@yopmail.comrc   z+12565537655office_phone	tilled_idrf   Tdobz1992-01-10T18:30:00rr   zhttps://www.dreamztech.comtimezonezAmerica/Denverr      rs   con_HyGutVzqME42nXosr   z2025-04-04T12:33:05.705000r   rC   avatarr3   
created_bycreated_by_idrd   mer_DkhsfjDM28Kf7yPur*   
receipt_id
invoice_idpayment_request_idproduct_slugauthorization_typeauthorization_idz2025-04-04T12:33:05.843000)
ip_addressrc   contract_idcheckout_idr   zEVENTS.CUSTOMER.CREATEzNew customer createdaccountr)   
GBTF8E3339r   Falser   re   account_expires_onz2030-04-03T08:12:30.265000account_tax_idr^   592970   z2025-04-04T12:33:05.480000r5   	tags_listr4   rm   is_registeredFuser_accountdefault_addressbilling_addressshipping_addressr6   r%   z	GBT Corp.middle_namer'   zGBT Corporation)business_legal_namelast_active_datez2025-04-04T12:33:05.596000   zActivities fetched successfullyr   rI   successrH   )rW   )r@   r*   s     r-   get_customer_activitiesr    s     r;
'''
**9* ,* *	*
 Y*  N!5  9	
 ^ #D     0 ;  0 # !"8 !"> !$  !$!" d#$  %*4 d5*6  7*8 59*: {;*< d=*> d?*@ dA*B %dC*D E*F %dG*H #DI*J ###:S*V<<1< 1< *	<
 Y<  %<%#W% #D% 	%
 #D% )*F%  0% ;% %d% &x% #% ";%  %  % !">%  !$!%" !$#%$ %%& d'%(  )%*  +%, -%.  /%0 $U1%2 #D3%4 &t5%6 &t7%8 '9%: "4;%< !+=%> "4?%@  A%B 9C%D ^E%F ,=(,I%<X dY<Z  [<\ 5]<^ {_<` da<b dc<d de<f %dg<h i<j %dk<l #Dm<n ###:w<Yi
T 4[n n (s   D=D:D(D=rm   c           	         K   ddddddddddd	d
dddgdddddd	d
ddddddddgddddddddddd	d
dddgdddddS w)z5Get customer summary - currently returns static data.   IBMNg    <a<A)r   r%   r'   total_amount   Masong     "Aw   zRITZ Solutiong    @w@   Holigang     @)top_customerslowest_customersmost_frequent_customersr  TzCustomer Summary detailsr  rt   )r@   rm   s     r-   get_customer_summaryr!  Q  s      "'!%$-	 ")!%$,	 "1!%$,	, "+!%$*	 "1!%$,	 ")!%$,	!, "'!%$-	 ")!%$,	 "1!%$,	(S=
| -CB Bs   AAactioncustomer_idsc                   K   	 t        |      dkD  rt        ddd      g g t        |      ddd}|D ]  }	 t        t              j	                  t        j
                  |k(        }| j                  |      j                         }|s%|d   j                  |d	d
       |dxx   dz  cc<   zt        |d      rB|j                  6|dk(  rn0|dk(  r%|d   j                  |dd
       |dxx   dz  cc<   |dk(  r	 |dk(  rt        | |       d{   }d}na|dk(  rt        | |       d{   }d}nE|dk(  rt        | |       d{   }d}n)|d   j                  |d| d
       |dxx   dz  cc<   E|r)|d   j                  |d| dd       |dxx   dz  cc<   n(|d   j                  |d| dd
       |dxx   dz  cc<    |S 7 7 7 # t        $ rS}	t        j!                  d| d|	        |d   j                  |t#        |	      d
       |dxx   dz  cc<   Y d}	~	d}	~	ww xY w# t        $ r7}	t        j!                  d |	        t        d!t#        |	       d"d      d}	~	ww xY ww)#zPPerform bulk actions on multiple customers. Limited to 10 customers per request.r[   z7Bulk action limited to maximum 10 customers per requesti  rF   rG   r   )r  failedtotal_processedsuccess_countfailed_countr%  rD   )r*   rS   r(  r\   rC   Nactivate
deactivatezCustomer is already deleteddelete	activateddeactivateddeletedzInvalid action: r  z	Customer z successfully)r*   rH   r'  z
Failed to z	 customerzError processing customer rp   z Error in bulk customer actions: z Failed to perform bulk actions: rK   )r   r   r   r   r$   r*   rN   rO   r9   rL   rC   r   r   r   rQ   rR   rS   rT   )
r@   r"  r#  r   r*   r+   r]   r  action_verbrV   s
             r-   bulk_customer_actionsr0    s    _
|r!Q+  "<0
 ( D	-KC-h'--h.B.Bk.QR::d+>>@H%,,'2!5.  N+q0+ 8\2x7J7J7V+</)00+6%B2   /14/ 8+ Z'$5b+$FFG"-K|+$7K$HHG"/Kx'$3B$DDG"+KH%,,'2#3F8!<.  N+q0+I&--'2%.{m=#I/  O,1,H%,,'2#-fXY!?.  N+q0+yD	-L K G I E.  -9+bLM!((#. V*  '1,''-  
7s;<6s1vh?'
 	

s   I83H5 A4G,H5 -AG4H5 5GGG+G,GG.G6H5 8AGH5 I8GGG	H2AH-'H5 -H22H5 5	I5>2I00I55I8)N)r[   r   T)F)G__doc__typingr   r   r   r   r   r   r	   loggingfastapir
   r   
sqlalchemyr   r   r   r   r   r   sqlalchemy.ormr   r   "src.apps.customers.models.customerr   src.apps.base.models.addressr   *src.apps.customers.schemas.customer_commonr   r   ,src.apps.customers.schemas.customer_requestsr   r   r   src.helpers.paginationr   src.core.functionsr   src.core.exceptionsr   "src.apps.merchants.models.merchantr   *src.apps.customers.models.customer_contactr   r}   repydanticr    	getLogger__name__rR   rT   r.   r?   rW   r   intboolr   r   r   r   r   r   r   rw   r   rx   r  r!  r0  rt   r/   r-   <module>rF     s   ; :   ) 9 9 0 7 0 
 2 * , 7 0 F  	 $			8	$s 3 ,
7 
 
c 
^ 
Dr>r>.r> 54/0#56r>p II#I I 	I
 I 4tN+S0112IX
G 
C 
N 
8 c d 0'   .+
g +
C +
Hc +
hv +
\g C D .'
w '
S '
s '
W_`nWo '
Tw S T $ #  o	,7 S T tg tC tD tnE7 Et E EPa
G a
S a
S	 a
VZ[^`c[cVd a
r/   