From 9cb0e5ce88f4d38fc3b299332434de146d7b80b1 Mon Sep 17 00:00:00 2001 From: renzon Date: Thu, 25 Jul 2019 00:49:03 -0300 Subject: [PATCH] Implemented 50% Pytools promotion on landing page and capture close #1317 --- pythonpro/payments/facade.py | 10 +++++--- .../payments/client_landing_page.html | 7 ++++-- .../payments/tests/test_landing_pages.py | 25 +++++++++++++++++++ .../payments/tests/test_pytools_promo.py | 2 +- pythonpro/payments/views.py | 18 ++++++++++--- 5 files changed, 51 insertions(+), 11 deletions(-) diff --git a/pythonpro/payments/facade.py b/pythonpro/payments/facade.py index 4322e78a..a86f0de1 100644 --- a/pythonpro/payments/facade.py +++ b/pythonpro/payments/facade.py @@ -2,16 +2,18 @@ from typing import Tuple import pagarme as _pagarme -from dateutil.relativedelta import MO, TH, relativedelta +from dateutil.relativedelta import MO, relativedelta from django.conf import settings from django.utils.timezone import now _pagarme.authentication_key(settings.PAGARME_API_KEY) PYTOOLS_PRICE = 9999 +PYTOOLS_PROMOTION_PRICE = 4999 -def pytools_capture(token: str): - return _pagarme.transaction.capture(token, {'amount': PYTOOLS_PRICE}) +def pytools_capture(token: str, user_creation: datetime): + price = PYTOOLS_PROMOTION_PRICE if is_on_pytools_promotion_season(user_creation) else PYTOOLS_PRICE + return _pagarme.transaction.capture(token, {'amount': price}) class PagarmeValidationException(Exception): @@ -47,7 +49,7 @@ def calculate_pytools_promotion_interval() -> Tuple[datetime, datetime]: """ now_dt = now() this_week_monday = now_dt + relativedelta(weekday=MO(-1), hour=0, minute=0, second=0) - this_week_thursday = this_week_monday + relativedelta(weekday=TH, hour=23, minute=59, second=59) + this_week_thursday = this_week_monday + relativedelta(days=5, hour=23, minute=59, second=59) return this_week_monday, this_week_thursday diff --git a/pythonpro/payments/templates/payments/client_landing_page.html b/pythonpro/payments/templates/payments/client_landing_page.html index a971ff05..81d14d6c 100644 --- a/pythonpro/payments/templates/payments/client_landing_page.html +++ b/pythonpro/payments/templates/payments/client_landing_page.html @@ -94,11 +94,14 @@

Módulo de Python Intermediário

Somado ao valor do bônus, o custo seria de R$ 1500,00..

-

Mas você pode se inscrever hoje por APENAS R$ 99,99 para +

Mas você pode se inscrever hoje por APENAS R$ {{ price_float|floatformat:2 }} para aprender as 6 ferramentas que todo programador profissional usa em seu dia a dia.

+ {% if is_promotion_season %} +

Promoção valida apenas até {{ promotion_end_date }}

+ {% endif %} diff --git a/pythonpro/payments/tests/test_landing_pages.py b/pythonpro/payments/tests/test_landing_pages.py index c7ea6ecd..39ec3866 100644 --- a/pythonpro/payments/tests/test_landing_pages.py +++ b/pythonpro/payments/tests/test_landing_pages.py @@ -1,6 +1,13 @@ +from datetime import datetime + +import freezegun import pytest +import pytz from django.urls import reverse +from pythonpro.django_assertions import dj_assert_contains +from pythonpro.payments import facade + @pytest.fixture def client_lp_resp(client_with_lead, mocker, logged_user): @@ -20,6 +27,24 @@ def test_logged_status_code(client_lp_resp): assert client_lp_resp.status_code == 200 +def test_logged_non_promotion_price(client_lp_resp): + dj_assert_contains(client_lp_resp, facade.PYTOOLS_PRICE) + + +@pytest.fixture +def client_promotion_lp_resp(client_with_lead, mocker, logged_user): + tag_as = mocker.patch('pythonpro.payments.views.tag_as') + logged_user.date_joined = datetime(2019, 6, 3, tzinfo=pytz.utc) + logged_user.save() + with freezegun.freeze_time('2019-07-22'): + yield client_with_lead.get(reverse('client_landing_page'), secure=True) + tag_as.assert_called_once_with(logged_user.email, 'potential-client') + + +def test_logged_promotion_price(client_promotion_lp_resp): + dj_assert_contains(client_promotion_lp_resp, facade.PYTOOLS_PROMOTION_PRICE) + + def test_anonymous_access_status_code(anonymous_client_lp_resp): assert anonymous_client_lp_resp.status_code == 200 diff --git a/pythonpro/payments/tests/test_pytools_promo.py b/pythonpro/payments/tests/test_pytools_promo.py index 13464c22..8170b702 100644 --- a/pythonpro/payments/tests/test_pytools_promo.py +++ b/pythonpro/payments/tests/test_pytools_promo.py @@ -12,7 +12,7 @@ ) def test_promotion_interval(now): with freeze_time(now): - begin, end = datetime(2019, 7, 22, 0, 0, 0, tzinfo=pytz.utc), datetime(2019, 7, 25, 23, 59, 59, tzinfo=pytz.utc) + begin, end = datetime(2019, 7, 22, 0, 0, 0, tzinfo=pytz.utc), datetime(2019, 7, 27, 23, 59, 59, tzinfo=pytz.utc) assert (begin, end) == calculate_pytools_promotion_interval() diff --git a/pythonpro/payments/views.py b/pythonpro/payments/views.py index 0da9b5d2..cdc54645 100644 --- a/pythonpro/payments/views.py +++ b/pythonpro/payments/views.py @@ -6,12 +6,13 @@ from django.shortcuts import render from django.template.loader import render_to_string from django.urls import reverse +from django.utils.timezone import now from django.views.decorators.csrf import csrf_exempt from pythonpro import facade from pythonpro.mailchimp.facade import tag_as from pythonpro.payments import facade as payment_facade -from pythonpro.payments.facade import PYTOOLS_PRICE, PagarmeNotPaidTransaction +from pythonpro.payments.facade import PYTOOLS_PRICE, PYTOOLS_PROMOTION_PRICE, PagarmeNotPaidTransaction def options(request): @@ -27,12 +28,13 @@ def thanks(request): def pytools_capture(request): if request.method != 'POST': return - pagarme_resp = payment_facade.pytools_capture(request.POST['token']) + user = request.user + user_creation = user.date_joined if user.is_authenticated else now() + pagarme_resp = payment_facade.pytools_capture(request.POST['token'], user_creation) customer = pagarme_resp['customer'] customer_email = customer['email'] source = request.GET.get('utm_source', default='unknown') customer_first_name = customer['name'].split()[0] - user = request.user payment_method = pagarme_resp['payment_method'] if payment_method == 'credit_card': if user.is_authenticated: @@ -97,11 +99,19 @@ def client_landing_page(request): notification_url = reverse('payments:pagarme_notification', kwargs={'user_id': user.id}) else: notification_url = reverse('payments:pagarme_anonymous_notification') + user_creation = user.date_joined if user.is_authenticated else now() + is_promotion_season = payment_facade.is_on_pytools_promotion_season(user_creation) + price = PYTOOLS_PROMOTION_PRICE if is_promotion_season else PYTOOLS_PRICE + price_float = price / 100 + _, promotion_end_date = payment_facade.calculate_pytools_promotion_interval() return render( request, 'payments/client_landing_page.html', { 'PAGARME_CRYPTO_KEY': settings.PAGARME_CRYPTO_KEY, - 'price': PYTOOLS_PRICE, + 'price': price, + 'price_float': price_float, + 'is_promotion_season': is_promotion_season, + 'promotion_end_date': promotion_end_date, 'notification_url': request.build_absolute_uri( notification_url )