
    jq)                        d 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
mZmZmZmZmZmZ ddlmZ ddlmZ  e       Z edej,                   ed	e ed
      d       ede ed      d            Z edej,                   ed	e ed
      d       ede ed      d            Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d  d!e      Z y")#z'
SQLAlchemy ORM models for TripTalley.
    )datetime)Decimal)Optional)
ColumnIntegerStringDateTimeDateNumeric
ForeignKeyTableEnumUniqueConstraint)declarative_base)relationship
user_groupuser_idusers.idTprimary_keygroup_id	groups.id	user_triptrip_idtrips.idc                      e Zd ZdZdZ eed      Z e ed      ddd      Z	 e ed      d      Z
 e ed      d      Z e ed	      d
      Z eeej                  d      Z eeej                  ej                  d      Z eded      Z eded      Z edd      Z edd      Z edd      Z edd      ZdefdZy)Userz
    User account model.
    
    Users can belong to multiple groups and trips.
    Each trip has a settlement currency preference.
    usersTr      F)uniquenullableindexr!      USDdefaultr'   r!   r'   onupdater!   Group	secondaryback_populatesTripPaymentzPayment.from_user_idforeign_keyszPayment.to_user_idExpensepayerr.   ExpenseParticipantuserreturnc                 V    d| j                    d| j                   d| j                   dS )Nz	<User(id=z	, email='z	', name='')>)idemaildisplay_nameselfs    5/srv/projects/triptalley/backend/app/models/models.py__repr__zUser.__repr__=   s-    477)9TZZL	$BSBSATTWXX    N)__name__
__module____qualname____doc____tablename__r   r   r;   r   r<   hashed_passwordr=   home_currencyr	   r   utcnow
created_at
updated_atr   r   groupsr   tripspayments_madepayments_receivedexpenses_paidexpense_participantsstrrA    rB   r@   r   r   !   s     M	T	*B6#;te4HEVC[59O&+6L6!9e4M (//EJJ(//HOO!&(J 'ZPF9WME 9OPM$Y=QR 7CM'(<VTY# YrB   r   c                      e Zd ZdZdZ eed      Z e ed      d      Z	 e ed            Z
 eeej                  d	      Z eeej                  ej                  d
      Z eded      Z edd      ZdefdZy)r+   z`
    Group model for organizing trips.
    
    Groups can have members and multiple trips.
    rM   Tr   r   Fr#     r(   r)   r   r,   r/   groupr5   r8   c                 <    d| j                    d| j                   dS )Nz
<Group(id=, name='r:   )r;   namer>   s    r@   rA   zGroup.__repr__V   s    DGG9HTYYKs;;rB   N)rC   rD   rE   rF   rG   r   r   r;   r   rZ   descriptionr	   r   rJ   rK   rL   r   r   r   rN   rS   rA   rT   rB   r@   r+   r+   A   s    
 M	T	*B&+.D&K (//EJJ(//HOO!&(J :hOE8E<# <rB   r+   c                   ~   e Zd ZdZdZ eed      Z ee ed            Z	 e e
d      d      Z e e
d	            Z eed      Z eed      Z e e
d
      d      Z eeej&                  d      Z eeej&                  ej&                  d      Z edd      Z eded      Z edd      ZdefdZy)r/   z
    Trip model for tracking expenses.
    
    Each trip has:
    - A settlement currency (e.g., the local currency of the destination)
    - A start/end date
    - Participants
    - Expenses
    rN   Tr   r   r   Fr#   rV   r$   r%   r&   r(   r)   r+   r5   r   r,   r3   tripr8   c                 V    d| j                    d| j                   d| j                   dS )Nz	<Trip(id=rY   z', currency='r:   )r;   rZ   settlement_currencyr>   s    r@   rA   zTrip.__repr__|   s-    477)8DII;mDD\D\C]]`aarB   N)rC   rD   rE   rF   rG   r   r   r;   r   r   r   rZ   r[   r
   
start_dateend_dater_   r	   r   rJ   rK   rL   r   rW   r   r   expensesrS   rA   rT   rB   r@   r/   r/   Z   s     M	T	*Bgz+67H&+.D&K u-JdU+H !E: (//EJJ(//HOO!&(J 9E9WMEIf=Hb# brB   r/   c                      e Zd ZdZdZ eed      Z ee ed      d      Z	 ee ed      d      Z
 eed      Z e ed	      d      Z eed      Z e ed
            Z e ed            Z eeej(                  d      Z eeej(                  ej(                  d      Z edd      Z edd      Z eddd      ZdefdZedefd       Zy)r3   z
    Expense model for tracking individual expenses.
    
    Each expense has:
    - A payer (who paid initially)
    - A total amount in original currency
    - A date spent
    - Participants and their shares
    rb   Tr   r   Fr#   r   r$   d   i  r(   r)   r/   r5   r   rQ   r6   expensezall, delete-orphan)r.   cascader8   c                 n    d| j                    d| j                   d| j                   | j                   dS )Nz<Expense(id=
, trip_id=z	, amount=)>)r;   r   original_amount_minororiginal_currencyr>   s    r@   rA   zExpense.__repr__   sB    twwiz$,, @445d6L6L5MRQ 	RrB   c                 H    ddl m}  || j                  | j                        S )z"Get amount as Decimal for display.r   )
from_minor)app.core.moneyrm   rj   rk   )r?   rm   s     r@   amount_decimalzExpense.amount_decimal   s      	.$44d6L6LMMrB   N) rC   rD   rE   rF   rG   r   r   r;   r   r   payer_idrj   r   rk   r
   spent_oncategoryr[   r	   r   rJ   rK   rL   r   r]   r4   participantsrS   rA   propertyr   ro   rT   rB   r@   r3   r3      s    M	T	*BWj4uEGgz*5FH #7U;vay59 dU+HfSk"H%K (//EJJ(//HOO!&(J z:D@E 4Y';=LR# R N N NrB   r3   c                       e Zd ZdZdZ ee ed      d      Z ee ed      d      Z	 eed      Z
 eeej                  d	      Z ed
d      Z edd      ZdefdZy)r6   z
    Join table for expense participants and their shares.
    
    Each expense can have multiple participants, each with a specified share.
    rR   zexpenses.idTr   r   Fr#   r(   r3   rs   r5   r   r8   c                 V    d| j                    d| j                   d| j                   dS )Nz<ExpenseParticipant(expense_id=z
, user_id=z, share=ri   )
expense_idr   share_minorr>   s    r@   rA   zExpenseParticipant.__repr__   s8    1$//1B C<<.1A1A0B"F 	GrB   N)rC   rD   rE   rF   rG   r   r   r   rw   r   rx   r	   r   rJ   rK   r   re   r7   rS   rA   rT   rB   r@   r6   r6      s}    
 +MM!:MJWj4$GG51K (//EJJ 9^DG/EFDG# GrB   r6   c                   &   e Zd ZdZdZ eed      Z eedd      Z	 e e
d      d      Z e e
d      d      Z eed      Z eed      Z e e
d	            Z eeej$                  
      Z edddd      fZdefdZedefd       Zy)FXRatez
    Cached FX rate for historical lookups.
    
    Stores rates by date, from_currency, to_currency to avoid repeated API calls.
    fx_ratesTr   F)r!   r"   r$   r#   2   r&   datefrom_currencyto_currencyuq_fx_rate_lookup)rZ   r8   c                     d| j                    d| j                   d| j                   d| j                   d| j                  ddS )Nz<FXRate(date=,    →=.06dri   )r}   r~   r   
rate_major
rate_minorr>   s    r@   rA   zFXRate.__repr__   sM    		{"T-?-?,@DDTDTCUUV??#1T__S$9= 	>rB   c                 p    t        | j                        t        | j                        t        d      z  z   S )zGet rate as Decimal.i@B )r   r   r   r>   s    r@   rate_decimalzFXRate.rate_decimal   s+     t''$//*BWWEU*UUUrB   N)rC   rD   rE   rF   rG   r   r   r;   r
   r}   r   r~   r   r   r   sourcer	   r   rJ   
fetched_atr   __table_args__rS   rA   rt   r   r   rT   rB   r@   rz   rz      s    
 M	T	*B$d3D6!9u5MU3K %0J%0J F2JF(//:J 	-0	2N
># > Vg V VrB   rz   c                      e Zd ZdZdZ eed      Z ee ed      d      Z	 ee ed      d      Z
 ee ed      d      Z eed      Z e ed	      d      Z e ed
      d      Z e ed            Z eeej&                  d      Z ee      Z ed      Z ede
g      Z edeg      ZdefdZy)r0   zc
    Settlement payment record.
    
    Stores actual transfers made to settle trip balances.
    paymentsTr   r   Fr#   r   r$      pendingr&   r   r(   r/   r   r1   r8   c                     d| j                    d| j                   d| j                   d| j                   d| j                   | j
                   dS )Nz<Payment(id=rh   r   r   r   ri   )r;   r   from_user_id
to_user_idamount_minorcurrencyr>   s    r@   rA   zPayment.__repr__
  sT    twwiz$,,r$$%S(94;L;L:Mdmm_\^` 	arB   N)rC   rD   rE   rF   rG   r   r   r;   r   r   r   r   r   r   r   status	referencer	   r   rJ   rK   completed_atr   r]   	from_userto_userrS   rA   rT   rB   r@   r0   r0      s    
 M	T	*BWj4uEG':j#9EJLJ!7%HJ 'E2LfQi%0H F2J	2Fvc{#I (//EJJ(#L DV<.AI6=Ga# arB   r0   c                   B   e Zd ZdZdZ eed      Z ee ed      d      Z	 ee ed      d      Z
 e ed	      dd
      Z eed      Z ee      Z ee ed            Z eeej$                  d      Z ed      Z ede
g      Z edeg      ZdefdZy)
TripInvitezj
    Trip invitation with signed link.
    
    Enables secure invitation sharing via expiring links.
    trip_invitesTr   r   Fr#   r   $   )r    r!   r(   r/   r   r1   r8   c                 V    d| j                    d| j                   d| j                   dS )Nz<TripInvite(id=rh   z	, token='r:   )r;   r   tokenr>   s    r@   rA   zTripInvite.__repr__-  s*     	DLL>4::,VYZZrB   N)rC   rD   rE   rF   rG   r   r   r;   r   r   created_by_user_idr   r   r	   
expires_ataccepted_ataccepted_by_user_idr   rJ   rK   r   r]   
created_byaccepted_byrS   rA   rT   rB   r@   r   r     s    
 #M	T	*BWj4uEGJ)?%P 6":dU;E 51J "K *Z*@A (//EJJ Df4F3GHJv5H4IJK[# [rB   r   N)!rF   r   decimalr   typingr   
sqlalchemyr   r   r   r	   r
   r   r   r   r   r   sqlalchemy.ext.declarativer   sqlalchemy.ormr   Basemetadatar   r   r   r+   r/   r3   r6   rz   r0   r   rT   rB   r@   <module>r      s        8 ' MM
9gz*54H
:w
; 7TJ	
 MM
9gz*54H
9gz*54H		Y4 Y@<D <2#b4 #bL,Nd ,N^G G0"VT "VJ ad  aF[ [rB   