Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions pythonpro/payments/facade.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,11 +94,14 @@ <h2 class="mt-4">Módulo de Python Intermediário</h2>
</p>
<p>Somado ao valor do bônus, o custo seria de R$ 1500,00.</span>.
</p>
<p>Mas você pode se inscrever hoje por <span class="font-weight-bold">APENAS R$ 99,99</span> para
<p>Mas você pode se inscrever hoje por <span class="font-weight-bold">APENAS R$ {{ price_float|floatformat:2 }}</span> para
aprender as 6 ferramentas que todo programador profissional usa em seu dia a dia.
</p>
{% if is_promotion_season %}
<p>Promoção valida apenas até {{ promotion_end_date }}</p>
{% endif %}
<button class="btn btn-warning">SIM! Quero me inscrever por <span
class="font-weight-bold"><u>R$ 99,99</u></span> &raquo;
class="font-weight-bold"><u>R$ {{ price_float|floatformat:2 }}</u></span> &raquo;
</button>
</div>
</div>
Expand Down
25 changes: 25 additions & 0 deletions pythonpro/payments/tests/test_landing_pages.py
Original file line number Diff line number Diff line change
@@ -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):
Expand All @@ -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

Expand Down
2 changes: 1 addition & 1 deletion pythonpro/payments/tests/test_pytools_promo.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()


Expand Down
18 changes: 14 additions & 4 deletions pythonpro/payments/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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:
Expand Down Expand Up @@ -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
)
Expand Down