license: moved test period from status to payform; added prepaid bonus payform

remotes/origin/license^2
Andrey 9 years ago
parent fdbb0ddac6
commit 2de6ba2ee0
  1. 16
      project/customer/consts.py
  2. 4
      project/customer/context_processors.py
  3. 4
      project/customer/managers.py
  4. 12
      project/customer/models.py
  5. 11
      project/customer/utils.py
  6. 12
      project/customer/views/license.py

@ -29,13 +29,13 @@ LICENSE_TERMS = (
(LICENSE_TEST_PERIOD_TERM, u'%s дней' % LICENSE_TEST_PERIOD_DAYS),
) + TERMS
LICENSE_TEST_PERIOD = -1
LICENSE_INACTIVE = 1
LICENSE_ACTIVE = 2
LICENSE_EXPIRED = 3
LICENSE_STATUSES = (
(LICENSE_TEST_PERIOD, u'Пробный период'),
(LICENSE_ACTIVE, u'Активирован'),
(LICENSE_INACTIVE, u'Ожидает активации'),
(LICENSE_ACTIVE, u'Активирована'),
(LICENSE_EXPIRED, u'Срок действия истёк'),
)
@ -49,18 +49,22 @@ ORDER_STATUSES = (
(ORDER_SUSPENDED, u'Заморожен'),
)
PAYFORM_FREE = -1
# бесплатные
PAYFORM_BONUS_PREPAID = -2
PAYFORM_TEST_PERIOD = -1
# платные
PAYFORM_BEZNAL = 0
PAYFORM_CARD = 1
PAYFORM_SBER_KVITANZ = 2
# все возможные формы оплаты (для админки)
PAYFORMS = (
(PAYFORM_FREE, u'Бесплатно'),
(PAYFORM_BONUS_PREPAID, u'Бонус за предоплату'),
(PAYFORM_TEST_PERIOD, u'Пробный период'),
(PAYFORM_BEZNAL, u'Безналичный расчёт'),
(PAYFORM_CARD, u'Банковская карта'),
# (PAYFORM_SBER_KVITANZ, u'Квитанция Сбербанка'),
)
# отдельные формы оплаты для показа пользователям в форме покупки лицензии. бесплатные формы оплаты отбрасываются
LICENSEFORM_PAYFORMS = tuple(x for x in PAYFORMS if x[0] > PAYFORM_FREE)
LICENSEFORM_PAYFORMS = tuple(x for x in PAYFORMS if x[0] > PAYFORM_TEST_PERIOD)

@ -28,7 +28,7 @@ def license_check_soon_ends(request):
if not days_left or not cur_license:
current_licenses = (License.objects
.filter(company=request.user.profile, date_from__lte=now_, date_to__gte=now_, deleted=False)
.filter(Q(status__in = [consts.LICENSE_TEST_PERIOD, consts.LICENSE_ACTIVE]) | Q(order_status=consts.ORDER_PAID))
.filter(Q(status__in = [consts.LICENSE_INACTIVE, consts.LICENSE_ACTIVE]) | Q(order_status=consts.ORDER_PAID))
)
if current_licenses:
@ -41,7 +41,7 @@ def license_check_soon_ends(request):
if license_15days is None:
licenses_ends = (License.objects
.filter(company=request.user.profile, date_to__lte = now_ + timedelta(days=consts.LICENSE_DAYS_BEFORE_EXPIRE), deleted=False)
.filter(Q(status__in = [consts.LICENSE_TEST_PERIOD, consts.LICENSE_ACTIVE]) | Q(order_status=consts.ORDER_PAID))
.filter(Q(status__in = [consts.LICENSE_INACTIVE, consts.LICENSE_ACTIVE]) | Q(order_status=consts.ORDER_PAID))
)
next_licenses = License.objects.filter(company=request.user.profile, order_status=consts.ORDER_PAID, deleted=False)

@ -85,8 +85,8 @@ class LicenseManager(models.Manager):
date_from = now_.today(),
date_to = now_.today() + relativedelta(days = consts.LICENSE_TEST_PERIOD_DAYS - 1),
term=consts.LICENSE_TEST_PERIOD_TERM,
status=consts.LICENSE_TEST_PERIOD,
payform=consts.PAYFORM_FREE
status=consts.LICENSE_INACTIVE,
payform=consts.PAYFORM_TEST_PERIOD
)
license.save()
return license

@ -466,17 +466,18 @@ class License(models.Model):
self.suspend_date = _now_.date() # TODO maybe raise ValidationError?
# бесплатные лицензии
if self.payform in [consts.PAYFORM_FREE,]:
if self.payform in [consts.PAYFORM_TEST_PERIOD, consts.PAYFORM_BONUS_PREPAID]:
# только если ещё не задана `дата начала`
if not self.date_from:
self.set_period(now_)
self.status = consts.LICENSE_INACTIVE
# платные лицензии
elif self.payform in [consts.PAYFORM_BEZNAL, consts.PAYFORM_CARD,]:
# если `дата оплаты` задана только что
if not self.__prev_paid_date and self.paid_date:
self.set_period(now_)
self.order_status = consts.ORDER_PAID
self.set_paid()
super(License, self).save(*args, **kwargs)
@ -499,6 +500,7 @@ class License(models.Model):
def set_paid(self):
self.order_status = consts.ORDER_PAID
self.status = consts.LICENSE_INACTIVE
def get_company(self):
return self.company.get_company_name()
@ -515,7 +517,7 @@ class License(models.Model):
elif self.payform == consts.PAYFORM_SBER_KVITANZ: # не используется. однако могут быть старые лицензии с данной формой оплаты
return u'<a href="%s">Скачать квитанцию</a>' % reverse('customer_license_get_doc', kwargs={'order_num': self.id})
elif self.order_status == consts.ORDER_PAID: # or self.status in [consts.LICENSE_ACTIVE]
elif self.order_status == consts.ORDER_PAID or self.status == consts.LICENSE_ACTIVE:
return u'История операций'
else:
@ -528,10 +530,10 @@ class License(models.Model):
return u'%s %s' % (self.term, numeral.choose_plural(self.term, u"месяц, месяца, месяцев"),)
def get_paid_status(self):
if self.order_status == consts.ORDER_PAID:
if self.status == consts.LICENSE_INACTIVE and self.order_status == consts.ORDER_PAID:
return u'Лицензия оплачена, ещё не активирована'
elif self.status in [consts.LICENSE_ACTIVE, consts.LICENSE_TEST_PERIOD]:
elif self.status == consts.LICENSE_ACTIVE:
left = relativedelta(self.date_to, datetime.today())
if left.months:
left_str = u'%d %s %d %s' % (

@ -15,8 +15,9 @@ SUPPORT_EMAIL = getattr(settings, 'SUPPORT_EMAIL')
def check_one_profile(profile, License, now_, manual=False):
profile_was_active = profile.active
# действующие лицензии для установки/сброса признака активности профиля
licenses = (License.objects.filter(company=profile, date_from__lte=now_, date_to__gte=now_, deleted=False)
.filter(Q(status__in = [consts.LICENSE_TEST_PERIOD, consts.LICENSE_ACTIVE]) | Q(order_status=consts.ORDER_PAID))
.filter(Q(status__in=[consts.LICENSE_INACTIVE, consts.LICENSE_ACTIVE]) | Q(order_status=consts.ORDER_PAID))
)
licenses.filter(order_status=consts.ORDER_PAID).update(status=consts.LICENSE_ACTIVE)
@ -48,10 +49,12 @@ def check_one_profile(profile, License, now_, manual=False):
order_status=consts.ORDER_PAID, deleted=False)
if not licenses_remain:
# ожидающие оплаты лицензии (без учёта даты заказа)
licenses_to_pay = License.objects.filter(company=profile, order_status=consts.ORDER_UNPAID, deleted=False)
# истёкшие лицензии
licenses = License.objects.filter(company=profile, date_to__lt=now_,
status__in=[consts.LICENSE_TEST_PERIOD, consts.LICENSE_ACTIVE], deleted=False)
status__in=[consts.LICENSE_INACTIVE, consts.LICENSE_ACTIVE], deleted=False)
licenses.update(status=consts.LICENSE_EXPIRED)
@ -68,8 +71,9 @@ def check_one_profile(profile, License, now_, manual=False):
email = EmailMessage(subject=subject, to=(user_email,), body=email_body)
email.send()
# лицензии с истекающим сроком действия
licenses = License.objects.filter(company=profile, date_to = now_ + timedelta(days=1),
status__in=[consts.LICENSE_TEST_PERIOD, consts.LICENSE_ACTIVE], deleted=False)
status__in=[consts.LICENSE_INACTIVE, consts.LICENSE_ACTIVE], deleted=False)
if licenses:
template_name = 'myauth/license_ends.txt'
@ -84,6 +88,7 @@ def check_one_profile(profile, License, now_, manual=False):
email = EmailMessage(subject=subject, to=(user_email,), body=email_body)
email.send()
# ожидающие оплаты лицензии (с учётом даты заказа)
licenses = License.objects.filter(company=profile, order_date = now_ - timedelta(days = consts.ORDER_PAY_DAYS - 1),
order_status=consts.ORDER_UNPAID, deleted=False)

@ -92,14 +92,13 @@ def order_license(request):
@login_required
def license_list(request):
"""Список счетов на лицензии
"""Список лицензий
"""
raise_if_no_profile(request)
template_name = 'customer/profile/license_list.html'
# TODO maybe explicitly list license statuses?
licenses = License.objects.filter(company=request.user.profile, status__gt=consts.LICENSE_TEST_PERIOD, deleted=False).order_by('-id')
licenses = License.objects.filter(company=request.user.profile, deleted=False).order_by('-id')
return render(request, template_name, {'licenses': licenses})
@ -112,11 +111,9 @@ def paid_list(request):
template_name = 'customer/profile/paid_list.html'
# TODO почему в оплаченных лицензиях выводится пробный период и замороженные?
licenses = (License.objects
.filter(company=request.user.profile, deleted=False)
.filter(Q(status__in = [consts.LICENSE_TEST_PERIOD, consts.LICENSE_ACTIVE, consts.LICENSE_EXPIRED]) |
Q(order_status__in=[consts.ORDER_PAID, consts.ORDER_SUSPENDED]))
.filter(order_status__in=[consts.ORDER_PAID, consts.ORDER_SUSPENDED])
.order_by('-id')
)
@ -131,8 +128,9 @@ def delete_license(request, pk):
raise_if_no_profile(request)
try:
# можно удалить только если счёт не оплачен и у него не бесплатная форма оплаты
license = License.objects.get(pk=pk, company=request.user.profile,
order_status=consts.ORDER_UNPAID, payform__gt=consts.PAYFORM_FREE)
order_status=consts.ORDER_UNPAID, payform__gt=consts.PAYFORM_TEST_PERIOD)
if request.method == 'POST':
license.deleted = True
license.save()

Loading…
Cancel
Save