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 Invoice 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 первого числа каждого месяца schedule, _ = CrontabSchedule.objects.get_or_create( minute='0', hour='12', day_of_week='*', day_of_month='1', month_of_year='*' ) 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 = Invoice.objects.get(yandex_pay__order_number=order_number) except Invoice.DoesNotExist: raise ValueError('Номер заказа {} не найден'.format(order_number)) bill = sample.bill invoice = Invoice.objects.create( status='P', price=sample.price, method=sample.method, rebilling=True, 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)