
    DiS                    r   d Z ddlmZ ddlZddlZddlZddlmZmZm	Z	 ddl
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mZm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%  e       Z& ejN                  d      Z(ddZ)ddZ*ddZ+ddZ,e&j[                  d       ee      fdd       Z.y)z
FastAPI router to receive Payrix Web Alerts (webhook events).

Validates a shared secret header from env, parses payload, performs
idempotency dedup, and creates or updates internal transaction records.
    )annotationsN)AnyDictOptional)datetimetimezone)	APIRouterDependsRequest)select)Session)settings)get_session)UnauthorizedErrorValidationExceptionNotFoundError)Transactions)TransactionStatusTypesTransactionCategoriesTransactionTypes)(map_payrix_payload_to_transaction_status)generate_secure_idpayrixc                    t         j                  }t         j                  }|r|st        d      | j                  j                  |      }||k7  rt        d      y )Nz$Payrix webhook secret not configured)messagez$Invalid Payrix webhook secret header)r   PAYRIX_WEBHOOK_HEADER_NAMEPAYRIX_WEBHOOK_HEADER_VALUEr   headersget)requestnameexpectedreceiveds       [/var/www/html/hwPaymentPortal-be-dev/hw-payment-portal-api/src/webhooks/payrix_webalerts.py_validate_secretr%      sV    ..D33Hx(NOO""4(H8(NOO     c                    dD ]!  }|| v st        | |   t              s| |   c S  t        j                  | dd      }t	        j
                  |j                  d            j                         S )N)eventIdalertIdidT),:)	sort_keys
separatorszutf-8)
isinstancestrjsondumpshashlibsha256encode	hexdigest)bodykey	canonicals      r$   _extract_event_idr:   *   sf    + $;:d3i59 

44JGI>>)**734>>@@r&   c                   dD ]'  }| j                  |      }t        |t              s%|c S  | j                  d      xs | j                  d      xs i }dD ]'  }|j                  |      }t        |t              s%|c S  y )N)txnIdtransactionIdr*   txn_idtxntransaction)r*   r<   r=   )r   r/   r0   )r7   r8   valr?   s       r$   _extract_txn_idrB   3   s    9 hhsmc3J ((5/
:TXXm4
:C/ ggclc3J r&   c                    | xs dj                         }|dv rt        j                  S |dv rt        j                  S |dv rt        j                  S t        j
                  S )N >   captured>   paidsuccessapproved	succeeded>   errorfaileddeclined)lowerr   CAPTUREDPAIDFAILEDPENDING)payrix_statusss     r$   _map_to_internal_statusrT   A   s_    		"##%AL%...88%***++%,,,!)))r&   z/payrixc                  K   t        |        	 | j                          d {   }t	        |      }t        |      }|st        dd      |j                  t        t              j                  t        j                  |k(              j                         }|st        j                  dd|       |j                  d      xs |j                  d      xs |}|j                  d	      rt        |j                  d	d
            dz  nd}|j                  dd      j!                         }|j                  d      xs! |j                  di       j                  d      }	|j                  d      xs! |j                  di       j                  d      }
|j                  d      }t        ||||j                  d      t#        |      |j                  d      xs t%        dd      |j                  d      t&        j(                  t*        j,                  |g|dd|	|
|t/        j0                  t2        j4                              }|j7                  |       |j9                          |j;                  |       t        j                  dd|||j<                         dddS |j>                  xs i }|j                  d       xs g }||v rt        j                  d!d||       ddd"S t#        |      }||_        |jA                  |       ||d <   ||d#<   ||_        |j7                  |       |j9                          t        j                  d$d|||       ddd%S 7 5# t        $ r t        dd      w xY ww)&NzInvalid JSON payloadr   )r   modulez!Missing transaction id in payloadz:provider=payrix op=%s txn_id=%s creating_new_transaction=1webalertr?   r@   totalr   g      Y@g        currencyusdmerchant_idmerchantr*   customer_idcustomerpayment_request_idtypereference_idref   )prependlengthdescriptionT)payrix_eventslast_payrix_webalertcreated_from_webhook)r>   
txn_amountrY   txn_type
txn_statusra   rf   categorytransaction_typetxn_metadatar[   r]   r_   
ocurred_atz?provider=payrix op=%s txn_id=%s event_id=%s status=%s created=1)okcreatedrg   z<provider=payrix op=%s txn_id=%s event_id=%s idempotent_hit=1)rq   
idempotentrh   z?provider=payrix op=%s txn_id=%s event_id=%s status=%s updated=1)rq   updated)!r%   r1   	Exceptionr   r:   rB   executer   r   wherer>   scalar_one_or_noneloggerinfor   floatupperr   r   r   CHARGEr   PAYMENT_TERMINALr   nowr   utcaddcommitrefreshrl   ro   append)r    dbpayloadevent_idr>   r?   txn_dataamountrY   r[   r]   r_   meta	processedinternal_statuss                  r$   payrix_webalert_endpointr   L   s4    WS(/"6 !)HW%F!*MV^__  "zz|""<#6#6&#@A  
 H	
 ;;u%N])CNw<DLL<Qx||GQ/058WZ<<
E288: ll=1[X\\*b5Q5U5UVZ5[ll=1[X\\*b5Q5U5UVZ5[%\\*>? \\&)?H!n5e9KTYbd9e ]3*11->>"*(/(,
 $#1||HLL1%
( 	s
		


3MNN	
 t,, !rD)/RI9J		
 $// ?wGO$CN X%D#*D	 CFF3KIIK
KKI 4((E #7 S!*@RRSs,   M4M MM L0M4M M11M4)r    r   returnNone)r7   Dict[str, Any]r   r0   )r7   r   r   Optional[str])rR   r   r   r   )r    r   r   r   )/__doc__
__future__r   r3   r1   loggingtypingr   r   r   r   r   fastapir	   r
   r   
sqlalchemyr   sqlalchemy.ormr   src.core.configr   src.core.databaser   src.core.exceptionsr   r   r   )src.apps.transactions.models.transactionsr   src.core.utils.enumsr   r   r   src.core.payrix.status_mapperr   src.apps.base.utils.functionsr   router	getLoggerry   r%   r:   rB   rT   postr    r&   r$   <module>r      s    #    & & ' / /  " $ ) U U B ` ` R <				8	$PA* YCJ;CW e) e)r&   