Exemple #1
0
def xm_payment_tracking(order_id):
    """同步新投米用户订单支付状态"""
    from core.models.hoard.xinmi import XMOrder, XMProfile

    expected_status_set = frozenset([
        XMOrder.Status.success,
        XMOrder.Status.failure,
    ])

    order = XMOrder.get(order_id)
    user_id = order.user_id
    xm_profile = XMProfile.get(user_id)
    xm_profile.assets(pull_remote=True)
    origin_status = order.status
    if origin_status in expected_status_set:
        return

    # 当订单属于自然失败时不再更新状态
    if origin_status not in [XMOrder.Status.paying, XMOrder.Status.shelved]:
        return

    # 长时间未被结算中心处理的订单将发往BC提醒
    since_delta = datetime.datetime.now() - order.creation_time
    if since_delta > datetime.timedelta(hours=6):
        from core.models.hoard.xinmi.transaction import cancel_order
        cancel_order(order.order_code)
        order = XMOrder.get_by_order_code(order.order_code)
        if order.status in [XMOrder.Status.failure, XMOrder.Status.success]:
            if not bearychat.configured:
                return
            result = u'`成功`:clap: '
            color = '#00FF00'
        else:
            result = u'`失败`:eyes: '
            color = '#FF0000'
        if bearychat.configured:
            quota = format_number(order.amount, locale='en_US')
            message = u'已执行 **自动取消订单释放债权¥{}** {},当前状态 `{}`'.format(
                quota, result, order.status.label)
            txt = u'**用户:** ( {} ) 已经 **{}** 了, **新米订单** *{}* (*{}*) 状态仍为 **{}**.'.format(
                order.user_id,
                format_timedelta(since_delta, locale='zh_CN'), order.id_,
                order.order_code, origin_status.label, )
            attachment = bearychat.attachment(title=None, text=message, color=color, images=[])
            bearychat.say(txt, attachments=[attachment])

    error_msg = (
        u'tube:{0}, order_id:{1}, order code:{2}, '
        u'new status:{3},user_id:{4}')

    raise WorkerTaskError(error_msg.format(xm_payment_tracking.tube, order.id_,
                                           order.order_code, origin_status.name, order.user_id))
Exemple #2
0
def hoarder_order_use_gift_tracking(order_id):
    from core.models.hoarder.transactions.sxb import apply_gift
    from core.models.hoarder.order import HoarderOrder
    from core.models.hoarder.errors import UseGiftError

    order = HoarderOrder.get(order_id)
    if not order:
        return

    current_date = datetime.datetime.now().date
    effective_date = order.value_date if current_date < order.value_date else current_date

    try:
        apply_gift(order, effective_date)
    except UseGiftError:
        raise WorkerTaskError()
Exemple #3
0
def email_sender(mail_id):
    from core.models.mail.mail import Mail
    from core.models.mail.sender import get_sender_pool

    mail = Mail.get(mail_id)
    sender_pool = get_sender_pool()
    sender = sender_pool.get_sender(mail.kind.sender_type)
    r = False
    if not DEBUG:
        r = sender.send_mail(mail.kind.subject,
                             mail.mail_body,
                             mail.receiver,
                             mail.sender_name,
                             priority=mail.kind.priority)
    if not r:
        raise WorkerTaskError('email', mail.receiver, mail.sender_name)
Exemple #4
0
def zhiwang_payment_tracking(order_id):
    """同步指旺用户订单支付状态"""
    from core.models.hoard.zhiwang import ZhiwangOrder, ZhiwangAccount

    expected_status_set = frozenset([
        ZhiwangOrder.Status.success,
        ZhiwangOrder.Status.failure,
    ])

    order = ZhiwangOrder.get(order_id)
    origin_status = order.status
    if origin_status in expected_status_set:
        return

    zw_ucode = ZhiwangAccount.get_by_local(order.user_id).zhiwang_id
    response = zhiwang.order_status(zw_ucode, order.order_code)
    assert response.order_code == order.order_code
    assert int(response.pay_amount) == int(order.amount)
    new_status = ZhiwangOrder.MUTUAL_STATUS_MAP.get(response.order_status)

    if new_status is not origin_status:
        # 当订单属于自然失败时不再更新状态
        if new_status is ZhiwangOrder.Status.failure and origin_status in (
                ZhiwangOrder.Status.unpaid, ZhiwangOrder.Status.committed):
            return

        # 只有当订单状态发生变化时才更新状态
        order.update_status(new_status)
        if new_status in expected_status_set:
            return

    if bearychat.configured:
        # 长时间未被结算中心处理的订单将发往BC提醒
        since_delta = datetime.datetime.now() - order.creation_time
        if since_delta > datetime.timedelta(hours=6):
            message = (u'已经**{}**了, 指旺订单 {}({}) 状态仍为 {}. '
                       u'[[查看详情]](http://earth.guihua.com/hoard/user/{})')
            bearychat.say(
                message.format(format_timedelta(since_delta, locale='zh_CN'),
                               order.id_, order.order_code, new_status.name,
                               order.user_id))

    error_msg = (u'tube:{0}, order_id:{1}, order code:{2}, '
                 u'new status:{3},user_id:{4}')
    raise WorkerTaskError(
        error_msg.format(zhiwang_payment_tracking.tube, order.id_,
                         order.order_code, new_status.name, order.user_id))
Exemple #5
0
def hoard_yrd_payment_tracking(order_id):
    """同步用户宜人贷订单支付状态"""
    from core.models.hoard import HoardOrder, HoardProfile
    from core.models.hoard.profile import fetch_account_info, clear_account_info_cache

    order = HoardOrder.get(order_id)

    # take account info fetch as payment status sync trick
    profile = HoardProfile.add(order.user_id)
    clear_account_info_cache(order.user_id)
    fetch_account_info(profile)

    order = HoardOrder.get(order_id)
    rsyslog.send('%s\t%s' % (order_id, order.status),
                 tag='yixin_payment_track')

    if not order.is_success and not order.is_failure:
        raise WorkerTaskError(hoard_yrd_payment_tracking.tube)
Exemple #6
0
def zhiwang_asset_fetching(order_id):
    """为指旺资产找到匹配订单"""
    from core.models.hoard.zhiwang import ZhiwangOrder, ZhiwangAccount, ZhiwangAsset

    order = ZhiwangOrder.get(order_id)
    asset = ZhiwangAsset.get_by_order_code(order.order_code)
    if asset:
        return

    user_id = order.user_id
    zw_ucode = ZhiwangAccount.get_by_local(user_id).zhiwang_id
    all_assets = sorted(zhiwang.asset_list(zw_ucode),
                        key=operator.attrgetter('created_at'),
                        reverse=True)
    for asset_info in all_assets:
        detail = zhiwang.asset_details(zw_ucode, asset_info.asset_code)
        if detail.order_code == order.order_code:
            # find the matcher
            ZhiwangAsset.add(
                asset_info.asset_code,
                detail.order_code,
                order.bankcard_id,
                detail.user_bank_account,
                detail.product_id,
                user_id,
                ZhiwangAsset.MUTUAL_STATUS_MAP.get(detail.status),
                detail.annual_rate,
                detail.actual_annual_rate,
                detail.create_amount,
                detail.current_amount,
                detail.base_interest,
                detail.actual_interest,  # actual = expect
                detail.current_interest,
                detail.interest_start_date,
                detail.interest_end_date,
                detail.expected_payback_date,
                detail.created_at.naive)
            return

    raise WorkerTaskError(zhiwang_asset_fetching.tube)
Exemple #7
0
def hoarder_redeem_tracking(order_code):
    from core.models.hoarder.order import HoarderOrder
    from jupiter.ext import sxb

    expected_status_set = frozenset(
        [HoarderOrder.Status.failure, HoarderOrder.Status.backed])

    order = HoarderOrder.get_by_order_code(order_code)
    if not order:
        return
    if order.status in expected_status_set:
        return

    redeem_results = sxb.query_redeems(order.user_id, order.product.remote_id,
                                       order.id_)
    for result in redeem_results:
        if result.app_redeem_id:
            if order_code in result.app_redeem_id:
                order.update_by_remote_status(result.redeem_status)
                return

    raise WorkerTaskError()
Exemple #8
0
def hoarder_payment_tracking(order_id):
    from core.models.hoarder.order import HoarderOrder
    from jupiter.ext import sxb

    expected_status_set = frozenset([
        HoarderOrder.Status.success, HoarderOrder.Status.failure,
        HoarderOrder.Status.backed
    ])

    order = HoarderOrder.get(order_id)
    origin_status = order.status

    # 当订单属于自然失败时不再更新状态
    if origin_status in expected_status_set:
        return

    result = sxb.query_order(order.order_code)

    order.update_by_remote_status(result.order_status)
    if origin_status not in [
            HoarderOrder.Status.committed, HoarderOrder.Status.paying,
            HoarderOrder.Status.shelved
    ]:
        return

    # 长时间未被结算中心处理的订单将发往BC提醒
    since_delta = datetime.datetime.now() - order.creation_time
    if since_delta > datetime.timedelta(hours=6):
        from core.models.hoarder.transactions import sxb
        if sxb.cancel_order(order.order_code):
            order = HoarderOrder.get_by_order_code(order.order_code)
            if order.status in [
                    HoarderOrder.Status.failure, HoarderOrder.Status.success
            ]:
                if not bearychat.configured:
                    return
                result = u'`成功`:clap: '
                color = '#00FF00'
            else:
                result = u'`失败`:eyes: '
                color = '#FF0000'
            if bearychat.configured:
                quota = format_number(order.amount, locale='en_US')
                message = u'已执行 **自动取消订单释放债权¥{}** {},当前状态 `{}`'.format(
                    quota, result, order.status.display_text)
                txt = u'**用户:** ( {} ) 已经 **{}** 了, **随心攒订单** *{}* (*{}*) 状态仍为 **{}**.'.format(
                    order.user_id,
                    format_timedelta(since_delta, locale='zh_CN'),
                    order.id_,
                    order.order_code,
                    origin_status.display_text,
                )
                attachment = bearychat.attachment(title=None,
                                                  text=message,
                                                  color=color,
                                                  images=[])
                bearychat.say(txt, attachments=[attachment])

    error_msg = (u'tube:{0}, order_id:{1}, order code:{2}, '
                 u'new status:{3},user_id:{4}')

    raise WorkerTaskError(
        error_msg.format(hoarder_payment_tracking.tube, order.id_,
                         order.order_code, origin_status.name, order.user_id))