feat(admin): add admin notification system for deposits, purchases, and renewals

This commit is contained in:
2026-06-04 12:35:32 +07:00
parent 5ec9491e22
commit 4c5a16a3ca
11 changed files with 249 additions and 59 deletions

View File

@@ -21,6 +21,7 @@ load_dotenv()
ENDPOINT = "/pally/result"
def calculate_signature(
out_sum: str,
inv_id: str,
@@ -43,9 +44,9 @@ def main():
help="Статус платежа (по умолчанию SUCCESS)",
)
parser.add_argument(
"--customer-pays-fees",
"--customer-pays-fees",
action="store_true",
help="Симулировать сценарий 'клиент платит комиссию'"
help="Симулировать сценарий 'клиент платит комиссию'",
)
args = parser.parse_args()
@@ -54,18 +55,18 @@ def main():
# ИСПРАВЛЕНО: InvId должен содержать ID счета из БД (это order_id при создании счета)
# Именно InvId используется в webhook handler для поиска счета в БД
inv_id = str(args.bill_id) # InvId = bill ID из нашей БД (order_id при создании)
trs_id = f"LXZv3R{args.bill_id}" # TrsId - уникальный идентификатор счета в Pally
trs_id = f"LXZv3R{args.bill_id}" # TrsId - уникальный идентификатор счета в Pally
currency = "RUB"
custom = None # custom field не используется в production (остается None)
# Симуляция комиссии
if args.customer_pays_fees:
# Симулируем комиссию ~10% (как в вашем продакшене: 50 -> 55.4)
commission_rate = 0.108 # ~10.8%
gross_amount = args.amount * (1 + commission_rate)
commission = gross_amount - args.amount
print(f"🔄 Симулируется сценарий 'клиент платит комиссию':")
print(f"customer pays fee:")
print(f" Сумма заказа: {args.amount} RUB")
print(f" Комиссия: {commission:.2f} RUB")
print(f" Итого к оплате: {gross_amount:.2f} RUB")
@@ -75,9 +76,7 @@ def main():
commission = 0.00
# Сигнатура рассчитывается с использованием InvId (который содержит bill ID)
signature = calculate_signature(
f"{gross_amount:.2f}", inv_id, pally_token
)
signature = calculate_signature(f"{gross_amount:.2f}", inv_id, pally_token)
# Используем правильные имена полей согласно документации pally.info
payload = {
@@ -90,7 +89,7 @@ def main():
"custom": custom, # None в production
"SignatureValue": signature,
}
# Добавляем BalanceAmount только если клиент платит комиссию
if args.customer_pays_fees:
payload["BalanceAmount"] = str(args.amount) # Сумма к зачислению (без комиссии)