Beispiel #1
0
    def post(self, request):
        user = request.user
        flag = request.DATA.get('flag')
        phone = request.DATA.get('phone')
        if not phone or not flag or (flag and int(flag) not in (1, 2)):
            return Response({'ret_code': 20001, 'message': u'数据输入不合法'})

        try:
            user_book = UserPhoneBook.objects.filter(user=user,
                                                     phone=phone).first()
            if not user_book:
                return Response({'ret_code': 20002, 'message': u'被提醒用户不存在'})

            profile = user.wanglibaouserprofile
            send_name = profile.name if profile.id_is_valid else safe_phone_str(
                profile.phone)
            # 投资提醒
            if int(flag) == 1:
                if not (user_book.alert_at and user_book.alert_at >
                        local_to_utc(datetime.now(), 'min')):
                    # self._send_sms(phone, sms_messages.sms_alert_invest(name=send_name))
                    # 邀请投资提醒短信
                    # 模板中的参数变量必须以 name=value 的形式传入
                    PHPSendSMS().send_sms_one(5,
                                              phone,
                                              'phone',
                                              name=send_name)
                    user_book.alert_at = timezone.now()
                    user_book.is_used = True
                    user_book.save()
            # 邀请提醒
            elif int(flag) == 2:
                if User.objects.filter(
                        wanglibaouserprofile__phone=phone).exists():
                    user_book.is_register = True
                    if IntroducedBy.objects.filter(
                            introduced_by=user,
                            user_wanglibaouserprofile__phone=phone).exists():
                        user_book.is_invite = True
                        user_book.is_used = True
                    user_book.save()

                if not user_book.is_register and not (
                        user_book.invite_at and user_book.invite_at >
                        local_to_utc(datetime.now(), 'min')):
                    # 邀请注册提醒短信
                    # 模板中的参数变量必须以 name=value 的形式传入
                    aws = base64.b64encode(profile.phone)[0:-1]
                    PHPSendSMS().send_sms_one(6,
                                              phone,
                                              'phone',
                                              name=send_name,
                                              aws=aws)
                    user_book.invite_at = timezone.now()
                    user_book.save()

            return Response({'ret_code': 0, 'message': 'ok'})
        except Exception, e:
            logger.error(e.message)
            return Response({'ret_code': 20003, 'message': u'内部程序错误'})
Beispiel #2
0
def getYesterdayTop10Ranks():
    yesterday = datetime.datetime.now() - datetime.timedelta(1)
    yesterday_start = local_to_utc(yesterday, 'min')
    yesterday_end = local_to_utc(yesterday, 'max')
    top_ranks = P2PRecord.objects.filter(
        catalog='申购',
        create_time__gte=yesterday_start,
        create_time__lte=yesterday_end).values('user').annotate(
            Sum('amount')).order_by('-amount__sum')[:10]
    return top_ranks
Beispiel #3
0
def margin_records(request):
    pagesize = request.DATA.get("pagesize", "10").strip()
    page = request.DATA.get("page", "1").strip()

    if not pagesize.isdigit() or not page.isdigit():
        return {"ret_code": 80001, "message": u"请输入正确的参数"}

    pagesize = int(pagesize)
    page = int(page)

    if pagesize > 100:
        return {"ret_code": 80002, "message": u"参数超出限制"}

    user = request.user

    # 展示的起始时间为2016年2月8日,此前有账单变动的用户由此时间开始展示,历史数据不展示
    date_start = local_to_utc(datetime.datetime(2016, 2, 8), 'min')
    records = MarginRecord.objects.filter(user=user, create_time__gt=date_start).order_by('-id')[(page-1)*pagesize:page*pagesize]

    res = []
    for record in records:
        obj = {
            "id": record.id,
            "catalog": MARGIN_CATALOG_MAPPING.get(record.catalog, record.catalog),
            "catalog_sign": MARGIN_CATALOG_SIGN_MAPPING.get(record.catalog, ''),
            "create_time": util.fmt_dt_normal(util.local_datetime(record.create_time)),
            "amount": float(record.amount),
            "margin_current": float(record.margin_current),
            "description": record.description,
            "order_id": record.order_id
        }
        res.append(obj)
    return {"ret_code": 0, "data": res, "page": page}
Beispiel #4
0
def get_start_end_time(auto, auto_days, created_at, available_at,
                       unavailable_at):
    if auto and auto_days > 0:
        start_tmp = created_at
        end_tmp = created_at + timezone.timedelta(days=int(auto_days))

        from marketing.utils import local_to_utc
        start_time = local_to_utc(
            datetime.datetime(start_tmp.year, start_tmp.month, start_tmp.day),
            'min')
        end_time = local_to_utc(
            datetime.datetime(end_tmp.year, end_tmp.month, end_tmp.day), 'max')
    else:
        start_time = available_at
        end_time = unavailable_at
    return start_time, end_time
Beispiel #5
0
    def get_context_data(self, **kwargs):
        user = self.request.user
        now = dt = timezone.now()
        pm_17 = local_to_utc(
            datetime.datetime(now.year, now.month, now.day, 17, 0, 0),
            'normal')
        if now > pm_17:
            dt = now + datetime.timedelta(days=1)
        experience_product = ExperienceProduct.objects.filter(
            isvalid=True).first()

        experience_amount = 0
        experience_amount_default = 28888.00
        margin = 0
        # 体验金可用余额
        if user.is_authenticated():
            margin = user.margin.margin
            experience_record = ExperienceEventRecord.objects.filter(user=user, apply=False, event__invalid=False)\
                .filter(event__available_at__lt=now, event__unavailable_at__gt=now).aggregate(Sum('event__amount'))
            if experience_record.get('event__amount__sum'):
                experience_amount = experience_record.get('event__amount__sum')
        else:
            experience_amount = experience_amount_default

        return {
            'product': experience_product,
            'experience_amount': experience_amount,
            'margin': margin,
            'dt': dt.strftime("%Y-%m-%d"),
        }
Beispiel #6
0
 def _query_play_list(self, day, redpack):
     play_list = PlayList.objects.filter(
         play_at=local_to_utc(day, 'min'),
         redpackevent=redpack).select_related(
             'user__wanglibaouserprofile').order_by('-amount', 'ranking',
                                                    'created_at')
     return play_list
Beispiel #7
0
    def _generate_records(day, rule):
        """ 统计生产新数据
        """
        amount_min, amount_max, start, end, reward, exchange, redpack = rule
        tops = Top(limit=0)
        records = tops.day_tops_first_come_first_served(
            day=day, amount_min=amount_min, amount_max=amount_max)[start:end]

        play_set_list = []
        n = 0
        for record in records:
            play = PlayList()
            play.play_at = local_to_utc(day, source_time='min')
            play.user = User.objects.get(id=record['user'])
            play.amount = record['amount_sum']
            reward_user = reward + (n * exchange) if exchange else reward
            play.reward = reward_user
            play.redpackevent = redpack
            play.ranking = n + 1
            if amount_min: play.amount_min = amount_min
            if amount_max: play.amount_max = amount_max
            if start: play.start = start
            if end: play.end = end
            play_set_list.append(play)
            n += 1

        if play_set_list:
            PlayList.objects.bulk_create(play_set_list)
        return True
Beispiel #8
0
    def post(self, request):
        phone_book = UserPhoneBook.objects.filter(user=request.user,
                                                  is_used=True,
                                                  is_register=False)

        books, register_list = list(), list()
        for book in phone_book:
            if User.objects.filter(
                    wanglibaouserprofile__phone=book.phone).exists():
                register_list.append(book.phone)
            else:
                books.append({
                    'name':
                    book.name,
                    'phone':
                    book.phone,
                    'status':
                    True if
                    not (book.invite_at and
                         book.invite_at > local_to_utc(datetime.now(), 'min'))
                    else False,
                })

        if register_list:
            UserPhoneBook.objects.filter(
                user=request.user,
                phone__in=register_list).update(is_register=True)

        return Response({'ret_code': 0, 'message': 'success', 'books': books})
Beispiel #9
0
def getTodayTop10Ranks():
    today = datetime.datetime.now()
    today_start = local_to_utc(today, 'min')
    today_end = local_to_utc(today, 'max')
    top_ranks = P2PRecord.objects.filter(
        catalog='申购', create_time__gte=today_start,
        create_time__lte=today_end).values('user').annotate(
            Sum('amount')).order_by('-amount__sum')[:10]
    uids = [rank['user'] for rank in top_ranks]
    userprofiles = WanglibaoUserProfile.objects.filter(user__in=uids).all()
    for rank in top_ranks:
        for userprofile in userprofiles:
            if userprofile.user_id == rank['user']:
                rank['phone'] = safe_phone_str(userprofile.phone)

                break
    return top_ranks
Beispiel #10
0
 def get_withdraw_success_count(user):
     """ 获取当月成功提现次数 """
     now = datetime.datetime.now()
     month_start = local_to_utc(datetime.datetime(now.year, now.month, 1),
                                'min')
     withdraw_count = PayInfo.objects.filter(user=user, type='W').filter(status=u'成功')\
         .filter(create_time__gt=month_start).count()
     return withdraw_count
Beispiel #11
0
def check_unavailable_3_days():
    """
    每天一次检查3天后到期的红包优惠券.发短息提醒投资.
    直接用sql语句查询。
    分两种情况查询,1为查询理财券活动的截止日期,2为查询动态截止日期的
    """
    from django.db import connection
    # 查询三天后的日期
    days = 3
    check_date = timezone.now() + timezone.timedelta(days=days)
    start_date = utils.local_to_utc(check_date,
                                    'min').strftime('%Y-%m-%d %H:%M:%S')
    end_date = utils.local_to_utc(check_date,
                                  'max').strftime('%Y-%m-%d %H:%M:%S')

    cursor = connection.cursor()

    sql = "SELECT COUNT(a.user_id), a.user_id, b.phone FROM " \
          "(SELECT r.user_id, e.auto_extension AS is_auto, e.unavailable_at, " \
          "DATE_ADD(r.created_at, INTERVAL e.auto_extension_days day) end_date " \
          "FROM wanglibao_redpack_redpackrecord AS r, " \
          "wanglibao_redpack_redpack AS p, " \
          "wanglibao_redpack_redpackevent AS e " \
          "WHERE r.redpack_id = p.id AND p.event_id = e.id and r.order_id is NULL) AS a, " \
          "wanglibao_profile_wanglibaouserprofile AS b " \
          "WHERE a.user_id = b.user_id " \
          "AND ((a.is_auto = 0 AND a.unavailable_at > '{}' AND a.unavailable_at <= '{}') " \
          "OR (a.is_auto = 1 AND a.end_date > '{}' AND a.end_date <= '{}')) " \
          "GROUP BY a.user_id;".format(start_date, end_date, start_date, end_date)

    cursor.execute(sql)
    fetchall = cursor.fetchall()

    data_messages = {}
    for idx, item in enumerate(fetchall):
        data_messages[idx] = {
            'user_id': item[2],
            'user_type': 'phone',
            'params': {
                'count': item[0],
                'days': days
            }
        }
    # 功能推送id: 1
    PHPSendSMS().send_sms(rule_id=1, data_messages=data_messages, timeout=20)
Beispiel #12
0
def getDayTop3Ranks():
    today = datetime.datetime.now()
    today_start = local_to_utc(today, 'min')
    top_ranks = MarginRecord.objects.filter(
        catalog='交易冻结', create_time__gte=today_start).values('user').annotate(
            Sum('amount')).order_by('-amount__sum')[:3]
    uids = [rank['user'] for rank in top_ranks]
    userprofiles = WanglibaoUserProfile.objects.filter(user__in=uids).all()
    for rank in top_ranks:
        for userprofile in userprofiles:
            if userprofile.user_id == rank['user']:
                rank['phone'] = safe_phone_str(userprofile.phone)
                rank['sex'] = userprofile.name[0] + getUserSex(userprofile)
                break
    return top_ranks
Beispiel #13
0
def getWeekSum():
    amount_week_sum = 0
    try:
        #today = datetime.datetime.now()
        #week_frist_day = today + datetime.timedelta(days=-int(today.strftime('%u'))+1-2)
        week_frist_day = getWeekBeginDay()
        today_start = local_to_utc(week_frist_day, 'min')
        #today_end = local_to_utc(today, 'max')
        #week_sum = P2PRecord.objects.filter(catalog='申购', create_time__gte=today_start, create_time__lte=today_end).aggregate(Sum('amount'))
        week_sum = P2PRecord.objects.filter(
            catalog='申购',
            create_time__gte=today_start).aggregate(Sum('amount'))
        amount_week_sum = week_sum['amount__sum'] if week_sum[
            'amount__sum'] else Decimal('0')
    except Exception, e:
        logger.error("====updateRedisWeekTopRank=======" + e.message)
Beispiel #14
0
def getWeekTop10Ranks():
    #today = datetime.datetime.now()
    #计算开始时间从上周六0点开始
    #week_frist_day = today + datetime.timedelta(days=-int(today.strftime('%u'))+1-2)
    week_frist_day = getWeekBeginDay()
    today_start = local_to_utc(week_frist_day, 'min')
    #today_end = local_to_utc(today, 'max')
    top_ranks = P2PRecord.objects.filter(
        catalog='申购', create_time__gte=today_start).values('user').annotate(
            Sum('amount')).order_by('-amount__sum')[:10]
    uids = [rank['user'] for rank in top_ranks]
    userprofiles = WanglibaoUserProfile.objects.filter(user__in=uids).all()
    for rank in top_ranks:
        for userprofile in userprofiles:
            if userprofile.user_id == rank['user']:
                rank['phone'] = safe_phone_str(userprofile.phone)
                break
    return top_ranks
Beispiel #15
0
    def get_context_data(self, **kwargs):
        """ 根据条件查询累计投资
        """
        status, message, data = self._filter_rule(**kwargs)
        if not status:
            return {"message": message}

        day, rule = data['day'], data['rule']
        amount_min, amount_max, start, end, reward, exchange, redpack = rule

        play_list = PlayList.objects.filter(play_at=local_to_utc(day, 'min'),
                                            redpackevent=redpack)

        if play_list.count() > 0:
            message = u'统计日期已经存在统计记录!'
        else:
            if not self._generate_records(day=day, rule=rule):
                message = u'统计记录生成失败!'

        if not message: message = u'统计结束!'
        return self._return_format(message, day, redpack)
Beispiel #16
0
def send_redpack(day, desc, rtype='nil'):
    now = timezone.now()
    day = datetime.strptime(day, '%Y-%m-%d')
    play_list = PlayList.objects.filter(checked_status=1,
                                        play_at=local_to_utc(day, 'min'),
                                        redpackevent=desc)

    for play in play_list:
        events = RedPackEvent.objects.filter(give_mode=rtype,
                                             invalid=False,
                                             give_start_at__lte=now,
                                             give_end_at__gte=now,
                                             describe=play.redpackevent,
                                             amount=play.reward)

        with transaction.atomic():
            for event in events:
                user = User.objects.get(id=play.user_id)
                status, msg = give_activity_redpack(user=user,
                                                    event=event,
                                                    device_type='pc')
                if status:
                    # 更新数据库状态
                    PlayList.objects.filter(pk=play.id).update(
                        checked_status=2)

                    # 发送站内信
                    message_content = u"您在本次打榜活动中获奖,奖励红包已发送到您的账户,请在个人账户红包中查看。感谢您对我们的支持与关注。"

                    inside_message.send_one.apply_async(
                        kwargs={
                            "user_id": user.id,
                            "title": u"打榜送红包",
                            "content": message_content,
                            "mtype": "activity"
                        })
                    break
Beispiel #17
0
 def _alert_invest_status(self, user, phone_user):
     try:
         profile = phone_user.wanglibaouserprofile
         phone_book = UserPhoneBook.objects.filter(
             user=user, phone=profile.phone).first()
         if phone_book:
             if not (phone_book.alert_at and phone_book.alert_at >
                     local_to_utc(datetime.now(), 'min')):
                 phone_book.is_used = True
                 phone_book.save()
                 return True
         else:
             phone_book = UserPhoneBook()
             phone_book.user = user
             phone_book.phone = profile.phone
             phone_book.name = profile.name
             phone_book.is_register = True
             phone_book.is_invite = True
             phone_book.is_used = True
             phone_book.save()
             return True
         return False
     except Exception, e:
         return False
Beispiel #18
0
    def post(self, request):
        user = request.user
        now = datetime.now()
        request_year = request.DATA.get('year', '')
        request_month = request.DATA.get('month', '')
        year = request_year if request_year else now.year
        month = request_month if request_month else now.month
        # current_month = '{}-{}'.format(now.year, now.month)
        current_month = now.strftime('%Y-%m')

        start = local_to_utc(datetime(int(year), int(month), 1), 'min')
        if int(month) == 12:
            end = local_to_utc(
                datetime(int(year) + 1, 1, 1) - timedelta(days=1), 'max')
        else:
            end = local_to_utc(
                datetime(int(year),
                         int(month) + 1, 1) - timedelta(days=1), 'max')

        # 月份/月还款金额/月还款期数
        if request_year and request_month:
            amos_group = UserAmortization.objects.filter(user=user)\
                .filter(term_date__gt=start, term_date__lte=end).order_by('term_date')\
                .extra({'term_date': "DATE_FORMAT(term_date,'%%Y-%%m')"}).values('term_date')\
                .annotate(Count('term_date')).annotate(Sum('principal')).annotate(Sum('interest'))\
                .annotate(Sum('penal_interest')).annotate(Sum('coupon_interest')).order_by('term_date')
        else:
            amos_group = UserAmortization.objects.filter(user=user)\
                .extra({'term_date': "DATE_FORMAT(term_date,'%%Y-%%m')"}).values('term_date')\
                .annotate(Count('term_date')).annotate(Sum('principal')).annotate(Sum('interest'))\
                .annotate(Sum('penal_interest')).annotate(Sum('coupon_interest')).order_by('term_date')

        month_group = [{
            'term_date':
            amo.get('term_date'),
            'term_date_count':
            amo.get('term_date__count'),
            'total_sum':
            amo.get('principal__sum') + amo.get('interest__sum') +
            amo.get('penal_interest__sum') + amo.get('coupon_interest__sum'),
            'principal_sum':
            amo.get('principal__sum'),
            'interest_sum':
            amo.get('interest__sum'),
            'penal_interest_sum':
            amo.get('penal_interest__sum'),
            'coupon_interest_sum':
            amo.get('coupon_interest__sum'),
        } for amo in amos_group]

        # 当月的还款计划
        user_amortizations = UserAmortization.objects.filter(user=user)\
            .filter(term_date__gt=start, term_date__lte=end)\
            .select_related('product_amortization').select_related('product_amortization__product')\
            .order_by('term_date')
        if user_amortizations:
            amo_list = _user_amortization_list(user_amortizations)
        else:
            amo_list = []

        if not amo_list:
            custom_month_data = {
                'term_date': current_month,
                'term_date_count': 0,
                'total_sum': 0.0,
                'principal_sum': 0.0,
                'interest_sum': 0.0,
                'penal_interest_sum': 0.0,
                'coupon_interest_sum': 0.0,
            }
            month_group.append(custom_month_data)
            month_group.sort(key=lambda x: x['term_date'])

        return Response({
            'ret_code': 0,
            'data': amo_list,
            'month_group': month_group,
            'current_month': current_month,
        })
Beispiel #19
0
def send_reward(start, end, amount_min, percent):
    from wanglibao_sms.tasks import send_messages
    from wanglibao_p2p.models import Earning
    from order.utils import OrderHelper
    from order.models import Order
    from django.forms import model_to_dict
    from wanglibao_margin.marginkeeper import MarginKeeper
    from wanglibao.templatetags.formatters import safe_phone_str
    from marketing.models import RewardRecord
    from decimal import Decimal

    start = datetime.strptime(start, '%Y-%m-%d')
    end = datetime.strptime(end, '%Y-%m-%d')

    # 审核通过,给用户发放奖励
    reward_type = u'邀请送收益'
    records = IntroducedByReward.objects.filter(
        checked_status=0,
        activity_start_at=local_to_utc(start, source_time='min'),
        activity_end_at=local_to_utc(end, source_time='max'),
        activity_amount_min=Decimal(amount_min),
        percent_reward=Decimal(percent),
    )

    if not records.exists():
        return

    for record in records:
        # with transaction.atomic():
        user, introduced_by, reward_type, got_amount, product = record.user, record.introduced_by_person, reward_type, record.introduced_reward, record.product

        reward = Reward.objects.filter(is_used=False, type=reward_type).first()

        # 发送短信
        # text_content = u"【网利宝】您在邀请好友送收益的活动中,获得%s元收益,收益已经发放至您的网利宝账户。请注意查收。" % got_amount
        # send_messages.apply_async(kwargs={
        #     "phones": [introduced_by.wanglibaouserprofile.phone],
        #     "messages": [text_content]
        # })

        # 发放收益
        earning = Earning()
        earning.amount = got_amount
        earning.type = 'I'
        earning.product = product
        order = OrderHelper.place_order(introduced_by,
                                        Order.ACTIVITY,
                                        u"邀请送收益活动赠送",
                                        earning=model_to_dict(earning))
        earning.order = order
        keeper = MarginKeeper(introduced_by, order.pk)

        # 赠送活动描述
        desc = u'%s,邀请好友首次理财活动中,活赠%s元' % (
            introduced_by.wanglibaouserprofile.name, got_amount)
        earning.margin_record = keeper.deposit(got_amount,
                                               description=desc,
                                               catalog=u"邀请首次赠送")
        earning.user = introduced_by
        earning.save()

        # 发放站内信
        message_content = u"您在邀请好友送收益的活动中,您的好友%s在活动期间完成首次投资,根据活动规则,您获得%s元收益。<br/>\
                  <a href='/accounts/home/' target='_blank'>查看账户余额</a><br/>\
                  感谢您对我们的支持与关注。<br/>\
                  网利宝" % (safe_phone_str(
            user.wanglibaouserprofile.phone), got_amount)
        RewardRecord.objects.create(user=introduced_by,
                                    reward=reward,
                                    description=message_content)
        inside_message.send_one.apply_async(
            kwargs={
                "user_id": introduced_by.id,
                "title": u"邀请送收益活动",
                "content": message_content,
                "mtype": "activity"
            })

        IntroducedByReward.objects.filter(id=record.id).update(
            checked_status=1)
Beispiel #20
0
class FetchXunleiCardAward(APIView):
    permission_classes = (IsAuthenticated, )

    def getReward(self, type):
        with transaction.atomic():
            reward = Reward.objects.select_for_update().filter(
                type=type, is_used=False).first()
            if reward:
                reward.is_used = True
                reward.save()
            return reward

    def post(self, request):
        user = request.user
        activity = Activity.objects.filter(code="fkflr").first()
        if not activity:
            return Response({"ret_code": -1, "message": "没有该活动"})
        if activity.is_stopped:
            return Response({"ret_code": -1, "message": "活动已经截止"})
        now = timezone.now()
        if activity.start_at > now:
            return Response({"ret_code": -1, "message": "活动还未开始"})
        if activity.end_at < now:
            return Response({"ret_code": -1, "message": "活动已经结束"})
        type = request.POST.get('type')
        if not type or not type.isdigit() or int(type) not in (0, 1):
            return Response({"ret_code": -1, "message": "type error"})
        type = int(type)

        code = activity.code + "_" + str(type)
        try:
            activity_reward_record, _ = ActivityRewardRecord.objects.get_or_create(
                user=user, activity_code=code)
        except IntegrityError, e:
            return Response({"ret_code": -1, "message": "系统忙,请重试"})
        if activity_reward_record.status:
            return Response({"ret_code": -1, "message": "您已经领取过"})

        w_user = WeixinUser.objects.filter(user=user).first()
        if not w_user:
            return Response({"ret_code": -1, "message": "请绑定服务号"})
        reward = None
        if type == 0:  #bind vip card
            bind_action_record = WeiXinUserActionRecord.objects.filter(
                user_id=user.id, action_type='bind').first()
            create_time = local_to_utc(
                datetime.datetime.fromtimestamp(
                    bind_action_record.create_time))
            if bind_action_record and create_time >= activity.start_at and create_time <= activity.end_at:
                reward = self.getReward("七天迅雷会员")
            else:
                return Response({"ret_code": -1, "message": "您不是首次绑定用户哦~"})
        if type == 1:  #invest vip card
            p2pRecord = P2PRecord.objects.filter(
                user=request.user,
                catalog=u'申购').order_by("create_time").first()
            if p2pRecord and p2pRecord.create_time >= activity.start_at and p2pRecord.create_time <= activity.end_at and float(
                    p2pRecord.amount) >= 1000:
                reward = self.getReward("一年迅雷会员")
            else:
                return Response({"ret_code": -1, "message": "您不满足领取条件~"})
        if not reward:
            return Response({"ret_code": -1, "message": "奖品已经领完"})
        try:
            with transaction.atomic():
                record = ActivityRewardRecord.objects.select_for_update().get(
                    id=activity_reward_record.id)
                if record.status:
                    reward.is_used = False
                    reward.save()
                    return Response({"ret_code": -1, "message": "您已经领取过"})
                record.activity_desc = 'xunleivip reward_id=%s' % reward.id
                record.status = True
                record.save()
        except Exception, e:
            reward.is_used = False
            reward.save()
            logger.debug(traceback.format_exc())
            return Response({"ret_code": -1, "message": "系统繁忙"})
Beispiel #21
0
                    0,
                    'message':
                    'ok',
                    'amount':
                    float(amount) + float(index_data['paidIncome']),
                    'income_num':
                    float(income_num),
                    'income_yesterday':
                    float(income_yesterday) +
                    float(index_data['yesterdayIncome'])
                })

            else:
                # 未登陆用户 查询当月还款金额和当月还款项目
                start = datetime(now.year, now.month, 1)
                start_utc = local_to_utc(start, 'min')

                ams = ProductAmortization.objects.filter(
                    settlement_time__range=(start_utc, timezone.now()),
                    settled=True)
                for x in ams:
                    amount += x.principal + x.interest + x.penal_interest

                # 增加 月利宝 产生的数据
                index_data = get_php_index_data_logout(
                    settings.PHP_APP_INDEX_DATA_LOGOUT_URL)

                return Response({
                    'ret_code':
                    0,
                    'message':
Beispiel #22
0
    def post(self, request):
        user = request.user
        now = timezone.now()
        start_dt = local_to_utc(datetime(2016, 6, 7), 'min')
        user_joined = user.date_joined  # 用户注册时间
        device = split_ua(request)
        device_type = decide_device(device['device_type'])
        purchase_code = 'experience_purchase'

        experience_product = ExperienceProduct.objects.filter(
            isvalid=True).first()
        if not experience_product:
            return Response({'ret_code': 30001, 'message': u'体验标有误,请重试'})

        total_amount = 0
        total_amount_tmp = 0

        # 查询用户符合条件的理财金记录
        with transaction.atomic(savepoint=True):
            # 锁表,主要用来锁定体验金投资时的动作
            purchase_lock_record = ExperiencePurchaseLockRecord.objects.select_for_update().\
                filter(user=user, purchase_code=purchase_code).first()

            if not purchase_lock_record:
                # 没有记录时创建一条
                try:
                    purchase_lock_record = ExperiencePurchaseLockRecord.objects.create(
                        user=user,
                        purchase_code=purchase_code,
                        purchase_times=0)
                except Exception:
                    logger.exception(
                        "Error: experience purchase err, user: %s, phone: %s" %
                        (user.id, user.wanglibaouserprofile.phone))
                    return Response({
                        'ret_code': 30003,
                        'message': u'体验金投资失败,请重试'
                    })

            experience_record = ExperienceEventRecord.objects.filter(user=user, apply=False) \
                .filter(event__invalid=False, event__available_at__lt=now, event__unavailable_at__gt=now)\
                .select_related('event')

            records_ids = ''
            if experience_record:
                catalog = u'购买体验标'

                for i in experience_record:
                    total_amount_tmp += i.event.amount

                buy_p2p = P2PRecord.objects.filter(user_id=user.id).exists()
                buy_count = MarginRecord.objects.filter(
                    user_id=user.id, catalog=catalog).count()
                if not buy_p2p:
                    if user_joined > start_dt:
                        # 如果查询到已经购买过至少 1 次体验标,则不再检测账户余额
                        if buy_count == 0:
                            if total_amount_tmp >= 28888 and user.margin.margin < 1:
                                return Response({
                                    'ret_code': 30009,
                                    'message': u'账户余额不足,请先充值'
                                })

                for record in experience_record:
                    event = record.event
                    total_amount += event.amount
                    records_ids += str(record.id) + ','

                    record.apply = True
                    record.apply_amount = event.amount
                    record.apply_at = timezone.now()
                    record.apply_platform = device_type
                    record.save()

                terms = get_amortization_plan(u'日计息一次性还本付息').generate(
                    total_amount,
                    experience_product.expected_earning_rate / 100.0,
                    timezone.now(), experience_product.period)

                for index, term in enumerate(terms['terms']):
                    amortization = ExperienceAmortization()
                    amortization.product = experience_product
                    amortization.user = user
                    amortization.principal = term[1]  # 本金
                    amortization.interest = term[2]  # 利息
                    amortization.term = index + 1  # 期数
                    amortization.description = u'第%d期' % (index + 1)
                    amortization.term_date = term[6] - timedelta(days=1)

                    amortization.save()

                # 从账户中扣除 1 元 (没有购买过体验标的情况)
                if not buy_p2p:
                    if user_joined > start_dt:
                        if total_amount >= 28888 and buy_count == 0:
                            amount = 1.00
                            order_id = OrderHelper.place_order(
                                user, order_type=catalog, status=u'新建').id
                            margin_keeper = MarginKeeper(user=user,
                                                         order_id=order_id)
                            margin_keeper.reduce_margin_common(
                                amount, catalog=catalog, description=catalog)

                # 更新当前的一组流水id
                purchase_lock_record.purchase_times += 1
                purchase_lock_record.description = records_ids
                purchase_lock_record.save()

                term_date = amortization.term_date
                interest = amortization.interest

                return Response({
                    'ret_code': 0,
                    'data': {
                        'amount': total_amount,
                        'term_date': term_date.strftime("%Y-%m-%d"),
                        'interest': interest
                    }
                })

            else:
                return Response({
                    'ret_code': 30002,
                    'message': u'没有体验金记录,无法购买体验标'
                })
Beispiel #23
0
def sendYesterdayTopRankAward():
    rank_activity = Activity.objects.filter(code='march_awards').first()
    # utc_now = timezone.now()
    # today_start = local_to_utc(datetime.datetime.now(), 'min')
    yesterday = datetime.datetime.now() - datetime.timedelta(1)
    yesterday_end = datetime.datetime(year=yesterday.year,
                                      month=yesterday.month,
                                      day=yesterday.day,
                                      hour=23,
                                      minute=59,
                                      second=59)
    yesterday_end = local_to_utc(yesterday_end, "")
    # yesterday_start = local_to_utc(yesterday, 'min')
    if rank_activity and (
        (not rank_activity.is_stopped) or
        (rank_activity.is_stopped and rank_activity.stopped_at > yesterday_end)
    ) and rank_activity.start_at <= yesterday_end and rank_activity.end_at >= yesterday_end:
        top_ranks = getYesterdayTop10Ranks()
        misc = Misc.objects.filter(key='march_awards').first()
        march_awards = json.loads(misc.value)
        rank_awards = march_awards['rank_awards']
        uids = [rank['user'] for rank in top_ranks]
        users = User.objects.filter(id__in=uids).all()
        now_date = datetime.date.today()
        for index, rank in enumerate(top_ranks):
            redpack_event_id = rank_awards[index]
            redpack_event = RedPackEvent.objects.filter(
                id=int(redpack_event_id)).first()
            if not redpack_event:
                logger.error('排名奖励,第%s名的奖励配置的id为%s的红包不存在,导致该排名的用户%s没有得到' %
                             (index + 1, redpack_event_id, rank['user']))
                continue
            for user in users:
                if user.id == rank['user']:
                    if not ActivityRewardRecord.objects.filter(
                            create_date=now_date,
                            activity_code=u'march_awards',
                            user=user).exists():
                        ActivityRewardRecord.objects.create(
                            user=user,
                            activity_code=u'march_awards',
                            activity_desc=u'获得%s排名%s奖励' % (yesterday.date(),
                                                           (index + 1)))
                    with transaction.atomic():
                        rank_reward_record = ActivityRewardRecord.objects.select_for_update(
                        ).filter(create_date=now_date,
                                 activity_code=u'march_awards',
                                 user=user).first()
                        if not rank_reward_record.redpack_record_id:
                            status, messege, redpack_record_id = give_activity_redpack_new(
                                user, redpack_event, 'all')
                            if not status:
                                logger.error('排名奖励,排名第%s名的用户%s没有得到%s,因为%s' %
                                             (index + 1, rank['user'],
                                              redpack_event_id, messege))
                                break
                            rank_reward_record.redpack_record_id = redpack_record_id
                            rank_reward_record.redpack_record_id_time = timezone.now(
                            )
                            rank_reward_record.status = True
                            rank_reward_record.save()
                    break
Beispiel #24
0
def experience_repayment_plan():
    """
    体验标还款计划结算任务
    每天下午17:00分开始执行
    自动将当天17:00之间所有未结算的计划进行统一结算
    结算的利息自动计入用户的资金账户余额
    """
    print(u"Getting experience gold repayment plan to start!")
    now = datetime.now()
    # start = local_to_utc(datetime(now.year, now.month, now.day - 1, 17, 0, 0), 'normal')
    end = local_to_utc(datetime(now.year, now.month, now.day, 17, 0, 0),
                       'normal')

    phone_list = list()
    message_list = list()

    amortizations = ExperienceAmortization.objects.filter(
        settled=False).filter(term_date__lt=end)
    for amo_tmp in amortizations:

        is_commit = False
        with transaction.atomic(savepoint=True):
            # 锁定还款计划
            amo = ExperienceAmortization.objects.select_for_update().get(
                pk=amo_tmp.id)

            try:
                # Add by hb on 2016-06-08 : 避免体验金还款重复结算
                if amo.settled:
                    continue

                amo.settled = True
                amo.settlement_time = timezone.now()
                amo.save()

                if amo.interest > 0:
                    # 体验金利息计入用户账户余额
                    description = u"体验金利息入账:%s元" % amo.interest
                    user_margin_keeper = MarginKeeper(amo.user)
                    user_margin_keeper.deposit(amo.interest,
                                               description=description,
                                               catalog=u"体验金利息入账")

                    is_commit = True

            except Exception, e:
                logger.error(
                    u"experience repayment error, amortization id : %s , message: %s"
                    % (amo.id, e.message))

        # 发站内信,利息大于6元
        if amo_tmp.interest > 6 and is_commit:

            user_profile = amo_tmp.user.wanglibaouserprofile
            # 短信
            phone_list.append(user_profile.phone)
            message_list.append(
                messages.experience_amortize(user_profile.name,
                                             amo_tmp.interest))

            # 站内信
            title, content = messages.experience_amortize_msg(
                user_profile.name, amo_tmp.product.name,
                amo_tmp.product.period, timezone.now(), amo_tmp.interest)
            inside_message.send_one.apply_async(
                kwargs={
                    "user_id": amo_tmp.user.id,
                    "title": title,
                    "content": content,
                    "mtype": "amortize"
                })
Beispiel #25
0
def add_introduced_award(start, end, amount_min, percent):
    from models import IntroducedBy
    from decimal import Decimal, ROUND_DOWN
    from wanglibao_p2p.models import P2PRecord

    start = datetime.strptime(start, '%Y-%m-%d')
    end = datetime.strptime(end, '%Y-%m-%d')

    start_utc = local_to_utc(start, source_time='min')
    end_utc = local_to_utc(end, source_time='max')

    # 增加控制条件,没有被统计过才在统计生成
    if IntroducedByReward.objects.filter(activity_start_at=start_utc,
                                         activity_end_at=end_utc).exists():
        return False

    # print '============begin============', datetime.now()
    new_user = IntroducedBy.objects.filter(bought_at__range=(
        start_utc, end_utc)).filter(introduced_by__isnull=False).exclude(
            introduced_by__wanglibaouserprofile__utype__gt=0).select_related(
                'user')

    # print '============query new_user ok============', datetime.now()

    query_set_list = []
    num = 0
    for first_user in new_user:
        num += 1
        # everyone
        # print '============begin query p2precord============', datetime.now()
        first_record = P2PRecord.objects.filter(
            user=first_user.user,
            create_time__range=(start_utc, end_utc),
            catalog='申购',
            product__status__in=[
                u'满标待打款',
                u'满标已打款',
                u'满标待审核',
                u'满标已审核',
                u'还款中',
                u'已完成',
            ]).order_by('create_time').first()

        # print '============end query p2precord============', datetime.now()

        # first trade min amount limit
        if first_record is not None and first_record.amount >= Decimal(
                amount_min):
            reward = IntroducedByReward()
            reward.user = first_user.user
            reward.introduced_by_person = first_user.introduced_by
            reward.product = first_record.product
            reward.first_bought_at = first_user.bought_at
            reward.first_amount = first_record.amount

            # 计算被邀请人首笔投资总收益
            amount_earning = Decimal(
                Decimal(first_record.amount) *
                (Decimal(first_record.product.period) / Decimal(12)) *
                Decimal(first_record.product.expected_earning_rate) *
                Decimal('0.01')).quantize(Decimal('0.01'), rounding=ROUND_DOWN)
            reward.first_reward = amount_earning
            # 邀请人活取被邀请人首笔投资收益
            reward.introduced_reward = Decimal(
                Decimal(first_record.amount) *
                (Decimal(first_record.product.period) / Decimal(12)) *
                Decimal(percent) * Decimal('0.01')).quantize(
                    Decimal('0.01'), rounding=ROUND_DOWN)

            reward.activity_start_at = start_utc
            reward.activity_end_at = end_utc
            reward.activity_amount_min = Decimal(amount_min)
            reward.percent_reward = Decimal(percent)
            reward.checked_status = 0
            # reward.save()
            query_set_list.append(reward)

        # print '============one record end============', datetime.now()

        if len(query_set_list) == 100:
            IntroducedByReward.objects.bulk_create(query_set_list)
            query_set_list = []

    if len(query_set_list) > 0:
        IntroducedByReward.objects.bulk_create(query_set_list)
Beispiel #26
0
    def post(self, request):
        now = datetime.now()
        amount, income_num, income_yesterday = 0, 0, 0
        try:
            if request.user and request.user.is_authenticated():
                # 登陆用户 查询当天收益和累计收益
                user = request.user
                start_utc = local_to_utc(now, 'min')
                yesterday_start = start_utc - timedelta(days=1)
                yesterday_end = yesterday_start + timedelta(
                    hours=23, minutes=59, seconds=59)

                p2p_equities = P2PEquity.objects.filter(
                    user=user,
                    confirm=True,
                    product__status__in=[
                        u'已完成',
                        u'满标待打款',
                        u'满标已打款',
                        u'满标待审核',
                        u'满标已审核',
                        u'还款中',
                        u'正在招标',
                    ]).select_related('product')
                for equity in p2p_equities:
                    amount += equity.pre_paid_interest  # 累积收益
                    amount += equity.pre_paid_coupon_interest  # 加息券加息收益
                    amount += equity.activity_interest  # 活动收益
                    # if equity.confirm_at >= start_utc:
                    #     income_num += equity.pre_paid_interest
                    #     income_num += equity.pre_paid_coupon_interest
                    #     income_num += equity.activity_interest

                # 昨日收益
                # 利息入账, 罚息入账, 活动赠送, 邀请赠送, 加息存入, 佣佣金存入, 全民淘金
                income_yesterday_other = MarginRecord.objects.filter(user=user)\
                    .filter(create_time__gt=yesterday_start, create_time__lte=yesterday_end)\
                    .filter(catalog__in=[u'利息入账', u'罚息入账', u'加息存入', u'佣金存入', u'全民淘金']).aggregate(Sum('amount'))

                if income_yesterday_other.get('amount__sum'):
                    income_yesterday += income_yesterday_other.get(
                        'amount__sum')

                # 增加从PHP项目来的 昨日收益, 累计收益, 待收收益
                url = 'https://' + request.get_host(
                ) + settings.PHP_APP_INDEX_DATA
                try:
                    if int(request.get_host().split(':')[1]) > 7000:
                        url = settings.PHP_APP_INDEX_DATA_DEV
                except Exception, e:
                    pass

                try:
                    index_data = get_php_index_data(url, user.id)
                except Exception, e:
                    index_data = {
                        "yesterdayIncome": 0,
                        "paidIncome": 0,
                        "unPaidIncome": 0
                    }
                    logger_yuelibao.debug(
                        u'in AppRepaymentAPIView, get_php_index_data请求失败!!! exception = {}'
                        .format(e.message))

                return Response({
                    'ret_code':
                    0,
                    'message':
                    'ok',
                    'amount':
                    float(amount) + float(index_data['paidIncome']),
                    'income_num':
                    float(income_num),
                    'income_yesterday':
                    float(income_yesterday) +
                    float(index_data['yesterdayIncome'])
                })
Beispiel #27
0
def send_reward_all(start, end, amount_min, percent):
    from decimal import Decimal
    from wanglibao_sms.tasks import send_messages

    start = datetime.strptime(start, '%Y-%m-%d')
    end = datetime.strptime(end, '%Y-%m-%d')

    # 审核通过,给用户发放奖励
    records = IntroducedByReward.objects.filter(
        checked_status=0,
        activity_start_at=local_to_utc(start, source_time='min'),
        activity_end_at=local_to_utc(end, source_time='max'),
        activity_amount_min=Decimal(amount_min),
        percent_reward=Decimal(percent),
    )

    if not records.exists():
        return

    phone_user = []
    # A 邀请 B
    # A 邀请人, B 被邀请人
    for record in records:
        # 为被邀请人发收益
        if record.user.wanglibaouserprofile.utype == '0':
            reward_earning(record,
                           record.user,
                           record.introduced_reward,
                           record.product,
                           flag=1)
            phone_user.append(record.user.wanglibaouserprofile.phone)

        # 为邀请人发收益
        if record.introduced_by_person.wanglibaouserprofile.utype == '0':
            reward_earning(record,
                           record.introduced_by_person,
                           record.introduced_reward,
                           record.product,
                           flag=2)
            phone_user.append(
                record.introduced_by_person.wanglibaouserprofile.phone)

        if record.user.wanglibaouserprofile.utype != '0' and record.introduced_by_person.wanglibaouserprofile.utype != '0':
            IntroducedByReward.objects.filter(id=record.id).update(
                checked_status=1, checked_at=timezone.now())

    phone_user = list(set(phone_user))
    if phone_user:
        # 发送短信
        # text_content = u'好友邀请收益已经到账,请在个人账户中进行查看。'
        # send_messages.apply_async(kwargs={
        #     "phones": phone_user,
        #     "messages": [text_content]
        # })

        # 发放站内信
        inside_message.send_batch.apply_async(
            kwargs={
                "users": phone_user,
                "title": u"邀请送收益活动",
                "content": u'好友邀请收益已经到账,请在个人账户中进行查看。',
                "mtype": "activity"
            })
Beispiel #28
0
def add_introduced_award_all(start, end, amount_min, percent):
    """ 邀请好友各的0.3%收益
    1、活动期间邀请注册账户?
    2、活动期间邀请注册账户购买产品
    3、邀请人是经纪人怎么处理?
    4、被邀请人是经纪人怎么处理?
    """

    from models import IntroducedBy
    from decimal import Decimal, ROUND_DOWN
    from wanglibao_p2p.models import P2PRecord

    from wanglibao_p2p.amortization_plan import get_base_decimal, get_final_decimal

    start = datetime.strptime(start, '%Y-%m-%d')
    end = datetime.strptime(end, '%Y-%m-%d')

    start_utc = local_to_utc(start, source_time='min')
    end_utc = local_to_utc(end, source_time='max')

    # 增加控制条件,没有被统计过才在统计生成
    if IntroducedByReward.objects.filter(activity_start_at=start_utc,
                                         activity_end_at=end_utc).exists():
        return False

    new_user = IntroducedBy.objects.filter(
        bought_at__range=(start_utc, end_utc)).filter(
            created_at__range=(start_utc, end_utc)).filter(
                introduced_by__isnull=False).select_related('user')

    if not new_user.exists():
        return

    query_set_list = []
    num = 0
    for first_user in new_user:
        num += 1

        # 所有投资的产品
        records = P2PRecord.objects.filter(user=first_user.user,
                                           create_time__range=(start_utc,
                                                               end_utc),
                                           catalog='申购',
                                           product__status__in=[
                                               u'满标待打款',
                                               u'满标已打款',
                                               u'满标待审核',
                                               u'满标已审核',
                                               u'还款中',
                                               u'已完成',
                                           ]).order_by('create_time')

        # 不存在投资记录,循环下一个用户
        if not records.exists():
            continue

        # 首笔投资大于200才有收益
        if records.first().amount < Decimal(amount_min):
            continue

        for record in records:
            reward = IntroducedByReward()
            reward.user = first_user.user
            reward.introduced_by_person = first_user.introduced_by
            reward.product = record.product
            reward.first_bought_at = record.create_time
            reward.first_amount = record.amount

            # 计算被邀请人首笔投资总收益(收益年化)
            reward.first_reward = get_base_decimal(
                Decimal(record.amount) *
                Decimal(record.product.expected_earning_rate) * Decimal(0.01) *
                Decimal(record.product.period) / 12)

            # 邀请人活取被邀请人首笔投资(投资年化)
            got_amount = get_base_decimal(
                Decimal(record.amount) * Decimal(percent) * Decimal(0.01) *
                Decimal(record.product.period) / 12)
            reward.introduced_reward = got_amount

            reward.activity_start_at = start_utc
            reward.activity_end_at = end_utc
            reward.activity_amount_min = Decimal(amount_min)
            reward.percent_reward = Decimal(percent)
            reward.checked_status = 0
            # 新增字段
            if first_user.user.wanglibaouserprofile.utype == '0':
                reward.user_send_amount = got_amount
            if first_user.introduced_by.wanglibaouserprofile.utype == '0':
                reward.introduced_send_amount = got_amount

            query_set_list.append(reward)

        if len(query_set_list) == 100:
            IntroducedByReward.objects.bulk_create(query_set_list)
            query_set_list = []

    if len(query_set_list) > 0:
        IntroducedByReward.objects.bulk_create(query_set_list)