Example #1
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
Example #2
0
def list():
    #print request.application
    #print request.function
    #common.page_stats(db, response['view'])
    #print request.vars
    ed_op_res = None
    ed_acc = request.vars.get('acc')
    if ed_acc:
        if len(ed_acc) > 13 and len(ed_acc) < 20:
            ed_op_id = request.vars.get('op_id')
            if ed_op_id:
                if len(ed_op_id) >10 and len(ed_op_id) < 40:
                    # заданы параметры помска платежа - делаем поиск
                    import time
                    time.sleep(3)

                    dealer_acc = db(db.dealers_accs.acc==ed_acc).select().first()
                    if dealer_acc:
                        dealer = db.dealers[ dealer_acc.dealer_id]
                        ed_op_res = LOAD('buy','income_YD', args=[ed_acc], vars={'operation_id': ed_op_id})
                    else:
                        ed_op_res = 'ed_acc not found'
                else:
                    ed_op_res = 'op_id error 2'
            else:
                ed_op_res = 'op_id error 1'
        else:
            ed_op_res = 'acc error'
    
        

    response.js = "$('.go-btn').removeClass('disabled');$('#go').children('i').removeClass('fa-refresh fa-spin').addClass('fa-search');"
    addr = request.args(0) or request.vars.addr
    if addr and len(addr) > 40: addr = None
    try:
        session.seeAddr = addr
    except:
        print 'list session error .seeAddr:', type(addr), addr

    import where3
    pays = []
    no_addr = where3.found_buys(db, pays, addr)
    if no_addr or len(pays)>0:
        response.view = 'where/list_buy.html'
        return dict(pays=pays, no_addr=no_addr, ed_op_res=ed_op_res)

    no_addr = addr == "????"
    if addr and not no_addr:
        # если адрес известен то вытащим все данные сразу
        deal_acc_addr = db(db.deal_acc_addrs.addr == addr).select().first()
        if not deal_acc_addr:
            return mess('Deals not found')
        xcurr_in = db.xcurrs[deal_acc_addr.xcurr_id ]
        curr_in = db.currs[ xcurr_in.curr_id ]
        deal_acc = db.deal_accs[ deal_acc_addr.deal_acc_id]
        curr_out = db.currs[ deal_acc.curr_id ]
        deal = db.deals[ deal_acc.deal_id ]
        payed_month = not deal.is_shop and deal_acc.payed_month or Decimal(0)
        MAX = deal.MAX_pay
        payed = deal_acc.payed or Decimal(0)
        price = deal_acc.price
        order_id = deal_acc.acc
        amo_rest_url = None
        client = db(db.clients.deal_id == deal.id).select().first()
        if client:
            curr_out = db.currs[deal_acc.curr_id]
            vvv = {'order':order_id, 'curr_out':curr_out.abbrev}

            if price and price >0 and price - payed > 0:
                # еще надо доплатить
                vvv['sum'] = price - payed
            amo_rest_url=A(T('Доплатить'), _href=URL('to_shop','index', args=[client.id],
                vars=vvv))

        import gifts_lib
        if 'to COIN' in deal.name:
            rnd = 8
        else:
            rnd = 2
        adds_mess = XML(gifts_lib.adds_mess(deal_acc, PARTNER_MIN, T, rnd))

        pays_unconf = []
        where3.found_unconfirmed(db, curr_in, xcurr_in, addr, pays_unconf)
        #print 'pays_unconf:', pays_unconf

        pays_process=[]
        where3.found_pay_ins_process(db, addr, pays_process)

        pays=[]
        where3.found_pay_ins(db, addr, pays)
        #print 'pays:', pays
        return dict( pays_unconf=pays_unconf, pays_process=pays_process, pays=pays,
            payed_month=payed_month, MAX=MAX, addr=addr,
            payed=payed, price=price, order_id=order_id, amo_rest_url=amo_rest_url,
            adds_mess = adds_mess,
            curr_in = curr_in, deal_acc = deal_acc,
            curr_out = curr_out, deal = deal, privat = False,
            )

    # сюда пришло значит ищес общий список
    pays_process=[]
    where3.found_pay_ins_process(db, addr, pays_process)
    pays=[]
    privat = where3.found_pay_ins(db, addr, pays)

    pays_unconf = []
    if not privat:
        # если мне то и все неподтв
        # все еще не подтвержденные
        for xcurr_in in db(db.xcurrs).select():
            curr_in = db.currs[xcurr_in.curr_id]
            if not curr_in or not curr_in.used: continue
            where3.found_unconfirmed(db, curr_in, xcurr_in, None, pays_unconf)

    return dict( adds_mess = None, pays_unconf=pays_unconf, pays_process=pays_process, addr = None, pays=pays, privat = privat)
Example #3
0
def deals_does():

    addr = request.args(0) or request.vars.addr
    if addr and len(addr) > 40: addr = None

    import where3
    pays = []

    deal_acc_addr = db(db.deal_acc_addrs.addr == addr).select().first()
    if not deal_acc_addr:
        return mess('Deals not found')
    xcurr_in = db.xcurrs[deal_acc_addr.xcurr_id]
    curr_in = db.currs[xcurr_in.curr_id]
    deal_acc = db.deal_accs[deal_acc_addr.deal_acc_id]
    curr_out = db.currs[deal_acc.curr_id]
    deal = db.deals[deal_acc.deal_id]
    payed_month = not deal.is_shop and deal_acc.payed_month or Decimal(0)
    MAX = deal.MAX_pay
    payed = deal_acc.payed or Decimal(0)
    price = deal_acc.price
    order_id = deal_acc.acc
    amo_rest_url = None
    client = db(db.clients.deal_id == deal.id).select().first()
    if client:
        curr_out = db.currs[deal_acc.curr_id]
        vvv = {'order': order_id, 'curr_out': curr_out.abbrev}

        if price and price > 0 and price - payed > 0:
            # еще надо доплатить
            vvv['sum'] = price - payed
        amo_rest_url = A(T('Доплатить'),
                         _href=URL('to_shop',
                                   'index',
                                   args=[client.id],
                                   vars=vvv))

    import gifts_lib
    if 'to COIN' in deal.name:
        rnd = 8
    else:
        rnd = 2
    adds_mess = XML(gifts_lib.adds_mess(deal_acc, PARTNER_MIN, T, rnd))

    pays_unconf = []
    where3.found_unconfirmed(db, curr_in, xcurr_in, addr, pays_unconf)
    #print 'pays_unconf:', pays_unconf

    pays_process = []
    where3.found_pay_ins_process(db, addr, pays_process)

    pays = []
    where3.found_pay_ins(db, addr, pays)
    #print 'pays:', pays
    return dict(
        pays_unconf=pays_unconf,
        pays_process=pays_process,
        pays=pays,
        payed_month=payed_month,
        MAX=MAX,
        addr=addr,
        payed=payed,
        price=price,
        order_id=order_id,
        amo_rest_url=amo_rest_url,
        adds_mess=adds_mess,
        curr_in=curr_in,
        deal_acc=deal_acc,
        curr_out=curr_out,
        deal=deal,
        privat=False,
    )

    # сюда пришло значит ищес общий список
    pays_process = []
    where3.found_pay_ins_process(db, addr, pays_process)
    pays = []
    privat = where3.found_pay_ins(db, addr, pays)

    pays_unconf = []
    if not privat:
        # если мне то и все неподтв
        # все еще не подтвержденные
        for xcurr_in in db(db.xcurrs).select():
            curr_in = db.currs[xcurr_in.curr_id]
            if not curr_in or not curr_in.used: continue
            where3.found_unconfirmed(db, curr_in, xcurr_in, None, pays_unconf)

    return dict(adds_mess=None,
                pays_unconf=pays_unconf,
                pays_process=pays_process,
                addr=None,
                pays=pays,
                privat=privat)
Example #4
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)
Example #5
0
def history():

    if len(request.args) == 1:
        acc = request.args(0)
        if not acc or len(acc) > 200:
            return mess('wrong account. Use ABBREV/ACCOUNT')

        curr, xcurr, _, = db_common.get_currs_by_addr(db, acc)
        if not xcurr:
            return mess('Use ABBREV/ACCOUNT')

        curr_out_abbrev = curr.abbrev
    elif len(request.args) == 2:
        curr_out_abbrev = request.args(0)
        if not curr_out_abbrev or len(curr_out_abbrev) > 10:
            return mess('wrong currency ABBREV. Use ABBREV/ACCOUNT')
        acc = request.args(1)
        if not acc or len(acc) > 200:
            return mess('wrong account. Use ABBREV/ACCOUNT')
    else:
        return mess('Use ABBREV/ACCOUNT')

    deal_acc = db((db.deal_accs.acc == acc)
                  & (db.deal_accs.curr_id == db.currs.id)
                  & (db.currs.abbrev == curr_out_abbrev)).select().first()
    if not deal_acc:
        return mess('Deal ACCOUNT not found. Use ABBREV/ACCOUNT')

    deal_acc = deal_acc.deal_accs
    deal = db.deals[deal_acc.deal_id]

    from pytz import utc, timezone
    from time import mktime

    import where3

    ############ UNCONFIRMED ############
    pays_unconf = []

    ## found income ADDRS
    ## not TOKENS system
    for r in db((db.currs.used)
                & (db.currs.id == db.xcurrs.curr_id)
                & (db.deal_acc_addrs.deal_acc_id == deal_acc.id)
                & (db.xcurrs.id == db.deal_acc_addrs.xcurr_id)).select():

        if r.xcurrs.as_token > 0:
            continue

        xcurr_in = r.xcurrs
        curr_in = r.currs
        addr = r.deal_acc_addrs.addr

        pays_unconf_curr = where3.found_unconfirmed_coins(
            db, curr_in, xcurr_in)
        for item in pays_unconf_curr:
            if item[8] == addr:
                pays_unconf.append(item)

    ## SSE all TOKEN SYSTEMS
    for token_system in db(db.systems).select():

        # add ALL incomes
        pays_unconf_curr = where3.found_unconfirmed_tokens(db, token_system)
        for item in pays_unconf_curr:
            pays_unconf.append(item)

    ####################### IN PROCCESS ##############
    in_proc = []
    for r in db((db.pay_ins_stack.ref_ == db.pay_ins.id)
                & (db.pay_ins.ref_ == db.deal_acc_addrs.id)
                & (db.deal_acc_addrs.deal_acc_id == deal_acc.id)
                & (db.deal_accs.id == deal_acc.id)
                & (db.xcurrs.id == db.deal_acc_addrs.xcurr_id)
                & (db.currs.id == db.xcurrs.curr_id)).select(
                    orderby=~db.pay_ins.created_on):

        result = histoty_result(db, r)

        in_proc.append(result)

    expired = datetime.datetime.now() - datetime.timedelta(40, 0)
    done = []
    for r in db((db.pay_ins.ref_ == db.deal_acc_addrs.id)
                & (db.deal_acc_addrs.deal_acc_id == deal_acc.id)
                & (db.deal_accs.id == deal_acc.id)
                & (db.xcurrs.id == db.deal_acc_addrs.xcurr_id)
                & (db.currs.id == db.xcurrs.curr_id)
                & (db.pay_ins.created_on > expired)).select(
                    orderby=~db.pay_ins.created_on):

        if db(db.pay_ins.id == db.pay_ins_stack.ref_).select().first():
            continue

        result = histoty_result(db, r)

        pay_in = r.pay_ins
        if pay_in.payout_id:
            pay_out = db.pay_outs[pay_in.payout_id]

            if pay_out:
                pay_put_result = dict(
                    amo_gift=float(pay_out.amo_gift),
                    amo_in=float(pay_out.amo_in),
                    amo_partner=float(pay_out.amo_partner),
                    amo_taken=float(pay_out.amo_taken),
                    amo_to_pay=float(pay_out.amo_to_pay),
                    amount=float(pay_out.amount),
                    created_on=pay_out.created_on,
                    created_ts=mktime(
                        utc.localize(pay_out.created_on).utctimetuple()),
                    id=pay_out.id,
                    info=pay_out.info,
                    status=pay_out.status,
                    tax_mess=pay_out.tax_mess,
                    txid=pay_out.txid,
                    vars=pay_out.vars)

                if pay_out.dealer_acc_id:
                    #deal_acc = db.deal_accs[pay_out.ref_]
                    #deal = db.deals[deal_acc.deal_id]
                    pay_put_result[
                        'dealer_acc'] = dealer_acc = db.dealers_accs[
                            pay_out.dealer_acc_id]
                    #curr_out = db.currs[dealer_acc.curr_id]
                    pay_put_result['dealer'] = db.dealers[dealer_acc.dealer_id]
                    #rec_vals['dealer_deal'] = db((db.dealer_deals.deal_id == deal.id)
                    #      & (db.dealer_deals.dealer_id == dealer.id)).select().first()

                result['pay_out'] = pay_put_result

        elif pay_in.clients_tran_id:
            # это выплатата клиенту
            cl_tr = db.clients_trans[pay_in.clients_tran_id]
            client = db.clients[cl_tr.client_id]
            result['client'] = dict(id=client.id,
                                    transaction=pay_in.clients_tran_id)

        done.append(result)

    deal_res = dict(id=deal.id, name=deal.name, MAX=float(deal.MAX_pay))

    import gifts_lib
    if 'to COIN' in deal.name:
        rnd = 8
    else:
        rnd = 2
    deal_acc_mess = XML(gifts_lib.adds_mess(deal_acc, PARTNER_MIN, T, rnd))

    deal_acc_res = dict(
        id=deal_acc.id,
        name=deal_acc.acc,
        to_pay=float(deal_acc.to_pay or Decimal(0)),
        payed_month=float(not deal.is_shop and deal_acc.payed_month
                          or Decimal(0)),
        payed=float(deal_acc.payed or Decimal(0)),
        price=float(deal_acc.price or Decimal(0)),
        gift_amount=float(deal_acc.gift_amount),
        gift_payed=float(deal_acc.gift_payed),
        gift_pick=float(deal_acc.gift_pick),
        curr_out_id=deal_acc.curr_id,
        message=deal_acc_mess)

    #print 'pays:', pays
    out_res = dict(deal=deal_res,
                   deal_acc=deal_acc_res,
                   unconfirmed=pays_unconf,
                   in_process=in_proc,
                   done=done)

    return request.extension == 'html' and dict(
        h=DIV(BEAUTIFY(out_res), _class='container')) or out_res