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.
141 lines
5.1 KiB
141 lines
5.1 KiB
# -*- coding: utf-8 -*-
|
|
|
|
from uuid import uuid4
|
|
|
|
from django.conf import settings
|
|
from django.db import models
|
|
|
|
from .signals import payment_process
|
|
from .signals import payment_completed
|
|
|
|
|
|
class Payment(models.Model):
|
|
class STATUS:
|
|
PROCESSED = 'processed'
|
|
SUCCESS = 'success'
|
|
FAIL = 'fail'
|
|
|
|
CHOICES = (
|
|
(PROCESSED, 'Processed'),
|
|
(SUCCESS, 'Success'),
|
|
(FAIL, 'Fail'),
|
|
)
|
|
|
|
class PAYMENT_TYPE:
|
|
PC = 'PC'
|
|
AC = 'AC'
|
|
GP = 'GP'
|
|
MC = 'MC'
|
|
WM = 'WM'
|
|
SB = 'SB'
|
|
AB = 'AB'
|
|
MA = 'MA'
|
|
PB = 'PB'
|
|
QW = 'QW'
|
|
QP = 'QP'
|
|
|
|
CHOICES = (
|
|
(PC, u'Кошелек Яндекс.Деньги'),
|
|
(AC, u'Банковская карта'),
|
|
(GP, u'Наличными через кассы и терминалы'),
|
|
(MC, u'Счет мобильного телефона'),
|
|
(WM, u'Кошелек WebMoney'),
|
|
(SB, u'Сбербанк: оплата по SMS или Сбербанк Онлайн'),
|
|
(AB, u'Альфа-Клик'),
|
|
(MA, u'MasterPass'),
|
|
(PB, u'Интернет-банк Промсвязьбанка'),
|
|
(QW, u'QIWI Wallet'),
|
|
(QP, u'Доверительный платеж (Куппи.ру)'),
|
|
)
|
|
|
|
class CURRENCY:
|
|
RUB = 643
|
|
TEST = 10643
|
|
|
|
CHOICES = (
|
|
(RUB, u'Рубли'),
|
|
(TEST, u'Тестовая валюта'),
|
|
)
|
|
|
|
user = models.ForeignKey(
|
|
settings.AUTH_USER_MODEL, blank=True, null=True,
|
|
verbose_name=u'Пользователь')
|
|
pub_date = models.DateTimeField(u'Время создания', auto_now_add=True)
|
|
|
|
# Required request fields
|
|
shop_id = models.PositiveIntegerField(
|
|
u'ID магазина', default=settings.YANDEX_MONEY_SHOP_ID)
|
|
scid = models.PositiveIntegerField(
|
|
u'Номер витрины', default=settings.YANDEX_MONEY_SCID)
|
|
customer_number = models.CharField(
|
|
u'Идентификатор плательщика', max_length=64,
|
|
default=lambda: str(uuid4()).replace('-', ''))
|
|
order_amount = models.DecimalField(
|
|
u'Сумма заказа', max_digits=15, decimal_places=2)
|
|
|
|
# Non-required fields
|
|
article_id = models.PositiveIntegerField(
|
|
u'Идентификатор товара', blank=True, null=True)
|
|
payment_type = models.CharField(
|
|
u'Способ платежа', max_length=2, default=PAYMENT_TYPE.PC,
|
|
choices=PAYMENT_TYPE.CHOICES)
|
|
order_number = models.CharField(
|
|
u'Номер заказа', max_length=64,
|
|
default=lambda: str(uuid4()).replace('-', ''))
|
|
cps_email = models.EmailField(
|
|
u'Email плательщика', max_length=100, blank=True, null=True)
|
|
cps_phone = models.CharField(
|
|
u'Телефон плательщика', max_length=15, blank=True, null=True)
|
|
success_url = models.URLField(
|
|
u'URL успешной оплаты', default=settings.YANDEX_MONEY_SUCCESS_URL)
|
|
fail_url = models.URLField(
|
|
u'URL неуспешной оплаты', default=settings.YANDEX_MONEY_FAIL_URL)
|
|
|
|
# Transaction info
|
|
status = models.CharField(
|
|
u'Статус', max_length=16, choices=STATUS.CHOICES,
|
|
default=STATUS.PROCESSED)
|
|
invoice_id = models.PositiveIntegerField(
|
|
u'Номер транзакции оператора', blank=True, null=True)
|
|
shop_amount = models.DecimalField(
|
|
u'Сумма полученная на р/с', max_digits=15, decimal_places=2, blank=True,
|
|
null=True, help_text=u'За вычетом процента оператора')
|
|
order_currency = models.PositiveIntegerField(
|
|
u'Валюта', default=CURRENCY.RUB, choices=CURRENCY.CHOICES)
|
|
shop_currency = models.PositiveIntegerField(
|
|
u'Валюта полученная на р/с', blank=True, null=True,
|
|
default=CURRENCY.RUB, choices=CURRENCY.CHOICES)
|
|
performed_datetime = models.DateTimeField(
|
|
u'Время выполнение запроса', blank=True, null=True)
|
|
|
|
@property
|
|
def is_payed(self):
|
|
return self.status == self.STATUS.SUCCESS
|
|
|
|
def send_signals(self):
|
|
status = self.status
|
|
if status == self.STATUS.PROCESSED:
|
|
payment_process.send(sender=self)
|
|
if status == self.STATUS.SUCCESS:
|
|
payment_completed.send(sender=self)
|
|
|
|
@classmethod
|
|
def get_used_shop_ids(cls):
|
|
return cls.objects.values_list('shop_id', flat=True).distinct()
|
|
|
|
@classmethod
|
|
def get_used_scids(cls):
|
|
return cls.objects.values_list('scid', flat=True).distinct()
|
|
|
|
class Meta:
|
|
ordering = ('-pub_date',)
|
|
unique_together = (
|
|
('shop_id', 'order_number'),
|
|
)
|
|
verbose_name = u'платёж'
|
|
verbose_name_plural = u'платежи'
|
|
app_label = 'yandex_money'
|
|
|
|
def __unicode__(self):
|
|
return u'[Payment id={}, order_number={}, payment_type={}, status={}]'.format(
|
|
self.id, self.order_number, self.payment_type, self.status)
|
|
|