
    Ei\                        d Z ddlZddlmZmZmZmZ ddlmZ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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)m*Z* 	 	 	 	 	 ddede+de+deee,      dee,   dee+   de-ee   e+f   fdZ.	 	 	 	 	 ddede+de+deee,      dee,   dee+   dee,ef   fdZ/dedee,ef   fdZ0y)zB
Transaction Services - Business logic for transaction operations
    N)ListOptionalDictAny)selectfuncor_)Session
joinedloadselectinload)Transactions)Merchant)Customer)Address)CustomerContact)File)MerchantUsers)User)PaymentMethod)PaymentMethodCardDetails)PaymentMethodAchDetails)PaymentMethodChequeDetails)settings)TransactionStatusTypesdbpageper_pagefieldssearchmerchant_idreturnc           
      
   t        t              }|rd|v r|j                  t        t        j                        j                  t
        j                        j                  t        j                              }|j                  t        t        j                        j                  t
        j                        j                  t        j                              }|j                  t        t        j                        j                  t
        j                        j                  t        j                        j                  t        j                              }|j                  t        t        j                        j                  t
        j                              }|j                  t        t        j                        j                  t
        j                              }|j                  t        t        j                        j                  t
        j                              }d|v r(|j                  t        t        j                              }d|v r(|j                  t        t        j                               }d|v r(|j                  t        t        j"                              }d|v r(|j                  t        t        j$                              }d|v r(|j                  t        t        j&                              }|r"|j)                  t        j*                  |k(        }|rd| d}|j)                  t-        t        j.                  j1                  |      t        j2                  j1                  |      t        j4                  j1                  |      t        j6                  j1                  |                  }t        t9        j:                               j=                  t              }|r"|j)                  t        j*                  |k(        }|rd| d}|j)                  t-        t        j.                  j1                  |      t        j2                  j1                  |      t        j4                  j1                  |      t        j6                  j1                  |                  }| j?                  |      jA                         }	|jC                  t        jD                  jG                               }|jI                  |dz
  |z        jK                  |      }| j?                  |      jM                         jO                         jQ                         }
tS        |
      |	fS )	a  
    Get transactions with optional relationships loaded.
    
    Args:
        db: Database session
        page: Page number (1-indexed)
        per_page: Items per page
        fields: List of relationship fields to load (e.g., ['customer', 'merchant', 'payment_method'])
        search: Search term for filtering
        merchant_id: Filter by merchant ID
        
    Returns:
        Tuple of (transactions list, total count)
    customermerchantpayment_methodpayment_requestinvoicesbilling_address%   )*r   r   optionsr   r#   r   r$   r   r   	addresses
brand_logousersr   usercontactsattachmentsr%   r&   r'   r(   wherer    r	   txn_idiliketxn_literalreference_idbilling_namer   countselect_fromexecute
scalar_oneorder_by
ocurred_atdescoffsetlimituniquescalarsalllist)r   r   r   r   r   r    stmtsearch_pattern
count_stmttotaltransactionss              \/var/www/html/hwPaymentPortal-be-dev/hw-payment-portal-api/src/apps/transactions/services.py _get_transactions_with_relationsrK      s   . ,D  <<<001H--.h001D
 <<<001H--.H//0D
 <<<001H--.hnn-M../	D <<<001h001D <<<001h//0D <<<001h223D <<
<+@+@ ABDv%<<
<+F+F GHD&<<
<+G+G HID<<\-B-B CDD&<<
<+G+G HID zz,22kABVHAzz##)).9((..~>))//?))//?	
 

%11,?J%%l&>&>+&MN
VHA%%##)).9((..~>))//?))//?	

 JJz"--/E ==005578D;;qH,-33H=D ::d#**,446::<Lu$$    c                    t        |d      }g d}g }|r0|D cg c]%  }|j                         |v s|j                         ' }}t        | |||||      \  }	}
g }|	D ]  }i d|j                  t	        |j                        ndd|j
                  d|j                  d|j                  r|j                  j                         ndd	|j                  d
|j                  d|j                  d|j                  d|j                  d|j                  t	        |j                        ndd|j                  ddddddddd|j                   d|j"                  d|j$                  |j&                  |j(                  t	        |j(                        ndddd|j*                  d}d|v 	r|j,                  	r|j,                  }i d|j.                  d|j0                  d|j2                  d|j4                  d|j6                  d|j8                  r|j8                  j                         ndd|j:                  d|j<                  d|j>                  d |j@                  d|j                   d!|jB                  d"|jD                  d#|jF                  d$|jH                  r|jH                  j                         ndd%|jJ                  r|jJ                  j                         ndd&|jL                  r|jL                  j                         ndddg |jN                  r|jN                  jQ                  d'      ng g i i i g |jR                  |jT                  |jV                  |jX                  |j                  r|j                  j                         ndd(|d<   |jZ                  D ]  }|j                   |j\                  |j^                  r|j^                  nd)|j`                  |jb                  |jd                  |jf                  r|jf                  nd*|jh                  d+}tk        |d,      r|jl                  |d,<   nd-|d,<   |d   d.   jo                  |        |jp                  D ]  }d}tk        |d/      r=tk        |d0      r1|jR                  xs d) d1|jr                  xs d) j                         }|d   d2   jo                  |tk        |d3      r|jt                  ndtk        |d4      r|jT                  ndtk        |d5      r|jV                  nd|j                   tk        |d6      r|jv                  ndd7        |jx                  D ]  }d}tk        |d8      r,|jz                  r t|        j~                   d9|jz                   }n7tk        |d:      r+|j                  rt|        j~                   d9|j                   }|d   d;   jo                  |j                   tk        |d<      r|j                  nd|tk        |d$      r&|jH                  r|jH                  j                         ndd=        |j                  rb|j                  }i d>|j                  d|j4                  d?|j                  d4|jT                  d5|jV                  d@|j                  dA|j                  dB|j                  d|j                   dC|j                  dD|j                  rt        |j                        nddE|j                  d|j.                  d#|jF                  dF|j                  dG|j                  d$|jH                  r|jH                  j                         nd|jJ                  r|jJ                  j                         nd|jL                  r|jL                  j                         nddg dddi g dH	|d   d<   |j                  rFt        dI |j                  D        d      }|r&|j                  r|j                  }i d/|jR                  dJtk        |dJ      r|j                  ndd0|jr                  d4|jT                  d5tk        |d5      r|jV                  ndd|j                   dKtk        |dK      r|j                  nddDtk        |dD      r!|j                  rt        |j                        ndd#|jF                  dFtk        |dF      r|j                  nddLt        |dLd      dMtk        |dM      r&|j                  r|j                  j                         nddNtk        |dN      r&|j                  r|j                  j                         nddt        |dd      d$tk        |d$      r&|jH                  r|jH                  j                         ndd%tk        |d%      r&|jJ                  r|jJ                  j                         ndd&tk        |d&      r&|jL                  r|jL                  j                         nd|d   d   dO<   |jZ                  D ]  }|d   d   d.   jo                  |j\                  |j^                  r|j^                  nd)|j`                  |jb                  |jd                  |jf                  r|jf                  nd*|jh                  |j                   dP        |j                  rItk        |j                  d8      r3t|        j~                   d9|j                  jz                   |d   d   dQ<   nT|j                  rHtk        |j                  d:      r2t|        j~                   d9|j                  j                   |d   d   dQ<   |j                  rdR|j                   dS|d   d   dT<   n$|j                  rdR|j                   |d   d   dT<   d|v r|j                  r|j                  }|j                  |j                   |j                  |j                  |j                  ddd|jH                  r|jH                  j                         nd|j                  r,tk        |j                  d      r|j                  j                  nd|j                  r,tk        |j                  dU      r|j                  j                  nd-d-|j                  ddV}|j                  r|j                  }|j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                  r|j                  j                         nddW	|dX<   |j                  r|j                  j                         nd|dY<   |j                  rv|j                  }tk        |dZ      r|j                  ndtk        |d[      r|j                  ndtk        |d      r|j2                  ndtk        |d\      r|j                  ndd]|d^<   |j                  rD|j                  }tk        |d_      r|j                  ndtk        |d\      r|j                  ndd`|da<   ||d<   |jo                  |        |
dbkD  rt        j                  |
|z        ndc}t|        j~                   dd}d}d} | de| }!| df| dg| }"||k  r| df|dcz    dg| }|dckD  r| df|dcz
   dg| } ||
|||| |!|"|dh	S c c}w )ia  
    Get paginated transaction reports with optional field selection.
    
    Args:
        db: Database session
        page: Page number (1-indexed)
        per_page: Items per page (max 100)
        fields: List of relationship fields to include (e.g., ['customer', 'merchant'])
        search: Search term
        merchant_id: Filter by merchant ID
        
    Returns:
        TransactionReportListResponseSchema with paginated results
    d   )r$   r#   r'   r&   r(   r%   )r   r   r   r   r   r    
txn_amountNtxn_type
txn_statusr=   r3   r5   r6   descriptioncurrencyplatform_fee_amountr7   r$   r#   r&   r%   idcategory)charge_typeadditional_infostatus_textrefundable_balancer(   r'   auth_amount
txn_sourceuincustomer_typeaccount_typeindustryoffice_phoneaccount_expires_ontimezonewebsiteaccount_tax_idaccount_literalcustomer_id	tilled_id	is_active
created_at
updated_at
deleted_at,)r$   avatarr,   	tags_listr0   default_addressr(   shipping_addressr1   
first_nameemailphonebusiness_legal_namelast_active_date US)rU   address_line_1address_line_2zipcodecitystatecountryaddress_typeuse_as_defaultFr,   rr   	last_name r0   designationrs   rt   
contact_id)namer   rs   rt   rU   r   pathz /api/v1/files/download?filepath=	file_pathr1   original_name)rU   r   full_urlrj   r   taglineregistration_no
license_nomerchant_literalr    uuidtilled_account_idis_verifiedis_onboarded)	rk   rl   ownerr,   business_profilelogo_urlactive_domainrp   subscriptionsc              3   :   K   | ]  }|j                   s|  y w)N)is_owner).0mus     rJ   	<genexpr>z*get_transaction_reports.<locals>.<genexpr>R  s     *V""++2*Vs   middle_nameuser_idaccess_level
last_logindobr   )ry   rz   r{   r|   r}   r~   r   rU   r   zhttps://z.fluxpay.comr   
is_default)methodrU   is_connectedpayment_method_idscopecard_detailsach_detailscheque_detailsrj   r6   r   is_deletablein_uselast_used_at)	r6   r   card_numberbrandcvvfundingexpire_monthexpire_yearr   r   r   account_numberrouting_number	bank_name)r   r   r_   r   r   cheque_number)r   r   r   r   r*   z/api/v1/reports/transactionsz?page=1&per_page=z?page=z
&per_page=)	allowed_fieldsrH   r   r   nextpreviousfirstlastresult)pminstriprK   rO   floatrP   rQ   r=   	isoformatr3   r5   r6   rR   rS   rT   r7   rU   rV   rX   rY   rZ   r\   r#   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   tagssplitrr   rs   rt   ru   r,   ry   rz   r{   r|   r}   r~   r   hasattrr   appendr0   r   r   r   r1   r   r   SERVER_HOSTr   r   r$   r   r   r   r   r   r    r   strr   r   r   r.   r   r/   r   r   getattrr   r   r-   	subdomaincustom_domainr%   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   mathceil)#r   r   r   r   r   r    r   requested_fieldsfrI   rH   r   txntxn_dictr#   addr	addr_dictcontactcontact_name
attachmentfile_urlr$   owner_user_mapr   pmpm_dictcdadchqtotal_pagesbase_urlnext_urlprev_url	first_urllast_urls#                                      rJ   get_transaction_reportsr      s   . 8S!HN /5U!n9TAGGIUU ;L% F | 
3>>3M%/SW

 #..
 #..224D	

 cjj
 3??
 C,,
 3??
 
 "SE\E\Eh5)@)@#Anr
 C,,
 
 
 t
 d
  #&&!
" #
$  "22??CFCYCYCe%(>(>"?ko#..3
: ))cll||H $x|| $!7!7 $  5 5 $ H--	 $
  5 5 $ %QYQlQlh&A&A&K&K&Mrv $ H-- $ 8++ $ !("9"9 $ "8#;#; $ hkk $ x33 $ X// $ X// $ ATATh11;;=Z^ $  ATATh11;;=Z^! $" ATATh11;;=Z^# $$ !9AX]]005B#%#%$&!&11!!'/'C'CBE..CNN$<$<$>VZ? $HZ F !** D''&*&9&9=A=P=Pd&9&9VX#|| II!ZZ/3||t||$($5$5		 4!12262E2EI./27I./$[188CD$ $,, #7L1gg{6S&-&8&8&>B%?qARARAXVX@Y#Z#`#`#bL$Z077(:A'=:Y7#6#6_c.5gw.GW]]T.5gw.GW]]T!**8?8V'"4"4\`9 	 '22 
:v.:??"*"6"6!77WXbXgXgWhiHZ5*:N:N"*"6"6!77WXbXlXlWmnH$]3::$--AHUdAeZ%=%=ko (GNz[gGhmw  nC  nC*"7"7"A"A"C  IM	<    #,,4HMM4 1 14 x//4 X^^	4
 X^^4 &x'?'?4 !("5"54 '(A(A4 (++4 "8#7#74 (--C.T4 ()C)C4 8<<4  !3!34 "8#7#74  #H$9$9!4" !XEXEX("5"5"?"?"A^b#4$ FNEXEX("5"5"?"?"A^bEMEXEX("5"5"?"?"A^b!!#(, $%)')%'54$Z0< >>%)*V*VX\%]N%.*=*= . 3 3E(%*:*:E)}@]5+<+<cgE (E $U[[	E
 $GE74KU[[QUE !%((E &y8Qu}}W[E #wuf7MRWR\R\C

ObfE (E *}@]5+<+<cgE +GE>4,PE )'RWYeJfkpk{k{%*:*:*D*D*F  BFE "GE5<QV[V_V_599#6#6#8eiE 'z4(HE )'RWYeJfkpk{k{%*:*:*D*D*F  BFE  )'RWYeJfkpk{k{%*:*:*D*D*F  BF!E" )'RWYeJfkpk{k{%*:*:*D*D*F  BF#E,Z8A* %.. 
DZ(4[AHH*.*=*=AEATAT$*=*=Z\#'<< $		!%37<<4<<T(,(9(9"gg	J 	
 &&783F3F+OFNFZFZE[[{  }E  }P  }P  }U  }U  |V  DWHZ(4Z@((WX5H5H+-VFNFZFZE[[{  }E  }P  }P  }Z  }Z  |[  D\HZ(4Z@ %%JRS[SeSeRffrHsHZ(4_E++JRS[SiSiRjHkHZ(4_E
 //C4F4F##B))ee "%'%9%9 $#"&;===bmm557d@BT[\^\k\km{T| < <  CG<>OOPWXZXgXgiuPvboo88  }B %)) $G$ __$&OO"$--#%>>XX66!zz$&OO#%>>CE??BOO$=$=$?X\
+' JL"//*C*C*E^b' ~~^^;B2GW;Xb&7&7^b;B2GW;Xb&7&7^b7>r>7RBOOX\18[1It	*&   '':A#:WS%6%6]a29#{2KQU-()
 *1H%&hy| ~ 27$))EH,-K&&''CDH HH*-hZ8I6+j
CHkZvdQhZz(DaxZvdQhZz(D )
 
y Vs
   {{c                    | j                  t        t        j                  t        j
                        j                  d      t        j                  t        j                  t        j                        d      j                  d      t        j                  t        j                  t        j                        d      j                  d                  j                         }| j                  t        t        j                  t        j
                        j                  d      t        j                  t        j                  t        j                        d      j                  d            j                  t        j                  t        j                  k(              j                         }| j                  t        t        j                  t        j
                        j                  d      t        j                  t        j                  t        j                        d      j                  d            j                  t        j                   d	k(              j                         }|j"                  t%        |j&                        |j(                  t%        |j*                        t%        |j,                        |j.                  t%        |j0                        d
S )aa  
    Get transaction summary statistics.
    
    Calculates:
    - Total transaction count and value
    - Declined transaction count and value (FAILED status)
    - Voided transaction count and value
    - Average transaction value
    
    Args:
        db: Database session
        
    Returns:
        Dict with transaction summary statistics
    total_countr   total_valueaverage_valuedeclined_countdeclined_valuevoided_countvoided_valuevoid)total_transaction_counttotal_transaction_valuetotal_declined_counttotal_declined_valueaverage_transaction_valuevoided_transaction_countvoided_transaction_value)r:   r   r   r8   r   rU   labelcoalescesumrO   avgoner2   rQ   r   FAILEDrV   r   r   r   r   r   r   r   r   )r   total_statsdeclined_statsvoided_statss       rJ   get_transaction_summaryr     s   " **JJ|'--m<MM$((<#:#:;Q?EEmTMM$((<#:#:;Q?EEoV	
 
ce  ZZJJ|'--.>?MM$((<#:#:;Q?EEFVW	
 
|&&*@*G*GG	H 
ce  ::JJ|'--n=MM$((<#:#:;Q?EEnU	
 
|$$.	/ 
ce  $/#:#:#()@)@#A . = = %n&C&C D%*;+D+D%E$0$=$=$),*C*C$D rL   )r*   
   NNN)1__doc__r   typingr   r   r   r   
sqlalchemyr   r   r	   sqlalchemy.ormr
   r   r   )src.apps.transactions.models.transactionsr   "src.apps.merchants.models.merchantr   "src.apps.customers.models.customerr   src.apps.base.models.addressr   *src.apps.customers.models.customer_contactr   src.apps.files.models.filer   (src.apps.merchants.models.merchant_usersr   src.apps.users.models.userr   /src.apps.payment_methods.models.payment_methodsr   ;src.apps.payment_methods.models.payment_method_card_detailsr   :src.apps.payment_methods.models.payment_method_ach_detailsr   =src.apps.payment_methods.models.payment_method_cheque_detailsr   src.core.configr   src.core.utils.enumsr   intr   tuplerK   r   r    rL   rJ   <module>r     sa    , , ( ( < < B 7 7 0 F + B + I ` ^ d $ 7
 "& !%o%o%
o% o% T#Y	o%
 SMo% #o% 4s"#o%h "& !%LL
L L T#Y	L
 SML #L 
#s(^L^
4 4DcN 4rL   