diff --git a/api/v1/views.py b/api/v1/views.py index c2bc1f07..d8129ebe 100644 --- a/api/v1/views.py +++ b/api/v1/views.py @@ -1,3 +1,5 @@ +from datetime import datetime + from django.contrib.auth import get_user_model from rest_framework import status, views, viewsets, generics @@ -565,10 +567,12 @@ class PaymentViewSet(viewsets.ModelViewSet): user = request.query_params.get('user') course = request.query_params.get('course') weekdays = request.query_params.getlist('weekdays[]') + date_start = request.query_params.get('date_start') user = user and User.objects.get(pk=user) course = course and Course.objects.get(pk=course) + date_start = date_start and datetime.strptime(date_start, '%Y-%m-%d') - return Response(Payment.calc_amount(user=user, course=course, weekdays=weekdays)) + return Response(Payment.calc_amount(user=user, course=course, date_start=date_start, weekdays=weekdays)) class ContestViewSet(ExtendedModelViewSet): diff --git a/apps/payment/models.py b/apps/payment/models.py index 761021bc..e2d7cb13 100644 --- a/apps/payment/models.py +++ b/apps/payment/models.py @@ -111,13 +111,25 @@ class Payment(PolymorphicModel): ordering = ('created_at',) @classmethod - def calc_amount(cls, course_payment=None, school_payment=None, user=None, course=None, weekdays=None): + def add_months(cls, sourcedate, months=1): + result = arrow.get(sourcedate, settings.TIME_ZONE).shift(months=months) + if months == 1: + if (sourcedate.month == 2 and sourcedate.day >= 28) or (sourcedate.day == 31 and result.day <= 30) \ + or (sourcedate.month == 1 and sourcedate.day >= 29 and result.day == 28): + result = result.replace(day=1, month=result.month + 1) + return result.datetime + + @classmethod + def calc_amount(cls, course_payment=None, school_payment=None, user=None, course=None, date_start=None, weekdays=None): + date_start = date_start or now().date() + date_end = Payment.add_months(date_start, 1) if course_payment: course = course_payment.course user = course_payment.user if school_payment: user = school_payment.user weekdays = school_payment.weekdays + date_start = school_payment.date_start discount = 0 price = 0 if course: @@ -126,8 +138,8 @@ class Payment(PolymorphicModel): if user: school_payments = SchoolPayment.objects.filter( user=user, - date_start__lte=now().date(), - date_end__gte=now().date(), + date_start__lte=date_start, + date_end__gte=date_start, add_days=False, status__in=[ Pingback.PINGBACK_TYPE_REGULAR, @@ -147,7 +159,8 @@ class Payment(PolymorphicModel): weekday__in=weekdays, ) if add_days: - weekdays_count = weekdays_in_date_range(now().date(), prev_school_payment.date_end) + date_end = prev_school_payment.date_end + weekdays_count = weekdays_in_date_range(date_start, prev_school_payment.date_end) all_weekdays_count = weekdays_in_date_range(prev_school_payment.date_start, prev_school_payment.date_end) for ss in school_schedules: price += ss.month_price // all_weekdays_count.get(ss.weekday, 0) * weekdays_count.get( @@ -163,6 +176,8 @@ class Payment(PolymorphicModel): 'price': price, 'amount': amount, 'discount': discount, + 'date_start': date_start, + 'date_end': date_end, } def calc_commission(self): diff --git a/apps/payment/views.py b/apps/payment/views.py index 09ac590d..ad5a76ef 100644 --- a/apps/payment/views.py +++ b/apps/payment/views.py @@ -27,7 +27,7 @@ from apps.course.models import Course from apps.school.models import SchoolSchedule from apps.payment.tasks import transaction_to_mixpanel, product_payment_to_mixpanel, transaction_to_roistat -from .models import AuthorBalance, CoursePayment, SchoolPayment +from .models import AuthorBalance, CoursePayment, SchoolPayment, Payment logger = logging.getLogger('django') @@ -101,6 +101,8 @@ class SchoolBuyView(TemplateView): host = str(host[0]) + '://' + str(host[1]) weekdays = set(request.GET.getlist('weekdays', [])) roistat_visit = request.COOKIES.get('roistat_visit', None) + date_start = request.GET.get('date_start') + date_start = date_start and datetime.datetime.strptime(date_start, '%Y-%m-%d') or now().date() if not weekdays: messages.error(request, 'Выберите несколько дней недели.') return redirect('school:summer-school') @@ -111,21 +113,21 @@ class SchoolBuyView(TemplateView): return redirect('school:summer-school') prev_school_payment = SchoolPayment.objects.filter( user=request.user, - date_start__lte=now().date(), - date_end__gte=now().date(), + date_start__lte=date_start, + date_end__gte=date_start, add_days=False, status__in=[ Pingback.PINGBACK_TYPE_REGULAR, Pingback.PINGBACK_TYPE_GOODWILL, Pingback.PINGBACK_TYPE_RISK_REVIEWED_ACCEPTED, ], - ).first() # ??? first? + ).last() add_days = bool(prev_school_payment) if add_days: school_payment = SchoolPayment.objects.create( user=request.user, weekdays=weekdays, - date_start=now().date(), + date_start=date_start, date_end=prev_school_payment.date_end, add_days=True, roistat_visit=roistat_visit, @@ -138,6 +140,8 @@ class SchoolBuyView(TemplateView): user=request.user, weekdays=weekdays, roistat_visit=roistat_visit, + date_start=date_start, + date_end=Payment.add_months(date_start), ) product = Product( f'school_{school_payment.id}', @@ -164,14 +168,6 @@ class SchoolBuyView(TemplateView): @method_decorator(csrf_exempt, name='dispatch') class PaymentwallCallbackView(View): - def add_months(self, sourcedate, months=1): - result = arrow.get(sourcedate, settings.TIME_ZONE).shift(months=months) - if months == 1: - if (sourcedate.month == 2 and sourcedate.day >= 28) or (sourcedate.day == 31 and result.day <= 30)\ - or (sourcedate.month == 1 and sourcedate.day >= 29 and result.day == 28): - result = result.replace(day=1, month=result.month + 1) - return result.datetime - def get_request_ip(self): x_forwarded_for = self.request.META.get('HTTP_X_FORWARDED_FOR') if x_forwarded_for: @@ -217,30 +213,6 @@ class PaymentwallCallbackView(View): product_type_name, ) - if product_type_name == 'school': - school_payment = SchoolPayment.objects.filter( - user=payment.user, - add_days=False, - date_start__lte=now().date(), - date_end__gte=now().date(), - status__in=[ - Pingback.PINGBACK_TYPE_REGULAR, - Pingback.PINGBACK_TYPE_GOODWILL, - Pingback.PINGBACK_TYPE_RISK_REVIEWED_ACCEPTED, - ], - ).last() - if school_payment: - if payment.add_days: - date_start = now().date() - date_end = school_payment.date_end - else: - date_start = arrow.get(school_payment.date_end, settings.TIME_ZONE).shift(days=1).datetime - date_end = self.add_months(date_start) - else: - date_start = now().date() - date_end = self.add_months(date_start) - payment.date_start = date_start - payment.date_end = date_end if product_type_name == 'course': properties = { 'payment_id': payment.id, diff --git a/apps/school/templates/summer/prolong_btn.html b/apps/school/templates/summer/prolong_btn.html index c4026242..75021093 100644 --- a/apps/school/templates/summer/prolong_btn.html +++ b/apps/school/templates/summer/prolong_btn.html @@ -1,9 +1,5 @@ продлить diff --git a/apps/school/templates/summer/schedule_purchased.html b/apps/school/templates/summer/schedule_purchased.html index e22818c7..a2106299 100644 --- a/apps/school/templates/summer/schedule_purchased.html +++ b/apps/school/templates/summer/schedule_purchased.html @@ -5,14 +5,10 @@