
    Uv6i6                        d Z ddlmZmZ ddlmZ ddl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 dd
lmZmZm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# ddl$m%Z& ddl'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/m0Z0  e
jb                  e2      Z3dede4defdZ5d Z6dede7dede#de(f
dZ8	 	 	 d2dede7d e4d!e4d"ee7   defd#Z9dede7de4de(fd$Z:dede7de4ded%e#de(fd&Z;dede7de4d'e#dee7e<f   f
d(Z=ded)ed*e4defd+Z>dede4dee   fd,Z?d3ded-e4d e4dee   fd.Z@ded/e4d)edefd0ZAdede4deBfd1ZCy)4z/
Notes services for business logic operations.
    )ListOptional)Session)selectupdate)datetimeN)APIException)status)Note)
NoteSchemaNoteCreateRequestSchemaNoteUpdateRequestSchema)Dictr   r   TupleUnion)r   timezone)HTTPExceptionr
   )r   and_or_funcdescasc)r   selectinload)Customer)User)get_customer)NoteResponseSchemaNoteCreateSchemaNoteUpdateSchemaNoteListResponseSchema)r   r   )QueryPaginator)generate_iddbnote_idreturnc                     | j                  t        t              j                  t	        t        j
                              j                  t        j                  |k(              j                         S )z
    Helper function to load a note with its relationships.
    
    Args:
        db: Database session
        note_id: ID of the note to load
    
    Returns:
        Note with loaded relationships
    )	executer   r   optionsr   
created_bywhereid
scalar_one)r#   r$   s     U/var/www/html/hwPaymentPortal-be-dev/hw-payment-portal-api/src/apps/notes/services.py_load_note_with_relationsr.   .   sK     ::t	doo.	/	tww'!	" jl	    c                  l    t        t              j                  t        t        j                              S )z
    Helper function to build a base note query with relationships loaded.
    
    Returns:
        SQLAlchemy select statement with relationships pre-loaded
    )r   r   r(   r   r)    r/   r-    _build_note_query_with_relationsr2   @   s"     $<T__ =>>r/   customer_id	note_datacreated_by_userc                    K   	 t        | |       d{   }| j                  t        |j                        }|st	        ddd      t        j                         }t        |j                  |j                  ||      }|j                  j                  |       | j                  |       | j                          | j                  |       t        | |j                        }t        j!                  d| d|j                          t#        j$                  |      S 7 	# t        $ r  t&        $ rJ}	t        j)                  d	| d
|	        | j+                          t	        dt-        |	       dd      d}	~	ww xY ww)z!Create a new note for a customer.NzCustomer not found  notes.servicesmessagestatus_codemodule)descriptioncreated_by_id
created_at
updated_atzNote created for customer z
 with ID: z!Error creating note for customer : zFailed to create note:   )get_customer_servicegetr   r+   r	   r   utcnowr   r=   customerappendaddcommitrefreshr.   loggerinfor   model_validate	Exceptionerrorrollbackstr)
r#   r3   r4   r5   customer_schemarF   current_timenote_objnote_with_relationses
             r-   create_customer_noterW   J   s\    ,
 4R EE 66(O$6$67,'   (!--),,##	
 	  *
x
		


8 8HKKH0Z}UV!001DEE? FB   
8RsKL
-c!fX6#
 	

s:   E>D DDD E>D E;1AE66E;;E>limitoffsetsearchc           
        K   	 t        | |       d{   }t               j                  t        j                        j                  t        j                  |j                  k(        }|j                  t        j                  j                  d            }|r4d| d}|j                  t        j                  j                  |            }|j                  t        t        j                              }t        |t         | t        d| d||d      }|j#                         }	|	j$                  |	j&                  |	j(                  |	j*                  |	j,                  |	j.                  |	j0                  |	j2                  dS 7 l# t4        $ r  t6        $ r:}
t8        j;                  d| d	|
        t5        d
t=        |
       dd      d}
~
ww xY ww)z+Get paginated list of notes for a customer.N%z/api/v1/customers/z/notesT)queryschemar#   modelurlrY   rX   use_orm)datatotalpageper_pagenextpreviousfirstlastz!Error getting notes for customer rA   zFailed to get customer notes: rB   r8   r9   )rC   r2   joinr   rF   r*   r   r+   
deleted_atis_r=   ilikeorder_byr   r?   r!   r   paginateresultrc   rd   re   rf   rg   rh   ri   r	   rN   rK   rO   rQ   )r#   r3   rX   rY   rZ   rR   stmtsearch_term	paginatorpagination_resultrV   s              r-   get_customer_notesru      s    8
 4R EE
 -.T$-- U8;;/"4"445 	 zz$//--d34 fXQ-K::d..44[ABD }}T$//23 #%$[M8	
	 &..0 &,,&,,%**)22%**)22&,,%**	
 		
G F\   
8RsKL4SVH=#
 	

s9   GF E?E*F >G?F G5G		GGc           	        K   	 t        | |       d{   }t               j                  t        j                        j                  t        t        j                  |k(  t        j                  |j                  k(              }|j                  t        j                  j                  d            }| j                  |      j                         }|st        ddd      t        j                  |      S 7 # 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 customer note by ID.NNote not foundr7   r8   r9   zError getting note  for customer rA   zFailed to get note: rB   )rC   r2   rj   r   rF   r*   r   r+   r   rk   rl   r'   scalar_one_or_noner	   r   rM   rN   rK   rO   rQ   )r#   r3   r$   rR   rq   noterV   s          r-   get_customer_noter{      s,    #
 4R EE -.T$-- UGGw&KK?#5#55 	 zz$//--d34zz$224('  "0066/ F2   
*7)>+bQRPSTU*3q6(3#
 	

s9   E
C8 C6C!C8 5E
6C8 8E
8EEE
updated_by_userc           	      "  K   	 t        | |       d{   }t        t              j                  t        j                        j                  t        t        j                  |k(  t        j                  |j                  k(              }|j                  t        j                  j                  d            }| j                  |      j                         }|st        ddd      |j                  d      }|j                         D ]  \  }	}
t!        ||	      st#        ||	|
       ! t%        j&                         |_        | j+                          | j-                  |       t/        | |j                        }t0        j3                  d| d	|        t5        j6                  |      S 7 # 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 note.Nrw   r7   r8   r9   T)exclude_nonezNote retrieved for customer z, note ID: zError updating note rx   rA   zFailed to update note: rB   ) rC   r   r   rj   rF   r*   r   r+   r   rk   rl   r'   ry   r	   
model_dumpitemshasattrsetattrr   rE   r@   rI   rJ   r.   rK   rL   r   rM   rN   rO   rP   rQ   )r#   r3   r$   r4   r|   rR   rq   rz   update_dictkeyvaluerU   rV   s                r-   update_customer_noter      s    4
 4R EE 4LT$-- UGGw&KK?#5#55 	 zz$//--d34zz$224('   ***=%++- 	*JCtS!c5)	*
 #//+
		


4 8DGGD2;-{7)TU!001DEEO FR   
+G9N;-rRSQTUV
-c!fX6#
 	

sA   HF- F*DF- BF- )H*F- -H?AHHHdeleted_by_userc           	      .  K   	 t        | |       d{   }t        t              j                  t        j                        j                  t        t        j                  |k(  t        j                  |j                  k(              }|j                  t        j                  j                  d            }| j                  |      j                         }|st        ddd      t        j                         |_	        | j!                          t"        j%                  d| d|        dd	d
dS 7 # t        $ r  t&        $ rM}t"        j)                  d| d| d|        | j+                          t        dt-        |       dd      d}~ww xY ww)zSoft delete a customer note.Nrw   r7   r8   r9   zNote z deleted for customer TzNote deleted successfully   )successr:   r;   zError deleting note rx   rA   zFailed to delete note: rB   )rC   r   r   rj   rF   r*   r   r+   r   rk   rl   r'   ry   r	   r   rE   rI   rK   rL   rN   rO   rP   rQ   )r#   r3   r$   r   rR   rq   rz   rV   s           r-   delete_customer_noter   .  sj    .
 4R EE 4LT$-- UGGw&KK?#5#55 	 zz$//--d34zz$224('  #//+
		eG9$:;-HI2
 	
; FF   
+G9N;-rRSQTUV
-c!fX6#
 	

s:   FD3 D0DD3 /F0D3 3FAFFFpayloadr>   c                 |  K   	 t        |j                  |      }| j                  |       | j                          | j	                  |       t        j                  |      S # t        $ rN}| j                          t        j                  d|        t        t        i t        j                  d      d}~ww xY ww)zCreate a new note.)r=   r>   zError creating note: zCould not create noter<   rO   r;   r:   N)r   r=   rH   rI   rJ   r   rM   rN   rP   rK   rO   r	   __name__r
   HTTP_500_INTERNAL_SERVER_ERROR)r#   r   r>   rz   rV   s        r-   create_noter   j  s     
 3 3=Q
t
		


4((.. 

,QC01==+	
 	

s*   B<AA" !B<"	B9+A	B44B99B<c                   K   t        t              j                  t        j                  |k(  t        j                  j                  d            }| j                  |      j                         }|rt        j                  |      S dS w)zRetrieve a note by ID.N)
r   r   r*   r+   rk   rl   r'   ry   r   rM   )r#   r$   rq   rz   s       r-   get_note_by_idr     sc     $<dgg0$//2E2Ed2KLD::d..0D.2:$$T*<<s   BBskipc                   K   t        t              j                  t        j                  j	                  d            j                  t        j                  j                               j                  |      j                  |      }| j                  |      j                         j                         }|D cg c]  }t        j                  |       c}S c c}w w)zList notes with pagination.N)r   r   r*   rk   rl   rn   r?   r   rY   rX   r'   scalarsallr   rM   )r#   r   rX   rq   notesns         r-   
list_notesr     s      	t	t""4(	)	$//&&(	)		u 	 JJt$$&**,E278QJ%%a(888s   B6C8CC	object_idc                   K   t        t              j                  t        j                  |k(  t        j                  j                  d            }| j                  |      j                         }|s!t        t        i t        j                  d      |j                  d      }|rt        j                         |d<    t        t              j                  t        j                  |k(        j                   di |}| j                  |       | j#                          | j%                  |       t'        j(                  |      S w)zUpdate an existing note by ID.Nrw   r   T)exclude_unsetr@   r1   )r   r   r*   r+   rk   rl   r'   ry   r	   r   r
   HTTP_404_NOT_FOUNDr   r   rE   r   valuesrI   rJ   r   rM   )r#   r   r   rq   rz   update_dataupds          r-   update_note_by_idr     s      $<dgg2DOO4G4G4MND::d..0D11$	
 	
 $$4$8K$,OO$5L!=fTl  I!56==LL


3
		


4$$T**s   EEc                   K   t        t              j                  t        j                  |k(  t        j                  j                  d            }| j                  |      j                         }|s!t        t        i t        j                  d      t        t              j                  t        j                  |k(        j                  t        j                               }| j                  |       | j!                          yw)z)Soft delete a note by setting deleted_at.Nrw   r   )rk   T)r   r   r*   r+   rk   rl   r'   ry   r	   r   r
   r   r   r   r   rE   rI   )r#   r$   rq   rz   r   s        r-   delete_note_by_idr     s     $<dgg0$//2E2Ed2KLD::d..0D11$	
 	
 ,

TWW/
0
7
78??CT
7
UCJJsOIIKs   DD)
   r   N)r      )D__doc__typingr   r   sqlalchemy.ormr   
sqlalchemyr   r   r   loggingsrc.core.exceptionsr	   fastapir
   src.apps.notes.models.noter   src.apps.notes.schemas.commonr   r   r   r   r   r   r   r   r   r   r   r   r   r   "src.apps.customers.models.customerr   src.apps.users.models.userr   src.apps.customers.servicesr   rC   "src.apps.notes.schemas.note_commonr   r   r   r    $src.apps.notes.schemas.note_requestssrc.helpers.paginationr!   src.core.functionsr"   	getLoggerr   rK   intr.   r2   rQ   rW   ru   r{   r   anyr   r   r   r   r   boolr   r1   r/   r-   <module>r      sz   " " %   ,  + f f 6 5 '  ) 9 9 0 + 7 + L  2 , * 
		8	$' C D $?3
3
3
 '3
 	3

 3
r  @
@
@
 @
 	@

 SM@
 
@
F)
)
)
 )
 	)
X<
<
<
 <
 '	<

 <
 <
~5
5
5
 5
 	5

 
#s(^5
x

$
 
 	
.=W =s =x
7K =
9 
9 
9 
9T*EU 
9+++ %+ 	+8 # $ r/   