
    $1iV9                        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 ddlmZ ddl m!Z!  e	jD                  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
Address Services for customer address management.
    )DictListOptionalTupleUnion)datetimetimezoneN)HTTPExceptionstatus)selectand_or_funcdescasc)Sessionselectinload)Address)Customer)AddressSchemaAddressCreateRequestSchema)QueryPaginator)APIExceptiondbcustomer_idaddress_datareturnc           	      0  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      }|j                  |d	<   |j                  |d
<   t        t              j                  t        t        j                  |j                  k(  t	        t        d      rt        j
                  j                  d      nd            }| j                  |      j                         j!                         }t#        |      dk(  rd|d<   nD|j%                  dd      r-|D ]'  }|j&                  sd|_        | j)                  |       ) nd|d<   d|vrd|d<   t        di |}	| j)                  |	       | j+                          | j-                  |	       t.        j1                  d| d|	j                          t3        j4                  |	      S # t        $ r  t6        $ r:}
t.        j9                  d| d|
        t        dt;        |
       dd      d}
~
ww xY ww)z$Create a new address for a customer.
deleted_atNCustomer not found  customers.address_servicesmessagestatus_codemoduleT)exclude_noner   merchant_idr   use_as_defaultF	is_activezAddress created for customer z
 with ID: z$Error creating address for customer : zFailed to create address:    )r   r   wherer   hasattrr   is_executescalar_one_or_noner   
model_dumpidr(   r   r   scalarsalllengetr)   addcommitrefreshloggerinfor   model_validate	Exceptionerrorstr)r   r   r   customer_stmtcustomeraddress_dictexisting_addresses_stmtexisting_addressesaddraddress_objes              a/var/www/html/hwPaymentPortal-be-dev/hw-payment-portal-api/src/apps/customers/address_services.pycreate_customer_addressrK      s`    C
x(..x/C/C{/RS8\*)//0C0C0G0G0MNM::m,??A,3  $..D.A '/kk]#&.&:&:]# #)/"7"7##x{{2070N""&&t,TX#
  ZZ(?@HHJNNP !"a'-1L)*  0%8. %D**.3+t% 27-. l*(,L% --
{
		


;3K=
;>>JZ[\++K88  
;K=1#NO0Q9/
 	

s0   JF"I 'BI JJ5JJJlimitoffsetaddress_typer*   r)   searchc                   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            }
|r"|
j                  t        j                  |k(        }
|"|
j                  t        j                  |k(        }
|"|
j                  t        j                  |k(        }
|rd| d}|
j                  t        t        j                   j#                  |      t        j$                  j#                  |      t        j&                  j#                  |      t        j(                  j#                  |      t        j*                  j#                  |      t        j,                  j#                  |                  }
|
j/                  t1        t        j2                              }
t5        |
t6        | t        d| d	||d
      }|j9                         }|j:                  |j<                  |j>                  |j@                  |jB                  |jD                  |jF                  |jH                  dS # t        $ r  tJ        $ r0}tL        jO                  d| d|        g dd|dddddcY d}~S d}~ww xY ww)z)Get paginated list of customer addresses.r   Nr    r!   r"   r#   %z/api/v1/customers/z
/addressesT)queryschemar   modelurlrM   rL   use_orm)datatotalpageper_pagenextpreviousfirstlastz%Error getting addresses for customer r+   r      )(r   r   r.   r   r/   r   r0   r1   r2   r   r   r4   rN   r*   r)   r   address_line_1ilikeaddress_line_2citystatecountryzipcodeorder_byr   
created_atr   r   paginateresultrX   rY   rZ   r[   r\   r]   r^   r?   r<   r@   )r   r   rL   rM   rN   r*   r)   rO   rB   rC   stmtsearch_term	paginatorpagination_resultrI   s                  rJ   get_customer_addressesro   a   s    R
x(..x/C/C{/RS8\*)//0C0C0G0G0MNM::m,??A,3  g$$W%8%8HKK%GH 7L)::g0044T:;D ::g22lBCD ::g//9<=D%::g44FGDfXQ-K::**00=**00=LL&&{3MM''4OO))+6OO))+6	D }}T'"4"456 # $[M<	
	 &..0 &,,&,,%**)22%**)22&,,%**	
 		
   
<[MA3OP	
 		

s5   MLL
 	M
M%MMMMM
address_idc           	        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)z,Get a specific address by ID for a customer.r   Nr    r!   r"   r#   Address not foundzError getting address  for customer r+   zFailed to retrieve address: r,   )r   r   r.   r   r/   r   r0   r1   r2   r   r   r   r4   r   r>   r?   r<   r@   rA   )r   r   rp   rB   rC   rk   addressrI   s           rJ   get_customer_addressru      s    *
x(..x/C/C{/RS8\*)//0C0C0G0G0MNM::m,??A,3  g$$

j(##x{{2
 7L)::g0044T:;D**T"557+3  ++G44  
-j\}TVWXVYZ[23q6(;/
 	

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      d|v r|d   rt        t              j                  t        t        j                  |j                  k(  t        j                  |j                  k7  t	        t        d      rt        j
                  j                  d      nd	            }| j                  |      j                         j                         }	|	D ]O  }
|
j                  sd
|
_        t!        j"                  t$        j&                        |
_        | j+                  |
       Q |j-                         D ]"  \  }}t	        ||      s|t/        |||       $ t!        j"                  t$        j&                        |_        | j1                          | j3                  |       t4        j7                  d| d|        t9        j:                  |      S # t        $ r  t<        $ r=}t4        j?                  d| d| d|        t        dtA        |       dd      d}~ww xY ww)zUpdate a customer address.r   Nr    r!   r"   r#   rr   r)   TFAddress z updated for customer zError updating address rs   r+   zFailed to update address: r,   )!r   r   r.   r   r/   r   r0   r1   r2   r   r   r   r4   r5   r6   r)   r   nowr	   utc
updated_atr9   itemssetattrr:   r;   r<   r=   r   r>   r?   r@   rA   )r   r   rp   r   rB   rC   rk   rt   other_addresses_stmtother_addressesrG   fieldvaluerI   s                 rJ   update_customer_addressr      s    F
x(..x/C/C{/RS8\*)//0C0C0G0G0MNM::m,??A,3  g$$

j(##x{{2
 7L)::g0044T:;D**T"557+3  |+=M0N#)'?#8#8''8;;6JJ'**,4;G\4RG&&**40X\$  !jj)=>FFHLLNO' !&&*/D'&.ll8<<&@DOFF4L	! )..0 	/LE5w&5+<.	/ &\\(,,7
		


7hzl*@NO++G44  
.zl.UWXYWZ[\0Q9/
 	

s=   M;H4L) 9A$L) L) !BL) (M;)M8;8M33M88M;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        t              j                  t        t        j                  |j                  k(  t	        t        d      rt        j
                  j                  d      nd            }| j                  |      j                         j                         }t        |      d	k  rt        d
dd      |j                   r|D 	cg c]  }	|	j                  |j                  k7  s|	  }
}	|
rh|
D 	cg c]  }	|	j"                  s|	 }}	|r|d   n|
d   }d|_        t%        j&                  t(        j*                        |_        | j/                  |       t%        j&                  t(        j*                        |_        t%        j&                  t(        j*                        |_        | j1                          t2        j5                  d| d|        yc c}	w c c}	w # t        $ r  t6        $ r=}t2        j9                  d| d| d|        t        dt;        |       dd      d}~ww xY ww)zSoft delete a customer address.r   Nr    r!   r"   r#   rr   Tr_   zHCannot delete the only address. Customer must have at least one address.i  r   rw   z deleted for customer zError deleting address rs   r+   zFailed to delete address: r,   )r   r   r.   r   r/   r   r0   r1   r2   r   r   r   r4   r5   r6   r7   r)   r*   r   rx   r	   ry   rz   r9   r:   r<   r=   r?   r@   rA   )r   r   rp   rB   rC   rk   rt   all_addresses_stmtall_addressesrG   r~   active_addressesnew_defaultrI   s                 rJ   delete_customer_addressr   D  s    L
x(..x/C/C{/RS8\*)//0C0C0G0G0MNM::m,??A,3  g$$

j(##x{{2
 7L)::g0044T:;D**T"557+3  $G_22##x{{2070N""&&t,TX
 

#56>>@DDF }"b3  !!0=WGJJAVtWOW5D#WTD#W #W5E.q1?[\K]-1*)1hll)C&{#%\\(,,7%\\(,,7
		hzl*@NO X $X   
.zl.UWXYWZ[\0Q9/
 	

sT   NH(M ,L7L7M L<)L<-C	M 6N7
M N8NNN)
   r   NNNN).__doc__typingr   r   r   r   r   r   r	   loggingfastapir
   r   
sqlalchemyr   r   r   r   r   r   sqlalchemy.ormr   r   src.apps.base.models.addressr   "src.apps.customers.models.customerr   src.apps.base.schemas.commonr   r   src.helpers.paginationr   src.core.exceptionsr   	getLogger__name__r<   rA   rK   intboolro   ru   dictr   r   r-       rJ   <module>r      s   6 5 '  ) 9 9 0 0 7 R 1 ,			8	$I
I
I
 -I
 	I
^ "& $%) ]
]
]
 ]
 	]

 3-]
 ~]
 TN]
 SM]
 
]
@0
0
0
 0
 	0
fM
M
M
 M
 	M

 M
`R
R
R
 R
 
	R
r   