You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
2.8 KiB
85 lines
2.8 KiB
import json
|
|
from datetime import datetime, timedelta
|
|
|
|
import logging
|
|
|
|
import os
|
|
import requests
|
|
from django_celery_beat.models import CrontabSchedule, PeriodicTask
|
|
from yandex_money.models import Payment
|
|
|
|
from finance.models import InvoiceRebilling
|
|
from lms import celery_app
|
|
from django.conf import settings
|
|
|
|
|
|
logger_yandex = logging.getLogger('yandex_money')
|
|
|
|
|
|
def setup_periodic_billing(order_number):
|
|
# TODO: настроить периодичность и срок окончания
|
|
# 12:00 первого числа каждого месяца
|
|
logger_yandex.info("Оформдение новой рассрочки")
|
|
|
|
schedule, _ = CrontabSchedule.objects.get_or_create(
|
|
minute='0',
|
|
hour='*/3',
|
|
)
|
|
PeriodicTask.objects.create(
|
|
crontab=schedule,
|
|
name='Periodic billing (order_number={})'.format(order_number),
|
|
task='finance.tasks.periodic_billing',
|
|
kwargs=json.dumps({
|
|
'order_number': order_number
|
|
}),
|
|
expires=datetime.utcnow() + timedelta(days=180) # в течение полугода
|
|
)
|
|
|
|
|
|
@celery_app.task
|
|
def periodic_billing(order_number):
|
|
try:
|
|
sample = InvoiceRebilling.objects.get(yandex_pay__order_number=order_number)
|
|
except InvoiceRebilling.DoesNotExist:
|
|
raise ValueError('Номер заказа {} не найден'.format(order_number))
|
|
|
|
bill = sample.bill
|
|
|
|
invoice = InvoiceRebilling.objects.create(
|
|
status='P',
|
|
price=sample.price,
|
|
method=sample.method,
|
|
is_open=sample.is_open,
|
|
bill=bill,
|
|
)
|
|
|
|
if invoice.method == 'Y':
|
|
user = bill.user
|
|
yandex_pay = Payment.objects.create(
|
|
invoice_id=sample.yandex_pay.invoice_id,
|
|
order_amount=invoice.price,
|
|
customer_number=user.id,
|
|
user=user,
|
|
cps_email=user.email
|
|
)
|
|
invoice.yandex_pay = yandex_pay
|
|
invoice.save()
|
|
|
|
repeat_card_payment(invoice)
|
|
|
|
|
|
def repeat_card_payment(invoice):
|
|
resp = requests.post(settings.YANDEX_MONEY_MWS_URL + 'repeatCardPayment',
|
|
data={
|
|
'clientOrderId': invoice.id, # уникальное возрастающее целое число
|
|
'invoiceId': invoice.yandex_pay.invoice_id,
|
|
'amount': invoice.price,
|
|
'orderNumber': invoice.yandex_pay.order_number
|
|
},
|
|
cert=(
|
|
os.path.join(settings.SSL_ROOT, 'skillbox.cer'),
|
|
os.path.join(settings.SSL_ROOT, 'skillbox.key')
|
|
),
|
|
verify=os.path.join(settings.SSL_ROOT, 'yamoney_chain.cer'))
|
|
|
|
logger_yandex.info(resp.text)
|
|
|