
    Ei#                    X   d Z ddl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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ddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ ddddddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ!	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ"y)z
Service layer functions for payment methods.

Wires Payrix utilities to create/update payment methods from iframe tokens
and returns a unified response for the frontend.
    )annotations)AnyDictOptional)select)Session)PaymentMethod)PaymentMethodCardDetails)PaymentMethodAchDetails)get_payment_token_details)PaymentMethodCardDetailsInputPaymentMethodAchDetailsInputPaymentMethodSaveResponseSchemaPaymentMethodListFilterSchema)generate_secure_id)QueryPaginator)settings)API_PREFIXESN)customer_idbilling_infocard_detailsach_detailsc          	     
  K   t        | |||       d{   }t        |j                  d            }t        d|       | j	                  t        t              j                  t        j                  |k(              j                         }	|j                  d      ||j                  d      |j                  d      |j                  d      |j                  d	      |j                  d
      |	r|	j                  dS ddS 7 w)z
    Fetch an existing Payrix token's details and return a unified response
    without creating/persisting a payment method locally.
    tokenmerchant_idr   Nprovider_payment_method_idzProvider ID:providerbrandlast4	exp_monthexp_yearbilling)r   r   r   r    r!   r"   r#   payment_method_id_internal)r   strgetprintexecuter   r	   wherepayment_method_idscalar_one_or_noneid)
sessionpayment_method_tokenr   r   r   r   r   
normalizedprovider_idpms
             _/var/www/html/hwPaymentPortal-be-dev/hw-payment-portal-api/src/apps/payment_methods/services.py%get_payment_method_details_from_tokenr3   #   s      1"	 J jnn%ABCK	.+&	}##M$C$C{$RS
 
 NN:.&1((^^K0NN:.>>),/1bee	 	 8<	 	s   DDC,D)r*   r   payer_idpayment_request_idr   r   c                 K   t        | |||       d{   }	t        |	j                  d            }
| j                  t	        t
              j                  t
        j                  |
k(              j                         }|r&| j                  |       t        j                  |      S d}d}|d}|r|n|
}t        |j                  |j                  rt        |j                        nd|j                  rt        |j                        nd|||j                         }| j#                  |       | j%                          |j&                  }n||od}|r|n|
}t)        |j*                  |j,                  |j.                  |j0                  ||      }| j#                  |       | j%                          |j&                  }nt3        d      t        |t5        d	d
      dd|||||dk(  r|nd|dk(  r|nd
      }| j#                  |       | j7                          | j                  |       t        j                  |      S 7 'w)z
    Persist payment method details (card or ACH) and link them in payment_methods.

    customer_id, payer_id, and payment_request_id are now optional.
    Returns PaymentMethod with card_details or ach_details based on method type.
    r   Nr   card)r   expire_monthexpire_yearreference_idreference_tokencard_numberach)account_name	bank_nameaccount_typerouting_numberr:   r;   z3Either card_details or ach_details must be providedr1      )prependlengthTmerchant)
methodr*   is_connectedscoper   r4   r   r5   card_details_idach_details_id)r   r%   r&   r(   r   r	   r)   r*   r+   refreshr   model_validater
   r   r!   r"   r    addflushr,   r   r>   r?   r@   rA   
ValueErrorr   commit)r-   r.   r   r*   r   r4   r5   r   r   normr0   existing_pmpm_detail_idrF   r:   r7   r=   r1   s                     r2   save_payment_methodrT   L   s    & +"	 D dhh;<=K //}##M$C$C{$RS  $.==kJJLF,=(;'$$8D8N8N\334TX6B6K6KL112QU%0$**
 	Dww		 ,=(;%$11!++$11&55%0
 	Cvv NOO 
,T"E-(.&(8d'-|D
B KKONNOOB*99"==Qs   H?H<H'H?c           
       K   t        j                          t        j                  j                   }t        t              }t        t        d      r.|j                  t        j                  j                  d            }|j                  t        j                  |k(        }|j                  r>d|j                   d}	|j                  t        j                  j                  |	            }|j                  r,|j                  t        j                  |j                  k(        }|j                   ,|j                  t        j                   |j                   k(        }|j"                  ,|j                  t        j"                  |j"                  k(        }|j$                  ,|j                  t        j$                  |j$                  k(        }|j&                  r,|j                  t        j&                  |j&                  k(        }|j(                  dk7  r1|j(                  dk(  }
|j                  t        j(                  |
k(        }|j+                  d      rC|dd }t        t        |      r]|j-                  t/        t        |      j1                               }n/t        t        |      r|j-                  t/        t        |            }|r+t3        |t4        || t        ||d      }|j7                         S | j9                  |j;                  |      j=                  |            j?                         jA                         }d	|D cg c]  }t5        jB                  |       c}iS c c}w w)
a  
    Get payment methods list with filtering, sorting, and pagination.
    
    Args:
        db: Database session
        merchant_id: Merchant ID (required filter from router)
        filters: Filter parameters
        sort_by: Sort field with optional - prefix for descending
        skip: Number of records to skip
        limit: Number of records to return
        paginate: Whether to return paginated results
        
    Returns:
        Paginated payment methods or raw list
    
deleted_atN%r      -T)queryschemaurldbmodeloffsetlimituse_ormresult)"r   api_base_urlr   PAYMENT_METHODvaluer   r	   hasattrr)   rV   is_r   searchr*   ilikerF   r   r4   r5   rH   rG   
startswithorder_bygetattrdescr   r   to_dictr(   r_   r`   scalarsallrL   )r]   r   filterssort_byskipr`   paginatepagination_urlstmtsearch_termis_connected_bool
field_name	paginatorresultsr1   s                  r2   get_payment_methods_listr|      s    0 &2245l6Q6Q6W6W5XYN - D}l+zz-2266t<= ::m//;>?D ~~'..)+zz-99??LM~~zz-..'..@A&zz-33w7J7JJK#zz-00G4D4DDE!!-zz-::g>X>XXY}}zz--->? q #00A5zz-448IIJ #QR[
=*-==
!C!H!H!JKD='*==!@AD "2	
	   "" **T[[.44U;<DDFJJLT[\b6EEbI\
 	
\s   MM)M$ 	M))r-   r   r.   r%   r   intr   Optional[int]r   zOptional[Dict[str, Any]]r   'Optional[PaymentMethodCardDetailsInput]r   &Optional[PaymentMethodAchDetailsInput]returnDict[str, Any])r-   r   r.   r%   r   r}   r*   zOptional[str]r   r~   r4   r~   r5   r~   r   r   r   r   r   r   )z-created_atr   rB   T)r]   r   r   r}   rq   r   rr   r%   rs   r}   r`   r}   rt   boolr   r   )#__doc__
__future__r   typingr   r   r   
sqlalchemyr   sqlalchemy.ormr   /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.utils.payrixr   0src.apps.payment_methods.schemas.payment_methodsr   r   r   r   src.apps.base.utils.functionsr   src.helpers.paginationr   src.core.configr   src.core.utils.constantsr   r3   rT   r|        r2   <module>r      s   # & &  " I ` ^  = 1 $ 1 "&-1<@:>&& & 	&
 & +& :& 8& &\ (,!%"(,<@:>[>[> [> 	[>
 %[> [> [> &[> :[> 8[> %[>D !W
W
W
 +W
 	W

 W
 W
 W
 W
r   