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

# -*- 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)