Пример #1
0
    def POST(self):
        userid = int(self.user.userid)

        # 商户付费状态
        groupid = self.get_groupid()
        mchnt = get_payinfo_ex(userid,
                service_code='card_actv', groupid=groupid)
        if not mchnt:
            add_free_ex(userid, service_code='card_actv', groupid=groupid)
        elif str(mchnt['expire_time']) <= time.strftime(DATETIME_FMT):
            if mchnt['status'] == MCHNT_STATUS_FREE:
                raise ParamError('免费体验已经到期了哦')
            if mchnt['status'] == MCHNT_STATUS_NORMAL:
                raise ParamError('付费已经到期了哦')

        # 能否创建集点活动
        self.allow_create(userid)

        actv = self.validator.data

        # 适用门店
        d = self.req.input()
        actv['mchnt_id_list'] = self.get_mchnt_id_list(
                d.get('mchnt_id_list', '').strip().split(','))
        actv['userid'] = userid
        actv['goods_name'] = remove_emoji(actv.get('goods_name'))
        if not 1 <= str_len(actv['goods_name']) <= 8:
            raise ParamError('商品名长度是1至8位')

        if actv['goods_amt'] <= 0:
            raise ParamError('商品价格应大于0')

        actv['start_time'] = actv.get('start_time') or time.strftime(DT_FMT)
        if not(is_valid_date(actv['start_time']) and
               is_valid_date(actv['expire_time'])):
            raise ParamError('活动时间格式不合法')
        if actv['start_time'] > actv['expire_time']:
            raise ParamError('开始时间应该小于结束时间')
        actv['start_time'] = str_to_tstamp(actv['start_time'], DT_FMT)
        actv['expire_time'] = str_to_tstamp(actv['expire_time'], DT_FMT) + 86399

        if actv['exchange_pt'] not in range(1, 11):
            raise ParamError('暂不只支持该兑换集点的活动')

        if actv['obtain_amt'] <= 0:
            raise ParamError('集点条件大于0')

        if actv['obtain_limit'] < 0:
            raise ParamError('一次交易获取的最多集点应该大于0')

        actv['id'] = getid()
        actv['ctime'] = actv['utime'] = int(time.time())
        actv['status'] = ACTV_STATUS_NORMAL

        with get_connection_exception('qf_mchnt') as db:
            db.insert('card_actv', actv)

        return self.write(success({'id': actv['id']}))
Пример #2
0
    def _trans_input(self):
        d = {k: v.strip() for k, v in self.req.input().iteritems()}
        r = {}
        r['id'] = d.get('id') or ''

        # actv info
        with get_connection_exception('qf_mchnt') as db:
            info = db.select_one('card_actv', where={'id': r['id']})
        if not info:
            raise ParamError('活动不存在')
        info['start_time'] = int(time.mktime(info['start_time'].timetuple()))
        expire_time = d.get('expire_time', info['expire_time'])
        if not is_valid_date(expire_time):
            raise ParamError('活动截止时间格式不对')
        r['expire_time'] = str_to_tstamp(expire_time, DATE_FMT) + 86399
        #if r['expire_time'] < info['start_time']:
        #raise ParamError('修改活动的截止日期不能小于起始日期')

        r['obtain_amt'] = int(d.get('obtain_amt', info['obtain_amt']) or 0)
        if r['obtain_amt'] <= 0:
            raise ParamError('集点条件大于0元')

        r['goods_name'] = remove_emoji(d.get('goods_name', info['goods_name']))
        if not 1 <= str_len(r['goods_name']) <= 8:
            raise ParamError('商品名长度是1至8位')

        r['goods_amt'] = int(d.get('goods_amt', info['goods_amt']) or 0)
        if r['goods_amt'] <= 0:
            raise ParamError('商品价格应大于0')

        r['content'] = (info['content']
                        or '') + (d.get('content') or '%smis修改' %
                                  (time.strftime(DATETIME_FMT)))

        return r
Пример #3
0
    def GET(self, userid=None):
        d = {k: v.strip() for k, v in self.req.input().iteritems()}
        expectdate = d.get('expectdate')
        if not is_valid_date(expectdate):
            raise ParamError('账期格式错误')

        # 数据总结
        settle_statis = get_settle_statis(userid, expectdate)
        totalmoney = totalfee = totalmonthfee = 0
        for i in settle_statis:
            totalmoney += i['tradeamt']
            totalfee += i['fee']

        # 获取扣款历史
        monthfees = []
        try:
            monthfees = thrift_call(FundService, 'findWithholdHistory',
                                    config.FUND_SERVERS, userid, expectdate)
        except:
            log.warn(traceback.format_exc())

        # 扣款历史
        fee_detail_list = []
        for monthfee in monthfees:
            # 费用是正的是补给用户的,加到总额里面去
            if monthfee.amount > 0:
                totalmoney += monthfee.amount
            else:
                totalmonthfee += monthfee.amount
            is_rent_fee = False
            if isinstance(monthfee.title, types.UnicodeType):
                monthfee.title = monthfee.title.encode('utf-8')
            # 修改title如果是月租费的话 etc 12月QPOS月服务费
            if monthfee.title == 'QPOS月服务费':
                monthfee.title = '%s月%s' % (monthfee.evidence_date[5:7],
                                            monthfee.title)
                is_rent_fee = True
            # 存在的话,就合并
            is_exist = False
            for fee in fee_detail_list:
                if monthfee.title == fee['name'] and is_rent_fee:
                    fee['value'] += monthfee.amount
                    is_exist = True
                    break
            if not is_exist:
                fee_detail_list.append({
                    'name': monthfee.title,
                    'value': monthfee.amount,
                    'month': monthfee.evidence_date
                })

        return self.write(
            success({
                'total_amt': totalmoney - totalfee + totalmonthfee,
                'total_trade_amt': totalmoney,
                'totalfee': totalfee,
                'feedetail': fee_detail_list
            }))
Пример #4
0
    def GET(self, userid=None):
        d = {k: v.strip() for k, v in self.req.input().iteritems()}
        # 账期
        expectdate = d.get('expectdate')
        if not is_valid_date(expectdate):
            raise ParamError('账期格式错误')

        # 分页信息
        page, pagesize = d.get('page', 0), d.get('pagesize', 10)
        if not all(map(is_valid_int, (pagesize, page))):
            raise ParamError('分页信息错误')

        # 到账详细信息
        details = defaultdict(list)
        try:
            trade_rs = thrift_call(FundService, 'findActtradeInfo',
                                   config.FUND_SERVERS, userid, expectdate,
                                   int(page), int(pagesize))
            for r in trade_rs:
                details[r.tradetime[:10]].append({
                    'tradetime':
                    r.tradetime,
                    'tradeamt':
                    r.tradeamt,
                    'fee':
                    r.fee,
                    'type':
                    r.tradetype,
                    'coupon_fee':
                    r.ori_coupon_amt - r.coupon_amt,
                    'ori_coupon_amt':
                    r.ori_coupon_amt
                })
        except:
            log.warn(traceback.format_exc())

        # 头部信息
        statis = get_settle_statis(userid, expectdate)
        statis.sort(key=lambda d: d['tradedt'], reverse=True)
        ret = []
        for i in statis:
            records = details.get(i['tradedt'])
            if records:
                ret.append({
                    'txdt': i['tradedt'],
                    'cnt': i['cnt'],
                    'fee': i['fee'],
                    'tradeamt': i['tradeamt'],
                    'details': records
                })
        return self.write(success(ret))
Пример #5
0
    def POST(self):
        d = self.req.inputjson()

        actv = self.check_allow_change(d.get('id'))

        update_value = {
            'utime': int(time.time()),
            'status': ACTV_STAUS_STOPED,
        }

        # 结束申明
        if d.get('statement'):
            statement = remove_emoji(d['statement'])
            if not 1 <= str_len(statement) <= 150:
                raise ParamError('停止活动声明应该是1至150位')
            update_value['statement'] = statement

        # 结束时间
        if d.get('expire_time'):
            expire_time = d.get('expire_time')
            if not is_valid_date(expire_time):
                raise ParamError('截止日期时间格式不对')
            if expire_time > str(actv['expire_time']):
                raise ParamError('只能缩短活动截止日期')

            # 活动结束时间小于当前时间
            if expire_time < time.strftime(DT_FMT):
                update_value['expire_time'] = int(time.time() - 600)
            else:
                update_value['expire_time'] = str_to_tstamp(
                        expire_time, DT_FMT) + 86399
        else:
            update_value['expire_time'] = int(time.time() - 600)

        with get_connection_exception('qf_mchnt') as db:
            db.update('card_actv', update_value, {'id': d['id']})

        return success({})
Пример #6
0
    def POST(self):
        d = self.req.inputjson()
        userid = self.user.userid

        # 付费过期不能修改活动
        mchnt = get_payinfo_ex(
            userid, service_code='card_actv',
            groupid=self.get_groupid())
        if str(mchnt.get('expire_time')) < time.strftime(DATETIME_FMT):
            raise ParamError('付费已经到期了哦')

        # 获取活动信息
        self.check_allow_change(d.get('id'))

        update_value = {}
        # 活动开始截止时间
        for field in ('start_time', 'expire_time'):
            if d.get(field):
                if not is_valid_date(d[field]):
                    raise ParamError('时间格式错误')
                if field == 'start_time':
                    update_value[field] = str_to_tstamp(d[field], DT_FMT)
                else:
                    update_value[field] = str_to_tstamp(d[field], DT_FMT)+86399

        for field in ('obtain_amt', 'obtain_limit', 'goods_amt'):
            if d.get(field) and not is_valid_int(d[field]):
                raise ParamError('数据格式错误')

        # 修改活动状态
        if is_valid_int(d.get('status')):
            if int(d['status']) in (ACTV_STATUS_NORMAL, ACTV_STAUS_STOPED):
                update_value['status'] = int(d['status'])

            # 结束申明
            if int(d['status']) == ACTV_STAUS_STOPED and d.get('statement'):
                if d.get('statement'):
                    statement = remove_emoji(d['statement'])
                    if not 1 <= str_len(statement) <= 150:
                        raise ParamError('停止活动声明应该是1至150位')
                    update_value['statement'] = statement

        # 集点条件
        if d.get('obtain_amt'):
            if d['obtain_amt'] < 0:
                raise ParamError('集点条件大于0元')
            update_value['obtain_amt'] = d['obtain_amt']

        # 集点限制
        if d.get('obtain_limit'):
            if d['obtain_limit'] < 0:
                raise ParamError('集点条件大于0元')
            update_value['obtain_limit'] = d['obtain_limit']

        # 奖品名称
        if d.get('goods_name'):
            d['goods_name'] = remove_emoji(d['goods_name'])
            if not 1 <= str_len(d['goods_name']) <= 8:
                raise ParamError('商品名长度是1至8位')
            update_value['goods_name'] = d['goods_name']

        # 奖品金额
        if d.get('goods_amt'):
            if d['goods_amt'] <= 0:
                raise ParamError('商品价格应大于0')
            update_value['goods_amt'] = d['goods_amt']

        # 参与商户
        if 'mchnt_id_list' in d:
            update_value['mchnt_id_list'] = self.get_mchnt_id_list(
                    d['mchnt_id_list'].strip().split(','), int(d['id']))

        if update_value:
            update_value['utime'] = int(time.time())
            with get_connection_exception('qf_mchnt') as db:
                db.update('card_actv', update_value, {'id': d['id']})

        return self.write(success({'id': d['id']}))
Пример #7
0
    def auto_apply(self, userid):
        data = self._data
        td, now = time.strftime(DATE_FMT), time.strftime(DATETIME_FMT)
        #新审核系统预设参数
        info = {}
        #凭证参数
        piclist = []

        # 字典转码
        def byteify(input):
            if isinstance(input, dict):
                return {
                    byteify(key): byteify(value)
                    for key, value in input.iteritems()
                }
            elif isinstance(input, list):
                return [byteify(element) for element in input]
            elif isinstance(input, unicode):
                return input.encode('utf-8')
            else:
                return input

        # 写入凭证
        with get_connection('qf_mis') as db:
            d = {k: v.strip() for k, v in self.req.input().iteritems()}
            cert_types = UserDefine.CERT_TYPE
            for code in UserDefine.CERT_TYPE_LIST:
                if (code not in d or not d[code] or code not in cert_types):
                    continue
                insert_data = {
                    'user_id': userid,
                    'upgrade_id': 0,
                    'apply_level': 0,
                    'cert_type': cert_types[code],
                    'name': code,
                    'submit_time': now,
                    'state': 1,
                    'input_state': 1,
                    'typist_user': 0,
                    'typist_time': now,
                    'imgname': d[code]
                }

                try:
                    piclist.append({
                        "name": str(code),
                        "src": str(d[code]),
                        "cert_type": str(cert_types[code])
                    })
                    db.insert('mis_upgrade_voucher', insert_data)
                except:
                    log.debug(traceback.format_exc())

        info["piclist"] = piclist

        # 写入审核
        version, platform = get_app_info(
            self.req.environ.get('HTTP_USER_AGENT', ''))
        src = ''.join([data['src'], platform, version])
        idstatdate = (data['idstatdate'] if is_valid_date(
            data.get('idstatdate')) else td)
        idenddate = (data['idenddate']
                     if is_valid_date(data.get('idenddate')) else td)

        # mcc
        if data['cate'] == 'saleman' and not data['shoptype_id']:
            mcc = UserDefine.DEFAULT_SALEMAN_MCC
        else:
            mcc = UserUtil.get_mcc(data['shoptype_id'])

        apply_values = {
            'user': int(userid),
            'usertype': data['usertype'],
            'legalperson': data['legalperson'] or data['bankuser'],
            'name': data['name'],
            'idnumber': data['idnumber'],
            'idstatdate': idstatdate,
            'idenddate': idenddate,
            'telephone': data['landline'],
            'idphoto1': data['idcardfront'],
            'idphoto2': data['idcardback'],
            'licenseend_date': td,
            'licensephoto': '',
            'taxenddate': td,
            'longitude': covert(data['longitude'], float),
            'latitude': covert(data['latitude'], float),
            'address':
            ''.join([data['city'], data['location'], data['address']]),
            'city': data['city'],
            'province': data['province'],
            'mobile': data['username'],
            'headbankname': data['headbankname'],
            'banktype': (2 if data['banktype'] == '2' else 1),
            'bankname': data['bankname'],
            'bankuser': data['bankuser'],
            'bankProvince': data['bankprovince'],
            'bankCity': data['bankcity'],
            'bankaccount': data['bankaccount'].replace(' ', ''),
            'state': 4,
            'brchbank_code': data['bankcode'],
            'mcc': mcc,
            'nickname': data['shopname'],
            'src': src,
            'groupid': data['groupid'],
            'srctype': UserDefine.SIGNUP_SRCTYPE_TINY,  # 先固定为小微商户
            'edu': 1,
            'monthincome': 0,
            'monthexpense': 0,
            'tid': '',
            'terminalcount': 1,
            'last_admin': 0,
            'allowarea': 0,
            'needauth': 2,
            'passcheck': 2,
            'last_modify': now,
            'post': '',
            'provision': '',
            'bankmobile': data['bankmobile'],
            'monthtradeamount': 1,
            'founddate': td,
            'area': 100,
            'payment_type': 1,
            'rent_count': 0,
            'pertradeamount': 1,
            'rent_total_amt': -1,
            'utime': now,
            'uploadtime': now,
            "licensenumber": data.get("licensenumber", "")
        }

        # 获取上传费率
        apply_values['ratio'] = self.get_ratio() or ''

        #收集后台需要的字段,摒弃废弃字段,后期只用下面的字段
        userid = int(userid)
        groupid = int(data['groupid'])

        info["usertype"] = data['usertype']
        info["mobile"] = data['username']
        info["name"] = data['name']
        info["cardstart"] = data['idstatdate']
        info["cardend"] = data['idenddate']
        info["legalperson"] = data['legalperson'] or data['bankuser']
        info["src"] = data['src']
        info["licensenumber"] = data['licensenumber']
        info["mcc"] = mcc
        info["risk_level"] = "54"
        info["telephone"] = data['landline']
        info["nickname"] = data['shopname']
        info["bankaccount"] = data['bankaccount'].replace(' ', '')
        info["shop_province"] = data['province']
        info["shop_city"] = data['city']
        info["shop_address"] = data['address']
        info["banktype"] = (2 if data['banktype'] == '2' else 1)
        info["bankname"] = data['bankname']
        info["bankuser"] = data['bankuser']
        info["headbankname"] = data['headbankname']
        info["bankcode"] = data['bankcode']

        fee = self.get_ratio() or ''
        if fee != '':
            fee = json.loads(fee)
            for (k, v) in fee.items():
                info[k] = v

        info = byteify(info)
        info = json.dumps(info, ensure_ascii=False)

        #指定的灰度渠道下商户进入新审核逻辑
        if groupid in config.NEW_AUDIT_GROUP:
            client = ThriftClient(config.AUDIT_SERVERS,
                                  AuditServer,
                                  framed=False)
            client.raise_except = True
            re = client.call(
                'add_audit',
                audit_api(audit_type='signup',
                          userid=userid,
                          groupid=groupid,
                          info=info))

        #其他渠道的商户继续老的审核系统
        else:
            with get_connection('qf_mis') as db:
                db.insert('apply', apply_values)

        self.set_cache_audit(userid, 2)