def revert_payment(self): from methods import alfa_bank, paypal assert self.used_cups == 0 if self.payment_type_id == CARD_PAYMENT_TYPE: legal = self.payment_legal.get() alfa_bank.reverse(legal.alfa_login, legal.alfa_password, self.payment_id) elif self.payment_type_id == PAYPAL_PAYMENT_TYPE: paypal.void(self.payment_id) self.close()
def cancel(self, namespace): from methods.alfa_bank import reverse if self.status == self.READY: legal = LegalInfo.query().get( ) # TODO find solution for multiple legals reverse(legal.alfa_login, legal.alfa_password, self.payment_id) share = Share.get_by_id(self.share_id) share.deactivate() promo_code = self.promo_code.get() promo_code.deactivate() self.status = self.CANCELED self.put() sender = Client.get(self.client_id) text = u'Ваш подарок не был получен. Ссылка более не будет активна, а деньги вернутся в ближайшее время.' header = u'Отмена подарка' SimplePush(text, False, text, header, sender, namespace).send()
def post(self): client_id = self.request.get("client_id") or int( self.request.headers.get('Client-Id', 0)) binding_id = self.request.get("binding_id") amount = self.request.get_range("amount") legal = LegalInfo.query().get( ) # TODO find solution for multiple legals order_number = "dp_%s_%s" % (client_id, int(time.time())) success, result = alfa_bank.create_simple(legal.alfa_login, legal.alfa_password, amount, order_number, "_", client_id) if not success: self.response.set_status(400) self.render_json({"description": u"Ошибка перевода с карты"}) return alfa_order_id = result success, error = alfa_bank.hold_and_check(legal.alfa_login, legal.alfa_password, alfa_order_id, binding_id) if not success: self.response.set_status(400) self.render_json({"description": u"Ошибка перевода с карты"}) return wallet_source = "alfa:%s" % alfa_order_id try: wallet_result = empatika_wallet.deposit(client_id, amount * 100, wallet_source) except empatika_wallet.EmpatikaWalletError as e: alfa_bank.reverse(legal.alfa_login, legal.alfa_password, alfa_order_id) self.response.set_status(400) self.render_json({"description": e.message}) else: alfa_bank.deposit(legal.alfa_login, legal.alfa_password, alfa_order_id, 0) self.render_json({"balance": wallet_result["balance"] / 100.0})
def _handle_auto(order): info = [ ("id", order.key.id()), ("payment type", order.payment_type_id), ("payment id", order.payment_id) ] to_delete = False if order.has_card_payment: try: # check payment status legal = Venue.get_by_id(int(order.venue_id)).legal.get() status = alfa_bank.check_extended_status(legal.alfa_login, legal.alfa_password, order.payment_id)["alfa_response"] info.append(("status check result", status)) # if status check was successful: if str(status.get("errorCode", '0')) == '0': # money already deposited -- do not delete if status['orderStatus'] == 2: info.append(("ERROR", "deposited")) # money approved -- reverse elif status['orderStatus'] == 1: reverse_result = alfa_bank.reverse(legal.alfa_login, legal.alfa_password, order.payment_id) info.append(("reverse result", reverse_result)) if str(reverse_result.get('errorCode', '0')) == '0': to_delete = True # any other status is OK to delete else: to_delete = True except Exception as e: info.append(("exception", repr(e))) elif order.has_paypal_payment: try: # authorization exists (we have payment_id) and should be non-void void_success, void_error = paypal.void(order.payment_id) info.append(("void successful?", void_success)) if void_success: to_delete = True else: info.append(("void error", void_error)) except Exception as e: info.append(("exception", repr(e))) else: to_delete = True if to_delete: order.key.delete() info.append(("deleted", True)) return info
def post(self): order_id = self.request.get('orderId') or self.request.get('order_id') alfa_response = alfa_bank.reverse(config.ALFA_LOGIN, config.ALFA_PASSWORD, order_id) self.render_json(alfa_response)
def cancel_order(order, status, namespace, comment=None): success = True if order.has_card_payment: legal = Venue.get(order.venue_id).legal.get() return_result = alfa_bank.reverse(legal.alfa_login, legal.alfa_password, order.payment_id) success = str(return_result['errorCode']) == '0' elif order.has_paypal_payment: success, error = paypal.void(order.payment_id) if success: for gift_detail in order.gift_details: try: empatika_promos.cancel_activation(gift_detail.activation_id) except empatika_promos.EmpatikaPromosError as e: logging.exception(e) admins.send_error("payment", "Cancel activation", str(e)) success = False if success: success_wallet_payment_reverse = False if order.wallet_payment > 0 and config.APP_KIND == AUTO_APP: try: empatika_wallet.reverse(order.client_id, order.key.id()) deferred.defer(get_balance, order.client_id, raise_error=True) # just to update memcache success_wallet_payment_reverse = True except empatika_wallet.EmpatikaWalletError as e: logging.exception(e) admins.send_error("payment", "Wallet reversal failed", str(e)) # main payment reversed -- do not abort for share_gift in order.shared_gift_details: gift = share_gift.gift.get() gift.recover() for performing in order.promo_code_performings: performing = performing.get() performing.recover() if order.subscription_details: subscription = order.subscription_details.subscription.get() subscription.recover(order.subscription_details.amount) if order.geo_push: geo_push = order.geo_push.get() geo_push.recover() if order.left_basket_promo: left_basket_promo = order.left_basket_promo.get() left_basket_promo.recover() order.status = status order.return_datetime = datetime.utcnow() order.return_comment = comment order.email_key_done = None order.email_key_cancel = None order.email_key_postpone = None order.email_key_confirm = None order.put() if order.shared_promo: shared_promo = order.shared_promo.get() if order.client_id == shared_promo.recipient.id(): shared_promo.recipient_promo_success = False elif order.client_id == shared_promo.sender.id(): shared_promo.sender_promo_success = False shared_promo.put() if status == CANCELED_BY_BARISTA_ORDER: client = Client.get(order.client_id) push_text = u"%s, заказ №%s отменен." % (client.name, order.number) if order.has_card_payment: push_text += u" Ваш платеж будет возвращен на карту в течение нескольких минут.\n" if success_wallet_payment_reverse: push_text += u" Бонусные баллы были возвращены на Ваш счет.\n" if comment: push_text += " " + comment OrderPush(push_text, order, namespace).send() elif status == CANCELED_BY_CLIENT_ORDER: message = u"Заказ из мобильного приложения №%s отменен клиентом" % order.key.id( ) venue = Venue.get(order.venue_id) try: sms_pilot.send_sms(venue.phones, message) except: pass for email in venue.emails: if email: deferred.defer(postmark.send_email, EMAIL_FROM, email, message, "<html></html>") return success