def get(): #common.page_stats(db, response['view']) #print request.vars args = request.args if len(args) < 2: return mess('args<2 err...') curr_id = args(0) if len(curr_id) > 5 or not curr_id.isdigit(): return mess('curr_id dig...') # теперь можно задать открытие кнопки scr = "$('#cvr%s').css('display','none');$('#tag%s').show('slow');" % ( curr_id, curr_id) response.js = scr deal_id = args(1) if not deal_id or len(deal_id) > 10 or not deal_id.isdigit(): return mess('deal_id vars..') 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 try: # если русский язык то выдаст ошибку в if v.find(c) >-1: for k, v in request.vars.items(): #print k, v for c in u'\\/<>\'"': if v.find(c) > -1: return mess('error in pars <script>') except: pass client = db(db.clients.deal_id == deal_id).select().first() if client: redirect(URL('to_shop', 'index', args=[client.id], vars={})) volume_out = test_vol(request.vars.vol) if not volume_out: return mess('volume_out error...') deal = db.deals[deal_id] vol = (deal.MIN_pay or 100) * 2 dealer, dealer_acc, dealer_deal = ed_common.select_ed_acc( db, deal, ecurr_out, vol, True) if not dealer: return mess('ERROR: not found dealer for "%s"' % deal.name) dealer_acc = ed_common.sel_acc_max_for_balance(db, dealer, ecurr_out, vol, unlim=True) MIN = db_common.gMIN(deal, dealer) #MAX = deal.MAX_ or 777 if MIN > volume_out: return mess('ОШИБКА: Слишком маленькая сумма платежа, меньше чем: %s' % MIN) ################################################ # соберем аккаунт для оплаты из введенных данных ################################################ if dealer_deal.grab_form: deal_pars = {} #print request.post_vars # удалим наши параметры for key in ['xcurr', 'volume', 'deal_id']: deal_pars[key] = request.post_vars.pop(key) # парамтеры что ввел пользователь обрежем чтобы скрипты не писали for (k, v) in request.post_vars.iteritems(): if len(v) > 20: request.post_vars[k] = v[:20] acc = request.post_vars #.list.sort() if len(acc) > 10: m = 'ОШИБКА: параметров слишком много: %s, свяжитесь с администратором' % acc print m return mess(m) acc = json.dumps(acc) #print 'ACC:', acc else: # проверку параметров # и собрем из параметров счет клиента acc_pars = [] if dealer_deal.p2p: if deal.template_ == '--': pay_pars_deal = [] pay_pars_dealer = [] acc_pars.append('main') else: pay_pars_deal = ed_common.PAY_PARS_P2P pay_pars_dealer = ed_YD.PAY_PARS_P2P else: pay_pars_deal = deal.template_ and json.loads( deal.template_) or ed_common.PAY_PARS pay_pars_dealer = dealer_deal.template_ and json.loads( dealer_deal.template_) or ed_YD.PAY_PARS #print request.vars for par in pay_pars_deal: ## par - параметры от ДЕЛА if 'calc' in par: continue p_n_name = par.get('n') if not p_n_name: continue val = request.vars[p_n_name] or '' p = pay_pars_dealer[p_n_name] #print p, val if 'f' in par: # фильтр регулярный #regular = re.compile(p['f']) #val = regular.sub("","%s" % val) val = re.sub(p['f'], "", "%s" % val) if 'ln' in p: # проверка длинны ln = (p['ln'] + 0) if len(val) != ln: l = p['l'] db.deal_errs.insert(deal_id=deal.id, err='len!=%s - %s = %s' % (ln, l, val)) l = l.encode('utf8') return mess('ОШИБКА: Проверьте введенные данные!') acc_pars.append(val) #все прошло # теперь проверку на правильность лицевого счета и прочего для дилера электронных платежей #dealer_acc #print pars if len(acc_pars) > 10: m = 'ОШИБКА: параметров слишком много: %s, свяжитесь с администратором' % acc_pars print m return mess(m) acc = ' '.join( acc_pars).rstrip() # и удалим пробелы справа от калькуляторов #print 'ACCOUNT:',acc if not acc or len(acc) < 3: return mess('ОШИБКА: Аккаунт слишком короткий: %s' % acc) # запомним что это дело кто-то захотел оплатить dealer_deal.update_record(wanted=dealer_deal.wanted + 1) pattern_id = dealer_deal.scid res = ed_common.pay_test( db, deal, dealer, dealer_acc, dealer_deal, acc, #(deal.MIN_pay or dealer.pay_out_MIN or 10)*2, volume_out, False) err_mess = '%s' % res if res['status'] != 'success': ed_common.dealer_deal_errs_add(db, dealer_deal, acc, err_mess) response.title = T("ОШИБКА") #print res mm = 'error_description' in res and res['error_description'] or res[ 'error'] or 'dealer error' mm = T('Платежная система %s отвергла платеж, потому что: %s') % ( dealer.name, mm) return mess(mm) dealer_info = json.loads(dealer.info) if deal.url and len(deal.url) > 0: shops_url = deal.url else: shops_url = dealer_info['shops_url'] + "%s" % dealer_deal.scid deal_img = make_img(deal, dealer_info, shops_url) # get new or old adress for payment x_acc_label = db_client.make_x_acc(deal, acc, curr_out.abbrev) #print x_acc_label # найдем ранее созданный адресс для этого телефона, этой крипты и этого фиата # сначала найтем аккаунт у дела deal_acc_id = db_client.get_deal_acc_id(db, deal, acc, curr_out) #print 'deal_acc_id',deal_acc_id #return # теперь найдем кошелек для данной крипты #print x_acc_label 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(' связь с кошельком ') + curr_in.name + T(' прервана.')) addr = deal_acc_addr.addr deal_name = deal.name # если есть скрытый партнерский код то его забьем пользователю deal_acc = db.deal_accs[deal_acc_id] import gifts_lib adds_mess = XML(gifts_lib.adds_mess(deal_acc, PARTNER_MIN, T)) deal_url = A(deal.name, _href=shops_url, _target="_blank") e_bal, MAX = get_e_bal(deal, dealer, dealer_acc) if MAX and volume_out > MAX: volume_out = MAX # используем быстрый поиск курса по формуле со степенью на количество входа # только надо найти кол-во входа от выхода 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 not best_rate: return mess('[' + curr_in.name + '] -> [' + curr_out.name + ']' + T(' - лучшая цена не доступна.')) is_order = True # сначала открутим обратную таксу 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 volume_out != vol_out_new: print 'to_phone error_in_fees: volume_out != vol_out_new', volume_out, vol_out_new # теперь для заказ на курс уберем комиссию диллера - просто пересчитаем вход с наченкой диллера fee_curr = db.currs[deal.fee_curr_id] fee_rate = Decimal( rates_lib.get_avr_rate_or_null(db, fee_curr.id, curr_out.id)) vol_out_dd_neg, _ = db_client.dealer_deal_tax_neg(db, T, fee_rate, dealer_deal, '', Decimal(volume_out), '') #print vol_out_dd_neg # причем тут учитываем уже накрутку диллера за дело - в заказе курс будет с учетом накрутки автоматом volume_in = common.rnd_8(volume_in) rate_out = volume_out / volume_in # new make order order_rate_id = db.orders.insert( ref_=deal_acc_addr.id, volume_in=volume_in, volume_out=vol_out_dd_neg, ) # теперь стек добавим, который будем удалять потом db.orders_stack.insert(ref_=order_rate_id) addr_return = deal_acc_addr.addr_return if addr_return: addr_ret = DIV( DIV(T('Адрес для возвратов'), ': ', B(addr_return[:5] + '...' + addr_return[-5:]), _class='col-sm-12'), _class='row success', ) else: addr_ret = LOAD( 'aj', 'addr_ret', #args=[deal_acc_addr.addr_return or 0, deal_acc_addr.id, ], # лучше передавать через переменные - чтобы там по кругу они гонялись # в request args=[deal_acc_addr.id], ajax= False, # тут без асинхронной подгрузки модуля - вместе со страницей сразу грузим модуль ) _uri, uri_url = common.uri_make( curr_in.name2, addr, { 'amount': volume_in, 'label': db_client.make_x_acc_label(deal, acc, curr_out.abbrev) }) qr = DIV(DIV(DIV(P(T('Показать QR-код'), _class='btn_mc2'), _class='btn_mc1'), _onclick=''' jQuery(this).html('%s'); ajax("%s", [], 'tag_qr'); ''' % (IMG(_src=URL('static', 'images/loading.gif'), _width=64), URL('plugins', 'qr', vars={'mess': uri_url})), _id='tag_qr', _class='btn_mc col-sm-6'), _class='row') 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( 'Внимание! Для криптовалюты %s существует предел запаса и поэтому наша служба может принять только %s [%s], Просьба не превышать это ограничение' % (curr_in.name, may_pay, curr_in_abbrev), '.', _style='color:black;') else: lim_bal_mess = P( 'ВНИМАНИЕ! Наша служба НЕ может сейчас принимать %s, так как уже достугнут предел запаса её у нас. Просьба попробовать позже, после того как запасы [%s] снизятся благодаря покупке её другими пользователями' % (curr_in.name, curr_in_abbrev), '. ', 'Иначе Ваш платеж будет ожидать момента когда запасы снизятся ниже %s' % lim_bal, '.', _style='color:brown;') else: lim_bal_mess = '' return dict(deal_name=deal_name, adds_mess=adds_mess, MIN=MIN, MAX=MAX, acc=acc, order_rate_id=order_rate_id, rate_out=rate_out, curr_in_name=curr_in_abbrev, curr_out_name=curr_out.abbrev, e_bal=e_bal, deal_url=deal_url, volume_in=volume_in, volume_out=volume_out, tax_rep=tax_rep, deal_img=deal_img, uri_url=uri_url, addr=addr, addr_ret=addr_ret, qr=qr, curr_id=curr_id, lim_bal_mess=lim_bal_mess)
def index(): #if not IS_LOCAL: # redirect(URL('ipay','more','to_pay',args=request.args)) #common.page_stats(db, response['view']) if len(request.args) == 0: redirect(URL('deal', 'index')) deal_id = request.args(0) if len(deal_id) > 10 or not deal_id.isdigit(): redirect(URL('deal', 'index')) deal = db.deals[deal_id] if not deal: redirect(URL('deal', 'index')) deal.update_record(wants=deal.wants + 1) if not deal.used: redirect(URL('deal', 'index')) response.title = 'Платежи оплата биткоинами криптовалютой услуги %s' % deal.name client = db(db.clients.deal_id == deal.id).select().first() if client: # to_shop/index/2?order=12&user=eytu #redirect(URL('to_shop','index',args=[client.id], vars=request.vars)) raise HTTP(200, T('ERROR: it is client "%s"') % client.email) vol = (deal.MIN_pay or 100) * 2 dealer, dealer_acc, dealer_deal = ed_common.select_ed_acc( db, deal, ecurr_out, vol, True) if not dealer: raise HTTP(200, T('ERROR: not found dealer for "%s"') % deal.name) dealer_acc = ed_common.sel_acc_max_for_balance(db, dealer, ecurr_out, vol, unlim=True) #print dealer.info dealer_info = dealer.info and json.loads(dealer.info) shops_url = dealer_info['shops_url'] #MAX = deal.MAX_pay or 777 MIN = db_common.gMIN(deal, dealer) if not response.vars: response.vars = {} if deal.url and len(deal.url) > 0: shops_url = deal.url else: shops_url = dealer_info['shops_url'] + "%s" % dealer_deal.scid deal_img = make_img(deal, dealer_info, shops_url) title=XML(XML(T("Задайте параметры платежа для ") + '<BR>') + XML( deal_img or '' ) + ' ' +\ XML( A(deal.name, _href=shops_url, _target="_blank"))) title = XML( XML(deal_img or '') + ' <b>' + deal.name + '</b> ' + 'оплата биткоинами и криптовалютой') deal_cat = db.deals_cat[deal.cat_id] subtitle = XML( 'Другие услуги вида %s' % A(deal_cat.name, _href=URL('deal', 'index', args=[deal_cat.id]))) response.vars['s_url'] = XML(A(T('тут'), _href=shops_url, _target="_blank")) response.vars['shops_url'] = shops_url acc_pars = None if dealer_deal.grab_form: # тут тырим форму с сайта яндекса напрямую #scid, name, img, form = ed_form.load_YD(...) response.vars['grab_form'] = ed_form.load_YD(shops_url, URL('more', 'pay')) #print response.vars['grab_form'] else: acc_pars = [] ajax_vars = [] if dealer_deal.p2p: if deal.template_ == '--': pay_pars_deal = [] pay_pars_dealer = [] else: pay_pars_deal = ed_common.PAY_PARS_P2P pay_pars_dealer = ed_YD.PAY_PARS_P2P else: pay_pars_deal = deal.template_ and json.loads( deal.template_) or ed_common.PAY_PARS pay_pars_dealer = dealer_deal.template_ and json.loads( dealer_deal.template_) or ed_YD.PAY_PARS #print dealer_deal.template_, json.loads(dealer_deal.template_) #print dealer_deal #print pay_pars_deal #print pay_pars_dealer calcs = dealer_deal.calcs_ or {} for p in pay_pars_deal: read_only = None if 'calc' in p: continue if type(p) == type([]): continue #print p p_n_name = p.get('n') p_t = p_n_name and pay_pars_dealer.get(p_n_name) def_val = subsel_parent = None add_pars = {} calc2 = calcs.get(p_n_name) #print 'calc2', calc2 if calc2 != None and type(calc2) not in [ type(dict()), type([]), type({}) ]: # тут простое вычисление - прпустим continue if calc2: # это поле вычисляется автоматически # или есть зависимые от него поля subsel_name = calc2.get('subsel') subsel_parent = calc2.get('parent') if subsel_name: # это поле главное и у него есть подчиненное поле add_pars[ '_onChange'] = 'ajax("../subsel_callback", ["%s", "deal_id", "dealer_deal_id"], "%s");' % ( p_n_name, 'div_' + subsel_name) #_onChange="ajax('selsub2_callback', ['%s'], '%s');" % (sel1_name, sel2_div_name), if subsel_parent: add_pars['_disabled'] = 'disabled' if not subsel_name and not subsel_parent: # это поле обычное вычисляемое -- пропустим continue # если параметры передаются как параметры после ? def_val = request.vars.get(p_n_name) if def_val: read_only = True sel = p_t and p_t.get('sel') lab_ = p.get('l') tip_ = p.get('m') if sel: lab_ = LABEL(lab_ and T(lab_) or p_n_name) opt = [] for item in sel: #for (v, l) in item.iteritems(): opt.append(OPTION(item['label'], _value=item['value'])) #print opt inp = SELECT(opt, _name=p_n_name, _id=p_n_name, _type="text", _class='field blue-c', **add_pars) elif p_n_name: lab_ = LABEL(lab_ and T(lab_) or p_n_name) # если имя поля задано то поле покажем inp = INPUT( _name=p_n_name, _id=p_n_name, # тут имя поля указываем для диллера _placeholder=p.get('ph', ''), _value=def_val or session.vars and session.vars.get(p.get('n')) or p.get('v'), _readonly=read_only, #_size=('ln' in p and p['ln'] or 5)+1, _onblur='ln' in p and 'get_acc(this, %s, "%s");' % (p['ln'] or 0, 'символов %s'), requires=IS_NOT_EMPTY(), _class='field blue-c', **add_pars) elif lab_: acc_pars.append({ 'l': HR(_align="center", _width="auto", _size="3", _color="#ffffff"), 'i': '' }) ##lab_ = LABEL(lab_ and T(lab_) or '') lab_ = LABEL(H5(T(lab_))) inp = '' elif tip_: lab_ = LABEL( H4( TAG.i(_class='fa fa-exclamation-triangle', _style='color:yellow; font-size:1.5em;'), ' ', tip_)) inp = '' if subsel_parent: # это подчиненное поле - результат аякса # то вложем его внутрь inp = DIV(inp, _id='div_' + p_n_name) item = { 'l': lab_, 'i': inp, } info = p.get('i') if info: item['l'] += '*' item['m'] = XML(info) acc_pars.append(item) if p_n_name: ## для полей АЯКСа ## причем надо от УНИКОДЕ строки избавиться - поэтому % _sss = p_n_name.encode('ascii') ##print _sss, type(_sss) ajax_vars.append(_sss) #print i_d, request.args #if False and len(request.args)>i_d+1: # # цена тоже задана # volume_out = float(request.args[i_d+1]) # response.vars['vol_readonly'] = True response.vars['e_bal'], MAX = get_e_bal(deal, dealer, dealer_acc) volume_out = 377 if request.vars: #print request.vars if 'mess' in request.vars: response.vars['shop_mess'] = request.vars['mess'] if 'sum' in request.vars: volume_out = test_vol(request.vars['sum'], MIN, MAX) response.vars['vol_readonly'] = True session.vol = volume_out response.vars['deal_id'] = deal_id response.vars['dealer_deal_id'] = dealer_deal.id response.vars['MIN'] = MIN response.vars['MAX'] = MAX response.vars['volume_out'] = volume_out response.vars['not_gifted'] = deal.not_gifted # except Exception as e: # db.deal_errs.insert( deal_id = deal.id, dealer_id = dealer.id, err = '%s' % e) # поля для передачи по запросу АЯКСа ajax_vars.append('vol') ajax_vars = '%s' % ajax_vars h = CAT() for rr in db_client.get_xcurrs_for_deal(db, 0, curr_out, deal, dealer): #print row id = '%s' % rr['id'] disabled = rr['expired'] #bgc = 'gold' if disabled: memo = CAT( T('Курс не найден'), ', ', T('Когда курс будет получен платеж пройдёт автоматически'), '. ', T('Или попробуйте зайти позже')) _class = 'col sel_xcurrNRT' else: memo = CAT( SPAN(' ', T('по курсу'), (' %8g' % rr['price']), ' ', T('нужно оплатить примерно')), ' ', B(SPAN(_class='pay_vol')), ' ', rr['name']) _class = 'col sel_xcurrRTE' # пусть клики все равно будут onclick = ''' //$(this).css('z-index','0'); $('#tag%s').hide('fast'); $('#cvr%s').css('display','block'); // .css('z-index','10'); ajax('%s',%s,'tag%s'); ''' % (id, id, URL('get', args=[id, deal_id ]), ajax_vars, id) #print row h += DIV( DIV( DIV( #T('Есть'), ': ', rr['bal_out'],' ', IMG(_src=URL('static', 'images/currs/' + rr['abbrev'] + '.png'), _width=60, __height=36, _class='lst_icon', _id='lst_icon' + id), SPAN(rr['price'], _class='price hidden'), SPAN(rr['abbrev'], _class='abbrev hidden'), memo, '. ', SPAN(T('Всего было оплат:'), rr['used'], _class='small'), _onclick=onclick if onclick else '', #_style=style, _id='btn%s' % id, _class=_class, ), DIV(TAG.i(_class='fa fa-spin fa-spinner right wait1'), _id='cvr%s' % id, _class='col sel_xcurrCVR'), _class='row sel_xcurr'), _class='container') h += DIV(_id='tag%s' % id, _class='blue-c') xcurrs_h = h #response.top_line = None return dict( title=title, subtitle=subtitle, deal_name=deal.name, deal_info=deal.show_text, deal_icon=make_img(deal, dealer_info), MIN=MIN, MAX=MAX, #reclams=reclams, pars=acc_pars, xcurrs_h=xcurrs_h)
deal = db.deals[TO_PHONE7_ID] deal_name = deal.name else: deal_name = 'phone +7' # 'to phone +7 RUBs' # найдем дело deal = db(db.deals.name == deal_name).select().first() if not deal: raise HTTP(200, T('ERROR: Not found deal "%s"') % deal_name) # найдем счет у диллера электронных денег для этого дела vol = (deal.MIN_pay or 100) * 2 dealer, dealer_acc, dealer_deal = ed_common.select_ed_acc( db, deal, ecurr_out, vol) print dealer, '\n', dealer_acc, '\n', dealer_deal dealer_acc = ed_common.sel_acc_max_for_balance(db, dealer, ecurr_out, vol, unlim=False) if False and not dealer: raise HTTP( 200, #T('ERROR: Not found dealer for "%s". Please try in next month') % deal_name 'Просьба подождать до следующего дня или месяца - превышен лимит по данному виду операций' ) if False and not dealer_acc: raise HTTP( 200, #T('ERROR: Not found dealer acc "%s"') % deal_name 'Просьба подождать до следующего дня или месяца - превышен лимит по данному виду операций' )