o
    1d§j1  ã                
   @   sè   d dl Z d dlZd dlmZmZ d dlmZ d dlZd dlmZ e  	e
¡Zddededefd	d
„Zededeed ƒƒƒeededeed ƒƒƒƒededeed ƒƒƒededeed ƒƒƒeddƒdddœZG dd„ dƒZeƒ ZdS )é    N)ÚdatetimeÚ	timedelta)ÚAny)Ú	DB_CONFIGÚ ÚnameÚfallbackÚreturnc                 C   s   t tj | d¡ƒ ¡ }|p|S )Nr   )ÚstrÚosÚenvironÚgetÚstrip)r   r   Úvalue© r   ú6/var/www/back/telegram_server/official_mail_service.pyÚ_env   s   r   ÚOFFICIAL_MAIL_DB_HOSTÚAPP_MASTER_DB_HOSTÚhostÚOFFICIAL_MAIL_DB_PORTÚAPP_MASTER_DB_PORTÚportÚOFFICIAL_MAIL_DB_USERÚAPP_MASTER_DB_USERÚuserÚOFFICIAL_MAIL_DB_PASSWORDÚAPP_MASTER_DB_PASSWORDÚpasswordÚOFFICIAL_MAIL_DB_NAMEÚofficial_mailÚutf8mb4T)r   r   r   r   ÚdbÚcharsetÚ
autocommitc                	   @   s^   e Zd Zddd„Zedefdd„ƒZddd„Zdd	d
„Zde	de	de
eeef  fdd„ZdS )ÚOfficialMailEventServicer	   Nc                 C   s   d | _ d| _d S ©NF)Ú_poolÚ_billing_history_replayed©Úselfr   r   r   Ú__init__,   s   
z!OfficialMailEventService.__init__c                 C   s
   | j d uS )N)r'   r)   r   r   r   Úis_ready0   s   
z!OfficialMailEventService.is_readyc              
   Ã   sÊ   �| j rd S tjdddddœt¤ŽI d H | _ | j  ¡ 4 I d H š1}| ¡ 4 I d H š}| d¡I d H  W d   ƒI d H  n1 I d H sAw   Y  W d   ƒI d H  n1 I d H sVw   Y  t dtd ¡ d S )	Né   é   é   )ÚminsizeÚmaxsizeÚconnect_timeoutz6SELECT 1 FROM domain_setup_assistance_requests LIMIT 1zOfficial Mail DB connected: %sr"   r   )	r'   ÚaiomysqlÚcreate_poolÚOFFICIAL_MAIL_DB_CONFIGÚacquireÚcursorÚexecuteÚloggerÚinfo)r*   Ú
connectionr7   r   r   r   Ú
initialize4   s*   €ýüÿ*ÿ(ÿþz#OfficialMailEventService.initializec                 Ã   s6   �| j r| j  ¡  | j  ¡ I d H  d | _ d| _d S d S r&   )r'   ÚcloseÚwait_closedr(   r)   r   r   r   r=   I   s   €

üzOfficialMailEventService.closeÚstart_atÚend_atc              
   ƒ   sÀ  �| j sg S | jst|ˆ tdd� ƒn|}| j  ¡ 4 I d H š�}| tj¡4 I d H šo}| d|ˆ f¡I d H  t	| 
¡ I d H ƒ}| d|ˆ f¡I d H  t	| 
¡ I d H ƒ}| d|ˆ f¡I d H  t	| 
¡ I d H ƒ}| d|ˆ f¡I d H  t	| 
¡ I d H ƒ}	| d|ˆ f¡I d H  t	| 
¡ I d H ƒ}
W d   ƒI d H  n1 I d H sžw   Y  W d   ƒI d H  n1 I d H s³w   Y  d| _|D ]}d	|d
< d|d< d| d¡› d�|d< q½|D ]}d|d
< d|d< d| d¡› d| d¡› �|d< qÕ|D ]}d|d
< d|d< d| d¡› d| d¡› �|d< qò|	D ]}d|d
< d|d< d|d< d| d¡› d| d¡› �|d< �q|
D ]}d |d
< d|d< d!|d< d"| d#¡› d$�|d< �q1tg |¢|¢|¢|	¢|
¢‡ fd%d&„d'�S )(Né   )Údaysa"  
                    SELECT
                      r.id AS event_id,
                      'official-mail' AS app_key,
                      r.domain AS title,
                      r.provider AS detail,
                      u.email AS actor,
                      r.fee_amount AS amount,
                      'KRW' AS currency,
                      'domain-assistance' AS platform,
                      r.status,
                      r.notification_email,
                      r.requested_at AS event_time
                    FROM domain_setup_assistance_requests r
                    INNER JOIN users u ON u.id = r.user_id
                    WHERE r.requested_at > %s
                      AND r.requested_at <= %s
                    ORDER BY r.requested_at ASC, r.id ASC
                    u«  
                    SELECT
                      p.id AS event_id,
                      'official-mail' AS app_key,
                      'ì„±ìž¥ í”Œëžœ' AS title,
                      p.decline_message AS detail,
                      u.email AS actor,
                      p.amount / 100.0 AS amount,
                      UPPER(p.currency) AS currency,
                      'polar' AS platform,
                      p.status,
                      p.payment_method,
                      p.payment_trigger,
                      p.card_brand,
                      p.card_last_four,
                      p.decline_reason,
                      p.polar_payment_id,
                      p.polar_checkout_id,
                      p.payment_created_at AS occurred_at,
                      p.status_changed_at AS event_time
                    FROM mailbox_polar_payments p
                    INNER JOIN users u ON u.id = p.owner_user_id
                    WHERE p.status_changed_at > %s
                      AND p.status_changed_at <= %s
                      AND p.status IN ('succeeded', 'failed')
                    ORDER BY p.status_changed_at ASC, p.id ASC
                    a  
                    SELECT
                      c.id AS event_id,
                      'official-mail' AS app_key,
                      c.product_desc AS title,
                      c.error_message AS detail,
                      u.email AS actor,
                      c.amount AS amount,
                      'KRW' AS currency,
                      'toss-pay' AS platform,
                      c.status,
                      c.pay_method AS payment_method,
                      c.charge_kind AS payment_trigger,
                      COALESCE(c.card_company_name, p.card_company_name)
                        AS card_brand,
                      COALESCE(c.card_num4_print, p.card_num4_print)
                        AS card_last_four,
                      c.error_code AS decline_reason,
                      c.order_no AS payment_id,
                      c.transaction_id,
                      c.requested_at AS occurred_at,
                      c.updated_at AS event_time,
                      CASE
                        WHEN c.status = 'success'
                          AND c.subscription_id IS NOT NULL
                          AND c.id = (
                            SELECT MIN(first_charge.id)
                            FROM mailbox_toss_pay_billing_charges first_charge
                            WHERE first_charge.subscription_id = c.subscription_id
                              AND first_charge.status = 'success'
                          )
                        THEN 1
                        ELSE 0
                      END AS is_initial_subscription_charge
                    FROM mailbox_toss_pay_billing_charges c
                    INNER JOIN users u ON u.id = c.owner_user_id
                    INNER JOIN mailbox_toss_pay_billing_profiles p
                      ON p.id = c.billing_profile_id
                    WHERE c.updated_at > %s
                      AND c.updated_at <= %s
                      AND c.status IN ('success', 'failed')
                    ORDER BY c.updated_at ASC, c.id ASC
                    u(  
                    SELECT
                      p.id AS event_id,
                      'official-mail' AS app_key,
                      'ê²°ì œìˆ˜ë‹¨' AS title,
                      u.email AS actor,
                      'toss-pay' AS platform,
                      p.status,
                      p.pay_method AS payment_method,
                      p.card_company_name AS card_brand,
                      p.card_num4_print AS card_last_four,
                      p.account_bank_name,
                      SHA2(p.billing_key, 256) AS registration_key,
                      p.activated_at AS event_time
                    FROM mailbox_toss_pay_billing_profiles p
                    INNER JOIN users u ON u.id = p.owner_user_id
                    WHERE p.activated_at > %s
                      AND p.activated_at <= %s
                      AND p.status = 'active'
                      AND p.last_action = 'ACTIVATED'
                      AND p.billing_key IS NOT NULL
                    ORDER BY p.activated_at ASC, p.id ASC
                    uÐ  
                    SELECT
                      s.id AS event_id,
                      'official-mail' AS app_key,
                      'ì„±ìž¥ í”Œëžœ' AS title,
                      u.email AS actor,
                      s.amount / 100.0 AS amount,
                      UPPER(s.currency) AS currency,
                      'polar' AS platform,
                      s.status,
                      'card' AS payment_method,
                      latest_payment.card_brand,
                      latest_payment.card_last_four,
                      s.polar_subscription_id,
                      s.checkout_id,
                      COALESCE(s.last_event_at, s.updated_at) AS event_time
                    FROM mailbox_polar_subscriptions s
                    INNER JOIN users u ON u.id = s.owner_user_id
                    LEFT JOIN mailbox_polar_payments latest_payment
                      ON latest_payment.id = (
                        SELECT payment.id
                        FROM mailbox_polar_payments payment
                        WHERE payment.owner_user_id = s.owner_user_id
                          AND payment.status = 'succeeded'
                          AND (
                            payment.polar_checkout_id = s.checkout_id
                            OR s.checkout_id IS NULL
                          )
                        ORDER BY payment.payment_created_at DESC, payment.id DESC
                        LIMIT 1
                      )
                    WHERE COALESCE(s.last_event_at, s.updated_at) > %s
                      AND COALESCE(s.last_event_at, s.updated_at) <= %s
                      AND s.status = 'active'
                    ORDER BY event_time ASC, s.id ASC
                    TÚ domain_setup_assistance_requestsÚsourceÚdomain_assistanceÚ
event_typez!domain_setup_assistance_requests:Úevent_idz
:requestedÚ	event_keyÚmailbox_polar_paymentsÚpolar_paymentzmailbox_polar_payments:Úpolar_payment_idú:ÚstatusÚ mailbox_toss_pay_billing_chargesÚtoss_paymentz!mailbox_toss_pay_billing_charges:Ú!mailbox_toss_pay_billing_profilesÚpayment_method_registeredÚdomesticÚregionz"mailbox_toss_pay_billing_profiles:Úregistration_keyÚmailbox_polar_subscriptionsÚoverseaszmailbox_polar_subscriptions:Úpolar_subscription_idz
:activatedc                    s   |   d¡pˆ | d fS )NÚ
event_timerH   )r   )Úrow©r@   r   r   Ú<lambda>B  s    z7OfficialMailEventService.fetch_events.<locals>.<lambda>)Úkey)r'   r(   Úminr   r6   r7   r3   Ú
DictCursorr8   ÚlistÚfetchallr   Úsorted)r*   r?   r@   Úbilling_start_atr;   r7   Údomain_rowsÚpolar_payment_rowsÚtoss_payment_rowsÚtoss_method_rowsÚpolar_method_rowsrY   r   rZ   r   Úfetch_eventsP   s¼   €ÿý
ì
ä+
Ô.
è$
Û' �*Ó(ÿ 0ÿÿÿÿÿÿÿÿÿ
ÿÿ
ÿÿþýüû
øz%OfficialMailEventService.fetch_events)r	   N)Ú__name__Ú
__module__Ú__qualname__r+   ÚpropertyÚboolr,   r<   r=   r   r_   Údictr
   r   rh   r   r   r   r   r%   +   s    


þýür%   )r   )Úloggingr   r   r   Útypingr   r3   Úpersistencer   Ú	getLoggerri   r9   r
   r   Úintr5   r%   Úofficial_mail_servicer   r   r   r   Ú<module>   sD    
þþÿþþë  
