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))
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()
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)
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))
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)
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)
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()
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))