Beispiel #1
0
def get_edealers_for_to_wallet(db, deal, curr_out, ecurr_out_id, ed_name=None):
    inp_dealers = []
    limit_bal = None
    for edealer in db((db.dealers.used == True)
                      & (not ed_name or db.dealers.name == ed_name)).select():
        #print edealer.name
        limit_bal = 0
        MAX = MIN = db_common.gMIN(deal, edealer)
        MAX = deal.MAX_pay or 1777
        limit_bal, accs = get_lim_bal(db, edealer)
        if MAX * 3 > limit_bal:
            MAX = limit_bal / 4
        inp_dealers.append(
            [edealer.id, (edealer.name, curr_out.abbrev, limit_bal, MIN, MAX)])
    return limit_bal, inp_dealers
Beispiel #2
0
def get():

    args = request.args
    #print args, '\n', request.vars
    if len(args) != 1: return mess('err...')
    curr_id = args(0)
    if 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)
        dealer_id = int(request.vars['dealer'])
        dealer = db.dealers[dealer_id]
    except:
        return mess('digs...')

    acc = request.vars.acc
    #print request.vars
    if not acc:
        return mess(T('ОШИБКА: Задайте кошелек'))

    try:
        if len(acc) < 6 or len(acc) > 40 or not IS_EMAIL(
                acc) and not valid_phone(acc) and not acc.isdidit():
            ##проверка на счет - если это не емайл и не ттелефон то надо длинну и на циифры
            return mess(T('ОШИБКА: неверный кошелек'))
    except:
        return mess(T('ОШИБКА: неверный кошелек 2'))

    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...'))

    try:
        session.toDlrAcc = acc
    except:
        print 'to_wallet session error .toDlrAcc:', type(acc), acc

    dealer_acc = ed_common.sel_acc_max(db, dealer, ecurr_out, vol)
    if not dealer_acc:
        return mess(
            '''Извините, возможно достигнуто ограничение переводов на сотовые телефоны и электронные кошельки,
        просьба воспользоваться прямой оплатой нужных Вам услуг, например из меню "Всё". 
        Или можно уменьшить сумму платежа или подождать до следующего дня или месяца для снятия лимитов.
        ''', 'warning')

    dealer_deal = db((db.dealer_deals.dealer_id == dealer.id)
                     & (db.dealer_deals.deal_id == deal.id)).select().first()
    if not dealer_deal:
        return mess(
            T('Не найден дилер для дела [%s]... Зайдите позже') % deal.name,
            'warning')

    MIN = db_common.gMIN(deal, dealer)
    if vol < MIN:
        try:
            session.vol = MIN
        except:
            print 'to_wallet session error .vol:', type(MIN), MIN
        return mess(
            T('ОШИБКА: Слишком маленькая сумма платежа %s < %s') % (vol, MIN))
    else:
        try:
            session.vol = vol
        except:
            print 'to_wallet session error .vol:', type(vol), vol

    # теперь проверку на правильность кошелька для дилера электронных платежей
    #res = ed_common.pay_test(db, deal, dealer, dealer_acc, dealer_deal, acc, deal.MIN_pay or dealer.pay_out_MIN or 20, False)
    #res = {'error': ' TEST'}
    if False and res.get('status') != 'success':
        m = 'error_description' in res and res.ger(
            'error_description', res.get('error', 'dealer error'))
        m = T('Платежная система %s отвергла платеж, потому что: %s') % (
            dealer.name, m)
        return mess(m, 'warning')

    curr_out_abbrev = curr_out.abbrev
    x_acc_label = db_client.make_x_acc(deal, acc, curr_out_abbrev)
    # найдем ранее созданный адресс для этого телефона, этой крипты и этого фиата
    # сначала найтем аккаунт у дела
    deal_acc_id = db_client.get_deal_acc_id(db, deal, acc, 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')

    #request.vars['deal_acc_addr']=deal_acc_addr
    addr = deal_acc_addr.addr

    curr_in_abbrev = curr_in.abbrev

    h = CAT()
    e_bal, MAX = get_e_bal(deal, dealer, dealer_acc)
    if vol > MAX:
        vol = MAX
        h += mess(
            T('Сумма платежа снижена до возможного наибольшего значения, желательно не превышать его'
              ), 'warning')

    okIN = session.okWt
    h += sect(
        DIV(okIN and DIV(H3(A('Правила оплаты',
                              _onclick='$(".okIN").show("fast");',
                              _class='button warn right'),
                            _class='pull-right-'),
                         _class='col-sm-12') or '',
            DIV(okIN and ' ' or H3('ПРАВИЛА ОПЛАТЫ', _class='center'),
                P(T('При оплате необходимо соблюдать следующие правила:')),
                UL(
                    T('У оплат дела [%s] существуют ограничения по суммам, поэтому если Вы хотите оплатить бОльшую сумму, то Вам нужно делать платежи небольшими суммами в эквиваленте до %s рублей на тот же адрес кошелька криптовалюты, который Вы получили от нашей службы для этой услуги'
                      ) % (deal.name, MAX * 1.0),
                    T('Желательно задать обратный адрес для возврата монет на случай если наша служба по каким-либо причинам не сможет совершить оплату по делу [%s]'
                      ) % deal.name,
                    T('Если Вы не задали обратный адрес для возврата монет, то необходимо платить биткоины и другую криптовалюту только со своего кошелька, задав адреса входов, которыми Вы действительно обладаете, а не с кошельков бирж, пулов или разных онлайн-кошельков. Так как монеты, в случае если платеж будет отвергнут нашим партнёром, могут автоматически вернуться только на адрес отправителя.'
                      ),
                    T('Если Вы оплатите другую сумму, то курс обмена может немножко измениться'
                      ),
                    T('Если Вы платите регулярно, то можете платить на тот же адрес кошелька криптовалюты, что получили ранее. Хотя желательно заходить на нашу службу для получения новостей хотябы раз в пол года или подписаться на важные новости и сообщения оставив свой емайл.'
                      ),
                ),
                H4(A('Понятно',
                     _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]
    import gifts_lib
    adds_mess = XML(gifts_lib.adds_mess(deal_acc, PARTNER_MIN, T))
    if adds_mess:
        h += sect(XML(adds_mess), 'gift-bgc pb-10 pb-10')

    volume_out = vol
    hh = CAT(H2(T('3. Оплатите по данным реквизитам')))

    # используем быстрый поиск курса по формуле со степенью на количество входа
    # только надо найти кол-во входа от выхода
    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
        # сначала открутим обратную таксу
        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

        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('Создан заказ №'),
            ' ',
            order_id,
            ' ',
            T('на заморозку обменного курса по'),
            ' ',
            rate_out,
            #T('обратный курс'), ' ', round(1.0/rate_out,8),
            H5(
                T('*Данный курс будет заморожен для Вас на 20 минут для объёма криптовалюты не больше указанного. Проверить можно по номеру заказа в списке платежей.'
                  )),
            _class='row')
    else:
        volume_in = rate_out = None
        tax_rep = '-'
        hh += mess(
            '[' + curr_in.name + '] -> [' + curr_out.name + ']' +
            T(' - лучшая цена не доступна.') +
            T('Но Вы можете оплатить вперед'), 'warning pb-10')

    _, url_uri = common.uri_make(
        curr_in.name2, addr, {
            'amount': volume_in,
            'label': db_client.make_x_acc_label(deal, acc, curr_out_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 = ''

    free_bal, MAX = get_e_bal(deal, dealer, dealer_acc)
    hh += DIV(
        P(
            T('Оплата %s') % dealer.name,
            ': ',
            acc,
            ' ',
            T('на сумму'),
            ' ',
            volume_out,
            ' ',
            curr_out_abbrev,
            ' ',
            T('из доступных в службе'),
            ' ',
            free_bal,
            '. ',
            T('Наибольший возможный платеж'),
            ' ',
            MAX,
        ),
        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'),
        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'),
        T('или'),
        BR(),
        T('Оплатите вручную'),
        ': ',
        FORM(  ## ВНИМАНИЕ !!! тут имена полей надр друние указывать или
            # FORM в основной делать тоже иначе они складываются
            INPUT(_name='v', value=volume_in, _class="pay_val", _readonly=''),
            curr_in.abbrev,
            BR(),
            T("Для этого скопируйте сумму и адрес (двойной клик по полю для выделения) и вставьте их в платеж на вашем кошельке"
              ),
            ': ',
            INPUT(_name='addr', _value=addr, _class='wallet', _readonly=''),
            BR(),
            #T('Резервы службы'), ' ', B(free_bal), ' ', T('рублей'), BR(),
            #LOAD('where', 'for_addr', vars={'addr': addr}, 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('не нужно копить много денег - платежи возможны от %s [%s]')
                % (MIN, curr_out_abbrev),
                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
Beispiel #3
0
def index():

    #common.page_stats(db, response['view'])
    #print request.args

    response.title = T(
        "Обмен биткоинов криптовалют на электронные деньги Яндекс")
    response.subtitle = T('Dogecoin Litecoin NEXT')

    if False and session.date_log:
        d_diff = datetime.datetime.today() - session.date_log
        if d_diff.seconds > 1200:
            session.date_log = None
            session.YD_acc = '-'

    acc = session.toDlrAcc
    title = acc and T(
        'Ваш кошелек') + ':' + acc[:3] + '***' + acc[-3:] or response.title
    subtitle = session.date_log and (T('Дата посещения %s') %
                                     session.date_log) or response.subtitle

    try:
        session.date_log = request.now
    except:
        print 'to_wallet session error .date_log:', type(
            request.now), request.now

    # берем только тех кто за рубли и для этого дела
    # причем по 1 аккаунту на диллера тут нужно - для писка
    # какой диллер вообще на кошельки принимает
    ed_name = None
    if request.vars:
        vn = 'ed'
        if vn in request.vars:
            ed_name = request.vars[vn]

    limit_bal, inp_dealers_tab = ed_common.get_edealers_for_to_wallet(
        db, deal, curr_out, ecurr_out_id, ed_name)

    if len(inp_dealers_tab) == 0:
        return err_dict(
            T('ОШИБКА: Нет доступных диллеров') +
            (ed_name and
             (' ' +
              T('или неправильно задано имя [%s] системы электронных денег!') %
              ed_name) or ''))

    inp_dealers = []
    for r in inp_dealers_tab:
        inp_dealers.append(
            [r[0], ('%s [%s], ' + T('доступно') + ' %s, %s...%s') % r[1]])

    from gluon.storage import Storage
    vars = Storage()
    if request.vars:
        vn = 'sum'
        if vn in request.vars:
            vars[vn] = test_vol(request.vars[vn])
        vn = 'acc'
        if vn in request.vars:
            acc = request.vars[vn]
            vars[vn] = acc
            if not ed_name:
                return err_dict(
                    T("ОШИБКА: Не задано имя системы электронных денег для данного кошелька %s! Пример ссылки: %s?ed=yandex&sum=1500&acc=423456780345"
                      ) % (acc, URL()), True)
        vn = 'mess'
        if 'mess' in request.vars:
            vars[vn] = request.vars[vn]

    h = CAT()
    dealer = None
    for rr in db_client.get_xcurrs_for_deal(db, 0, curr_out, deal, dealer):
        #print rr
        id = '%s' % rr['id']
        disabled = rr['expired']
        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',['vol','acc','dealer'], 'tag%s');
                      ''' % (id, id, URL('get', args=[id]), id)
        #print rr
        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 '',
                    _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

    _, reclams = recl.get(db, 2)

    #response.top_line = None

    return dict(
        title=title,
        subtitle=subtitle,
        acc=acc,
        inp_dealers=inp_dealers,
        limit_bal=limit_bal,
        # это для ограничения в поле ввода и пересчета в нем
        MIN=db_common.gMIN(deal, None),
        MAX=int(deal.MAX_pay or 2555),
        vars=vars,
        xcurrs_h=xcurrs_h,
        reclams=reclams)
Beispiel #4
0
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)
Beispiel #5
0
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)
Beispiel #6
0
def index():

    #raise HTTP(200, T('на переработке'))
    #common.page_stats(db, response['view'])

    response.title = T("Купить биткоины криптовалюту за электронные деньги")
    response.subtitle = T("Быстро, надежно и удобно")

    if False and session.date_log:
        d_diff = datetime.datetime.today() - session.date_log
        if d_diff.seconds > 1200:
            session.date_log = None
            session.addr_buy = None

    addr = session.buyAddr
    title = addr and T('Ваш кошелек') + ':' + addr[:3] + '****' + addr[
        -3:] or response.title or ''
    subtitle = addr and T(
        'Дата посещения %s') % session.date_log or response.subtitle or ''

    try:
        session.date_log = request.now
    except:
        print 'to_buy session error .date_log:', type(request.now), request.now

    # берем только тех кто за рубли и для этого дела
    # причем по 1 аккаунту на диллера тут нужно - для писка
    # какой диллер вообще на кошельки принимает
    ecurr_in_id = ecurr.id
    #print ecurr_in_id
    inp_dealers = []
    for r in db((db.dealers.id == db.dealers_accs.dealer_id)
                & (db.dealers_accs.ecurr_id == ecurr_in_id)
                & (db.dealers_accs.used == True)
                & (db.dealers.used == True)).select(db.dealers.ALL,
                                                    groupby=db.dealers.id):
        MIN = db_common.gMIN(deal, r.dealers)
        ##MAX = db_common.gMAX(deal, r.dealers)
        inp_dealers.append([
            r.dealers.id,
            '%s [%s] %s...%s' % (r.dealers.name, curr_in.abbrev, MIN, MAX)
        ])

    #print dd
    if len(inp_dealers) == 0:
        # ошибка какаято что нет диллера
        return err_dict(
            T('Не найден диллер для выплаты, просьба сообщить об ошибке в службу поддержки!'
              ))

    xcurrs = db_client.get_xcurrs_for_buy(db, curr_in, deal)
    h = CAT()
    for rr in xcurrs:
        #print rr
        id = '%s' % rr['id']
        disabled = rr['expired']
        if disabled:
            memo = CAT(
                T('Курс не найден'), ', ',
                T('Когда курс будет получен платеж пройдёт автоматически'),
                '. ', T('Или попробуйте зайти позже'))
            _class = 'col sel_xcurrNRT'
        else:
            memo = CAT(
                ' ',
                T('по курсу'),
                B(' %8g' % rr['price']),
                ', ',  #' =', rr['price'] * rr['bal_out'],
                T('это около'),
                ' ',
                int(rr['price'] * float(rr['bal_out'])),
                #curr_in.abbrev,
                TAG.i(_class='fa fa-rub blue-c'),
                ', ',
                ' а Вы хотите купить около ',
                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',['vol', 'wallet','dealer'], 'tag%s');
                      ''' % (id, id, URL('get', args=[id]), id)
        #print r
        h += DIV(
            DIV(
                DIV(
                    IMG(_src=URL('static',
                                 'images/currs/' + rr['abbrev'] + '.png'),
                        _width=60,
                        __height=36,
                        _class='lst_icon',
                        _id='lst_icon' + id),
                    ' ',
                    T('есть'),
                    ' ',
                    B(rr['bal_out']),
                    ' ',
                    SPAN(rr['price'], _class='price hidden'),
                    SPAN(rr['abbrev'], _class='abbrev hidden'),
                    memo,
                    #' ', SPAN(T('Всего покупок:'), rr['used']),
                    #if rr['expired'] else ''
                    _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

    _, reclams = recl.get(db, 2)
    #response.top_line = None

    return dict(title=title,
                subtitle=subtitle,
                inp_dealers=inp_dealers,
                MIN=MIN,
                MAX=MAX,
                xcurrs_h=xcurrs_h,
                reclams=reclams)
Beispiel #7
0
def get():

    args = request.args
    if len(args) != 1: return mess('err...')
    curr_id = args(0)
    ##scr = "$('#cvr%s').css('z-index',-1);$('#tag%s').show('slow');" % (curr_id, curr_id)
    scr = "$('#cvr%s').css('display','none');$('#tag%s').show('slow');" % (
        curr_id, curr_id)
    response.js = scr
    if not curr_id.isdigit(): return mess('dig...')
    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 = request.vars['wallet']
    if not addr or len(addr) < 30 or len(addr) > 35:
        return mess(
            T('ОШИБКА') + ': ' + T('Введите адрес кошелька криптовалют'))

    curr_out = db.currs[curr_id]
    if not curr_out: return mess(T('curr...'))
    xcurr_out = db(db.xcurrs.curr_id == curr_id).select().first()
    if not xcurr_out: return mess(T('xcurr...'))
    curr_out_name = curr_out.name

    amo_in = vol
    _amo_out, rate_order, best_rate = rates_lib.get_rate(
        db, curr_in, curr_out, amo_in)

    try:
        dealer_id = request.vars['dealer']
        dealer = db.dealers[dealer_id]
    except:
        return mess('digs...')

    MIN = db_common.gMIN(deal, dealer)
    if vol < MIN:
        try:
            vol = MIN
            session.vol = vol
        except:
            print 'to_buy session error .vol:', type(addr), addr

        return mess(
            T('ОШИБКА: Слишком маленькая сумма платежа %s < %s') % (vol, MIN))

    dealer_acc = ed_common.sel_acc_min(db, dealer, ecurr, amo_in)
    if not dealer_acc:
        return mess(
            (T('Электронные деньги [%s] не доступны сейчас.' % dealer.name) +
             ' ' + T('Попробуйте позже')), 'warning')

    if not best_rate:
        response.title = T("ОШИБКА")
        return mess(T('Курс не найден'), 'warning')

    try:
        session.buyAddr = addr
        session.buyVol = vol
    except:
        print 'list session error .buyAddr:', type(addr), vol
        print 'list session error .buyVol:', type(vol), vol

    #print best_rate
    if request.application[:-3] != '_dvlp':
        # чето конфликт если из ipay3_dvlp вызывать то кошелек на ipay3 не коннектится
        cc = crypto_client.conn(curr_out, xcurr_out)
        if cc:
            if crypto_client.is_not_valid_addr(cc, addr):
                #return mess(T('address not valid for ') + curr_out_name)
                return mess(
                    T('ОШИБКА') + ': ' +
                    T('Адрес кошелька не подходит для выбранной криптовалюты %s'
                      ) % curr_out_name)
        else:
            # ЕСЛИ НЕТ СВЯЗИ - пусть пллатит - потом связь появится
            #return mess(T('Connection to [%s] is lost, try later ') % curr_out_name)
            ##return mess(T('Связь с кошельком ') + curr_out_name + T(' прервана.') + ' ' + T('Пожалуйста попробуйте позже'), 'warning')
            pass

    volume_in = vol
    is_order = True
    dealer_deal = db(
        (db.dealer_deals.deal_id == deal.id)
        & (db.dealer_deals.dealer_id == dealer_id)).select().first()
    ## теперь таксы для человека получим и должна та же цифра выйти
    vol_out, tax_rep = db_client.calc_fees(db,
                                           deal,
                                           dealer_deal,
                                           curr_in,
                                           curr_out,
                                           volume_in,
                                           best_rate,
                                           is_order,
                                           note=1)
    volume_out = common.rnd_8(vol_out)
    volume_in = common.rnd_8(volume_in)
    rate_end = volume_in / volume_out
    ##print 'buy:', volume_in, vol_out, rate_end

    h = CAT()

    okIN = session.okBu
    h += sect(
        DIV(okIN and DIV(H3(A('Правила оплаты',
                              _onclick='$(".okIN").show("fast");',
                              _class='button warn right'),
                            _class='pull-right-'),
                         _class='col-sm-12') or '',
            DIV(okIN and ' ' or H3('ПРАВИЛА ОПЛАТЫ', _class='center'),
                P(T('При оплате необходимо соблюдать следующие правила:')),
                UL(
                    T('Если Вы хотите оплатить большую сумму, то нужно делать платежи небольшими суммами по 2000-3000 рублей и получать разные счета - просто еще раз нажмите на кнопку выбора необходимой валюты'
                      ),
                    T('Если Вы оплатите другую сумму, то курс обмена может немножко измениться'
                      ),
                    T('Если Вы платите регулярно, то просьба каждый раз получать счет нажатием на кнопку выбора валюты - возможно счет будет выбран другой, а ранее полученный счет может быть перегружен и заморожен на сутки и более'
                      ),
                ),
                H4(A('Понятно',
                     _onclick='$(".okIN").hide("fast");ajax("%s")' %
                     URL('aj', 'ok_to', args=['Bu']),
                     _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')

    # создадим номер заказа чтобы не показывать что мы на крипту принимаем платеж
    order = db((db.addr_orders.xcurr_id == xcurr_out.id)
               & (db.addr_orders.addr == addr)).select().first()
    if not order:
        order_id = db.addr_orders.insert(xcurr_id=xcurr_out.id, addr=addr)
    else:
        order_id = order.id

    amo_in = round(amo_in * 1.005, 2)  # добавим таксу яндекса 0.5%
    destination = '7pb%s' % order_id  # + ' ' + T('или') +' ' + curr_out.abbrev + ' ' + addr
    free_bal = db_client.curr_free_bal(curr_out)
    h += sect(
        DIV(DIV(
            H2(T('3. Оплатите по данным реквизитам покупку %s') %
               curr_out_name,
               _class='center'),
            P(
                T('курс обмена: %s (обратный курс: %s)') %
                (round(rate_end, 8), round(1 / rate_end, 8)),
                BR(),
                T('Вы получите'),
                ' ',
                B(round(volume_out, 8)),
                IMG(_src=URL('static',
                             'images/currs/' + curr_out.abbrev + '.png'),
                    _width=36),
                ' ',
                T('из доступных'),
                ' ',
                free_bal,
            ),
            P(
                volume_out > free_bal and CAT(
                    H3(T('Сейчас средств на балансе меньше чем Вам надо'),
                       _style='color:crimson;'),
                    SPAN(
                        T('Поэтому Ваш заказ будет исполнен позже'),
                        BR(),
                        T('когда на балансе службы появится достаточно средств'
                          ),
                        _style='color:black;'),
                    BR(),
                ) or '', ),
            DIV(CENTER(
                A(SPAN(
                    T('Оплатить'), ' ', amo_in, ' ',
                    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=
                  'https://money.yandex.ru/direct-payment.xml?scid=767&receiver=%s&sum=%s&destination=%s&FormComment=buy %s on '
                  + DOMEN %
                  (dealer_acc.acc, amo_in, destination, curr_out.abbrev)), ),
                _class='row'),
            BR(),
            P(
                T('Или сделайте платеж вручную на %s кошелек %s') %
                (dealer.name, dealer_acc.acc),
                BR(),
                T('указав в назначении платежа код оплаты'),
                ':',
                BR(),
                B(destination),
            ),
            tax_rep,
            FORM(INPUT(_name='addr', _value=addr, _type='hidden'),
                 INPUT(
                     _type='submit',
                     _class='button blue-bgc',
                     _value=T('Подробный просмотр платежей'),
                     _size=6,
                 ),
                 _action=URL('where', 'index'),
                 _method='post'),
            _class='center',
            _style='color:blue;'),
            _class='row'), 'bg-info pb-10')

    h += sect(
        CAT(
            DIV(H3(T('Так же Вы можете пополнить этот %s кошелек') %
                   dealer.name,
                   ':',
                   _class='center'),
                _class='row'),
            DIV(DIV(
                IMG(_src=URL('static', 'images/m-cards.png'),
                    _style='float:left;margin:10px;'),
                T('С любой банковской карточки, указав в сообщении получателю код оплаты (как показано выше)'
                  ),
                _class='col-lg-8 col-lg-offset-2 col-sm-12',
                _style='black;padding: 5px;'),
                _class='row'),
            DIV(DIV(
                IMG(_src=URL('static', 'images/m-banks.png'),
                    _style='float:left;margin:10px;'),
                T('Из любого банка, например Альфа-Банк (пока Сбербанк не даёт такие данные)'
                  ),
                '. ',
                T('После чего'),
                ' ',
                A(B(T('ПОДТВЕРДИТЬ')), _href=URL('to_buy', 'bank')),
                ' ',
                T('покупку биткоинов по банковским реквизитам платежа (сумме и референсу платёжки)'
                  ),
                _class='col-lg-8 col-lg-offset-2 col-sm-12',
                _style='black;padding: 5px;'),
                _class='row'),
        ),
        #_style='background-color:#FFF47D;color:black;'
        'gold-bgc pb-10')
    h += SCRIPT('''
        $('html, body').animate( { scrollTop: $('#cvr%s').offset().top - $('#aside1').height() }, 500 );
      ''' % (curr_id))

    return h
Beispiel #8
0
    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
        'Просьба подождать до следующего дня или месяца - превышен лимит по данному виду операций'
    )

#from decimal import *
#getcontext().prec = 6

MIN = db_common.gMIN(deal, dealer)
e_balance = dealer_acc and db_common.get_balance_dealer_acc(dealer_acc)
MAX = int(deal.MAX_pay)
if e_balance:
    dealer_acc.balance = e_balance
    dealer_acc.update_record()
    e_balance = e_balance * 1
    if e_balance < MAX * 2:
        MAX = int(e_balance / 3)
free_bal = e_balance


def test_vol(vol, _min=MIN, _max=MAX):
    try:
        vol = float(vol)
    except:
Beispiel #9
0
        'Просьба подождать до следующего дня или месяца - превышен лимит по данному виду операций'
    )

dealer_acc = dealer and ed_common.sel_acc_max_for_balance(
    db, dealer, ecurr_out, vol, unlim=False)
if False and not dealer_acc:
    raise HTTP(
        200,
        #T('ERROR: Not found dealer acc "%s"') % deal_name
        'Просьба подождать до следующего дня или месяца - превышен лимит по данному виду операций'
    )

#from decimal import *
#getcontext().prec = 6

MIN = dealer and db_common.gMIN(deal, dealer) or 0
e_balance = dealer_acc and db_common.get_balance_dealer_acc(dealer_acc)
MAX = int(deal.MAX_pay)
if e_balance:
    dealer_acc.balance = e_balance
    dealer_acc.update_record()
    e_balance = e_balance * 1
    if e_balance < MAX * 2:
        MAX = int(e_balance / 3)
free_bal = e_balance


def test_vol(vol, _min=MIN, _max=MAX):
    try:
        vol = float(vol)
    except: