o
    H9i                     @   sF  d dl Z d dlZd dl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mZmZmZmZmZ d dlmZ eddZe eZd	Zd
ZdZdZdZdRdededefddZ dedefddZ!dedefddZ"dedefddZ#dedefddZ$dedefddZ%dedefdd Z&d!ed"ede'dB fd#d$Z(d%ede)e fd&d'Z*d%ededB fd(d)Z+d*ed+ed,e'defd-d.Z,d*ed+ed,e'defd/d0Z-ded!ed%ed"ed1ed2ed+edefd3d4Z.de)e/eeeeeeef  fd5d6Z0d7e)e defd8d9Z1ded:e)e2 d!ed%ed"ed1ed2edefd;d<Z3ded!ed%ed"ed1ed2ed=edefd>d?Z4ded!ed%ed"ed1ed2edefd@dAZ5e6ej78edBedCefdDdEZ9dBedCefdFdGZ:dBedCefdHdIZ;dBedCefdJdKZ<e6ej78edBedCefdLdMZ=e6ej78edBedCefdNdOZ>e6ej78edBedCefdPdQZ?dS )S    N)RouterF)CallbackQueryInlineKeyboardMarkupInlineKeyboardButton)
FSMContext)get_user_languageget_language_textget_user_balanceupdate_user_balanceDATA_DBMENU_DB)
save_orderpayment_handlers)namepayment:wallet:z	back_nav:z
bank_card:zconfirm_payment:@   data
max_lengthreturnc                 C   s   t | |kr| S | d| S )uG   Обрезает callback_data до максимальной длиныN)len)r   r    r   X/var/www/www-root/data/www/app.magazinbotpanel.site/bots/01/handlers/payment_handlers.pytruncate_callback_data   s   r   langc              
   C      d}z:t t}| }|d| f | }|  |r4|d r7t|d  r:t|d  }W |S W |S W |S W |S  t	yZ } zt
d|  d|  W Y d }~|S d }~ww )Nu   ⬅️ Назадz+SELECT button9 FROM language WHERE name = ?r   z get_button9_text error for lang=: sqlite3connectr   cursorexecutefetchoneclosestrstrip	Exceptionloggererrorr   labelconncurrower   r   r   get_button9_text   *   
 r0   c              
   C   r   )Nu   💳 CryptoBotz,SELECT button13 FROM language WHERE name = ?r   z!get_button13_text error for lang=r   r   r*   r   r   r   get_button13_text'   r1   r2   c              
   C   r   )Nu$   💳 Банковская картаz,SELECT button14 FROM language WHERE name = ?r   z!get_button14_text error for lang=r   r   r*   r   r   r   get_button14_text5   r1   r3   c              
   C   r   )Nu'   💰 Оплатить с балансаz,SELECT button16 FROM language WHERE name = ?r   z!get_button16_text error for lang=r   r   r*   r   r   r   get_button16_textC   r1   r4   c              
   C   r   )Nu'   ✅ Подтвердить оплатуz,SELECT button18 FROM language WHERE name = ?r   z!get_button18_text error for lang=r   r   r*   r   r   r   get_button18_textQ   r1   r5   c              
   C   r   )Nu   📞 Операторz,SELECT button21 FROM language WHERE name = ?r   z!get_button21_text error for lang=r   r   r*   r   r   r   get_button21_text_   r1   r6   
product_id	tag_indexc                 C   s*  zst t}| }d| }|d dd | D }||vr(|  W dS |d| d| f | }|  |rq|d rqt|d 	 }|rqd	d |
d
D }t|dkrqz
t|d }	|	W W S  typ   Y W dS w W dS  ty }
 ztd|  d| d|
  W Y d}
~
dS d}
~
ww )ue   Получает базовую цену товара (без конвертации по курсу)product_tagszPRAGMA table_info(products)c                 S      g | ]}|d  qS    r   .0colr   r   r   
<listcomp>v       z*get_product_base_price.<locals>.<listcomp>NSELECT z# FROM products WHERE product_id = ?r   c                 S   s   g | ]}|  qS r   )r&   )r>   pr   r   r   r@      rA   ,   r<   z(get_product_base_price error product_id=z, tag_index=r   )r   r    r   r!   r"   fetchallr$   r#   r%   r&   splitr   float
ValueErrorr'   r(   r)   )r7   r8   r,   r-   
tag_columncolumnsr.   tag_dataparts
base_pricer/   r   r   r   get_product_base_pricem   s:   


rO   city_idc              
   C   s&  zst t}| }|d dd | D }g }|D ]}|dr(|| q|s.g W S dd| d}||d|  df |	 }|
  |sOg W S g }t|D ]\}	}||	 rpt||	  rp|t||	   qU|W S  ty }
 ztd	|  d
|
  g W  Y d}
~
S d}
~
ww )um   Получает ВСЕ тексты банковской карты для указанного городаzPRAGMA table_info(bank_card)c                 S   r:   r;   r   r=   r   r   r   r@      rA   z'get_bank_card_texts.<locals>.<listcomp>textrB   , z$ FROM bank_card WHERE city_id LIKE ?%z&get_bank_card_texts error for city_id=r   N)r   r    r   r!   r"   rF   
startswithappendjoinr#   r$   	enumerater%   r&   r'   r(   r)   )rP   r,   r-   rK   text_columnsr?   queryr.   textsir/   r   r   r   get_bank_card_texts   s:   



r\   c                 C   s   t | }|sdS t|S )uf   Возвращает случайный текст банковской карты для городаN)r\   randomchoice)rP   rZ   r   r   r   get_random_bank_card_text   s   
r_   rQ   user_idrN   c                 C   s   | s| S d}d}|}| }| dt|}|| }| d|d}|| }| d|d}d|v r<|d }	| d|	d}d	|v rL|d }
| d	|
d}|S )
un   Форматирует текст банковской карты с заменой плейсхолдеровg     V@g      D@	{user_id}z{summa-rub}.2fz{summa-grn}z{summa-rub+10%}g?z{summa-grn+10%}replacer%   )rQ   r`   rN   
USD_TO_RUB
USD_TO_GRNbase_usdformatted_text	summa_rub	summa_grnsumma_rub_plus_10summa_grn_plus_10r   r   r   format_bank_card_text   s$   rm   c                 C   s0   | s| S | }| dt|}| d|d}|S )u_   Форматирует текст кошелька с заменой плейсхолдеровra   z{summa}rb   rc   )rQ   r`   rN   rh   r   r   r   format_wallet_text   s   rn   tag_namedistrictc                 C   s  g }t ||}|r|dd nd}	|r|dd nd}
t| }|t|tt d| d| d| d|	 d|
 ddg t| }|t|tt d| d| d| d|	 d|
 ddg |durt|}||krt| }|t|tt d	| d| d| d|	 d|
 ddg t	| }|t|tt d
| d| d| d|	 d|
 ddg td| d| d| d|	 d}|tt
| |dg t|dS )u@   Строит клавиатуру с опциями оплатыN    z
cryptobot::r   rQ   callback_datacard:zbalance:z	operator:ztag:inline_keyboard)rO   r2   rU   r   r   PAYMENT_CB_PREFIXr3   r
   r4   r6   r0   r   )r   r7   rP   r8   ro   rp   r`   rowsrN   truncated_tag_nametruncated_districtbutton13_textbutton14_textuser_balancebutton16_textbutton21_textback_to_districts_cbr   r   r   build_payment_keyboard   s<   
*
*
*
*
"
r   c               
   C   s  zt t} |  }|d | s|   g W S |d dd | D }g d}tddD ]}d| }||v rA|	| q1d	d

| d}|| | }|   g }|D ][}	|	r|	d rt|	d t|	d  g d}
tdt|	D ]}|	| rt|	|  r|
d 	t|	|   q{|
d st|	dkr|	d r|
d 	t|	d   |	|
 q\|W S  ty } ztd|  g W  Y d}~S d}~ww )um   Получает список кошельков из таблицы wallets со всеми текстамиzg
            SELECT name FROM sqlite_master 
            WHERE type='table' AND name='wallets'
        zPRAGMA table_info(wallets)c                 S   r:   r;   r   r=   r   r   r   r@   1  rA   zget_wallets.<locals>.<listcomp>)idr   rQ   rE      rQ   rB   rR   z FROM wallets ORDER BY namer<   r   )r   r   rZ   rZ   zget_wallets error: N)r   r    r   r!   r"   r#   r$   rF   rangerU   rV   intr%   r&   r   r'   r(   r)   )r,   r-   rK   select_columnsr[   col_namerY   rz   walletsr.   wallet_datar/   r   r   r   get_wallets!  sP   







r   wallet_textsc                 C   s&   | sdS t | dkr| d S t| S )ud   Возвращает случайный текст из списка текстов кошелькаu-   Текст кошелька не найденr<   r   )r   r]   r^   )r   r   r   r   get_random_wallet_textY  s
   
r   r   c                 C   s   g }|r
|dd nd}|r|dd nd}	|D ]}
| t|
d t |
d  dg qtt d| d| d| d| d|	 d	}| tt| |dg t|d
S )u9   Строит клавиатуру с кошелькамиNrq   rr   r   r   rt   r   rs   r   rw   )rU   r   WALLET_CB_PREFIXr   BACK_NAV_PREFIXr0   r   )r   r   r7   rP   r8   ro   rp   rz   r{   r|   walletback_to_payment_cbr   r   r   build_wallets_keyboardd  s   ,
r   	wallet_idc                 C   s   g }|r
|dd nd}|r|dd nd}	t | }
|t|
tt d| d| d| d| d|	 d| ddg tt d| d| d| d| d|	 d}|tt| |dg t|d	S )
u   Строит клавиатуру с кнопкой подтверждения оплаты для текста кошелькаNrq   rr   r   rs   r   rt   zwallets:rw   )r5   rU   r   r   CONFIRM_PAYMENT_PREFIXr   r0   r   )r   r7   rP   r8   ro   rp   r   rz   r{   r|   button18_textback_to_wallets_cbr   r   r   build_wallet_text_keyboardw  s   0
,
r   c                 C   s   g }|r
|dd nd}|r|dd nd}t  d| d| d| d| d| }	t|	d}	t| }
|t|
|	dg t d| d| d| d| d| }t|d}|tt| |dg t|d	S )
u   Строит клавиатуру для банковской карты с кнопкой подтверждения оплатыNrq   rr   rv   rs   r   rt   r   rw   )r   r   r5   rU   r   r   r0   r   )r   r7   rP   r8   ro   rp   rz   r{   r|   ru   r   r   r   r   r   build_bank_card_keyboard  s   &

&

r   cbstatec                    sf  | j j}t|}| jttd }z|dd\}}}}}	}
t|}t|}t|}W n ty@   | j	dddI dH  Y dS w z
| j
 I dH  W n	 tyT   Y nw |j||||	|
|dI dH  t||}|j|dI dH  |d	krd
dlm} || |I dH  n&|dkrt| |I dH  n|dkrt| |I dH  n|dkrt| |I dH  | 	 I dH  dS )u=   Обработчик выбора способа оплатыNrs      u5   Ошибка выбора способа оплатыT
show_alert)r7   rP   r8   ro   rp   payment_method)product_base_price	cryptobotr   )handle_cryptobot_paymentcardbalanceoperator)	from_userr   r   r   r   ry   rG   r   r'   answermessagedeleteupdate_datarO   handlers.cryptobotr   handle_bank_card_paymenthandle_balance_paymenthandle_operator_payment)r   r   r`   r   payloadr   pid_strcid_strtag_index_strro   rp   r7   rP   r8   rN   r   r   r   r   on_payment_selected  sL   

r   c                    sD  | j j}t|}td | I dH }|d}|d}|d}|d}|d}	|d}
z
| j I dH  W n	 tyE   Y nw t	|}|r{t
|||||	gr{t|||
}t||||||	}| jj||d	I dH  td
| d|  dS d}td|  t|dpd}t||||||	|}| jj||d	I dH  dS )u   Обработчик оплаты банковской картой - показывает СЛУЧАЙНЫЙ текст карты для городаz === HANDLE BANK CARD PAYMENT ===Nr7   rP   r8   ro   rp   r   reply_markupz,Displayed formatted bank card text for user z, city_id: ug   Реквизиты банковской карты не найдены для вашего городаz No bank card found for city_id: text10+   Выберите способ оплаты:)r   r   r   printget_datagetr   r   r'   r_   allrm   r   r   r	   r   )r   r   r`   r   
state_datar7   rP   r8   ro   rp   rN   bank_card_textrh   kb
error_textr   r   r   r   r     s6   





r   c                    s0  | j j}t|}td | I dH }|d}|r|dkr,d}| j|I dH  dS t|}||k rFt	|dp:d}| j|I dH  dS t
||}|sZd}| j|I dH  dS t||d	| jI dH }	|	rtd
 t	|dpqd}
| j|
I dH  td ntd d}| j|I dH  | I dH  dS )u3   Обработчик оплаты с балансаz=== HANDLE BALANCE PAYMENT ===Nr   r   u4   Ошибка: неверная цена товараtext18u@   ❌ Недостаточно средств на балансе!u>   Ошибка списания средств с балансаbutton16zBOrder successfully saved to database with payment method: button16text23uL   ✅ Оплата прошла успешно с вашего баланса!z$Showing text23 after balance payment Failed to save order to database.   Ошибка сохранения заказа)r   r   r   r   r   r   r   r   r
   r	   r   r   botclear)r   r   r`   r   r   rN   r   r   balance_updatedorder_savedr   r   r   r   r     s<   


r   c              
      sr  | j j}t|}td | I dH }|d}|d}|d}|d}|d}	z
| j I dH  W n	 ty@   Y nw t	|d}
|
sTt
|}
td	|
 d
 t }|rt|||||	gr|j|dI dH  t|||||||	}| jj|
|dI dH  td|
 dt| d dS d}tdt| dt|||||	g  ddlm} | jj|||dI dH  dS )u_   Обработчик связи с оператором - показывает кошелькиz=== HANDLE OPERATOR PAYMENT ===Nr7   rP   r8   ro   rp   text34z(text34 not found, using button21 text: ''r   r   zDisplayed text34: 'z' with z walletsA   Способы оплаты временно недоступныz.No wallets found or incomplete data. Wallets: z, Data complete: r   build_back_keyboard)r   r   r   r   r   r   r   r   r'   r	   r6   r   r   r   r   r   r   handlers.catalogr   )r   r   r`   r   r   r7   rP   r8   ro   rp   text34_contentr   r   r   r   r   r   r   r   7  s:   





&r   c                    s  | j j}t|}t| jttd }| I dH }|d}|d}|d}|d}	|d}
|d}|dg }z
| j	
 I dH  W n	 tyR   Y nw d}|D ]}|d	 |krc|} nqW|r|d
 rt|d
 }t|||}td|d  dt|d
   t||||	|
grt|||||	|
|}| j	j||dI dH  n+d}ddlm} | j	j|||dI dH  nd}ddlm} | j	j|||dI dH  |  I dH  dS )ux   Обработчик выбора кошелька - показывает РАНДОМНЫЙ текст кошелькаNr7   rP   r8   ro   rp   r   r   r   rZ   z#Showing formatted text for wallet 'r   z'. Available texts: r   u   Ошибка навигацииr   r   u<   Информация о кошельке не найдена)r   r   r   r   r   r   r   r   r   r   r   r'   r   rn   r   r   r   r   r   r   )r   r   r`   r   r   r   r7   rP   r8   ro   rp   rN   r   selected_walletr   wallet_textformatted_wallet_textr   r   r   r   r   r   on_wallet_clickedg  sJ   





 r   c              
      s  | j j}t|}| jttd }z7|d}|d }t|d }t|d }t|d }	|d }
|d }|d	krFt|d
krFt|d
 nd}W n tyf } z| j	dddI dH  W Y d}~dS d}~ww z
| j
 I dH  W n	 tyz   Y nw | I dH }|j|||	|
|dI dH  |dkrd}n	|d	krd}nd}t| I dH ||| jI dH }|rtd|  t|dpd}| j
	|I dH  td| d ntd d}| j
	|I dH  | I dH  | 	 I dH  dS )u<   Обработчик подтверждения оплатыNrs   r   r<   rE         r   r   r   u4   Ошибка подтверждения оплатыTr   r7   rP   r8   ro   rp   r   button14operator_walletunknownz:Order successfully saved to database with payment method: text17uP   ✅ Оплата прошла успешно! Ожидайте доставки.zShowing text17 for z paymentr   r   )r   r   r   r   r   r   rG   r   r'   r   r   r   r   r   r   r   r   r	   r   )r   r   r`   r   r   rM   payment_typer7   rP   r8   ro   rp   r   r/   r   r   r   success_textr   r   r   r   on_payment_confirmed  s^   
(	 r   c                    s  | j j}t|}| jttd }|d}t|dk r7ddlm} ||| j	j
jI dH  |  I dH  dS |d }t|d }t|d }	t|d }
|d	 }|d
 }z
| j	 I dH  W n	 tyh   Y nw |j||	|
||dI dH  |dkrt|dpd}t|||	|
|||}| j	j||dI dH  nH|dkrt|d}|st|}t }|r|j|dI dH  t||||	|
||}| j	j||dI dH  nd}ddlm} | j	j|||dI dH  |  I dH  dS )u2   Обработчик навигации назадNrs   r   r   )send_main_menur<   rE   r   r   r   r   paymentr   r   r   r   r   r   r   r   )r   r   r   r   r   r   rG   handlers.menur   r   chatr   r   r   r'   r   r	   r   r6   r   r   r   r   )r   r   r`   r   r   rM   r   nav_typer7   rP   r8   ro   rp   r   r   r   r   r   r   r   r   r   back_navigation_handler  sZ   

r   )r   )@loggingr   r]   aiogramr   r   aiogram.typesr   r   r   aiogram.fsm.contextr   dbr   r	   r
   r   r   r   handlers.order_saver   router	getLogger__name__r(   ry   r   r   BANK_CARD_PREFIXr   r%   r   r   r0   r2   r3   r4   r5   r6   rH   rO   listr\   r_   rm   rn   r   tupler   r   dictr   r   r   callback_queryr   rT   r   r   r   r   r   r   r   r   r   r   r   <module>   sX     

$(&*$+8.*&6'203A