def get_uri_in(): response.js = "$('.go2-btn').removeClass('disabled');$('#go2').children('i').removeClass('fa-refresh fa-spin').addClass('fa-search');" h, result = get_rate_result(request, get_currs=True) print result addr_out = request.vars.addr #print request.vars if not addr_out: return mess(T('ОШИБКА: Задайте кошелек')) try: if len(addr_out) < 25 or len(addr_out) > 40: ##проверка на счет - если это не емайл и не ттелефон то надо длинну и на циифры return mess(T('ОШИБКА: неверный кошелек')) except: return mess(T('ОШИБКА: неверный кошелек 2')) curr_in = result['curr_in_rec'] curr_id = curr_in.id xcurr_in = db(db.xcurrs.curr_id == curr_id).select().first() if not xcurr_in: return mess(T('xcurr in...')) curr_out = result['curr_out_rec'] curr_out_id = curr_out.id xcurr_out = db(db.xcurrs.curr_id == curr_out_id).select().first() if not xcurr_out: return mess(T('xcurr out...')) deal_id = TO_COIN_ID deal = db.deals[deal_id] curr_in_abbrev = curr_in.abbrev curr_in_name = curr_in.name curr_out_abbrev = curr_out.abbrev curr_out_name = curr_out.name token_system_in = None token_key_in = xcurr_in.as_token if token_key_in: token_in = db.tokens[token_key_in] token_system_in = db.systems[token_in.system_id] import rpc_erachain token_system_out = None token_key_out = xcurr_out.as_token if token_key_out: token_out = db.tokens[token_key_out] token_system_out = db.systems[token_out.system_id] import rpc_erachain #print request.application[-5:] if request.application[:-3] != '_dvlp' and not DEVELOP_USE: # чето конфликт если из ipay3_dvlp вызывать то кошелек на ipay3 не коннектится if token_system_out: curr_block = rpc_erachain.get_info(token_system_out.connect_url) if type(curr_block) != type(1): return mess( T('Connection to [%s] is lost, try later ') % curr_out_name) if rpc_erachain.is_not_valid_addr(token_system_out.connect_url, addr_out): return mess( T('address not valid for ') + curr_out_name + ' - ' + addr_out) pass else: import crypto_client try: cc = crypto_client.conn(curr_out, xcurr_out) except: cc = None if not cc: return mess( T('Connection to [%s] is lost, try later ') % curr_out_name) if crypto_client.is_not_valid_addr(cc, addr_out): return mess( T('address not valid for - ') + curr_out_name + ' - ' + addr_out) try: session.toCoin = curr_out_abbrev session.toCoinA = addr_out except: print 'to_coin session error .toCoinA:', type(addr_out), addr_out volume_in = result['volume_in'] try: session.vol = volume_in except: print 'to_coin session error .volume_in:', type(volume_in), volume_in if token_system_in: deal_acc_id, deal_acc_addr = rpc_erachain.get_deal_acc_addr( db, deal_id, curr_out, addr_out, token_system_in.account, xcurr_in) addr_in = token_system_in.account pass else: x_acc_label = db_client.make_x_acc(deal, addr_out, curr_out_abbrev) # найдем ранее созданный адресс для этого телефона, этой крипты и этого фиата # сначала найтем аккаунт у дела deal_acc_id = db_client.get_deal_acc_id(db, deal, addr_out, curr_out) # теперь найдем кошелек для данной крипты deal_acc_addr = db_client.get_deal_acc_addr_for_xcurr( db, deal_acc_id, curr_in, xcurr_in, x_acc_label) if DEVELOP_USE: deal_acc_addr = dict(addr='probe1DEVELOP_USE', id=1234) if not deal_acc_addr: return mess((T('Связь с сервером %s прервана') % curr_in_name) + '. ' + T('Невозможно получить адрес для платежа') + '. ' + T('Пожалуйста попробуйте позже'), 'warning') addr_in = deal_acc_addr['addr'] okIN = session.okWt h += sect( DIV( okIN and DIV(H3(A(T('Правила оплаты'), _onclick='$(".okIN").show("fast");', _class='button warn right'), _class='pull-right-'), _class='col-sm-12') or '', DIV( okIN and ' ' or H3(T('ПРАВИЛА ОПЛАТЫ'), _class='center'), P(T('При оплате необходимо соблюдать следующие правила:')), UL( #T('Желательно задать обратный адрес для возврата монет на случай если наша служба по каким-либо причинам не сможет совершить оплату по делу [%s]') % deal.name, T('Желательно производить плату только со своего кошелька, задав адреса входов, которыми Вы действительно обладаете, а не с кошельков бирж, пулов или онлайн-кошельков. Так как при отправке со своего личного кошелька Вы всегда сможете доказать что это Ваш платеж.' ), T('Комиссия сети добавляется к сумме для обмена, о чем указывается ниже.' ), T('Если Вы оплатите другую сумму, то курс обмена может немножко измениться' ), T('Если Вы платите регулярно, то можете далее платить на тот же адрес кошелька криптовалюты, что получили ранее с указанием тех же деталей платежа. Хотя желательно заходить на нашу службу для получения новостей хотябы раз в пол года или подписаться на важные новости и сообщения оставив свой емайл.' ), ), H4(A(T('Понятно'), _onclick='$(".okIN").hide("fast");ajax("%s")' % URL('aj', 'ok_to', args=['Wt']), _class='button warn'), _class='center'), _class='col-sm-12 okIN', _style='color:chocolate;display:%s;' % (okIN and 'none' or 'block')), _class='row'), 'bg-warning pb-10') # если есть скрытый партнерский код то его забьем пользователю deal_acc = db.deal_accs[deal_acc_id] if not deal_acc.partner: try: _ = GIFT_CODE except: GIFT_CODE = session.gc #from gifts_lib import gift_proc #GIFT_CODE, gift_mess = gift_proc(db, T, deal, deal_acc, request, session, GIFT_CODE) #if GIFT_CODE: # h += sect(XML(gift_mess), 'gift-bgc pb-10 pb-10') import gifts_lib adds_mess = XML(gifts_lib.add_mess_curr(deal_acc, curr_out, T)) if adds_mess: h += sect(XML(adds_mess), 'gift-bgc pb-10 pb-10') hh = CAT(H2(T('Реквизиты оплаты'), _class='center')) if 'base_rate' in result: base_rate = result['base_rate'] is_order = True dealer_deal = None volume_out, tax_rep = db_client.calc_fees(db, deal, dealer_deal, curr_in, curr_out, volume_in, base_rate, is_order, note=1) volume_out = common.rnd_8(volume_out) rate_out = volume_out / volume_in #print 'rate_out', rate_out, 'volume_in', volume_in, 'volume_out', volume_out # new make order order_id = db.orders.insert( ref_=deal_acc_addr['id'], volume_in=volume_in, volume_out=volume_out, ) # теперь стек добавим, который будем удалять потом db.orders_stack.insert(ref_=order_id) txfee = float(xcurr_out.txfee or 0.0001) hh += DIV(P( T('Создан заказ №%s') % order_id, ' ', T('на заморозку обменного курса по'), ' ', rate_out, ' (', T('обратный курс'), ' ', round(1.0 / float(rate_out), 8), ') ', T('для объема'), ' ', volume_out, ' ', curr_out_abbrev, ' (', T('с учётом комиссии сети'), ' ', txfee, ').', H5( '*', T('Данный курс будет заморожен для Вас на 20 минут для объёма криптовалюты не больше указанного. Проверить можно по номеру заказа в списке платежей.' ))), _class='row') else: base_rate = volume_out = rate_out = tax_rep = None _, url_uri = common.uri_make( curr_in.name2, addr_in, { 'amount': volume_in, 'label': db_client.make_x_acc_label(deal, addr_out, curr_out_abbrev) }) if token_system_in: addr_out_full = curr_out_abbrev + ':' + addr_out else: addr_out_full = addr_out free_bal = result['free_bal'] hh += DIV( P( T('Оплата обмена на'), ' ', curr_out_abbrev, ' ', T('с выплатой монет на адрес'), ': ', addr_out, '. ', CAT(T('Текущая сумма обмена'), ' ', volume_out, ' ', curr_out_abbrev, ' (', T('с учётом комиссии сети'), ') ', ' ', T('из доступных в службе')) if volume_out else CAT( T('Доступно в службе')), ' ', free_bal, '. '), P( T('Вы можете делать ещё платежи на созданый %s адрес для совершения автоматического обмена %s на %s по текущему курсу.' ) % (curr_in_name, curr_in_name, curr_out_name), ), DIV(CENTER( A(SPAN( T('Оплатить'), ' ', volume_in or '', ' ', IMG(_src=URL('static', 'images/currs/' + curr_in_abbrev + '.png'), _width=50)), _class='block button blue-bgc', _style='font-size:x-large; max-width:500px; margin:0px 7px;', _href=url_uri), H5( T('Если кошелек не запускается автоматически, произведите оплату вручную по указанным ниже реквизитам, см. ниже' )), ), _class='row') if True or not token_system_in else '', BR(), DIV(H3(A( T('Показать QR-код'), _onclick= "jQuery(this).parent().html('<i class=\"fa fa-spin fa-refresh\" />')", callback=URL('plugins', 'qr', vars={'mess': url_uri}), target='tagQR', _class='button blue-bgc right'), _class='pull-right-'), _class='col-sm-12', _id='tagQR'), T('Для оплаты вручную скопируйте детали платежа в свой кошелек'), ': ', H5( T("Двойной клик по полю или нажмите Ctrl-A внутри поля для выделения в поле всех данных. Далее нажмите Ctrl-C для копирования выделенного в буфер обмена" )), FORM( ## ВНИМАНИЕ !!! тут имена полей надо другие указывать или # FORM в основной делать тоже иначе они складываются LABEL(T("Volume"), ":"), " ", INPUT(_name='v', value=volume_in, _class="pay_val", _readonly=''), curr_in_abbrev, BR(), LABEL(T("Получатель"), ":"), " ", INPUT(_name='addr_in', _value=addr_in, _class='wallet', _readonly=''), BR(), CAT( LABEL( T("Назначение (вставьте в заголовок платежа или в тело сообщения, которое так же можно зашифровать)" ), ":"), " ", INPUT(_name='addr_out', _value=addr_out_full, _class='wallet', _readonly=''), BR()) if token_system_in else '', #T('Резервы службы'), ' ', B(free_bal), ' ', T('рублей'), BR(), #LOAD('where', 'for_addr', vars={'addr': addr_in}, ajax=True, times=100, timeout=20000, # content=IMG(_src=URL('static','images/loading.gif'), _width=48)), INPUT( _type='submit', _class='button blue-bgc', _value=T('Подробный просмотр платежей'), _size=6, ), _action=URL('where', 'index'), _method='post', )) h += sect(hh, 'bg-info pb-10') if base_rate: h += sect( DIV(DIV( H3(T('Почему получился такой курс?')), tax_rep, BR(), T('При этом Вы получаете следующие преимущества при обмене криптовалют у нас' ), ':', UL([ T('Вы можете теперь постоянно делать обмен со своего кошелька на полученный адрес даже не заходя на наш сайт' ), T('не нужно нигде регистрироваться'), T('не нужно делать подтверждения по СМС или по емайл'), T('обмен производится быстро и автоматически'), T('Вам не нужно хранить свои деньги у нас'), ]), T('Время - деньги!'), _class='col-sm-12'), _class='row')) h += SCRIPT(''' $('html, body').animate( { scrollTop: $('#tag2').offset().top - $('#aside1').height() }, 500 ); ''') response.js += '$("#tag").html("");' return h
def get_uri(): import rates_lib, common args = request.args ##print args, '\n', request.vars if len(args) < 2: return mess('err...') deal_id = args(0) curr_id = args(1) or vars.get('curr_in') if not curr_id or len(curr_id) > 20: return mess('error curr_in') try: curr_id = int(curr_id) curr_in = db.currs[curr_id] if not curr_in: return mess('curr in id...') except: curr_in = db(db.currs.abbrev == curr_id).select().first() curr_id = curr_in.id if not curr_in: return mess('curr in id...') curr_id = curr_in.id curr_out_id = args(2) or vars.get('curr_out') if not curr_out_id or len(curr_out_id) > 20: return mess('error curr_out') try: curr_out_id = int(curr_out_id) curr_out = db.currs[curr_out_id] if not curr_out: return mess('curr out id...') except: curr_out = db(db.currs.abbrev == curr_out_id).select().first() if not curr_out: return mess('curr out id...') curr_out_id = curr_out.id addr_out = args(3) #if not deal_id.isdigit() or not curr_id.isdigit(): # return mess('dig...') vol = args(4) if not vol or len(vol) > 20: return mess('error amount') try: vol = float(vol) except: return mess('digs...') if not addr_out: return mess('error address') try: if len(addr_out) < 25 or len(addr_out) > 40: return mess('error address') except: return mess('error address') deal = db.deals[deal_id] if not deal: return mess('deal...') xcurr_in = db(db.xcurrs.curr_id == curr_id).select().first() if not xcurr_in: return mess('xcurr...') xcurr_out = db(db.xcurrs.curr_id == curr_out.id).select().first() if not xcurr_out: return mess('xcurr out...') curr_out_abbrev = curr_out.abbrev curr_out_name = curr_out.name token_system_in = None token_key_in = xcurr_in.as_token if token_key_in: token_in = db.tokens[token_key_in] token_system_in = db.systems[token_in.system_id] import rpc_erachain token_system_out = None token_key_out = xcurr_out.as_token if token_key_out: token_out = db.tokens[token_key_out] token_system_out = db.systems[token_out.system_id] import rpc_erachain #print request.application[-5:] if request.application[:-3] != '_dvlp': # conflicts to call if from [ipay3_dvlp] - wallet not in connection... if token_system_out: curr_block = rpc_erachain.get_info(token_system_out.connect_url) if type(curr_block) != type(1): return mess('Connection to [%s] is lost, try later ' % curr_out_name) if rpc_erachain.is_not_valid_addr(token_system_out.connect_url, addr_out): return mess('address not valid for ' + curr_out_name + ' - ' + addr_out) pass else: import crypto_client try: cc = crypto_client.conn(curr_out, xcurr_out) except: cc = None if not cc: return mess('Connection to [%s] is lost, try later ' % curr_out_name) if crypto_client.is_not_valid_addr(cc, addr_out): return mess('address not valid for - ' + curr_out_name + ' - ' + addr_out) curr_in_name = curr_in.name if token_system_in: deal_acc_id, deal_acc_addr = rpc_erachain.get_deal_acc_addr( db, deal_id, curr_out, addr_out, token_system_in.account, xcurr_in) addr_in = token_system_in.account pass else: x_acc_label = db_client.make_x_acc(deal, addr_out, curr_out_abbrev) deal_acc_id = db_client.get_deal_acc_id(db, deal, addr_out, curr_out) deal_acc_addr = db_client.get_deal_acc_addr_for_xcurr( db, deal_acc_id, curr_in, xcurr_in, x_acc_label) if not deal_acc_addr: return mess('Connection to [%s] is lost, try later ' % curr_in_name) addr_in = deal_acc_addr.addr deal_acc = db.deal_accs[deal_acc_id] volume_out = vol # fast search of RATE first # pr_b, pr_s, pr_avg = rates_lib.get_average_rate_bsa( db, curr_in.id, curr_out.id, None) if pr_avg: vol_in = volume_out / pr_b amo_out, _, best_rate = rates_lib.get_rate(db, curr_in, curr_out, vol_in) else: best_rate = None if best_rate: is_order = True dealer_deal = None # first add TAX txfee = float(xcurr_out.txfee or 0.0001) volume_out += txfee volume_in, mess_in = db_client.calc_fees_back(db, deal, dealer_deal, curr_in, curr_out, volume_out, best_rate, is_order, note=0) volume_in = common.rnd_8(volume_in) rate_out = volume_out / volume_in # new make order order_id = db.orders.insert( ref_=deal_acc_addr.id, volume_in=volume_in, volume_out=volume_out, ) db.orders_stack.insert(ref_=order_id) else: volume_in = rate_out = tax_rep = None _, uri = common.uri_make( curr_in.name2, addr_in, { 'amount': volume_in, 'label': db_client.make_x_acc_label(deal, addr_out, curr_out_abbrev) }) curr_in_abbrev = curr_in.abbrev # lim_bal, may_pay = db_client.is_limited_ball(curr_in) free_bal = db_client.curr_free_bal(curr_out) if token_system_in: addr_out_full = (token_system_out and ('%d' % token_out.token_key) or curr_out.abbrev) + ':' + addr_out else: addr_out_full = addr_out out_res = dict(curr_out_abbrev=curr_out_abbrev, addr_out=addr_out, volume_out=volume_out, bal=float(free_bal / 2), rate=rate_out, curr_in_name=curr_in_name, volume_in=volume_in, curr_in_abbrev=curr_in_abbrev, addr_in=addr_in, uri=uri) if lim_bal > 0: out_res['may_pay'] = float(may_pay / 2) if not volume_in: out_res['wrong'] = 'rate not found' if token_system_in: out_res['addr_out_full'] = addr_out_full return request.extension == 'html' and dict( h=DIV(BEAUTIFY(out_res), _class='container')) or out_res
def validate_addr(): import time time.sleep(1) xcurr = None curr_abbrev = request.vars.get('curr') addr = request.vars.get('addr') if len(request.args) == 1: addr = request.args[0] if len(request.args) == 2: curr_abbrev = request.args[0] addr = addr or request.args[1] if not addr: return { 'error': 'need addr or curr_abbrev, example: /validate_addr.json/[addr] or /validate_addr.json/[curr_abbrev]/[addr]' } if addr and not curr_abbrev: from db_common import get_currs_by_addr curr, xcurr, _ = get_currs_by_addr(db, addr) if curr_abbrev: from db_common import get_currs_by_abbrev curr, xcurr, _ = get_currs_by_abbrev(db, curr_abbrev) if not xcurr: return {"error": "invalid curr_abbrev"} token_system_out = None token_key = xcurr.as_token if token_key: token = db.tokens[token_key] token_system = db.systems[token.system_id] import rpc_erachain curr_block = rpc_erachain.get_info(token_system.connect_url) if type(curr_block) != type(1): return { 'error': 'Connection to [%s] is lost, try later ' % curr.name } if rpc_erachain.is_not_valid_addr(token_system.connect_url, addr): return { 'error': 'address not valid for ' + curr.name + ' - ' + addr } return {'curr': curr.abbrev, 'ismine': token_system.account == addr} else: from crypto_client import conn try: conn = conn(curr, xcurr) except: conn = None if not conn: return { 'error': 'Connection to [%s] is lost, try later ' % curr.name } valid = conn.validateaddress(addr) #import crypto_client #if crypto_client.is_not_valid_addr(conn, addr): # return { 'error': 'address not valid for - ' + curr.abbrev} if not valid.get('isvalid'): return { "error": "invalid for [%s]" % curr.abbrev, 'mess': '%s' % valid } return { 'curr': curr.abbrev, 'ismine': valid.get('ismine'), 'mess': '%s' % valid }
def get(): args = request.args ##print args, '\n', request.vars if len(args) < 2: return mess('err...') deal_id = args(0) curr_id = args(1) if not deal_id.isdigit() or not curr_id.isdigit(): return mess('dig...') # теперь можно задать открытие кнопки scr = "$('#cvr%s').css('display','none');$('#tag%s').show('slow');" % (curr_id, curr_id) response.js = scr vol = request.vars.vol if not vol or len(vol) > 20: return mess(T('ОШИБКА') + ': ' + T('Задайте количество')) try: vol = float(vol) curr_id = int(curr_id) except: return mess('digs...') addr_out = request.vars.addr #print request.vars if not addr_out: return mess(T('ОШИБКА: Задайте кошелек')) try: if len(addr_out) < 25 or len(addr_out) > 40: ##проверка на счет - если это не емайл и не ттелефон то надо длинну и на циифры return mess(T('ОШИБКА: неверный кошелек')) except: return mess(T('ОШИБКА: неверный кошелек 2')) deal = db.deals[ deal_id ] if not deal: return mess(T('deal...')) curr_in = db.currs[ curr_id ] if not curr_in: return mess(T('curr...')) xcurr_in = db(db.xcurrs.curr_id == curr_id).select().first() if not xcurr_in: return mess(T('xcurr...')) #print request.vars curr_out = db.currs[ request.vars.curr_out ] xcurr_out = db(db.xcurrs.curr_id == curr_out.id).select().first() curr_out_abbrev = curr_out.abbrev curr_out_name = curr_out.name token_system_in = None token_key_in = xcurr_in.as_token if token_key_in: token_in = db.tokens[token_key_in] token_system_in = db.systems[token_in.system_id] import rpc_erachain token_system_out = None token_key_out = xcurr_out.as_token if token_key_out: token_out = db.tokens[token_key_out] token_system_out = db.systems[token_out.system_id] import rpc_erachain #print request.application[-5:] if request.application[:-3] != '_dvlp': # чето конфликт если из ipay3_dvlp вызывать то кошелек на ipay3 не коннектится if token_system_out: curr_block = rpc_erachain.get_info(token_system_out.connect_url) if type(curr_block) != type(1): return mess(T('Connection to [%s] is lost, try later ') % curr_out_name) if rpc_erachain.is_not_valid_addr(token_system_out.connect_url, addr_out): return mess(T('address not valid for ') + curr_out_name + ' - ' + addr_out) pass else: import crypto_client try: cc = crypto_client.conn(curr_out, xcurr_out) except: cc = None if not cc: return mess(T('Connection to [%s] is lost, try later ') % curr_out_name) if crypto_client.is_not_valid_addr(cc, addr_out): return mess(T('address not valid for - ') + curr_out_name + ' - ' + addr_out) try: session.toCoin = curr_out_abbrev session.toCoinA = addr_out except: print 'to_coin session error .toCoinA:', type(addr_out), addr_out try: session.vol = vol except: print 'to_coin session error .vol:', type(vol), vol curr_in_name = curr_in.name if token_system_in: deal_acc_id, deal_acc_addr = rpc_erachain.get_deal_acc_addr(db, deal_id, curr_out, addr_out, token_system_in.account, xcurr_in) addr_in = token_system_in.account pass else: x_acc_label = db_client.make_x_acc(deal, addr_out, curr_out_abbrev) # найдем ранее созданный адресс для этого телефона, этой крипты и этого фиата # сначала найтем аккаунт у дела deal_acc_id = db_client.get_deal_acc_id(db, deal, addr_out, curr_out) # теперь найдем кошелек для данной крипты deal_acc_addr = db_client.get_deal_acc_addr_for_xcurr(db, deal_acc_id, curr_in, xcurr_in, x_acc_label) if not deal_acc_addr: return mess((T('Связь с сервером %s прервана') % curr_in_name) + '. ' + T('Невозможно получить адрес для платежа') + '. ' + T('Пожалуйста попробуйте позже'), 'warning') addr_in = deal_acc_addr.addr h = CAT() okIN = session.okWt h += sect(DIV( okIN and DIV(H3(A(T('Правила оплаты'), _onclick='$(".okIN").show("fast");', _class='button warn right'), _class='pull-right-'), _class='col-sm-12') or '', DIV(okIN and ' ' or H3(T('ПРАВИЛА ОПЛАТЫ'), _class='center'), P(T('При оплате необходимо соблюдать следующие правила:')), UL( T('Желательно задать обратный адрес для возврата монет на случай если наша служба по каким-либо причинам не сможет совершить оплату по делу [%s]') % deal.name, T('Если Вы не задали обратный адрес для возврата монет, то необходимо платить биткоины и другую криптовалюту только со своего кошелька, задав адреса входов, которыми Вы действительно обладаете, а не с кошельков бирж, пулов или разных онлайн-кошельков. Так как монеты, в случае если платеж будет отвергнут нашим партнёром, могут автоматически вернуться только на адрес отправителя.'), T('Комиссия сети добавляется к сумме для обмена, о чем указывается ниже.'), T('Если Вы оплатите другую сумму, то курс обмена может немножко измениться'), T('Если Вы платите регулярно, то можете платить на тот же адрес кошелька криптовалюты, что получили ранее. Хотя желательно заходить на нашу службу для получения новостей хотябы раз в пол года или подписаться на важные новости и сообщения оставив свой емайл.'), ), H4(A(T('Понятно'), _onclick='$(".okIN").hide("fast");ajax("%s")' % URL('aj','ok_to',args=['Wt']), _class='button warn'), _class='center'), _class='col-sm-12 okIN', _style='color:chocolate;display:%s;' % (okIN and 'none' or 'block')), _class='row'), 'bg-warning pb-10') # если есть скрытый партнерский код то его забьем пользователю deal_acc = db.deal_accs[deal_acc_id] if not deal_acc.partner: try: _ = GIFT_CODE except: GIFT_CODE = session.gc #from gifts_lib import gift_proc #GIFT_CODE, gift_mess = gift_proc(db, T, deal, deal_acc, request, session, GIFT_CODE) #if GIFT_CODE: # h += sect(XML(gift_mess), 'gift-bgc pb-10 pb-10') import gifts_lib adds_mess = XML(gifts_lib.add_mess_curr(deal_acc, curr_out, T)) if adds_mess: h += sect(XML(adds_mess), 'gift-bgc pb-10 pb-10') volume_out = vol hh = CAT(H2('4. ' + T('Оплатите по данным реквизитам'), _class='center')) # используем быстрый поиск курса по формуле со степенью на количество входа # только надо найти кол-во входа от выхода pr_b, pr_s, pr_avg = rates_lib.get_average_rate_bsa(db, curr_in.id, curr_out.id, None) if pr_avg: vol_in = volume_out / pr_b amo_out, _, best_rate = rates_lib.get_rate(db, curr_in, curr_out, vol_in) else: best_rate = None if best_rate: is_order = True dealer_deal = None # сначала открутим обратную таксу txfee = float(xcurr_out.txfee or 0.0001) volume_out += txfee volume_in, mess_in = db_client.calc_fees_back(db, deal, dealer_deal, curr_in, curr_out, volume_out, best_rate, is_order, note=0) ## теперь таксы для человека получим и должна та же цифра выйти vol_out_new, tax_rep = db_client.calc_fees(db, deal, dealer_deal, curr_in, curr_out, volume_in, best_rate, is_order, note=1) vol_out_new = common.rnd_8(vol_out_new) if common.rnd_8(volume_out) != vol_out_new: print 'to_phone error_in_fees: volume_out != vol_out_new', volume_out, vol_out_new volume_in = common.rnd_8(volume_in) rate_out = volume_out / volume_in # new make order order_id = db.orders.insert( ref_ = deal_acc_addr.id, volume_in = volume_in, volume_out = volume_out, ) # теперь стек добавим, который будем удалять потом db.orders_stack.insert( ref_ = order_id ) hh += DIV( T('Создан заказ №%s') % order_id,' ', T('на заморозку обменного курса по'), ' ', rate_out, ' (',T('обратный курс'), ' ', round(1.0/float(rate_out),8),') ', T('для объема'),' ',volume_out, ' ', curr_out_abbrev, ' (', T('с учётом комиссии сети'),' ',txfee,').', H5('*',T('Данный курс будет заморожен для Вас на 20 минут для объёма криптовалюты не больше указанного. Проверить можно по номеру заказа в списке платежей.')), _class='row') else: volume_in = rate_out = tax_rep = None hh += mess('[' + curr_in_name + '] -> [' + curr_out_name + ']' + T(' - лучшая цена не доступна.') + T('Но Вы можете оплатить вперед'), 'warning pb-10') _, url_uri = common.uri_make( curr_in.name2, addr_in, {'amount':volume_in, 'label': db_client.make_x_acc_label(deal, addr_out, curr_out_abbrev)}) curr_in_abbrev = curr_in.abbrev lim_bal, may_pay = db_client.is_limited_ball(curr_in) if lim_bal: if may_pay> 0: lim_bal_mess = P( T('Внимание! Для криптовалюты %s существует предел запаса и поэтому наша служба может принять только %s [%s], Просьба не превышать это ограничение') % (curr_in.name, may_pay, curr_in_abbrev), '.', _style='color:black;' ) else: lim_bal_mess = P( T('ВНИМАНИЕ! Наша служба НЕ может сейчас принимать %s, так как уже достугнут предел запаса её у нас. Просьба попробовать позже, после того как запасы [%s] снизятся благодаря покупке её другими пользователями') % (curr_in.name, curr_in_abbrev), '. ', T('Иначе Ваш платеж будет ожидать момента когда запасы снизятся ниже %s') % lim_bal,'.', _style='color:brown;') else: lim_bal_mess = '' free_bal = db_client.curr_free_bal(curr_out) if token_system_in: addr_out_full = (token_system_out and ('%d' % token_out.token_key) or curr_out.abbrev) + ':' + addr_out else: addr_out_full = addr_out hh += DIV( P( T('Оплата обмена на'), ' ',curr_out_abbrev, ' ', T('с выплатой монет на адрес'), ': ', addr_out, '. ', T('Текущая сумма обмена'), ' ', volume_out, ' ', curr_out_abbrev,' (', T('с учётом комиссии сети'),') ', ' ', T('из доступных в службе'), ' ', free_bal, '. ', T('Так же Вы можете делать ещё платежи на созданый %s адрес для совершения автоматического обмена %s на %s по текущему курсу.') % (curr_in_name, curr_in_name, curr_out_name), ), volume_out > free_bal and P( H3(T('Сейчас средств на балансе меньше чем Вам надо'), _style='color:crimson;'), SPAN(T('Поэтому Ваш заказ будет исполнен позже'), BR(), T('когда на балансе службы появится достаточно средств'), _style='color:black;'), BR(), ) or '', lim_bal_mess, DIV(CENTER( A(SPAN(T('Оплатить'),' ', volume_in or '', ' ', IMG(_src=URL('static','images/currs/' + curr_in_abbrev + '.png'), _width=50)), _class='block button blue-bgc', _style='font-size:x-large; max-width:500px; margin:0px 7px;', _href=url_uri), ), _class='row' ) if not token_system_in else '', BR(), DIV( A(T('Показать QR-код'), _class='btn btn-info', ##_onclick="jQuery(this).parent().html('%s')" % IMG(_src=URL('static','images/loading.gif'), _width=64), _onclick="jQuery(this).parent().html('<i class=\"fa fa-spin fa-refresh\" />')", callback=URL('plugins','qr', vars={'mess': url_uri}), target='tag0', #delete='div#tag0' ), _id='tag0'), H3(T('или')), T('Оплатите вручную'), '. ',# 'URI:', url_uri,'. ', T("Для этого скопируйте значения полей (двойной клик по полю для выделения) и вставьте их в платеж на вашем кошельке"), ': ', FORM( ## ВНИМАНИЕ !!! тут имена полей надо другие указывать или # FORM в основной делать тоже иначе они складываются LABEL(T("Volume")), " ", INPUT(_name='v', value=volume_in, _class="pay_val", _readonly=''), curr_in_abbrev, BR(), LABEL(T("Получатель")), " ", INPUT(_name='addr_in', _value=addr_in, _class='wallet', _readonly=''), BR(), CAT(LABEL(T("Назначение (вставьте в заголовок платежа)")), " ", INPUT(_name='addr_out', _value=addr_out_full, _class='wallet', _readonly=''), BR()) if token_system_in else '', #T('Резервы службы'), ' ', B(free_bal), ' ', T('рублей'), BR(), #LOAD('where', 'for_addr', vars={'addr': addr_in}, ajax=True, times=100, timeout=20000, # content=IMG(_src=URL('static','images/loading.gif'), _width=48)), INPUT( _type='submit', _class='button blue-bgc', _value=T('Подробный просмотр платежей'), _size=6, ), _action=URL('where', 'index'), _method='post', ) ) h += sect(hh, 'bg-info pb-10') h += sect(DIV(DIV( H3(T('Почему получился такой курс?')), tax_rep, BR(), T('При этом Вы получаете следующие преимущества при обмене криптовалют у нас'),':', UL( [ T('Вы можете теперь постоянно делать обмен со своего кошелька на полученный адрес даже не заходя на наш сайт'), T('не нужно нигде регистрироваться'), T('не нужно делать подтверждения по СМС или по емайл'), T('обмен производится быстро и автоматически'), T('Вам не нужно хранить свои деньги у нас'), ] ), T('Время - деньги!'), _class='col-sm-12'), _class='row')) h += SCRIPT(''' $('html, body').animate( { scrollTop: $('#cvr%s').offset().top - $('#aside1').height() }, 500 ); ''' % (curr_id)) return h