diff --git a/apps/notification/tasks.py b/apps/notification/tasks.py index 28544d52..e6629552 100644 --- a/apps/notification/tasks.py +++ b/apps/notification/tasks.py @@ -98,3 +98,9 @@ def sendgrid_update_recipients(): sg = get_sendgrid_client() response = sg.client.contactdb.recipients.patch(request_body=data) print(response.body) + + +@app.task +def send_gift_certificate(user_gift_certificate): + send_email('Подарочный сертификат от Lil School', user_gift_certificate.user.email, 'notification/email/gift_certificate.html', + user_gift_certificate=user_gift_certificate, gift_certificate=user_gift_certificate.gift_certificate) diff --git a/apps/notification/templates/notification/email/gift_certificate.html b/apps/notification/templates/notification/email/gift_certificate.html new file mode 100644 index 00000000..4e745a1a --- /dev/null +++ b/apps/notification/templates/notification/email/gift_certificate.html @@ -0,0 +1,82 @@ +{% extends "notification/email/_base.html" %} + +{% block content %} +

Поздравляем с успешной + покупкой!

+
+

Вы получаете {{ gift_certificate.price }} лиликов на счет! 1 LIL = 1 руб.
+ Накапливайте монеты и тратьте их на оплату школы и курсов. +

+
+
+
+
+ + + + + + + +
Подарочный сертификат + {{ gift_certificate.price }} р. +
+
+
+
Чтобы воспользоваться сертификатом, перейдите по ссылке
+
+ {% url 'gift-certificate-get' gift_certificate.code %} +
+
+ Или воспользуйтесь сертификатом, введя уникальный код на в разделе + вашего профиля на сайте lil.school +
+
Ваш код +
+
+
{{ user_gift_certificate.code }} +
+
+
+ Вы так же можете отправить это письмо, ссылку или код вашему другу, чтобы подарить ему этот сертификат. +
+{% endblock content %} diff --git a/apps/payment/admin.py b/apps/payment/admin.py index 19166563..b26b03a2 100644 --- a/apps/payment/admin.py +++ b/apps/payment/admin.py @@ -5,7 +5,7 @@ from polymorphic.admin import ( PolymorphicChildModelFilter, ) -from .models import AuthorBalance, CoursePayment, SchoolPayment, Payment +from .models import AuthorBalance, CoursePayment, SchoolPayment, Payment, GiftCertificate @admin.register(AuthorBalance) @@ -61,3 +61,8 @@ class PaymentAdmin(PolymorphicParentModelAdmin): CoursePayment, SchoolPayment, ) + + +@admin.register(GiftCertificate) +class GiftCertificateAdmin(admin.ModelAdmin): + pass diff --git a/apps/payment/migrations/0025_giftcertificate_usergiftcertificate.py b/apps/payment/migrations/0025_giftcertificate_usergiftcertificate.py new file mode 100644 index 00000000..d5ac1b08 --- /dev/null +++ b/apps/payment/migrations/0025_giftcertificate_usergiftcertificate.py @@ -0,0 +1,34 @@ +# Generated by Django 2.0.6 on 2018-10-29 14:36 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('payment', '0024_auto_20181002_0338'), + ] + + operations = [ + migrations.CreateModel( + name='GiftCertificate', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('price', models.DecimalField(decimal_places=2, default=0, editable=False, max_digits=8)), + ], + ), + migrations.CreateModel( + name='UserGiftCertificate', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('recipient', models.EmailField(max_length=254)), + ('bonuses_sent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='payment.UserBonus')), + ('gift_certificate', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='payment.GiftCertificate')), + ('payment', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='payment.Payment')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='gift_certificates', to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/apps/payment/migrations/0026_auto_20181101_1546.py b/apps/payment/migrations/0026_auto_20181101_1546.py new file mode 100644 index 00000000..45cd9906 --- /dev/null +++ b/apps/payment/migrations/0026_auto_20181101_1546.py @@ -0,0 +1,39 @@ +# Generated by Django 2.0.6 on 2018-11-01 15:46 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('payment', '0025_giftcertificate_usergiftcertificate'), + ] + + operations = [ + migrations.CreateModel( + name='GiftCertificatePayment', + fields=[ + ('payment_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='payment.Payment')), + ], + options={ + 'verbose_name': 'Платеж за подарочный сертификат', + 'verbose_name_plural': 'Платежи за подарочные сертификаты', + }, + bases=('payment.payment',), + ), + migrations.AlterModelOptions( + name='giftcertificate', + options={'ordering': ('price',)}, + ), + migrations.AlterField( + model_name='giftcertificate', + name='price', + field=models.DecimalField(decimal_places=2, default=0, max_digits=8), + ), + migrations.AddField( + model_name='giftcertificatepayment', + name='gift_certificate', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='payments', to='payment.GiftCertificate', verbose_name='Подарочный сертификат'), + ), + ] diff --git a/apps/payment/models.py b/apps/payment/models.py index 4ac9b6b9..34e2765c 100644 --- a/apps/payment/models.py +++ b/apps/payment/models.py @@ -1,5 +1,6 @@ from decimal import Decimal import arrow +import short_url from django.db.models import Func, F from paymentwall import Pingback @@ -147,6 +148,8 @@ class Payment(PolymorphicModel): referrer_bonus = user.referral.referrer_bonus if payment and payment.is_paid(): price = payment.amount + elif isinstance(payment, GiftCertificatePayment): + price = payment.gift_certificate.price elif course: price = course.price else: @@ -244,6 +247,12 @@ class Payment(PolymorphicModel): else: author_balance.amount = self.amount author_balance.save() + if isinstance(self, UserGiftCertificate) and self.is_paid(): + ugs, created = UserGiftCertificate.objects.get_or_create(user=self.user, gift_certificate=self.gift_certificate, + payment=self) + if created: + from apps.notification.tasks import send_gift_certificate + send_gift_certificate.delay(ugs) # Если юзер реферал и нет платежа, где применялась скидка if hasattr(self.user, 'referral') and not self.user.referral.payment and self.is_paid(): # Платеж - как сигнал, что скидка применилась @@ -283,6 +292,15 @@ class SchoolPayment(Payment): return arrow.get(self.date_end, settings.TIME_ZONE).humanize(locale='ru') +class GiftCertificatePayment(Payment): + gift_certificate = models.ForeignKey('GiftCertificate', on_delete=models.CASCADE, + verbose_name='Подарочный сертификат', related_name='payments') + + class Meta: + verbose_name = 'Платеж за подарочный сертификат' + verbose_name_plural = 'Платежи за подарочные сертификаты' + + class UserBonus(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='bonuses') amount = models.DecimalField(max_digits=8, decimal_places=2, default=0, editable=False) @@ -295,8 +313,19 @@ class UserBonus(models.Model): class GiftCertificate(models.Model): - user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='bonuses') + price = models.DecimalField(max_digits=8, decimal_places=2, default=0) + + class Meta: + ordering = ('price',) + + +class UserGiftCertificate(models.Model): + gift_certificate = models.ForeignKey(GiftCertificate, on_delete=models.CASCADE,) + user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='gift_certificates') recipient = models.EmailField() - amount = models.DecimalField(max_digits=8, decimal_places=2, default=0, editable=False) payment = models.ForeignKey(Payment, on_delete=models.SET_NULL, null=True) - bonus_sended = models.ForeignKey(UserBonus, blank=True, null=True) + bonuses_sent = models.ForeignKey(UserBonus, on_delete=models.CASCADE, blank=True, null=True) + + @property + def code(self): + return short_url.encode_url(self.id) if self.id else None diff --git a/apps/payment/templates/payment/gift_certificate.html b/apps/payment/templates/payment/gift_certificate.html new file mode 100644 index 00000000..7d291137 --- /dev/null +++ b/apps/payment/templates/payment/gift_certificate.html @@ -0,0 +1,17 @@ +{% extends "templates/lilcity/index.html" %} {% load static %} + +{% block content %} +
+
+
Вам подарок!
+
+ Пользователь ХХХ дарит вам сертификат на сумму ХХХ руб +
+ +
+
+{% endblock content %} diff --git a/apps/payment/templates/payment/gift_certificate_item.html b/apps/payment/templates/payment/gift_certificate_item.html new file mode 100644 index 00000000..f77528d0 --- /dev/null +++ b/apps/payment/templates/payment/gift_certificate_item.html @@ -0,0 +1,25 @@ +{% load thumbnail %} +{% load static %} +{% load data_liked from data_liked %} + +
+
+
+ подарочный сертификат +
{{ gift_certificate.price|floatformat:"-2" }}₽
+
+ {% if user_gift_certificate %} + {% if user_gift_certificate.bonuses_sent %} +
Получено
+ {% else %} +
Ожидает получения
+ {% endif %} + {% else %} + Купить сертификат + {% endif %} +
diff --git a/apps/payment/templates/payment/gift_certificate_items.html b/apps/payment/templates/payment/gift_certificate_items.html new file mode 100644 index 00000000..05730083 --- /dev/null +++ b/apps/payment/templates/payment/gift_certificate_items.html @@ -0,0 +1,4 @@ +{% for gift_certificate in gift_certificates %} + {% cycle 'theme_pink2' 'theme_cyan' 'theme_violet2' as theme_color silent %} + {% include "payment/gift_certificate_item.html" %} +{% endfor %} diff --git a/apps/payment/templates/payment/gift_certificate_payment_success.html b/apps/payment/templates/payment/gift_certificate_payment_success.html new file mode 100644 index 00000000..793eb25e --- /dev/null +++ b/apps/payment/templates/payment/gift_certificate_payment_success.html @@ -0,0 +1,13 @@ +{% extends "templates/lilcity/index.html" %} {% load static %} {% block content %} +
+
+
+
Вы успешно приобрели подарочный сертификат!
+
Мы отправили письмо с сертификатом на вашу почту.
+ +
+
+
+{% endblock content %} diff --git a/apps/payment/templates/payment/gift_certificates.html b/apps/payment/templates/payment/gift_certificates.html new file mode 100644 index 00000000..e1e614e0 --- /dev/null +++ b/apps/payment/templates/payment/gift_certificates.html @@ -0,0 +1,31 @@ +{% extends "templates/lilcity/index.html" %} {% load static %} + +{% block content %} +
+
+
+ Подарочные сертификаты +
+
+
+ +
+
+
Если вам не совсем удобно заниматься с нами каждый день в нашей онлайн-школе, специально для вас мы + делаем отдельные уроки в записи, которые вы можете проходить, когда вам будет удобно.

+ Учите и развивайте креативное мышление когда и где угодно +
+
Сертификаты
+
+ {% include "payment/gift_certificate_items.html" %} +
+
+
+{% endblock content %} diff --git a/apps/payment/templates/payment/payment_success.html b/apps/payment/templates/payment/payment_success.html index 7d174018..9d256634 100644 --- a/apps/payment/templates/payment/payment_success.html +++ b/apps/payment/templates/payment/payment_success.html @@ -7,10 +7,17 @@
ПЕРЕЙТИ К ШКОЛЕ
- {% else %} + {% endif %} + {% if course %}
Вы успешно приобрели курс!
- ПЕРЕЙТИ К ГЛАВНОЙ + ПЕРЕЙТИ К КУРСУ +
+ {% endif %} + {% if gift_certificate %} +
Вы успешно приобрели подарочный сертификат!
+
+ ПЕРЕЙТИ НА ГЛАВНУЮ
{% endif %} diff --git a/apps/payment/views.py b/apps/payment/views.py index 2f90259c..a25cc124 100644 --- a/apps/payment/views.py +++ b/apps/payment/views.py @@ -1,5 +1,5 @@ from decimal import Decimal - +import short_url import arrow import json import logging @@ -27,7 +27,8 @@ 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, Payment, UserBonus, GiftCertificate +from .models import AuthorBalance, CoursePayment, SchoolPayment, Payment, UserBonus, GiftCertificate, \ + GiftCertificatePayment, UserGiftCertificate logger = logging.getLogger('django') @@ -216,6 +217,8 @@ class PaymentwallCallbackView(View): product_payment_class = CoursePayment elif product_type_name == 'school': product_payment_class = SchoolPayment + elif product_type_name == 'gift_certificate': + product_payment_class = GiftCertificatePayment else: return HttpResponse(status=403) @@ -264,6 +267,15 @@ class PaymentwallCallbackView(View): 'created_at': payment.created_at, 'update_at': payment.update_at, } + elif product_type_name == 'gift_certificate': + properties = { + 'payment_id': payment.id, + 'amount': payment.amount, + 'status': payment.status, + 'gift_certificate': payment.gift_certificate.id, + 'created_at': payment.created_at, + 'update_at': payment.update_at, + } payment.save() product_payment_to_mixpanel.delay( @@ -299,8 +311,71 @@ class PaymentwallCallbackView(View): return HttpResponse(status=403) -class GiftCertificateGetView(DetailView): +class GiftCertificatesView(TemplateView): model = GiftCertificate + template_name = 'payment/gift_certificates.html' + + def get(self, request, *args, **kwargs): + gift_certificates = GiftCertificate.objects.all() + context = self.get_context_data(**kwargs) + context['gift_certificates'] = gift_certificates + return self.render_to_response(context) + + +@method_decorator(login_required, name='dispatch') +class GiftCertificateBuyView(TemplateView): + model = GiftCertificate + template_name = 'payment/paymentwall_widget.html' + + def get(self, request, pk, *args, **kwargs): + gift_certificate = get_object_or_404(GiftCertificate, pk=pk) + roistat_visit = request.COOKIES.get('roistat_visit', None) + gift_certificate_payment = GiftCertificatePayment.objects.create( + user=request.user, + gift_certificate=gift_certificate, + roistat_visit=roistat_visit,) + context = self.get_context_data(**kwargs) + product = Product( + f'gift_certificate_{gift_certificate_payment.id}', + gift_certificate_payment.amount, + 'RUB', + 'Подарочный сертификат', + ) + host = urlsplit(self.request.META.get('HTTP_REFERER')) + host = str(host[0]) + '://' + str(host[1]) + widget = Widget( + str(request.user.id), + 'p1_1', + [product], + extra_params={ + 'lang': 'ru', + 'evaluation': 1, + 'demo': 1, + 'test_mode': 1, + 'success_url': host + str(reverse_lazy('gift-certificate-payment-success', args=[gift_certificate_payment.id])), + 'failure_url': host + str(reverse_lazy('payment-error')), + } + ) + context['widget'] = widget.get_html_code() + return self.render_to_response(context) + + +@method_decorator(login_required, name='dispatch') +class GiftCertificateBuySuccessView(TemplateView): + template_name = 'payment/gift_certificate_payment_success.html' + + def get(self, request, payment_id=None, *args, **kwargs): + # print(GiftCertificatePayment.objects.get(id=payment_id)) + gift_certificate_payment = get_object_or_404(GiftCertificatePayment, pk=payment_id) + return self.render_to_response(context={'gift_certificate': True}) + + +class GiftCertificateGetView(TemplateView): + template_name = 'payment/gift_certificate_get.html' + + def get(self, request, slug, *args, **kwargs): + ugs = get_object_or_404(UserGiftCertificate, pk=short_url.decode_url(slug)) + return self.render_to_response(context={'gift_certificate': ugs.gift_certificate, 'user_gift_certificate': ugs}) - def get(self): + def post(self, request, slug, *args, **kwargs): pass diff --git a/apps/user/templates/user/profile.html b/apps/user/templates/user/profile.html index 9ad4d552..81eee428 100644 --- a/apps/user/templates/user/profile.html +++ b/apps/user/templates/user/profile.html @@ -91,10 +91,16 @@ Перейти в онлайн-школу {% endif %} + {% if gift_certificates.exists %} + {% for ugs in user_gift_certificates %} + {% cycle 'theme_pink2' 'theme_cyan' 'theme_violet2' as theme_color silent %} + {% include "payment/gift_certificate_item.html" gift_certificate=ugs.gift_certificate user_gift_certificate=ugs %} + {% endfor %} + {% endif %} {% if paid.exists %} {% include "course/course_items.html" with course_items=paid %} {% endif %} - {% if not is_school_purchased and not paid.exists %} + {% if not is_school_purchased and not paid.exists and not user_gift_certificates.exists %}
Вы пока ничего не приобрели...
diff --git a/apps/user/views.py b/apps/user/views.py index f4ea0ebb..e456af1c 100644 --- a/apps/user/views.py +++ b/apps/user/views.py @@ -24,7 +24,7 @@ from apps.config.models import Config from apps.course.models import Course from apps.notification.utils import send_email from apps.school.models import SchoolSchedule -from apps.payment.models import AuthorBalance, CoursePayment, SchoolPayment, Payment +from apps.payment.models import AuthorBalance, CoursePayment, SchoolPayment, Payment, UserGiftCertificate from apps.user.models import AuthorRequest, EmailSubscription, SubscriptionCategory from .forms import AuthorRequesForm, UserEditForm, WithdrawalForm @@ -59,6 +59,7 @@ class ProfileView(TemplateView): author=self.object, ) context['is_author'] = context['published'] or self.request.user.role == User.AUTHOR_ROLE + context['user_gift_certificates'] = UserGiftCertificate.objects.filter(user=self.request.user) context['paid'] = Course.objects.filter( payments__in=CoursePayment.objects.filter( user=self.object, diff --git a/project/templates/blocks/header.html b/project/templates/blocks/header.html index 312d06ec..5ad39c12 100644 --- a/project/templates/blocks/header.html +++ b/project/templates/blocks/header.html @@ -41,6 +41,10 @@ +
{% include 'templates/blocks/user_menu.html' %} diff --git a/project/templates/blocks/lil_store_js.html b/project/templates/blocks/lil_store_js.html index 7df6d16d..244eb875 100644 --- a/project/templates/blocks/lil_store_js.html +++ b/project/templates/blocks/lil_store_js.html @@ -28,6 +28,7 @@ referrer: '{{ referrer.id|default:'' }}', referrerName: '{% if referrer %}{{ referrer.get_full_name }}{% endif %}', isReferralUrl: {{ is_referral_url|yesno:"true,false" }}, + isGiftCertificateUrl: {{ is_gift_certificate_url|yesno:"true,false" }}, }, }; diff --git a/project/templates/blocks/popup_gift_certificate.html b/project/templates/blocks/popup_gift_certificate.html new file mode 100644 index 00000000..6416acfa --- /dev/null +++ b/project/templates/blocks/popup_gift_certificate.html @@ -0,0 +1,27 @@ +{% load static %} + diff --git a/project/templates/lilcity/index.html b/project/templates/lilcity/index.html index 70189e29..a8ece56c 100644 --- a/project/templates/lilcity/index.html +++ b/project/templates/lilcity/index.html @@ -145,6 +145,9 @@ {% if course %} {% include "templates/blocks/popup_course_buy.html" %} {% endif %} + {% if is_gift_certificate_url %} + {% include "templates/blocks/popup_gift_certificate.html" %} + {% endif %} {% include "templates/blocks/popup_course_lock.html" %} {% include "templates/blocks/popup_subscribe.html" %}
diff --git a/project/urls.py b/project/urls.py index 396530cb..4946c577 100644 --- a/project/urls.py +++ b/project/urls.py @@ -34,8 +34,8 @@ from apps.user.views import ( from apps.payment.views import ( CourseBuySuccessView, CourseBuyView, PaymentwallCallbackView, SchoolBuySuccessView, - SchoolBuyView, -) + SchoolBuyView, GiftCertificatesView, GiftCertificateBuyView, + GiftCertificateBuySuccessView, GiftCertificateGetView) from .views import AboutView, IndexView, SchoolSchedulesView @@ -91,7 +91,11 @@ urlpatterns = [ path('contest//', ContestView.as_view(), name='contest'), path('contest-work//', ContestWorkView.as_view(), name='contest_work'), path('contest-work//comment', contest_work_comment, name='contest_work_comment'), - path('gift//get', ContestView.as_view(), name='contest'), + path('gift-certificates', GiftCertificatesView.as_view(), name='gift-certificates'), + path('gift-certificate//checkout', GiftCertificateBuyView.as_view(), name='gift-certificate-checkout'), + path('payments/gift-certificate//success', GiftCertificateBuySuccessView.as_view(), + name='gift-certificate-payment-success'), + path('gift-certificate//get', GiftCertificateGetView.as_view(), name='gift-certificate-get'), ] diff --git a/project/views.py b/project/views.py index 29189994..ac4ffb46 100644 --- a/project/views.py +++ b/project/views.py @@ -9,7 +9,7 @@ from paymentwall.pingback import Pingback from apps.course.models import Course from apps.school.models import SchoolSchedule -from apps.payment.models import SchoolPayment +from apps.payment.models import SchoolPayment, UserGiftCertificate User = get_user_model() @@ -23,6 +23,7 @@ class IndexView(TemplateView): def get_context_data(self): referrer = self.request.GET.get('referrer') + user_gift_certificate = self.request.GET.get('gift-certificate') is_referral_url = bool(referrer) context = super().get_context_data() @@ -77,7 +78,17 @@ class IndexView(TemplateView): else: referrer = None + if user_gift_certificate: + try: + user_gift_certificate = short_url.decode_url(user_gift_certificate) + user_gift_certificate = UserGiftCertificate.objects,get(pk=user_gift_certificate) + except: + user_gift_certificate = None + context.update({ + 'gift_certificate': user_gift_certificate.gift_certificate if user_gift_certificate else None, + 'user_gift_certificate': user_gift_certificate, + 'is_gift_certificate_url': bool(user_gift_certificate), 'referrer': referrer, 'is_referral_url': is_referral_url, 'online': online, diff --git a/web/src/js/modules/common.js b/web/src/js/modules/common.js index a2bc6999..b03ad0cc 100644 --- a/web/src/js/modules/common.js +++ b/web/src/js/modules/common.js @@ -55,9 +55,9 @@ $(document).ready(function () { $('.js-header-enter').click(); }); } + $popupAuth.find(authPopupActiveTab == 'login' ? '.js-auth-type_login' : '.js-auth-type_registration').addClass('active'); + $popupAuth.find(authPopupActiveTab == 'login' ? '.js-auth-tab_login' : '.js-auth-tab_registration').show(); } - $popupAuth.find(authPopupActiveTab == 'login' ? '.js-auth-type_login' : '.js-auth-type_registration').addClass('active'); - $popupAuth.find(authPopupActiveTab == 'login' ? '.js-auth-tab_login' : '.js-auth-tab_registration').show(); }); function updateHeader() { diff --git a/web/src/js/modules/popup.js b/web/src/js/modules/popup.js index 286797c6..061e2747 100644 --- a/web/src/js/modules/popup.js +++ b/web/src/js/modules/popup.js @@ -158,6 +158,12 @@ $(document).ready(function () { if (e.keyCode === 27) hidePopup(); }); + + if(window.LIL_STORE.flags.isGiftCertificateUrl){ + popup = $('.js-popup-gift-certificate'); + showPopup(); + } + function showPopup(){ body.addClass('no-scroll'); popup.addClass('open'); diff --git a/web/src/sass/_common.sass b/web/src/sass/_common.sass index 28847a1c..7928b4bc 100755 --- a/web/src/sass/_common.sass +++ b/web/src/sass/_common.sass @@ -26,12 +26,15 @@ $pink: #FF9393 $pink-light: #FDF8F9 +$pink2: #FEB9B9 $purple: #B995D9 $green: #8ECFC0 $green-light: #5BD700 +$cyan: #B6DFD6 $gray: #A7A7A7 $blue: #4A90E2 $viol: #B995D9 +$viol2: #A186BD $bg: #f8f8f8 $border: #E6E6E6 $cl: #191919 @@ -1630,6 +1633,12 @@ a.grey-link color: $green &_violet color: $viol + &_violet2 + color: $viol2 + &_pink2 + color: $pink2 + &_cyan + color: $cyan &_lg font-size: 20px letter-spacing: 4px @@ -4404,3 +4413,51 @@ a &__lil-coin-img margin-bottom: -5px margin-right: 4px + + +.gift-certificates + display: flex + margin: 0 -10px + flex-wrap: wrap + +m + display: block + margin: 0 + &__item + display: block + margin: 0 10px 60px + color: $cl + flex: 0 0 calc(33.33% - 20px) + +t + margin-bottom: 50px !important + +m + margin: 0 0 30px + &__preview + display: block + position: relative + margin-bottom: 15px + border-radius: 2px + color: $cl + overflow: hidden + width: 300px + height: 200px + +t + margin-bottom: 10px + &__details + display: flex + margin-bottom: 10px + &__price + margin-left: auto + +fb + font-size: 12px + letter-spacing: 2px + color: $cl + &__title + text-transform: uppercase + &__buy-btn + width: 100% + &__preview.theme_pink2 + background: $pink2 + &__preview.theme_cyan + background: $cyan + &__preview.theme_violet2 + background: $viol2