@ -8,15 +8,18 @@ from django.utils import timezone
from yandex_money . models import Payment
from finance . loggers import FinanceLogger
from finance . models import InvoiceRebilling
from finance . models import InvoiceRebilling , Invoice
from lms import celery_app
finance_logger = FinanceLogger ( )
@celery_app . task
def periodic_billing ( ) :
finance_logger . info ( " start periodic billing task " )
invoices = InvoiceRebilling . objects . filter ( method = ' Y ' ) . exclude ( status = ' F ' )
# TODO заюзать Invoice.BILL_STATUSES
invoices = InvoiceRebilling . objects . filter ( method = ' Y ' , status = ' W ' )
# TODO тут был exclude('F') то есть все неоплаченные... но это не верно!
for invoice in invoices . filter ( expected_date__lt = timezone . now ( ) ) :
# выбираем все необработанные из прошлого
with transaction . atomic ( ) :
@ -55,6 +58,24 @@ def _yandex_repeat_card_payment(invoice):
) ,
verify = os . path . join ( settings . SSL_ROOT , ' yamoney_chain.cer ' )
)
# TODO тут проверять нет ли ошибки яндекса (даже при 200 ответе)
finance_logger . info ( ' YandexMoney repeatCardPayment ended ' ,
invoice_id = invoice . id , response = resp . text , code = resp . status_code , )
resp_text = resp . text
finance_logger . info ( ' YandexMoney repeatCardPayment response ' ,
invoice_id = invoice . id , response = resp_text , code = resp . status_code , )
try :
_check_yandex_response_status ( invoice , resp_text )
except Exception as exc :
finance_logger . exception ( " Can ' t parse yandex response " , invoice_id = invoice . id , response = resp_text )
def _check_yandex_response_status ( invoice , resp_text ) :
from xml . dom import minidom
dom = minidom . parseString ( resp_text )
dom . normalize ( )
resp_node = dom . getElementsByTagName ( " repeatCardPaymentResponse " ) [ 0 ]
status = resp_node . getAttribute ( ' status ' )
if status != ' 0 ' :
error = resp_node . getAttribute ( ' error ' )
processed_dt = resp_node . getAttribute ( ' processedDT ' )
tech_message = resp_node . getAttribute ( ' techMessage ' )
invoice . status + = Invoice . BILL_STATUSES [ - 1 ] [ 0 ]
invoice . comment + = ' Yandex Kassa: ошибка № {} , сообщение {} от {} ' . format ( error , tech_message , processed_dt )