From 50dc8a04017534338a27e7cf42961ea97e6049c7 Mon Sep 17 00:00:00 2001 From: Gena Date: Tue, 28 Jul 2015 23:07:28 +0600 Subject: [PATCH] auto --- batiskaf/settings.py | 7 +- batiskaf/templates/jinja2/cart_detail.jinja | 13 ++ batiskaf/templates/jinja2/kkb.jinja | 79 +++++++++++- batiskaf/templates/jinja2/kkb_ok.jinja | 1 + batiskaf/templates/jinja2/order_ok.jinja | 131 +++++++++++--------- batiskaf/urls.py | 4 +- kkb/__init__.py | 31 +++++ kkb/kkb_sign.py | 70 +++++++++++ kkb/process.py | 104 ++++++++++++++++ kkb/templates/kkb/appendix.xml | 7 ++ kkb/templates/kkb/command_template.xml | 6 + kkb/templates/kkb/template.xml | 5 + static/img/bank.png | Bin 0 -> 3099 bytes static/img/cards.png | Bin 0 -> 12179 bytes static/less/_.css | 12 ++ static/less/_.less | 90 +++++++++----- static/less/style.less | 3 + store/views.py | 35 +++++- tmp/eml/20150728-003520-4463280256.eml | 37 ++++++ tmp/eml/20150728-010913-4461213232.eml | 37 ++++++ tmp/eml/20150728-010925-4463159840.eml | 37 ++++++ tmp/eml/20150728-011421-4462853816.eml | 37 ++++++ tmp/eml/20150728-222412-4460787808.eml | 26 ++++ tmp/eml/20150728-222412-4460820968.eml | 11 ++ tmp/eml/20150728-224018-4465087488.eml | 26 ++++ tmp/eml/20150728-224018-4465536528.eml | 11 ++ tmp/eml/20150728-224147-4462188696.eml | 26 ++++ tmp/eml/20150728-224147-4462410160.eml | 11 ++ tmp/eml/20150728-224504-4460315928.eml | 11 ++ tmp/eml/20150728-224504-4460735232.eml | 26 ++++ tmp/eml/20150728-225843-4463828832.eml | 26 ++++ tmp/eml/20150728-225844-4463827040.eml | 11 ++ 32 files changed, 827 insertions(+), 104 deletions(-) create mode 100644 batiskaf/templates/jinja2/kkb_ok.jinja create mode 100644 kkb/__init__.py create mode 100644 kkb/kkb_sign.py create mode 100644 kkb/process.py create mode 100644 kkb/templates/kkb/appendix.xml create mode 100644 kkb/templates/kkb/command_template.xml create mode 100644 kkb/templates/kkb/template.xml create mode 100644 static/img/bank.png create mode 100644 static/img/cards.png create mode 100644 tmp/eml/20150728-003520-4463280256.eml create mode 100644 tmp/eml/20150728-010913-4461213232.eml create mode 100644 tmp/eml/20150728-010925-4463159840.eml create mode 100644 tmp/eml/20150728-011421-4462853816.eml create mode 100644 tmp/eml/20150728-222412-4460787808.eml create mode 100644 tmp/eml/20150728-222412-4460820968.eml create mode 100644 tmp/eml/20150728-224018-4465087488.eml create mode 100644 tmp/eml/20150728-224018-4465536528.eml create mode 100644 tmp/eml/20150728-224147-4462188696.eml create mode 100644 tmp/eml/20150728-224147-4462410160.eml create mode 100644 tmp/eml/20150728-224504-4460315928.eml create mode 100644 tmp/eml/20150728-224504-4460735232.eml create mode 100644 tmp/eml/20150728-225843-4463828832.eml create mode 100644 tmp/eml/20150728-225844-4463827040.eml diff --git a/batiskaf/settings.py b/batiskaf/settings.py index 7d21c83..9e75c34 100644 --- a/batiskaf/settings.py +++ b/batiskaf/settings.py @@ -133,7 +133,7 @@ TIME_ZONE = 'Asia/Almaty' USE_I18N = True -USE_L10N = True +USE_L10N = False USE_TZ = False @@ -264,12 +264,11 @@ PROFILE_TEMP_PASSWORD = 'dE6Hyo9heWck5yiM2dIs' MERCHANT_CERTIFICATE_ID = "c183d5b8" # ; Серийный номер сертификата Cert Serial Number MERCHANT_NAME = "BATISKAF-KZ.KZ" # ; Название магазина (продавца) Shop/merchant Name -PRIVATE_KEY_FN = os.path.join(BASE_DIR, 'kkb_keys', - 'cert.prv') # "../paysys/cert.prv" # ; Путь к закрытому ключу Private cert path +PRIVATE_KEY_FN = os.path.join(BASE_DIR, 'kkb_keys', 'cert.prv') # "../paysys/cert.prv" # ; Путь к закрытому ключу Private cert path PRIVATE_KEY_PASS = "1q2w3e4r" # ; Пароль к закрытому ключу Private cert password # XML_TEMPLATE_FN = "../paysys/template.xml" # ; Путь к XML шаблону XML template path # XML_COMMAND_TEMPLATE_FN = "../paysys/command_template.xml" # ; Путь к XML шаблону для команд (возврат/подтверждение) PUBLIC_KEY_FN = os.path.join(BASE_DIR, 'kkb_keys', - 'kkbca.cer') # "../paysys/kkbca.pem" # ; Путь к открытому ключу Public cert path + 'cert.pub') # "../paysys/kkbca.pem" # ; Путь к открытому ключу Public cert path MERCHANT_ID = "92210431" # ; Терминал ИД в банковской Системе diff --git a/batiskaf/templates/jinja2/cart_detail.jinja b/batiskaf/templates/jinja2/cart_detail.jinja index f6f5176..e5ab884 100644 --- a/batiskaf/templates/jinja2/cart_detail.jinja +++ b/batiskaf/templates/jinja2/cart_detail.jinja @@ -107,6 +107,19 @@ Итого к оплате: {{ cart.total }}
+
+ +
+
+ +
+
- +{% extends 'base.jinja' %} +{% block title %} + Перенаправление на платежный шлюз +{% endblock %} +{% block content %} + + + +

+
Нажмите, чтобы перейти на сайт платежного шлюза и продолжить оплату...
+ +
+ + + + + + +
+ +
+

+ +
+ {#
#} + {# #} + {# #} + {# #} + {# #} + {# #} + {# #} + {# #} + {# #} + {# #} + {#
#} + {# Платеж#} + {# #} + {# ИИК: KZ809261001507363000
#} + {# РНН/БИН бенефециара: 760419302190
#} + {# Бенефециар: ИП Полинкин Матвей Владимирович
#} + {# Банк бенефециара: АО "Казкоммерцбанк"
#} + {# БИК: KZKOKZKX
#} + {# Платеж: Заказ №{{ order.pk }} от {{ date.strftime('%d.%m.%Y') }}
#} + {# Плательщик: {{ order.first_name }} {{ order.last_name }}
#} + {# Адрес плательщика: {{ order.address }}
#} + {# Сумма: {{ order.amount }} тенге

#} + {# Подпись:_____________________ Дата: {{ date.strftime('%d.%m.%Y') }}
#} + {##} + {#
#} + {# Квитанция
#} + {# Кассир#} + {#
#} + {# ИИК: KZ809261001507363000
#} + {# РНН/БИН бенефециара: 760419302190
#} + {# Бенефециар: ИП Полинкин Матвей Владимирович
#} + {# Банк бенефециара: АО "Казкоммерцбанк"
#} + {# БИК: KZKOKZKX
#} + {# Платеж: Заказ №{{ order.pk }} от {{ date.strftime('%d.%m.%Y') }}
#} + {# Плательщик: {{ order.first_name }} {{ order.last_name }}
#} + {# Адрес плательщика: {{ order.address }}
#} + {# Сумма: {{ order.amount }} тенге

#} + {# Подпись:_____________________ Дата: {{ date.strftime('%d.%m.%Y') }}
#} + {##} + {#
#} + {#
#} + {##} + {#

Версия для печати#} + {#

#} + {#
#} + +{% endblock %} + + + + diff --git a/batiskaf/templates/jinja2/kkb_ok.jinja b/batiskaf/templates/jinja2/kkb_ok.jinja new file mode 100644 index 0000000..a0aba93 --- /dev/null +++ b/batiskaf/templates/jinja2/kkb_ok.jinja @@ -0,0 +1 @@ +OK \ No newline at end of file diff --git a/batiskaf/templates/jinja2/order_ok.jinja b/batiskaf/templates/jinja2/order_ok.jinja index 1c2ac46..ed60cc8 100644 --- a/batiskaf/templates/jinja2/order_ok.jinja +++ b/batiskaf/templates/jinja2/order_ok.jinja @@ -1,67 +1,86 @@ {% extends 'base.jinja' %} {% block title %} -Заказ успешно оформлен + Заказ успешно оформлен {% endblock %} {% block content %} -
- -

Спасибо!

-

Ваш заказ успешно принят и поступит в обработку сразу после оплаты.

-

Распечатать квитанцию для оплаты

-
-
-
Вы можете отправить прямой платеж на карту:
-

- Банк: Казкоммерцбанк
- ИИН: 760419302190
- Номер карты: 4405 6452 0912 2014

- ...либо воспользуйтесь квитанцией для оплаты банковским платежом -

-
-
- - - - - - - - - -
- Платеж - - ИИК: KZ809261001507363000
- РНН/БИН бенефециара: 760419302190
- Бенефециар: ИП Полинкин Матвей Владимирович
- Банк бенефециара: АО "Казкоммерцбанк"
- БИК: KZKOKZKX
- Платеж: Заказ №{{ order.pk }} от {{ date.strftime('%d.%m.%Y') }}
- Плательщик: {{ order.first_name }} {{ order.last_name }}
- Адрес плательщика: {{ order.address }}
- Сумма: {{ order.amount }} тенге

- Подпись:_____________________ Дата: {{ date.strftime('%d.%m.%Y') }}
+
+ +

Спасибо!

-
- Квитанция
- Кассир -
- ИИК: KZ809261001507363000
- РНН/БИН бенефециара: 760419302190
- Бенефециар: ИП Полинкин Матвей Владимирович
- Банк бенефециара: АО "Казкоммерцбанк"
- БИК: KZKOKZKX
- Платеж: Заказ №{{ order.pk }} от {{ date.strftime('%d.%m.%Y') }}
- Плательщик: {{ order.first_name }} {{ order.last_name }}
- Адрес плательщика: {{ order.address }}
- Сумма: {{ order.amount }} тенге

- Подпись:_____________________ Дата: {{ date.strftime('%d.%m.%Y') }}
+

Ваш заказ успешно принят и поступит в обработку сразу после оплаты.

-
-
-

Версия для печати

+{#

Распечатать квитанцию для#} +{# оплаты

#} +
+
+
+
+ +
+ +{#
#} +{#
Вы можете отправить прямой платеж на карту:
#} +{##} +{#

#} +{# Банк: Казкоммерцбанк
#} +{# ИИН: 760419302190
#} +{# Номер карты: 4405 6452 0912 2014

#} +{# ...либо воспользуйтесь квитанцией для оплаты банковским платежом#} +{#

#} +{#
#} +{#
#} +{# #} +{# #} +{# #} +{# #} +{# #} +{# #} +{# #} +{# #} +{# #} +{#
#} +{# Платеж#} +{# #} +{# ИИК: KZ809261001507363000
#} +{# РНН/БИН бенефециара: 760419302190
#} +{# Бенефециар: ИП Полинкин Матвей Владимирович
#} +{# Банк бенефециара: АО "Казкоммерцбанк"
#} +{# БИК: KZKOKZKX
#} +{# Платеж: Заказ №{{ order.pk }} от {{ date.strftime('%d.%m.%Y') }}
#} +{# Плательщик: {{ order.first_name }} {{ order.last_name }}
#} +{# Адрес плательщика: {{ order.address }}
#} +{# Сумма: {{ order.amount }} тенге

#} +{# Подпись:_____________________ Дата: {{ date.strftime('%d.%m.%Y') }}
#} +{##} +{#
#} +{# Квитанция
#} +{# Кассир#} +{#
#} +{# ИИК: KZ809261001507363000
#} +{# РНН/БИН бенефециара: 760419302190
#} +{# Бенефециар: ИП Полинкин Матвей Владимирович
#} +{# Банк бенефециара: АО "Казкоммерцбанк"
#} +{# БИК: KZKOKZKX
#} +{# Платеж: Заказ №{{ order.pk }} от {{ date.strftime('%d.%m.%Y') }}
#} +{# Плательщик: {{ order.first_name }} {{ order.last_name }}
#} +{# Адрес плательщика: {{ order.address }}
#} +{# Сумма: {{ order.amount }} тенге

#} +{# Подпись:_____________________ Дата: {{ date.strftime('%d.%m.%Y') }}
#} +{##} +{#
#} +{#
#} +{##} +{#

Версия для печати#} +{#

#} +{#
#} {% endblock %} diff --git a/batiskaf/urls.py b/batiskaf/urls.py index 28ca8d1..5b92b1e 100644 --- a/batiskaf/urls.py +++ b/batiskaf/urls.py @@ -3,7 +3,7 @@ from django.contrib import admin from django.http import HttpResponse from api.views import call_order from news.views import NewsSitemap -from store.views import order_view, order_print, ProductSitemap, CategorySitemap, order_kkb +from store.views import order_view, order_print, ProductSitemap, CategorySitemap, order_kkb, kkb_result from main.views import * from rest_framework import routers # from api.urls import router @@ -90,6 +90,8 @@ urlpatterns = patterns( name='store_order_print'), url(r'^order/(?P.+)/kkb/$', order_kkb, name='store_order_kkb'), + url(r'^kkb_result/$', kkb_result, + name='kkb_result'), url(r'^order/(?P.+)/$', order_view, name='store_order_view'), diff --git a/kkb/__init__.py b/kkb/__init__.py new file mode 100644 index 0000000..43e2d87 --- /dev/null +++ b/kkb/__init__.py @@ -0,0 +1,31 @@ +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +from kkb.process import get_context, postlink_process as postlink + +version_info = (0, 3, 0) + +__version__ = version = '.'.join(map(str, version_info)) +__project__ = PROJECT = 'kkb' +__author__ = AUTHOR = "sofaku " + +if not hasattr(settings, 'MERCHANT_ID'): + raise ImproperlyConfigured('MERCHANT_ID is required') + +if not hasattr(settings, 'MERCHANT_CERTIFICATE_ID'): + raise ImproperlyConfigured('MERCHANT_CERTIFICATE_ID is required') + +if not hasattr(settings, 'MERCHANT_NAME'): + raise ImproperlyConfigured('MERCHANT_NAME is required') + +if not hasattr(settings, 'PRIVATE_KEY_FN'): + raise ImproperlyConfigured('PRIVATE_KEY_FN is required') + +if not hasattr(settings, 'PRIVATE_KEY_PASS'): + raise ImproperlyConfigured('PRIVATE_KEY_PASS is required') + +if not hasattr(settings, 'PUBLIC_KEY_FN'): + raise ImproperlyConfigured('PUBLIC_KEY_FN is required') + +settings.XML_TEMPLATE_FN = getattr(settings, 'XML_TEMPLATE_FN', 'kkb/template.xml') + +settings.XML_COMMAND_TEMPLATE_FN = getattr(settings, 'XML_COMMAND_TEMPLATE_FN', 'kkb/command_template.xml') diff --git a/kkb/kkb_sign.py b/kkb/kkb_sign.py new file mode 100644 index 0000000..a64e0c8 --- /dev/null +++ b/kkb/kkb_sign.py @@ -0,0 +1,70 @@ +import os +from django.conf import settings +import tempfile +import subprocess +import shlex +import base64 + + +class KKBSign(object): + """docstring for KBBSign""" + + def check(self, rawsign, data): + tempSignature = tempfile.NamedTemporaryFile(mode="wb", delete=False) + tempData = tempfile.NamedTemporaryFile(mode="wb", delete=False) + tempPubKey = tempfile.NamedTemporaryFile(mode="wb", delete=False) + rawsign = base64.b64decode(rawsign)[::-1] + try: + tempSignature.write(bytes(rawsign, 'UTF-8')) + except Exception as e: + tempSignature.write(rawsign) + tempSignature.seek(0) + + try: + tempData.write(bytes(data, 'UTF-8')) + except Exception as e: + tempData.write(data) + tempData.seek(0) + + cmd = "".join(["openssl x509 -pubkey -noout -in ", settings.PUBLIC_KEY_FN]) + pubkey = \ + subprocess.Popen(shlex.split(cmd), shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE).communicate()[0] + try: + tempPubKey.write(bytes(pubkey, 'UTF-8')) + except Exception as e: + tempPubKey.write(pubkey) + + tempPubKey.seek(0) + + cmd = "".join( + ["openssl dgst -sha1 -verify ", tempPubKey.name, " -signature ", tempSignature.name, " ", tempData.name]) + result = \ + subprocess.Popen(shlex.split(cmd), shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE).communicate()[0] + + tempPubKey.close() + tempData.close() + tempSignature.close() + os.unlink(tempPubKey.name) + os.unlink(tempData.name) + os.unlink(tempSignature.name) + return result.decode('utf-8') + + def sign64(self, text): + tempData = tempfile.NamedTemporaryFile(delete=False) + try: + tempData.write(bytes(text, 'UTF-8')) + except Exception as e: + tempData.write(text) + tempData.seek(0) + + tempSignature = tempfile.NamedTemporaryFile(mode="rb", delete=False) + cmd = "".join(["openssl dgst -sha1 -sign ", settings.PRIVATE_KEY_FN, " -passin ", + "".join(['pass:', settings.PRIVATE_KEY_PASS]), " -out ", tempSignature.name, " ", tempData.name]) + p = subprocess.Popen(shlex.split(cmd), shell=False, stdin=subprocess.PIPE) + p.communicate() + signature = tempSignature.read()[::-1] + tempData.close() + tempSignature.close() + os.unlink(tempData.name) + os.unlink(tempSignature.name) + return base64.b64encode(signature) diff --git a/kkb/process.py b/kkb/process.py new file mode 100644 index 0000000..2435a21 --- /dev/null +++ b/kkb/process.py @@ -0,0 +1,104 @@ +from django.conf import settings +import xml.etree.ElementTree as ET +from kkb.kkb_sign import KKBSign +from django.template.loader import render_to_string +import base64 + + +class Result: + def __init__(self, **entries): + self.__dict__.update(entries) + + +def xml2dict(xml): + root = ET.fromstring(xml) + bank = root.find('bank') + customer = bank.find('customer') + merchant = customer.find('merchant') + order = merchant.find('order') + department = order.find('department') + merchant_sign = customer.find('merchant_sign') + customer_sign = bank.find('customer_sign') + results = bank.find('results') + payment = results.find('payment') + bank_sign = root.find('bank_sign') + result = { + 'BANK_NAME': bank.get('name'), + 'CUSTOMER_NAME': customer.get('name'), + 'CUSTOMER_MAIL': customer.get('mail'), + 'CUSTOMER_PHONE': customer.get('phone'), + 'MERCHANT_CERT_ID': merchant.get('cert_id'), + 'MERCHANT_NAME': merchant.get('name'), + 'ORDER_ID': order.get('order_id'), + 'ORDER_AMOUNT': order.get('amount'), + 'ORDER_CURRENCY': order.get('currency'), + 'DEPARTMENT_MERCHANT_ID': department.get('merchant_id'), + 'DEPARTMENT_AMOUNT': department.get('amount'), + 'MERCHANT_SIGN_TYPE': merchant_sign.get('type'), + 'CUSTOMER_SIGN_TYPE': customer_sign.get('type'), + 'RESULTS_TIMESTAMP': results.get('timestamp'), + 'PAYMENT_MERCHANT_ID': payment.get('merchant_id'), + 'PAYMENT_AMOUNT': payment.get('amount'), + 'PAYMENT_REFERENCE': payment.get('reference'), + 'PAYMENT_APPROVAL_CODE': payment.get('approval_code'), + 'PAYMENT_RESPONSE_CODE': payment.get('response_code'), + 'BANK_SIGN_CERT_ID': bank_sign.get('cert_id'), + 'BANK_SIGN_TYPE': bank_sign.get('type'), + } + result['LETTER'] = letter = '')[0] + '' + result['SIGN'] = ET.tostring(bank_sign) + result['RAWSIGN'] = bank_sign.text + return result + + +def postlink_process(response=""): + args = { + 'status': False, + 'message': "", + } + result = Result(**args) + try: + root = ET.fromstring(response) + except Exception as e: + result.message = "xml file not parsable" + return result + if root.find('error'): + result.message = root.find('error').text + return result + if root.tag == 'document': + kkbSign = KKBSign() + data = xml2dict(response) + check = kkbSign.check(data['RAWSIGN'], data['LETTER']) + if "Verified OK" in check: + result.status = True + result.data = data + result.message = check + else: + result.message = check + else: + result.message = "[XML_DOCUMENT_UNKNOWN_TYPE]" + return result + + +def get_context(order_id, amount='0', currency_id='398', b64=True): + context = { + 'ORDER_ID': int(order_id), + 'CURRENCY': currency_id, + 'AMOUNT': float(amount), + 'MERCHANT_CERTIFICATE_ID': settings.MERCHANT_CERTIFICATE_ID, + 'MERCHANT_NAME': settings.MERCHANT_NAME, + 'MERCHANT_ID': settings.MERCHANT_ID, + } + kkbSign = KKBSign() + try: + rendered = render_to_string(settings.XML_TEMPLATE_FN, context) + except Exception as e: + return "Error reading XML template." + result_sign = "".join(['', + kkbSign.sign64(rendered).decode('utf-8'), '']) + xml = "".join(["", rendered, result_sign, ""]) + if b64: + return base64.b64encode(xml.encode('ascii')).decode('utf-8') + # return "".join(base64.b64encode(xml.encode('utf-8')).split("\n")) + else: + return xml diff --git a/kkb/templates/kkb/appendix.xml b/kkb/templates/kkb/appendix.xml new file mode 100644 index 0000000..2d54dce --- /dev/null +++ b/kkb/templates/kkb/appendix.xml @@ -0,0 +1,7 @@ + + + {% for item in items %} + + {% endfor %} + \ No newline at end of file diff --git a/kkb/templates/kkb/command_template.xml b/kkb/templates/kkb/command_template.xml new file mode 100644 index 0000000..1c0a437 --- /dev/null +++ b/kkb/templates/kkb/command_template.xml @@ -0,0 +1,6 @@ + + + + [REASON] + \ No newline at end of file diff --git a/kkb/templates/kkb/template.xml b/kkb/templates/kkb/template.xml new file mode 100644 index 0000000..befb675 --- /dev/null +++ b/kkb/templates/kkb/template.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/static/img/bank.png b/static/img/bank.png new file mode 100644 index 0000000000000000000000000000000000000000..f828a998a91ded0390a9a9eef37061249f1e80e0 GIT binary patch literal 3099 zcmai0c{r478y|_RWl5#b7>-I`vyWMrVrGbH7-ouN%V3OY%wlGkp-{v@S<2ReC<#SJ zsqBiBr9^3yHA!)Vh!N!*o$B<*cb)IOuJ?WJ`+0u9dw;I$jicD_R99KA0ssKi?QBU- zvK1(M4U`mRU$Tnc7TKaJvUU+sd43`>UBCcX`SQFOKsyed$#7!OeM17985RJ5Jc~th z5xJ1};Cy%-FntLFmT>qoHUMC;L&B%~uo)ttH-pLI;z8q8bs!+i7Y}kqk)dQhk>Ss> z4HYn`q4qSNP__@&7qnwL&_aTf8Q?HPbfAP2z!l;oc+fYyIGMb(4FLhaK}2jk=;3x0m-}xeEo1v zB%ANPWEvjiFB0)_5QtbT28$73o`4B~VX;^U6b^yIx5*IOgdtoJU9ycUH2PtI#1Q%j zSbPzS#|17~qe%>DjS5|I;>~@^ezMlaADB0SP ztZ0(1GG}&xp0mz&v0reo-~O4;x>bSXfcptqF_BMfc11an6gYb|{YN(@FE@;LSBSHn zqZ*oijw(2r8-El?7+6uJ#raIL-kq0TP)LZgCFWqj2`ObOO9!8aJ|F#5I~)QT?mgX; zwQhC&s%MpP_}MmW-&~ux4Zk~kaTHD=40v}Pepaxo($tDcir)IWe1PJghHE18zzw3d zqu0o}*3JV6vZ4Py=FYbKRhL?4KFH6C{z_5)UAnxlVq1yjZc@xpqJJA{PgU{Kf|OnBcL8ebRI3_7TYbT*bk9D6zK*#D^4N(!W7O%Mx-FAc z`!hXop<6t@)bDD1j|(*mIyBGexL^C?9Hvu$)uW!{s&k_b7Rtw=O{x0!u%pHxkeR+> z;rW^|Y4ij3rTi%eOlqN}hg1;pWVCO=ecs0n{Vu}2SfHut9~a~FsuBcIGij(uqF&5O zZz#KX5-+0XUaKQ#Tz4}!($;wujcU+2esd?$D<_AO(W7LkYM0#Z8+%zG&1${8L&Abj z5h{IW6>F4rtmM%)w|K|1Hu!h+6`bNOb{Cbt zlv|T^3KBMU;92>ly1nzqKq-3St~CJ50}MVZ7*W4|lrt0e4 zZ0tVf?RxOwxfsjms_9V!+1cJ zH0m-ZE9@M*y~Zl8k6khk)!y0k)%mIg|3g<-K{GI(K_$$8By{K%yC6H(C_hB9TDBZQ z`#Splp``W&!TgJGtUZO&*Rh(V8Mfsbsk|N_%e5uRcgoqd`?q3nUTG>Avi63_1oI2 zuKxBm@B_&CJWsG%YufW7le~{6SG>TbnsM2Yi>*3O(p&P?6UPn@mgl+_nZ{fQN1oex z+ic|VK@)8CYG^z@%B~toqnS*de57yKVj8*OePVn=$>?y#IP5Fh`huATcXy_^aeJ;e zRVn4^%*2%k91Pgq)AVCM1=Lg-xoBbWLT!V#VF9MvQTkfT{*MWk;p}@ zfQ>4u-P9{Kh$ujU+?ml6&z(kfH{DRYI}%5*Io(e6pn}hp&|=vtl&*=w|wBQ*HjeNkEThGBrXpuLz$= zE6$?8vjFk|_{DZ;n^iv~FFdyAoiU)KWJUJ+MTrsL)@CZBuf^qo(Baw~xe*a4>ZAuW}y zUer4FTr;h`oQ_RUe#SF1TWQc7yZppaHPsLz$!#<;^Yxv?f_I|C!3?!Fy+NKs!}W-A zl?^HD{~F4}|Di)e6GpXr749QTegJw3(Zv z<-#!+PvKUbj5?#iv#%-#r+dkEQlv-BkVRdHWWCa7r6-SOj36nw$V&Gfnk_7<#Uts`xwPJHRG25-o`I|7qL zYRw-U(b*-`zRpes`s@h+`>F!@KCKZ10WCh Xl(BU+e!sz)rQdZsYkN`&!7K8=f$mP< literal 0 HcmV?d00001 diff --git a/static/img/cards.png b/static/img/cards.png new file mode 100644 index 0000000000000000000000000000000000000000..b97e384847b2c60e4631d97cc8b2916e7803cb8d GIT binary patch literal 12179 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 PZ}N(=sxsA5Cc*y)6FMNc literal 0 HcmV?d00001 diff --git a/static/less/_.css b/static/less/_.css index 5f8c86d..fd1be00 100644 --- a/static/less/_.css +++ b/static/less/_.css @@ -965,3 +965,15 @@ ul.messages { font-size: 20px; line-height: 50px; } +.radio img { + margin-top: 10px; + margin-bottom: 10px; +} +.radio label { + margin-left: 0px !important; + padding-left: 0px !important; +} +.radio label input { + margin-left: 0 !important; + position: relative !important; +} diff --git a/static/less/_.less b/static/less/_.less index 72857ff..68ec31e 100644 --- a/static/less/_.less +++ b/static/less/_.less @@ -8,8 +8,8 @@ @brand-gray: #434a54; @brand-white: @white; -body{ - font-family: 'Trebuchet MS', 'PT Sans', Helvetica, Arial, sans-serif; +body { + font-family: 'Trebuchet MS', 'PT Sans', Helvetica, Arial, sans-serif; } /* Account for fixed navbar */ @@ -122,11 +122,11 @@ span.yellow { * with disabling the responsiveness. */ - /* Account for fixed navbar */ +/* Account for fixed navbar */ - body, - .navbar-static-top, - .navbar-fixed-bottom { +body, +.navbar-static-top, +.navbar-fixed-bottom { min-width: 970px; } @@ -150,8 +150,8 @@ span.yellow { * grid system, and navbar. */ - /* Reset the container */ - .container { +/* Reset the container */ +.container { width: 970px; max-width: none !important; } @@ -235,7 +235,7 @@ span.yellow { font-weight: normal; font-size: 11px; &.title { - color: @brand-yellow !important;//lighten(@blue, 30%) !important; + color: @brand-yellow !important; //lighten(@blue, 30%) !important; font-weight: bold; font-size: 12px; @@ -252,10 +252,12 @@ span.yellow { -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); box-shadow: 0 6px 12px rgba(0, 0, 0, .175); } -a#order-call-link{ + +a#order-call-link { color: #FC6E51; //font-size: 14px; } + .navbar-default .navbar-nav .open .dropdown-menu > li > a { color: #333; } @@ -608,8 +610,8 @@ hr.dashed { height: 20px; padding: 0 10px; } - select{ - color:black; + select { + color: black; } } @@ -730,25 +732,27 @@ table.table-cart { text-align: left; float: right; } - tbody{ - td{ + tbody { + td { padding-top: 45px; - &.table-cart-image{ + &.table-cart-image { padding-top: 8px; } - .form-control{ + .form-control { margin-top: -8px; } } } } -.breadcrumbs{ + +.breadcrumbs { overflow: hidden !important; } -ol.breadcrumb.breadcrumb-arrow{ +ol.breadcrumb.breadcrumb-arrow { overflow: hidden !important; } + .table { thead { tr { @@ -793,42 +797,45 @@ ul.messages { display: none; } -.product-description{ +.product-description { margin-top: 40px; padding-top: 20px; border-top: 1px #ddd solid; } -.order-data .radio{ + +.order-data .radio { margin-left: 15px; } #order-itogo-amount, #order-itogo-delivery, #cart-itogo, -#order-itogo-amount-up, #order-itogo-delivery-up, #cart-itogo-up -{ +#order-itogo-amount-up, #order-itogo-delivery-up, #cart-itogo-up { font-size: 20px; } -.well-large{ + +.well-large { padding: 40px; } -.news-container{ - .comment{ + +.news-container { + .comment { overflow: auto; } - .media{ + .media { background: #F5F7FA; padding: 15px; } } + .call-form, .order-form { - background: #FFF; - padding: 20px 30px; - text-align: left; - max-width: 500px; - margin: 40px auto; - position: relative + background: #FFF; + padding: 20px 30px; + text-align: left; + max-width: 500px; + margin: 40px auto; + position: relative } -.sale-percent-block{ +.sale-percent-block { background: #E9573F; width: 50px; height: 50px; @@ -837,4 +844,19 @@ ul.messages { top: 0; font-size: 20px; line-height: 50px; -} \ No newline at end of file +} + +.radio { + img { + margin-top: 10px; + margin-bottom: 10px; + } + label { + margin-left: 0px !important; + padding-left: 0px !important; + input { + margin-left: 0 !important; + position: relative !important; + } + } +} diff --git a/static/less/style.less b/static/less/style.less index d60575c..dac6957 100644 --- a/static/less/style.less +++ b/static/less/style.less @@ -45,3 +45,6 @@ .form-group.required .control-label:after{ content: '*'; } +.radio{ + +} \ No newline at end of file diff --git a/store/views.py b/store/views.py index 7dc43ca..61801d4 100644 --- a/store/views.py +++ b/store/views.py @@ -1,7 +1,9 @@ +import base64 from django.contrib.auth import authenticate, login from django.core.mail import mail_managers from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage from django.shortcuts import get_object_or_404, redirect, render +from django.template.loader import render_to_string from django.views.generic import * from accounts.models import Profile from accounts.utils import normalize_phone, send_email @@ -15,7 +17,7 @@ from django.http import JsonResponse from datetime import datetime from django.conf import settings from django.contrib.sitemaps import Sitemap - +import kkb class CategoryBaseView(object): category = None @@ -267,8 +269,12 @@ class CartDetailView(TemplateView): order.save() mail_managers('Оформили заказ', 'Смотреть в админке') + payment_type = request.POST.get('payment_type', 'card') + if payment_type == 'card': + return redirect('/order/{}/kkb/'.format(order.pk)) + return redirect('/order/{}/print/'.format(order.pk)) + - return redirect('/order/{}/'.format(order.pk)) else: return self.render_to_response(self.get_context_data()) @@ -303,12 +309,31 @@ def order_print(request, order): def order_kkb(request, order): order = get_object_or_404(OrderData, pk=order) - import kkb - context = kkb.get_context(order_id='333', amount="666", currency_id="398") - c = dict(order=order, context=context) + cart = Cart(request) + context = kkb.get_context(order.pk, amount=order.amount, b64=True) + + c_appendix = dict(items=cart.items, deliv_price=order.amount - cart.total) + render_appendix = render_to_string('kkb/appendix.xml', c_appendix) + appendix = base64.b64encode( + bytes(render_appendix, 'utf-8') + ).decode('utf-8') + + c = dict(order=order, context=context, appendix=appendix) return render(request, 'kkb.jinja', c) +def kkb_result(request): + response = request.POST['response'] + result = kkb.postlink(response) + if result.status: + order = OrderData.objects.get(pk=int(result.data['ORDER_ID'])) + order.status = 1 + order.save() + mail_managers('Оплатили заказ картой', 'Заказ №{}'.format(order.pk)) + else: + print(result.message) + return render(request, 'kkb_ok.jinja') + class ProductSitemap(Sitemap): changefreq = "daily" diff --git a/tmp/eml/20150728-003520-4463280256.eml b/tmp/eml/20150728-003520-4463280256.eml new file mode 100644 index 0000000..b66b505 --- /dev/null +++ b/tmp/eml/20150728-003520-4463280256.eml @@ -0,0 +1,37 @@ +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 8bit +Subject: =?utf-8?b?0KDQvtCx0L7RgiBCYXRpc2thZi1rei5reg==?= +From: admin@batiskaf-kz.kz +To: asdfasdf@sadf.com +Date: Mon, 27 Jul 2015 18:35:20 -0000 +Message-ID: <20150727183520.60869.33366@macbook-pro.local> + +Привет, gre! + +Поздравляем, вы успешно оформили заказ. + +Для того, чтобы его было удобнее отслеживать, войдите в свой личный кабинет, используя свой номер телефона +7: + +http://batiskaf-kz.kz/account/ + + +Это автоматическое сообщение. Отвечать на него не нужно! + +С Уважением, +Администрация Batiskaf-kz.kz +-- +Skype: batiskaf_kz +Тел: +7 (777) 163-14-34 или +7 (775) 859-12-17 +------------------------------------------------------------------------------- +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 8bit +Subject: =?utf-8?b?W0RqYW5nb10g0J7RhNC+0YDQvNC40LvQuCDQt9Cw0LrQsNC3?= +From: admin@batiskaf-kz.kz +To: spacenergy@me.com, admin@batiskaf-kz.kz +Date: Mon, 27 Jul 2015 18:35:20 -0000 +Message-ID: <20150727183520.60869.15005@macbook-pro.local> + +Смотреть в админке +------------------------------------------------------------------------------- diff --git a/tmp/eml/20150728-010913-4461213232.eml b/tmp/eml/20150728-010913-4461213232.eml new file mode 100644 index 0000000..db2202b --- /dev/null +++ b/tmp/eml/20150728-010913-4461213232.eml @@ -0,0 +1,37 @@ +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 8bit +Subject: =?utf-8?b?0KDQvtCx0L7RgiBCYXRpc2thZi1rei5reg==?= +From: admin@batiskaf-kz.kz +To: asdfasdf@sadf.com +Date: Mon, 27 Jul 2015 19:09:13 -0000 +Message-ID: <20150727190913.62010.2321@macbook-pro.local> + +Привет, gre! + +Поздравляем, вы успешно оформили заказ. + +Для того, чтобы его было удобнее отслеживать, войдите в свой личный кабинет, используя свой номер телефона +7: + +http://batiskaf-kz.kz/account/ + + +Это автоматическое сообщение. Отвечать на него не нужно! + +С Уважением, +Администрация Batiskaf-kz.kz +-- +Skype: batiskaf_kz +Тел: +7 (777) 163-14-34 или +7 (775) 859-12-17 +------------------------------------------------------------------------------- +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 8bit +Subject: =?utf-8?b?W0RqYW5nb10g0J7RhNC+0YDQvNC40LvQuCDQt9Cw0LrQsNC3?= +From: admin@batiskaf-kz.kz +To: spacenergy@me.com, admin@batiskaf-kz.kz +Date: Mon, 27 Jul 2015 19:09:13 -0000 +Message-ID: <20150727190913.62010.34998@macbook-pro.local> + +Смотреть в админке +------------------------------------------------------------------------------- diff --git a/tmp/eml/20150728-010925-4463159840.eml b/tmp/eml/20150728-010925-4463159840.eml new file mode 100644 index 0000000..c912061 --- /dev/null +++ b/tmp/eml/20150728-010925-4463159840.eml @@ -0,0 +1,37 @@ +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 8bit +Subject: =?utf-8?b?0KDQvtCx0L7RgiBCYXRpc2thZi1rei5reg==?= +From: admin@batiskaf-kz.kz +To: asdfasdf@sadf.com +Date: Mon, 27 Jul 2015 19:09:25 -0000 +Message-ID: <20150727190925.62010.23670@macbook-pro.local> + +Привет, gre! + +Поздравляем, вы успешно оформили заказ. + +Для того, чтобы его было удобнее отслеживать, войдите в свой личный кабинет, используя свой номер телефона +7: + +http://batiskaf-kz.kz/account/ + + +Это автоматическое сообщение. Отвечать на него не нужно! + +С Уважением, +Администрация Batiskaf-kz.kz +-- +Skype: batiskaf_kz +Тел: +7 (777) 163-14-34 или +7 (775) 859-12-17 +------------------------------------------------------------------------------- +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 8bit +Subject: =?utf-8?b?W0RqYW5nb10g0J7RhNC+0YDQvNC40LvQuCDQt9Cw0LrQsNC3?= +From: admin@batiskaf-kz.kz +To: spacenergy@me.com, admin@batiskaf-kz.kz +Date: Mon, 27 Jul 2015 19:09:25 -0000 +Message-ID: <20150727190925.62010.21647@macbook-pro.local> + +Смотреть в админке +------------------------------------------------------------------------------- diff --git a/tmp/eml/20150728-011421-4462853816.eml b/tmp/eml/20150728-011421-4462853816.eml new file mode 100644 index 0000000..d6dd419 --- /dev/null +++ b/tmp/eml/20150728-011421-4462853816.eml @@ -0,0 +1,37 @@ +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 8bit +Subject: =?utf-8?b?0KDQvtCx0L7RgiBCYXRpc2thZi1rei5reg==?= +From: admin@batiskaf-kz.kz +To: asdfasdf@sadf.com +Date: Mon, 27 Jul 2015 19:14:21 -0000 +Message-ID: <20150727191421.62010.24196@macbook-pro.local> + +Привет, gre! + +Поздравляем, вы успешно оформили заказ. + +Для того, чтобы его было удобнее отслеживать, войдите в свой личный кабинет, используя свой номер телефона +7: + +http://batiskaf-kz.kz/account/ + + +Это автоматическое сообщение. Отвечать на него не нужно! + +С Уважением, +Администрация Batiskaf-kz.kz +-- +Skype: batiskaf_kz +Тел: +7 (777) 163-14-34 или +7 (775) 859-12-17 +------------------------------------------------------------------------------- +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 8bit +Subject: =?utf-8?b?W0RqYW5nb10g0J7RhNC+0YDQvNC40LvQuCDQt9Cw0LrQsNC3?= +From: admin@batiskaf-kz.kz +To: spacenergy@me.com, admin@batiskaf-kz.kz +Date: Mon, 27 Jul 2015 19:14:21 -0000 +Message-ID: <20150727191421.62010.4569@macbook-pro.local> + +Смотреть в админке +------------------------------------------------------------------------------- diff --git a/tmp/eml/20150728-222412-4460787808.eml b/tmp/eml/20150728-222412-4460787808.eml new file mode 100644 index 0000000..4afc2ff --- /dev/null +++ b/tmp/eml/20150728-222412-4460787808.eml @@ -0,0 +1,26 @@ +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 8bit +Subject: =?utf-8?b?0KDQvtCx0L7RgiBCYXRpc2thZi1rei5reg==?= +From: admin@batiskaf-kz.kz +To: asdfasdf@sadf.com +Date: Tue, 28 Jul 2015 16:24:12 -0000 +Message-ID: <20150728162412.68057.81489@macbook-pro.local> + +Привет, gre! + +Поздравляем, вы успешно оформили заказ. + +Для того, чтобы его было удобнее отслеживать, войдите в свой личный кабинет, используя свой номер телефона +7: + +http://batiskaf-kz.kz/account/ + + +Это автоматическое сообщение. Отвечать на него не нужно! + +С Уважением, +Администрация Batiskaf-kz.kz +-- +Skype: batiskaf_kz +Тел: +7 (777) 163-14-34 или +7 (775) 859-12-17 +------------------------------------------------------------------------------- diff --git a/tmp/eml/20150728-222412-4460820968.eml b/tmp/eml/20150728-222412-4460820968.eml new file mode 100644 index 0000000..b3b2c56 --- /dev/null +++ b/tmp/eml/20150728-222412-4460820968.eml @@ -0,0 +1,11 @@ +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 8bit +Subject: =?utf-8?b?W0RqYW5nb10g0J7RhNC+0YDQvNC40LvQuCDQt9Cw0LrQsNC3?= +From: admin@batiskaf-kz.kz +To: spacenergy@me.com, admin@batiskaf-kz.kz +Date: Tue, 28 Jul 2015 16:24:12 -0000 +Message-ID: <20150728162412.68057.17322@macbook-pro.local> + +Смотреть в админке +------------------------------------------------------------------------------- diff --git a/tmp/eml/20150728-224018-4465087488.eml b/tmp/eml/20150728-224018-4465087488.eml new file mode 100644 index 0000000..106bb03 --- /dev/null +++ b/tmp/eml/20150728-224018-4465087488.eml @@ -0,0 +1,26 @@ +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 8bit +Subject: =?utf-8?b?0KDQvtCx0L7RgiBCYXRpc2thZi1rei5reg==?= +From: admin@batiskaf-kz.kz +To: asdfasdf@sadf.com +Date: Tue, 28 Jul 2015 16:40:18 -0000 +Message-ID: <20150728164018.68341.81056@macbook-pro.local> + +Привет, gre! + +Поздравляем, вы успешно оформили заказ. + +Для того, чтобы его было удобнее отслеживать, войдите в свой личный кабинет, используя свой номер телефона +7: + +http://batiskaf-kz.kz/account/ + + +Это автоматическое сообщение. Отвечать на него не нужно! + +С Уважением, +Администрация Batiskaf-kz.kz +-- +Skype: batiskaf_kz +Тел: +7 (777) 163-14-34 или +7 (775) 859-12-17 +------------------------------------------------------------------------------- diff --git a/tmp/eml/20150728-224018-4465536528.eml b/tmp/eml/20150728-224018-4465536528.eml new file mode 100644 index 0000000..46c9248 --- /dev/null +++ b/tmp/eml/20150728-224018-4465536528.eml @@ -0,0 +1,11 @@ +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 8bit +Subject: =?utf-8?b?W0RqYW5nb10g0J7RhNC+0YDQvNC40LvQuCDQt9Cw0LrQsNC3?= +From: admin@batiskaf-kz.kz +To: spacenergy@me.com, admin@batiskaf-kz.kz +Date: Tue, 28 Jul 2015 16:40:18 -0000 +Message-ID: <20150728164018.68341.64244@macbook-pro.local> + +Смотреть в админке +------------------------------------------------------------------------------- diff --git a/tmp/eml/20150728-224147-4462188696.eml b/tmp/eml/20150728-224147-4462188696.eml new file mode 100644 index 0000000..b9c40da --- /dev/null +++ b/tmp/eml/20150728-224147-4462188696.eml @@ -0,0 +1,26 @@ +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 8bit +Subject: =?utf-8?b?0KDQvtCx0L7RgiBCYXRpc2thZi1rei5reg==?= +From: admin@batiskaf-kz.kz +To: asdfasdf@sadf.com +Date: Tue, 28 Jul 2015 16:41:47 -0000 +Message-ID: <20150728164147.68341.19068@macbook-pro.local> + +Привет, gre! + +Поздравляем, вы успешно оформили заказ. + +Для того, чтобы его было удобнее отслеживать, войдите в свой личный кабинет, используя свой номер телефона +7: + +http://batiskaf-kz.kz/account/ + + +Это автоматическое сообщение. Отвечать на него не нужно! + +С Уважением, +Администрация Batiskaf-kz.kz +-- +Skype: batiskaf_kz +Тел: +7 (777) 163-14-34 или +7 (775) 859-12-17 +------------------------------------------------------------------------------- diff --git a/tmp/eml/20150728-224147-4462410160.eml b/tmp/eml/20150728-224147-4462410160.eml new file mode 100644 index 0000000..b9cf818 --- /dev/null +++ b/tmp/eml/20150728-224147-4462410160.eml @@ -0,0 +1,11 @@ +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 8bit +Subject: =?utf-8?b?W0RqYW5nb10g0J7RhNC+0YDQvNC40LvQuCDQt9Cw0LrQsNC3?= +From: admin@batiskaf-kz.kz +To: spacenergy@me.com, admin@batiskaf-kz.kz +Date: Tue, 28 Jul 2015 16:41:47 -0000 +Message-ID: <20150728164147.68341.15616@macbook-pro.local> + +Смотреть в админке +------------------------------------------------------------------------------- diff --git a/tmp/eml/20150728-224504-4460315928.eml b/tmp/eml/20150728-224504-4460315928.eml new file mode 100644 index 0000000..f594c93 --- /dev/null +++ b/tmp/eml/20150728-224504-4460315928.eml @@ -0,0 +1,11 @@ +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 8bit +Subject: =?utf-8?b?W0RqYW5nb10g0J7RhNC+0YDQvNC40LvQuCDQt9Cw0LrQsNC3?= +From: admin@batiskaf-kz.kz +To: spacenergy@me.com, admin@batiskaf-kz.kz +Date: Tue, 28 Jul 2015 16:45:04 -0000 +Message-ID: <20150728164504.68482.44783@macbook-pro.local> + +Смотреть в админке +------------------------------------------------------------------------------- diff --git a/tmp/eml/20150728-224504-4460735232.eml b/tmp/eml/20150728-224504-4460735232.eml new file mode 100644 index 0000000..5d56fea --- /dev/null +++ b/tmp/eml/20150728-224504-4460735232.eml @@ -0,0 +1,26 @@ +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 8bit +Subject: =?utf-8?b?0KDQvtCx0L7RgiBCYXRpc2thZi1rei5reg==?= +From: admin@batiskaf-kz.kz +To: asdfasdf@sadf.com +Date: Tue, 28 Jul 2015 16:45:04 -0000 +Message-ID: <20150728164504.68482.57283@macbook-pro.local> + +Привет, gre! + +Поздравляем, вы успешно оформили заказ. + +Для того, чтобы его было удобнее отслеживать, войдите в свой личный кабинет, используя свой номер телефона +7: + +http://batiskaf-kz.kz/account/ + + +Это автоматическое сообщение. Отвечать на него не нужно! + +С Уважением, +Администрация Batiskaf-kz.kz +-- +Skype: batiskaf_kz +Тел: +7 (777) 163-14-34 или +7 (775) 859-12-17 +------------------------------------------------------------------------------- diff --git a/tmp/eml/20150728-225843-4463828832.eml b/tmp/eml/20150728-225843-4463828832.eml new file mode 100644 index 0000000..9f917a5 --- /dev/null +++ b/tmp/eml/20150728-225843-4463828832.eml @@ -0,0 +1,26 @@ +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 8bit +Subject: =?utf-8?b?0KDQvtCx0L7RgiBCYXRpc2thZi1rei5reg==?= +From: admin@batiskaf-kz.kz +To: spacenergy@asd.com +Date: Tue, 28 Jul 2015 16:58:43 -0000 +Message-ID: <20150728165843.68923.61730@macbook-pro.local> + +Привет, Виталий1! + +Поздравляем, вы успешно оформили заказ. + +Для того, чтобы его было удобнее отслеживать, войдите в свой личный кабинет, используя свой номер телефона +77083044916: + +http://batiskaf-kz.kz/account/ + + +Это автоматическое сообщение. Отвечать на него не нужно! + +С Уважением, +Администрация Batiskaf-kz.kz +-- +Skype: batiskaf_kz +Тел: +7 (777) 163-14-34 или +7 (775) 859-12-17 +------------------------------------------------------------------------------- diff --git a/tmp/eml/20150728-225844-4463827040.eml b/tmp/eml/20150728-225844-4463827040.eml new file mode 100644 index 0000000..d72333e --- /dev/null +++ b/tmp/eml/20150728-225844-4463827040.eml @@ -0,0 +1,11 @@ +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 8bit +Subject: =?utf-8?b?W0RqYW5nb10g0J7RhNC+0YDQvNC40LvQuCDQt9Cw0LrQsNC3?= +From: admin@batiskaf-kz.kz +To: spacenergy@me.com, admin@batiskaf-kz.kz +Date: Tue, 28 Jul 2015 16:58:44 -0000 +Message-ID: <20150728165844.68923.14083@macbook-pro.local> + +Смотреть в админке +-------------------------------------------------------------------------------